diff --git a/.clang-format b/.clang-format index 84f9c6ae0..5527af118 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,5 @@ BasedOnStyle: Google IndentWidth: 4 + +DerivePointerAlignment: false +PointerAlignment: Right diff --git a/.cmake-format.yaml b/.cmake-format.yaml new file mode 100644 index 000000000..e27fb02d2 --- /dev/null +++ b/.cmake-format.yaml @@ -0,0 +1,2 @@ +format: + tab_size: 4 diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml new file mode 100644 index 000000000..3f765024c --- /dev/null +++ b/.github/workflows/cifuzz.yml @@ -0,0 +1,25 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'h3' + dry-run: false + language: c + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'h3' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v4 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml new file mode 100644 index 000000000..e6a4978ef --- /dev/null +++ b/.github/workflows/deploy-website.yml @@ -0,0 +1,35 @@ +name: deploy-website + +on: + push: + branches: + - master + +# This job installs dependencies, builds the website, and pushes it to `gh-pages` +jobs: + deploy-website: + name: Deploy website + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v2.4.1 + with: + node-version: '16' + + - name: Website Build + working-directory: website + env: + MapboxAccessToken: ${{ secrets.MapboxAccessToken }} + run: | + yarn + yarn build + + # Deploy the book's HTML to gh-pages branch + - name: GitHub Pages action + uses: peaceiris/actions-gh-pages@v3.8.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: website/build + cname: h3geo.org diff --git a/.github/workflows/test-bench.yml b/.github/workflows/test-bench.yml new file mode 100644 index 000000000..e207c38fe --- /dev/null +++ b/.github/workflows/test-bench.yml @@ -0,0 +1,37 @@ +name: test-bench + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + tests: + name: Benchmark ${{ matrix.compiler }} + runs-on: ubuntu-latest + env: + CC: ${{ matrix.compiler }} + + strategy: + matrix: + compiler: [clang, gcc] + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + run: | + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_COUNTRY_BENCHMARKS=ON .. + + - name: Build + run: | + cd build + make + + - name: Run benchmarks + run: | + cd build + make benchmarks diff --git a/.github/workflows/test-fuzzer.yml b/.github/workflows/test-fuzzer.yml new file mode 100644 index 000000000..a6d0cd47b --- /dev/null +++ b/.github/workflows/test-fuzzer.yml @@ -0,0 +1,73 @@ +name: test-fuzzer + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + afl-tests: + name: AFL Fuzzer ${{ matrix.compiler }} + runs-on: ubuntu-latest + env: + CC: ${{ matrix.compiler }} + + strategy: + matrix: + compiler: [clang, gcc] + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + run: | + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Debug .. + + - name: Build + run: | + cd build + make fuzzers + + - name: Run fuzzers once + run: | + cd build + for fuzzer in bin/fuzzer*; do + echo $fuzzer + $fuzzer --generate inputData + $fuzzer inputData + done + + libfuzzer-test: + name: LibFuzzer ${{ matrix.compiler }} + runs-on: ubuntu-latest + env: + CC: ${{ matrix.compiler }} + + strategy: + matrix: + compiler: [clang] + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + run: | + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_LIBFUZZER=ON .. + + - name: Build + run: | + cd build + make fuzzers + + - name: Run fuzzers once + run: | + cd build + for fuzzer in bin/fuzzer*; do + echo $fuzzer + $fuzzer -runs=100000 -max_total_time=60 -timeout=300 + done diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml new file mode 100644 index 000000000..421a4477d --- /dev/null +++ b/.github/workflows/test-linux.yml @@ -0,0 +1,194 @@ +name: test-linux + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + cmake: + name: CMake correctness checks + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + run: cmake -DAUDIT_SOURCE_FILE_LIST=ON . + + gcc-tests: + name: gcc ${{ matrix.build_type }} ${{ matrix.runs_on }} + runs-on: ${{ matrix.runs_on }} + env: + CC: gcc + + strategy: + matrix: + build_type: ["Debug", "Release"] + runs_on: ["ubuntu-latest", "ubuntu-22.04-arm"] + + steps: + - uses: actions/checkout@v4 + + - name: Install Doxygen + run: | + sudo apt update + sudo apt-get install doxygen graphviz clang-format-14 + + - name: Configure build + run: cmake -Bbuild -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DWARNINGS_AS_ERRORS=ON . + + - name: Formatting check + working-directory: build + run: | + clang-format-14 --version + make format + git diff --exit-code + + - name: Build + working-directory: build + run: make + + - name: binding-functions + working-directory: build + run: | + make binding-functions + test -s binding-functions + + - name: Tests + working-directory: build + run: | + make test + sudo make install + + # Note the packages aren't used to test the examples below + - name: Test packaging + working-directory: build + run: cpack -D CPACK_PACKAGE_CONTACT="Test build in CI" + + - name: Examples + run: | + mkdir build/examples + cd build/examples + cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ../../examples + make + env CTEST_OUTPUT_ON_FAILURE=1 make test + + clang-tests: + name: clang ${{ matrix.build_type }} ${{ matrix.runs_on }} ${{ matrix.compile_opt }} + runs-on: ${{ matrix.runs_on }} + env: + CC: clang + + strategy: + matrix: + # See Clang docs for more information on the sanitizers: + # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html + compile_opt: ["", "-fsanitize=undefined,float-divide-by-zero -fno-sanitize-recover=undefined,float-divide-by-zero", "-fsanitize=memory -fno-sanitize-recover=memory", "-fsanitize=address -fno-sanitize-recover=address"] + build_type: ["Debug", "Release"] + runs_on: ["ubuntu-latest", "ubuntu-22.04-arm"] + exclude: + # TODO: Include msan on arm + - runs_on: ubuntu-22.04-arm + compile_opt: "-fsanitize=memory -fno-sanitize-recover=memory" + + steps: + - uses: actions/checkout@v4 + + - name: Install Doxygen + run: | + sudo apt update + sudo apt-get install doxygen graphviz clang-format-14 + + - name: Configure build + run: cmake -Bbuild -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DWARNINGS_AS_ERRORS=ON -DCMAKE_C_FLAGS="${{ matrix.compile_opt }}" . + + - name: Formatting check + working-directory: build + run: | + clang-format-14 --version + make format + git diff --exit-code + + - name: Build + working-directory: build + run: make + + - name: binding-functions + working-directory: build + run: | + make binding-functions + test -s binding-functions + + - name: Tests + working-directory: build + run: | + make CTEST_OUTPUT_ON_FAILURE=1 test + sudo make install + + # Note the packages aren't used to test the examples below + - name: Test packaging + working-directory: build + run: cpack -D CPACK_PACKAGE_CONTACT="Test build in CI" + + - name: Examples + run: | + mkdir build/examples + cd build/examples + cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_C_FLAGS="${{ matrix.compile_opt }}" ../../examples + make + env CTEST_OUTPUT_ON_FAILURE=1 make test + + valgrind-tests: + name: Valgrind + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Valgrind + run: | + sudo apt update + sudo apt-get install valgrind + + - name: Configure build + run: cmake -Bbuild -DCMAKE_BUILD_TYPE=Debug -DWRAP_VALGRIND=ON . + + - name: Build + working-directory: build + run: make + + - name: Tests + working-directory: build + env: + CTEST_OUTPUT_ON_FAILURE: 1 + run: make test-fast + + coverage-tests: + name: Coverage + runs-on: ubuntu-latest + env: + CC: gcc + + steps: + - uses: actions/checkout@v4 + + - name: Install lcov + run: | + sudo apt update + sudo apt-get install lcov + + - name: Configure build + run: cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_COVERAGE=ON -DWARNINGS_AS_ERRORS=ON -DH3_PREFIX=testprefix_ . + + - name: Build + run: make + + - name: Tests + run: make coverage + + - uses: coverallsapp/github-action@master + with: + path-to-lcov: ./coverage.cleaned.info + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml new file mode 100644 index 000000000..6f8afb069 --- /dev/null +++ b/.github/workflows/test-macos.yml @@ -0,0 +1,47 @@ +name: test-macos + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + tests: + name: ${{ matrix.build_type }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [macos-13, macos-15, macos-latest] + build_type: ["Debug", "Release"] + + steps: + - uses: actions/checkout@v4 + + - name: Configure build + run: cmake -Bbuild -DCMAKE_BUILD_TYPE=${{ matrix.build_type}} -DWARNINGS_AS_ERRORS=ON . + + - name: Build + working-directory: build + run: make + + - name: binding-functions + working-directory: build + run: | + make binding-functions + test -s binding-functions + + - name: Tests + working-directory: build + run: | + make test + sudo make install + + - name: Examples + run: | + mkdir build/examples + cd build/examples + cmake -DCMAKE_BUILD_TYPE=${{ matrix.build_type}} ../../examples + make + make test diff --git a/.github/workflows/test-website.yml b/.github/workflows/test-website.yml new file mode 100644 index 000000000..77033dd5c --- /dev/null +++ b/.github/workflows/test-website.yml @@ -0,0 +1,40 @@ +name: test-website + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + tests: + name: Test Website and FOSSA + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v2.4.1 + with: + node-version: '16' + + - name: Install FOSSA + run: | + curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash + + - name: Test Website Build + working-directory: website + env: + MapboxAccessToken: ${{ secrets.MapboxAccessToken }} + run: | + yarn + yarn build + + - name: Formatting check + working-directory: website + run: | + yarn format + git diff --exit-code + + - name: Submit FOSSA report + run: if [ -n "${{ secrets.FOSSA_API_KEY }}" ]; then fossa; fi diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml new file mode 100644 index 000000000..b17f36e21 --- /dev/null +++ b/.github/workflows/test-windows.yml @@ -0,0 +1,77 @@ +name: test-windows + +on: + push: + branches: [master, stable-*] + pull_request: + branches: [master, stable-*] + +jobs: + tests: + name: ${{ matrix.config }} ${{ matrix.arch }} + runs-on: windows-latest + env: + CC: cl.exe + CXX: cl.exe + + strategy: + matrix: + config: [Release, Debug] + arch: [Win32, x64] + + steps: + - uses: actions/checkout@v4 + + - uses: tlylt/install-graphviz@v1.0.0 + + - name: Configure build + shell: cmd + run: cmake -Bbuild -A ${{ matrix.arch }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type}} -DWARNINGS_AS_ERRORS=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=ON . + + - name: Build + working-directory: build + run: cmake --build . --config ${{ matrix.config }} + + - name: binding-functions + working-directory: build + run: | + cmake --build . --config ${{ matrix.config }} --target binding-functions + if ((Get-Item "binding-functions").Length -lt 10) { $host.SetShouldExit(1) } + + - name: Tests + working-directory: build + shell: cmd + env: + CTEST_OUTPUT_ON_FAILURE: 1 + run: ctest -C ${{ matrix.config }} + + dllcompile: + name: DLL ${{ matrix.config }} ${{ matrix.arch }} + runs-on: windows-latest + env: + CC: cl.exe + CXX: cl.exe + + strategy: + matrix: + config: [Release, Debug] + arch: [Win32, x64] + + steps: + - uses: actions/checkout@v4 + + - uses: tlylt/install-graphviz@v1.0.0 + + - name: Configure build + shell: cmd + run: cmake -Bbuild -A ${{ matrix.arch }} -DWARNINGS_AS_ERRORS=ON -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF . + + - name: Build + working-directory: build + run: cmake --build . --config ${{ matrix.config }} + + - name: binding-functions + working-directory: build + run: | + cmake --build . --config ${{ matrix.config }} --target binding-functions + if ((Get-Item "binding-functions").Length -lt 10) { $host.SetShouldExit(1) } diff --git a/.gitignore b/.gitignore index 98be742b5..130f47983 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ /lib/ # Travis CI build directory /build/ +/build*/ # Local build directories /Debug/ /Release/ @@ -57,12 +58,17 @@ dev-docs/_build/ env_docs/ node_modules/ website/dist/ +website/package-lock.json +website/.cache/ +website/public/ # Generated Doxyfile dev-docs/Doxyfile # CMake generated CMakeFiles CMakeCache.txt +CPackConfig.cmake +CPackSourceConfig.cmake Makefile cmake_install.cmake install_manifest.txt @@ -78,6 +84,7 @@ RunCoverage.cmake # Generated coverage runner scripts/coverage.sh + # CTest / coverage CTestTestfile.cmake Testing/ @@ -89,6 +96,7 @@ coverage.cleaned.info *.cbp .idea .vscode +.ipynb_checkpoints # Generated by `make binding-functions` binding-functions @@ -96,3 +104,7 @@ binding-functions # These KML files are generated by `make kml` KML/res*cells.kml KML/res*centers.kml + +# Generated files +src/h3lib/include/h3api.h +src/apps/benchmarks/benchmarkCountries.c diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e347ed759..000000000 --- a/.travis.yml +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2018 Uber Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -language: c - -os: linux -dist: trusty - -compiler: - - gcc - - clang - -# Docs are built during the normal compile/test check. -addons: - apt: - packages: - - doxygen - - graphviz - -matrix: - include: - # Check that clang-format doesn't detect some files are not formatted. - - env: NAME="Formatting check" - compiler: clang - addons: - apt: - sources: - - llvm-toolchain-trusty-5.0 - packages: - - clang-format-5.0 - script: make format && git diff --exit-code - # Submit coverage report to Coveralls.io, also test that prefixing works. - - env: NAME="Coverage report" - compiler: gcc - addons: - apt: - packages: - - lcov - install: - - pip install --user cpp-coveralls - before_script: - - cmake -DCMAKE_BUILD_TYPE=Debug -DWARNINGS_AS_ERRORS=ON -DH3_PREFIX=testprefix_ . - script: - - make && make coverage - after_success: - - coveralls --lcov-file coverage.cleaned.info --verbose - - env: NAME="Mac OSX (Xcode 8)" - os: osx - -# Configure the build script, out of source. -before_script: - - mkdir build - - cd build - - cmake -DWARNINGS_AS_ERRORS=ON .. - -# Build and test the library, then build and test the examples. -script: - - make - - make test - - sudo make install - - mkdir examples - - cd examples - - cmake ../../examples - - make - - make test diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py deleted file mode 100644 index a308d7db8..000000000 --- a/.ycm_extra_conf.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright (c) 2018, Uber Technologies, Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import ycm_core - - -def DirectoryOfThisScript(): - return os.path.dirname( os.path.abspath( __file__ ) ) - - -project_dir = DirectoryOfThisScript() - -flags = [ -'-Wall', -'-Werror', -'-pedantic', -'-std=c11', -'-pthread', -'-x', -'c', -'-isystem', -'/usr/local/include', -'-I', -os.path.join(project_dir, 'src/h3lib/include'), -'-I', -os.path.join(project_dir, 'src/apps/applib/include') -] - -compilation_database_folder = os.path.join(project_dir, 'build') - -if os.path.exists( compilation_database_folder ): - database = ycm_core.CompilationDatabase( compilation_database_folder ) -else: - database = None - -SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] - - -def IsHeaderFile( filename ): - extension = os.path.splitext( filename )[ 1 ] - return extension in [ '.h', '.hxx', '.hpp', '.hh' ] - - -def GetCompilationInfoForFile( filename ): - # The compilation_commands.json file generated by CMake does not have entries - # for header files. So we do our best by asking the db for flags for a - # corresponding source file, if any. If one exists, the flags for that file - # should be good enough. - if IsHeaderFile( filename ): - basename = os.path.splitext( filename )[ 0 ] - for extension in SOURCE_EXTENSIONS: - replacement_file = basename + extension - if os.path.exists( replacement_file ): - compilation_info = database.GetCompilationInfoForFile( - replacement_file ) - if compilation_info.compiler_flags_: - return compilation_info - return None - return database.GetCompilationInfoForFile( filename ) - - -def FlagsForFile( filename, **kwargs ): - if not database: - return { - 'flags': flags, - 'include_paths_relative_to_dir': DirectoryOfThisScript() - } - - compilation_info = GetCompilationInfoForFile( filename ) - if not compilation_info: - return None - - # Bear in mind that compilation_info.compiler_flags_ does NOT return a - # python list, but a "list-like" StringVec object. - final_flags = list( compilation_info.compiler_flags_ ) - - return { - 'flags': final_flags, - 'include_paths_relative_to_dir': compilation_info.compiler_working_dir_ - } diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c5ced43c..43b4b0f7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,252 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). The public API of this library consists of the functions declared in file -[h3api.h](./src/h3lib/include/h3api.h). +[h3api.h.in](./src/h3lib/include/h3api.h.in). ## [Unreleased] +## [4.2.1] - 2025-03-10 +### Fixed +- Fixed MSVC/WIN32 checks in CMake. (#981) +- Fixed potential memory leak in `polygonStringToGeoPolygon` (#976) + +### Changed +- Added arm64 tests in CI. (#975, #974) +- Faster `isValidCell` (#968) +- Moved `ContainmentMode` enum for `polygonToCellsExperimental` to `h3api.h`. (#958) + +## [4.2.0] - 2024-12-04 +### Added +- Added experimental new algorithm for `polygonToCells`, called `polygonToCellsExperimental`, that supports more containment flags and is more memory-efficient (#785, #800, #947) +- `h3` binary for shell scripts ready for use (#818, #826, #846, #923, #924, #931, #933) + +### Fixed +- Fixed compacting all or many resolution 1 cells (#919) + +### Changed +- `compactCells` internally uses int64 for array indexing. (#920) +- Reorganize tests into public / internal. (#762) +- Performance enhancement for aarch64, may improve other platforms (#790, #792, #852, #905, #913) +- `clang-format` upgraded to version 14. (#834) +- Fixed tests that incorrectly did not test resolution 15. (#820) +- Use `CMAKE_INSTALL_LIBDIR` when choosing where to install library files. (#819) + +## [4.1.0] - 2023-01-18 +### Added +- Functions for `cellToChildPos` and `childPosToCell` (#719) + +### Fixed +- Fixed possible signed integer overflow in `h3NeighborRotations` (#707) +- Fixed possible signed integer overflow in `localIjToCell` (#706, #735) + +### Changed +- `assert` on defensive code blocks that are not already covered. (#720) +- `clang-format` upgraded to version 11. (#734) + +## [4.0.1] - 2022-09-15 +### Fixed +- Changing an internal `float` to `double` improves the precision of geographic coordinate output (#652) +- Fixed compacting all children of a resolution 0 cell (#679) +- Fixed possible signed integer overflow in `maxGridDiskSize` (#686) +- Fixed possible use of uninitialized values in `cellToVertex` (#683, #690) +- Fixed possible out of bounds read in `localIjToCell` (#684) +- Fixed possible memory leak in `compactCells` (#685) +- Fixed possible out of bounds read in `areNeighborCells` (#677) +- Fixed possible memory leak in `cellsToLinkedMultiPolygon` (#673) + +### Changed +- Build script does not use toolchain file (#641) +- Removed a duplicated include preprocessor directive (#682) +- Improvements to the fuzzer suite and their automatic runs in CI (#671, #674, #687) +- Increased test coverage (#642) +- Added a fuzzer targetting internal `algos.c` functions (#675) + +## [4.0.0] - 2022-08-23 +### Breaking changes +- Rename functions according to the terminology RFC (#622, #586, #571, #403, #466, #495, #466) +- Functions that can experience errors now have an `H3Error` return value. (#617, #586, #581, #551, #550, #509, #505, #507, #508, #503, #478, #468, #436, #359) +- Cell count parameters use `int64_t` instead of `int`. +- `polygonToCells` (previously `polyfill`) accepts a flags argument for future expansion. (#570) +- `cellToLocalIj` and `localIjToCell` accept a mode argument for future expansion. (#586) +- `exactEdgeLength` functions renamed to `edgeLength` (#639) + +### Fixed +- Fix polyfill bug when vertex latitude exactly matches cell center. (#603) +- A number of issues detected via unit tests and fuzzers were fixed. (#568, #562, #558, #559, #560, #430) +- `polygonToCells` returns an error if Infinity is passed in. (#636) + +### Changed +- The file `CMakeTests.cmake` is no longer included if `ENABLE_TESTING` is off. (#609) + +### Added +- Vertex mode and associated functions: (#422, #420, #417) + - `cellToVertex(cell, vertexNum)` + - `cellToVertexes(cell, out)` + - `vertexToLatLng(vertex, out)` + - `isValidVertex(vertex)` +- `h3` CLI application. (#556, #497) + +### Other changes +- Generally use `lng` instead of `lon` +- Closed-form implementation of `numHexagons` +- A number of fuzzer harnesses are now included in the H3 core library. (#557, #553, #545, #433) +- Additional benchmarks are added and benchmarks are regularly run in CI. (#524, #518) + +## [4.0.0-rc5] - 2022-08-16 +### Breaking changes +- `exactEdgeLength` functions renamed to `edgeLength` (#639) + +### Fixed +- `polygonToCells` returns an error if Infinity is passed in. (#636) + +## [4.0.0-rc4] - 2022-07-25 +### Breaking changes +- `distance*` functions (`distanceKm`, etc) renamed to `greatCircleDistance*`. (#622) +- Error code `E_MEMORY` renamed to `E_MEMORY_ALLOC`. (#617) + +## [4.0.0-rc3] - 2022-06-03 +### Fixed +- Fix polyfill bug when vertex latitude exactly matches cell center. (#603) + +### Changed +- The file `CMakeTests.cmake` is no longer included if `ENABLE_TESTING` is off. (#609) + +## [4.0.0-rc2] - 2022-03-16 +### Breaking changes +- `experimentalH3ToLocalIj` and `experimentalLocalIjToH3` renamed to `cellToLocalIj` and `localIjToCell` respectively. (#586) +- `cellToLocalIj` and `localIjToCell` accept a mode argument for future expansion. (#586) +- `cellToCenterChild` (previously `h3ToCenterChild`) returns an error code. (#581) + +### Added +- `E_OPTION_INVALID` error code added. (#586) + +## [4.0.0-rc1] - 2022-02-07 +### Breaking changes +- Rename functions according to the terminology RFC (#571, #403, #466, #495, #466) +- Functions that can experience errors now have an `H3Error` return value. (#551, #550, #509, #505, #507, #508, #503, #478, #468, #436, #359) +- Cell count parameters use `int64_t` instead of `int`. +- `polygonToCells` (previously `polyfill`) accepts a flags argument for future expansion. (#570) + +### Added +- Vertex mode and associated functions: (#422, #420, #417) + - `cellToVertex(cell, vertexNum)` + - `cellToVertexes(cell, out)` + - `vertexToLatLng(vertex, out)` + - `isValidVertex(vertex)` +- `h3` CLI application. (#556, #497) + +### Fixed +- A number of issues detected via unit tests and fuzzers were fixed. (#568, #562, #558, #559, #560, #430) + +### Other changes +- Generally use `lng` instead of `lon` +- Closed-form implementation of `numHexagons` +- A number of fuzzer harnesses are now included in the H3 core library. (#557, #553, #545, #433) +- Additional benchmarks are added and benchmarks are regularly run in CI. (#524, #518) + +## [3.7.2] - 2021-07-15 +### Fixed +- `gridDisk` of invalid indexes should not crash. (#498) + +## [3.7.1] - 2020-10-05 +### Fixed +- Finding invalid edge boundaries should not crash. (#399) +- Build fixes for FreeBSD. (#397) + +## [3.7.0] - 2020-09-28 +### Added +- Area and haversine distance functions (#377): + - `cellAreaRads2` + - `cellAreaKm2` + - `cellAreaM2` + - `pointDistRads` + - `pointDistKm` + - `pointDistM` + - `exactEdgeLengthRads` + - `exactEdgeLengthKm` + - `exactEdgeLengthM` +- Refactor `getH3UnidirectionalEdgeBoundary` for accuracy at small resolutions. (#391) + - Speeds up `getH3UnidirectionalEdgeBoundary` by about 3x. + - Implement core logic for future vertex mode. +### Fixed +- Fixed building the library with custom memory allocation functions on Mac OSX. (#362) +- The installed H3 CMake target should have include directories specified. (#381) +### Changed +- Tests now use `bash` on Windows. (#381) + +## [3.6.4] - 2020-06-19 +### Added +- `H3_MEMORY_PREFIX` CMake option for replacing the memory management functions used in H3. (#317) +- Support for building Debian packages of H3. (#352) +### Fixed +- Removed duplicate include statements. (#333) +- Fixed macro `H3_DIGIT_MASK_NEGATIVE`. (#329) +## Changed +- Again implement new `polyfill` algorithm. (#313) + +## [3.6.3] - 2020-01-21 +### Fixed +- `compact` detects and fails on cases with duplicated input indexes. (#299) +### Changed +- `h3IsValid` returns false for indexes that have non-zero reserved bits. (#300) +- `h3IsValid` and `h3UnidirectionalEdgeIsValid` return false for indexes with the high bit set. (#300) + +## [3.6.2] - 2019-12-9 +- Revert new `polyfill` algorithm until reported issues are fixed. (#293) + +## [3.6.1] - 2019-11-11 +### Fixed +- `compact` handles zero length input correctly. (#278) +- `bboxHexRadius` scaling factor adjusted to guarantee containment for `polyfill`. (#279) +- `polyfill` new algorithm for up to 3x perf boost. (#282) +- Fix CMake targets for KML generation. (#285) + +## [3.6.0] - 2019-08-12 +### Added +- `h3ToCenterChild` function to find center child at given resolution (#267) +- `getPentagonIndexes` (and `pentagonIndexCount`) function to find pentagons at given resolution (#267) +### Fixed +- Fix bounds check for local IJ coordinates (#271) + +## [3.5.0] - 2019-07-22 +### Added +- CMake options for excluding filter applications or benchmarks from the build. (#247) +- `h3GetFaces` function to find icosahedron faces for an index, and helper function `maxFaceCount` (#253) +### Changed +- Argument parsing for all filter applications is more flexible. (#238) +### Fixed +- Fix printing program name in `h3ToHier` error messages. (#254) + +## [3.4.4] - 2019-05-30 +### Changed +- Local coordinate spaces cannot cross more than one icosahedron edge. (#234) +- All dynamic internal memory allocations happen on the heap instead of the stack. (#235) +- Argument parsing for `h3ToGeo`, `geoToH3`, and `h3ToGeoBoundary` is more flexible. (#227) + +## [3.4.3] - 2019-05-02 +### Added +- `localIjToH3` filter application (#222) +- An option to print distances in the `kRing` filter application (#222) +### Changed +- Arguments parsing for `kRing` filter application is more flexible. (#224) +### Fixed +- `benchmarkPolyfill` allocates its memory on the heap (#198) +- Fixed constraints of vertex longitudes (#213) +- Zero only input to `uncompact` does not produce an error (#223) + +## [3.4.2] - 2019-02-21 +### Changed +- `binding-functions` build target generates an ASCII file on Windows (#193) + +## [3.4.1] - 2019-02-15 +### Fixed +- `binding-functions` build target fixed when running the build out of source (#188) + +## [3.4.0] - 2019-01-23 +### Added +- `getRes0Indexes` function for getting all base cells, and helper function `res0IndexCount` (#174) +- Include defined constants for current library version (#173) + ## [3.3.0] - 2018-12-25 ### Added - `h3Line` and `h3LineSize` functions for getting the line of indexes between some start and end (inclusive) (#165) diff --git a/CMakeLists.txt b/CMakeLists.txt index 95af19557..a83290557 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,37 +1,81 @@ -# Copyright 2017, 2018 Uber Technologies, Inc. +# Copyright 2017-2022 Uber Technologies, Inc. # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.20) # Due to dependency on CMP0115 -set(H3_PREFIX "" CACHE STRING "Prefix for exported symbols") +# Do not try to append extensions to source files +cmake_policy(SET CMP0115 NEW) + +file(READ VERSION H3_VERSION LIMIT_COUNT 1) +# Clean any newlines +string(REPLACE "\n" "" H3_VERSION "${H3_VERSION}") +# Remove any trailing qualifier +string(REGEX REPLACE "-.*$" "" H3_VERSION "${H3_VERSION}") + +project( + h3 + LANGUAGES C + VERSION ${H3_VERSION}) + +set(H3_PREFIX + "" + CACHE STRING "Prefix for exported symbols") +set(H3_ALLOC_PREFIX + "" + CACHE STRING "Prefix for allocation functions") # Needed due to CMP0042 set(CMAKE_MACOSX_RPATH 1) -# H3 doesn't export selected symbols right now -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # YCM needs compilation database set(CMAKE_EXPORT_COMPILE_COMMANDS ON) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake" - CACHE FILEPATH - "Toolchain to use for building this project") -option(ENABLE_COVERAGE "Enable compiling tests with coverage." ON) +# Some misc apps do not work with shared libraries on Windows because they +# require access to internal H3 functions. Build these using either static +# libraries or an option to expose all function symbols. +if(NOT (WIN32 AND BUILD_SHARED_LIBS)) + set(ENABLE_REQUIRES_ALL_SYMBOLS ON) +else() + set(ENABLE_REQUIRES_ALL_SYMBOLS OFF) +endif() + +option(ENABLE_COVERAGE "Enable compiling tests with coverage." OFF) +option(BUILD_BENCHMARKS "Build benchmarking applications." ON) +option(ENABLE_COUNTRY_BENCHMARKS + "Build benchmarking applications with Natural Earth geometries." OFF) +option(BUILD_FUZZERS "Build fuzzer applications (for use with afl)." ON) +option(BUILD_FILTERS "Build filter applications." ON) +option(BUILD_GENERATORS "Build code generation applications." ON) +# If ON, libfuzzer settings are used to build the fuzzer harnesses. If OFF, a +# frontend for afl++ is provided instead. +option(ENABLE_LIBFUZZER "Build fuzzers with libFuzzer support." OFF) + +# These options exist for integration with OSS-Fuzz, so that the fuzzer options +# can be passed through only to the fuzzer executables but not the H3 library, +# since passing those options to the library too may result in too many +# implementations of main in the fuzzer executables. +option(H3_FUZZER_NO_MAIN "Build fuzzers with no main." OFF) +mark_as_advanced(H3_FUZZER_NO_MAIN) +set(H3_FUZZER_EXTRA_OPTIONS + "" + CACHE STRING "Extra compilation options for fuzzers particularly.") +mark_as_advanced(H3_FUZZER_EXTRA_OPTIONS) if(WIN32) - set(SHELL PowerShell -Command) + # Use bash (usually from Git for Windows) for piping results + set(SHELL bash -c) set(EXECUTABLE_OUTPUT_PATH bin) set(LIBRARY_OUTPUT_PATH bin) @@ -42,189 +86,339 @@ else() set(LIBRARY_OUTPUT_PATH lib) endif() -file(READ VERSION H3_VERSION LIMIT_COUNT 1) -# Clean any newlines -string(REPLACE "\n" "" H3_VERSION "${H3_VERSION}") +string(REPLACE "." ";" H3_VERSION_LIST "${H3_VERSION}") +list(GET H3_VERSION_LIST 0 H3_VERSION_MAJOR) +list(GET H3_VERSION_LIST 1 H3_VERSION_MINOR) +list(GET H3_VERSION_LIST 2 H3_VERSION_PATCH) set(H3_SOVERSION 1) -project(h3 LANGUAGES C VERSION ${H3_VERSION}) +# Detect if someone else is including the package +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + set(H3_IS_ROOT_PROJECT ON) +endif() set(H3_COMPILE_FLAGS "") set(H3_LINK_FLAGS "") -if(NOT WIN32) - # Compiler options are set only on non-Windows, since these options - # are not correct for MSVC. - list(APPEND H3_COMPILE_FLAGS -Wall) +option(ENABLE_WARNINGS "Enables compiler warnings" ON) +if(ENABLE_WARNINGS) + if(MSVC) + list(APPEND H3_COMPILE_FLAGS /W2) + else() + list(APPEND H3_COMPILE_FLAGS -Wall) + endif() +endif() - list(APPEND H3_COMPILE_FLAGS $<$:-gdwarf-2 -g3 -O0 -fno-inline -fno-eliminate-unused-debug-types>) +if(NOT MSVC) + # Compiler options are set only on non-Windows, since these options are not + # correct for MSVC. + list( + APPEND + H3_COMPILE_FLAGS + $<$:-gdwarf-2 + -g3 + -O0 + -fno-inline + -fno-eliminate-unused-debug-types>) if(ENABLE_COVERAGE) list(APPEND H3_COMPILE_FLAGS $<$:--coverage>) - # --coverage is not passed to the linker, so this option is needed - # to fully enable coverage. + # --coverage is not passed to the linker, so this option is needed to + # fully enable coverage. list(APPEND H3_LINK_FLAGS $<$:--coverage>) endif() + if(ENABLE_LIBFUZZER) + list(APPEND H3_COMPILE_FLAGS -fsanitize=fuzzer,address,undefined) + list(APPEND H3_LINK_FLAGS -fsanitize=fuzzer,address,undefined) + endif() +endif() - option(WARNINGS_AS_ERRORS "Warnings are treated as errors" OFF) - if(WARNINGS_AS_ERRORS) +option(WARNINGS_AS_ERRORS "Warnings are treated as errors" OFF) +if(WARNINGS_AS_ERRORS) + if(MSVC) + list(APPEND H3_COMPILE_FLAGS /WX) + else() list(APPEND H3_COMPILE_FLAGS -Werror) endif() endif() include(CMakeDependentOption) include(CheckIncludeFile) -include(CTest) - -include(CheckAlloca) -include(CheckVLA) - -check_alloca(have_alloca) -check_vla(have_vla) +if(H3_IS_ROOT_PROJECT) + include(CTest) +endif() set(LIB_SOURCE_FILES + src/h3lib/include/h3Assert.h + src/h3lib/include/alloc.h src/h3lib/include/bbox.h src/h3lib/include/polygon.h src/h3lib/include/polygonAlgos.h + src/h3lib/include/polyfill.h src/h3lib/include/h3Index.h - src/h3lib/include/h3UniEdge.h - src/h3lib/include/geoCoord.h + src/h3lib/include/directedEdge.h + src/h3lib/include/latLng.h src/h3lib/include/vec2d.h src/h3lib/include/vec3d.h src/h3lib/include/linkedGeo.h src/h3lib/include/localij.h src/h3lib/include/baseCells.h src/h3lib/include/faceijk.h + src/h3lib/include/vertex.h src/h3lib/include/vertexGraph.h src/h3lib/include/mathExtensions.h + src/h3lib/include/iterators.h src/h3lib/include/constants.h src/h3lib/include/coordijk.h src/h3lib/include/algos.h - src/h3lib/include/h3api.h - src/h3lib/include/stackAlloc.h + src/h3lib/lib/h3Assert.c src/h3lib/lib/algos.c src/h3lib/lib/coordijk.c src/h3lib/lib/bbox.c src/h3lib/lib/polygon.c + src/h3lib/lib/polyfill.c src/h3lib/lib/h3Index.c src/h3lib/lib/vec2d.c src/h3lib/lib/vec3d.c + src/h3lib/lib/vertex.c src/h3lib/lib/linkedGeo.c src/h3lib/lib/localij.c - src/h3lib/lib/geoCoord.c - src/h3lib/lib/h3UniEdge.c + src/h3lib/lib/latLng.c + src/h3lib/lib/directedEdge.c src/h3lib/lib/mathExtensions.c + src/h3lib/lib/iterators.c src/h3lib/lib/vertexGraph.c src/h3lib/lib/faceijk.c src/h3lib/lib/baseCells.c) set(APP_SOURCE_FILES - src/apps/applib/include/test.h src/apps/applib/include/kml.h src/apps/applib/include/benchmark.h src/apps/applib/include/utility.h + src/apps/applib/include/args.h + src/apps/applib/include/aflHarness.h src/apps/applib/lib/kml.c src/apps/applib/lib/utility.c - src/apps/applib/lib/test.c) + src/apps/applib/lib/args.c) +set(TEST_APP_SOURCE_FILES src/apps/applib/include/test.h + src/apps/applib/lib/test.c) set(EXAMPLE_SOURCE_FILES - examples/index.c - examples/distance.c - examples/neighbors.c - examples/compact.c - examples/edge.c) + examples/index.c examples/distance.c examples/neighbors.c + examples/compactCells.c examples/edge.c) +set(H3_BIN_SOURCE_FILES src/apps/filters/h3.c) set(OTHER_SOURCE_FILES - src/apps/filters/h3ToGeo.c - src/apps/filters/h3ToLocalIj.c + src/apps/filters/cellToLatLng.c + src/apps/filters/cellToLocalIj.c + src/apps/filters/localIjToCell.c src/apps/filters/h3ToComponents.c - src/apps/filters/geoToH3.c - src/apps/filters/h3ToGeoBoundary.c - src/apps/filters/kRing.c - src/apps/filters/hexRange.c - src/apps/testapps/testVertexGraph.c - src/apps/testapps/testCompact.c - src/apps/testapps/testPolyfill.c - src/apps/testapps/testKRing.c - src/apps/testapps/testH3ToGeoBoundary.c - src/apps/testapps/testH3ToParent.c + src/apps/filters/latLngToCell.c + src/apps/filters/cellToBoundary.c + src/apps/filters/gridDisk.c + src/apps/filters/gridDiskUnsafe.c + src/apps/testapps/testBaseCells.c + src/apps/testapps/testBaseCellsInternal.c + src/apps/testapps/testVertexGraphInternal.c + src/apps/testapps/testCompactCells.c + src/apps/testapps/testPolygonToCells.c + src/apps/testapps/testPolygonToCellsExperimental.c + src/apps/testapps/testPolygonToCellsReported.c + src/apps/testapps/testPolygonToCellsReportedExperimental.c + src/apps/testapps/testPentagonIndexes.c + src/apps/testapps/testGridDisk.c + src/apps/testapps/testGridDiskInternal.c + src/apps/testapps/testCellToBoundary.c + src/apps/testapps/testCellToBoundaryEdgeCases.c + src/apps/testapps/testCellToParent.c src/apps/testapps/testH3Index.c + src/apps/testapps/testH3IndexInternal.c src/apps/testapps/mkRandGeoBoundary.c - src/apps/testapps/testGeoToH3.c + src/apps/testapps/testLatLngToCell.c src/apps/testapps/testH3NeighborRotations.c - src/apps/testapps/testMaxH3ToChildrenSize.c - src/apps/testapps/testHexRanges.c - src/apps/testapps/testH3ToGeo.c - src/apps/testapps/testH3ToChildren.c - src/apps/testapps/testGeoCoord.c - src/apps/testapps/testHexRing.c - src/apps/testapps/testH3SetToVertexGraph.c - src/apps/testapps/testBBox.c - src/apps/testapps/testPolygon.c - src/apps/testapps/testVec2d.c - src/apps/testapps/testVec3d.c - src/apps/testapps/testH3UniEdge.c - src/apps/testapps/testLinkedGeo.c + src/apps/testapps/testCellToChildrenSize.c + src/apps/testapps/testGridDisksUnsafe.c + src/apps/testapps/testCellToLatLng.c + src/apps/testapps/testCellToCenterChild.c + src/apps/testapps/testCellToChildren.c + src/apps/testapps/testCellToBBoxExhaustive.c + src/apps/testapps/testCellToChildPos.c + src/apps/testapps/testGetIcosahedronFaces.c + src/apps/testapps/testLatLng.c + src/apps/testapps/testLatLngInternal.c + src/apps/testapps/testGridRingUnsafe.c + src/apps/testapps/testH3SetToVertexGraphInternal.c + src/apps/testapps/testBBoxInternal.c + src/apps/testapps/testVertex.c + src/apps/testapps/testVertexInternal.c + src/apps/testapps/testVertexExhaustive.c + src/apps/testapps/testPolygonInternal.c + src/apps/testapps/testPolyfillInternal.c + src/apps/testapps/testVec2dInternal.c + src/apps/testapps/testVec3dInternal.c + src/apps/testapps/testDirectedEdge.c + src/apps/testapps/testDirectedEdgeExhaustive.c + src/apps/testapps/testLinkedGeoInternal.c src/apps/testapps/mkRandGeo.c src/apps/testapps/testH3Api.c - src/apps/testapps/testH3SetToLinkedGeo.c - src/apps/testapps/testH3ToLocalIj.c - src/apps/testapps/testH3Distance.c - src/apps/testapps/testH3Line.c - src/apps/testapps/testCoordIj.c - src/apps/miscapps/h3ToGeoBoundaryHier.c - src/apps/miscapps/h3ToGeoHier.c + src/apps/testapps/testCellsToLinkedMultiPolygon.c + src/apps/testapps/testCellToLocalIj.c + src/apps/testapps/testCellToLocalIjInternal.c + src/apps/testapps/testCellToLocalIjExhaustive.c + src/apps/testapps/testGridDistance.c + src/apps/testapps/testGridDistanceInternal.c + src/apps/testapps/testGridDistanceExhaustive.c + src/apps/testapps/testGridPathCells.c + src/apps/testapps/testGridPathCellsExhaustive.c + src/apps/testapps/testH3CellArea.c + src/apps/testapps/testH3CellAreaExhaustive.c + src/apps/testapps/testCoordIjInternal.c + src/apps/testapps/testCoordIjkInternal.c + src/apps/testapps/testH3Memory.c + src/apps/testapps/testH3IteratorsInternal.c + src/apps/testapps/testMathExtensionsInternal.c + src/apps/testapps/testDescribeH3Error.c + src/apps/miscapps/cellToBoundaryHier.c + src/apps/miscapps/cellToLatLngHier.c src/apps/miscapps/generateBaseCellNeighbors.c - src/apps/miscapps/generateNumHexagons.c + src/apps/miscapps/generatePentagonDirectionFaces.c src/apps/miscapps/generateFaceCenterPoint.c src/apps/miscapps/h3ToHier.c - src/apps/benchmarks/benchmarkPolyfill.c + src/apps/fuzzers/fuzzerLatLngToCell.c + src/apps/fuzzers/fuzzerCellToLatLng.c + src/apps/fuzzers/fuzzerGridDisk.c + src/apps/fuzzers/fuzzerCellsToLinkedMultiPolygon.c + src/apps/fuzzers/fuzzerDistances.c + src/apps/fuzzers/fuzzerCellArea.c + src/apps/fuzzers/fuzzerEdgeLength.c + src/apps/fuzzers/fuzzerCellProperties.c + src/apps/fuzzers/fuzzerIndexIO.c + src/apps/fuzzers/fuzzerResolutions.c + src/apps/fuzzers/fuzzerHierarchy.c + src/apps/fuzzers/fuzzerVertexes.c + src/apps/fuzzers/fuzzerCompact.c + src/apps/fuzzers/fuzzerDirectedEdge.c + src/apps/fuzzers/fuzzerLocalIj.c + src/apps/fuzzers/fuzzerPolygonToCells.c + src/apps/fuzzers/fuzzerPolygonToCellsExperimental.c + src/apps/fuzzers/fuzzerPolygonToCellsNoHoles.c + src/apps/fuzzers/fuzzerPolygonToCellsExperimentalNoHoles.c + src/apps/fuzzers/fuzzerCellToChildPos.c + src/apps/fuzzers/fuzzerInternalAlgos.c + src/apps/fuzzers/fuzzerInternalCoordIjk.c + src/apps/benchmarks/benchmarkPolygonToCells.c + src/apps/benchmarks/benchmarkPolygonToCellsExperimental.c src/apps/benchmarks/benchmarkPolygon.c - src/apps/benchmarks/benchmarkH3SetToLinkedGeo.c - src/apps/benchmarks/benchmarkKRing.c - src/apps/benchmarks/benchmarkH3Line.c + src/apps/benchmarks/benchmarkCellsToLinkedMultiPolygon.c + src/apps/benchmarks/benchmarkCellToChildren.c + src/apps/benchmarks/benchmarkGridDiskCells.c + src/apps/benchmarks/benchmarkGridPathCells.c + src/apps/benchmarks/benchmarkDirectedEdge.c + src/apps/benchmarks/benchmarkVertex.c + src/apps/benchmarks/benchmarkIsValidCell.c src/apps/benchmarks/benchmarkH3Api.c) set(ALL_SOURCE_FILES - ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${OTHER_SOURCE_FILES}) + ${LIB_SOURCE_FILES} ${APP_SOURCE_FILES} ${TEST_APP_SOURCE_FILES} + ${H3_BIN_SOURCE_FILES} ${OTHER_SOURCE_FILES}) + +# This is done for quality control purposes (to detect if any source files are +# missing from our list), but is not done as the authoritative list as per CMake +# developer recommendations. See +# https://cmake.org/cmake/help/latest/command/file.html#glob-recurse +option(AUDIT_SOURCE_FILE_LIST + "Compare source file list against glob expression" OFF) +if(AUDIT_SOURCE_FILE_LIST) + file( + GLOB_RECURSE QA_SRC_SOURCE_FILES + RELATIVE "${CMAKE_SOURCE_DIR}" + "src/*.c" "src/*.h") + file( + GLOB_RECURSE QA_EXAMPLE_SOURCE_FILES + RELATIVE "${CMAKE_SOURCE_DIR}" + "examples/*.c" "examples/*.h") + foreach(QA_FILE IN LISTS QA_SRC_SOURCE_FILES) + if(NOT QA_FILE IN_LIST ALL_SOURCE_FILES) + message(FATAL_ERROR "${QA_FILE} not in ALL_SOURCE_FILES") + endif() + endforeach() + foreach(QA_FILE IN LISTS QA_EXAMPLE_SOURCE_FILES) + if(NOT QA_FILE IN_LIST EXAMPLE_SOURCE_FILES) + message(FATAL_ERROR "${QA_FILE} not in EXAMPLE_SOURCE_FILES") + endif() + endforeach() +endif() -# Build the H3 library -add_library(h3 ${LIB_SOURCE_FILES}) +set(UNCONFIGURED_API_HEADER src/h3lib/include/h3api.h.in) +set(CONFIGURED_API_HEADER src/h3lib/include/h3api.h) +configure_file(${UNCONFIGURED_API_HEADER} ${CONFIGURED_API_HEADER}) -target_compile_options(h3 PRIVATE ${H3_COMPILE_FLAGS}) -target_link_libraries(h3 PRIVATE ${H3_LINK_FLAGS}) +set(INSTALL_TARGETS) -find_library(M_LIB m) -if(M_LIB) - target_link_libraries(h3 PUBLIC ${M_LIB}) -endif() +function(add_h3_library name h3_alloc_prefix_override) + add_library(${name} ${LIB_SOURCE_FILES} ${CONFIGURED_API_HEADER}) -if(BUILD_SHARED_LIBS) - set_target_properties(h3 PROPERTIES SOVERSION ${H3_SOVERSION}) -endif() + target_compile_options(${name} PRIVATE ${H3_COMPILE_FLAGS}) + target_link_libraries(${name} PRIVATE ${H3_LINK_FLAGS}) + target_compile_features(${name} PUBLIC c_std_99) -target_compile_definitions(h3 PUBLIC H3_PREFIX=${H3_PREFIX}) -if(have_alloca) - target_compile_definitions(h3 PUBLIC H3_HAVE_ALLOCA) -endif() -if(have_vla) - target_compile_definitions(h3 PUBLIC H3_HAVE_VLA) -endif() -target_include_directories(h3 PUBLIC - $) + find_library(M_LIB m) + if(M_LIB) + target_link_libraries(${name} PUBLIC ${M_LIB}) + endif() -# Automatic code formatting -find_program(CLANG_FORMAT_PATH clang-format) + if(BUILD_SHARED_LIBS) + set_target_properties(${name} PROPERTIES SOVERSION ${H3_SOVERSION}) + target_compile_definitions(${name} PRIVATE BUILD_SHARED_LIBS=1) + endif() + if(ENABLE_COVERAGE) + target_compile_definitions(${name} PRIVATE H3_COVERAGE_TEST=1) + endif() + + target_compile_definitions(${name} PUBLIC H3_PREFIX=${H3_PREFIX}) + target_compile_definitions(${name} PRIVATE BUILDING_H3=1) + set(has_alloc_prefix NO) + if(h3_alloc_prefix_override) + set(has_alloc_prefix YES) + target_compile_definitions( + ${name} PUBLIC H3_ALLOC_PREFIX=${h3_alloc_prefix_override}) + elseif(H3_ALLOC_PREFIX) + set(has_alloc_prefix YES) + target_compile_definitions(${name} + PUBLIC H3_ALLOC_PREFIX=${H3_ALLOC_PREFIX}) + endif() + # Mac OSX defaults to not looking up undefined symbols dynamically, so + # enable that explicitly. Windows needs something similar. + if(has_alloc_prefix AND APPLE) + target_link_libraries(${name} PRIVATE "-undefined dynamic_lookup") + elseif(has_alloc_prefix AND MSVC) + set(TARGET ${name} PROPERTY APPEND LINK_FLAGS "/FORCE:UNRESOLVED") + endif() + + if(have_alloca) + target_compile_definitions(${name} PUBLIC H3_HAVE_ALLOCA) + endif() + if(have_vla) + target_compile_definitions(${name} PUBLIC H3_HAVE_VLA) + endif() + target_include_directories( + ${name} + PUBLIC $ + $) +endfunction() + +# Build the H3 library +add_h3_library(h3 "") + +# Automatic code formatting Give preference to clang-format-14 +find_program(CLANG_FORMAT_PATH NAMES clang-format-14 clang-format) cmake_dependent_option( ENABLE_FORMAT "Enable running clang-format before compiling" ON "CLANG_FORMAT_PATH" OFF) if(ENABLE_FORMAT) # Format - add_custom_target(format - COMMAND ${CLANG_FORMAT_PATH} - -style=file - -i - ${ALL_SOURCE_FILES} - ${EXAMPLE_SOURCE_FILES} + add_custom_target( + format + COMMAND ${CLANG_FORMAT_PATH} -style=file -i ${ALL_SOURCE_FILES} + ${EXAMPLE_SOURCE_FILES} ${UNCONFIGURED_API_HEADER} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Formatting sources" - ) + COMMENT "Formatting sources") # Always do formatting add_dependencies(h3 format) elseif(NOT CLANG_FORMAT_PATH) @@ -241,268 +435,264 @@ if(ENABLE_LINTING) set_target_properties(h3 PROPERTIES C_CLANG_TIDY "${CLANG_TIDY_PATH}") elseif(NOT CLANG_TIDY_PATH) message(WARNING "clang-tidy was not detected, " - "so source code linting is disabled") + "so source code linting is disabled") endif() # Docs find_package(Doxygen) option(ENABLE_DOCS "Enable building documentation." ON) if(DOXYGEN_FOUND AND ENABLE_DOCS) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/dev-docs/_build") - configure_file(dev-docs/Doxyfile.in - dev-docs/Doxyfile - ESCAPE_QUOTES - ) - add_custom_target(docs - ALL + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + "${CMAKE_CURRENT_BINARY_DIR}/dev-docs/_build") + configure_file(dev-docs/Doxyfile.in dev-docs/Doxyfile ESCAPE_QUOTES) + add_custom_target( + docs ALL ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/dev-docs/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev-docs - COMMENT "Generating API documentation with Doxygen" VERBATIM - ) + COMMENT "Generating API documentation with Doxygen" + VERBATIM) else() - add_custom_target(docs - echo "Doxygen was not installed when CMake was run or ENABLE_DOCS was OFF. Check that Doxygen is installed and rerun `cmake .`" VERBATIM - ) + add_custom_target( + docs + echo + "Doxygen was not installed when CMake was run or ENABLE_DOCS was OFF. Check that Doxygen is installed and rerun `cmake .`" + VERBATIM) endif() # Metadata for bindings -if (WIN32) - add_custom_target(binding-functions - COMMAND PowerShell -ExecutionPolicy Bypass -File ${CMAKE_CURRENT_SOURCE_DIR}/scripts/binding_functions.ps1 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) +if(WIN32) + add_custom_target( + binding-functions + COMMAND PowerShell -ExecutionPolicy Bypass -File + ${CMAKE_CURRENT_SOURCE_DIR}/scripts/binding_functions.ps1 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) else() - add_custom_target(binding-functions + add_custom_target( + binding-functions COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/binding_functions.sh - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif() +# Release publishing +add_custom_target( + update-version + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/update_version.sh + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + # Link all executables against H3 macro(add_h3_executable name) # invoke built-in add_executable add_executable(${ARGV}) if(TARGET ${name}) target_link_libraries(${name} PUBLIC h3) - target_include_directories(${name} PUBLIC - $) + target_include_directories( + ${name} + PUBLIC + $ + ) target_compile_options(${name} PRIVATE ${H3_COMPILE_FLAGS}) target_link_libraries(${name} PRIVATE ${H3_LINK_FLAGS}) endif() endmacro() -add_h3_executable(geoToH3 src/apps/filters/geoToH3.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToComponents src/apps/filters/h3ToComponents.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeo src/apps/filters/h3ToGeo.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToLocalIj src/apps/filters/h3ToLocalIj.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoBoundary src/apps/filters/h3ToGeoBoundary.c ${APP_SOURCE_FILES}) -add_h3_executable(hexRange src/apps/filters/hexRange.c ${APP_SOURCE_FILES}) -add_h3_executable(kRing src/apps/filters/kRing.c ${APP_SOURCE_FILES}) -add_h3_executable(generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c ${APP_SOURCE_FILES}) -add_h3_executable(generateNumHexagons src/apps/miscapps/generateNumHexagons.c ${APP_SOURCE_FILES}) -add_h3_executable(generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoBoundaryHier src/apps/miscapps/h3ToGeoBoundaryHier.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToGeoHier src/apps/miscapps/h3ToGeoHier.c ${APP_SOURCE_FILES}) -add_h3_executable(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) - -# Generate KML files for visualizing the H3 grid -add_custom_target(create-kml-dir - COMMAND ${CMAKE_COMMAND} -E make_directory KML) -add_custom_target(kml) - -# Only the first 3 resolution grids are generated. The others can be generated, -# but the file sizes would be very, very large. -foreach(resolution RANGE 3) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}cells.kml") - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "KML/res${resolution}centers.kml") - add_custom_target(kml_cells_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}cells.kml \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" - VERBATIM - DEPENDS create-kml-dir) - add_custom_target(kml_centers_${resolution} - COMMAND ${SHELL} "$ ${resolution} | $ 1 res${resolution}centers.kml \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" - VERBATIM - DEPENDS create-kml-dir) - add_dependencies(kml - kml_cells_${resolution} - kml_centers_${resolution}) -endforeach() - -if(BUILD_TESTING) - option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) - - include(TestWrapValgrind) - - enable_testing() - - # Macros and support code needed to build and add the tests - set(test_number 0) - - if(ENABLE_COVERAGE) - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$/scripts/coverage.sh" - INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/coverage.sh.in") - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage.info") - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage.cleaned.info") - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage") - add_custom_target(coverage - COMMAND bash "${CMAKE_CURRENT_BINARY_DIR}/$/scripts/coverage.sh" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") - add_custom_target(clean-coverage - # Before running coverage, clear all counters - COMMAND lcov --directory '${CMAKE_CURRENT_BINARY_DIR}' --zerocounters - COMMENT "Zeroing counters" - ) - endif() - - macro(add_h3_test_common name srcfile) - # need to actually make the test target - if(NOT TARGET ${name}) - add_h3_executable(${name} ${srcfile} ${APP_SOURCE_FILES}) - endif() - - math(EXPR test_number "${test_number}+1") +if(BUILD_FILTERS) + macro(add_h3_filter name) + add_h3_executable(${ARGV}) + list(APPEND INSTALL_TARGETS ${name}) endmacro() - macro(add_h3_test name srcfile) - add_h3_test_common(${name} ${srcfile}) - add_test(NAME ${name}_test${test_number} COMMAND ${TEST_WRAPPER} "$") - - if(ENABLE_COVERAGE) - add_custom_target(${name}_coverage${test_number} - COMMAND ${name} > /dev/null - COMMENT "Running ${name}_coverage${test_number}" - ) - - add_dependencies(coverage ${name}_coverage${test_number}) - add_dependencies(${name}_coverage${test_number} clean-coverage) - endif() - endmacro() - - macro(add_h3_test_with_file name srcfile argfile) - add_h3_test_common(${name} ${srcfile}) - # add a special command (so we don't need to read the test file from the test program) - if(WIN32) - set(dump_command "Get-Content") - else() - set(dump_command "cat") - endif() - - add_test(NAME ${name}_test${test_number} - COMMAND ${SHELL} "${dump_command} ${argfile} | ${TEST_WRAPPER_STR} $") + add_h3_filter(h3_bin src/apps/filters/h3.c ${APP_SOURCE_FILES}) + set_target_properties( + h3_bin PROPERTIES OUTPUT_NAME h3) # Special logic for the `h3` + # executable + add_h3_filter(latLngToCell src/apps/filters/latLngToCell.c + ${APP_SOURCE_FILES}) + add_h3_filter(h3ToComponents src/apps/filters/h3ToComponents.c + ${APP_SOURCE_FILES}) + add_h3_filter(cellToLatLng src/apps/filters/cellToLatLng.c + ${APP_SOURCE_FILES}) + add_h3_filter(cellToLocalIj src/apps/filters/cellToLocalIj.c + ${APP_SOURCE_FILES}) + add_h3_filter(localIjToCell src/apps/filters/localIjToCell.c + ${APP_SOURCE_FILES}) + add_h3_filter(cellToBoundary src/apps/filters/cellToBoundary.c + ${APP_SOURCE_FILES}) + add_h3_filter(gridDiskUnsafe src/apps/filters/gridDiskUnsafe.c + ${APP_SOURCE_FILES}) + add_h3_filter(gridDisk src/apps/filters/gridDisk.c ${APP_SOURCE_FILES}) + add_h3_filter(cellToBoundaryHier src/apps/miscapps/cellToBoundaryHier.c + ${APP_SOURCE_FILES}) + add_h3_filter(cellToLatLngHier src/apps/miscapps/cellToLatLngHier.c + ${APP_SOURCE_FILES}) + add_h3_filter(h3ToHier src/apps/miscapps/h3ToHier.c ${APP_SOURCE_FILES}) + + # Generate KML files for visualizing the H3 grid + add_custom_target(create-kml-dir COMMAND ${CMAKE_COMMAND} -E make_directory + KML) + add_custom_target(kml) + + # Only the first 3 resolution grids are generated. The others can be + # generated, but the file sizes would be very, very large. + foreach(resolution RANGE 3) + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + "KML/res${resolution}cells.kml") + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + "KML/res${resolution}centers.kml") + add_custom_target( + kml_cells_${resolution} + COMMAND + ${SHELL} + "$ -r ${resolution} | $ --kml --kml-name res${resolution}cells.kml --kml-description \"Res ${resolution} Cells\" > KML/res${resolution}cells.kml" + VERBATIM + DEPENDS create-kml-dir) + add_custom_target( + kml_centers_${resolution} + COMMAND + ${SHELL} + "$ -r ${resolution} | $ --kml --kml-name res${resolution}centers.kml --kml-description \"Res ${resolution} Centers\" > KML/res${resolution}centers.kml" + VERBATIM + DEPENDS create-kml-dir) + add_dependencies(kml kml_cells_${resolution} kml_centers_${resolution}) + endforeach() +endif() - if(PRINT_TEST_FILES) - message("${name}_test${test_number} - ${argfile}") - endif() +if(BUILD_GENERATORS AND ENABLE_REQUIRES_ALL_SYMBOLS) + # Code generation + add_h3_executable( + generateBaseCellNeighbors src/apps/miscapps/generateBaseCellNeighbors.c + ${APP_SOURCE_FILES}) + add_h3_executable( + generateFaceCenterPoint src/apps/miscapps/generateFaceCenterPoint.c + ${APP_SOURCE_FILES}) + add_h3_executable( + generatePentagonDirectionFaces + src/apps/miscapps/generatePentagonDirectionFaces.c ${APP_SOURCE_FILES}) + + # Miscellaneous testing applications - generating random data + add_h3_executable(mkRandGeo src/apps/testapps/mkRandGeo.c + ${APP_SOURCE_FILES}) + add_h3_executable(mkRandGeoBoundary src/apps/testapps/mkRandGeoBoundary.c + ${APP_SOURCE_FILES}) +endif() - if(ENABLE_COVERAGE) - add_custom_target(${name}_coverage${test_number} - COMMAND ${name} < ${argfile} > /dev/null - COMMENT "Running ${name}_coverage${test_number}" - ) +if(H3_IS_ROOT_PROJECT AND BUILD_TESTING) + include(CMakeTests.cmake) +endif() - add_dependencies(coverage ${name}_coverage${test_number}) - add_dependencies(${name}_coverage${test_number} clean-coverage) - endif() - endmacro() +if(BUILD_FUZZERS) + add_custom_target(fuzzers) - macro(add_h3_test_with_arg name srcfile arg) - add_h3_test_common(${name} ${srcfile}) - add_test(NAME ${name}_test${test_number} - COMMAND ${TEST_WRAPPER} $ ${arg} - ) - if(PRINT_TEST_FILES) - message("${name}_test${test_number} - ${arg}") + macro(add_h3_fuzzer name srcfile) + add_h3_executable(${name} ${srcfile} ${APP_SOURCE_FILES}) + if(ENABLE_LIBFUZZER OR H3_FUZZER_NO_MAIN) + target_compile_definitions(${name} PRIVATE H3_USE_LIBFUZZER) endif() - - if(ENABLE_COVERAGE) - add_custom_target(${name}_coverage${test_number} - COMMAND ${name} ${arg} - COMMENT "Running ${name}_coverage${test_number}" - ) - - add_dependencies(coverage ${name}_coverage${test_number}) - add_dependencies(${name}_coverage${test_number} clean-coverage) + if(H3_FUZZER_EXTRA_OPTIONS) + target_compile_options(${name} PRIVATE ${H3_FUZZER_EXTRA_OPTIONS}) endif() + add_dependencies(fuzzers ${name}) endmacro() - # Add each individual test - - file(GLOB all_centers tests/inputfiles/bc*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_ic_files tests/inputfiles/res*ic.txt) - foreach(file ${all_ic_files}) - add_h3_test_with_file(testH3ToGeo src/apps/testapps/testH3ToGeo.c ${file}) - endforeach() - - file(GLOB all_centers tests/inputfiles/rand*centers.txt) - foreach(file ${all_centers}) - add_h3_test_with_file(testGeoToH3 src/apps/testapps/testGeoToH3.c ${file}) - endforeach() - - file(GLOB all_cells tests/inputfiles/*cells.txt) - foreach(file ${all_cells}) - add_h3_test_with_file(testH3ToGeoBoundary src/apps/testapps/testH3ToGeoBoundary.c ${file}) - endforeach() - - add_h3_test(testCompact src/apps/testapps/testCompact.c) - add_h3_test(testKRing src/apps/testapps/testKRing.c) - add_h3_test(testHexRing src/apps/testapps/testHexRing.c) - add_h3_test(testHexRanges src/apps/testapps/testHexRanges.c) - add_h3_test(testH3ToParent src/apps/testapps/testH3ToParent.c) - add_h3_test(testH3ToChildren src/apps/testapps/testH3ToChildren.c) - add_h3_test(testMaxH3ToChildrenSize src/apps/testapps/testMaxH3ToChildrenSize.c) - add_h3_test(testH3Index src/apps/testapps/testH3Index.c) - add_h3_test(testH3Api src/apps/testapps/testH3Api.c) - add_h3_test(testH3SetToLinkedGeo src/apps/testapps/testH3SetToLinkedGeo.c) - add_h3_test(testH3SetToVertexGraph src/apps/testapps/testH3SetToVertexGraph.c) - add_h3_test(testLinkedGeo src/apps/testapps/testLinkedGeo.c) - add_h3_test(testPolyfill src/apps/testapps/testPolyfill.c) - add_h3_test(testVertexGraph src/apps/testapps/testVertexGraph.c) - add_h3_test(testH3UniEdge src/apps/testapps/testH3UniEdge.c) - add_h3_test(testGeoCoord src/apps/testapps/testGeoCoord.c) - add_h3_test(testBBox src/apps/testapps/testBBox.c) - add_h3_test(testPolygon src/apps/testapps/testPolygon.c) - add_h3_test(testVec2d src/apps/testapps/testVec2d.c) - add_h3_test(testVec3d src/apps/testapps/testVec3d.c) - add_h3_test(testH3ToLocalIj src/apps/testapps/testH3ToLocalIj.c) - add_h3_test(testH3Distance src/apps/testapps/testH3Distance.c) - add_h3_test(testH3Line src/apps/testapps/testH3Line.c) - add_h3_test(testCoordIj src/apps/testapps/testCoordIj.c) - - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 0) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 1) - add_h3_test_with_arg(testH3NeighborRotations src/apps/testapps/testH3NeighborRotations.c 2) - - # Miscellaneous testing applications - add_h3_executable(mkRandGeo src/apps/testapps/mkRandGeo.c ${APP_SOURCE_FILES}) - add_h3_executable(mkRandGeoBoundary src/apps/testapps/mkRandGeoBoundary.c ${APP_SOURCE_FILES}) + add_h3_fuzzer(fuzzerLatLngToCell src/apps/fuzzers/fuzzerLatLngToCell.c) + add_h3_fuzzer(fuzzerCellToLatLng src/apps/fuzzers/fuzzerCellToLatLng.c) + add_h3_fuzzer(fuzzerGridDisk src/apps/fuzzers/fuzzerGridDisk.c) + add_h3_fuzzer(fuzzerCellsToLinkedMultiPolygon + src/apps/fuzzers/fuzzerCellsToLinkedMultiPolygon.c) + add_h3_fuzzer(fuzzerDistances src/apps/fuzzers/fuzzerDistances.c) + add_h3_fuzzer(fuzzerCellArea src/apps/fuzzers/fuzzerCellArea.c) + add_h3_fuzzer(fuzzerEdgeLength src/apps/fuzzers/fuzzerEdgeLength.c) + add_h3_fuzzer(fuzzerCellProperties src/apps/fuzzers/fuzzerCellProperties.c) + add_h3_fuzzer(fuzzerIndexIO src/apps/fuzzers/fuzzerIndexIO.c) + add_h3_fuzzer(fuzzerResolutions src/apps/fuzzers/fuzzerResolutions.c) + add_h3_fuzzer(fuzzerHierarchy src/apps/fuzzers/fuzzerHierarchy.c) + add_h3_fuzzer(fuzzerVertexes src/apps/fuzzers/fuzzerVertexes.c) + add_h3_fuzzer(fuzzerCompact src/apps/fuzzers/fuzzerCompact.c) + add_h3_fuzzer(fuzzerDirectedEdge src/apps/fuzzers/fuzzerDirectedEdge.c) + add_h3_fuzzer(fuzzerLocalIj src/apps/fuzzers/fuzzerLocalIj.c) + add_h3_fuzzer(fuzzerPolygonToCells src/apps/fuzzers/fuzzerPolygonToCells.c) + add_h3_fuzzer(fuzzerPolygonToCellsExperimental + src/apps/fuzzers/fuzzerPolygonToCellsExperimental.c) + add_h3_fuzzer(fuzzerPolygonToCellsNoHoles + src/apps/fuzzers/fuzzerPolygonToCellsNoHoles.c) + add_h3_fuzzer(fuzzerPolygonToCellsExperimentalNoHoles + src/apps/fuzzers/fuzzerPolygonToCellsExperimentalNoHoles.c) + add_h3_fuzzer(fuzzerCellToChildPos src/apps/fuzzers/fuzzerCellToChildPos.c) + if(ENABLE_REQUIRES_ALL_SYMBOLS) + add_h3_fuzzer(fuzzerInternalAlgos + src/apps/fuzzers/fuzzerInternalAlgos.c) + add_h3_fuzzer(fuzzerInternalCoordIjk + src/apps/fuzzers/fuzzerInternalCoordIjk.c) + endif() +endif() +if(BUILD_BENCHMARKS) # Benchmarks add_custom_target(benchmarks) macro(add_h3_benchmark name srcfile) add_h3_executable(${name} ${srcfile} ${APP_SOURCE_FILES}) - add_custom_target(bench_${name} COMMAND ${TEST_WRAPPER} $) + add_custom_target(bench_${name} COMMAND ${TEST_WRAPPER} + $) add_dependencies(benchmarks bench_${name}) endmacro() add_h3_benchmark(benchmarkH3Api src/apps/benchmarks/benchmarkH3Api.c) - add_h3_benchmark(benchmarkKRing src/apps/benchmarks/benchmarkKRing.c) - add_h3_benchmark(benchmarkH3Line src/apps/benchmarks/benchmarkH3Line.c) - add_h3_benchmark(benchmarkH3SetToLinkedGeo src/apps/benchmarks/benchmarkH3SetToLinkedGeo.c) - add_h3_benchmark(benchmarkPolyfill src/apps/benchmarks/benchmarkPolyfill.c) - add_h3_benchmark(benchmarkPolygon src/apps/benchmarks/benchmarkPolygon.c) + add_h3_benchmark(benchmarkGridDiskCells + src/apps/benchmarks/benchmarkGridDiskCells.c) + add_h3_benchmark(benchmarkGridPathCells + src/apps/benchmarks/benchmarkGridPathCells.c) + add_h3_benchmark(benchmarkDirectedEdge + src/apps/benchmarks/benchmarkDirectedEdge.c) + add_h3_benchmark(benchmarkVertex src/apps/benchmarks/benchmarkVertex.c) + add_h3_benchmark(benchmarkIsValidCell + src/apps/benchmarks/benchmarkIsValidCell.c) + add_h3_benchmark(benchmarkCellsToLinkedMultiPolygon + src/apps/benchmarks/benchmarkCellsToLinkedMultiPolygon.c) + add_h3_benchmark(benchmarkCellToChildren + src/apps/benchmarks/benchmarkCellToChildren.c) + add_h3_benchmark(benchmarkPolygonToCells + src/apps/benchmarks/benchmarkPolygonToCells.c) + add_h3_benchmark(benchmarkPolygonToCellsExperimental + src/apps/benchmarks/benchmarkPolygonToCellsExperimental.c) + if(ENABLE_REQUIRES_ALL_SYMBOLS) + add_h3_benchmark(benchmarkPolygon + src/apps/benchmarks/benchmarkPolygon.c) + endif() + + if(ENABLE_COUNTRY_BENCHMARKS) + # Country benchmark: Downloads country geometry and generates the + # benchmark file + add_custom_command( + OUTPUT src/apps/benchmarks/benchmarkCountries.c + COMMAND + node ${CMAKE_CURRENT_SOURCE_DIR}/scripts/make_countries.js + ${CMAKE_CURRENT_BINARY_DIR}/src/apps/benchmarks/benchmarkCountries.c + ) + + add_h3_benchmark( + benchmarkCountries + ${CMAKE_CURRENT_BINARY_DIR}/src/apps/benchmarks/benchmarkCountries.c + ) + # add_dependencies(bench_benchmarkCountries ) + endif() endif() # Installation (https://github.com/forexample/package-example) -# Layout. This works for all platforms: -# * /lib/cmake/ -# * /lib/ -# * /include/ -set(config_install_dir "lib/cmake/${PROJECT_NAME}") +# Layout. This works for all platforms: * +# //cmake/ * +# // * /include/ +include(GNUInstallDirs) +set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") set(include_install_dir "include") set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") @@ -513,61 +703,85 @@ set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") set(namespace "${PROJECT_NAME}::") +# TODO: Unclear why this is needed to get the libh3 Debian package to build +# correctly with shared libraries. +set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME "libh3") + # Include module with fuction 'write_basic_package_version_file' include(CMakePackageConfigHelpers) -# Configure 'ConfigVersion.cmake' -# Use: -# * PROJECT_VERSION -write_basic_package_version_file( - "${version_config}" COMPATIBILITY SameMajorVersion -) +# Configure 'ConfigVersion.cmake' Use: * PROJECT_VERSION +write_basic_package_version_file("${version_config}" + COMPATIBILITY SameMajorVersion) -# Configure 'Config.cmake' -# Use variables: -# * TARGETS_EXPORT_NAME -# * PROJECT_NAME -configure_package_config_file( - "cmake/Config.cmake.in" - "${project_config}" - INSTALL_DESTINATION "${config_install_dir}" -) +# Configure 'Config.cmake' Use variables: * TARGETS_EXPORT_NAME * +# PROJECT_NAME +configure_package_config_file("cmake/Config.cmake.in" "${project_config}" + INSTALL_DESTINATION "${config_install_dir}") + +# Targets: * //libh3.so * header location after +# install: /include/h3/h3api.h * headers can be included by C++ code +# `#include

` Installing the library and filters system-wide. +install( + TARGETS ${INSTALL_TARGETS} + EXPORT "${TARGETS_EXPORT_NAME}" + DESTINATION "bin" + COMPONENT h3) -# Targets: -# * /lib/libh3.so -# * header location after install: /include/h3/h3api.h -# * headers can be included by C++ code `#include

` -# Installing the library and filters system-wide. install( - TARGETS h3 geoToH3 h3ToComponents h3ToGeo h3ToGeoBoundary hexRange - kRing h3ToGeoBoundaryHier h3ToGeoHier h3ToHier + TARGETS h3 EXPORT "${TARGETS_EXPORT_NAME}" - LIBRARY DESTINATION "lib" - ARCHIVE DESTINATION "lib" + COMPONENT libh3 + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "bin" - INCLUDES DESTINATION "${include_install_dir}" -) + INCLUDES + DESTINATION "${include_install_dir}") -# Headers: -# * src/h3lib/include/h3api.h -> /include/h3/h3api.h -# Only the h3api.h header is needed by applications using H3. +# Headers: * src/h3lib/include/h3api.h -> /include/h3/h3api.h Only the +# h3api.h header is needed by applications using H3. install( - FILES src/h3lib/include/h3api.h + FILES "${CMAKE_CURRENT_BINARY_DIR}/src/h3lib/include/h3api.h" DESTINATION "${include_install_dir}/h3" -) + COMPONENT libh3-dev) -# Config -# * /lib/cmake/h3/h3Config.cmake -# * /lib/cmake/h3/h3ConfigVersion.cmake +# Config * //cmake/h3/h3Config.cmake * +# //cmake/h3/h3ConfigVersion.cmake install( FILES "${project_config}" "${version_config}" DESTINATION "${config_install_dir}" -) + COMPONENT libh3-dev) -# Config -# * /lib/cmake/h3/h3Targets.cmake +# Config * //cmake/h3/h3Targets.cmake install( EXPORT "${TARGETS_EXPORT_NAME}" NAMESPACE "${namespace}" DESTINATION "${config_install_dir}" + COMPONENT libh3-dev) + +# Debian package build +set(CPACK_DEB_COMPONENT_INSTALL 1) +set(CPACK_GENERATOR "DEB") +set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") +# set(CPACK_DEBIAN_PACKAGE_MAINTAINER "TEST PACKAGE") # Required +set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.h3geo.org") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") +set(CPACK_DEBIAN_LIBH3_PACKAGE_DEPENDS "libc6 (>= 2.27)") +set(CPACK_DEBIAN_LIBH3-DEV_PACKAGE_DEPENDS "libh3 (= ${H3_VERSION})") +set(CPACK_DEBIAN_H3_PACKAGE_DEPENDS "libc6 (>= 2.27), libh3 (= ${H3_VERSION})") +set(CPACK_DEBIAN_LIBH3_DESCRIPTION + "Library files for the H3 hexagonal discrete global grid system.") +set(CPACK_DEBIAN_LIBH3-DEV_DESCRIPTION + "Development files and headers for the H3 hexagonal discrete global grid system." +) +set(CPACK_DEBIAN_H3_DESCRIPTION + "UNIX style filter (command line) tools for the H3 hexagonal discrete global grid system." ) +set(CPACK_DEBIAN_LIBH3_PACKAGE_NAME "libh3") +set(CPACK_DEBIAN_LIBH3-DEV_PACKAGE_NAME "libh3-dev") +set(CPACK_DEBIAN_H3_PACKAGE_NAME "h3") +set(CPACK_DEBIAN_LIBH3_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_LIBH3-DEV_PACKAGE_SECTION "libdevel") +set(CPACK_DEBIAN_H3_PACKAGE_SECTION "science") + +include(CPack) diff --git a/CMakeTests.cmake b/CMakeTests.cmake new file mode 100644 index 000000000..62b60fab1 --- /dev/null +++ b/CMakeTests.cmake @@ -0,0 +1,294 @@ +# Copyright 2017-2022, 2024 Uber Technologies, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# Test code for H3 + +option(BUILD_ALLOC_TESTS "Build tests for custom allocation functions" ON) +option(PRINT_TEST_FILES "Print which test files correspond to which tests" OFF) + +include(TestWrapValgrind) + +enable_testing() + +# Macros and support code needed to build and add the tests +set(test_number 0) + +if(ENABLE_COVERAGE) + file( + GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$/scripts/coverage.sh" + INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/coverage.sh.in") + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage.info") + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage.cleaned.info") + set_property( + DIRECTORY + APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "coverage") + add_custom_target( + coverage + COMMAND + bash "${CMAKE_CURRENT_BINARY_DIR}/$/scripts/coverage.sh" + "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") + add_custom_target( + clean-coverage + # Before running coverage, clear all counters + COMMAND lcov --rc branch_coverage=1 --directory + '${CMAKE_CURRENT_BINARY_DIR}' --zerocounters + COMMENT "Zeroing counters") +endif() + +macro(add_h3_memory_test name srcfile) + # Like other test code, but these need to be linked against a different copy + # of the H3 library which has known intercepted allocator functions. + add_executable(${ARGV} ${APP_SOURCE_FILES} ${TEST_APP_SOURCE_FILES}) + + if(TARGET ${name}) + target_link_libraries(${name} PUBLIC h3WithTestAllocators) + target_include_directories( + ${name} + PUBLIC + $ + ) + target_compile_options(${name} PRIVATE ${H3_COMPILE_FLAGS}) + target_link_libraries(${name} PRIVATE ${H3_LINK_FLAGS}) + endif() + + math(EXPR test_number "${test_number}+1") + + add_test(NAME ${name}_test${test_number} COMMAND ${TEST_WRAPPER} + "$") + + if(ENABLE_COVERAGE) + add_custom_target( + ${name}_coverage${test_number} + COMMAND ${name} > /dev/null + COMMENT "Running ${name}_coverage${test_number}") + + add_dependencies(coverage ${name}_coverage${test_number}) + add_dependencies(${name}_coverage${test_number} clean-coverage) + endif() +endmacro() + +macro(add_h3_test_common name srcfile) + # need to actually make the test target + if(NOT TARGET ${name}) + add_h3_executable(${name} ${srcfile} ${APP_SOURCE_FILES} + ${TEST_APP_SOURCE_FILES}) + endif() + + math(EXPR test_number "${test_number}+1") +endmacro() + +macro(add_h3_test name srcfile) + add_h3_test_common(${name} ${srcfile}) + add_test(NAME ${name}_test${test_number} COMMAND ${TEST_WRAPPER} + "$") + + if(ENABLE_COVERAGE) + add_custom_target( + ${name}_coverage${test_number} + COMMAND ${name} > /dev/null + COMMENT "Running ${name}_coverage${test_number}") + + add_dependencies(coverage ${name}_coverage${test_number}) + add_dependencies(${name}_coverage${test_number} clean-coverage) + endif() +endmacro() + +macro(add_h3_test_with_file name srcfile argfile) + add_h3_test_common(${name} ${srcfile}) + # add a special command (so we don't need to read the test file from the + # test program) + set(dump_command "cat") + + add_test( + NAME ${name}_test${test_number} + COMMAND + ${SHELL} + "${dump_command} ${argfile} | ${TEST_WRAPPER_STR} $" + ) + + if(PRINT_TEST_FILES) + message("${name}_test${test_number} - ${argfile}") + endif() + + if(ENABLE_COVERAGE) + add_custom_target( + ${name}_coverage${test_number} + COMMAND ${name} < ${argfile} > /dev/null + COMMENT "Running ${name}_coverage${test_number}") + + add_dependencies(coverage ${name}_coverage${test_number}) + add_dependencies(${name}_coverage${test_number} clean-coverage) + endif() +endmacro() + +macro(add_h3_cli_test name h3_args expect_string) + add_test( + NAME ${name}_test${test_number} + COMMAND + ${SHELL} + "test \"`$ ${h3_args}`\" = '${expect_string}'") + + if(PRINT_TEST_FILES) + message("${name}_test${test_number} - ${h3_args} - ${expect_string}") + endif() + + # TODO: Build a coverage-enabled variant of the h3 cli app to enable + # coverage +endmacro() + +macro(add_h3_test_with_arg name srcfile arg) + add_h3_test_common(${name} ${srcfile}) + add_test(NAME ${name}_test${test_number} + COMMAND ${TEST_WRAPPER} $ ${arg}) + if(PRINT_TEST_FILES) + message("${name}_test${test_number} - ${arg}") + endif() + + if(ENABLE_COVERAGE) + add_custom_target( + ${name}_coverage${test_number} + COMMAND ${name} ${arg} + COMMENT "Running ${name}_coverage${test_number}") + + add_dependencies(coverage ${name}_coverage${test_number}) + add_dependencies(${name}_coverage${test_number} clean-coverage) + endif() +endmacro() + +# Add each individual test +file(GLOB all_centers tests/inputfiles/bc*centers.txt) +foreach(file ${all_centers}) + add_h3_test_with_file(testLatLngToCell src/apps/testapps/testLatLngToCell.c + ${file}) +endforeach() + +file(GLOB all_ic_files tests/inputfiles/res*ic.txt) +foreach(file ${all_ic_files}) + add_h3_test_with_file(testCellToLatLng src/apps/testapps/testCellToLatLng.c + ${file}) +endforeach() + +file(GLOB all_centers tests/inputfiles/rand*centers.txt) +foreach(file ${all_centers}) + add_h3_test_with_file(testLatLngToCell src/apps/testapps/testLatLngToCell.c + ${file}) +endforeach() + +file(GLOB all_cells tests/inputfiles/*cells.txt) +foreach(file ${all_cells}) + add_h3_test_with_file(testCellToBoundary + src/apps/testapps/testCellToBoundary.c ${file}) +endforeach() + +add_h3_test(testCellToBoundaryEdgeCases + src/apps/testapps/testCellToBoundaryEdgeCases.c) +add_h3_test(testCompactCells src/apps/testapps/testCompactCells.c) +add_h3_test(testGridDisk src/apps/testapps/testGridDisk.c) +add_h3_test(testGridDiskInternal src/apps/testapps/testGridDiskInternal.c) +add_h3_test(testGridRingUnsafe src/apps/testapps/testGridRingUnsafe.c) +add_h3_test(testGridDisksUnsafe src/apps/testapps/testGridDisksUnsafe.c) +add_h3_test(testCellToParent src/apps/testapps/testCellToParent.c) +add_h3_test(testCellToCenterChild src/apps/testapps/testCellToCenterChild.c) +add_h3_test(testCellToChildren src/apps/testapps/testCellToChildren.c) +add_h3_test(testCellToChildPos src/apps/testapps/testCellToChildPos.c) +add_h3_test(testGetIcosahedronFaces src/apps/testapps/testGetIcosahedronFaces.c) +add_h3_test(testCellToChildrenSize src/apps/testapps/testCellToChildrenSize.c) +add_h3_test(testH3Index src/apps/testapps/testH3Index.c) +add_h3_test(testH3IndexInternal src/apps/testapps/testH3IndexInternal.c) +add_h3_test(testH3Api src/apps/testapps/testH3Api.c) +add_h3_test(testCellsToLinkedMultiPolygon + src/apps/testapps/testCellsToLinkedMultiPolygon.c) +add_h3_test(testH3SetToVertexGraphInternal + src/apps/testapps/testH3SetToVertexGraphInternal.c) +add_h3_test(testLinkedGeoInternal src/apps/testapps/testLinkedGeoInternal.c) +add_h3_test(testPolygonToCells src/apps/testapps/testPolygonToCells.c) +add_h3_test(testPolygonToCellsExperimental + src/apps/testapps/testPolygonToCellsExperimental.c) +add_h3_test(testPolygonToCellsReported + src/apps/testapps/testPolygonToCellsReported.c) +add_h3_test(testPolygonToCellsReportedExperimental + src/apps/testapps/testPolygonToCellsReportedExperimental.c) +add_h3_test(testVertexGraphInternal src/apps/testapps/testVertexGraphInternal.c) +add_h3_test(testDirectedEdge src/apps/testapps/testDirectedEdge.c) +add_h3_test(testLatLng src/apps/testapps/testLatLng.c) +add_h3_test(testLatLngInternal src/apps/testapps/testLatLngInternal.c) +add_h3_test(testBBoxInternal src/apps/testapps/testBBoxInternal.c) +add_h3_test(testVertex src/apps/testapps/testVertex.c) +add_h3_test(testVertexInternal src/apps/testapps/testVertexInternal.c) +add_h3_test(testPolygonInternal src/apps/testapps/testPolygonInternal.c) +add_h3_test(testPolyfillInternal src/apps/testapps/testPolyfillInternal.c) +add_h3_test(testVec2dInternal src/apps/testapps/testVec2dInternal.c) +add_h3_test(testVec3dInternal src/apps/testapps/testVec3dInternal.c) +add_h3_test(testCellToLocalIj src/apps/testapps/testCellToLocalIj.c) +add_h3_test(testCellToLocalIjInternal + src/apps/testapps/testCellToLocalIjInternal.c) +add_h3_test(testGridDistance src/apps/testapps/testGridDistance.c) +add_h3_test(testGridDistanceInternal + src/apps/testapps/testGridDistanceInternal.c) +add_h3_test(testGridPathCells src/apps/testapps/testGridPathCells.c) +add_h3_test(testH3CellArea src/apps/testapps/testH3CellArea.c) +add_h3_test(testCoordIjInternal src/apps/testapps/testCoordIjInternal.c) +add_h3_test(testCoordIjkInternal src/apps/testapps/testCoordIjkInternal.c) +add_h3_test(testBaseCells src/apps/testapps/testBaseCells.c) +add_h3_test(testBaseCellsInternal src/apps/testapps/testBaseCellsInternal.c) +add_h3_test(testPentagonIndexes src/apps/testapps/testPentagonIndexes.c) +add_h3_test(testH3IteratorsInternal src/apps/testapps/testH3IteratorsInternal.c) +add_h3_test(testMathExtensionsInternal + src/apps/testapps/testMathExtensionsInternal.c) +add_h3_test(testDescribeH3Error src/apps/testapps/testDescribeH3Error.c) + +add_h3_test_with_arg(testH3NeighborRotations + src/apps/testapps/testH3NeighborRotations.c 0) +add_h3_test_with_arg(testH3NeighborRotations + src/apps/testapps/testH3NeighborRotations.c 1) +add_h3_test_with_arg(testH3NeighborRotations + src/apps/testapps/testH3NeighborRotations.c 2) + +# The "Exhaustive" part of the test name is used by the test-fast to exclude +# these files. test-fast exists so that Travis CI can run Valgrind on tests +# without taking a very long time. +add_h3_test(testDirectedEdgeExhaustive + src/apps/testapps/testDirectedEdgeExhaustive.c) +add_h3_test(testVertexExhaustive src/apps/testapps/testVertexExhaustive.c) +add_h3_test(testCellToLocalIjExhaustive + src/apps/testapps/testCellToLocalIjExhaustive.c) +add_h3_test(testGridPathCellsExhaustive + src/apps/testapps/testGridPathCellsExhaustive.c) +add_h3_test(testGridDistanceExhaustive + src/apps/testapps/testGridDistanceExhaustive.c) +add_h3_test(testH3CellAreaExhaustive + src/apps/testapps/testH3CellAreaExhaustive.c) +add_h3_test(testCellToBBoxExhaustive + src/apps/testapps/testCellToBBoxExhaustive.c) + +file(GLOB cli_tests tests/cli/*.txt) +foreach(file ${cli_tests}) + include(${file}) +endforeach() + +if(BUILD_ALLOC_TESTS) + add_h3_library(h3WithTestAllocators test_prefix_) + + add_h3_memory_test(testH3Memory src/apps/testapps/testH3Memory.c) +endif() + +add_custom_target(test-fast COMMAND ctest -E Exhaustive) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1594b66e2..6bd9e5207 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,12 +2,15 @@ Pull requests and Github issues are welcome! +Planned improvements and changes are discussed in Github issues. Feel free to open a discussion proposing a new one. + ## Pull requests * Please include tests that show the bug is fixed or feature works as intended. +* Please include fuzzer tests for public API functions. * Please add a description of your change to the Unreleased section of the [changelog](./CHANGELOG.md). * Please open issues to discuss large features or changes which would break compatibility, before submitting pull requests. -* Please keep H3 compatible with major C compilers, such as GCC, Clang, and MSVC. +* Please keep H3 compatible with major C compilers, such as GCC, Clang, and MSVC. We use clang-format-14 for source code formatting, if you have another version the CI job may error on formatting differences. * Please keep code coverage of the core H3 library at 100%. Before we can merge your changes, you must agree to the [Uber Contributor License Agreement](https://cla-assistant.io/uber/h3). @@ -16,6 +19,6 @@ Before we can merge your changes, you must agree to the [Uber Contributor Licens In addition to making pull requests and Github issues on the @uber/h3 repository, there are other ways you can contribute. Here are some suggestions: -* Writing and updating the [documentation website](./docs/). -* Writing [bindings](./dev-docs/creating_bindings.md) for your preferred language. +* Writing and updating the [documentation website](./website/docs/). +* Writing [bindings](./website/docs/community/bindings.md) for your preferred language. * Writing components so that your preferred GIS, mapping, or visualization system can display H3 indexes. diff --git a/LICENSE b/LICENSE index c37bb8444..261eeb9e9 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2017 Uber Technologies, Inc. + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,4 +199,3 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/NOTICE b/NOTICE new file mode 100644 index 000000000..27a7cf010 --- /dev/null +++ b/NOTICE @@ -0,0 +1,13 @@ +Copyright 2017-2021 Uber Technologies, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index 079ea912f..a09ff3558 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,39 @@ +H3 Logo + # H3: A Hexagonal Hierarchical Geospatial Indexing System -[![Build Status](https://travis-ci.org/uber/h3.svg?branch=master)](https://travis-ci.org/uber/h3) -[![Build status](https://ci.appveyor.com/api/projects/status/61431y4sc5w0tsuk/branch/master?svg=true)](https://ci.appveyor.com/project/Uber/h3/branch/master) +[![test-linux](https://github.com/uber/h3/workflows/test-linux/badge.svg)](https://github.com/uber/h3/actions) +[![test-macos](https://github.com/uber/h3/workflows/test-macos/badge.svg)](https://github.com/uber/h3/actions) +[![test-windows](https://github.com/uber/h3/workflows/test-windows/badge.svg)](https://github.com/uber/h3/actions) +[![test-website](https://github.com/uber/h3/workflows/test-website/badge.svg)](https://github.com/uber/h3/actions) [![Coverage Status](https://coveralls.io/repos/github/uber/h3/badge.svg?branch=master)](https://coveralls.io/github/uber/h3?branch=master) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) H3 is a geospatial indexing system using a hexagonal grid that can be (approximately) subdivided into finer and finer hexagonal grids, combining the benefits of a hexagonal grid with [S2](https://code.google.com/archive/p/s2-geometry-library/)'s hierarchical subdivisions. -Documentation is available at [https://uber.github.io/h3/](https://uber.github.io/h3/). Developer documentation in Markdown format is available under the [dev-docs](./dev-docs/) directory. +Documentation is available at [https://h3geo.org/](https://h3geo.org/). Developer documentation in Markdown format is available under the [dev-docs](./dev-docs/) directory. * Post **bug reports or feature requests** to the [GitHub Issues page](https://github.com/uber/h3/issues) * Ask **questions** by posting to the [H3 tag on StackOverflow](https://stackoverflow.com/questions/tagged/h3) + * There is also an [H3 Slack workspace](https://join.slack.com/t/h3-core/shared_invite/zt-g6u5r1hf-W_~uVJmfeiWtMQuBGc1NNg) ## Installing -We recommend using prebuilt bindings if they are available for your programming language. Bindings for [Go](https://github.com/uber/h3-go), [Java](https://github.com/uber/h3-java), [JavaScript](https://github.com/uber/h3-js), [Python](https://github.com/uber/h3-py), and [others](https://uber.github.io/h3/#/documentation/community/bindings) are available. +We recommend using prebuilt bindings if they are available for your programming language. Bindings for [Java](https://github.com/uber/h3-java), [JavaScript](https://github.com/uber/h3-js), [Python](https://github.com/uber/h3-py), and [others](https://h3geo.org/docs/community/bindings) are available. -If no bindings are available, you can only install H3 by building from source. +On macOS, you can install H3 using `brew`: +``` +brew install h3 +``` +Otherwise, to build H3 from source, please see the following instructions. ### Building from source -Still here? To build the H3 C library, you'll need a C compiler (tested with `gcc` and `clang`), [CMake](https://cmake.org/), and [Make](https://www.gnu.org/software/make/). If you intend to contribute to H3, you must have [clang-format](https://clang.llvm.org/docs/ClangFormat.html) installed and we recommend installing [ccmake](https://cmake.org/cmake/help/v3.0/manual/ccmake.1.html) and [LCOV](http://ltp.sourceforge.net/coverage/lcov.php) to configure the `cmake` arguments to build and run the tests and generate the code coverage report. We also recommend using `gcc` for the code coverage as some versions of `clang` generate annotations that aren't compatible with `lcov`. [Doxygen](http://www.stack.nl/~dimitri/doxygen/) is needed to build the API documentation. +Still here? To build the H3 C library, you'll need a C compiler (tested with `gcc` and `clang`), [CMake](https://cmake.org/), and [Make](https://www.gnu.org/software/make/). If you intend to contribute to H3, you must have [clang-format](https://clang.llvm.org/docs/ClangFormat.html) installed and we recommend installing [ccmake](https://cmake.org/cmake/help/v3.0/manual/ccmake.1.html) and [LCOV](http://ltp.sourceforge.net/coverage/lcov.php) to configure the `cmake` arguments to build and run the tests and generate the code coverage report. We also recommend using `gcc` for the code coverage as some versions of `clang` generate annotations that aren't compatible with `lcov`. [Doxygen](https://www.doxygen.nl/index.html) is needed to build the API documentation. #### Install build-time dependencies -* Alpine +* Alpine ``` # Installing the bare build requirements apk add cmake make gcc libtool musl-dev @@ -39,7 +48,7 @@ sudo apt install cmake make gcc libtool sudo apt install clang-format cmake-curses-gui lcov doxygen ``` -* macOS (using brew) +* macOS (using `brew`) First make sure you [have the developer tools installed](http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/) and then @@ -54,24 +63,79 @@ brew install clang-format lcov doxygen You will need to install CMake and Visual Studio, including the Visual C++ compiler. For building on Windows, please follow the [Windows build instructions](dev-docs/build_windows.md). +* FreeBSD + + ``` +# Installing the build requirements +sudo pkg install bash cmake gmake doxygen lcov +``` + #### Compilation -From the repository you would then compile like so: +When checking out the H3 Git repository, by default you will check out the latest +development version of H3. When using H3 in an application, you will want to check +out the most recently released version: + +``` +git checkout v$( + +* **Authors**: - +* **Date**: - +* **Status**: Draft + +## Abstract + +*Brief overview of the subject and proposal* + +## Motivation + +*Why is this important?* + +## Approaches + +*What are the various options to address this issue?* + +## Proposal + +*What is the recommended approach?* \ No newline at end of file diff --git a/dev-docs/RFCs/v4.0.0/error-handling-rfc.md b/dev-docs/RFCs/v4.0.0/error-handling-rfc.md new file mode 100644 index 000000000..d65510484 --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/error-handling-rfc.md @@ -0,0 +1,320 @@ +# RFC: Standardize Error Handling + +* **Authors**: Isaac Brodsky (@isaacbrodsky) +* **Date**: June 19, 2020 +* **Status**: Accepted + +## Overview + +This is a proposal for changing H3 function signatures (the type of the value +returned by the function) to indicate error cases. + +## Motivation + +H3 does it's best to be robust to system failures or unexpected inputs, but +some times these cannot be recovered from. When that happens, the application +calling H3 needs to be aware of the problem so it can be handled and the +user alerted to the issue. + +One of the main impediments with this happening currently is the use of `void` as +the return type for a number of H3 functions. This precludes the ability to use +the return value for indicating an error. In many cases, the outputs of the function +cannot indicate an error case versus a case with no output. + +This proposal is to change H3 functions that can experience internal errors +or invalid inputs to be able to indicate this to the calling program, in a +consistent and useful way. + +## Prior Art + +Reading materials to reference: + +* [Cython](https://cython.readthedocs.io/en/latest/src/userguide/language_basics.html#error-return-values) +* [SQLite](https://sqlite.org/rescode.html) +* [SDL](https://wiki.libsdl.org/SDL_GetError) +* [libpng](http://www.libpng.org/pub/png/libpng-1.4.0-manual.pdf) + +## Approaches + +### Return code + +Sample: +``` +H3Error err; +H3Index result; + +err = latLngToCell(lat, lng, res, &result); +if (err) { + fprintf(stderr, "Error: %d", err); +} +``` + +Sample with errors discarded: +``` +H3Index result; + +latLngToCell(lat, lng, res, &result); +``` + +Placing error information in the return of function calls requires that functions return two pieces of information - the error status, and the requested data. This approach does make it clear that a status code is returned and that may make it more usual that a consumer of the API does check the error status. + +### Return code + "unsafe version" + +Sample: +``` +H3Error err; +H3Index result; + +err = latLngToCell(lat, lng, res, &result); +if (err) { + fprintf(stderr, "Error: %d", err); +} +``` + +Sample with errors discarded: +``` +H3Index result; + +result = unsafe_latLngToCell(lat, lng, res); +``` + +This approach is the same as using return codes, but offers an "unsafe" version of some functions where there is less or no error information returned. This is intended to be used in performance critical cases where the inputs are known to be suitable ahead of time, or the caller would not do anything with the error information anyways. + +### Return code + "GetError" + +Sample: +``` +H3Error err; +H3Index result; + +err = latLngToCell(lat, lng, res, &result); +if (err) { + const char* msg = h3GetError(); + fprintf(stderr, "Error: %d (%s)", err, msg); +} +``` + +This is an extension to the return code approach where the library provides additional information through a "GetError" style function. This is often used to provide an English language name for the error such as "I/O Error", "Latitude out of range", "Success", etc. + +Unless the error information returned from the function contains enough information, this approach can only return additional information about the last error, and has similar thread safety concerns as _GetError only_, below. + +### GetError only + +Sample: +``` +H3Error err; +H3Index result; + +result = latLngToCell(lat, lng, res); +if (err = h3GetError()) { + fprintf(stderr, "Error: %d", err); +} +``` + +Sample with errors discarded: +``` +H3Index result; + +result = latLngToCell(lat, lng, res); +``` + +In this approach, the data requested is returned from the function, and the consumer is responsible for knowing when to check for errors, and how to handle them. There are a few drawbacks: + +1. Consumers must reference documentation (not the function signature) to know when to check for errors. +2. [C11 has thread local storage](https://en.wikipedia.org/wiki/Thread-local_storage#C_and_C++), but this may complicate build processes to support pre-C11 compilers. +3. Unless sufficient information is provided about the error (via a return code, above), GetError can only return information about the most recent error. + +### Error parameter by reference + +Sample: +``` +H3Error err; +H3Index result; + +result = latLngToCell(lat, lng, res, &err); +if (err) { + fprintf(stderr, "Error: %d", err); +} +``` + +Sample with errors discarded: +``` +H3Index result; +result = latLngToCell(lat, lng, res, NULL); +``` + +This is an inversion of the return code approach, where the error status is the reference parameter. This offers an advantage that a caller could choose to disregard the error status (for example by passing NULL) + +### setjmp/longjmp + +Sample: +``` +H3Index result; +jmp_buf env; +int err; + +if (err = setjmp(env)) { + fprintf(stderr, "Error: %d", err); +} else { + result = latLngToCell(lat, lng, res, env); +} +``` + +It will be very difficult to implement error handling using `setjmp`. There are several main problems: + +1. H3 is designed for its API to be bound to other languages, but other languages generally do not support `setjmp`. +2. `setjmp` requires passing an environment reference anyways, which could also carry error information. + +## Proposal + +### Consistency + +It would be good to use a single pattern for error handling, so that callers do not need to reference documentation, or determine how to handle different types of error reporting in their environment. + +### Return Code + +It is proposed that errors will be indicated by the return code of the function. Any public function that can return an +error (for example, due to domain issues in its input) will return an error code. + +The signature for `latLngToCell` will look like: +``` +H3Error latLngToCell(double lat, double lng, int res, H3Index *result); +``` + +### Is Valid Functions + +There are two types of functions returning booleans in the library: + +* Validation functions, where the return code can be replaced with an error code. Example: `h3IsValid` +* Property inspection functions, where the return code would be ambiguous between invalid and the property being false. Example: `h3IsResClassIII` + +### H3Error type + +(Discussion: It may be nice to have an enum for this type.) + +This section will explicitly be part of the public API for semantic versioning of the H3 library. + +The proposal is to use the 32-bit option, below. + +#### 64-bit option + +The error type will be an integer, with the following properties: + +* `H3Error` will be an integer type of 64 bits, i.e. `uint64_t`. +* `H3Error` with value 0 indicates success (no error). +* No `H3Error` value will set the most significant bit. +* No `H3Error` value will set the bits that correspond with the **Mode** bit field in an `H3Index`. + +64 bits is unlikely to be needed by `H3Error`, but allows for explicitly mixing error codes and resulting indexes if desired by the application. + +The C definition of the type will be: + +``` +typedef uint64_t H3Error; +``` + +#### 32-bit option + +The error type will be an integer, with the following properties: + +* `H3Error` will be an integer type of 32 bits, i.e. `uint32_t`. +* `H3Error` with value 0 indicates success (no error). +* No `H3Error` value will set the most significant bit. +* As a result of these properties, no `H3Error` value will set the bits that correspond with the **Mode** bit field in an `H3Index`. + +32 bit return codes with the high bit never set allows for mixing error codes and resulting indexes if desired by the application, after copying the error codes into the result buffer. + +The C definition of the type will be: + +``` +typedef uint32_t H3Error; +``` + +### H3Error values + +Error codes, other than the success code, can either be sequentially numbered, or can have additional structure encoded (for example, bit 2 being set could always indicate an argument domain error.) + +SQLite's approach to this is to define broad error categories (in 8 bits), and then allow functions to provide additional error information in the remaining bits. + +#### Table of error codes + +| Value | Name | Description +| ----- | -------------------- | ----------- +| 0 | E_SUCCESS | Success (no error) +| 1 | E_FAILED | The operation failed but a more specific error is not available +| 2 | E_DOMAIN | Argument was outside of acceptable range (when a more specific error code is not available) +| 3 | E_LATLNG_DOMAIN | Latitude or longitude arguments were outside of acceptable range +| 4 | E_RES_DOMAIN | Resolution argument was outside of acceptable range +| 5 | E_CELL_INVALID | `H3Index` cell argument was not valid +| 6 | E_DIR_EDGE_INVALID | `H3Index` directed edge argument was not valid +| 7 | E_UNDIR_EDGE_INVALID | `H3Index` undirected edge argument was not valid +| 8 | E_VERTEX_INVALID | `H3Index` vertex argument was not valid +| 9 | E_PENTAGON | Pentagon distortion was encountered which the algorithm could not handle it +| 10 | E_DUPLICATE_INPUT | Duplicate input was encountered in the arguments and the algorithm could not handle it +| 11 | E_NOT_NEIGHBORS | `H3Index` cell arguments were not neighbors +| 12 | E_RES_MISMATCH | `H3Index` cell arguments had incompatible resolutions +| 13 | E_MEMORY_ALLOC | Necessary memory allocation failed +| 14 | E_MEMORY_BOUNDS | Bounds of provided memory were not large enough + +The H3 library may always add additional error messages. Error messages not recognized by the application should be treated as `E_FAILED`. The latest version of this table is available [in the documentation](https://h3geo.org/docs/next/library/errors#table-of-error-codes). + +#### Example error code results + +``` +latLngToCell(lat=Infinity, lng=0, res=0, &out) => E_LATLNG_DOMAIN +latLngToCell(lat=0, lat=0, res=-1, &out) => E_RES_DOMAIN +cellToLatLng(index=0, &out) => E_CELL_INVALID +h3IsResClassIII(index=RES_0_INDEX, &out) => E_SUCCESS +h3IsResClassIII(index=RES_1_INDEX, &out) => E_SUCCESS +h3IsResClassIII(index=0, &out) => E_CELL_INVALID +maxKringSize(k=-1) => E_DOMAIN +hexRange(origin=0, k=0, &out) => E_CELL_INVALID +hexRange(origin=AN_INDEX, k=-1, &out) => E_DOMAIN +hexRange(origin=PENTAGON_INDEX, k=1, &out) => E_PENTAGON +# Failed to allocate internal buffer: +kRing(origin=AN_INDEX, k=1, &out) => E_MEMORY_ALLOC +distanceRads({Infinity, Infinity}, {0, 0}, &out) => E_LATLNG_DOMAIN +hexAreaKm2(res=-1) => E_RES_DOMAIN +# Cannot parse: +stringToH3(str="zzzz", &out) => E_FAILED +# Output buffer is not large enough: +h3ToString(index=AN_INDEX, &out, sizeof(out)) => E_FAILED +h3IsValid(index=AN_INDEX) => E_SUCCESS +h3IsValid(index=0) => E_CELL_INVALID +compact({AN_INDEX, AN_INDEX}, &out, numHexes) => E_DUPLICATE_INPUT +getOriginH3IndexFromUnidirectionalEdge(edge=AN_INDEX, &out) => E_EDGE_INVALID +h3Distance(AN_INDEX, AN_INDEX_FAR_AWAY, &out) => E_FAILED +h3IndexesAreNeighbors(AN_INDEX, A_NEIGHBOR) => E_SUCCESS +h3IndexesAreNeighbors(AN_INDEX, AN_INDEX_FAR_AWAY) => E_NOT_NEIGHBORS +h3IndexesAreNeighbors(AN_INDEX, AN_INDEX_WRONG_RES) => E_RES_MISMATCH +getH3UnidirectionalEdge(AN_INDEX, AN_INDEX_FAR_AWAY, &out) => E_NOT_NEIGHBORS +``` + +### Bindings + +Bindings should translate error codes into the error handling mechanism appropriate to their language. For example, Java will convert error codes into Java Exceptions. + +When possible, it is preferable to retain the error code. When this is not possible it is fine to elide them. Language bindings should include error messages that are formatted as is usual in their language. An example in Java could be: + +``` +public class H3Exception extends Exception { + private final long errorCode; + + public H3Exception(long errorCode) { + super(messageFromErrorCode(errorCode)); + this.errorCode = errorCode; + } + + public long getErrorCode() { + return errorCode; + } + + public static String messageFromErrorCode(long errorCode) { + switch (errorCode) { + case 4: // E_RES_INVALID + return "Resolution arugment was invalid"; + // elided ... + } + } +} +`` diff --git a/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md b/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md new file mode 100644 index 000000000..742cf7258 --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md @@ -0,0 +1,298 @@ +# RFC: Names for H3 Concepts, Types, and Functions + +- **Authors**: + - AJ Friend + - Nick Rabinowitz + - Isaac Brodsky + - David Ellis +- **Dates**: + - Started: 2020-02-02 + - Accepted: 2020-03-26 + - Latest update: 2021-04-25 +- **Status**: Accepted +- **Discussions**: + - + - + - + - + +## Motivation + +Concepts like `hexagon`, `cell`, and `index` are currently used ambiguously in the H3 codebase and in documentation. +This can cause confusion, for example, when a function might only work on strict H3 *hexagons*, but fails when encountering H3 *pentagons*. + +Reaching a consensus on the precise, technical language used when discussing H3 concepts will clarify future library discussions and improve end-user documentation. + +We would also like to standardize a function-naming scheme. + +## Terminology + +The following technical terms should be used in the documentation, the H3 codebase, and precise technical discussions of the library. + +- `H3Index`: + - an unsigned 64-bit integer representing *any* H3 object (hexagon, pentagon, directed edge ...) + - often represented as a 15-character (or 16-character) hexadecimal string, like `'8928308280fffff'` + - the full term "H3 index" should be used to avoid confusion with other common uses of "index"; + when a "traditional" index is needed, prefer using "number", "pos", or another term to avoid confusion +- **mode**: + - an integer describing the type of object being represented by an H3 index + - this integer is encoded in the `H3Index` +- **cell** or **H3 cell**: + - a geometric/geographic unit polygon in the H3 grid, corresponding to an `H3Index` of `mode 1` (hexagon or pentagon) + - for functions that can handle either hexagons or pentagons, the more general term "cell" should be used whenever possible +- **hexagon**: + - an H3 **cell** that is a **topological** hexagon + - below, we explain that functions that *only* work with **hexagons** have an `Unsafe` suffix; + these functions are paired with ones having a `Safe` suffix, meaning they can handle **pentagons**, but are slower +- **pentagon**: + - an H3 **cell** that is a **topological** pentagon +- **directed edge**: + - represents a traversal from an origin **cell** to an adjacent destination **cell** + - corresponds to an `H3Index` of `mode 2` +- **grid**: + - the graph with nodes corresponding to H3 cells, and edges given by pairs of adjacent cells + - for example, `gridDistance` is the minimal number of edges in a graph path connecting two cells +- **lat/lng point**: + - a representation of a geographic point in terms of a latitude/longitude pair +- **topological**: + - H3 cells are **topological** pentagons or hexagons, in the sense that they have 5 or 6 neighbors, respectively, in the H3 **grid** + - the majority of **hexagons** are also **geometric** hexagons (similarly with **pentagons**), in that they have 6 edges and vertices when represented as polygons of lat/lng points + - a small number of **hexagons** are not **geometric** hexagons (similarly with **pentagons**), in that they have extra vertices and edges due to distortion around icosahedron boundaries + - for more details, see this [h3-js issue](https://github.com/uber/h3-js/issues/53) or this [Observable post](https://observablehq.com/@fil/h3-oddities) +- **base cell**: + - one of the 122 H3 **cells** (110 hexagons and 12 pentagons) of resolution `0` + - every other cell in H3 is a child of a base cell + - each base cell has a "base cell number" (0--121), which is encoded into the `H3Index` representation of every H3 cell + - there is a one-to-one correspondence between the "base cell number" and the `H3Index` representation of resolution `0` cells + + e.g., base cell 0 has `H3Index` hexadecimal representation `'8001fffffffffff'` +- **boundary**: + - all or part of the list of lat/lng points that enclose an H3 cell + - may include more than 6 points in the case that a cell is not a geometric hexagon, such as when a hexagon crosses an icosahedron boundary + - may also be used to describe the boundary between two geometric cells, as in the case of an edge + - represented in the H3 codebase with the `CellBoundary` struct (previously `GeoBoundary` before v4.0) +- `H3_NULL`; + - equivalent to `0` and guaranteed to never be a valid `H3Index` (even after any future H3 **modes** are added) + - returned by functions to denote an error, or to denote missing data in arrays of `H3Index` + - analogous to `NaN` in floating point + + +### Use of "hex", "hexagon", "cell", "pentagon", etc. + +We realize that "hex" or "hexagon" will still be used informally to refer to the concept of "cell" (As the development team, we do it ourselves!). +This should be expected in casual, informal discussions of H3. +However, when *precision* is required, we advise the use of strict technical terms like "index", "cell", "hexagon", "pentagon", etc. +In the codebase and in the documentation, strictly correct terminology should *always* be used, as many functions and algorithms distinguish between hexagons and pentagons. + + +## `H3_EXPORT` and C name collisions + +To avoid C name collisions, we should build the bindings (`h3-py`, `h3-java`, `h3-go`, and `h3-node`) with a standard function prefix, using the `H3_EXPORT` C macro. +The `h3-js` binding would not need this. + +The proposed prefix is `h3_`. + +## Functions + +### Conventions for "property getters" and transforms + +- use `get` prefix for + + constant data (`getNumCells`, `getRes0Cells`) + + object properties (`getResolution`, `getBaseCellNumber`) +- use `to` to denote transforms + + different representations of the same object + + when doing a lossy transformation to a new object (`cellToParent`, `latLngToCell`, `polygonToCells`) +- do not use `get` or `to` for *computations* + + e.g., `compactCells`, `cellAreaKm2` + +There is some ambiguity between property, transform, and computation, so use your best judgement with these guidelines in mind. + +### Validity checks + +- `isValid*` should mean that a *full* validity check is made +- without `Valid` (like in the case of `isPentagon`), we do not guarantee + that a full validity check is made; instead, a user should assume only a + minimal bit mask check is done + - we could imagine a `isValidPengaton` function, if full verification + would be convenient +- similarly, a function like `areNeighborCells` will assume each cell + has passed the `isValidCell` check; the function will do only minimal + work to determine if they are neighbors + + +### General Function Names + +| Current name | Proposed name | +|-------------------------------|-----------------------| +| *Does Not Exist (DNE)* | `isValidIndex` | +| `h3IsValid` | `isValidCell` | +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `h3IsPentagon` | `isPentagon` | +| `h3IsResClassIII` | `isResClassIII` | +| `h3IndexesAreNeighbors` | `areNeighborCells` | +| `h3ToParent` | `cellToParent` | +| `h3ToCenterChild` | `cellToCenterChild` | +| `h3ToChildren` | `cellToChildren` | +| `numHexagons` | `getNumCells` | +| `getRes0Indexes` | `getRes0Cells` | +| `getPentagonIndexes` | `getPentagons` | +| `h3GetBaseCell` | `getBaseCellNumber` | +| `h3GetResolution` | `getResolution` | +| *DNE* | `getMode` | +| `h3GetFaces` | `getIcosahedronFaces` | +| `geoToH3` | `latLngToCell` | +| `h3ToGeo` | `cellToLatLng` | +| `compact` | `compactCells` | +| `uncompact` | `uncompactCells` | +| `polyfill` | `polygonToCells` | + +**Note**: `getResolution` and `getBaseCellNumber` should work for both cells and edges. + + +### H3 Grid Functions + +Many of these functions will have three forms: +- `` +- `Unsafe` +- `Safe` + +The `Unsafe` version is fast, but may fail if it encounters a pentagon. +It should return a failure code in this case. + +The `Safe` version is slower, but will work in all cases. + +The version without either suffix is intended to be the one typically +used. +This version will first attempt the `Unsafe` version, and if +it detects failure, will fall back to the `Safe` version. +Encountering pentagons is rare in most use-cases, so this version +should usually be equivalent to the fast version, but with a guarantee +that it will not fail. + +Initially, we **will not** expose the `Safe` versions to users in the API. +We may expose them in the future if a need becomes clear. + + +#### Distance + +| Current name | Proposed name | +|--------------|-------------------------| +| `h3Distance` | `gridDistance` | +| `h3Line` | `gridPathCells` | +| *DNE* | `gridPathEdges` | +| *DNE* | `gridPathDirectedEdges` | + + +#### Filled-In Disk With Distances + +| Current name | Proposed name | Calls | +|---------------------|---------------------------|---------------------------------------| +| `hexRangeDistances` | `gridDiskDistancesUnsafe` | NONE | +| `_kRingInternal` | `gridDiskDistancesSafe` | NONE | +| `kRingDistances` | `gridDiskDistances` | `hexRangeDistances`, `_kRingInternal` | + + +#### Filled-In Disk Without Distances + +| Current name | Proposed name | Calls | +|--------------|-------------------|---------------------| +| `hexRange` | `gridDiskUnsafe` | `hexRangeDistances` | +| *DNE* | `gridDiskSafe` | | +| `kRing` | `gridDisk` | `kRingDistances` | +| `hexRanges` | `gridDisksUnsafe` | N x `hexRange` | + +- **Note**: We may remove `hexRanges` from the API, as it is just a very simple wrapper around + `hexRange`. Inclusion is a discussion separate from this RFC. We'll simply state that + *if we do* include it, we will rename it `gridDisksUnsafe`. + + +#### Hollow Ring + +| Current name | Proposed name | Calls | +|--------------|------------------|----------------------------------| +| `hexRing` | `gridRingUnsafe` | NONE | +| *DNE* | `gridRingSafe` | `gridDiskDistancesSafe` | +| *DNE* | `gridRing` | `gridRingUnsafe`, `gridRingSafe` | + +#### Local IJ + +| 3.x name | 4.0.0 name | +|---------------------------|-----------------| +| `experimentalLocalIjToH3` | `localIjToCell` | +| `experimentalH3ToLocalIj` | `cellToLocalIj` | + +**Note**: The term *experimental* is dropped from the names because the functions +have been in the H3 API for a significant period of time. + +### H3 Edge Types + +Instead of `UnidirectionalEdge`, use the term `DirectedEdge`. + +For a future undirected edge mode, use the term `Edge`. + +| Current name | Proposed name | +|-----------------------------------------------|------------------------------| +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `getH3UnidirectionalEdge` | `cellsToDirectedEdge` | +| `getH3IndexesFromUnidirectionalEdge` | `directedEdgeToCells` | +| `getH3UnidirectionalEdgesFromHexagon` | `originToDirectedEdges` | +| *DNE* | `destinationToDirectedEdges` | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | +| `getOriginH3IndexFromUnidirectionalEdge` | `getDirectedEdgeOrigin` | +| `getDestinationH3IndexFromUnidirectionalEdge` | `getDirectedEdgeDestination` | + + +### Area/Length Functions + +| 3.x name. | 4.0.0 name | +|-----------------------|-----------------------------| +| `hexAreaKm2` | `getHexagonAreaAvgKm2` | +| `hexAreaM2` | `getHexagonAreaAvgM2` | +| `edgeLengthKm` | `getHexagonEdgeLengthAvgKm` | +| `edgeLengthM` | `getHexagonEdgeLengthAvgM` | +| *DNE* | `getPentagonAreaAvg*` | +| *DNE* | `getPentagonEdgeLengthAvg*` | +| *DNE* | `cellAreaKm2` | +| *DNE* | `cellAreaM2` | +| `pointDistKm` | `greatCircleDistanceKm` | +| `pointDistM` | `greatCircleDistanceM` | +| `pointDistRads` | `greatCircleDistanceRads` | +| `exactEdgeLengthRads` | `edgeLengthRads` | +| `exactEdgeLengthKm` | `edgeLengthKm` | +| `exactEdgeLengthM` | `edgeLengthM` | + +**Note**: `cellAreaKm2` and `cellAreaM2` would return the actual area of +the passed-in cell. + + +## Polygons + +**Note**: In addition to the changes listed in this section, we are considering +removing the `Linked*` data types from the public API. However, that is a larger +discussion requiring benchmarking, so we will defer that to a +[separate issue](https://github.com/uber/h3/issues/323) outside of this RFC. + + +### Data Structures + +- rename `GeoBoundary` to `CellBoundary` to indicate it is space-limited to describing the geometry of cells + +| Current name | Proposed name | Notes | +|-------------------|-------------------|---------------------------------| +| `GeoCoord` | `LatLng` | | +| `GeoBoundary` | `CellBoundary` | <= 10 stack-allocated `LatLng`s | +| `Geofence` | `GeoLoop` | heap-allocated `LatLng`s | +| `GeoPolygon` | `GeoPolygon` | | +| `GeoMultiPolygon` | `GeoMultiPolygon` | currently not used | + + +### Functions + +| 3.x name | Proposed name | Notes | +|-----------------------------------|-----------------------------|----------------------------| +| `h3ToGeoBoundary` | `cellToBoundary` | returns `CellBoundary` | +| *DNE* | `cellToLoop` | returns `GeoLoop` | +| *DNE* | `loopToBoundary` | | +| *DNE* | `boundaryToLoop` | | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | returns `CellBoundary` | +| `h3SetToLinkedGeo` | `cellsToLinkedMultiPolygon` | returns `LinkedGeoPolygon` | +| `h3SetToToMultiPolygon` | `cellsToMultiPolygon` | bindings only | \ No newline at end of file diff --git a/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md new file mode 100644 index 000000000..244d12b84 --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md @@ -0,0 +1,141 @@ +# RFC: Overrideable allocation functions for H3 + +* **Authors**: Isaac Brodsky (@isaacbrodsky) +* **Date**: February 7, 2020 +* **Status**: Implemented + +## Overview + +This is a proposal for adding a mechanism for users of the H3 library to provide heap allocator instead of the default +malloc implementation. + +## Motivation + +This will address the following use cases: + +* H3 is used inside of another application which has its own heap management scheme. For example, using the allocation + functions provided by Postgres or the Java Virtual Machine. +* Testing of failure cases of H3, by simulating allocation failures. + +Most H3 functions accept memory from the caller in order to avoid this problem. This will still be the preferred way +to handle memory management in H3. Stack allocation is avoided because H3 cannot know whether there is sufficient stack +memory available. (Note that `_kRingInternal`/`kRingDistances` implicitly uses stack allocation because it implements DFS +recursively.) + +A few functions in H3 do heap allocate memory because it is not feasible to do otherwise, or as a convenience. The +functions that heap allocate are: + +| Function | Reason +| --- | --- +| `kRing`| Convenience wrapper around `kRingDistances` +| `polyfill` | Convenience (could be passed in, requires internal knowledge) +| `compact` | Convenience (could be passed in, requires internal knowledge) +| `h3SetToLinkedGeo` | Requires knowledge of how to initialize the internal struct +| `destroyLinkedPolygon` | Required for `h3SetToLinkedGeo` + +## Prior Art + +Reading materials to reference: + +* [C++ `vector`](http://www.cplusplus.com/reference/vector/vector/) (via templates) +* [SDL](https://discourse.libsdl.org/t/sdl-2-0-7-prerelease/23232) (via `SDL_SetMemoryFunctions`) +* [PostgreSQL](https://www.postgresql.org/docs/10/xfunc-c.html) (via `palloc`) +* [SQLite](https://sqlite.org/malloc.html) + +## Approaches + +All approaches assume the user has defined the following functions: + +``` +void* my_malloc(size_t size); +void* my_calloc(size_t count, size_t size); +void my_free(void* pointer); + +// TODO: Do we want my_realloc? +``` + +### Global statics + +In this approach, H3 stores the allocation functions in a set of static variables. + +``` +h3SetAllocator(&my_alloc, &my_calloc, &my_free); + +// call into H3 as before +polyfill(geoPolygon, res, out); +``` + +Pro: +* Allows the user to replace allocators at run time. + +Con: +* Not thread safe, or an additional, complicated dependency is needed to ensure thread safety. +* Global state. + +### Templates + +This approach is similar to how C++ handles allocator replacement in its standard library, by accepting the allocator +as a template argument. However, H3 is written in C and must implement templates using macros. + +``` +POLYFILL_WITH_ALLLOCATORS(my_polyfill, my_malloc, my_calloc, my_free); + +// Call the function created by the template +my_polyfill(geoPolygon, res, out); +``` + +Pro: +* Allows the user to have multiple allocator replacements in use at once. + +Con: +* Exposes a complicated build process to the user in the form of macros. + +### Allocator argument approach + +In this approach, every function call includes allocators. + +``` +H3MemoryManager allocFunctions = { + .malloc = &my_malloc, + .calloc = &my_calloc, + .free = &my_free +}; + +polyfill(geoPolygon, res, out, &allocFunctions); +``` + +Pro: +* Allowing replacement on a per-call basis allows for maximum control by the user. + +Con: +* The user must always specify allocators, which is unlikely to be needed by most users. +* Alternately, additional overloads of all H3 functions that heap-allocate are needed. + +### `#define` approach + +In this approach, the allocators are specified at build time. + +``` +# In build process: +cmake -DH3_ALLOC_PREFIX=my_ ... + +// in source file, functions are used as before. +``` + +Alternately, instead of setting a prefix, the build could accept individual options +for functions, such as `-DH3_MALLOC=my_malloc -DH3_CALLOC=my_calloc`. (Although this +could allow a user to accidentally override `malloc` but not `free`, which is generally +very bad.) + +Pro: +* Minimal overhead for users and developers when allocator replacement is not needed. + +Con: +* Complex allocator replacement (i.e. different allocators for different calls) is possible but requires implementation + by the user. + +## Proposal + +`#define` based allocator replacement seems like the clearest and lowest overhead to implement, while still supporting +the full range of use cases. A user could optionally implement a more complicated replacement inside their custom +allocator functions. diff --git a/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md b/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md new file mode 100644 index 000000000..b7be04a31 --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md @@ -0,0 +1,129 @@ +# RFC: Polyfill modes + +* **Authors**: Isaac Brodsky (@isaacbrodsky) +* **Date**: September 17, 2021 +* **Status**: Draft + +## Abstract + +Our current polyfill algorithm allocates cells to polygons based on whether the center of the cell falls within the polygon, using Cartesian geometry. This proposal outlines options for expanding the polyfill algorithm to allow for different containment modes (e.g. wholly contained cells, intersecting cells) and spherical geometry. + +## Motivation + +*Why is this important?* + +* Inclusion test + +A use case we want to support is testing whether a point could possibly be in a polygon by set containment. In Java this would look like: + +```java +final int R = ...; +// Indexed as res R +Set cellsCoveringPolygon = ...; + +public boolean polygonContainsPoint(double latitude, double longitude) { + String h3Index = h3.latLngToCell(latitude, longitude, R); + if (cellsCoveringPolygon.contains(h3Index)) { + // The polygon possibly contains the point, so use a more expensive point + // in polygon algorithm to determine. + return polygonContainsPointExpensive(latitude, longitude); + } + // The polygon definitely does not contain the point, the expensive check + // is not needed. + return false; +} +``` + +* Analytics + +There is no convenient function to index a polygon into the H3 grid for analytics purposes. Polygons that are small enough or shaped in specific ways will not be converted into cells, requiring workarounds in order to use them. + +* Spherical geometry consistency + +Most of the H3 library uses spherical geoemtry. For example, cell boundaries are spherical hexagons +and pentagons. The `polyfill` function is different that it assumes Cartesian geometry. For +consistency with the rest of the library, the `polyfill` functions should be able to use the same +cell boundaries. + +Maintaining a Cartesian option is useful for cases where polygons have been drawn on a projected map +and the boundaries should be the same. + +* Very large polygons + +Polyfills of very large polygons require allocating large blocks of memory, and spending large +amounts of time in a library function without progress information being available to the caller. +(To be determined if this is in scope for this RFC or for another.) + +## Approaches + +*What are the various options to address this issue?* + +On an API level, we will need to expose the containment mode and spherical/Cartesian choice as +options to the caller. + +Internally, we would like to reuse the same implementation as much as possible, but change the +exact inclusion check used for each mode. + +### Comparisons + +#### S2 + +Contains separate functions for [intersection and containment](http://s2geometry.io/devguide/basic_types#s2polygon) + +#### Turf library + +Contains separate functions for [intersection](http://turfjs.org/docs/#booleanIntersects), [containment](http://turfjs.org/docs/#booleanContains), etc. + +#### PostGIS + +Contains separate functions for [intersection](https://postgis.net/docs/ST_Intersects.html), [containment](https://postgis.net/docs/ST_Contains.html), etc. + +See also [Simple Feature Access - SQL](https://www.ogc.org/standards/sfs). + +#### JTS + +Separate predicatess. (Reference: [JTS Developer Guide](https://github.com/locationtech/jts/blob/master/doc/JTS%20Developer%20Guide.pdf)) + +#### GeoPandas + +Contains separate functions for [intersection](https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoSeries.intersection.html), [containment](https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoSeries.contains.html), etc. + +## Proposal + +*What is the recommended approach?* + +The signature for `polygonToCells` and `maxPolygonToCellsSize` would be changed as follows: + +``` +/** @brief maximum number of hexagons that could be in the geoloop */ +DECLSPEC H3Error H3_EXPORT(maxPolygonToCellsSize)(const GeoPolygon *geoPolygon, + int res, uint32_t flags, int64_t *out); + +/** @brief hexagons within the given geopolygon */ +DECLSPEC H3Error H3_EXPORT(polygonToCells)(const GeoPolygon *geoPolygon, + int res, uint32_t flags, H3Index *out); +``` + +`flags` would have the following possible bit layout: + +| Bits | Meaning +| ---------- | ------- +| 1-2 (LSB) | If 0, containment mode centroid.
If 1, containment mode cover.
If 2, containment mode intersects.
3 is a reserved value. +| 3 | If 0, spherical containment.
If 1, cartesian containment (same as H3 version 3). +| All others | Reserved and must be set to 0. + +The same value used for `maxPolygonToCellsSize` must be used for the subsequent call to `polygonToCells`, just as the `GeoPolygon` and `res` must be the same. + +In bindings, this could be expressed using enums, for example: + +```python +polygon_to_cells(polygon, res=res, cartesian=True, containment=h3.Containment.CENTROID) +``` + +```js +polygonToCells(polygon, {res, cartesian: true, containment: h3.Containment.CENTROID}) +``` + +```java +polygon(polygon).cartesian(true).containment(h3.Containment.CENTROID).toCells(res) +``` diff --git a/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md b/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md new file mode 100644 index 000000000..18bd93c4f --- /dev/null +++ b/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md @@ -0,0 +1,50 @@ +# RFC: Vertex mode + +* **Authors**: Nick Rabinowitz +* **Date**: - +* **Status**: Accepted + +## Abstract + +This proposal would add a new H3 index mode, Vertex Mode, to provide a canonical id for a vertex in a cell boundary. Each vertex shared by 3 adjacent cells would be represented by a single index. + +## Motivation + +The advantages of this approach: + +* Shared vertices can be compared between hexagons with a strict equality check +* Vertices can be represented and stored without the trig calls required to produce a lat/lng point +* Vertex to lat/lng can be guaranteed to return the same result across different cells that share the vertex + +At a minimum, this should open up significant performance and correctness gains in `h3SetToLinkedGeo` and `directedEdgeToBoundary`, and there are likely other uses as well. + +## Approaches + +The proposed approach below is fairly straightforward. The main questions are: + +* Whether to have one vertex mode, `H3_VERTEX_MODE`, representing the 5 or 6 topological vertices of each cell, or whether to additionally offer a second vertex mode, `H3_ICOSAEDGE_VERTEX_MODE`, to represent distortion vertices shared by two cells whose edge crosses an edge of the icosahedron. + +* If we have two different modes, which functions return both types, in order, and which functions return only one type. + +These two modes are largely orthogonal, and it would be possible to implement only `H3_VERTEX_MODE` first without considering `H3_ICOSAEDGE_VERTEX_MODE`. This simplifies the implementation and keeps the new mode wholly in the topological space, without considering the geometric issues posed by the distortion vertices. However this may make it harder or more expensive to implement transformations from sets of vertices to the geometry of a polygon or edge. + +## Proposal + +### Format of the index + +* The H3 index of the "owner" cell. The owner would be one of the cells that share the vertex (see below). +* The mode set to `H3_VERTEX_MODE` +* The reserved bits used to identify the index (0-6) of the vertex on the owner cell, using the index order used by `cellToBoundary` + +### Choice of owner + +Proposed simple algorithm for determining ownership: + +* Find all three neighbors that share a vertex +* Use the one with the numerically lowest index as the owner + +### New library functions + +* `void getCellVertexes(H3Index cell, H3Vertex *vertices)` +* `H3Vertex getCellVertex(H3Index cell, int vertIndex)` +* `LatLng vertexToLatLng(H3Vertex vertex)` diff --git a/dev-docs/build_windows.md b/dev-docs/build_windows.md index 8240239ad..8ed69e3ba 100644 --- a/dev-docs/build_windows.md +++ b/dev-docs/build_windows.md @@ -10,9 +10,23 @@ cd build cmake .. ``` -You can now open `h3.sln` and build the `ALL_BUILD` project to build the H3 library, filter applications, and tests. Tests can be run by building the `RUN_TESTS` project. From the command line: +You can now open `h3.sln` and build the `ALL_BUILD` project to build the H3 library, filter applications, and tests. From the command line: ``` msbuild ALL_BUILD.vcxproj +``` + +Tests can be run by building the `RUN_TESTS` project. Tests require `bash` be available, which is usually supplied by Git for Windows. From the command line: + +``` msbuild RUN_TESTS.vcxproj ``` + +## Building shared libraries + +You can build H3 as a shared library (DLL), but the test suite does not support this configuration because the tests use functions internal to the DLL, and they are not exposed for testing. + +``` +cmake .. -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON +msbuild ALL_BUILD.vcxproj +``` diff --git a/docs/api/hierarchy.md b/docs/api/hierarchy.md deleted file mode 100644 index 45cca8f1c..000000000 --- a/docs/api/hierarchy.md +++ /dev/null @@ -1,53 +0,0 @@ -# Hierarchical grid functions - -## h3ToParent - -``` -H3Index h3ToParent(H3Index h, int parentRes); -``` - -Returns the parent (coarser) index containing `h`. - -## h3ToChildren - -``` -void h3ToChildren(H3Index h, int childRes, H3Index *children); -``` - -Populates `children` with the indexes contained by `h` at resolution `childRes`. `children` must be an array of at least size `maxH3ToChildrenSize(h, childRes)`. - -### maxH3ToChildrenSize - -``` -int maxH3ToChildrenSize(H3Index h, int childRes); -``` - -Returns the size of the array needed by `h3ToChildren` for these inputs. - -## compact - -``` -int compact(const H3Index *h3Set, H3Index *compactedSet, const int numHexes); -``` - -Compacts the set `h3Set` of indexes as best as possible, into the array `compactedSet`. `compactedSet` must be at least the size of `h3Set` in case the set cannot be compacted. - -Returns 0 on success. - -## uncompact - -``` -int uncompact(const H3Index *compactedSet, const int numHexes, H3Index *h3Set, const int maxHexes, const int res); -``` - -Uncompacts the set `compactedSet` of indexes to the resolution `res`. `h3Set` must be at least of size `maxUncompactSize(compactedSet, numHexes, res)`. - -Returns 0 on success. - -### maxUncompactSize - -``` -int maxUncompactSize(const H3Index *compactedSet, const int numHexes, const int res) -``` - -Returns the size of the array needed by `uncompact`. diff --git a/docs/api/indexing.md b/docs/api/indexing.md deleted file mode 100644 index 5d60164e0..000000000 --- a/docs/api/indexing.md +++ /dev/null @@ -1,27 +0,0 @@ -# Indexing functions - -## geoToH3 - -``` -H3Index geoToH3(const GeoCoord *g, int res); -``` - -Indexes the location at the specified resolution. - -Returns 0 on error. - -## h3ToGeo - -``` -void h3ToGeo(H3Index h3, GeoCoord *g); -``` - -Finds the centroid of the index. - -## h3ToGeoBoundary - -``` -void h3ToGeoBoundary(H3Index h3, GeoBoundary *gp); -``` - -Finds the boundary of the index. diff --git a/docs/api/inspection.md b/docs/api/inspection.md deleted file mode 100644 index 5a04cd017..000000000 --- a/docs/api/inspection.md +++ /dev/null @@ -1,59 +0,0 @@ -# Index inspection functions - -## h3GetResolution - -``` -int h3GetResolution(H3Index h); -``` - -Returns the resolution of the index. - -## h3GetBaseCell - -``` -int h3GetBaseCell(H3Index h); -``` - -Returns the base cell number of the index. - -## stringToH3 - -``` -H3Index stringToH3(const char *str); -``` - -Converts the string representation to `H3Index` (`uint64_t`) representation. - -Returns 0 on error. - -## h3ToString - -``` -void h3ToString(H3Index h, char *str, size_t sz); -``` - -Converts the `H3Index` representation of the index to the string representation. `str` must be at least of length 17. - -## h3IsValid - -``` -int h3IsValid(H3Index h); -``` - -Returns non-zero if this is a valid **H3** index. - -## h3IsResClassIII - -``` -int h3IsResClassIII(H3Index h); -``` - -Returns non-zero if this index has a resolution with Class III orientation. - -## h3IsPentagon - -``` -int h3IsPentagon(H3Index h); -``` - -Returns non-zero if this index represents a pentagonal cell. diff --git a/docs/api/misc.md b/docs/api/misc.md deleted file mode 100644 index d53276de6..000000000 --- a/docs/api/misc.md +++ /dev/null @@ -1,57 +0,0 @@ -# Miscellaneous H3 functions - -## degsToRads - -``` -double degsToRads(double degrees); -``` - -Converts degrees to radians. - -## radsToDegs - -``` -double radsToDegs(double radians); -``` - -Converts radians to degrees. - -## hexAreaKm2 - -``` -double hexAreaKm2(int res); -``` - -Average hexagon area in square kilometers at the given resolution. - -## hexAreaM2 - -``` -double hexAreaM2(int res); -``` - -Average hexagon area in square meters at the given resolution. - -## edgeLengthKm - -``` -double edgeLengthKm(int res); -``` - -Average hexagon edge length in kilometers at the given resolution. - -## edgeLengthM - -``` -double edgeLengthM(int res); -``` - -Average hexagon edge length in meters at the given resolution. - -## numHexagons - -``` -int64_t numHexagons(int res); -``` - -Number of unique **H3** indexes at the given resolution. diff --git a/docs/api/regions.md b/docs/api/regions.md deleted file mode 100644 index d0df25cdf..000000000 --- a/docs/api/regions.md +++ /dev/null @@ -1,52 +0,0 @@ -# Region functions - -## polyfill - -``` -void polyfill(const GeoPolygon* geoPolygon, int res, H3Index* out); -``` - -polyfill takes a given GeoJSON-like data structure and preallocated, -zeroed memory, and fills it with the hexagons that are contained by -the GeoJSON-like data structure. - -The current implementation is very primitive and slow, but correct, -performing a point-in-poly operation on every hexagon in a k-ring defined -around the given geofence. - -### maxPolyfillSize - -``` -int maxPolyfillSize(const GeoPolygon* geoPolygon, int res); -``` - -maxPolyfillSize returns the number of hexagons to allocate space for when -performing a polyfill on the given GeoJSON-like data structure. - -## h3SetToLinkedGeo - -``` -void h3SetToLinkedGeo(const H3Index* h3Set, const int numHexes, LinkedGeoPolygon* out); -``` - -Create a LinkedGeoPolygon describing the outline(s) of a set of hexagons. -Polygon outlines will follow GeoJSON MultiPolygon order: Each polygon will -have one outer loop, which is first in the list, followed by any holes. - -It is the responsibility of the caller to call destroyLinkedPolygon on the -populated linked geo structure, or the memory for that structure will -not be freed. - -It is expected that all hexagons in the set have the same resolution and -that the set contains no duplicates. Behavior is undefined if duplicates -or multiple resolutions are present, and the algorithm may produce -unexpected or invalid output. - -### destroyLinkedPolygon - -``` -void destroyLinkedPolygon(LinkedGeoPolygon* polygon); -``` - -Free all allocated memory for a linked geo structure. The caller is -responsible for freeing memory allocated to the input polygon struct. diff --git a/docs/api/traversal.md b/docs/api/traversal.md deleted file mode 100644 index 429d44c24..000000000 --- a/docs/api/traversal.md +++ /dev/null @@ -1,163 +0,0 @@ -# Grid traversal functions - -## kRing - -``` -void kRing(H3Index origin, int k, H3Index* out); -``` - -k-rings produces indices within k distance of the origin index. - -k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and -all neighboring indices, and so on. - -Output is placed in the provided array in no particular order. Elements of -the output array may be left zero, as can happen when crossing a pentagon. - -### maxKringSize - -``` -int maxKringSize(int k); -``` - -Maximum number of indices that result from the kRing algorithm with the given k. - -## kRingDistances - -``` -void kRingDistances(H3Index origin, int k, H3Index* out, int* distances); -``` - -k-rings produces indices within k distance of the origin index. - -k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and -all neighboring indices, and so on. - -Output is placed in the provided array in no particular order. Elements of -the output array may be left zero, as can happen when crossing a pentagon. - -## hexRange - -``` -int hexRange(H3Index origin, int k, H3Index* out); -``` - -hexRange produces indexes within k distance of the origin index. -Output behavior is undefined when one of the indexes returned by this -function is a pentagon or is in the pentagon distortion area. - -k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and -all neighboring indexes, and so on. - -Output is placed in the provided array in order of increasing distance from -the origin. - -Returns 0 if no pentagonal distortion is encountered. - -## hexRangeDistances - -``` -int hexRangeDistances(H3Index origin, int k, H3Index* out, int* distances); -``` - -hexRange produces indexes within k distance of the origin index. -Output behavior is undefined when one of the indexes returned by this -function is a pentagon or is in the pentagon distortion area. - -k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and -all neighboring indexes, and so on. - -Output is placed in the provided array in order of increasing distance from -the origin. The distances in hexagons is placed in the distances array at -the same offset. - -Returns 0 if no pentagonal distortion is encountered. - -## hexRanges - -``` -int hexRanges(H3Index* h3Set, int length, int k, H3Index* out); -``` - -hexRanges takes an array of input hex IDs and a max k-ring and returns an -array of hexagon IDs sorted first by the original hex IDs and then by the -k-ring (0 to max), with no guaranteed sorting within each k-ring group. - -Returns 0 if no pentagonal distortion was encountered. Otherwise, output -is undefined - -## hexRing - -``` -int hexRing(H3Index origin, int k, H3Index* out); -``` - -Produces the hollow hexagonal ring centered at origin with sides of length k. - -Returns 0 if no pentagonal distortion was encountered. - -## h3Line - -``` -int h3Line(H3Index start, H3Index end, H3Index* out); -``` - -Given two H3 indexes, return the line of indexes between them (inclusive). - -This function may fail to find the line between two indexes, for -example if they are very far apart. It may also fail when finding -distances for indexes on opposite sides of a pentagon. - -*Notes:* - - * The specific output of this function should not be considered stable - across library versions. The only guarantees the library provides are - that the line length will be `h3Distance(start, end) + 1` and that - every index in the line will be a neighbor of the preceding index. - - * Lines are drawn in grid space, and may not correspond exactly to either - Cartesian lines or great arcs. - -## h3LineSize - -``` -int h3LineSize(H3Index start, H3Index end); -``` - -Number of indexes in a line from the start index to the end index, -to be used for allocating memory. Returns a negative number if the -line cannot be computed. - -## h3Distance - -``` -int h3Distance(H3Index origin, H3Index h3); -``` - -Returns the distance in grid cells between the two indexes. - -Returns a negative number if finding the distance failed. Finding the distance can fail because the two -indexes are not comparable (different resolutions), too far apart, or are separated by pentagonal -distortion. This is the same set of limitations as the local IJ coordinate space functions. - -## experimentalH3ToLocalIj - -``` -int experimentalH3ToLocalIj(H3Index origin, H3Index h3, CoordIJ *out); -``` - -Produces local IJ coordinates for an **H3** index anchored by an origin. - -This function is experimental, and its output is not guaranteed -to be compatible across different versions of **H3**. - -## experimentalLocalIjToH3 - -``` -int experimentalLocalIjToH3(H3Index origin, const CoordIJ *ij, H3Index *out); -``` - -Produces an **H3** index from local IJ coordinates anchored by an origin. - -This function is experimental, and its output is not guaranteed -to be compatible across different versions of **H3**. diff --git a/docs/api/uniedge.md b/docs/api/uniedge.md deleted file mode 100644 index 72a3ff6c5..000000000 --- a/docs/api/uniedge.md +++ /dev/null @@ -1,74 +0,0 @@ -# Unidirectional edge functions - -## h3IndexesAreNeighbors - -``` -int h3IndexesAreNeighbors(H3Index origin, H3Index destination); -``` - -Returns whether or not the provided H3Indexes are neighbors. - -Returns 1 if the indexes are neighbors, 0 otherwise. - -## getH3UnidirectionalEdge - -``` -H3Index getH3UnidirectionalEdge(H3Index origin, H3Index destination); -``` - -Returns a unidirectional edge **H3** index based on the provided origin and -destination. - -Returns 0 on error. - -## h3UnidirectionalEdgeIsValid - -``` -int h3UnidirectionalEdgeIsValid(H3Index edge); -``` - -Determines if the provided H3Index is a valid unidirectional edge index. - -Returns 1 if it is a unidirectional edge H3Index, otherwise 0. - -## getOriginH3IndexFromUnidirectionalEdge - -``` -H3Index getOriginH3IndexFromUnidirectionalEdge(H3Index edge); -``` - -Returns the origin hexagon from the unidirectional edge H3Index. - -## getDestinationH3IndexFromUnidirectionalEdge - -``` -H3Index getDestinationH3IndexFromUnidirectionalEdge(H3Index edge); -``` - -Returns the destination hexagon from the unidirectional edge H3Index. - -## getH3IndexesFromUnidirectionalEdge - -``` -void getH3IndexesFromUnidirectionalEdge(H3Index edge, H3Index* originDestination); -``` - -Returns the origin, destination pair of hexagon IDs for the given edge ID, which are placed at `originDestination[0]` and -`originDestination[1]` respectively. - -## getH3UnidirectionalEdgesFromHexagon - -``` -void getH3UnidirectionalEdgesFromHexagon(H3Index origin, H3Index* edges); -``` - -Provides all of the unidirectional edges from the current H3Index. `edges` must be of length 6, -and the number of undirectional edges placed in the array may be less than 6. - -## getH3UnidirectionalEdgeBoundary - -``` -void getH3UnidirectionalEdgeBoundary(H3Index edge, GeoBoundary* gb); -``` - -Provides the coordinates defining the unidirectional edge. diff --git a/docs/community/applications.md b/docs/community/applications.md deleted file mode 100644 index 0ff140428..000000000 --- a/docs/community/applications.md +++ /dev/null @@ -1,7 +0,0 @@ -# Applications Using H3 - -The following applications use H3. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/applications.md). - -## Visualization - -- [kepler.gl](http://kepler.gl/) - An open source geospatial analysis tool diff --git a/docs/community/bindings.md b/docs/community/bindings.md deleted file mode 100644 index d1622d246..000000000 --- a/docs/community/bindings.md +++ /dev/null @@ -1,48 +0,0 @@ -# Bindings - -As a C library, bindings can be made to call H3 functions from different programming languages. This page lists different bindings currently available. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/bindings.md). - -## C# - -- [entrepreneur-interet-general/h3.standard](https://github.com/entrepreneur-interet-general/H3.Standard) - -## Erlang - -- [helium/erlang-h3](https://github.com/helium/erlang-h3) - -## Go - -- [uber/h3-go](https://github.com/uber/h3-go) - -## Java - -- [uber/h3-java](https://github.com/uber/h3-java) - -## JavaScript - -- [uber/h3-js](https://github.com/uber/h3-js) -- [dfellis/h3-node](https://github.com/dfellis/h3-node) - -## OCaml - -- [travisbrady/ocaml-h3](https://github.com/travisbrady/ocaml-h3) - -## PHP - -- [neatlife/php-h3](https://github.com/neatlife/php-h3) - -## PostgreSQL - -- [dlr-eoc/pgh3](https://github.com/dlr-eoc/pgh3) - -## Python - -- [uber/h3-py](https://github.com/uber/h3-py) - -## R - -- [scottmmjackson/h3r](https://github.com/scottmmjackson/h3r) - -## Ruby - -- [StuartApp/h3_ruby](https://github.com/StuartApp/h3_ruby) diff --git a/docs/community/libraries.md b/docs/community/libraries.md deleted file mode 100644 index bffd336e5..000000000 --- a/docs/community/libraries.md +++ /dev/null @@ -1,7 +0,0 @@ -# Libraries Using H3 - -The following libraries use H3 via one of its bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/libraries.md). - -## JavaScript - -- [uber/geojson2H3](https://github.com/uber/geojson2H3) - Conversion utilities between H3 indexes and GeoJSON diff --git a/docs/community/tutorials.md b/docs/community/tutorials.md deleted file mode 100644 index 5118ba29d..000000000 --- a/docs/community/tutorials.md +++ /dev/null @@ -1,12 +0,0 @@ -# Tutorials - -This page lists further learning materials and code walkthroughs for the H3 library and bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/docs/community/tutorials.md). - -## JavaScript - -- [H3 Tutorials on Observable](https://beta.observablehq.com/collection/@nrabinowitz/h3-tutorial) - -## Python - -- [Usage (IPython Notebook)](https://github.com/uber/h3-py/blob/master/docs/Usage.ipynb) -- [Unified Data Layers (IPython Notebook)](https://github.com/uber/h3-py/blob/master/docs/UnifiedDataLayers.ipynb) diff --git a/docs/core-library/h3ToGeoDesc.md b/docs/core-library/h3ToGeoDesc.md deleted file mode 100644 index db3b4177e..000000000 --- a/docs/core-library/h3ToGeoDesc.md +++ /dev/null @@ -1,18 +0,0 @@ -Determine the latitude/longitude coordinates of the center point of an H3Index cell ---- - -This operation is performed by function `h3ToGeo`. See the comments in the function source code for more detail. - -The conversion is performed as a series of coordinate system conversions described below. See the page Coordinate Systems used by the **H3 Core Library** for more information on each of these coordinate systems. - -* The function `_h3ToFaceIjk` then converts the **H3** index to the appropriate icosahedron face number and normalized *ijk* coordinate's on that face's coordinate system as follows: - * We start by assuming that the cell center point falls on the same icosahedron face as its base cell. - * It is possible that the the cell center point lies on an adjacent face (termed an *overage* in the code), in which case we would need to use a projection centered on that adjacent face instead. We recall that normalized *ijk* coordinates have at most two non-zero components, and that in a face-centered Class II system the sum of those components is a resolution-specific constant value for cells that lie on the edge of that icosahedral face. - We determine whether an overage exists by taking the sum of the *ijk* components, and if there is an overage the positive *ijk* components indicate which adjacent face the cell center lies on. A lookup operation is then performed to find the appropriate rotation and translation to transform the *ijk* coordinates into the adjacent face-centered *ijk* system. - -
- -
- -* The face-centered *ijk* coordinates are then converted into corresponding *Hex2d* coordinates using the function `_ijkToHex2d`. -* The function `_hex2dToGeo` takes the *Hex2d* coordinates and scales them into face-centered gnomonic coordinates, and then performs an inverse gnomonic projection to get the latitude/longitude coordinates. diff --git a/docs/core-library/h3indexing.md b/docs/core-library/h3indexing.md deleted file mode 100644 index e1a423211..000000000 --- a/docs/core-library/h3indexing.md +++ /dev/null @@ -1,101 +0,0 @@ -H3 Index Representations ---- - -Introduction ---- - -The **H3** system assigns a unique hierarchical index to each cell. The **H3** index of a resolution *r* cell begins with the appropriate resolution 0 base cell number. This is followed by a sequence of *r* digits 0-6, where each *i*th digit *d*i specifies one of the 7 cells centered on the cell indicated by the coarser resolution digits *d*1 through *d*i-1. A local hexagon coordinate system is assigned to each of the resolution 0 base cells and is used to orient all hierarchical indexing child cells of that base cell. The assignment of digits 0-6 at each resolution uses a *Central Place Indexing* arrangement (see [Sahr, 2014](http://webpages.sou.edu/~sahrk/sqspc/pubs/autocarto14.pdf)). In the case of the 12 pentagonal cells the indexing hierarchy produced by sub-digit 1 is removed at all resolutions. - -Child hexagons are linearly smaller than their parent hexagons. - -
- -
- - -H3Index Representation ---- - -The **H3Index** is the integer representation of an **H3** index, which can be placed into multiple modes to indicate the kind of concept being indexed. Mode 1 is an **H3** Cell (Hexagon) Index, mode 2 is an **H3** Unidirectional Edge (Hexagon A -> Hexagon B) Index, mode 3 is planned to be a bidirectional edge (Hexagon A <-> Hexagon B). Mode 0 is reserved and indicates an invalid **H3** index. - -The components of the **H3** cell index (mode 1) are packed into the lowest order 63 bits of a 64-bit integer in order as follows: - -* 4 bits to indicate the index mode, -* 3 bits reserved, -* 4 bits to indicate the cell resolution 0-15, -* 7 bits to indicate the base cell 0-121, and -* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) - -The components of the **H3** unidirectional edge index (mode 2) are packed into the lowest order 63 bits of a 64-bit integer in order as follows: - -* 4 bits to indicate the index mode, -* 3 bits to indicate the edge 1-6 of the cell to traverse, -* 4 bits to indicate the cell resolution 0-15, -* 7 bits to indicate the base cell 0-121, and -* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total is reserved for resolutions 1-15) - -The canonical string representation of an **H3Index** is the hexadecimal representation of the integer. - -The three bits for each unused digit are set to 7. - -Bit layout of H3Index ---- - -The layout of an **H3Index** is shown below in table form. The interpretation of the "Reserved/edge" field differs depending on the mode of the index. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x30ModeReserved/edgeResolutionBase cell
0x20Base cellDigit 1Digit 2Digit 3Digit 4Digit 5
0x10Digit 5Digit 6Digit 7Digit 8Digit 9Digit 10
0x00Digit 10Digit 11Digit 12Digit 13Digit 14Digit 15
diff --git a/docs/core-library/overview.md b/docs/core-library/overview.md deleted file mode 100644 index cd3b7397b..000000000 --- a/docs/core-library/overview.md +++ /dev/null @@ -1,14 +0,0 @@ -Overview of the H3 Geospatial Indexing System ---- - -The **H3** geospatial indexing system is a discrete global grid system (see [Sahr et al., 2003](http://webpages.sou.edu/~sahrk/sqspc/pubs/gdggs03.pdf)) consisting of a multi-precision hexagonal tiling of the sphere with hierarchical indexes. The hexagonal grid system is created on the planar faces of a sphere-circumscribed icosahedron, and the grid cells are then projected to the surface of the sphere using an inverse face-centered polyhedral gnomonic projection. - -The icosahedron is fixed relative to the sphere using a *Dymaxion* orientation (due to R. Buckminster Fuller). This is the only known orientation of a spherical icosahedron that places all 12 icosahedron vertices in the ocean. - -The **H3** grid is constructed on the icosahedron by recursively creating increasingly higher precision hexagon grids until the desired resolution is achieved. Note that it is impossible to tile the sphere/icosahedron completely with hexagons; each resolution of an icosahedral hexagon grid must contain exactly 12 pentagons at every resolution, with one pentagon centered on each of the icosahedron vertices. - -The first **H3** resolution (resolution 0) consists of 122 cells (110 hexagons and 12 icosahedron vertex-centered pentagons), referred to as the *base cells*. These were chosen to capture as much of the symmetry of the spherical icosahedron as possible. These base cells are assigned numbers from 0 to 121 based on the latitude of their center points; base cell 0 has the northern most center point, while base cell 121 has the southern most center point. - -Each subsequent resolution beyond resolution 0 is created using an aperture 7 resolution spacing (aperture refers to the number of cells in the next finer resolution grid for each cell); as resolution increases the unit length is scaled by \\(\sqrt{7}\\) and each hexagon has \\(1/7th\\) the area of a hexagon at the next coarser resolution (as measured on the icosahedron). **H3** provides 15 finer grid resolutions in addition to the resolution 0 base cells. The finest resolution, resolution 15, has cells with an area of less than 1 \\(m^2\\). A table detailing the average cell area for each H3 resolution is available here. - -*Note:* you can create KML files to visualize the **H3** grids by running the `kml` make target. It will place the files in the `KML` output sub-directory. diff --git a/docs/core-library/usage.md b/docs/core-library/usage.md deleted file mode 100644 index 97cafc248..000000000 --- a/docs/core-library/usage.md +++ /dev/null @@ -1,8 +0,0 @@ -How to use H3 ---- - -The public API of the **H3 Core Library** is defined in the file h3api.h. The functions defined in h3api.h adhere to [Semantic Versioning](http://semver.org/). - -The **H3** API expects valid input. Behavior of the library may be undefined when given invalid input. Indexes should be validated with `h3IsValid` or `h3UnidirectionalEdgeIsValid` as appropriate. - -You can find an example of using the **H3** library in `examples/index.c`. diff --git a/docs/overview/mainpage.md b/docs/overview/mainpage.md deleted file mode 100644 index 6b67465fa..000000000 --- a/docs/overview/mainpage.md +++ /dev/null @@ -1,11 +0,0 @@ -H3 Core ---- - -The **H3** geospatial indexing system is a multi-precision hexagonal tiling of the sphere indexed with hierarchical linear indexes. The **H3 Core Library** provides functions for converting between latitude/longitude coordinates and **H3** geospatial indexes. Specifically, the major library entry point functions (defined in `h3api.h`) provide the functionality: - -* given a latitude/longitude point, find the index of the containing **H3** cell at a particular resolution -* given an **H3** index, find the latitude/longitude cell center -* given an **H3** index, determine the cell boundary in latitude/longitude coordinates -* and more. - -The **H3 Core Library** is written entirely in *C*. Bindings for other languages are available. diff --git a/docs/overview/usecases.md b/docs/overview/usecases.md deleted file mode 100644 index 5172d25ba..000000000 --- a/docs/overview/usecases.md +++ /dev/null @@ -1,55 +0,0 @@ -Why H3 ---- - -Use cases ---- - -Analysis of data sets of locations, such as locations of cars in a city, may be done by bucketing locations. ([Sahr et al., 2003](http://webpages.sou.edu/~sahrk/sqspc/pubs/gdggs03.pdf)) There are several options for partitioning an area into buckets, such as manually drawing regions using human knowledge, or to partition the surface using a regular grid. - -Manually drawn partitions can better incorporate human knowledge, but have a number of drawbacks, such as: -* The center of a partition may not represent the center of the data points. -* Edges of partitions may exhibit undesirable boundary effects. -* Manually defined partitions may require updating if our understanding of the system changes. -* Manually defining a large number of partitions may be very costly and time consuming. - -Using a regular grid can avoid these drawbacks by providing smooth gradients and the ability to measure differences between cells. One defining characteristic of a grid system is the cell shape. There are only three polygons that tile regularly: the triangle, the square, and the hexagon. Of these, triangles and squares have neighbors with different distances. Triangles have three different distances, and squares have two different distances. For hexagons, all neighbors are equidistant. This property allows for simpler analysis of movement. - -| Triangle | Square | Hexagon -| -------- | ------ | ------- -| | | -| Triangles have 12 neighbors | Squares have 8 neighbors | Hexagons have 6 neighbors - -In addition to indexing locations to cells, **H3** provides a number of algorithms operating on indexes. - -Hexagons have the property of expanding rings of neighbors (`kRing`) approximating circles: - -
-
- All six neighbors of a hexagon (ring 1) -
- -Squares cleanly subdivide into four finer squares. Hexagons do not cleanly subdivide into seven finer hexagons. However, by alternating the orientation of grids a subdivision into seven cells (referred to as *aperture 7*) can be approximated. This makes it possible to truncate the precision (within a fixed margin of error) of an **H3** index using a few bitwise operations (`h3ToParent`). It is also possible to determine all the children of a parent **H3** index (`h3ToChildren`). Approximate containment only applies when truncating the precision of an **H3** index. The borders of hexagons indexed at a specific resolution are not approximate. - -
-
- A parent hexagon approximately contains seven children -
- -Hierarchical containment allows for use cases like making contiguous sets of hexagons `compact`. It is then possible to `uncompact` to the same input set of hexagons. - -| Uncompact (dense) | Compact (sparse) -| ----------------- | ---------------- -| | -| California represented by 10633 uncompact hexagons | California represented by 901 compact hexagons - -Comparisons ---- - -| System | Index representation | Cell shape | Projection system -| --------- | -------------------- | ---------- | ----------------- -| H3 | 64 bit integer | hexagon | Icosahedron face centered gnomonic -| [S2] | 64 bit integer | rectangle | Cube face centered quadratic transform -| [Geohash] | alphanumeric string | rectangle | None, encodes latitude and longitude - -[S2]: https://docs.google.com/presentation/d/1Hl4KapfAENAOf4gv-pSngKwvS_jwNVHRPZTTDzXXn6Q/edit -[Geohash]: https://en.wikipedia.org/wiki/Geohash diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 52937a86d..2998da443 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -25,15 +25,15 @@ set(EXAMPLES index distance neighbors - compact + compactCells edge) set(EXECUTABLE_OUTPUT_PATH bin) -link_libraries(h3::h3) # Build each example foreach(name ${EXAMPLES}) add_executable(${name} "${name}.c") + target_link_libraries(${name} PRIVATE h3::h3) endforeach() # Testing the examples diff --git a/examples/compact.c b/examples/compactCells.c similarity index 76% rename from examples/compact.c rename to examples/compactCells.c index 366a6afa9..4dbe59cfc 100644 --- a/examples/compact.c +++ b/examples/compactCells.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ #include #include -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { H3Index input[] = { // All with the same parent index 0x8a2a1072b587fffL, 0x8a2a1072b5b7fffL, 0x8a2a1072b597fffL, @@ -34,10 +34,10 @@ int main(int argc, char* argv[]) { int inputSize = sizeof(input) / sizeof(H3Index); printf("Starting with %d indexes.\n", inputSize); - H3Index* compacted = calloc(inputSize, sizeof(H3Index)); - int err = compact(input, compacted, inputSize); + H3Index *compacted = calloc(inputSize, sizeof(H3Index)); + H3Error err = compactCells(input, compacted, inputSize); // An error case can occur on e.g. duplicate input. - assert(err == 0); + assert(err == E_SUCCESS); int compactedCount = 0; printf("Compacted:\n"); @@ -50,13 +50,16 @@ int main(int argc, char* argv[]) { printf("Compacted to %d indexes.\n", compactedCount); int uncompactRes = 10; - int uncompactedSize = maxUncompactSize(compacted, inputSize, uncompactRes); - H3Index* uncompacted = calloc(uncompactedSize, sizeof(H3Index)); - int err2 = uncompact(compacted, compactedCount, uncompacted, - uncompactedSize, uncompactRes); + int64_t uncompactedSize; + H3Error err2 = uncompactCellsSize(compacted, inputSize, uncompactRes, + &uncompactedSize); + assert(err2 == E_SUCCESS); + H3Index *uncompacted = calloc(uncompactedSize, sizeof(H3Index)); + int err3 = uncompactCells(compacted, compactedCount, uncompacted, + uncompactedSize, uncompactRes); // An error case could happen if the output array is too small, or indexes // have a higher resolution than uncompactRes. - assert(err2 == 0); + assert(err3 == E_SUCCESS); int uncompactedCount = 0; printf("Uncompacted:\n"); diff --git a/examples/distance.c b/examples/distance.c index 9b3d656b5..be6567d22 100644 --- a/examples/distance.c +++ b/examples/distance.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,9 @@ // mean Earth radius #define R 6371.0088 +#include #include

+#include #include #include @@ -48,25 +50,32 @@ double haversineDistance(double th1, double ph1, double th2, double ph2) { int main(int argc, char *argv[]) { // 1455 Market St @ resolution 15 - H3Index h3HQ1 = stringToH3("8f2830828052d25"); + H3Index h3HQ1 = 0; + stringToH3("8f2830828052d25", &h3HQ1); // 555 Market St @ resolution 15 - H3Index h3HQ2 = stringToH3("8f283082a30e623"); + H3Index h3HQ2 = 0; + stringToH3("8f283082a30e623", &h3HQ2); - GeoCoord geoHQ1, geoHQ2; - h3ToGeo(h3HQ1, &geoHQ1); - h3ToGeo(h3HQ2, &geoHQ2); + LatLng geoHQ1 = {0}; + LatLng geoHQ2 = {0}; + cellToLatLng(h3HQ1, &geoHQ1); + cellToLatLng(h3HQ2, &geoHQ2); + + int64_t distance = 0; + assert(gridDistance(h3HQ1, h3HQ2, &distance) == E_SUCCESS); printf( "origin: (%lf, %lf)\n" "destination: (%lf, %lf)\n" - "grid distance: %d\n" + "grid distance: %" PRId64 + "\n" "distance in km: %lfkm\n", - radsToDegs(geoHQ1.lat), radsToDegs(geoHQ1.lon), radsToDegs(geoHQ2.lat), - radsToDegs(geoHQ2.lon), h3Distance(h3HQ1, h3HQ2), - haversineDistance(geoHQ1.lat, geoHQ1.lon, geoHQ2.lat, geoHQ2.lon)); + radsToDegs(geoHQ1.lat), radsToDegs(geoHQ1.lng), radsToDegs(geoHQ2.lat), + radsToDegs(geoHQ2.lng), distance, + haversineDistance(geoHQ1.lat, geoHQ1.lng, geoHQ2.lat, geoHQ2.lng)); // Output: // origin: (37.775236, -122.419755) // destination: (37.789991, -122.402121) // grid distance: 2340 // distance in km: 2.256853km -} +} \ No newline at end of file diff --git a/examples/edge.c b/examples/edge.c index c5923aaaf..4d1489686 100644 --- a/examples/edge.c +++ b/examples/edge.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,15 +26,16 @@ int main(int argc, char *argv[]) { H3Index origin = 0x8a2a1072b59ffffL; H3Index destination = 0x8a2a1072b597fffL; // north of the origin - H3Index edge = getH3UnidirectionalEdge(origin, destination); + H3Index edge; + cellsToDirectedEdge(origin, destination, &edge); printf("The edge is %" PRIx64 "\n", edge); - GeoBoundary boundary; - getH3UnidirectionalEdgeBoundary(edge, &boundary); + CellBoundary boundary; + directedEdgeToBoundary(edge, &boundary); for (int v = 0; v < boundary.numVerts; v++) { printf("Edge vertex #%d: %lf, %lf\n", v, radsToDegs(boundary.verts[v].lat), - radsToDegs(boundary.verts[v].lon)); + radsToDegs(boundary.verts[v].lng)); } // Output: // The edge is 16a2a1072b59ffff diff --git a/examples/index.c b/examples/index.c index aa9b9c3e1..178bd4aa3 100644 --- a/examples/index.c +++ b/examples/index.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 Uber Technologies, Inc. + * Copyright 2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,27 +24,37 @@ int main(int argc, char *argv[]) { // Get the H3 index of some location and print it. - GeoCoord location; + LatLng location; location.lat = degsToRads(40.689167); - location.lon = degsToRads(-74.044444); + location.lng = degsToRads(-74.044444); int resolution = 10; - H3Index indexed = geoToH3(&location, resolution); + H3Index indexed; + if (latLngToCell(&location, resolution, &indexed) != E_SUCCESS) { + printf("Failed\n"); + return 1; + } printf("The index is: %" PRIx64 "\n", indexed); // Get the vertices of the H3 index. - GeoBoundary boundary; - h3ToGeoBoundary(indexed, &boundary); + CellBoundary boundary; + if (cellToBoundary(indexed, &boundary) != E_SUCCESS) { + printf("Failed\n"); + return 1; + } // Indexes can have different number of vertices under some cases, // which is why boundary.numVerts is needed. for (int v = 0; v < boundary.numVerts; v++) { printf("Boundary vertex #%d: %lf, %lf\n", v, radsToDegs(boundary.verts[v].lat), - radsToDegs(boundary.verts[v].lon)); + radsToDegs(boundary.verts[v].lng)); } // Get the center coordinates. - GeoCoord center; - h3ToGeo(indexed, ¢er); + LatLng center; + if (cellToLatLng(indexed, ¢er) != E_SUCCESS) { + printf("Failed\n"); + return 1; + } printf("Center coordinates: %lf, %lf\n", radsToDegs(center.lat), - radsToDegs(center.lon)); + radsToDegs(center.lng)); } diff --git a/examples/neighbors.c b/examples/neighbors.c index 13b118fd6..ce6f7c7ae 100644 --- a/examples/neighbors.c +++ b/examples/neighbors.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,14 +22,15 @@ #include #include -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { H3Index indexed = 0x8a2a1072b59ffffL; // Distance away from the origin to find: int k = 2; - int maxNeighboring = maxKringSize(k); - H3Index* neighboring = calloc(maxNeighboring, sizeof(H3Index)); - kRing(indexed, k, neighboring); + int64_t maxNeighboring; + maxGridDiskSize(k, &maxNeighboring); + H3Index *neighboring = calloc(maxNeighboring, sizeof(H3Index)); + gridDisk(indexed, k, neighboring); printf("Neighbors:\n"); for (int i = 0; i < maxNeighboring; i++) { diff --git a/scripts/binding_functions.ps1 b/scripts/binding_functions.ps1 index d81eccba5..eda83c934 100644 --- a/scripts/binding_functions.ps1 +++ b/scripts/binding_functions.ps1 @@ -16,5 +16,4 @@ # by bindings of the H3 library. It is invoked by the `binding-functions` # make target and produces a file `binding-functions`. -$scriptDir = Split-Path -parent $PSCommandPath -Get-Content "$scriptDir/../src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} > binding-functions +Get-Content "src/h3lib/include/h3api.h" | Where-Object {$_ -match "@defgroup ([A-Za-z0-9_]*)"} | Foreach {$Matches[1]} | Out-File -FilePath binding-functions -Encoding ASCII diff --git a/scripts/binding_functions.sh b/scripts/binding_functions.sh index 491b601e1..3b958fdd7 100755 --- a/scripts/binding_functions.sh +++ b/scripts/binding_functions.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,5 +17,6 @@ # by bindings of the H3 library. It is invoked by the `binding-functions` # make target and produces a file `binding-functions`. -SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" -cat "$SCRIPT_DIR/../src/h3lib/include/h3api.h" | sed -n '/@defgroup/s/.*@defgroup \([A-Za-z0-9_]*\) .*/\1/gp' > binding-functions +set -eo pipefail + +cat "src/h3lib/include/h3api.h" | sed -n '/@defgroup/s/.*@defgroup \([A-Za-z0-9_]*\) .*/\1/gp' > binding-functions diff --git a/scripts/coverage.sh.in b/scripts/coverage.sh.in index 6aac9f87d..cd189dc88 100755 --- a/scripts/coverage.sh.in +++ b/scripts/coverage.sh.in @@ -1,6 +1,6 @@ -#!/bin/bash +#!/usr/bin/env bash -# Copyright 2018 Uber Technologies, Inc. +# Copyright 2018-2019 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -44,7 +44,11 @@ fi src_dir=${1:-"Missing source directory"} binary_dir=${2:-"Missing binary directory"} +# Exclude the usual LCOV exclusion comment, and also +# do not require branch coverage for assertions. +br_exclusion='LCOV_EXCL_BR_LINE|assert\(' + cd "${binary_dir}" -lcov --directory . --capture --output-file coverage.info -lcov --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info -genhtml -o coverage coverage.cleaned.info --title 'h3 coverage' +lcov --ignore-errors mismatch --rc branch_coverage=1 --rc "lcov_excl_br_line=$br_exclusion" --directory . --capture --output-file coverage.info +lcov --ignore-errors mismatch --rc branch_coverage=1 --rc "lcov_excl_br_line=$br_exclusion" --extract coverage.info "${src_dir}/src/h3lib/*" --output-file coverage.cleaned.info +genhtml --branch-coverage -o coverage coverage.cleaned.info --title 'h3 coverage' diff --git a/scripts/make_countries.js b/scripts/make_countries.js new file mode 100644 index 000000000..74a2ef3ce --- /dev/null +++ b/scripts/make_countries.js @@ -0,0 +1,201 @@ +#!/usr/bin/env node +/* + * Copyright 2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file make_countries.js + * @brief Script to make country test fixtures based on Natural Earth data. + * This makes the fixture with polygonToCells benchmarks. + */ + +const fs = require('fs'); +const path = require('path'); +const https = require('https'); + +// Using GeoJSON version as it is easy to convert +const SOURCE_URL = 'https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_50m_admin_0_countries.geojson'; +const TARGET = process.argv[2]; + +// Use Node HTTPS module for download, to avoid dependencies +function getSource(url) { + return new Promise((resolve, reject) => { + https.get(url, (resp) => { + let data = ''; + resp.on('data', (chunk) => { + data += chunk; + }); + resp.on('end', () => { + resolve(data); + }); + }).on('error', reject); + }); +} + +function degsToRads(deg) { + return (deg * Math.PI) / 180; +} + +function formatCoord([lng, lat]) { + return `{${degsToRads(lat)}, ${degsToRads(lng)}}`; +} + +function formatGeoLoop(loop) { + return `{ + .numVerts = ${loop.length}, + .verts = (LatLng[]) { + ${loop.map(formatCoord).join(',\n')} + } + }` +} + +function formatGeoPolygon(poly, {i, name, verts}) { + const holes = poly.slice(1); + + return ` + // ${i}. ${name} (${verts} verts) + { + .geoloop = ${formatGeoLoop(poly[0])}, + .numHoles = ${holes.length}${holes.length ? `, + .holes = (GeoLoop[]) { + ${holes.map(formatGeoLoop).join(',\n')} + }` : ''} + }` +} + +async function makeCountries(sourceUrl, targetPath) { + console.log(`Downloading from ${sourceUrl}...`) + const countriesJson = await getSource(sourceUrl); + const countries = JSON.parse(countriesJson); + + console.log(`Download completed, found ${countries.features.length} countries`); + + const polygons = []; + const names = []; + + let i = 0; + + for (const {geometry, properties: {ADMIN: name}} of countries.features) { + if (geometry.type === 'Polygon') { + polygons.push(geometry.coordinates); + names.push({i: String(i++), name, verts: geometry.coordinates[0].length}); + } else if (geometry.type === 'MultiPolygon') { + for (const poly of geometry.coordinates) { + polygons.push(poly); + names.push({i: String(i++), name, verts: poly[0].length}); + } + } + } + + console.log(`Found ${polygons.length} polygons`); + + // In order to only allocate memory once, we take the biggest size + // at res 7, pad it, and size up based on powers of 7. This number was + // empirically determined. + const MAX_SIZE_RES_7 = 17544338; + + const out = `/* + * Copyright 2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This file is generated by scripts/make_countries.js. + * Made with Natural Earth. Contains data from nvkelso/natural-earth-vector. + * https://github.com/nvkelso/natural-earth-vector/blob/ca96624a56bd078437bca8184e78163e5039ad19/LICENSE.md + */ + +#include "benchmark.h" +#include "h3api.h" +#include "mathExtensions.h" +#include "polyfill.h" +#include "polygon.h" + +const GeoPolygon COUNTRIES[${polygons.length}] = {${ + polygons.map((poly, i) => formatGeoPolygon(poly, names[i])).join(',') +}}; + +BEGIN_BENCHMARKS(); + +int MAX_RES = 5; +int64_t numHexagons; +H3Index *hexagons; + +for (int res = 0; res < MAX_RES + 1; res++) { + + printf("Res %d", res); + + BENCHMARK(polygonToCells_AllCountries1, 5, { + for (int index = 0; index < ${polygons.length}; index++) { + H3_EXPORT(maxPolygonToCellsSize)(&COUNTRIES[index], res, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(&COUNTRIES[index], res, CONTAINMENT_CENTER, hexagons); + free(hexagons); + } + }); + + BENCHMARK(polygonToCells_AllCountries2, 5, { + for (int index = 0; index < ${polygons.length}; index++) { + H3_EXPORT(maxPolygonToCellsSizeExperimental)(&COUNTRIES[index], res, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental)(&COUNTRIES[index], res, CONTAINMENT_CENTER, numHexagons, hexagons); + free(hexagons); + } + }); + + BENCHMARK(polygonToCells_AllCountries3, 5, { + for (int index = 0; index < ${polygons.length}; index++) { + H3_EXPORT(maxPolygonToCellsSizeExperimental)(&COUNTRIES[index], res, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental)(&COUNTRIES[index], res, CONTAINMENT_FULL, numHexagons, hexagons); + free(hexagons); + } + }); + + BENCHMARK(polygonToCells_AllCountries4, 5, { + for (int index = 0; index < ${polygons.length}; index++) { + H3_EXPORT(maxPolygonToCellsSizeExperimental)(&COUNTRIES[index], res, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental)(&COUNTRIES[index], res, CONTAINMENT_OVERLAPPING, numHexagons, hexagons); + free(hexagons); + } + }); + +} + + +END_BENCHMARKS(); + ` + + fs.mkdirSync(path.dirname(targetPath), { recursive:true }); + fs.writeFileSync(targetPath, out, 'utf-8'); + + console.log(`Wrote fixture to ${targetPath}`); +} + +makeCountries(SOURCE_URL, TARGET); + + + diff --git a/cmake/toolchain.cmake b/scripts/publish_website.sh old mode 100644 new mode 100755 similarity index 53% rename from cmake/toolchain.cmake rename to scripts/publish_website.sh index b3fbd8e9a..01732f5a3 --- a/cmake/toolchain.cmake +++ b/scripts/publish_website.sh @@ -1,10 +1,11 @@ -# Copyright 2018 Uber Technologies, Inc. +#!/bin/sh +# Copyright 2019 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -12,5 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD 99) +# This script builds the current version of the H3 documentation website +# and pushes it to production. This assumes that you have set the remote +# for gh-pages to the upstream (i.e. uber/h3) remote. + +git checkout gh-pages +git pull +git checkout master +pushd website +./scripts/build-to-gh-pages.sh +git push +git checkout master +popd + + diff --git a/scripts/update_version.sh b/scripts/update_version.sh new file mode 100755 index 000000000..f70d95f58 --- /dev/null +++ b/scripts/update_version.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# Copyright 2019 Uber Technologies, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script is used interactively as part of the H3 release process +# (RELEASE.md) to update the version number in the VERSION file. Before +# writing the new version to the file, changelog information is presented +# for verification. It is invoked by the make target `update-version`. + +set -eo pipefail + +CURRENT_VERSION=$( /dev/null 2>&1; then + echo "Could not locate $CURRENT_TAG as a Git revision." + exit 1 +fi + +REVISION_RANGE="$CURRENT_TAG..HEAD" + +read -p "Next version: " NEXT_VERSION + +echo -e "\n * Changelog entries *" +git diff $REVISION_RANGE -- CHANGELOG.md +echo -e "\n * Committed *" +git log --oneline $REVISION_RANGE + +echo +read -p "Are all changes in the changelog [y/N]? " CHANGELOG_OK +if [ "y" = "$CHANGELOG_OK" ] || [ "Y" = "$CHANGELOG_OK" ]; then + echo $NEXT_VERSION > VERSION + echo "Wrote $NEXT_VERSION to the VERSION file" +else + echo "Cancelled - did not write VERSION file" + echo "Please update the CHANGELOG with the appropriate entries before bumping the version." + exit 2 +fi diff --git a/src/apps/applib/include/aflHarness.h b/src/apps/applib/include/aflHarness.h new file mode 100644 index 000000000..68d16a421 --- /dev/null +++ b/src/apps/applib/include/aflHarness.h @@ -0,0 +1,83 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file aflHarness.h + * @brief Adapter from LLVM fuzzer to AFL++ + */ +#ifndef AFLHARNESS_H +#define AFLHARNESS_H + +#include + +#include "utility.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); + +#ifndef H3_USE_LIBFUZZER + +/** + * Generate a AFL++ test case file of the right size initialized to all zeroes. + * + * @param filename + * @param expectedSize + * @return int + */ +int generateTestCase(const char *filename, size_t expectedSize) { + FILE *fp = fopen(filename, "wb"); + uint8_t zero = 0; + for (size_t i = 0; i < expectedSize; i += sizeof(zero)) { + if (fwrite(&zero, sizeof(zero), 1, fp) != 1) { + error("Error writing\n"); + } + } + fclose(fp); + return 0; +} + +#define AFL_HARNESS_MAIN(expectedSize) \ + int main(int argc, char *argv[]) { \ + if (argc == 3) { \ + if (strcmp(argv[1], "--generate") != 0) { \ + error( \ + "Invalid option (should be --generate, otherwise look at " \ + "aflHarness.h to see options)"); \ + } \ + return generateTestCase(argv[2], expectedSize); \ + } \ + if (argc != 2) { \ + error( \ + "Should have one argument, test case file, or --generate " \ + "test_case_file\n"); \ + } \ + const char *filename = argv[1]; \ + FILE *fp = fopen(filename, "rb"); \ + if (!fp) { \ + error("Error opening test case file\n"); \ + } \ + uint8_t data[expectedSize]; \ + if (fread(&data, expectedSize, 1, fp) != 1) { \ + error("Error reading test case file\n"); \ + } \ + fclose(fp); \ + return LLVMFuzzerTestOneInput(data, expectedSize); \ + } + +#else + +#define AFL_HARNESS_MAIN(expectedSize) + +#endif // H3_USE_LIBFUZZER + +#endif // AFLHARNESS_H \ No newline at end of file diff --git a/src/apps/applib/include/args.h b/src/apps/applib/include/args.h new file mode 100644 index 000000000..511913836 --- /dev/null +++ b/src/apps/applib/include/args.h @@ -0,0 +1,131 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file args.h + * @brief Miscellaneous functions and constants. + */ + +#ifndef ARGS_H +#define ARGS_H + +#include +#include +#include + +#include "utility.h" + +/** Maximum number of names an argument may have. */ +#define NUM_ARG_NAMES 2 + +/** + * An argument accepted by on the command line of an H3 application. Specifies + * how the argument is presented, parsed, and where parsed values are stored. + */ +typedef struct { + /** + * Both short and long names of the argument. A name may be null, but the + * first name must be non-null. + */ + const char *const names[NUM_ARG_NAMES]; + + /** + * If true, this argument must be specified. If the argument is not + * specified, argument parsing will fail. + */ + const bool required; + + /** + * Scan format for the argument, which will be passed to sscanf. May be null + * to indicate the argument does not take a value. + */ + const char *const scanFormat; + + /** + * Name to present the value as when printing help. + */ + const char *const valueName; + + /** + * Value will be placed here if the argument is present and scanFormat is + * not null. + */ + void *const value; + + /** + * Will be set to true if the argument is present. Should be false when + * passed in to parseArgs. + */ + bool found; + + /** + * Help text for this argument. + */ + const char *const helpText; +} Arg; + +// prototypes + +int parseArgs(int argc, char *argv[], int numArgs, Arg *args[], + const Arg *helpArg, const char *helpText); +void printHelp(FILE *out, const char *programName, const char *helpText, + int numArgs, Arg *args[], const char *errorMessage, + const char *errorDetails); + +int _parseArgsList(int argc, char *argv[], int numArgs, Arg *args[], + const Arg *helpArg, const char **errorMessage, + const char **errorDetail); + +// common arguments + +#define ARG_HELP \ + { .names = {"-h", "--help"}, .helpText = "Show this help message." } +#define DEFINE_INDEX_ARG(varName, argName) \ + H3Index varName = 0; \ + Arg argName = { \ + .names = {"-i", "--index"}, \ + .scanFormat = "%" PRIx64, \ + .valueName = "index", \ + .value = &varName, \ + .helpText = \ + "Index, or not specified to read indexes from standard input."} +#define DEFINE_CELL_ARG(varName, argName) \ + H3Index varName = 0; \ + Arg argName = {.names = {"-c", "--cell"}, \ + .required = true, \ + .scanFormat = "%" PRIx64, \ + .valueName = "index", \ + .value = &varName, \ + .helpText = "H3 Cell"} +#define ARG_KML \ + { .names = {"-k", "--kml"}, .helpText = "Print output in KML format." } +#define DEFINE_KML_NAME_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = { \ + .names = {"--kn", "--kml-name"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "name", \ + .value = &varName, \ + .helpText = "Text for the KML name tag, if --kml is specified."} +#define DEFINE_KML_DESC_ARG(varName, argName) \ + char varName[BUFF_SIZE] = {0}; \ + Arg argName = { \ + .names = {"--kd", "--kml-description"}, \ + .scanFormat = "%255c", /* BUFF_SIZE - 1 */ \ + .valueName = "description", \ + .value = &varName, \ + .helpText = \ + "Text for the KML description tag, if --kml is specified."} + +#endif diff --git a/src/apps/applib/include/benchmark.h b/src/apps/applib/include/benchmark.h index 6197cc46f..7d1c14c8d 100644 --- a/src/apps/applib/include/benchmark.h +++ b/src/apps/applib/include/benchmark.h @@ -67,11 +67,11 @@ #endif -#define BEGIN_BENCHMARKS() int main(int argc, char* argv[]) { +#define BEGIN_BENCHMARKS() int main(int argc, char *argv[]) { #define BENCHMARK(NAME, ITERATIONS, BODY) \ do { \ const int iterations = ITERATIONS; \ - const char* name = #NAME; \ + const char *name = #NAME; \ START_TIMER; \ for (int i = 0; i < iterations; i++) { \ BODY; \ diff --git a/src/apps/applib/include/kml.h b/src/apps/applib/include/kml.h index b4e74714f..283178605 100644 --- a/src/apps/applib/include/kml.h +++ b/src/apps/applib/include/kml.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,22 +20,22 @@ #ifndef KML_H #define KML_H -#include "geoCoord.h" +#include "latLng.h" // output the KML header file for points -void kmlPtsHeader(const char* name, const char* desc); -void kmlBoundaryHeader(const char* name, const char* desc); +void kmlPtsHeader(const char *name, const char *desc); +void kmlBoundaryHeader(const char *name, const char *desc); // output the KML footer file void kmlPtsFooter(void); void kmlBoundaryFooter(void); // output KML individual points or polygons -void outputLatLonKML(const GeoCoord* g); -void outputPointKML(const GeoCoord* g, const char* name); -void outputTriKML(const GeoCoord* v1, const GeoCoord* v2, const GeoCoord* v3, - const char* name); -void outputPolyKML(const GeoCoord geoVerts[], int numVerts, const char* name); -void outputBoundaryKML(const GeoBoundary* b, const char* name); +void outputLngLatKML(const LatLng *g); +void outputPointKML(const LatLng *g, const char *name); +void outputTriKML(const LatLng *v1, const LatLng *v2, const LatLng *v3, + const char *name); +void outputPolyKML(const LatLng geoVerts[], int numVerts, const char *name); +void outputBoundaryKML(const CellBoundary *b, const char *name); #endif diff --git a/src/apps/applib/include/test.h b/src/apps/applib/include/test.h index 824592c80..922e2c1fa 100644 --- a/src/apps/applib/include/test.h +++ b/src/apps/applib/include/test.h @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,13 @@ #define TEST_H #include -#include "geoCoord.h" + #include "h3api.h" +#include "latLng.h" extern int globalTestCount; -extern const char* currentSuiteName; -extern const char* currentTestName; +extern const char *currentSuiteName; +extern const char *currentTestName; #define t_assert(condition, msg) \ do { \ @@ -40,7 +41,9 @@ extern const char* currentTestName; printf("."); \ } while (0) -void t_assertBoundary(H3Index h3, const GeoBoundary* b1); +#define t_assertSuccess(condition) t_assert(!(condition), "expected E_SUCCESS") + +void t_assertBoundary(H3Index h3, const CellBoundary *b1); #define SUITE(NAME) \ static void runTests(void); \ diff --git a/src/apps/applib/include/utility.h b/src/apps/applib/include/utility.h index e45dccc83..dcf89e7d1 100644 --- a/src/apps/applib/include/utility.h +++ b/src/apps/applib/include/utility.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,8 @@ #define UTILITY_H #include + +#include "bbox.h" #include "coordijk.h" #include "h3api.h" @@ -29,27 +31,34 @@ /** Macro: Get the size of a fixed-size array */ #define ARRAY_SIZE(x) sizeof(x) / sizeof(x[0]) -// prototypes -void error(const char* msg); +void error(const char *msg); void h3Print(H3Index h); // prints as integer void h3Println(H3Index h); // prints as integer -void coordIjkPrint(const CoordIJK* c); +void coordIjkPrint(const CoordIJK *c); + +void geoToStringRads(const LatLng *p, char *str); +void geoToStringDegs(const LatLng *p, char *str); +void geoToStringDegsNoFmt(const LatLng *p, char *str); -void geoToStringRads(const GeoCoord* p, char* str); -void geoToStringDegs(const GeoCoord* p, char* str); -void geoToStringDegsNoFmt(const GeoCoord* p, char* str); +void geoPrint(const LatLng *p); +void geoPrintln(const LatLng *p); +void geoPrintNoFmt(const LatLng *p); +void geoPrintlnNoFmt(const LatLng *p); +void cellBoundaryPrint(const CellBoundary *b); +void cellBoundaryPrintln(const CellBoundary *b); +void bboxPrint(const BBox *bbox); +void bboxPrintln(const BBox *bbox); -void geoPrint(const GeoCoord* p); -void geoPrintln(const GeoCoord* p); -void geoPrintNoFmt(const GeoCoord* p); -void geoPrintlnNoFmt(const GeoCoord* p); -void geoBoundaryPrint(const GeoBoundary* b); -void geoBoundaryPrintln(const GeoBoundary* b); -int readBoundary(FILE* f, GeoBoundary* b); +void randomGeo(LatLng *p); void iterateAllIndexesAtRes(int res, void (*callback)(H3Index)); void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int maxBaseCell); +void iterateBaseCellIndexesAtRes(int res, void (*callback)(H3Index), + int baseCell); +void iterateAllDirectedEdgesAtRes(int res, void (*callback)(H3Index)); + +int64_t countNonNullIndexes(H3Index *indexes, int64_t numCells); #endif diff --git a/src/apps/applib/lib/args.c b/src/apps/applib/lib/args.c new file mode 100644 index 000000000..3141a74bc --- /dev/null +++ b/src/apps/applib/lib/args.c @@ -0,0 +1,228 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file args.c + * @brief Miscellaneous useful functions. + */ + +#include "args.h" + +#include +#include +#include +#include + +#ifdef _WIN32 + +#define strcasecmp _stricmp + +#else + +#include + +#endif + +#include "h3api.h" + +/* + * Return codes from parseArgs. + */ + +#define PARSE_ARGS_SUCCESS 0 +#define PARSE_ARGS_HELP 1 +#define PARSE_ARGS_REPEATED_ARGUMENT 2 +#define PARSE_ARGS_MISSING_VALUE 3 +#define PARSE_ARGS_FAILED_PARSE 4 +#define PARSE_ARGS_UNKNOWN_ARGUMENT 5 +#define PARSE_ARGS_MISSING_REQUIRED 6 + +/** + * Parse command line arguments and prints help, if needed. + * + * Uses the provided arguments to populate argument values and records in the + * argument if it is found. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * Help is printed to stdout if a argument with isHelp = true is found, and help + * is printed to stderr if argument parsing fails. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse + * @param helpArg Pointer to the argument for "--help" + * @param helpText Explanatory text for this program printed with help + * @return 0 if argument parsing succeeded, otherwise non-0. If help is printed, + * return value is non-0. + */ +int parseArgs(int argc, char *argv[], int numArgs, Arg *args[], + const Arg *helpArg, const char *helpText) { + const char *errorMessage = NULL; + const char *errorDetails = NULL; + + int failed = _parseArgsList(argc, argv, numArgs, args, helpArg, + &errorMessage, &errorDetails); + + if (failed || helpArg->found) { + printHelp(helpArg->found ? stdout : stderr, argv[0], helpText, numArgs, + args, errorMessage, errorDetails); + return failed != PARSE_ARGS_SUCCESS ? failed : PARSE_ARGS_HELP; + } + return PARSE_ARGS_SUCCESS; +} + +/** + * Parse command line arguments. + * + * Uses the provided arguments to populate argument values. + * + * Returns non-zero if all required arguments are not present, an argument fails + * to parse, is missing its associated value, or arguments are specified more + * than once. + * + * @param argc argc from main + * @param argv argv from main + * @param numArgs Number of elements in the args array + * @param args Pointer to each argument to parse. + * @param helpArg Pointer to the argument for "--help" that suppresses checking + * for required arguments. + * @param errorMessage Error message to display, if returning non-zero. + * @param errorDetail Additional error details, if returning non-zero. May be + * null, and may be a pointer from `argv` or `args`. + * @return 0 if argument parsing succeeded, otherwise non-0. + */ +int _parseArgsList(int argc, char *argv[], int numArgs, Arg *args[], + const Arg *helpArg, const char **errorMessage, + const char **errorDetail) { + // Whether help was found and required arguments do not need to be checked + bool foundHelp = false; + + for (int i = 1; i < argc; i++) { + bool foundMatch = false; + + for (int j = 0; j < numArgs; j++) { + // Test this argument, which may have multiple names, for whether it + // matches. argName will be set to the name used for this argument + // if it matches. + const char *argName = NULL; + for (int k = 0; k < NUM_ARG_NAMES; k++) { + if (args[j]->names[k] == NULL) continue; + + if (strcasecmp(argv[i], args[j]->names[k]) == 0) { + argName = args[j]->names[k]; + break; + } + } + // argName unchanged from NULL indicates this didn't match, try the + // next argument. + if (argName == NULL) continue; + + if (args[j]->found) { + *errorMessage = "Argument specified multiple times"; + *errorDetail = argName; + return PARSE_ARGS_REPEATED_ARGUMENT; + } + + if (args[j]->scanFormat != NULL) { + // Argument has a value, need to advance one and read the value. + i++; + if (i >= argc) { + *errorMessage = "Argument value not present"; + *errorDetail = argName; + return PARSE_ARGS_MISSING_VALUE; + } + + if (!sscanf(argv[i], args[j]->scanFormat, args[j]->value)) { + *errorMessage = "Failed to parse argument"; + *errorDetail = argName; + return PARSE_ARGS_FAILED_PARSE; + } + } + + if (args[j] == helpArg) { + foundHelp = true; + } + + args[j]->found = true; + foundMatch = true; + break; + } + + if (!foundMatch) { + *errorMessage = "Unknown argument"; + // Don't set errorDetail, since the input could be unprintable. + return PARSE_ARGS_UNKNOWN_ARGUMENT; + } + } + + // Check for missing required arguments. + if (!foundHelp) { + for (int i = 0; i < numArgs; i++) { + if (args[i]->required && !args[i]->found) { + *errorMessage = "Required argument missing"; + *errorDetail = args[i]->names[0]; + return PARSE_ARGS_MISSING_REQUIRED; + } + } + } + + return PARSE_ARGS_SUCCESS; +} + +/** + * Print a help message. + * + * @param out Stream to print to, e.g. stdout + * @param programName Program name, such as from argv[0] + * @param helpText Explanation of what the program does + * @param numArgs Number of arguments to print help for + * @param args Pointer to arguments to print help for + * @param errorMessage Error message, or null + * @param errorDetails Additional error detail message, or null + */ +void printHelp(FILE *out, const char *programName, const char *helpText, + int numArgs, Arg *args[], const char *errorMessage, + const char *errorDetails) { + if (errorMessage != NULL) { + fprintf(out, "%s: %s", programName, errorMessage); + if (errorDetails != NULL) { + fprintf(out, ": %s", errorDetails); + } + fprintf(out, "\n"); + } + fprintf(out, "%s: %s\n", programName, helpText); + fprintf(out, "H3 %d.%d.%d\n\n", H3_VERSION_MAJOR, H3_VERSION_MINOR, + H3_VERSION_PATCH); + + for (int i = 0; i < numArgs; i++) { + fprintf(out, "\t"); + for (int j = 0; j < NUM_ARG_NAMES; j++) { + if (args[i]->names[j] == NULL) continue; + if (j != 0) fprintf(out, ", "); + fprintf(out, "%s", args[i]->names[j]); + } + if (args[i]->scanFormat != NULL) { + fprintf(out, " <%s>", args[i]->valueName); + } + fprintf(out, "\t"); + if (args[i]->required) { + fprintf(out, "Required. "); + } + fprintf(out, "%s\n", args[i]->helpText); + } +} diff --git a/src/apps/applib/lib/kml.c b/src/apps/applib/lib/kml.c index 2171a0569..a2039c831 100644 --- a/src/apps/applib/lib/kml.c +++ b/src/apps/applib/lib/kml.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,12 @@ */ #include "kml.h" + #include + #include "h3api.h" -void kmlPtsHeader(const char* name, const char* desc) { +void kmlPtsHeader(const char *name, const char *desc) { printf("\n"); printf( "\n"); } -void kmlBoundaryHeader(const char* name, const char* desc) { +void kmlBoundaryHeader(const char *name, const char *desc) { printf("\n"); printf("\n"); printf("\n"); @@ -105,47 +107,47 @@ void kmlBoundaryFooter(void) { printf("\n"); } -void outputLatLonKML(const GeoCoord* g) { - printf(" %8lf,%8lf,5.0\n", H3_EXPORT(radsToDegs)(g->lon), +void outputLngLatKML(const LatLng *g) { + printf(" %8lf,%8lf,5.0\n", H3_EXPORT(radsToDegs)(g->lng), H3_EXPORT(radsToDegs)(g->lat)); } -void outputPointKML(const GeoCoord* g, const char* name) { +void outputPointKML(const LatLng *g, const char *name) { printf("\n"); printf(" %s\n", name); printf(" #m_ylw-pushpin\n"); printf(" \n"); printf(" relativeToGround\n"); printf(" \n"); - outputLatLonKML(g); + outputLngLatKML(g); printf(" \n"); printf(" \n"); printf("\n"); } -void outputTriKML(const GeoCoord* v1, const GeoCoord* v2, const GeoCoord* v3, - const char* name) { +void outputTriKML(const LatLng *v1, const LatLng *v2, const LatLng *v3, + const char *name) { printf("\n"); printf("%s\n", name); printf(" #lineStyle1\n"); printf(" \n"); printf(" 1\n"); printf(" \n"); - outputLatLonKML(v1); - outputLatLonKML(v2); - outputLatLonKML(v3); - outputLatLonKML(v1); + outputLngLatKML(v1); + outputLngLatKML(v2); + outputLngLatKML(v3); + outputLngLatKML(v1); printf(" \n"); printf(" \n"); printf("\n"); } -void outputBoundaryKML(const GeoBoundary* b, const char* name) { - const GeoCoord* v = (const GeoCoord*)&(b->verts); +void outputBoundaryKML(const CellBoundary *b, const char *name) { + const LatLng *v = (const LatLng *)&(b->verts); outputPolyKML(v, b->numVerts, name); } -void outputPolyKML(const GeoCoord geoVerts[], int numVerts, const char* name) { +void outputPolyKML(const LatLng geoVerts[], int numVerts, const char *name) { printf("\n"); printf("%s\n", name); printf(" #lineStyle1\n"); @@ -153,8 +155,8 @@ void outputPolyKML(const GeoCoord geoVerts[], int numVerts, const char* name) { printf(" 1\n"); printf(" \n"); - for (int v = 0; v < numVerts; v++) outputLatLonKML(&geoVerts[v]); - outputLatLonKML(&geoVerts[0]); + for (int v = 0; v < numVerts; v++) outputLngLatKML(&geoVerts[v]); + outputLngLatKML(&geoVerts[0]); printf(" \n"); printf(" \n"); diff --git a/src/apps/applib/lib/test.c b/src/apps/applib/lib/test.c index e7001c0c4..78a5006ab 100644 --- a/src/apps/applib/lib/test.c +++ b/src/apps/applib/lib/test.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,19 +18,20 @@ */ #include "test.h" + #include #include // Assert int globalTestCount = 0; -const char* currentSuiteName = ""; -const char* currentTestName = ""; +const char *currentSuiteName = ""; +const char *currentTestName = ""; -void t_assertBoundary(H3Index h3, const GeoBoundary* b1) { +void t_assertBoundary(H3Index h3, const CellBoundary *b1) { // Generate cell boundary for the h3 index - GeoBoundary b2; - H3_EXPORT(h3ToGeoBoundary)(h3, &b2); + CellBoundary b2; + H3_EXPORT(cellToBoundary)(h3, &b2); t_assert(b1->numVerts == b2.numVerts, "expected cell boundary count"); for (int v = 0; v < b1->numVerts; v++) { t_assert(geoAlmostEqual(&b1->verts[v], &b2.verts[v]), diff --git a/src/apps/applib/lib/utility.c b/src/apps/applib/lib/utility.c index 8cb2228c7..15a80cd17 100644 --- a/src/apps/applib/lib/utility.c +++ b/src/apps/applib/lib/utility.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,17 +18,18 @@ */ #include "utility.h" + #include #include -#include #include #include -#include "coordijk.h" -#include "geoCoord.h" +#include +#include + #include "h3Index.h" -#include "h3api.h" +#include "iterators.h" -void error(const char* msg) { +void error(const char *msg) { fflush(stdout); fflush(stderr); fprintf(stderr, "ERROR: %s.\n", msg); @@ -48,56 +49,56 @@ void h3Println(H3Index h) { printf("%" PRIx64 "\n", h); } /** * Prints the CoordIJK */ -void coordIjkPrint(const CoordIJK* c) { +void coordIjkPrint(const CoordIJK *c) { printf("[%d, %d, %d]", c->i, c->j, c->k); } /** * Assumes `str` is big enough to hold the result. */ -void geoToStringRads(const GeoCoord* p, char* str) { - sprintf(str, "(%.4lf, %.4lf)", p->lat, p->lon); +void geoToStringRads(const LatLng *p, char *str) { + sprintf(str, "(%.4lf, %.4lf)", p->lat, p->lng); } /** * Assumes `str` is big enough to hold the result. */ -void geoToStringDegs(const GeoCoord* p, char* str) { +void geoToStringDegs(const LatLng *p, char *str) { sprintf(str, "(%.9lf, %.9lf)", H3_EXPORT(radsToDegs)(p->lat), - H3_EXPORT(radsToDegs)(p->lon)); + H3_EXPORT(radsToDegs)(p->lng)); } /** * Assumes `str` is big enough to hold the result. */ -void geoToStringDegsNoFmt(const GeoCoord* p, char* str) { +void geoToStringDegsNoFmt(const LatLng *p, char *str) { sprintf(str, "%.9lf %.9lf", H3_EXPORT(radsToDegs)(p->lat), - H3_EXPORT(radsToDegs)(p->lon)); + H3_EXPORT(radsToDegs)(p->lng)); } -void geoPrint(const GeoCoord* p) { +void geoPrint(const LatLng *p) { char buff[BUFF_SIZE]; geoToStringDegs(p, buff); printf("%s", buff); } -void geoPrintln(const GeoCoord* p) { +void geoPrintln(const LatLng *p) { geoPrint(p); printf("\n"); } -void geoPrintNoFmt(const GeoCoord* p) { +void geoPrintNoFmt(const LatLng *p) { char buff[BUFF_SIZE]; geoToStringDegsNoFmt(p, buff); printf("%s", buff); } -void geoPrintlnNoFmt(const GeoCoord* p) { +void geoPrintlnNoFmt(const LatLng *p) { geoPrintNoFmt(p); printf("\n"); } -void geoBoundaryPrint(const GeoBoundary* b) { +void cellBoundaryPrint(const CellBoundary *b) { char buff[BUFF_SIZE]; printf("{"); for (int v = 0; v < b->numVerts; v++) { @@ -107,7 +108,7 @@ void geoBoundaryPrint(const GeoBoundary* b) { printf("}"); } -void geoBoundaryPrintln(const GeoBoundary* b) { +void cellBoundaryPrintln(const CellBoundary *b) { char buff[BUFF_SIZE]; printf("{\n"); for (int v = 0; v < b->numVerts; v++) { @@ -117,62 +118,33 @@ void geoBoundaryPrintln(const GeoBoundary* b) { printf("}\n"); } -/** - * Assumes `f` is open and ready for reading. - * @return 0 on success, EOF on EOF - */ -int readBoundary(FILE* f, GeoBoundary* b) { - char buff[BUFF_SIZE]; - - // get the first line, which should be a "{" - if (!fgets(buff, BUFF_SIZE, f)) { - if (feof(stdin)) { - return EOF; - } else { - printf("reading GeoBoundary from input"); - return -1; - } - } - - if (buff[0] != '{') { - printf("missing GeoBoundary {"); - return -2; - } - - // now read the verts +void bboxPrint(const BBox *bbox) { + printf( + "bbox {%.9lf, %.9lf, %.9lf, %.9lf}", H3_EXPORT(radsToDegs)(bbox->north), + H3_EXPORT(radsToDegs)(bbox->south), H3_EXPORT(radsToDegs)(bbox->east), + H3_EXPORT(radsToDegs)(bbox->west)); +} - b->numVerts = 0; - while (1) { - if (!fgets(buff, BUFF_SIZE, f)) { - printf("reading GeoBoundary from input"); - return -3; - } +void bboxPrintln(const BBox *bbox) { + bboxPrint(bbox); + printf("\n"); +} - if (buff[0] == '}') { - if (b->numVerts == 0) { - printf("reading empty cell boundary"); - return -4; - } else { - break; +/** + * Apply callback for every unidirectional edge at the given resolution. + */ +void iterateAllDirectedEdgesAtRes(int res, void (*callback)(H3Index)) { + for (IterCellsResolution iter = iterInitRes(res); iter.h; + iterStepRes(&iter)) { + H3Index edges[6] = {H3_NULL}; + H3_EXPORT(originToDirectedEdges)(iter.h, edges); + + for (int i = 0; i < 6; i++) { + if (edges[i] != H3_NULL) { + (*callback)(edges[i]); } } - - if (b->numVerts == MAX_CELL_BNDRY_VERTS) { - printf("too many vertices in GeoBoundary from input"); - return -5; - } - - double latDegs, lonDegs; - if (sscanf(buff, "%lf %lf", &latDegs, &lonDegs) != 2) { - printf("parsing GeoBoundary from input"); - return -6; - } - - setGeoDegs(&b->verts[b->numVerts], latDegs, lonDegs); - b->numVerts++; } - - return 0; } /** @@ -190,18 +162,48 @@ void iterateAllIndexesAtResPartial(int res, void (*callback)(H3Index), int baseCells) { assert(baseCells <= NUM_BASE_CELLS); for (int i = 0; i < baseCells; i++) { - H3Index bc; - setH3Index(&bc, 0, i, 0); - int childrenSz = H3_EXPORT(maxUncompactSize)(&bc, 1, res); - STACK_ARRAY_CALLOC(H3Index, children, childrenSz); - H3_EXPORT(uncompact)(&bc, 1, children, childrenSz, res); - - for (int j = 0; j < childrenSz; j++) { - if (children[j] == 0) { - continue; - } + iterateBaseCellIndexesAtRes(res, callback, i); + } +} + +/** + * Call the callback for every index at the given resolution in a + * specific base cell + */ +void iterateBaseCellIndexesAtRes(int res, void (*callback)(H3Index), + int baseCell) { + for (IterCellsChildren iter = iterInitBaseCellNum(baseCell, res); iter.h; + iterStepChild(&iter)) { + (*callback)(iter.h); + } +} + +/** + * Generates a random lat/lng pair. + * + * @param g Lat/lng will be placed here. + */ +void randomGeo(LatLng *g) { + static int init = 0; + if (!init) { + srand((unsigned int)time(0)); + init = 1; + } + + g->lat = H3_EXPORT(degsToRads)( + (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); + g->lng = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; +} - (*callback)(children[j]); +/** + * Returns the number of non-invalid indexes in the array. + */ +int64_t countNonNullIndexes(H3Index *indexes, int64_t numCells) { + int64_t nonNullIndexes = 0; + for (int i = 0; i < numCells; i++) { + if (indexes[i] != H3_NULL) { + nonNullIndexes++; } } + return nonNullIndexes; } diff --git a/src/apps/benchmarks/benchmarkKRing.c b/src/apps/benchmarks/benchmarkCellToChildren.c similarity index 50% rename from src/apps/benchmarks/benchmarkKRing.c rename to src/apps/benchmarks/benchmarkCellToChildren.c index cd60f0d5c..fff91e1b7 100644 --- a/src/apps/benchmarks/benchmarkKRing.c +++ b/src/apps/benchmarks/benchmarkCellToChildren.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2023 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,21 +19,21 @@ // Fixtures H3Index hex = 0x89283080ddbffff; -H3Index pentagon = 0x89080000003ffff; BEGIN_BENCHMARKS(); -H3Index* out = malloc(H3_EXPORT(maxKringSize)(40) * sizeof(H3Index)); +int64_t outSz; +if (H3_EXPORT(cellToChildrenSize)(hex, 14, &outSz)) { + printf("Failed\n"); + return 1; +} +H3Index *out = calloc(outSz, sizeof(H3Index)); -BENCHMARK(kRing10, 10000, { H3_EXPORT(kRing)(hex, 10, out); }); -BENCHMARK(kRing20, 10000, { H3_EXPORT(kRing)(hex, 20, out); }); -BENCHMARK(kRing30, 10000, { H3_EXPORT(kRing)(hex, 30, out); }); -BENCHMARK(kRing40, 10000, { H3_EXPORT(kRing)(hex, 40, out); }); - -BENCHMARK(kRingPentagon10, 500, { H3_EXPORT(kRing)(pentagon, 10, out); }); -BENCHMARK(kRingPentagon20, 500, { H3_EXPORT(kRing)(pentagon, 20, out); }); -BENCHMARK(kRingPentagon30, 50, { H3_EXPORT(kRing)(pentagon, 30, out); }); -BENCHMARK(kRingPentagon40, 10, { H3_EXPORT(kRing)(pentagon, 40, out); }); +BENCHMARK(cellToChildren1, 10000, { H3_EXPORT(cellToChildren)(hex, 10, out); }); +BENCHMARK(cellToChildren2, 10000, { H3_EXPORT(cellToChildren)(hex, 11, out); }); +BENCHMARK(cellToChildren3, 10000, { H3_EXPORT(cellToChildren)(hex, 12, out); }); +BENCHMARK(cellToChildren4, 10000, { H3_EXPORT(cellToChildren)(hex, 13, out); }); +BENCHMARK(cellToChildren5, 10000, { H3_EXPORT(cellToChildren)(hex, 14, out); }); free(out); diff --git a/src/apps/benchmarks/benchmarkH3SetToLinkedGeo.c b/src/apps/benchmarks/benchmarkCellsToLinkedMultiPolygon.c similarity index 77% rename from src/apps/benchmarks/benchmarkH3SetToLinkedGeo.c rename to src/apps/benchmarks/benchmarkCellsToLinkedMultiPolygon.c index 300d08118..cb8f9ca1d 100644 --- a/src/apps/benchmarks/benchmarkH3SetToLinkedGeo.c +++ b/src/apps/benchmarks/benchmarkCellsToLinkedMultiPolygon.c @@ -43,19 +43,20 @@ int nestedDonutsCount = 24; BEGIN_BENCHMARKS(); LinkedGeoPolygon polygon; -BENCHMARK(h3SetToLinkedGeoRing2, 10000, { - H3_EXPORT(h3SetToLinkedGeo)(ring2, ring2Count, &polygon); - H3_EXPORT(destroyLinkedPolygon)(&polygon); +BENCHMARK(cellsToLinkedMultiPolygonRing2, 10000, { + H3_EXPORT(cellsToLinkedMultiPolygon)(ring2, ring2Count, &polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); }); -BENCHMARK(h3SetToLinkedGeoDonut, 10000, { - H3_EXPORT(h3SetToLinkedGeo)(donut, donutCount, &polygon); - H3_EXPORT(destroyLinkedPolygon)(&polygon); +BENCHMARK(cellsToLinkedMultiPolygonDonut, 10000, { + H3_EXPORT(cellsToLinkedMultiPolygon)(donut, donutCount, &polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); }); -BENCHMARK(h3SetToLinkedGeoNestedDonuts, 10000, { - H3_EXPORT(h3SetToLinkedGeo)(nestedDonuts, nestedDonutsCount, &polygon); - H3_EXPORT(destroyLinkedPolygon)(&polygon); +BENCHMARK(cellsToLinkedMultiPolygonNestedDonuts, 10000, { + H3_EXPORT(cellsToLinkedMultiPolygon) + (nestedDonuts, nestedDonutsCount, &polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); }); END_BENCHMARKS(); diff --git a/website/html.config.js b/src/apps/benchmarks/benchmarkDirectedEdge.c similarity index 55% rename from website/html.config.js rename to src/apps/benchmarks/benchmarkDirectedEdge.c index 0e9bf93ff..2309da6f0 100644 --- a/website/html.config.js +++ b/src/apps/benchmarks/benchmarkDirectedEdge.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,19 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "benchmark.h" +#include "h3api.h" +#include "latLng.h" -module.exports = { +// Fixtures (arbitrary res 9 hexagon) +H3Index edges[6] = {0}; +H3Index hex = 0x89283080ddbffff; - title: 'H3', +BEGIN_BENCHMARKS(); - meta: [{ - name: 'description', - content: 'A hexagonal hierarchical geospatial indexing system' - }], +CellBoundary outBoundary; +H3_EXPORT(originToDirectedEdges)(hex, edges); - scripts: [ - // Adds Mathjax support - 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' - ] +BENCHMARK(directedEdgeToBoundary, 10000, { + for (int i = 0; i < 6; i++) { + H3_EXPORT(directedEdgeToBoundary)(edges[i], &outBoundary); + } +}); -}; +END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkGridDiskCells.c b/src/apps/benchmarks/benchmarkGridDiskCells.c new file mode 100644 index 000000000..3a132b0c1 --- /dev/null +++ b/src/apps/benchmarks/benchmarkGridDiskCells.c @@ -0,0 +1,45 @@ +/* + * Copyright 2018, 2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "benchmark.h" +#include "h3Index.h" +#include "h3api.h" + +// Fixtures +H3Index hex = 0x89283080ddbffff; +H3Index pentagon = 0x89080000003ffff; + +BEGIN_BENCHMARKS(); + +int64_t outSz; +if (H3_EXPORT(maxGridDiskSize)(40, &outSz)) { + printf("Failed\n"); + return 1; +} +H3Index *out = calloc(outSz, sizeof(H3Index)); + +BENCHMARK(gridDisk10, 10000, { H3_EXPORT(gridDisk)(hex, 10, out); }); +BENCHMARK(gridDisk20, 10000, { H3_EXPORT(gridDisk)(hex, 20, out); }); +BENCHMARK(gridDisk30, 10000, { H3_EXPORT(gridDisk)(hex, 30, out); }); +BENCHMARK(gridDisk40, 10000, { H3_EXPORT(gridDisk)(hex, 40, out); }); + +BENCHMARK(gridDiskPentagon10, 500, { H3_EXPORT(gridDisk)(pentagon, 10, out); }); +BENCHMARK(gridDiskPentagon20, 500, { H3_EXPORT(gridDisk)(pentagon, 20, out); }); +BENCHMARK(gridDiskPentagon30, 50, { H3_EXPORT(gridDisk)(pentagon, 30, out); }); +BENCHMARK(gridDiskPentagon40, 10, { H3_EXPORT(gridDisk)(pentagon, 40, out); }); + +free(out); + +END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkH3Line.c b/src/apps/benchmarks/benchmarkGridPathCells.c similarity index 68% rename from src/apps/benchmarks/benchmarkH3Line.c rename to src/apps/benchmarks/benchmarkGridPathCells.c index 09b9e9035..2fcbaeb92 100644 --- a/src/apps/benchmarks/benchmarkH3Line.c +++ b/src/apps/benchmarks/benchmarkGridPathCells.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,16 @@ H3Index endFar = 0x8929a5653c3ffff; BEGIN_BENCHMARKS(); -H3Index* out = - calloc(H3_EXPORT(h3LineSize)(startIndex, endFar), sizeof(H3Index)); +int64_t size; +H3_EXPORT(gridPathCellsSize)(startIndex, endFar, &size); +H3Index *out = calloc(size, sizeof(H3Index)); -BENCHMARK(h3LineNear, 10000, { H3_EXPORT(h3Line)(startIndex, endNear, out); }); -BENCHMARK(h3LineFar, 1000, { H3_EXPORT(h3Line)(startIndex, endFar, out); }); +BENCHMARK(gridPathCellsNear, 10000, { + H3_EXPORT(gridPathCells)(startIndex, endNear, out); +}); +BENCHMARK(gridPathCellsFar, 1000, { + H3_EXPORT(gridPathCells)(startIndex, endFar, out); +}); free(out); diff --git a/src/apps/benchmarks/benchmarkH3Api.c b/src/apps/benchmarks/benchmarkH3Api.c index 96b7180f5..d54b66597 100644 --- a/src/apps/benchmarks/benchmarkH3Api.c +++ b/src/apps/benchmarks/benchmarkH3Api.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 Uber Technologies, Inc. + * Copyright 2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,24 +14,25 @@ * limitations under the License. */ #include "benchmark.h" -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" -// Fixtures -GeoCoord coord = {0.659966917655, -2.1364398519396}; +// Fixtures (arbitrary res 9 hexagon) +LatLng coord = {0.659966917655, -2.1364398519396}; H3Index hex = 0x89283080ddbffff; BEGIN_BENCHMARKS(); -GeoCoord outCoord; -GeoBoundary outBoundary; +LatLng outCoord; +CellBoundary outBoundary; +H3Index h; -BENCHMARK(geoToH3, 10000, { H3_EXPORT(geoToH3)(&coord, 9); }); +BENCHMARK(latLngToCell, 10000, { H3_EXPORT(latLngToCell)(&coord, 9, &h); }); -BENCHMARK(h3ToGeo, 10000, { H3_EXPORT(h3ToGeo)(hex, &outCoord); }); +BENCHMARK(cellToLatLng, 10000, { H3_EXPORT(cellToLatLng)(hex, &outCoord); }); -BENCHMARK(h3ToGeoBoundary, 10000, { - H3_EXPORT(h3ToGeoBoundary)(hex, &outBoundary); +BENCHMARK(cellToBoundary, 10000, { + H3_EXPORT(cellToBoundary)(hex, &outBoundary); }); END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkIsValidCell.c b/src/apps/benchmarks/benchmarkIsValidCell.c new file mode 100644 index 000000000..2e1e37dd3 --- /dev/null +++ b/src/apps/benchmarks/benchmarkIsValidCell.c @@ -0,0 +1,86 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "benchmark.h" +#include "h3api.h" + +typedef struct { + H3Index *cells; + int64_t N; +} CellArray; + +CellArray pentagonSetup(int parentRes, int childRes, int nullEvery) { + // Starting with a parent *pentagon* cell of resolution `parentRes`, + // write an array of all its children at resolution `childRes`. + // + // If `nullEvery > 0`, then modify the array to have H3_NULL + // every `nullEvery` indices. + H3Index pParent = 0x80c3fffffffffff; // res 0 pentagon + H3Index p; + H3_EXPORT(cellToCenterChild)(pParent, parentRes, &p); + + CellArray ca; + + H3_EXPORT(cellToChildrenSize)(p, childRes, &(ca.N)); + ca.cells = calloc(ca.N, sizeof(H3Index)); + H3_EXPORT(cellToChildren)(p, childRes, ca.cells); + + if (nullEvery > 0) { + // Note: `isValidCell` should return False on H3_NULL values. + for (int64_t i = 0; i < ca.N; i += nullEvery) { + ca.cells[i] = H3_NULL; + } + } + + return ca; +} + +static inline void runValidation(const CellArray ca) { + // Apply `isValidCell` to every element of `ca.cells`. + for (int64_t i = 0; i < ca.N; i++) { + H3_EXPORT(isValidCell)(ca.cells[i]); + } +} + +CellArray ca; + +BEGIN_BENCHMARKS(); + +// pentagon 2->8 +ca = pentagonSetup(2, 8, 0); +BENCHMARK(pentagonChildren_2_8, 1000, { runValidation(ca); }); +free(ca.cells); + +// pentagon 8->14 +ca = pentagonSetup(8, 14, 0); +BENCHMARK(pentagonChildren_8_14, 1000, { runValidation(ca); }); +free(ca.cells); + +// pentagon 8->14; H3_NULL every 2 +ca = pentagonSetup(8, 14, 2); +BENCHMARK(pentagonChildren_8_14_null_2, 1000, { runValidation(ca); }); +free(ca.cells); + +// pentagon 8->14; H3_NULL every 10 +ca = pentagonSetup(8, 14, 10); +BENCHMARK(pentagonChildren_8_14_null_10, 1000, { runValidation(ca); }); +free(ca.cells); + +// pentagon 8->14; H3_NULL every 100 +ca = pentagonSetup(8, 14, 100); +BENCHMARK(pentagonChildren_8_14_null_100, 1000, { runValidation(ca); }); +free(ca.cells); + +END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkPolyfill.c b/src/apps/benchmarks/benchmarkPolyfill.c deleted file mode 100644 index 072fa1f6b..000000000 --- a/src/apps/benchmarks/benchmarkPolyfill.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "algos.h" -#include "benchmark.h" -#include "h3api.h" -#include "stackAlloc.h" - -// Fixtures -GeoCoord sfVerts[] = { - {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, - {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, - {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; -Geofence sfGeofence; -GeoPolygon sfGeoPolygon; - -GeoCoord alamedaVerts[] = {{0.6597959342671712, -2.133241848488897}, - {0.6597959348850178, -2.133241848495878}, - {0.6598352639563587, -2.1331688423977755}, - {0.6601346536539207, -2.13270417124178}, - {0.6601594763880223, -2.1326680320633344}, - {0.6601512007732382, -2.1326594176574534}, - {0.6598535076212304, -2.1323049630593562}, - {0.6596565748646488, -2.132069889917591}, - {0.6594645035394391, -2.131843148468039}, - {0.6593438094209757, -2.1316994860539844}, - {0.6591174422311021, -2.131429776816562}, - {0.658849344286881, -2.1311111485483867}, - {0.6588348862079956, -2.1310988536794455}, - {0.6586273138317915, -2.131668420800747}, - {0.6583729538174264, -2.132370426573979}, - {0.6582479206289285, -2.132718691911663}, - {0.6582322393220743, -2.1327614200082317}, - {0.6583003647098981, -2.132837478687196}, - {0.6584457274847966, -2.132827956758973}, - {0.6585526679060995, -2.1330231566043203}, - {0.6587379099516777, -2.1331602726234538}, - {0.6587273684736642, -2.1332676321559063}, - {0.6584638025857692, -2.133305719954319}, - {0.6583545950288919, -2.1334323622944993}, - {0.6584427148370682, -2.1335885223323947}, - {0.6584715236640714, -2.133649780409862}, - {0.6584715242505019, -2.133649780481421}, - {0.658474662092443, -2.1336459234695804}, - {0.6591666596433436, -2.1348354004882926}, - {0.6591809355063646, -2.1348424115474565}, - {0.6593477498700266, -2.1351460576998926}, - {0.6597155087395117, -2.1351049454274}, - {0.6597337410387994, -2.135113899444683}, - {0.6598277083823935, -2.1351065432309517}, - {0.659837290351688, -2.1350919904836627}, - {0.6598391300107502, -2.1350911731005957}, - {0.6598335712627461, -2.1350732321630828}, - {0.6597162034032434, -2.134664026354221}, - {0.6596785831942451, -2.134651647657116}, - {0.6596627824684727, -2.13458880305965}, - {0.6596785832500957, -2.134530719130462}, - {0.6596093592822273, -2.13428052987356}, - {0.6596116166352313, -2.134221493755564}, - {0.6595973199434513, -2.134146270344056}, - {0.6595536764042369, -2.1340805688066653}, - {0.6594611172376618, -2.133753252031165}, - {0.6594829406269346, -2.1337342082305697}, - {0.6594897134102581, -2.1337104032834757}, - {0.6597920983773051, -2.1332343063312775}, - {0.6597959342671712, -2.133241848488897}}; -Geofence alamedaGeofence; -GeoPolygon alamedaGeoPolygon; - -GeoCoord southernVerts[] = {{0.6367481147484843, -2.1290865397798906}, - {0.6367481152301953, -2.129086539469222}, - {0.6367550754426818, -2.128887436716856}, - {0.6367816002113981, -2.1273204058681094}, - {0.6380814125349741, -2.127201274803692}, - {0.6388614350074809, -2.12552061082428}, - {0.6393520289210095, -2.124274316938293}, - {0.639524834205869, -2.122168447308359}, - {0.6405714857447717, -2.122083222593005}, - {0.640769478635285, -2.120979885974894}, - {0.6418936996869471, -2.1147667448862255}, - {0.6419094141707652, -2.1146521242709584}, - {0.6269997808948107, -2.1038647304637257}, - {0.6252080524974937, -2.1195521728170457}, - {0.626379700264057, -2.1203708632511162}, - {0.6282200029232767, -2.1210412050690723}, - {0.6283657301211779, -2.1219496416754393}, - {0.6305651783819565, -2.123628532238016}, - {0.6308259852882764, -2.124225549648211}, - {0.6317049665784865, -2.124887756638367}, - {0.6323403882676475, -2.1266205835454053}, - {0.6334397909415498, -2.1277211741619553}, - {0.6367481147484843, -2.1290865397798906}}; -Geofence southernGeofence; -GeoPolygon southernGeoPolygon; - -BEGIN_BENCHMARKS(); - -sfGeofence.numVerts = 6; -sfGeofence.verts = sfVerts; -sfGeoPolygon.geofence = sfGeofence; - -alamedaGeofence.numVerts = 50; -alamedaGeofence.verts = alamedaVerts; -alamedaGeoPolygon.geofence = alamedaGeofence; - -southernGeofence.numVerts = 23; -southernGeofence.verts = southernVerts; -southernGeoPolygon.geofence = southernGeofence; - -int numHexagons; - -BENCHMARK(polyfillSF, 500, { - numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); - H3_EXPORT(polyfill)(&sfGeoPolygon, 9, hexagons); -}); - -BENCHMARK(polyfillAlameda, 500, { - numHexagons = H3_EXPORT(maxPolyfillSize)(&alamedaGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); - H3_EXPORT(polyfill)(&alamedaGeoPolygon, 9, hexagons); -}); - -BENCHMARK(polyfillSouthernExpansion, 10, { - numHexagons = H3_EXPORT(maxPolyfillSize)(&southernGeoPolygon, 9); - STACK_ARRAY_CALLOC(H3Index, hexagons, numHexagons); - H3_EXPORT(polyfill)(&southernGeoPolygon, 9, hexagons); -}); - -END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkPolygon.c b/src/apps/benchmarks/benchmarkPolygon.c index e61907ad8..461f125bd 100644 --- a/src/apps/benchmarks/benchmarkPolygon.c +++ b/src/apps/benchmarks/benchmarkPolygon.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,132 +19,132 @@ #include "polygon.h" // Fixtures -GeoCoord coord = {0.6593020122281105, -2.136646587644049}; +LatLng coord = {0.6593020122281105, -2.136646587644049}; -GeoCoord smallVerts[] = {{0.6593216174404631, -2.136686544190228}, - {0.6592922488566673, -2.1367052400423}, - {0.6592659902057862, -2.136683255590617}, - {0.6592690997315311, -2.136642575268508}, - {0.6592984683133152, -2.1366238782059224}, - {0.6593247273713713, -2.136645862675915}, - {0.6593216174404631, -2.136686544190228}}; -Geofence smallGeofence; +LatLng smallVerts[] = {{0.6593216174404631, -2.136686544190228}, + {0.6592922488566673, -2.1367052400423}, + {0.6592659902057862, -2.136683255590617}, + {0.6592690997315311, -2.136642575268508}, + {0.6592984683133152, -2.1366238782059224}, + {0.6593247273713713, -2.136645862675915}, + {0.6593216174404631, -2.136686544190228}}; +GeoLoop smallGeoLoop; BBox smallBBox; -GeoCoord largeVerts[] = {{0.659094230575688, -2.1371021015485354}, - {0.6590648582999955, -2.137120785446624}, - {0.6590386025000088, -2.1370988011284138}, - {0.6590417185683777, -2.1370581328924323}, - {0.6590154614299164, -2.1370361492494108}, - {0.6590185761584009, -2.136995480477803}, - {0.6589923176815468, -2.136973497510139}, - {0.6589954310701313, -2.1369328282032267}, - {0.6589691712549669, -2.13691084591109}, - {0.6589722833036354, -2.136870176069197}, - {0.6589460221502428, -2.1368481944527566}, - {0.6589491328589803, -2.1368075240762017}, - {0.658922870367441, -2.136785543135628}, - {0.6589259797362319, -2.136744872224736}, - {0.6588997159066284, -2.1367228919601997}, - {0.6589028239354577, -2.13668222051529}, - {0.658876558767872, -2.1366602409269593}, - {0.6588796654567243, -2.136619568948354}, - {0.6589090377185067, -2.136600875366403}, - {0.6589121434726317, -2.136560201662654}, - {0.6589415152070064, -2.1365415063736677}, - {0.6589446200261924, -2.136500830944929}, - {0.6589739912329232, -2.1364821339488738}, - {0.6589770951169582, -2.136441456795302}, - {0.659006465795809, -2.136422758092143}, - {0.6590095687444818, -2.1363820792138917}, - {0.6590389388952168, -2.136363378803596}, - {0.6590420409083151, -2.136322698200821}, - {0.6590714105306988, -2.1363039960833543}, - {0.659074511608011, -2.1362633137562117}, - {0.6591038807018073, -2.1362446099315373}, - {0.6591069808431212, -2.1362039258801833}, - {0.6591363494080951, -2.1361852203482696}, - {0.6591626178344537, -2.136207200077111}, - {0.6591919858731505, -2.136188494047296}, - {0.6592182533686533, -2.1362104744708654}, - {0.6592476208809147, -2.136191767943126}, - {0.6592738874454308, -2.136213749061465}, - {0.6593032544310998, -2.136195042035775}, - {0.6593295200644976, -2.136217023848928}, - {0.6593588865234161, -2.1361983163252596}, - {0.659385151225565, -2.1362202988332704}, - {0.6594145171575755, -2.1362015908116003}, - {0.6594407809283439, -2.136223574014512}, - {0.6594701463332887, -2.1362048654948134}, - {0.6594964091725459, -2.136226849392669}, - {0.659525774050267, -2.1362081403749165}, - {0.659552035957882, -2.1362301249677595}, - {0.6595489325807627, -2.1362708185614188}, - {0.6595751931496329, -2.1362928038322995}, - {0.6595720884311551, -2.1363334968937866}, - {0.6595983476611981, -2.1363554828425366}, - {0.6595952416013771, -2.1363961753715284}, - {0.6596214994925101, -2.1364181619979767}, - {0.6596183920913612, -2.136458853994151}, - {0.659644648643503, -2.1364808412981295}, - {0.6596415399010412, -2.1365215327611633}, - {0.6596677951141098, -2.1365435207425008}, - {0.6596646850303514, -2.1365842116720724}, - {0.659690938904264, -2.136606200330602}, - {0.6596878274792236, -2.1366468907263876}, - {0.6597140800138991, -2.136668880061937}, - {0.6597109672475924, -2.136709569923617}, - {0.6596816023515922, -2.136728269257012}, - {0.6596784886490965, -2.136768957391624}, - {0.6596491232239399, -2.1367876550164606}, - {0.6596460085854672, -2.1368283414238483}, - {0.659616642631389, -2.1368470373401607}, - {0.6596135270571513, -2.1368877220201696}, - {0.6595841605743876, -2.1369064162279927}, - {0.6595810440645967, -2.1369470991804675}, - {0.6595516770533838, -2.1369657916798346}, - {0.6595485596082516, -2.137006472904621}, - {0.6595191920688248, -2.1370251636955686}, - {0.6595160736885637, -2.137065843192512}, - {0.6594867056211589, -2.137084532275072}, - {0.6594835863059806, -2.1371252100440166}, - {0.6594542177108332, -2.137143897418225}, - {0.6594279684321879, -2.137121908235114}, - {0.659398599310775, -2.1371405951126565}, - {0.6593723491001167, -2.137118606624661}, - {0.6593429794525963, -2.137137293005565}, - {0.6593167283100556, -2.1371153052126406}, - {0.6592873581365857, -2.137133991096931}, - {0.6592611060622934, -2.1371120039990363}, - {0.6592317353630313, -2.1371306893867383}, - {0.659205482357119, -2.137108702983829}, - {0.6591761111322224, -2.1371273878749673}, - {0.6591498571948209, -2.137105402167002}, - {0.6591204854444472, -2.137124086561602}, - {0.659094230575688, -2.1371021015485354}}; -Geofence largeGeofence; +LatLng largeVerts[] = {{0.659094230575688, -2.1371021015485354}, + {0.6590648582999955, -2.137120785446624}, + {0.6590386025000088, -2.1370988011284138}, + {0.6590417185683777, -2.1370581328924323}, + {0.6590154614299164, -2.1370361492494108}, + {0.6590185761584009, -2.136995480477803}, + {0.6589923176815468, -2.136973497510139}, + {0.6589954310701313, -2.1369328282032267}, + {0.6589691712549669, -2.13691084591109}, + {0.6589722833036354, -2.136870176069197}, + {0.6589460221502428, -2.1368481944527566}, + {0.6589491328589803, -2.1368075240762017}, + {0.658922870367441, -2.136785543135628}, + {0.6589259797362319, -2.136744872224736}, + {0.6588997159066284, -2.1367228919601997}, + {0.6589028239354577, -2.13668222051529}, + {0.658876558767872, -2.1366602409269593}, + {0.6588796654567243, -2.136619568948354}, + {0.6589090377185067, -2.136600875366403}, + {0.6589121434726317, -2.136560201662654}, + {0.6589415152070064, -2.1365415063736677}, + {0.6589446200261924, -2.136500830944929}, + {0.6589739912329232, -2.1364821339488738}, + {0.6589770951169582, -2.136441456795302}, + {0.659006465795809, -2.136422758092143}, + {0.6590095687444818, -2.1363820792138917}, + {0.6590389388952168, -2.136363378803596}, + {0.6590420409083151, -2.136322698200821}, + {0.6590714105306988, -2.1363039960833543}, + {0.659074511608011, -2.1362633137562117}, + {0.6591038807018073, -2.1362446099315373}, + {0.6591069808431212, -2.1362039258801833}, + {0.6591363494080951, -2.1361852203482696}, + {0.6591626178344537, -2.136207200077111}, + {0.6591919858731505, -2.136188494047296}, + {0.6592182533686533, -2.1362104744708654}, + {0.6592476208809147, -2.136191767943126}, + {0.6592738874454308, -2.136213749061465}, + {0.6593032544310998, -2.136195042035775}, + {0.6593295200644976, -2.136217023848928}, + {0.6593588865234161, -2.1361983163252596}, + {0.659385151225565, -2.1362202988332704}, + {0.6594145171575755, -2.1362015908116003}, + {0.6594407809283439, -2.136223574014512}, + {0.6594701463332887, -2.1362048654948134}, + {0.6594964091725459, -2.136226849392669}, + {0.659525774050267, -2.1362081403749165}, + {0.659552035957882, -2.1362301249677595}, + {0.6595489325807627, -2.1362708185614188}, + {0.6595751931496329, -2.1362928038322995}, + {0.6595720884311551, -2.1363334968937866}, + {0.6595983476611981, -2.1363554828425366}, + {0.6595952416013771, -2.1363961753715284}, + {0.6596214994925101, -2.1364181619979767}, + {0.6596183920913612, -2.136458853994151}, + {0.659644648643503, -2.1364808412981295}, + {0.6596415399010412, -2.1365215327611633}, + {0.6596677951141098, -2.1365435207425008}, + {0.6596646850303514, -2.1365842116720724}, + {0.659690938904264, -2.136606200330602}, + {0.6596878274792236, -2.1366468907263876}, + {0.6597140800138991, -2.136668880061937}, + {0.6597109672475924, -2.136709569923617}, + {0.6596816023515922, -2.136728269257012}, + {0.6596784886490965, -2.136768957391624}, + {0.6596491232239399, -2.1367876550164606}, + {0.6596460085854672, -2.1368283414238483}, + {0.659616642631389, -2.1368470373401607}, + {0.6596135270571513, -2.1368877220201696}, + {0.6595841605743876, -2.1369064162279927}, + {0.6595810440645967, -2.1369470991804675}, + {0.6595516770533838, -2.1369657916798346}, + {0.6595485596082516, -2.137006472904621}, + {0.6595191920688248, -2.1370251636955686}, + {0.6595160736885637, -2.137065843192512}, + {0.6594867056211589, -2.137084532275072}, + {0.6594835863059806, -2.1371252100440166}, + {0.6594542177108332, -2.137143897418225}, + {0.6594279684321879, -2.137121908235114}, + {0.659398599310775, -2.1371405951126565}, + {0.6593723491001167, -2.137118606624661}, + {0.6593429794525963, -2.137137293005565}, + {0.6593167283100556, -2.1371153052126406}, + {0.6592873581365857, -2.137133991096931}, + {0.6592611060622934, -2.1371120039990363}, + {0.6592317353630313, -2.1371306893867383}, + {0.659205482357119, -2.137108702983829}, + {0.6591761111322224, -2.1371273878749673}, + {0.6591498571948209, -2.137105402167002}, + {0.6591204854444472, -2.137124086561602}, + {0.659094230575688, -2.1371021015485354}}; +GeoLoop largeGeoLoop; BBox largeBBox; BEGIN_BENCHMARKS(); -smallGeofence.numVerts = 6; -smallGeofence.verts = smallVerts; -bboxFromGeofence(&smallGeofence, &smallBBox); +smallGeoLoop.numVerts = 6; +smallGeoLoop.verts = smallVerts; +bboxFromGeoLoop(&smallGeoLoop, &smallBBox); -largeGeofence.numVerts = 90; -largeGeofence.verts = largeVerts; -bboxFromGeofence(&largeGeofence, &largeBBox); +largeGeoLoop.numVerts = 90; +largeGeoLoop.verts = largeVerts; +bboxFromGeoLoop(&largeGeoLoop, &largeBBox); -BENCHMARK(pointInsideGeofenceSmall, 100000, - { pointInsideGeofence(&smallGeofence, &smallBBox, &coord); }); +BENCHMARK(pointInsideGeoLoopSmall, 100000, + { pointInsideGeoLoop(&smallGeoLoop, &smallBBox, &coord); }); -BENCHMARK(pointInsideGeofenceLarge, 100000, - { pointInsideGeofence(&largeGeofence, &largeBBox, &coord); }); +BENCHMARK(pointInsideGeoLoopLarge, 100000, + { pointInsideGeoLoop(&largeGeoLoop, &largeBBox, &coord); }); -BENCHMARK(bboxFromGeofenceSmall, 100000, - { bboxFromGeofence(&smallGeofence, &smallBBox); }); +BENCHMARK(bboxFromGeoLoopSmall, 100000, + { bboxFromGeoLoop(&smallGeoLoop, &smallBBox); }); -BENCHMARK(bboxFromGeofenceLarge, 100000, - { bboxFromGeofence(&largeGeofence, &largeBBox); }); +BENCHMARK(bboxFromGeoLoopLarge, 100000, + { bboxFromGeoLoop(&largeGeoLoop, &largeBBox); }); END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkPolygonToCells.c b/src/apps/benchmarks/benchmarkPolygonToCells.c new file mode 100644 index 000000000..3e5fed1db --- /dev/null +++ b/src/apps/benchmarks/benchmarkPolygonToCells.c @@ -0,0 +1,145 @@ +/* + * Copyright 2017, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "algos.h" +#include "benchmark.h" +#include "h3api.h" + +// Fixtures +LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; +GeoLoop sfGeoLoop; +GeoPolygon sfGeoPolygon; + +LatLng alamedaVerts[] = {{0.6597959342671712, -2.133241848488897}, + {0.6597959348850178, -2.133241848495878}, + {0.6598352639563587, -2.1331688423977755}, + {0.6601346536539207, -2.13270417124178}, + {0.6601594763880223, -2.1326680320633344}, + {0.6601512007732382, -2.1326594176574534}, + {0.6598535076212304, -2.1323049630593562}, + {0.6596565748646488, -2.132069889917591}, + {0.6594645035394391, -2.131843148468039}, + {0.6593438094209757, -2.1316994860539844}, + {0.6591174422311021, -2.131429776816562}, + {0.658849344286881, -2.1311111485483867}, + {0.6588348862079956, -2.1310988536794455}, + {0.6586273138317915, -2.131668420800747}, + {0.6583729538174264, -2.132370426573979}, + {0.6582479206289285, -2.132718691911663}, + {0.6582322393220743, -2.1327614200082317}, + {0.6583003647098981, -2.132837478687196}, + {0.6584457274847966, -2.132827956758973}, + {0.6585526679060995, -2.1330231566043203}, + {0.6587379099516777, -2.1331602726234538}, + {0.6587273684736642, -2.1332676321559063}, + {0.6584638025857692, -2.133305719954319}, + {0.6583545950288919, -2.1334323622944993}, + {0.6584427148370682, -2.1335885223323947}, + {0.6584715236640714, -2.133649780409862}, + {0.6584715242505019, -2.133649780481421}, + {0.658474662092443, -2.1336459234695804}, + {0.6591666596433436, -2.1348354004882926}, + {0.6591809355063646, -2.1348424115474565}, + {0.6593477498700266, -2.1351460576998926}, + {0.6597155087395117, -2.1351049454274}, + {0.6597337410387994, -2.135113899444683}, + {0.6598277083823935, -2.1351065432309517}, + {0.659837290351688, -2.1350919904836627}, + {0.6598391300107502, -2.1350911731005957}, + {0.6598335712627461, -2.1350732321630828}, + {0.6597162034032434, -2.134664026354221}, + {0.6596785831942451, -2.134651647657116}, + {0.6596627824684727, -2.13458880305965}, + {0.6596785832500957, -2.134530719130462}, + {0.6596093592822273, -2.13428052987356}, + {0.6596116166352313, -2.134221493755564}, + {0.6595973199434513, -2.134146270344056}, + {0.6595536764042369, -2.1340805688066653}, + {0.6594611172376618, -2.133753252031165}, + {0.6594829406269346, -2.1337342082305697}, + {0.6594897134102581, -2.1337104032834757}, + {0.6597920983773051, -2.1332343063312775}, + {0.6597959342671712, -2.133241848488897}}; +GeoLoop alamedaGeoLoop; +GeoPolygon alamedaGeoPolygon; + +LatLng southernVerts[] = {{0.6367481147484843, -2.1290865397798906}, + {0.6367481152301953, -2.129086539469222}, + {0.6367550754426818, -2.128887436716856}, + {0.6367816002113981, -2.1273204058681094}, + {0.6380814125349741, -2.127201274803692}, + {0.6388614350074809, -2.12552061082428}, + {0.6393520289210095, -2.124274316938293}, + {0.639524834205869, -2.122168447308359}, + {0.6405714857447717, -2.122083222593005}, + {0.640769478635285, -2.120979885974894}, + {0.6418936996869471, -2.1147667448862255}, + {0.6419094141707652, -2.1146521242709584}, + {0.6269997808948107, -2.1038647304637257}, + {0.6252080524974937, -2.1195521728170457}, + {0.626379700264057, -2.1203708632511162}, + {0.6282200029232767, -2.1210412050690723}, + {0.6283657301211779, -2.1219496416754393}, + {0.6305651783819565, -2.123628532238016}, + {0.6308259852882764, -2.124225549648211}, + {0.6317049665784865, -2.124887756638367}, + {0.6323403882676475, -2.1266205835454053}, + {0.6334397909415498, -2.1277211741619553}, + {0.6367481147484843, -2.1290865397798906}}; +GeoLoop southernGeoLoop; +GeoPolygon southernGeoPolygon; + +BEGIN_BENCHMARKS(); + +sfGeoLoop.numVerts = 6; +sfGeoLoop.verts = sfVerts; +sfGeoPolygon.geoloop = sfGeoLoop; + +alamedaGeoLoop.numVerts = 50; +alamedaGeoLoop.verts = alamedaVerts; +alamedaGeoPolygon.geoloop = alamedaGeoLoop; + +southernGeoLoop.numVerts = 23; +southernGeoLoop.verts = southernVerts; +southernGeoPolygon.geoloop = southernGeoLoop; + +int64_t numHexagons; +H3Index *hexagons; + +BENCHMARK(polygonToCellsSF, 500, { + H3_EXPORT(maxPolygonToCellsSize)(&sfGeoPolygon, 9, 0, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsAlameda, 500, { + H3_EXPORT(maxPolygonToCellsSize)(&alamedaGeoPolygon, 9, 0, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(&alamedaGeoPolygon, 9, 0, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSouthernExpansion, 10, { + H3_EXPORT(maxPolygonToCellsSize)(&southernGeoPolygon, 9, 0, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(&southernGeoPolygon, 9, 0, hexagons); + free(hexagons); +}); + +END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkPolygonToCellsExperimental.c b/src/apps/benchmarks/benchmarkPolygonToCellsExperimental.c new file mode 100644 index 000000000..9b69dfeb5 --- /dev/null +++ b/src/apps/benchmarks/benchmarkPolygonToCellsExperimental.c @@ -0,0 +1,207 @@ +/* + * Copyright 2017, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "algos.h" +#include "benchmark.h" +#include "h3api.h" +#include "polyfill.h" +#include "polygon.h" + +// Fixtures +LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; +GeoLoop sfGeoLoop; +GeoPolygon sfGeoPolygon; + +LatLng alamedaVerts[] = {{0.6597959342671712, -2.133241848488897}, + {0.6597959348850178, -2.133241848495878}, + {0.6598352639563587, -2.1331688423977755}, + {0.6601346536539207, -2.13270417124178}, + {0.6601594763880223, -2.1326680320633344}, + {0.6601512007732382, -2.1326594176574534}, + {0.6598535076212304, -2.1323049630593562}, + {0.6596565748646488, -2.132069889917591}, + {0.6594645035394391, -2.131843148468039}, + {0.6593438094209757, -2.1316994860539844}, + {0.6591174422311021, -2.131429776816562}, + {0.658849344286881, -2.1311111485483867}, + {0.6588348862079956, -2.1310988536794455}, + {0.6586273138317915, -2.131668420800747}, + {0.6583729538174264, -2.132370426573979}, + {0.6582479206289285, -2.132718691911663}, + {0.6582322393220743, -2.1327614200082317}, + {0.6583003647098981, -2.132837478687196}, + {0.6584457274847966, -2.132827956758973}, + {0.6585526679060995, -2.1330231566043203}, + {0.6587379099516777, -2.1331602726234538}, + {0.6587273684736642, -2.1332676321559063}, + {0.6584638025857692, -2.133305719954319}, + {0.6583545950288919, -2.1334323622944993}, + {0.6584427148370682, -2.1335885223323947}, + {0.6584715236640714, -2.133649780409862}, + {0.6584715242505019, -2.133649780481421}, + {0.658474662092443, -2.1336459234695804}, + {0.6591666596433436, -2.1348354004882926}, + {0.6591809355063646, -2.1348424115474565}, + {0.6593477498700266, -2.1351460576998926}, + {0.6597155087395117, -2.1351049454274}, + {0.6597337410387994, -2.135113899444683}, + {0.6598277083823935, -2.1351065432309517}, + {0.659837290351688, -2.1350919904836627}, + {0.6598391300107502, -2.1350911731005957}, + {0.6598335712627461, -2.1350732321630828}, + {0.6597162034032434, -2.134664026354221}, + {0.6596785831942451, -2.134651647657116}, + {0.6596627824684727, -2.13458880305965}, + {0.6596785832500957, -2.134530719130462}, + {0.6596093592822273, -2.13428052987356}, + {0.6596116166352313, -2.134221493755564}, + {0.6595973199434513, -2.134146270344056}, + {0.6595536764042369, -2.1340805688066653}, + {0.6594611172376618, -2.133753252031165}, + {0.6594829406269346, -2.1337342082305697}, + {0.6594897134102581, -2.1337104032834757}, + {0.6597920983773051, -2.1332343063312775}, + {0.6597959342671712, -2.133241848488897}}; +GeoLoop alamedaGeoLoop; +GeoPolygon alamedaGeoPolygon; + +LatLng southernVerts[] = {{0.6367481147484843, -2.1290865397798906}, + {0.6367481152301953, -2.129086539469222}, + {0.6367550754426818, -2.128887436716856}, + {0.6367816002113981, -2.1273204058681094}, + {0.6380814125349741, -2.127201274803692}, + {0.6388614350074809, -2.12552061082428}, + {0.6393520289210095, -2.124274316938293}, + {0.639524834205869, -2.122168447308359}, + {0.6405714857447717, -2.122083222593005}, + {0.640769478635285, -2.120979885974894}, + {0.6418936996869471, -2.1147667448862255}, + {0.6419094141707652, -2.1146521242709584}, + {0.6269997808948107, -2.1038647304637257}, + {0.6252080524974937, -2.1195521728170457}, + {0.626379700264057, -2.1203708632511162}, + {0.6282200029232767, -2.1210412050690723}, + {0.6283657301211779, -2.1219496416754393}, + {0.6305651783819565, -2.123628532238016}, + {0.6308259852882764, -2.124225549648211}, + {0.6317049665784865, -2.124887756638367}, + {0.6323403882676475, -2.1266205835454053}, + {0.6334397909415498, -2.1277211741619553}, + {0.6367481147484843, -2.1290865397798906}}; +GeoLoop southernGeoLoop; +GeoPolygon southernGeoPolygon; + +BEGIN_BENCHMARKS(); + +sfGeoLoop.numVerts = 6; +sfGeoLoop.verts = sfVerts; +sfGeoPolygon.geoloop = sfGeoLoop; + +alamedaGeoLoop.numVerts = 50; +alamedaGeoLoop.verts = alamedaVerts; +alamedaGeoPolygon.geoloop = alamedaGeoLoop; + +southernGeoLoop.numVerts = 23; +southernGeoLoop.verts = southernVerts; +southernGeoPolygon.geoloop = southernGeoLoop; + +int64_t numHexagons; +H3Index *hexagons; + +BENCHMARK(polygonToCellsSF_Center, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&sfGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&sfGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSF_Full, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&sfGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&sfGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSF_Overlapping, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsAlameda_Center, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&alamedaGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&alamedaGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsAlameda_Full, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&alamedaGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&alamedaGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsAlameda_Overlapping, 500, { + H3_EXPORT(maxPolygonToCellsSize) + (&alamedaGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&alamedaGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSouthernExpansion_Center, 10, { + H3_EXPORT(maxPolygonToCellsSize) + (&southernGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&southernGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSouthernExpansion_Full, 10, { + H3_EXPORT(maxPolygonToCellsSize) + (&southernGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&southernGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons); + free(hexagons); +}); + +BENCHMARK(polygonToCellsSouthernExpansion_Overlapping, 10, { + H3_EXPORT(maxPolygonToCellsSize) + (&southernGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons); + hexagons = calloc(numHexagons, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental) + (&southernGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, hexagons); + free(hexagons); +}); + +END_BENCHMARKS(); diff --git a/src/apps/benchmarks/benchmarkVertex.c b/src/apps/benchmarks/benchmarkVertex.c new file mode 100644 index 000000000..a0bd6c01d --- /dev/null +++ b/src/apps/benchmarks/benchmarkVertex.c @@ -0,0 +1,65 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "benchmark.h" +#include "h3api.h" +#include "vertex.h" + +// Fixtures. Cells are arbitrary, except that ring2 is all hexagons and +// ring2Pent is centered on a pentagon. + +H3Index hex = 0x89283080ddbffff; +H3Index pentagon = 0x89080000003ffff; + +H3Index ring2[] = { + 0x89283081083ffff, 0x8928308109bffff, 0x8928308108bffff, 0x8928308108fffff, + 0x89283081087ffff, 0x89283081097ffff, 0x89283081093ffff, 0x89283081467ffff, + 0x8928308146fffff, 0x892830810d7ffff, 0x892830810c7ffff, 0x89283081013ffff, + 0x89283081017ffff, 0x892830810bbffff, 0x892830810b3ffff, 0x8928308154bffff, + 0x8928308155bffff, 0x8928308142fffff, 0x8928308142bffff}; +int ring2Count = 19; + +H3Index ring2Pent[] = { + 0x8508008bfffffff, 0x8508000ffffffff, 0x85080077fffffff, 0x85080047fffffff, + 0x85080017fffffff, 0x85080003fffffff, 0x8508000bfffffff, 0x85080073fffffff, + 0x85080057fffffff, 0x850800abfffffff, 0x8508008ffffffff, 0x85080013fffffff, + 0x8508001bfffffff, 0x850800c7fffffff, 0x850800cffffffff, 0x850800bbfffffff}; +int ring2PentCount = 16; + +BEGIN_BENCHMARKS(); + +H3Index *vertexes = calloc(6, sizeof(H3Index)); + +BENCHMARK(cellToVertexes, 10000, { H3_EXPORT(cellToVertexes)(hex, vertexes); }); + +BENCHMARK(cellToVertexesPent, 10000, { + H3_EXPORT(cellToVertexes)(pentagon, vertexes); +}); + +BENCHMARK(cellToVertexesRing, 10000, { + for (int i = 0; i < ring2Count; i++) { + H3_EXPORT(cellToVertexes)(ring2[i], vertexes); + } +}); + +BENCHMARK(cellToVertexesRingPent, 10000, { + for (int i = 0; i < ring2PentCount; i++) { + H3_EXPORT(cellToVertexes)(ring2Pent[i], vertexes); + } +}); + +free(vertexes); + +END_BENCHMARKS(); diff --git a/src/apps/filters/cellToBoundary.c b/src/apps/filters/cellToBoundary.c new file mode 100644 index 000000000..26671b3f5 --- /dev/null +++ b/src/apps/filters/cellToBoundary.c @@ -0,0 +1,113 @@ +/* + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lng + * cell boundaries + * + * See `cellToBoundary --help` for usage. + * + * The program reads H3 indexes from stdin and outputs the corresponding + * cell boundaries to stdout, until EOF is encountered. + * + * `--kml` causes KML output to be printed. `--kml-name` and + * `--kml-description` can be used to change the name and description in the + * KML header, which default to "H3 Geometry" and "Generated by + * cellToBoundary" respectively. + * + * Examples: + * + * `cellToBoundary < indexes.txt` + * - outputs plain text cell boundaries for the H3 indexes contained + * in the file `indexes.txt` + * + * `cellToBoundary --kml --kml-name "kml title" --kml-description "h3 + * cells" < indexes.txt > cells.kml` + * - creates the KML file `cells.kml` containing the cell boundaries for + * all of the H3 indexes contained in the file `indexes.txt`. + */ + +#include +#include +#include +#include + +#include "args.h" +#include "h3api.h" +#include "kml.h" +#include "utility.h" + +void doCell(H3Index h, int isKmlOut) { + CellBoundary b; + H3_EXPORT(cellToBoundary)(h, &b); + + char label[BUFF_SIZE]; + H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); + + if (isKmlOut) { + outputBoundaryKML(&b, label); + } else { + printf("%s\n", label); + cellBoundaryPrintln(&b); + } +} + +int main(int argc, char *argv[]) { + Arg helpArg = ARG_HELP; + DEFINE_INDEX_ARG(index, indexArg); + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); + + Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; + + if (parseArgs(argc, argv, 5, args, &helpArg, + "Converts indexes to latitude/longitude cell boundaries in " + "degrees")) { + return helpArg.found ? 0 : 1; + } + + if (kmlArg.found) { + char *kmlName = "H3 Geometry"; + if (kmlNameArg.found) kmlName = userKmlName; + + char *kmlDesc = "Generated by cellToBoundary"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; + + kmlPtsHeader(kmlName, kmlDesc); + } + + if (indexArg.found) { + doCell(index, kmlArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, kmlArg.found); + } + } + + if (kmlArg.found) kmlPtsFooter(); +} diff --git a/src/apps/filters/cellToLatLng.c b/src/apps/filters/cellToLatLng.c new file mode 100644 index 000000000..223fc59c6 --- /dev/null +++ b/src/apps/filters/cellToLatLng.c @@ -0,0 +1,112 @@ +/* + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lng + * cell center point + * + * See `cellToLatLng --help` for usage. + * + * The program reads H3 indexes from stdin and outputs the corresponding + * cell center points to stdout, until EOF is encountered. The H3 indexes + * should be in integer form. + * + * `--kml` causes KML output to be printed. `--kml-name` and + * `--kml-description` can be used to change the name and description in the + * KML header, which default to "H3 Geometry" and "Generated by cellToLatLng" + * respectively. + * + * Examples: + * + * `cellToLatLng < indexes.txt` + * - outputs plain text cell center points for the H3 indexes contained + * in the file `indexes.txt` + * + * `cellToLatLng --kml --kml-name "kml title" --kml-description "h3 cells" < + * indexes.txt > cells.kml` + * - creates the KML file `cells.kml` containing the cell center points + * for all of the H3 indexes contained in the file `indexes.txt`. + */ + +#include + +#include "args.h" +#include "h3api.h" +#include "kml.h" +#include "utility.h" + +void doCell(H3Index h, int isKmlOut) { + LatLng g; + H3_EXPORT(cellToLatLng)(h, &g); + + char label[BUFF_SIZE]; + + if (isKmlOut) { + H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); + + outputPointKML(&g, label); + } else { + printf("%.10lf %.10lf\n", H3_EXPORT(radsToDegs)(g.lat), + H3_EXPORT(radsToDegs)(g.lng)); + } +} + +int main(int argc, char *argv[]) { + Arg helpArg = ARG_HELP; + DEFINE_INDEX_ARG(index, indexArg); + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); + + Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg}; + + if (parseArgs(argc, argv, 5, args, &helpArg, + "Converts indexes to latitude/longitude center coordinates " + "in degrees")) { + return helpArg.found ? 0 : 1; + } + + if (kmlArg.found) { + char *kmlName = "H3 Geometry"; + if (kmlNameArg.found) kmlName = userKmlName; + + char *kmlDesc = "Generated by cellToLatLng"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; + + kmlPtsHeader(kmlName, kmlDesc); + } + + if (indexArg.found) { + doCell(index, kmlArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, kmlArg.found); + } + } + + if (kmlArg.found) kmlPtsFooter(); +} diff --git a/src/apps/filters/cellToLocalIj.c b/src/apps/filters/cellToLocalIj.c new file mode 100644 index 000000000..8c742f1b9 --- /dev/null +++ b/src/apps/filters/cellToLocalIj.c @@ -0,0 +1,97 @@ +/* + * Copyright 2018-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from H3 indexes to local IJ + * coordinates. + * + * See `cellToLocalIj --help` for usage. + * + * The program reads H3 indexes from stdin and outputs the corresponding + * IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the + * IJ coordinates could not be obtained. + * + * `origin` indicates the origin (or anchoring) index for the IJ coordinate + * space. + * + * This program has the same limitations as the `cellToLocalIj` + * function. + */ + +#include +#include +#include + +#include "args.h" +#include "h3api.h" +#include "utility.h" + +void doCell(H3Index h, H3Index origin) { + CoordIJ ij; + if (H3_EXPORT(cellToLocalIj)(origin, h, 0, &ij)) { + printf("NA\n"); + } else { + printf("%d %d\n", ij.i, ij.j); + } +} + +int main(int argc, char *argv[]) { + H3Index origin = 0; + + Arg helpArg = ARG_HELP; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .required = true, + .helpText = + "Origin (anchoring index) for the local coordinate system."}; + DEFINE_INDEX_ARG(index, indexArg); + + Arg *args[] = {&helpArg, &originArg, &indexArg}; + const int numArgs = 3; + const char *helpText = "Converts H3 indexes to local IJ coordinates"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (!H3_EXPORT(isValidCell)(origin)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Origin is invalid.", NULL); + return 1; + } + + if (indexArg.found) { + doCell(index, origin); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, origin); + } + } +} diff --git a/src/apps/filters/geoToH3.c b/src/apps/filters/geoToH3.c deleted file mode 100644 index 21aeaeaae..000000000 --- a/src/apps/filters/geoToH3.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from lat/lon coordinates to integer - * H3 indexes - * - * usage: `geoToH3 resolution` - * - * The program reads lat/lon pairs from stdin until EOF is encountered. For - * each lat/lon the program outputs to stdout the integer H3 index of the - * containing cell at the specified resolution. - * - * The stdin input should have the following format (lat/lon in decimal - * degrees): - * - * lat0 lon0 - * lat1 lon1 - * ... - * latN lonN - */ - -#include -#include -#include "coordijk.h" -#include "h3Index.h" -#include "utility.h" - -int main(int argc, char* argv[]) { - // get the command line argument resolution - if (argc != 2) { - fprintf(stderr, "usage: %s resolution\n", argv[0]); - exit(1); - } - - int res; - if (!sscanf(argv[1], "%d", &res)) error("parsing resolution"); - - // process the lat/lon's on stdin - char buff[BUFF_SIZE]; - double lat, lon; - while (1) { - // get a lat/lon from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading lat/lon"); - } - - if (sscanf(buff, "%lf %lf", &lat, &lon) != 2) error("parsing lat/lon"); - - // convert to H3 - GeoCoord g; - setGeoDegs(&g, lat, lon); - - H3Index h = H3_EXPORT(geoToH3)(&g, res); - - h3Println(h); - } -} diff --git a/src/apps/filters/gridDisk.c b/src/apps/filters/gridDisk.c new file mode 100644 index 000000000..48296446e --- /dev/null +++ b/src/apps/filters/gridDisk.c @@ -0,0 +1,108 @@ +/* + * Copyright 2016-2017, 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from integer H3 indexes to + * k-rings + * + * See `gridDisk --help` for usage. + * + * The program reads H3 indexes from stdin until EOF and outputs + * the H3 indexes within k-ring `k` to stdout. + * + * --print-distances may be specified to also print the grid distance + * from the origin index. + */ + +#include +#include +#include +#include + +#include "args.h" +#include "h3api.h" +#include "utility.h" + +void doCell(H3Index h, int k, int printDistances) { + int64_t maxSize; + H3_EXPORT(maxGridDiskSize)(k, &maxSize); + H3Index *rings = calloc(maxSize, sizeof(H3Index)); + int *distances = calloc(maxSize, sizeof(int)); + H3_EXPORT(gridDiskDistances)(h, k, rings, distances); + + for (int64_t i = 0; i < maxSize; i++) { + if (rings[i] != 0) { + h3Print(rings[i]); + if (printDistances) { + printf(" %d\n", distances[i]); + } else { + printf("\n"); + } + } + } + + free(distances); + free(rings); +} + +int main(int argc, char *argv[]) { + int k = 0; + H3Index origin = 0; + + Arg helpArg = ARG_HELP; + Arg kArg = {.names = {"-k", NULL}, + .required = true, + .scanFormat = "%d", + .valueName = "k", + .value = &k, + .helpText = "Radius in hexagons."}; + Arg printDistancesArg = { + .names = {"-d", "--print-distances"}, + .helpText = "Print distance from origin after each index."}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .helpText = + "Origin, or not specified to read origins from standard input."}; + + Arg *args[] = {&helpArg, &kArg, &printDistancesArg, &originArg}; + + if (parseArgs(argc, argv, 4, args, &helpArg, + "Print indexes k distance away from the origin")) { + return helpArg.found ? 0 : 1; + } + + if (originArg.found) { + doCell(origin, k, printDistancesArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, k, printDistancesArg.found); + } + } +} diff --git a/src/apps/filters/gridDiskUnsafe.c b/src/apps/filters/gridDiskUnsafe.c new file mode 100644 index 000000000..17f3dfbea --- /dev/null +++ b/src/apps/filters/gridDiskUnsafe.c @@ -0,0 +1,100 @@ +/* + * Copyright 2016-2017, 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from integer H3 indexes to + * k-rings + * + * See `gridDiskUnsafe --help` for usage. + * + * The program reads H3 indexes from stdin until EOF and outputs + * the H3 indexes within k-ring `k` to stdout. Requires all indexes + * being evaluated to be hexagons, and produces output in a spiralling + * order. + * + * If a pentagon or pentagon distortion is encountered, 0 is printed + * as the only output. + */ + +#include +#include +#include + +#include "args.h" +#include "h3api.h" +#include "utility.h" + +void doCell(H3Index h, int k) { + int64_t maxSize; + H3_EXPORT(maxGridDiskSize)(k, &maxSize); + H3Index *rings = calloc(maxSize, sizeof(H3Index)); + + if (!H3_EXPORT(gridDiskUnsafe)(h, k, rings)) { + for (int64_t i = 0; i < maxSize; i++) { + h3Println(rings[i]); + } + } else { + printf("0\n"); + } + + free(rings); +} + +int main(int argc, char *argv[]) { + int k = 0; + H3Index origin = 0; + + Arg helpArg = ARG_HELP; + Arg kArg = {.names = {"-k", NULL}, + .required = true, + .scanFormat = "%d", + .valueName = "k", + .value = &k, + .helpText = "Radius in hexagons."}; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .helpText = + "Origin, or not specified to read origins from standard input."}; + const int numArgs = 3; + Arg *args[] = {&helpArg, &kArg, &originArg}; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, + "Print indexes k distance away from the origin")) { + return helpArg.found ? 0 : 1; + } + + if (originArg.found) { + doCell(origin, k); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } + + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, k); + } + } +} diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c new file mode 100644 index 000000000..bf1e507b2 --- /dev/null +++ b/src/apps/filters/h3.c @@ -0,0 +1,3015 @@ +/* + * Copyright 2021, 2024 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief cli app that exposes most of the H3 C library for scripting + * + * See `h3 --help` for usage. + */ + +#include + +#include "h3api.h" + +#ifdef _WIN32 + +#define strcasecmp _stricmp + +#else + +#include + +#endif + +#include "args.h" +#include "h3Index.h" +#include "utility.h" + +#define BUFFER_SIZE 1500 +#define BUFFER_SIZE_LESS_CELL 1485 +#define BUFFER_SIZE_WITH_NULL 1501 + +#define PARSE_SUBCOMMAND(argc, argv, args) \ + if (parseArgs(argc, argv, sizeof(args) / sizeof(Arg *), args, &helpArg, \ + args[0]->helpText)) { \ + return E_SUCCESS; \ + } + +#define SUBCOMMAND(name, help) \ + Arg name##Arg = {.names = {#name}, .helpText = help}; \ + H3Error name##Cmd(int argc, char *argv[]) + +struct Subcommand { + char *name; + Arg *arg; + H3Error (*subcommand)(int, char **); +}; + +#define SUBCOMMANDS_INDEX \ + H3Error generalHelp(int argc, char *argv[]); \ + struct Subcommand subcommands[] = { +#define SUBCOMMAND_INDEX(s) {.name = #s, .arg = &s##Arg, .subcommand = &s##Cmd}, + +#define END_SUBCOMMANDS_INDEX \ + {.name = "--help", .arg = &helpArg, .subcommand = generalHelp}, { \ + .name = "-h", .arg = &helpArg, .subcommand = generalHelp \ + } \ + } \ + ; \ + \ + H3Error generalHelp(int argc, char *argv[]) { \ + int arglen = sizeof(subcommands) / sizeof(subcommands[0]) - 1; \ + Arg **args = calloc(arglen, sizeof(Arg *)); \ + if (args == NULL) { \ + fprintf(stderr, "Failed to allocate memory for argument parsing"); \ + exit(1); \ + } \ + args[0] = &helpArg; \ + for (int i = 0; i < arglen - 1; i++) { \ + args[i + 1] = subcommands[i].arg; \ + } \ + \ + const char *helpText = \ + "Please use one of the subcommands listed to perform an H3 " \ + "calculation. Use h3 --help for details on the " \ + "usage of " \ + "any subcommand."; \ + if (parseArgs(argc, argv, arglen, args, &helpArg, helpText)) { \ + free(args); \ + return E_SUCCESS; \ + } else { \ + free(args); \ + return E_FAILED; \ + } \ + } + +#define DISPATCH_SUBCOMMAND() \ + for (int i = 0; i < sizeof(subcommands) / sizeof(subcommands[0]); i++) { \ + if (has(subcommands[i].name, 1, argv)) { \ + H3Error err = subcommands[i].subcommand(argc, argv); \ + if (err != 0) { \ + fprintf(stderr, "Error %i: %s\n", err, \ + H3_EXPORT(describeH3Error)(err)); \ + } \ + return err; \ + } \ + } + +bool has(char *subcommand, int level, char *argv[]) { + return strcasecmp(subcommand, argv[level]) == 0; +} + +Arg helpArg = ARG_HELP; + +#define DEFINE_FORMAT_ARG(desc) \ + char format[8] = {0}; \ + Arg formatArg = {.names = {"-f", "--format"}, \ + .scanFormat = "%7s", \ + .value = format, \ + .valueName = "FMT", \ + .helpText = desc} + +/// Indexing subcommands + +SUBCOMMAND(cellToLatLng, "Convert an H3Cell to a coordinate") { + DEFINE_FORMAT_ARG( + "'json' for [lat, lng], 'wkt' for a WKT POINT, 'newline' for " + "lat\\nlng\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellToLatLngArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + LatLng ll; + int valid = H3_EXPORT(isValidCell)(cell); + if (valid == 0) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(cellToLatLng)(cell, &ll); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[%.10lf, %.10lf]\n", H3_EXPORT(radsToDegs)(ll.lat), + H3_EXPORT(radsToDegs)(ll.lng)); + } else if (strcmp(format, "wkt") == 0) { + // Using WKT formatting for the output. TODO: Add support for JSON + // formatting + printf("POINT(%.10lf %.10lf)\n", H3_EXPORT(radsToDegs)(ll.lng), + H3_EXPORT(radsToDegs)(ll.lat)); + } else if (strcmp(format, "newline") == 0) { + printf("%.10lf\n%.10lf\n", H3_EXPORT(radsToDegs)(ll.lat), + H3_EXPORT(radsToDegs)(ll.lng)); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(latLngToCell, + "Convert degrees latitude/longitude coordinate to an H3 cell") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n " + "(Default: json)"); + int res = 0; + double lat = 0; + double lng = 0; + + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg latArg = {.names = {"--lat", "--latitude"}, + .required = true, + .scanFormat = "%lf", + .valueName = "lat", + .value = &lat, + .helpText = "Latitude in degrees."}; + Arg lngArg = {.names = {"--lng", "--longitude"}, + .required = true, + .scanFormat = "%lf", + .valueName = "lng", + .value = &lng, + .helpText = "Longitude in degrees."}; + + Arg *args[] = {&latLngToCellArg, &helpArg, &resArg, + &latArg, &lngArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + LatLng ll = {.lat = H3_EXPORT(degsToRads)(lat), + .lng = H3_EXPORT(degsToRads)(lng)}; + + H3Index c; + H3Error err = H3_EXPORT(latLngToCell)(&ll, res, &c); + if (err) { + return err; + } + + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", c); + } else if (strcmp(format, "newline") == 0) { + h3Println(c); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(cellToBoundary, + "Convert an H3 cell to a polygon defining its boundary") { + DEFINE_FORMAT_ARG( + "'json' for [[lat, lng], ...], 'wkt' for a WKT POLYGON, 'newline' for " + "lat\\nlng\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellToBoundaryArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + CellBoundary cb; + int valid = H3_EXPORT(isValidCell)(cell); + if (valid == 0) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(cellToBoundary)(cell, &cb); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("["); + for (int i = 0; i < cb.numVerts - 1; i++) { + LatLng *ll = &cb.verts[i]; + printf("[%.10lf, %.10lf], ", H3_EXPORT(radsToDegs)(ll->lat), + H3_EXPORT(radsToDegs)(ll->lng)); + } + printf("[%.10lf, %.10lf]]\n", + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lat), + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lng)); + } else if (strcmp(format, "wkt") == 0) { + printf("POLYGON(("); + for (int i = 0; i < cb.numVerts; i++) { + LatLng *ll = &cb.verts[i]; + printf("%.10lf %.10lf, ", H3_EXPORT(radsToDegs)(ll->lng), + H3_EXPORT(radsToDegs)(ll->lat)); + } + // WKT has the first and last points match, so re-print the first one + printf("%.10lf %.10lf))\n", H3_EXPORT(radsToDegs)(cb.verts[0].lng), + H3_EXPORT(radsToDegs)(cb.verts[0].lat)); + } else if (strcmp(format, "newline") == 0) { + for (int i = 0; i < cb.numVerts; i++) { + LatLng *ll = &cb.verts[i]; + printf("%.10lf\n%.10lf\n", H3_EXPORT(radsToDegs)(ll->lat), + H3_EXPORT(radsToDegs)(ll->lng)); + } + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +/// Inspection subcommands + +SUBCOMMAND(getResolution, "Extracts the resolution (0 - 15) from the H3 cell") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&getResolutionArg, &helpArg, &cellArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // TODO: Should there be a general `isValidIndex`? + H3Error cellErr = H3_EXPORT(isValidCell)(cell); + H3Error edgeErr = H3_EXPORT(isValidDirectedEdge)(cell); + H3Error vertErr = H3_EXPORT(isValidVertex)(cell); + if (cellErr && edgeErr && vertErr) { + return cellErr; + } + // If we got here, we can use `getResolution` safely, as this is one of the + // few functions that doesn't do any error handling (for some reason? I + // don't see how this would ever be in a hot loop anywhere. + int res = H3_EXPORT(getResolution)(cell); + printf("%i\n", res); + return E_SUCCESS; +} + +SUBCOMMAND(getBaseCellNumber, + "Extracts the base cell number (0 - 121) from the H3 cell") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&getBaseCellNumberArg, &helpArg, &cellArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // TODO: Should there be a general `isValidIndex`? + H3Error cellErr = H3_EXPORT(isValidCell)(cell); + H3Error edgeErr = H3_EXPORT(isValidDirectedEdge)(cell); + H3Error vertErr = H3_EXPORT(isValidVertex)(cell); + if (cellErr && edgeErr && vertErr) { + return cellErr; + } + // If we got here, we can use `getResolution` safely, as this is one of the + // few functions that doesn't do any error handling (for some reason? I + // don't see how this would ever be in a hot loop anywhere. + int baseCell = H3_EXPORT(getBaseCellNumber)(cell); + printf("%i\n", baseCell); + return E_SUCCESS; +} + +SUBCOMMAND(stringToInt, "Converts an H3 index in string form to integer form") { + char *rawCell = calloc(16, sizeof(char)); + if (rawCell == NULL) { + fprintf(stderr, "Failed to allocate memory for the H3 index"); + exit(1); + } + Arg rawCellArg = {.names = {"-c", "--cell"}, + .required = true, + .scanFormat = "%s", + .valueName = "cell", + .value = rawCell, + .helpText = "H3 Cell Index"}; + Arg *args[] = {&stringToIntArg, &helpArg, &rawCellArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index c; + H3Error err = H3_EXPORT(stringToH3)(rawCell, &c); + if (err) { + free(rawCell); + return err; + } + printf("%" PRIu64 "\n", c); + free(rawCell); + return E_SUCCESS; +} + +SUBCOMMAND(intToString, "Converts an H3 index in int form to string form") { + H3Index rawCell; + Arg rawCellArg = {.names = {"-c", "--cell"}, + .required = true, + .scanFormat = "%" PRIu64, + .valueName = "cell", + .value = &rawCell, + .helpText = "H3 Cell Index"}; + Arg *args[] = {&intToStringArg, &helpArg, &rawCellArg}; + PARSE_SUBCOMMAND(argc, argv, args); + h3Println(rawCell); + return E_SUCCESS; +} + +SUBCOMMAND(isValidCell, "Checks if the provided H3 index is actually valid") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&isValidCellArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + bool isValid = H3_EXPORT(isValidCell)(cell); + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", isValid ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", isValid); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(isResClassIII, + "Checks if the provided H3 index has a Class III orientation") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&isResClassIIIArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // TODO: Should there be a general `isValidIndex`? + H3Error cellErr = H3_EXPORT(isValidCell)(cell); + H3Error edgeErr = H3_EXPORT(isValidDirectedEdge)(cell); + H3Error vertErr = H3_EXPORT(isValidVertex)(cell); + if (cellErr && edgeErr && vertErr) { + return cellErr; + } + // If we got here, we can use `getResolution` safely, as this is one of the + // few functions that doesn't do any error handling (for some reason? I + // don't see how this would ever be in a hot loop anywhere. + bool isClassIII = H3_EXPORT(isResClassIII)(cell); + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", isClassIII ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", isClassIII); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND( + isPentagon, + "Checks if the provided H3 index is a pentagon instead of a hexagon") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&isPentagonArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // TODO: Should there be a general `isValidIndex`? + H3Error cellErr = H3_EXPORT(isValidCell)(cell); + H3Error edgeErr = H3_EXPORT(isValidDirectedEdge)(cell); + H3Error vertErr = H3_EXPORT(isValidVertex)(cell); + if (cellErr && edgeErr && vertErr) { + return cellErr; + } + // If we got here, we can use `getResolution` safely, as this is one of the + // few functions that doesn't do any error handling (for some reason? I + // don't see how this would ever be in a hot loop anywhere. + bool is = H3_EXPORT(isPentagon)(cell); + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", is ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", is); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(getIcosahedronFaces, + "Returns the icosahedron face numbers (0 - 19) that the H3 index " + "intersects") { + DEFINE_FORMAT_ARG( + "'json' for [faceNum, ...], 'newline' for faceNum\\n... (Default: " + "json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&getIcosahedronFacesArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int faceCount; + H3Error err = H3_EXPORT(maxFaceCount)(cell, &faceCount); + if (err) { + return err; + } + int *faces = calloc(faceCount, sizeof(int)); + if (faces == NULL) { + fprintf(stderr, "Failed to allocate memory for the icosahedron faces"); + exit(1); + } + err = H3_EXPORT(getIcosahedronFaces)(cell, faces); + if (err) { + free(faces); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + bool hasPrinted = false; + printf("["); + for (int i = 0; i < faceCount - 1; i++) { + if (faces[i] != -1) { + if (hasPrinted) { + printf(", "); + } + printf("%i", faces[i]); + hasPrinted = true; + } + } + if (faces[faceCount - 1] != -1) { + if (hasPrinted) { + printf(", "); + } + printf("%i", faces[faceCount - 1]); + } + printf("]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int i = 0; i < faceCount; i++) { + if (faces[i] != -1) { + printf("%i\n", faces[i]); + } + } + } else { + free(faces); + return E_FAILED; + } + free(faces); + return E_SUCCESS; +} + +/// Traversal subcommands + +SUBCOMMAND( + gridDisk, + "Returns an array of a H3 cells within 'k' steps of the origin cell") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int k = 0; + Arg kArg = {.names = {"-k"}, + .required = true, + .scanFormat = "%d", + .valueName = "distance", + .value = &k, + .helpText = "Maximum grid distance for the output set"}; + Arg *args[] = {&gridDiskArg, &helpArg, &cellArg, &kArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(maxGridDiskSize)(k, &len); + if (err) { + return err; + } + H3Index *out = calloc(len, sizeof(H3Index)); + if (out == NULL) { + fprintf(stderr, "Failed to allocate memory for the output H3 cells"); + exit(1); + } + err = H3_EXPORT(gridDisk)(cell, k, out); + if (err) { + free(out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < len; i++) { + if (out[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < len; i++) { + if (out[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", out[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < len; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + free(out); + return E_FAILED; + } + + free(out); + return E_SUCCESS; +} + +SUBCOMMAND( + gridDiskDistances, + "Returns an array of arrays of H3 cells, each array containing cells " + "'k' steps away from the origin cell, based on the outer array index") { + DEFINE_FORMAT_ARG( + "'json' for [[\"CELL\", ...], ...], 'newline' for CELL\\n with an " + "extra newline between rings (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int k = 0; + Arg kArg = {.names = {"-k"}, + .required = true, + .scanFormat = "%d", + .valueName = "distance", + .value = &k, + .helpText = "Maximum grid distance for the output set"}; + Arg *args[] = {&gridDiskDistancesArg, &helpArg, &cellArg, &kArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(maxGridDiskSize)(k, &len); + if (err) { + return err; + } + H3Index *out = calloc(len, sizeof(H3Index)); + if (out == NULL) { + fprintf(stderr, "Failed to allocate memory for the H3 cells"); + exit(1); + } + int *distances = calloc(len, sizeof(int)); + if (distances == NULL) { + fprintf(stderr, "Failed to allocate memory for the distances"); + exit(1); + } + err = H3_EXPORT(gridDiskDistances)(cell, k, out, distances); + if (err) { + free(out); + free(distances); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Man, I wish JSON allowed trailing commas + printf("["); + for (int i = 0; i <= k; i++) { + printf("["); + // We need to figure out how many cells are in each ring. Because of + // pentagons, we can't hardwire this, unfortunately + int count = 0; + for (int j = 0; j < len; j++) { + if (distances[j] == i && out[j] != 0) { + count++; + } + } + // On the second loop, we output cells with a comma except for the + // last one, which we now know + int cellNum = 0; + for (int j = 0; j < len; j++) { + if (distances[j] == i && out[j] != 0) { + cellNum++; + printf("\"%" PRIx64 "\"", out[j]); + if (cellNum != count) { + printf(", "); + } + } + } + // Similarly, we need to check which iteration of the outer array + // we're on and include a comma or not + if (i == k) { + printf("]"); + } else { + printf("], "); + } + } + printf("]\n"); // Always print the newline here so the terminal prompt + // gets its own line + } else if (strcmp(format, "newline") == 0) { + for (int i = 0; i <= k; i++) { + for (int j = 0; j < len; j++) { + if (distances[j] == i && out[j] != 0) { + h3Println(out[j]); + } + } + if (i < k) { + printf("\n"); + } + } + } else { + free(out); + free(distances); + return E_FAILED; + } + free(out); + free(distances); + return E_SUCCESS; +} + +SUBCOMMAND(gridRing, + "Returns an array of H3 cells, each cell 'k' steps away from " + "the origin cell") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int k = 0; + Arg kArg = {.names = {"-k"}, + .required = true, + .scanFormat = "%d", + .valueName = "distance", + .value = &k, + .helpText = "Maximum grid distance for the output set"}; + Arg *args[] = {&gridRingArg, &helpArg, &cellArg, &kArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = k == 0 ? 1 : 6 * k; // The length is fixed for gridRingUnsafe + // since it doesn't support pentagons + H3Index *out = calloc(len, sizeof(H3Index)); + if (out == NULL) { + fprintf(stderr, "Failed to allocate memory for the output H3 indexes"); + exit(1); + } + H3Error err = H3_EXPORT(gridRingUnsafe)(cell, k, out); + if (err) { + // For the CLI, we'll just do things less efficiently if there's an + // error here. If you use `gridDiskDistances` and only pay attention to + // the last array, it's equivalent to a "safe" gridRing call, but + // consumes a lot more temporary memory to do it + int64_t templen = 0; + err = H3_EXPORT(maxGridDiskSize)(k, &templen); + if (err) { + // But we abort if anything fails in here + free(out); + return err; + } + H3Index *temp = calloc(templen, sizeof(H3Index)); + if (temp == NULL) { + fprintf(stderr, + "Failed to allocate memory for a temporary hashset of H3 " + "indexes"); + exit(1); + } + int *distances = calloc(templen, sizeof(int)); + if (distances == NULL) { + fprintf(stderr, + "Failed to allocate memory for the distances of the H3 " + "indexes"); + exit(1); + } + err = H3_EXPORT(gridDiskDistances)(cell, k, temp, distances); + if (err) { + free(out); + free(temp); + free(distances); + return err; + } + // Now, we first re-zero the `out` array in case there's garbage + // anywhere in it from the failed computation. Then we scan through the + // gridDisk output and copy the indexes that are the correct distance + // in. We *should* only be in this path when there's a pentagon + // involved, so we expect the true length of the array to be less than + // what was allocated for `out` in this scenario. + for (int i = 0; i < len; i++) { + out[i] = 0; + } + int64_t count = 0; + for (int64_t i = 0; i < templen; i++) { + if (distances[i] == k && temp[i] != 0) { + out[count] = temp[i]; + count++; + } + } + len = count; + free(temp); + free(distances); + } + // Now that we have the correct data, however we got it, we can print it out + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[ \"%" PRIx64 "\"", out[0]); + for (int64_t i = 1; i < len; i++) { + if (out[i] != 0) { + printf(", \"%" PRIx64 "\"", out[i]); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < len; i++) { + h3Println(out[i]); + } + } else { + free(out); + return E_FAILED; + } + free(out); + return E_SUCCESS; +} + +SUBCOMMAND(gridPathCells, + "Returns an array of H3 cells from the origin cell to the " + "destination cell (inclusive)") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + H3Index origin = 0; + Arg originArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &origin, + .helpText = "The origin H3 cell"}; + H3Index destination = 0; + Arg destinationArg = {.names = {"-d", "--destination"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &destination, + .helpText = "The destination H3 cell"}; + Arg *args[] = {&gridPathCellsArg, &helpArg, &originArg, &destinationArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(gridPathCellsSize)(origin, destination, &len); + if (err) { + return err; + } + H3Index *out = calloc(len, sizeof(H3Index)); + if (out == NULL) { + fprintf(stderr, "Failed to allocate memory for the output H3 indexes"); + exit(1); + } + err = H3_EXPORT(gridPathCells)(origin, destination, out); + if (err) { + free(out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[ \"%" PRIx64 "\"", out[0]); + for (int64_t i = 1; i < len; i++) { + if (out[i] != 0) { + printf(", \"%" PRIx64 "\"", out[i]); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < len; i++) { + h3Println(out[i]); + } + } else { + free(out); + return E_FAILED; + } + free(out); + return E_SUCCESS; +} + +SUBCOMMAND(gridDistance, + "Returns the number of steps along the grid to move from the origin " + "cell to the destination cell") { + H3Index origin = 0; + Arg originArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &origin, + .helpText = "The origin H3 cell"}; + H3Index destination = 0; + Arg destinationArg = {.names = {"-d", "--destination"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &destination, + .helpText = "The destination H3 cell"}; + Arg *args[] = {&gridDistanceArg, &helpArg, &originArg, &destinationArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t distance = 0; + H3Error err = H3_EXPORT(gridDistance)(origin, destination, &distance); + if (err) { + return err; + } + printf("%" PRIx64 "\n", distance); + return E_SUCCESS; +} + +SUBCOMMAND(cellToLocalIj, + "Returns the IJ coordinate for a cell anchored to an origin cell") { + DEFINE_FORMAT_ARG( + "'json' for [I, J], 'newline' for I\\nJ\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + H3Index origin = 0; + Arg originArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &origin, + .helpText = "The origin H3 cell"}; + Arg *args[] = {&cellToLocalIjArg, &helpArg, &cellArg, &originArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + CoordIJ out = {0}; + H3Error err = H3_EXPORT(cellToLocalIj)(origin, cell, 0, &out); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[%i, %i]\n", out.i, out.j); + } else if (strcmp(format, "newline") == 0) { + printf("%i\n%i\n", out.i, out.j); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(localIjToCell, + "Returns the H3 index from a local IJ coordinate anchored to an " + "origin cell") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n (Default: json)"); + H3Index origin = 0; + Arg originArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "cell", + .value = &origin, + .helpText = "The origin H3 cell"}; + int i, j; + Arg iArg = {.names = {"-i"}, + .required = true, + .scanFormat = "%d", + .valueName = "i", + .value = &i, + .helpText = "The I dimension of the IJ coordinate"}; + Arg jArg = {.names = {"-j"}, + .required = true, + .scanFormat = "%d", + .valueName = "j", + .value = &j, + .helpText = "The J dimension of the IJ coordinate"}; + Arg *args[] = {&localIjToCellArg, &helpArg, &originArg, &iArg, &jArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + CoordIJ in = {.i = i, .j = j}; + H3Index out = 0; + H3Error err = H3_EXPORT(localIjToCell)(origin, &in, 0, &out); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", out); + } else if (strcmp(format, "newline") == 0) { + h3Println(out); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +/// Hierarchical subcommands + +SUBCOMMAND(cellToParent, + "Returns the H3 index that is the parent (or higher) of the " + "provided cell") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-14 inclusive, excluding 15 as it can " + "never be a parent"}; + Arg *args[] = {&cellToParentArg, &helpArg, &cellArg, &resArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index parent; + int valid = H3_EXPORT(isValidCell)(cell); + if (valid == 0) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(cellToParent)(cell, res, &parent); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", parent); + } else if (strcmp(format, "newline") == 0) { + h3Println(parent); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(cellToChildren, + "Returns an array of H3 indexes that are the children (or " + "lower) of the provided cell") { + // TODO: This function contains a lot of code that is very similar to + // `gridDisk`. If this happens again we should DRY them. + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 1-15 inclusive, excluding 0 as it can " + "never be a child"}; + Arg *args[] = {&cellToChildrenArg, &helpArg, &cellArg, &resArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(cellToChildrenSize)(cell, res, &len); + if (err) { + return err; + } + H3Index *out = calloc(len, sizeof(H3Index)); + if (out == NULL) { + fprintf(stderr, "Failed to allocate memory for the output H3 cells"); + exit(1); + } + err = H3_EXPORT(cellToChildren)(cell, res, out); + if (err) { + free(out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < len; i++) { + if (out[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < len; i++) { + if (out[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", out[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < len; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + free(out); + return E_FAILED; + } + + free(out); + return E_SUCCESS; +} + +SUBCOMMAND(cellToChildrenSize, + "Returns the maximum number of children for a given cell at the " + "specified child resolution") { + // TODO: Do we want to include this subcommand or no? It can be useful to + // let someone decide for themselves if they really want to run the command + // and get a potentially massive number of cells as the output, but is that + // a concern a CLI user would have? They'd probably just ^C it. + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 1-15 inclusive, excluding 0 as it can " + "never be a child"}; + Arg *args[] = {&cellToChildrenSizeArg, &helpArg, &cellArg, &resArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(cellToChildrenSize)(cell, res, &len); + if (err) { + return err; + } + printf("%" PRId64 "\n", len); + return E_SUCCESS; +} + +SUBCOMMAND( + cellToCenterChild, + "Returns the H3 index that is the centrally-placed child (or lower) of the " + "provided cell") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 1-15 inclusive, excluding 0 as it can " + "never be a child"}; + Arg *args[] = {&cellToCenterChildArg, &helpArg, &cellArg, &resArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index centerChild; + int valid = H3_EXPORT(isValidCell)(cell); + if (valid == 0) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(cellToCenterChild)(cell, res, ¢erChild); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", centerChild); + } else if (strcmp(format, "newline") == 0) { + h3Println(centerChild); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND( + cellToChildPos, + "Returns the position of the child cell within an ordered list of all " + "children of the cell's parent at the specified child resolution") { + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 1-15 inclusive, excluding 0 as it can " + "never be a child"}; + Arg *args[] = {&cellToChildPosArg, &helpArg, &cellArg, &resArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t len = 0; + H3Error err = H3_EXPORT(cellToChildPos)(cell, res, &len); + if (err) { + return err; + } + printf("%" PRId64 "\n", len); + return E_SUCCESS; +} + +SUBCOMMAND(childPosToCell, + "Returns the child cell at a given position and resolution within " + "an ordered list of all children of the parent cell") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 1-15 inclusive, excluding 0 as it can " + "never be a child"}; + int64_t pos; + Arg posArg = { + .names = {"-p", "--position"}, + .required = true, + .scanFormat = "%" PRIi64, + .valueName = "pos", + .value = &pos, + .helpText = + "The child position within the set of children of the parent cell"}; + Arg *args[] = {&childPosToCellArg, &helpArg, &cellArg, &resArg, &posArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index child; + int valid = H3_EXPORT(isValidCell)(cell); + if (valid == 0) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(childPosToCell)(pos, cell, res, &child); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", child); + } else if (strcmp(format, "newline") == 0) { + h3Println(child); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) { + // It's assumed the buffer is a character array of size 1501 to support up + // to 100 cells at a time. If the file pointer is a null pointer, we assume + // the buffer has all of the possible cells already stored in it and go from + // there. Otherwise we continue reading from the file until it's fully + // consumed. On an error, we de-allocate the output buffer and then return + // 0. It's the responsibility of the caller to free the returned buffer and + // the file pointer otherwise. The output array's filled length is set on + // the cellsOffset pointer so it can be used by the caller. + H3Index *cells = calloc(128, sizeof(H3Index)); + int cellsLen = 128; + int bufferOffset = 0; + int cellsOffset = 0; + do { + // Always start from the beginning of the buffer + bufferOffset = 0; + int lastGoodOffset = 0; + H3Index cell = 0; + while (bufferOffset < + BUFFER_SIZE_LESS_CELL) { // Keep consuming as much as possible + // A valid H3 cell is exactly 15 hexadecomical characters. + // Determine if we have a match, otherwise increment + int scanlen = 0; + sscanf(buffer + bufferOffset, "%" PRIx64 "%n", &cell, &scanlen); + if (scanlen != 15) { + cell = 0; + bufferOffset += 1; + } else { + bufferOffset += 16; + lastGoodOffset = bufferOffset; + } + // If we still don't have a cell and we've reached the end, we reset + // the offset and `continue` to trigger another read + if (cell == 0 && bufferOffset == BUFFER_SIZE) { + bufferOffset = 0; + continue; + } else if (cell != 0) { + // Otherwise, we have a cell to shove into the cells array. + cells[cellsOffset] = cell; + cellsOffset += 1; + // Potentially grow our array + if (cellsOffset == cellsLen) { + cellsLen *= 2; + H3Index *newCells = calloc(cellsLen, sizeof(H3Index)); + for (int i = 0; i < cellsOffset; i++) { + newCells[i] = cells[i]; + } + free(cells); + cells = newCells; + } + } + } + // In case there's a valid H3 index that was unfortunately split between + // buffer reads, we take from the lastGoodOffset and copy the rest to + // the beginning of the buffer so it can be re-assembled on the next + // file read. However, we also know that a valid H3 index is 15 + // characters long, so if the lastGoodOffset is 15 or more characters + // away from 1500, we only need to copy those final 14 bytes from the + // end, so if lastGoodOffset is 1485 or less, we force it to 1485 and + // then move the chunk as specified to the beginning and adjust the + // cellStrsOffset. + if (lastGoodOffset < BUFFER_SIZE_LESS_CELL) { + lastGoodOffset = BUFFER_SIZE_LESS_CELL; + } + for (int i = 0; i < BUFFER_SIZE - lastGoodOffset; i++) { + buffer[i] = buffer[i + lastGoodOffset]; + } + bufferOffset = BUFFER_SIZE - lastGoodOffset; + } while (fp != 0 && fread(buffer + bufferOffset, 1, + BUFFER_SIZE - bufferOffset, fp) != 0); + *totalCells = cellsOffset; + return cells; +} + +SUBCOMMAND(compactCells, + "Compacts the provided set of cells as best as possible. The set of " + "input cells must all share the same resolution.") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char cellStrs[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding + Arg cellStrsArg = {.names = {"-c", "--cells"}, + // TODO: Can I use `BUFFER_SIZE` here somehow? + .scanFormat = "%1500c", + .valueName = "CELLS", + .value = &cellStrs, + .helpText = + "The cells to compact. Up to 100 cells if provided " + "as hexadecimals with zero padding."}; + Arg *args[] = {&compactCellsArg, &helpArg, &filenameArg, &cellStrsArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (!filenameArg.found && !cellStrsArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a set of cells " + "to compact to use compactCells"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + size_t cellsOffset = 0; + H3Index *cells = readCellsFromFile(fp, cellStrs, &cellsOffset); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (cells == NULL) { + return E_FAILED; + } + // Now that we have the cells in a buffer and the actual cell count in + // cellsOffset, we can feed this to the H3 C API + H3Index *compactedSet = calloc(cellsOffset, sizeof(H3Index)); + H3Error err = H3_EXPORT(compactCells)(cells, compactedSet, cellsOffset); + if (err) { + free(cells); + free(compactedSet); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < cellsOffset; i++) { + if (compactedSet[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < cellsOffset; i++) { + if (compactedSet[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", compactedSet[i], + j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < cellsOffset; i++) { + if (compactedSet[i] != 0) { + h3Println(compactedSet[i]); + } + } + } else { + free(cells); + free(compactedSet); + return E_FAILED; + } + + free(cells); + free(compactedSet); + return E_SUCCESS; +} + +SUBCOMMAND(uncompactCells, + "Unompacts the provided set of compacted cells." + "The uncompacted " + "cells will be printed one per line to stdout.") { + // TODO: *Most* of this logic is shared with compactCells. See about DRYing + // it. + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char cellStrs[BUFFER_SIZE_WITH_NULL] = { + 0}; // Supports up to 100 cells at a time with zero padding + Arg cellStrsArg = { + .names = {"-c", "--cells"}, + .scanFormat = "%1500c", + .valueName = "CELLS", + .value = &cellStrs, + .helpText = + "The cells to uncompact. Up to 100 cells if provided " + "as hexadecimals with zero padding."}; + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-15 inclusive, that the compacted set " + "should be uncompacted to. Must be greater than or equal " + "to the highest resolution within the compacted set."}; + Arg *args[] = {&uncompactCellsArg, &helpArg, &filenameArg, + &cellStrsArg, &resArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (!filenameArg.found && !cellStrsArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a set of cells " + "to compact to use uncompactCells"); + exit(1); + } + // We use the same consumption logic for both kinds of input, and in fact + // use the cellStrs char array as out input buffer for the file path. The + // only difference between the two is when we reach the end of the buffer. + // If there's a non-null file pointer, we start from the last successful + // consumption from the buffer and move the data following it to the + // beginning of the buffer, then we read some of the file after that and + // slap it on after that and continue the consumption loops, while the other + // path just ends at that point. As we have no idea how many cells we're + // going to load, we allocate enough for 128 cells, but if that's not + // enough, we also have to re-allocate double the number of cells, copy them + // over, and free the old buffer of cells. Doing this manually since we want + // to keep the build process for H3 simple and C's stdlib is pretty bare. + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + size_t cellsOffset = 0; + H3Index *cells = readCellsFromFile(fp, cellStrs, &cellsOffset); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (cells == NULL) { + return E_FAILED; + } + // Now that we have the cells in a buffer and the actual cell count in + // cellsOffset, we can feed this to the H3 C API + int64_t uncompactedSize = 0; + H3Error err = H3_EXPORT(uncompactCellsSize)(cells, cellsOffset, res, + &uncompactedSize); + if (err) { + free(cells); + return err; + } + H3Index *uncompactedSet = calloc(uncompactedSize, sizeof(H3Index)); + err = H3_EXPORT(uncompactCells)(cells, cellsOffset, uncompactedSet, + uncompactedSize, res); + if (err) { + free(cells); + free(uncompactedSet); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < uncompactedSize; i++) { + if (uncompactedSet[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < uncompactedSize; i++) { + if (uncompactedSet[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", uncompactedSet[i], + j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < uncompactedSize; i++) { + if (uncompactedSet[i] != 0) { + h3Println(uncompactedSet[i]); + } + } + } else { + free(cells); + free(uncompactedSet); + return E_FAILED; + } + + free(cells); + free(uncompactedSet); + return E_SUCCESS; +} + +/// Region subcommands + +H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, + GeoPolygon *out) { + // There are two kinds of valid input, an array of arrays of lat, lng values + // defining a singular polygon loop, or an array of array of arrays of lat, + // lng values defining a polygon and zero or more holes. Which kind of input + // this is can be determined by the `[` depth reached before the first + // floating point number is found. This means either 2 or 3 `[`s at the + // beginning are valid, and nothing more than that. + int8_t maxDepth = 0; + int8_t curDepth = 0; + int64_t numVerts = 6; + int64_t curVert = 0; + int64_t curLoop = 0; + LatLng *verts = calloc(numVerts, sizeof(LatLng)); + int strPos = 0; + while (polygonString[strPos] != 0) { + // Load more of the file if we've hit our buffer limit + if (strPos >= BUFFER_SIZE && fp != 0) { + int result = fread(polygonString, 1, BUFFER_SIZE, fp); + strPos = 0; + // If we didn't get any data from the file, we're done. + if (result == 0) { + break; + } + } + // Try to match `[` first + if (polygonString[strPos] == '[') { + curDepth++; + if (curDepth > maxDepth) { + maxDepth = curDepth; + } + if (curDepth > 4) { + // This is beyond the depth for a valid input, so we abort early + free(verts); + return E_FAILED; + } + strPos++; + continue; + } + // Similar matching for `]` + if (polygonString[strPos] == ']') { + curDepth--; + if (curDepth < 0) { + break; + } + strPos++; + // We may need to set up a new geoloop at this point. If the + // curDepth <= maxDepth - 2 then we increment the curLoop and get a + // new one set up. + if (curDepth <= maxDepth - 2) { + if (curLoop == 0) { + out->geoloop.verts = verts; + out->geoloop.numVerts = curVert; + } else { + GeoLoop *holes = calloc(out->numHoles + 1, sizeof(GeoLoop)); + if (holes == 0) { + return E_MEMORY_ALLOC; + } + for (int i = 0; i < out->numHoles; i++) { + holes[i].numVerts = out->holes[i].numVerts; + holes[i].verts = out->holes[i].verts; + } + free(out->holes); + holes[out->numHoles].verts = verts; + holes[out->numHoles].numVerts = curVert; + out->holes = holes; + out->numHoles++; + } + curLoop++; + curVert = 0; + numVerts = 6; + verts = calloc(numVerts, sizeof(LatLng)); + } + continue; + } + // Try to grab a floating point value followed by optional whitespace, a + // comma, and more optional whitespace, and a second floating point + // value, then store the lat, lng pair + double lat, lng; + int count = 0; + // Must grab the closing ] or we might accidentally parse a partial + // float across buffer boundaries + char closeBracket[2] = "]"; + int result = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%1[]]%n", + &lat, &lng, &closeBracket[0], &count); + if (count > 0 && result == 3) { + verts[curVert].lat = H3_EXPORT(degsToRads)(lat); + verts[curVert].lng = H3_EXPORT(degsToRads)(lng); + curVert++; + // Create a new vert buffer, copy the old buffer, and free it, if + // necessary + if (curVert == numVerts) { + LatLng *newVerts = calloc(numVerts * 2, sizeof(LatLng)); + for (int i = 0; i < numVerts; i++) { + newVerts[i].lat = verts[i].lat; + newVerts[i].lng = verts[i].lng; + } + free(verts); + verts = newVerts; + numVerts *= 2; + } + strPos += count; + curDepth--; + continue; + } + // Check for whitespace and skip it if we reach this point. + if (polygonString[strPos] == ',' || polygonString[strPos] == ' ' || + polygonString[strPos] == '\n' || polygonString[strPos] == '\t' || + polygonString[strPos] == '\r') { + strPos++; + continue; + } + if (strPos != 0 && fp != 0) { + // Scan the remaining of the current buffer for `0`. If not + // found, then we grab a new chunk and append to the remainder + // of the existing buffer. Otherwise, just skip unknown + // characters. + bool endOfFile = false; + for (int i = strPos; i <= BUFFER_SIZE; i++) { + if (polygonString[strPos] == 0) { + endOfFile = true; + break; + } + } + if (endOfFile) { + strPos++; + } else { + // Move the end of this buffer to the beginning + for (int i = strPos; i <= BUFFER_SIZE; i++) { + polygonString[i - strPos] = polygonString[i]; + } + // Set the string position to the end of the buffer + strPos = BUFFER_SIZE - strPos; + // Grab up to the remaining size of the buffer and fill it + // into the file + // Did you know that if the amount you want to read from + // the file buffer is larger than the buffer itself, + // fread can choose to give you squat and not the + // remainder of the file as you'd expect from the + // documentation? This was a surprise to me and a + // significant amount of wasted time to figure out how + // to tackle. C leaves *way* too much as undefined + // behavior to be nice to work with... + int64_t i = 0; + int result; + do { + result = fread(polygonString + strPos + i, 1, 1, fp); + i++; + } while (i < BUFFER_SIZE - strPos && result != 0); + if (result == 0) { + polygonString[strPos + i - 1] = 0; + } + strPos = 0; + } + } else { + strPos++; + } + } + free(verts); + return E_SUCCESS; +} + +SUBCOMMAND( + polygonToCells, + "Converts a polygon (array of lat, lng points, or array of arrays of lat, " + "lng points) into a set of covering cells at the specified resolution") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the polygon from. Use -- to read from stdin."}; + char polygonStr[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding + Arg polygonStrArg = { + .names = {"-p", "--polygon"}, + .scanFormat = "%1500c", + .valueName = "POLYGON", + .value = &polygonStr, + .helpText = "The polygon to convert. Up to 1500 characters."}; + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-15 inclusive, that the polygon " + "should be converted to."}; + Arg *args[] = {&polygonToCellsArg, &helpArg, &filenameArg, + &polygonStrArg, &resArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == polygonStrArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a polygon " + "to cover to use polygonToCells"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(polygonStr, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (err != E_SUCCESS) { + return err; + } + int64_t cellsSize = 0; + err = H3_EXPORT(maxPolygonToCellsSize)(&polygon, res, 0, &cellsSize); + if (err != E_SUCCESS) { + return err; + } + H3Index *cells = calloc(cellsSize, sizeof(H3Index)); + err = H3_EXPORT(polygonToCells)(&polygon, res, 0, cells); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); + if (err != E_SUCCESS) { + free(cells); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < cellsSize; i++) { + if (cells[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < cellsSize; i++) { + if (cells[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", cells[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < cellsSize; i++) { + if (cells[i] != 0) { + h3Println(cells[i]); + } + } + } else { + free(cells); + return E_FAILED; + } + + free(cells); + return E_SUCCESS; +} + +SUBCOMMAND( + maxPolygonToCellsSize, + "Returns the maximum number of cells that could be needed to cover " + "the polygon. Will always be equal or more than actually necessary") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the polygon from. Use -- to read from stdin."}; + char polygonStr[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding + Arg polygonStrArg = { + .names = {"-p", "--polygon"}, + .scanFormat = "%1500c", + .valueName = "POLYGON", + .value = &polygonStr, + .helpText = "The polygon to convert. Up to 1500 characters."}; + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-15 inclusive, that the polygon " + "should be converted to."}; + Arg *args[] = {&maxPolygonToCellsSizeArg, &helpArg, &filenameArg, + &polygonStrArg, &resArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == polygonStrArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a polygon " + "to cover to use maxPolygonToCellsSize"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(polygonStr, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (err != E_SUCCESS) { + return err; + } + int64_t cellsSize = 0; + err = H3_EXPORT(maxPolygonToCellsSize)(&polygon, res, 0, &cellsSize); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); + if (err != E_SUCCESS) { + return err; + } + printf("%" PRId64 "\n", cellsSize); + return E_SUCCESS; +} + +SUBCOMMAND(cellsToMultiPolygon, + "Returns a polygon (array of arrays of " + "lat, lng points) for a set of cells") { + DEFINE_FORMAT_ARG( + "'json' for [[[[lat, lng],...],...],...] 'wkt' for a WKT MULTIPOLYGON"); + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char cellStrs[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding + Arg cellStrsArg = {.names = {"-c", "--cells"}, + .scanFormat = "%1500c", + .valueName = "CELLS", + .value = &cellStrs, + .helpText = + "The cells to convert. Up to 100 cells if provided " + "as hexadecimals with zero padding."}; + Arg *args[] = {&cellsToMultiPolygonArg, &helpArg, &filenameArg, + &cellStrsArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == cellStrsArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a set of cells " + "to convert to use cellsToMultiPolygon"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + size_t cellsOffset = 0; + H3Index *cells = readCellsFromFile(fp, cellStrs, &cellsOffset); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (cells == NULL) { + return E_FAILED; + } + LinkedGeoPolygon out = {0}; + H3Error err = + H3_EXPORT(cellsToLinkedMultiPolygon)(cells, cellsOffset, &out); + if (err) { + free(cells); + H3_EXPORT(destroyLinkedMultiPolygon)(&out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("["); + LinkedGeoPolygon *currPoly = &out; + while (currPoly) { + printf("["); + LinkedGeoLoop *currLoop = currPoly->first; + while (currLoop) { + printf("["); + LinkedLatLng *currLatLng = currLoop->first; + while (currLatLng) { + printf("[%f, %f]", + H3_EXPORT(radsToDegs)(currLatLng->vertex.lat), + H3_EXPORT(radsToDegs)(currLatLng->vertex.lng)); + currLatLng = currLatLng->next; + if (currLatLng) { + printf(", "); + } + } + currLoop = currLoop->next; + if (currLoop) { + printf("], "); + } else { + printf("]"); + } + } + currPoly = currPoly->next; + if (currPoly) { + printf("], "); + } else { + printf("]"); + } + } + printf("]\n"); + } else if (strcmp(format, "wkt") == 0) { + printf("MULTIPOLYGON ("); + LinkedGeoPolygon *currPoly = &out; + while (currPoly) { + printf("("); + LinkedGeoLoop *currLoop = currPoly->first; + while (currLoop) { + printf("("); + LinkedLatLng *currLatLng = currLoop->first; + while (currLatLng) { + printf("%f %f", + H3_EXPORT(radsToDegs)(currLatLng->vertex.lng), + H3_EXPORT(radsToDegs)(currLatLng->vertex.lat)); + currLatLng = currLatLng->next; + if (currLatLng) { + printf(", "); + } + } + currLoop = currLoop->next; + if (currLoop) { + printf("), "); + } else { + printf(")"); + } + } + currPoly = currPoly->next; + if (currPoly) { + printf("), "); + } else { + printf(")"); + } + } + printf(")\n"); + } else { + free(cells); + H3_EXPORT(destroyLinkedMultiPolygon)(&out); + return E_FAILED; + } + free(cells); + H3_EXPORT(destroyLinkedMultiPolygon)(&out); + return E_SUCCESS; +} + +/// Directed edge subcommands + +SUBCOMMAND(areNeighborCells, + "Determines if the provided H3 cells are neighbors (have a shared " + "border)") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + H3Index origin, destination; + Arg originCellArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "CELL", + .value = &origin, + .helpText = "Origin H3 Cell"}; + Arg destinationCellArg = {.names = {"-d", "--destination"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "CELL", + .value = &destination, + .helpText = "Destination H3 Cell"}; + Arg *args[] = {&areNeighborCellsArg, &originCellArg, &destinationCellArg, + &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int areNeighbors = 0; + H3Error err = + H3_EXPORT(areNeighborCells)(origin, destination, &areNeighbors); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", areNeighbors ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", areNeighbors); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(cellsToDirectedEdge, + "Converts neighboring cells into a directed edge index (or errors " + "if they are not neighbors)") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n " + "(Default: json)"); + H3Index origin, destination; + Arg originCellArg = {.names = {"-o", "--origin"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "CELL", + .value = &origin, + .helpText = "Origin H3 Cell"}; + Arg destinationCellArg = {.names = {"-d", "--destination"}, + .required = true, + .scanFormat = "%" PRIx64, + .valueName = "CELL", + .value = &destination, + .helpText = "Destination H3 Cell"}; + Arg *args[] = {&cellsToDirectedEdgeArg, &originCellArg, &destinationCellArg, + &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out = 0; + H3Error err = H3_EXPORT(cellsToDirectedEdge)(origin, destination, &out); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", out); + } else if (strcmp(format, "newline") == 0) { + h3Println(out); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(isValidDirectedEdge, + "Checks if the provided H3 directed edge is actually valid") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&isValidDirectedEdgeArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + bool isValid = H3_EXPORT(isValidDirectedEdge)(cell); + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", isValid ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", isValid); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(getDirectedEdgeOrigin, + "Returns the origin cell from the directed edge") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n " + "(Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&getDirectedEdgeOriginArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out = 0; + H3Error err = H3_EXPORT(getDirectedEdgeOrigin)(cell, &out); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", out); + } else if (strcmp(format, "newline") == 0) { + h3Println(out); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(getDirectedEdgeDestination, + "Returns the destination cell from the directed edge") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n " + "(Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&getDirectedEdgeDestinationArg, &cellArg, &helpArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out = 0; + H3Error err = H3_EXPORT(getDirectedEdgeDestination)(cell, &out); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", out); + } else if (strcmp(format, "newline") == 0) { + h3Println(out); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND( + directedEdgeToCells, + "Returns the origin, destination pair of cells from the directed edge") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&directedEdgeToCellsArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out[2] = {0}; + H3Error err = H3_EXPORT(directedEdgeToCells)(cell, &out[0]); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[\"%" PRIx64 "\", \"%" PRIx64 "\"]\n", out[0], out[1]); + } else if (strcmp(format, "newline") == 0) { + printf("%" PRIx64 "\n%" PRIx64 "\n", out[0], out[1]); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(originToDirectedEdges, + "Returns all of the directed edges from the specified origin cell") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&originToDirectedEdgesArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out[6] = {0}; + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(originToDirectedEdges)(cell, &out[0]); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("["); + bool hasPrinted = false; + for (int i = 0; i < 6; i++) { + if (out[i] > 0) { + if (hasPrinted) { + printf(", "); + } + printf("\"%" PRIx64 "\"", out[i]); + hasPrinted = true; + } + } + printf("]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int i = 0; i < 6; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(directedEdgeToBoundary, + "Provides the coordinates defining the directed edge") { + DEFINE_FORMAT_ARG( + "'json' for [[lat, lng], ...], 'wkt' for a WKT POLYGON, 'newline' for " + "lat\\nlng\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&directedEdgeToBoundaryArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + CellBoundary cb = {0}; + H3Error err = H3_EXPORT(directedEdgeToBoundary)(cell, &cb); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("["); + for (int i = 0; i < cb.numVerts - 1; i++) { + LatLng *ll = &cb.verts[i]; + printf("[%.10lf, %.10lf], ", H3_EXPORT(radsToDegs)(ll->lat), + H3_EXPORT(radsToDegs)(ll->lng)); + } + printf("[%.10lf, %.10lf]]\n", + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lat), + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lng)); + } else if (strcmp(format, "wkt") == 0) { + printf("LINESTRING ("); + for (int i = 0; i < cb.numVerts - 1; i++) { + LatLng *ll = &cb.verts[i]; + printf("%.10lf %.10lf, ", H3_EXPORT(radsToDegs)(ll->lng), + H3_EXPORT(radsToDegs)(ll->lat)); + } + printf("%.10lf %.10lf)\n", + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lng), + H3_EXPORT(radsToDegs)(cb.verts[cb.numVerts - 1].lat)); + } else if (strcmp(format, "newline") == 0) { + for (int i = 0; i < cb.numVerts; i++) { + LatLng *ll = &cb.verts[i]; + printf("%.10lf\n%.10lf\n", H3_EXPORT(radsToDegs)(ll->lat), + H3_EXPORT(radsToDegs)(ll->lng)); + } + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +/// Vertex subcommands + +SUBCOMMAND(cellToVertex, + "Returns the vertex for the specified cell and vertex index. Must " + "be 0-5 for hexagons, 0-4 for pentagons") { + DEFINE_FORMAT_ARG( + "'json' for \"CELL\"\\n, 'newline' for CELL\\n " + "(Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + int vertIndex = 0; + Arg vertIndexArg = { + .names = {"-v", "--vertex"}, + .required = true, + .scanFormat = "%d", + .valueName = "INDEX", + .value = &vertIndex, + .helpText = "Vertex index number. 0-5 for hexagons, 0-4 for pentagons"}; + Arg *args[] = {&cellToVertexArg, &cellArg, &vertIndexArg, &helpArg, + &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This function also doesn't sanitize its inputs correctly + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + H3Index out = 0; + H3Error err = H3_EXPORT(cellToVertex)(cell, vertIndex, &out); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("\"%" PRIx64 "\"\n", out); + } else if (strcmp(format, "newline") == 0) { + h3Println(out); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(cellToVertexes, + "Returns all of the vertexes from the specified cell") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellToVertexesArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index out[6] = {0}; + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + H3Error err = H3_EXPORT(cellToVertexes)(cell, &out[0]); + if (err != E_SUCCESS) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < 6; i++) { + if (out[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < 6; i++) { + if (out[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", out[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < 6; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(vertexToLatLng, "Returns the lat, lng pair for the given vertex") { + DEFINE_FORMAT_ARG( + "'json' for [lat, lng], 'wkt' for a WKT POINT, 'newline' for " + "lat\\nlng\\n (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&vertexToLatLngArg, &cellArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + bool isValid = H3_EXPORT(isValidVertex)(cell); + if (!isValid) { + return E_VERTEX_INVALID; + } + LatLng ll; + H3Error err = H3_EXPORT(vertexToLatLng)(cell, &ll); + if (err) { + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("[%.10lf, %.10lf]\n", H3_EXPORT(radsToDegs)(ll.lat), + H3_EXPORT(radsToDegs)(ll.lng)); + } else if (strcmp(format, "wkt") == 0) { + // Using WKT formatting for the output. TODO: Add support for JSON + // formatting + printf("POINT(%.10lf %.10lf)\n", H3_EXPORT(radsToDegs)(ll.lng), + H3_EXPORT(radsToDegs)(ll.lat)); + } else if (strcmp(format, "newline") == 0) { + printf("%.10lf\n%.10lf\n", H3_EXPORT(radsToDegs)(ll.lat), + H3_EXPORT(radsToDegs)(ll.lng)); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +SUBCOMMAND(isValidVertex, + "Checks if the provided H3 vertex is actually valid") { + DEFINE_FORMAT_ARG( + "'json' for true or false, 'numeric' for 1 or 0 (Default: json)"); + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&isValidVertexArg, &helpArg, &cellArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + bool isValid = H3_EXPORT(isValidVertex)(cell); + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + printf("%s\n", isValid ? "true" : "false"); + } else if (strcmp(format, "numeric") == 0) { + printf("%d\n", isValid); + } else { + return E_FAILED; + } + return E_SUCCESS; +} + +/// Miscellaneous subcommands + +SUBCOMMAND(degsToRads, "Converts degrees to radians") { + double deg = 0; + Arg degArg = {.names = {"-d", "--degree"}, + .required = true, + .scanFormat = "%lf", + .valueName = "DEG", + .value = °, + .helpText = "Angle in degrees"}; + Arg *args[] = {°sToRadsArg, °Arg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + printf("%.10lf\n", H3_EXPORT(degsToRads)(deg)); + return E_SUCCESS; +} + +SUBCOMMAND(radsToDegs, "Converts radians to degrees") { + double rad = 0; + Arg radArg = {.names = {"-r", "--radian"}, + .required = true, + .scanFormat = "%lf", + .valueName = "RAD", + .value = &rad, + .helpText = "Angle in radians"}; + Arg *args[] = {&radsToDegsArg, &radArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + printf("%.10lf\n", H3_EXPORT(radsToDegs)(rad)); + return E_SUCCESS; +} + +SUBCOMMAND(getHexagonAreaAvgKm2, + "The average area in square kilometers for a hexagon of a given " + "resolution (excludes pentagons)") { + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getHexagonAreaAvgKm2Arg, &resArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + double area = 0; + H3Error err = H3_EXPORT(getHexagonAreaAvgKm2)(res, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(getHexagonAreaAvgM2, + "The average area in square meters for a hexagon of a given " + "resolution (excludes pentagons)") { + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getHexagonAreaAvgM2Arg, &resArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + double area = 0; + H3Error err = H3_EXPORT(getHexagonAreaAvgM2)(res, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(cellAreaRads2, + "The exact area of a specific cell in square radians") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellAreaRads2Arg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + double area = 0; + H3Error err = H3_EXPORT(cellAreaRads2)(cell, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(cellAreaKm2, + "The exact area of a specific cell in square kilometers") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellAreaKm2Arg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + double area = 0; + H3Error err = H3_EXPORT(cellAreaKm2)(cell, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(cellAreaM2, "The exact area of a specific cell in square meters") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&cellAreaM2Arg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidCell)(cell); + if (!isValid) { + return E_CELL_INVALID; + } + double area = 0; + H3Error err = H3_EXPORT(cellAreaM2)(cell, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(getHexagonEdgeLengthAvgKm, + "The average hexagon edge length in kilometers of a given " + "resolution (excludes pentagons)") { + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getHexagonEdgeLengthAvgKmArg, &resArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + double area = 0; + H3Error err = H3_EXPORT(getHexagonEdgeLengthAvgKm)(res, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(getHexagonEdgeLengthAvgM, + "The average hexagon edge length in meters of a given " + "resolution (excludes pentagons)") { + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getHexagonEdgeLengthAvgMArg, &resArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + double area = 0; + H3Error err = H3_EXPORT(getHexagonEdgeLengthAvgM)(res, &area); + if (err) { + return err; + } + printf("%.10lf\n", area); + return E_SUCCESS; +} + +SUBCOMMAND(edgeLengthRads, + "The exact edge length of a specific directed edge in radians") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&edgeLengthRadsArg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidDirectedEdge)(cell); + if (!isValid) { + return E_DIR_EDGE_INVALID; + } + double length = 0; + H3Error err = H3_EXPORT(edgeLengthRads)(cell, &length); + if (err) { + return err; + } + printf("%.10lf\n", length); + return E_SUCCESS; +} + +SUBCOMMAND(edgeLengthKm, + "The exact edge length of a specific directed edge in kilometers") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&edgeLengthKmArg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidDirectedEdge)(cell); + if (!isValid) { + return E_DIR_EDGE_INVALID; + } + double length = 0; + H3Error err = H3_EXPORT(edgeLengthKm)(cell, &length); + if (err) { + return err; + } + printf("%.10lf\n", length); + return E_SUCCESS; +} + +SUBCOMMAND(edgeLengthM, + "The exact edge length of a specific directed edge in meters") { + DEFINE_CELL_ARG(cell, cellArg); + Arg *args[] = {&edgeLengthMArg, &cellArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + // This one is pretty loose about the inputs it accepts, so let's validate + // for it + bool isValid = H3_EXPORT(isValidDirectedEdge)(cell); + if (!isValid) { + return E_DIR_EDGE_INVALID; + } + double length = 0; + H3Error err = H3_EXPORT(edgeLengthM)(cell, &length); + if (err) { + return err; + } + printf("%.10lf\n", length); + return E_SUCCESS; +} + +SUBCOMMAND(getNumCells, + "The number of unique H3 cells for a specified resolution") { + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getNumCellsArg, &resArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + int64_t numCells = 0; + H3Error err = H3_EXPORT(getNumCells)(res, &numCells); + if (err) { + return err; + } + printf("%" PRId64 "\n", numCells); + return E_SUCCESS; +} + +SUBCOMMAND(getRes0Cells, "Returns all of the resolution 0 cells") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + Arg *args[] = {&getRes0CellsArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index *out = calloc(122, sizeof(H3Index)); + H3Error err = H3_EXPORT(getRes0Cells)(out); + if (err != E_SUCCESS) { + free(out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < 122; i++) { + if (out[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < 122; i++) { + if (out[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", out[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < 122; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + free(out); + return E_FAILED; + } + free(out); + return E_SUCCESS; +} + +SUBCOMMAND(getPentagons, + "Returns all of the pentagons at the specified resolution") { + DEFINE_FORMAT_ARG( + "'json' for [\"CELL\", ...], 'newline' for CELL\\n... (Default: json)"); + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg *args[] = {&getPentagonsArg, &resArg, &helpArg, &formatArg}; + PARSE_SUBCOMMAND(argc, argv, args); + H3Index *out = calloc(12, sizeof(H3Index)); + H3Error err = H3_EXPORT(getPentagons)(res, out); + if (err != E_SUCCESS) { + free(out); + return err; + } + if (strcmp(format, "json") == 0 || strcmp(format, "") == 0) { + // Since we don't know *actually* how many cells are in the output + // (usually the max, but sometimes not), we need to do a quick scan to + // figure out the true length in order to properly serialize to a JSON + // array + int64_t trueLen = 0; + for (int64_t i = 0; i < 12; i++) { + if (out[i] != 0) { + trueLen++; + } + } + printf("[ "); + for (int64_t i = 0, j = 0; i < 12; i++) { + if (out[i] != 0) { + j++; + printf("\"%" PRIx64 "\"%s", out[i], j == trueLen ? "" : ", "); + } + } + printf(" ]\n"); + } else if (strcmp(format, "newline") == 0) { + for (int64_t i = 0; i < 12; i++) { + if (out[i] != 0) { + h3Println(out[i]); + } + } + } else { + free(out); + return E_FAILED; + } + free(out); + return E_SUCCESS; +} + +SUBCOMMAND(pentagonCount, "Returns 12") { + Arg *args[] = {&pentagonCountArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + printf("12\n"); + return E_SUCCESS; +} + +SUBCOMMAND(greatCircleDistanceRads, + "Calculates the 'great circle' or 'haversine' distance between two " + "lat, lng points, in radians") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = {.names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the coordinates from. Use -- to " + "read from stdin."}; + char coordinateStr[1501] = {0}; + Arg coordinateStrArg = { + .names = {"-c", "--coordinates"}, + .scanFormat = "%1500c", + .valueName = "ARRAY", + .value = &coordinateStr, + .helpText = + "The array of coordinates to convert. Up to 1500 characters."}; + Arg *args[] = {&greatCircleDistanceRadsArg, &filenameArg, &coordinateStrArg, + &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == coordinateStrArg.found) { + fprintf( + stderr, + "You must provide either a file to read from or a coordinate array " + "to use greatCircleDistanceRads"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(coordinateStr, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, coordinateStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (err != E_SUCCESS) { + return err; + } + if (polygon.numHoles > 0 || polygon.geoloop.numVerts != 2) { + fprintf(stderr, "Only two pairs of coordinates should be provided."); + exit(1); + } + double distance = H3_EXPORT(greatCircleDistanceRads)( + &polygon.geoloop.verts[0], &polygon.geoloop.verts[1]); + printf("%.10lf\n", distance); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); + return E_SUCCESS; +} + +SUBCOMMAND(greatCircleDistanceKm, + "Calculates the 'great circle' or 'haversine' distance between two " + "lat, lng points, in kilometers") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = {.names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the coordinates from. Use -- to " + "read from stdin."}; + char coordinateStr[1501] = {0}; + Arg coordinateStrArg = { + .names = {"-c", "--coordinates"}, + .scanFormat = "%1500c", + .valueName = "ARRAY", + .value = &coordinateStr, + .helpText = + "The array of coordinates to convert. Up to 1500 characters."}; + Arg *args[] = {&greatCircleDistanceKmArg, &filenameArg, &coordinateStrArg, + &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == coordinateStrArg.found) { + fprintf( + stderr, + "You must provide either a file to read from or a coordinate array " + "to use greatCircleDistanceKm"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(coordinateStr, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, coordinateStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (err != E_SUCCESS) { + return err; + } + if (polygon.numHoles > 0 || polygon.geoloop.numVerts != 2) { + fprintf(stderr, "Only two pairs of coordinates should be provided."); + exit(1); + } + double distance = H3_EXPORT(greatCircleDistanceKm)( + &polygon.geoloop.verts[0], &polygon.geoloop.verts[1]); + printf("%.10lf\n", distance); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); + return E_SUCCESS; +} + +SUBCOMMAND(greatCircleDistanceM, + "Calculates the 'great circle' or 'haversine' distance between two " + "lat, lng points, in meters") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = {.names = {"-i", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the coordinates from. Use -- to " + "read from stdin."}; + char coordinateStr[1501] = {0}; + Arg coordinateStrArg = { + .names = {"-c", "--coordinates"}, + .scanFormat = "%1500c", + .valueName = "ARRAY", + .value = &coordinateStr, + .helpText = + "The array of coordinates to convert. Up to 1500 characters."}; + Arg *args[] = {&greatCircleDistanceMArg, &filenameArg, &coordinateStrArg, + &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (filenameArg.found == coordinateStrArg.found) { + fprintf( + stderr, + "You must provide either a file to read from or a coordinate array " + "to use greatCircleDistanceM"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(coordinateStr, 1, BUFFER_SIZE, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, coordinateStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (err != E_SUCCESS) { + return err; + } + if (polygon.numHoles > 0 || polygon.geoloop.numVerts != 2) { + fprintf(stderr, "Only two pairs of coordinates should be provided."); + exit(1); + } + double distance = H3_EXPORT(greatCircleDistanceM)( + &polygon.geoloop.verts[0], &polygon.geoloop.verts[1]); + printf("%.10lf\n", distance); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); + return E_SUCCESS; +} + +SUBCOMMAND(describeH3Error, + "Returns a description of the provided H3 error code number, or " + "indicates the number is itself invalid.") { + H3Error err = E_SUCCESS; + Arg errArg = {.names = {"-e", "--error"}, + .required = true, + .scanFormat = "%d", + .valueName = "CODE", + .value = &err, + .helpText = "H3 Error code to describe"}; + Arg *args[] = {&describeH3ErrorArg, &errArg, &helpArg}; + PARSE_SUBCOMMAND(argc, argv, args); + printf("%s\n", H3_EXPORT(describeH3Error)(err)); + return E_SUCCESS; +} + +// TODO: Is there any way to avoid this particular piece of duplication? +SUBCOMMANDS_INDEX + +/// Indexing subcommands +SUBCOMMAND_INDEX(cellToLatLng) +SUBCOMMAND_INDEX(latLngToCell) +SUBCOMMAND_INDEX(cellToBoundary) + +/// Inspection subcommands +SUBCOMMAND_INDEX(getResolution) +SUBCOMMAND_INDEX(getBaseCellNumber) +SUBCOMMAND_INDEX(stringToInt) +SUBCOMMAND_INDEX(intToString) +SUBCOMMAND_INDEX(isValidCell) +SUBCOMMAND_INDEX(isResClassIII) +SUBCOMMAND_INDEX(isPentagon) +SUBCOMMAND_INDEX(getIcosahedronFaces) + +/// Traversal subcommands +SUBCOMMAND_INDEX(gridDisk) +SUBCOMMAND_INDEX(gridDiskDistances) +SUBCOMMAND_INDEX(gridRing) +SUBCOMMAND_INDEX(gridPathCells) +SUBCOMMAND_INDEX(gridDistance) +SUBCOMMAND_INDEX(cellToLocalIj) +SUBCOMMAND_INDEX(localIjToCell) + +/// Hierarchical subcommands +SUBCOMMAND_INDEX(cellToParent) +SUBCOMMAND_INDEX(cellToChildren) +SUBCOMMAND_INDEX(cellToChildrenSize) +SUBCOMMAND_INDEX(cellToCenterChild) +SUBCOMMAND_INDEX(cellToChildPos) +SUBCOMMAND_INDEX(childPosToCell) +SUBCOMMAND_INDEX(compactCells) +SUBCOMMAND_INDEX(uncompactCells) + +/// Region subcommands +SUBCOMMAND_INDEX(polygonToCells) +SUBCOMMAND_INDEX(maxPolygonToCellsSize) +SUBCOMMAND_INDEX(cellsToMultiPolygon) + +/// Directed Edge subcommands +SUBCOMMAND_INDEX(areNeighborCells) +SUBCOMMAND_INDEX(cellsToDirectedEdge) +SUBCOMMAND_INDEX(isValidDirectedEdge) +SUBCOMMAND_INDEX(getDirectedEdgeOrigin) +SUBCOMMAND_INDEX(getDirectedEdgeDestination) +SUBCOMMAND_INDEX(directedEdgeToCells) +SUBCOMMAND_INDEX(originToDirectedEdges) +SUBCOMMAND_INDEX(directedEdgeToBoundary) + +/// Vertex subcommands +SUBCOMMAND_INDEX(cellToVertex) +SUBCOMMAND_INDEX(cellToVertexes) +SUBCOMMAND_INDEX(vertexToLatLng) +SUBCOMMAND_INDEX(isValidVertex) + +/// Miscellaneous subcommands +SUBCOMMAND_INDEX(degsToRads) +SUBCOMMAND_INDEX(radsToDegs) +SUBCOMMAND_INDEX(getHexagonAreaAvgKm2) +SUBCOMMAND_INDEX(getHexagonAreaAvgM2) +SUBCOMMAND_INDEX(cellAreaRads2) +SUBCOMMAND_INDEX(cellAreaKm2) +SUBCOMMAND_INDEX(cellAreaM2) +SUBCOMMAND_INDEX(getHexagonEdgeLengthAvgKm) +SUBCOMMAND_INDEX(getHexagonEdgeLengthAvgM) +SUBCOMMAND_INDEX(edgeLengthRads) +SUBCOMMAND_INDEX(edgeLengthKm) +SUBCOMMAND_INDEX(edgeLengthM) +SUBCOMMAND_INDEX(getNumCells) +SUBCOMMAND_INDEX(getRes0Cells) +SUBCOMMAND_INDEX(getPentagons) +SUBCOMMAND_INDEX(pentagonCount) +SUBCOMMAND_INDEX(greatCircleDistanceRads) +SUBCOMMAND_INDEX(greatCircleDistanceKm) +SUBCOMMAND_INDEX(greatCircleDistanceM) +SUBCOMMAND_INDEX(describeH3Error) + +END_SUBCOMMANDS_INDEX + +int main(int argc, char *argv[]) { + if (argc <= 1) { + printf("Please use h3 --help to see how to use this command.\n"); + return 1; + } + DISPATCH_SUBCOMMAND(); + printf("Please use h3 --help to see how to use this command.\n"); + return 1; +} diff --git a/src/apps/filters/h3ToComponents.c b/src/apps/filters/h3ToComponents.c index 82e035d8a..1bf064752 100644 --- a/src/apps/filters/h3ToComponents.c +++ b/src/apps/filters/h3ToComponents.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019-2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,16 +17,15 @@ * @brief stdin/stdout filter that converts from integer H3 indexes to * components. * - * usage: `h3ToComponents` + * See `h3ToComponents --help` for usage. * * The program reads H3 indexes from stdin until EOF and outputs the * corresponding component strings to stdout. */ -#include -#include -#include -#include "baseCells.h" +#include + +#include "args.h" #include "h3Index.h" #include "utility.h" @@ -44,45 +43,28 @@ char resDigitToChar(int d) { return '0' + d; } -void doCell(H3Index h, int verboseMode) { +void doCell(H3Index h, bool verboseMode) { int h3Mode = H3_GET_MODE(h); int h3Res = H3_GET_RESOLUTION(h); int h3BaseCell = H3_GET_BASE_CELL(h); - if (verboseMode == 0) { - if (h3Mode == H3_HEXAGON_MODE) { - printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell); - for (int i = 1; i <= h3Res; i++) { - printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); - } - printf("\n"); - } else if (h3Mode == H3_UNIEDGE_MODE) { - printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res, - h3BaseCell); - for (int i = 1; i <= h3Res; i++) { - printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); - } - printf("\n"); - } else { - printf("INVALID INDEX\n"); - } - } else { - char* modes[] = { - "RESERVED", // 0 - "Hexagon", // 1 - "Unidirectional Edge", // 2 - "INVALID", // 3 - "INVALID", // 4 - "INVALID", // 5 - "INVALID", // 6 - "INVALID", // 7 - "INVALID", // 8 - "INVALID", // 9 - "INVALID", // 10 - "INVALID", // 11 - "INVALID", // 12 - "INVALID", // 13 - "INVALID", // 14 - "INVALID", // 15 + if (verboseMode) { + const char *modes[] = { + "RESERVED", // 0 + "Cell", // 1 + "Directed Edge", // 2 + "INVALID", // 3 + "INVALID", // 4 + "INVALID", // 5 + "INVALID", // 6 + "INVALID", // 7 + "INVALID", // 8 + "INVALID", // 9 + "INVALID", // 10 + "INVALID", // 11 + "INVALID", // 12 + "INVALID", // 13 + "INVALID", // 14 + "INVALID", // 15 }; printf("╔════════════╗\n"); char hStr[BUFF_SIZE]; @@ -91,7 +73,7 @@ void doCell(H3Index h, int verboseMode) { printf("╠════════════╣\n"); printf("║ Mode ║ %s (%i)\n", modes[h3Mode], h3Mode); printf("║ Resolution ║ %i\n", h3Res); - if (h3Mode == H3_UNIEDGE_MODE) { + if (h3Mode == H3_DIRECTEDEDGE_MODE) { printf("║ Edge ║ %i\n", H3_GET_RESERVED_BITS(h)); } printf("║ Base Cell ║ %i\n", h3BaseCell); @@ -100,33 +82,56 @@ void doCell(H3Index h, int verboseMode) { resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); } printf("╚════════════╝\n\n"); + } else { + if (h3Mode == H3_CELL_MODE) { + printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell); + for (int i = 1; i <= h3Res; i++) { + printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); + } + printf("\n"); + } else if (h3Mode == H3_DIRECTEDEDGE_MODE) { + printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res, + h3BaseCell); + for (int i = 1; i <= h3Res; i++) { + printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i))); + } + printf("\n"); + } else { + printf("INVALID INDEX\n"); + } } } -int main(int argc, char* argv[]) { - // check command line args - int verboseMode = 0; - if (argc > 1) { - if (strncmp("--verbose", argv[1], 9) == 0) { - verboseMode = 1; - } else { - fprintf(stderr, "usage: %s [--verbose]\n", argv[0]); - exit(1); - } +int main(int argc, char *argv[]) { + Arg helpArg = ARG_HELP; + Arg verboseArg = {.names = {"-v", "--verbose"}, + .helpText = "Verbose output mode."}; + DEFINE_INDEX_ARG(index, indexArg); + const int numArgs = 3; + Arg *args[] = {&helpArg, &verboseArg, &indexArg}; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, + "Converts H3 indexes to component parts")) { + return helpArg.found ? 0 : 1; } - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } + if (indexArg.found) { + doCell(index, verboseArg.found); + } else { + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading H3 index from stdin"); + } - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, verboseMode); + H3Index h3; + H3_EXPORT(stringToH3)(buff, &h3); + doCell(h3, verboseArg.found); + } } } diff --git a/src/apps/filters/h3ToGeo.c b/src/apps/filters/h3ToGeo.c deleted file mode 100644 index f71ec8038..000000000 --- a/src/apps/filters/h3ToGeo.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon - * cell center point - * - * usage: `h3ToGeo [outputMode kmlName kmlDesc]` - * - * The program reads H3 indexes from stdin and outputs the corresponding - * cell center points to stdout, until EOF is encountered. The H3 indexes - * should be in integer form. - * - * `outputMode` indicates the type of output; the choices are 0 for - * plain text output (the default) and 1 for KML output - * - * `kmlName` indicates the string for the name tag in KML output (only used - * when `outputMode` == 1). The default is "geo from H3". - * - * `kmlName` indicates the string for the desc tag in KML output (only used - * when `outputMode` == 1). The default is "generated by h3ToGeo". - * - * Examples: - * - * `h3ToGeo < indexes.txt` - * - outputs plain text cell center points for the H3 indexes contained - * in the file `indexes.txt` - * - * `h3ToGeo 1 "kml file" "h3 cells" < indexes.txt > cells.kml` - * - creates the KML file `cells.kml` containing the cell center points - * for all of the H3 indexes contained in the file `indexes.txt`. - */ - -#include -#include -#include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "h3api.h" -#include "kml.h" -#include "utility.h" -#include "vec2d.h" - -void doCell(H3Index h, int isKmlOut) { - GeoCoord g; - H3_EXPORT(h3ToGeo)(h, &g); - - char label[BUFF_SIZE]; - - if (isKmlOut) { - H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); - - outputPointKML(&g, label); - } else { - printf("%.10lf %.10lf\n", H3_EXPORT(radsToDegs)(g.lat), - H3_EXPORT(radsToDegs)(g.lon)); - } -} - -int main(int argc, char *argv[]) { - // check command line args - if (argc > 5) { - fprintf(stderr, "usage: %s [outputMode kmlName kmlDesc]\n", argv[0]); - exit(1); - } - - int isKmlOut = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &isKmlOut)) - error("outputMode must be an integer"); - - if (isKmlOut != 0 && isKmlOut != 1) error("outputMode must be 0 or 1"); - char *defaultKmlName = "geo from H3"; - char *defaultKmlDesc = "from h3ToGeo"; - - char *kmlName = defaultKmlName; - char *kmlDesc = defaultKmlDesc; - - if (argc > 2) { - kmlName = argv[2]; - if (argc > 3) kmlDesc = argv[3]; - } - - kmlPtsHeader(kmlName, kmlDesc); - } - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, isKmlOut); - } - - if (isKmlOut) kmlPtsFooter(); -} diff --git a/src/apps/filters/h3ToGeoBoundary.c b/src/apps/filters/h3ToGeoBoundary.c deleted file mode 100644 index 130959d94..000000000 --- a/src/apps/filters/h3ToGeoBoundary.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon - * cell boundaries - * - * usage: `h3ToGeoBoundary [outputMode kmlName kmlDesc]` - * - * The program reads H3 indexes from stdin and outputs the corresponding - * cell boundaries to stdout, until EOF is encountered. - * - * `outputMode` indicates the type of output; the choices are 0 for - * plain text output (the default) and 1 for KML output - * - * `kmlName` indicates the string for the name tag in KML output (only used - * when `outputMode` == 1). The default is "geo from H3". - * - * `kmlName` indicates the string for the desc tag in KML output (only used - * when `outputMode` == 1). The default is "generated by h3ToGeoBoundary". - * - * Examples: - * - * `h3ToGeoBoundary < indexes.txt` - * - outputs plain text cell boundaries for the H3 indexes contained - * in the file `indexes.txt` - * - * `h3ToGeoBoundary 1 "kml file" "h3 cells" < indexes.txt > cells.kml` - * - creates the KML file `cells.kml` containing the cell boundaries for - * all of the H3 indexes contained in the file `indexes.txt`. - */ - -#include -#include -#include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "h3api.h" -#include "kml.h" -#include "utility.h" -#include "vec2d.h" - -void doCell(H3Index h, int isKmlOut) { - GeoBoundary b; - H3_EXPORT(h3ToGeoBoundary)(h, &b); - - char label[BUFF_SIZE]; - H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); - - if (isKmlOut) { - outputBoundaryKML(&b, label); - } else { - printf("%s\n", label); - geoBoundaryPrintln(&b); - } -} - -int main(int argc, char *argv[]) { - // check command line args - if (argc > 5) { - fprintf(stderr, "usage: %s [outputMode kmlName kmlDesc]\n", argv[0]); - exit(1); - } - - int isKmlOut = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &isKmlOut)) - error("outputMode must be an integer"); - - if (isKmlOut != 0 && isKmlOut != 1) error("outputMode must be 0 or 1"); - char *defaultKmlName = "geo from H3"; - char *defaultKmlDesc = "from h3ToGeo"; - - char *kmlName = defaultKmlName; - char *kmlDesc = defaultKmlDesc; - - if (argc > 2) { - kmlName = argv[2]; - if (argc > 3) kmlDesc = argv[3]; - } - - kmlPtsHeader(kmlName, kmlDesc); - } - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, isKmlOut); - } - - if (isKmlOut) kmlPtsFooter(); -} diff --git a/src/apps/filters/h3ToLocalIj.c b/src/apps/filters/h3ToLocalIj.c deleted file mode 100644 index 52dae15ec..000000000 --- a/src/apps/filters/h3ToLocalIj.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from H3 indexes to local IJ - * coordinates. This is experimental. - * - * usage: `h3ToLocalIj [origin]` - * - * The program reads H3 indexes from stdin and outputs the corresponding - * IJ coordinates to stdout, until EOF is encountered. The H3 indexes - * should be in integer form. `NA` is printed if the IJ coordinates - * could not be obtained. - * - * `origin` indicates the origin (or anchoring) index for the IJ coordinate - * space. - * - * This program has the same limitations as the `experimentalH3ToLocalIj` - * function. - */ - -#include -#include -#include -#include "coordijk.h" -#include "h3Index.h" -#include "h3api.h" -#include "utility.h" - -void doCell(H3Index h, H3Index origin) { - CoordIJ ij; - if (H3_EXPORT(experimentalH3ToLocalIj)(origin, h, &ij)) { - printf("NA\n"); - } else { - printf("%d %d\n", ij.i, ij.j); - } -} - -int main(int argc, char *argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [origin]\n", argv[0]); - exit(1); - } - - H3Index origin; - - if (!sscanf(argv[1], "%" PRIx64, &origin)) - error("origin could not be read"); - - if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid"); - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, origin); - } -} diff --git a/src/apps/filters/hexRange.c b/src/apps/filters/hexRange.c deleted file mode 100644 index 3b7350ba1..000000000 --- a/src/apps/filters/hexRange.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from integer H3 indexes to - * k-rings - * - * usage: `hexRange [k]` - * - * The program reads H3 indexes from stdin until EOF and outputs - * the H3 indexes within k-ring `k` to stdout. Requires all indexes - * being evaluated to be hexagons, and produces output in a spiralling - * order. - * - * If a pentagon or pentagon distortion is encountered, 0 is printed - * as the only output. - */ - -#include -#include -#include "algos.h" -#include "h3Index.h" -#include "stackAlloc.h" -#include "utility.h" - -void doCell(H3Index h, int k) { - int maxSize = H3_EXPORT(maxKringSize)(k); - H3Index* rings = calloc(maxSize, sizeof(H3Index)); - - if (!H3_EXPORT(hexRange)(h, k, rings)) { - for (int i = 0; i < maxSize; i++) { - h3Println(rings[i]); - } - } else { - printf("0\n"); - } - - free(rings); -} - -int main(int argc, char* argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [k]\n", argv[0]); - exit(1); - } - - int k = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); - } - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k); - } -} diff --git a/src/apps/filters/kRing.c b/src/apps/filters/kRing.c deleted file mode 100644 index 6576cb4a9..000000000 --- a/src/apps/filters/kRing.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief stdin/stdout filter that converts from integer H3 indexes to - * k-rings - * - * usage: `kRing [k]` - * - * The program reads H3 indexes from stdin until EOF and outputs - * the H3 indexes within k-ring `k` to stdout. - */ - -#include -#include -#include "algos.h" -#include "h3Index.h" -#include "stackAlloc.h" -#include "utility.h" - -void doCell(H3Index h, int k) { - int maxSize = H3_EXPORT(maxKringSize)(k); - H3Index* rings = calloc(maxSize, sizeof(H3Index)); - H3_EXPORT(kRing)(h, k, rings); - - for (int i = 0; i < maxSize; i++) { - if (rings[i] != 0) { - h3Println(rings[i]); - } - } - - free(rings); -} - -int main(int argc, char* argv[]) { - // check command line args - if (argc != 2) { - fprintf(stderr, "usage: %s [k]\n", argv[0]); - exit(1); - } - - int k = 0; - if (argc > 1) { - if (!sscanf(argv[1], "%d", &k)) error("k must be an integer"); - } - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - doCell(h3, k); - } -} diff --git a/src/apps/filters/latLngToCell.c b/src/apps/filters/latLngToCell.c new file mode 100644 index 000000000..fb281fe21 --- /dev/null +++ b/src/apps/filters/latLngToCell.c @@ -0,0 +1,122 @@ +/* + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from lat/lng coordinates to integer + * H3 indexes + * + * See `latLngToCell --help` for usage. + * + * The program reads lat/lng pairs from stdin until EOF is encountered. For + * each lat/lng the program outputs to stdout the integer H3 index of the + * containing cell at the specified resolution. + * + * The stdin input should have the following format (lat/lng in decimal + * degrees): + * + * lat0 lng0 + * lat1 lng1 + * ... + * latN lngN + */ + +#include "args.h" +#include "h3Index.h" +#include "utility.h" + +/** + * Convert coordinates to cell and print it. + * + * @param lat Degrees latitude + * @param lng Degrees longitude + * @param res Resolution + */ +void doCoords(double lat, double lng, int res) { + LatLng g = {.lat = H3_EXPORT(degsToRads)(lat), + .lng = H3_EXPORT(degsToRads)(lng)}; + + H3Index h; + H3Error e = H3_EXPORT(latLngToCell)(&g, res, &h); + + if (e == E_SUCCESS) { + h3Println(h); + } else { + h3Println(H3_NULL); + } +} + +int main(int argc, char *argv[]) { + int res = 0; + double lat = 0; + double lng = 0; + + Arg helpArg = ARG_HELP; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; + Arg latArg = {.names = {"--lat", "--latitude"}, + .scanFormat = "%lf", + .valueName = "lat", + .value = &lat, + .helpText = + "Latitude in degrees. If not specified, \"latitude " + "longitude\" pairs will be read from standard input."}; + Arg lngArg = {.names = {"--lng", "--longitude"}, + .scanFormat = "%lf", + .valueName = "lng", + .value = &lng, + .helpText = "Longitude in degrees."}; + + Arg *args[] = {&helpArg, &resArg, &latArg, &lngArg}; + const int numArgs = 4; + const char *helpText = + "Convert degrees latitude/longitude coordinates to H3 indexes."; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (latArg.found != lngArg.found) { + // One is found but the other is not. + printHelp(stderr, argv[0], helpText, numArgs, args, + "Latitude and longitude must both be specified.", NULL); + return 1; + } + + if (latArg.found) { + doCoords(lat, lng, res); + } else { + // process the lat/lng's on stdin + char buff[BUFF_SIZE]; + while (1) { + // get a lat/lng from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading lat/lng"); + } + + if (sscanf(buff, "%lf %lf", &lat, &lng) != 2) + error("parsing lat/lng"); + + // convert to H3 + doCoords(lat, lng, res); + } + } +} diff --git a/src/apps/filters/localIjToCell.c b/src/apps/filters/localIjToCell.c new file mode 100644 index 000000000..18603b27d --- /dev/null +++ b/src/apps/filters/localIjToCell.c @@ -0,0 +1,118 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief stdin/stdout filter that converts from local IJ coordinates to + * H3 indexes. + * + * See `localIjToCell --help` for usage. + * + * The program reads IJ coordinates (in the format `i j` separated by newlines) + * from stdin and outputs the corresponding H3 indexes to stdout, until EOF is + * encountered. `NA` is printed if the H3 index could not be obtained. + * + * `origin` indicates the origin (or anchoring) index for the IJ coordinate + * space. + * + * This program has the same limitations as the `localIjToCell` + * function. + */ + +#include +#include +#include + +#include "args.h" +#include "h3api.h" +#include "utility.h" + +void doCell(const CoordIJ *ij, H3Index origin) { + H3Index h; + if (H3_EXPORT(localIjToCell)(origin, ij, 0, &h)) { + printf("NA\n"); + } else { + h3Println(h); + } +} + +int main(int argc, char *argv[]) { + H3Index origin = 0; + CoordIJ ij = {0}; + + Arg helpArg = ARG_HELP; + Arg originArg = { + .names = {"-o", "--origin"}, + .scanFormat = "%" PRIx64, + .valueName = "origin", + .value = &origin, + .required = true, + .helpText = + "Origin (anchoring index) for the local coordinate system."}; + Arg iArg = {.names = {"-i", NULL}, + .scanFormat = "%d", + .valueName = "i", + .value = &ij.i, + .helpText = + "I coordinate. If not specified \"i j\" pairs will be read " + "from standard input."}; + Arg jArg = {.names = {"-j", NULL}, + .scanFormat = "%d", + .valueName = "j", + .value = &ij.j, + .helpText = "J coordinate."}; + + Arg *args[] = {&helpArg, &originArg, &iArg, &jArg}; + const int numArgs = 4; + const char *helpText = "Converts local IJ coordinates to H3 indexes"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (!H3_EXPORT(isValidCell)(origin)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Origin is invalid.", NULL); + return 1; + } + + if (iArg.found != jArg.found) { + // One is found but the other is not. + printHelp(stderr, argv[0], helpText, numArgs, args, + "I and J must both be specified.", NULL); + return 1; + } + + if (iArg.found) { + doCell(&ij, origin); + } else { + // process the coordinates on stdin + char buff[BUFF_SIZE]; + while (1) { + // get coordinates from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading IJ coordinates from stdin"); + } + + if (!sscanf(buff, "%d %d", &ij.i, &ij.j)) + error( + "Parsing IJ coordinates. Expected ` `."); + + doCell(&ij, origin); + } + } +} diff --git a/src/apps/fuzzers/README.md b/src/apps/fuzzers/README.md new file mode 100644 index 000000000..2bb4eaa8b --- /dev/null +++ b/src/apps/fuzzers/README.md @@ -0,0 +1,151 @@ +# Fuzzer harnesses for H3 + +This directory contains helper programs for testing the H3 library using the +[American fuzzy lop](https://lcamtuf.coredump.cx/afl/)/ +[AFL++](https://github.com/AFLplusplus/AFLplusplus) or +[libFuzzer](https://www.llvm.org/docs/LibFuzzer.html) fuzzers. +Fuzzing is a technique for discovering crashes and other edge cases in code +such as the H3 core library. + +# Function coverage + +The public API of H3 is covered in the following fuzzers: + +| Function | File +| -------- | ---- +| areNeighborCells | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| cellArea | [fuzzerCellArea](./fuzzerCellArea.c) +| cellToBoundary | [fuzzerCellToLatLng](./fuzzerCellToLatLng.c) +| cellToCenterChild | [fuzzerHierarchy](./fuzzerHierarchy.c) +| cellToChildPos| [fuzzerCellToChildPos](./fuzzerCellToChildPos.c) +| cellToChildren | [fuzzerHierarchy](./fuzzerHierarchy.c) +| cellToLatLng | [fuzzerCellToLatLng](./fuzzerCellToLatLng.c) +| cellToLocalIj | [fuzzerLocalIj](./fuzzerLocalIj.c) +| cellToParent | [fuzzerHierarchy](./fuzzerHierarchy.c) +| cellToVertex | [fuzzerVertexes](./fuzzerVertexes.c) +| cellToVertexes | [fuzzerVertexes](./fuzzerVertexes.c) +| cellsToDirectedEdge | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| childPosToCell| [fuzzerCellToChildPos](./fuzzerCellToChildPos.c) +| compactCells | [fuzzerCompact](./fuzzerCompact.c) +| degsToRads | Trivial +| describeH3Error | Trivial +| directedEdgeToBoundary | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| directedEdgeToCells | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| distance | [fuzzerDistances](./fuzzerDistances.c) +| edgeLength | [fuzzerEdgeLength](./fuzzerEdgeLength.c) +| getBaseCellNumber | [fuzzerCellProperties](./fuzzerCellProperties.c) +| getDirectedEdgeDestination | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| getDirectedEdgeOrigin | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| getHexagonAreaAvg | [fuzzerResolutions](./fuzzerResolutions.c) +| getHexagonEdgeLengthAvg | [fuzzerResolutions](./fuzzerResolutions.c) +| getIcosahedronFaces | [fuzzerCellProperties](./fuzzerCellProperties.c) +| getNumCells | [fuzzerResolutions](./fuzzerResolutions.c) +| getPentagons | [fuzzerResolutions](./fuzzerResolutions.c) +| getRes0Cells | Trivial +| getResolution | [fuzzerCellProperties](./fuzzerCellProperties.c) +| gridDisk | [fuzzerGridDisk](./fuzzerGridDisk.c) +| gridDiskDistances | [fuzzerGridDisk](./fuzzerGridDisk.c) +| gridDisksUnsafe | [fuzzerGridDisk](./fuzzerGridDisk.c) +| gridDistance | [fuzzerLocalIj](./fuzzerLocalIj.c) +| gridPathCells | [fuzzerLocalIj](./fuzzerLocalIj.c) +| gridRingUnsafe | [fuzzerGridDisk](./fuzzerGridDisk.c) +| h3SetToMultiPolygon | [fuzzerH3SetToLinkedGeo](./fuzzerH3SetToLinkedGeo.c) +| h3ToString | [fuzzerIndexIO](./fuzzerIndexIO.c) +| isPentagon | [fuzzerCellProperties](./fuzzerCellProperties.c) +| isResClassIII | [fuzzerCellProperties](./fuzzerCellProperties.c) +| isValidCell | [fuzzerCellProperties](./fuzzerCellProperties.c) +| isValidDirectedEdge | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| isValidVertex | [fuzzerVertexes](./fuzzerVertexes.c) +| latLngToCell | [fuzzerLatLngToCell](./fuzzerLatLngToCell.c) +| localIjToCell | [fuzzerLocalIj](./fuzzerLocalIj.c) +| originToDirectedEdges | [fuzzerDirectedEdge](./fuzzerDirectedEdge.c) +| polygonToCells | [fuzzerPoylgonToCells](./fuzzerPolygonToCells.c) +| polygonToCellsExperimental | [fuzzerPoylgonToCellsExperimental](./fuzzerPolygonToCellsExperimental.c) [fuzzerPoylgonToCellsExperimentalNoHoles](./fuzzerPolygonToCellsExperimentalNoHoles.c) +| radsToDegs | Trivial +| stringToH3 | [fuzzerIndexIO](./fuzzerIndexIO.c) +| uncompactCells | [fuzzerCompact](./fuzzerCompact.c) +| vertexToLatLng | [fuzzerVertexes](./fuzzerVertexes.c) + +## Internal function coverage + +In addition to the public API, the following internal functions of H3 are covered in fuzzers: + +| Function | File +| -------- | ---- +| h3NeighborRotations | [fuzzerInternalAlgos](./fuzzerInternalAlgos.c) +| directionForNeighbor | [fuzzerInternalAlgos](./fuzzerInternalAlgos.c) +| h3SetToVertexGraph | [fuzzerInternalAlgos](./fuzzerInternalAlgos.c) +| _vertexGraphToLinkedGeo | [fuzzerInternalAlgos](./fuzzerInternalAlgos.c) +| _upAp7Checked | [fuzzerInternalCoordIjk](./fuzzerInternalCoordIjk.c) +| _upAp7rChecked | [fuzzerInternalCoordIjk](./fuzzerInternalCoordIjk.c) +| _ijkNormalizeCouldOverflow | [fuzzerInternalCoordIjk](./fuzzerInternalCoordIjk.c) +| _ijkNormalize | [fuzzerInternalCoordIjk](./fuzzerInternalCoordIjk.c) + +# libFuzzer Usage + +libFuzzer is one of the supported fuzzing drivers. + +This is the fuzzer used in [oss-fuzz](https://github.com/google/oss-fuzz/tree/master/projects/h3). + +## Build + +You must build H3 with Clang and enable support for libFuzzer. + +``` +CC=clang cmake -DENABLE_LIBFUZZER=ON . +make fuzzers +``` + +## Run + +To begin fuzzing, execute the fuzzer binary: + +``` +fuzzerLatLngToCell +``` + +For command line options including how to specify a test corpus, consult the [libFuzzer documentation](https://www.llvm.org/docs/LibFuzzer.html#options). + +# AFL Usage + +AFL/AFL++ are supported fuzzing drivers. + +## Installation + +``` +apt install afl-clang +``` + +(There is also an afl-cov which looks interesting but isn't necessary.) + +## Build + +You must compile with the instrumented compiler: + +``` +CXX=afl-clang++ CC=afl-clang cmake . +make fuzzers +``` + +Generate a blank (zeroed) test case file. This will not be very a interesting test case but is usedful +for having files of the right size. + +``` +fuzzerLatLngToCell --generate bytes24 +``` + +An individual fuzzer run is invoked as follows. The argument is a file containing the number of bytes needed. + +``` +fuzzerLatLngToCell bytes24 +``` + +## Run + +To begin running the fuzzer, run the following. The testcase directory (`testcase_dir`) should contain a file +with at least the right number of bytes that the fuzzer will read (this can be generated using the `--generate` +option above.) + +``` +afl-fuzz -i testcase_dir -o findings_dir -- fuzzerLatLngToCell @@ +``` diff --git a/src/apps/fuzzers/fuzzerCellArea.c b/src/apps/fuzzers/fuzzerCellArea.c new file mode 100644 index 000000000..80210736f --- /dev/null +++ b/src/apps/fuzzers/fuzzerCellArea.c @@ -0,0 +1,42 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellAreaRads2 + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + double out; + H3_EXPORT(cellAreaRads2)(args->index, &out); + H3_EXPORT(cellAreaKm2)(args->index, &out); + H3_EXPORT(cellAreaM2)(args->index, &out); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerCellProperties.c b/src/apps/fuzzers/fuzzerCellProperties.c new file mode 100644 index 000000000..5cf0f40b8 --- /dev/null +++ b/src/apps/fuzzers/fuzzerCellProperties.c @@ -0,0 +1,51 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cell property functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + H3_EXPORT(getResolution)(args->index); + H3_EXPORT(getBaseCellNumber)(args->index); + H3_EXPORT(isValidCell)(args->index); + H3_EXPORT(isPentagon)(args->index); + H3_EXPORT(isResClassIII)(args->index); + + int faceCount; + H3Error err = H3_EXPORT(maxFaceCount)(args->index, &faceCount); + if (!err && faceCount > 0) { + int *out = calloc(faceCount, sizeof(int)); + H3_EXPORT(getIcosahedronFaces)(args->index, out); + free(out); + } + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerCellToChildPos.c b/src/apps/fuzzers/fuzzerCellToChildPos.c new file mode 100644 index 000000000..ba8748c9c --- /dev/null +++ b/src/apps/fuzzers/fuzzerCellToChildPos.c @@ -0,0 +1,45 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellToChildPos and related functions + */ + +#include + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + int64_t childPos; + int res; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + int64_t posOut; + H3_EXPORT(cellToChildPos)(args->index, args->res, &posOut); + H3Index cellOut; + H3_EXPORT(childPosToCell)(args->childPos, args->index, args->res, &cellOut); + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerCellToLatLng.c b/src/apps/fuzzers/fuzzerCellToLatLng.c new file mode 100644 index 000000000..9ab823b51 --- /dev/null +++ b/src/apps/fuzzers/fuzzerCellToLatLng.c @@ -0,0 +1,40 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellToLatLng and cellToBoundary + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + LatLng geo; + H3_EXPORT(cellToLatLng)(args->index, &geo); + CellBoundary cellBoundary; + H3_EXPORT(cellToBoundary)(args->index, &cellBoundary); + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerCellsToLinkedMultiPolygon.c b/src/apps/fuzzers/fuzzerCellsToLinkedMultiPolygon.c new file mode 100644 index 000000000..689a88f79 --- /dev/null +++ b/src/apps/fuzzers/fuzzerCellsToLinkedMultiPolygon.c @@ -0,0 +1,37 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellsToLinkedMultiPolygon + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + const H3Index *h3Set = (const H3Index *)data; + int sz = size / sizeof(H3Index); + + LinkedGeoPolygon polygon; + H3Error err = H3_EXPORT(cellsToLinkedMultiPolygon)(h3Set, sz, &polygon); + + if (!err) { + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + return 0; +} + +AFL_HARNESS_MAIN(sizeof(H3Index) * 1024); diff --git a/src/apps/fuzzers/fuzzerCompact.c b/src/apps/fuzzers/fuzzerCompact.c new file mode 100644 index 000000000..563bfdc6e --- /dev/null +++ b/src/apps/fuzzers/fuzzerCompact.c @@ -0,0 +1,56 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for compactCells and uncompactCells + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +const int MAX_UNCOMPACT_RES = 9; +const int64_t MAX_UNCOMPACT_SIZE = 4000000; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(H3Index) * 2) { + return 0; + } + + uint8_t res = *data; + H3Index *input = (H3Index *)(data + sizeof(H3Index)); + size_t inputSize = (size - sizeof(H3Index)) / sizeof(H3Index); + + // fuzz compactCells + H3Index *compacted = calloc(inputSize, sizeof(H3Index)); + H3_EXPORT(compactCells)(input, compacted, inputSize); + free(compacted); + + // fuzz uncompactCells using the original input + int64_t uncompactedSize; + H3Error err = + H3_EXPORT(uncompactCellsSize)(input, inputSize, res, &uncompactedSize); + + if (!err && uncompactedSize < MAX_UNCOMPACT_SIZE) { + H3Index *uncompacted = calloc(uncompactedSize, sizeof(H3Index)); + H3_EXPORT(uncompactCells) + (input, inputSize, uncompacted, uncompactedSize, res); + free(uncompacted); + } + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(H3Index) * 1024); diff --git a/src/apps/fuzzers/fuzzerDirectedEdge.c b/src/apps/fuzzers/fuzzerDirectedEdge.c new file mode 100644 index 000000000..e431854a2 --- /dev/null +++ b/src/apps/fuzzers/fuzzerDirectedEdge.c @@ -0,0 +1,54 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellsToDirectedEdge and related functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + H3Index index2; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + // Note that index and index2 need to be plausibly neighbors + // for most of these + int outBool; + H3_EXPORT(areNeighborCells)(args->index, args->index2, &outBool); + H3Index out; + H3_EXPORT(cellsToDirectedEdge)(args->index, args->index2, &out); + H3_EXPORT(isValidDirectedEdge)(args->index); + H3_EXPORT(getDirectedEdgeOrigin)(args->index, &out); + H3_EXPORT(getDirectedEdgeDestination)(args->index, &out); + H3Index out2[2]; + H3_EXPORT(directedEdgeToCells)(args->index, out2); + H3Index out6[6]; + H3_EXPORT(originToDirectedEdges)(args->index, out6); + CellBoundary bndry; + H3_EXPORT(directedEdgeToBoundary)(args->index, &bndry); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerDistances.c b/src/apps/fuzzers/fuzzerDistances.c new file mode 100644 index 000000000..16b41566a --- /dev/null +++ b/src/apps/fuzzers/fuzzerDistances.c @@ -0,0 +1,42 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for distanceRads + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + LatLng a; + LatLng b; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + H3_EXPORT(greatCircleDistanceRads)(&args->a, &args->b); + H3_EXPORT(greatCircleDistanceKm)(&args->a, &args->b); + H3_EXPORT(greatCircleDistanceM)(&args->a, &args->b); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerEdgeLength.c b/src/apps/fuzzers/fuzzerEdgeLength.c new file mode 100644 index 000000000..9b9ee4735 --- /dev/null +++ b/src/apps/fuzzers/fuzzerEdgeLength.c @@ -0,0 +1,42 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for edgeLengthRads + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + double distance; + H3_EXPORT(edgeLengthRads)(args->index, &distance); + H3_EXPORT(edgeLengthKm)(args->index, &distance); + H3_EXPORT(edgeLengthM)(args->index, &distance); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerGridDisk.c b/src/apps/fuzzers/fuzzerGridDisk.c new file mode 100644 index 000000000..7baf5bd45 --- /dev/null +++ b/src/apps/fuzzers/fuzzerGridDisk.c @@ -0,0 +1,107 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for gridDisk + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + int k; +} inputArgs; + +// This is limited to avoid timeouts due to the runtime of gridDisk growing with +// k +const int64_t MAX_GRID_DISK_SIZE = 10000; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + int64_t sz; + H3Error err = H3_EXPORT(maxGridDiskSize)(args->k, &sz); + if (err || sz > MAX_GRID_DISK_SIZE || sz < 0) { + // Can't allocate - do not test for cases where sz is extremely large + // because this is expected to hang, and do not test for cases where + // sizeof(H3Index) * sz overflows (this is undefined behavior per C + // and will stop the fuzzer from making progress). + return 0; + } + H3Index *results = calloc(sizeof(H3Index), sz); + if (results != NULL) { + H3_EXPORT(gridDisk)(args->index, args->k, results); + } + free(results); + + results = calloc(sizeof(H3Index), sz); + if (results != NULL) { + H3_EXPORT(gridDiskUnsafe)(args->index, args->k, results); + } + free(results); + + // TODO: use int64_t + int *distances = calloc(sizeof(int), sz); + results = calloc(sizeof(H3Index), sz); + if (results != NULL && distances != NULL) { + H3_EXPORT(gridDiskDistancesUnsafe) + (args->index, args->k, results, distances); + } + free(results); + free(distances); + + distances = calloc(sizeof(int), sz); + results = calloc(sizeof(H3Index), sz); + if (results != NULL && distances != NULL) { + H3_EXPORT(gridDiskDistancesSafe) + (args->index, args->k, results, distances); + } + free(results); + free(distances); + + distances = calloc(sizeof(int), sz); + results = calloc(sizeof(H3Index), sz); + if (results != NULL && distances != NULL) { + H3_EXPORT(gridDiskDistances)(args->index, args->k, results, distances); + } + free(results); + free(distances); + + results = calloc(sizeof(H3Index), sz); + if (results != NULL) { + H3_EXPORT(gridRingUnsafe)(args->index, args->k, results); + } + free(results); + + size_t length = (size - sizeof(inputArgs)) / sizeof(H3Index); + if (sz * length > MAX_GRID_DISK_SIZE) { + // Can't allocate. + return 0; + } + results = calloc(sizeof(H3Index), sz * length); + if (results != NULL) { + H3Index *h3Set = (H3Index *)(data + sizeof(inputArgs)); + H3_EXPORT(gridDisksUnsafe)(h3Set, length, args->k, results); + } + free(results); + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerHierarchy.c b/src/apps/fuzzers/fuzzerHierarchy.c new file mode 100644 index 000000000..b3a6299b6 --- /dev/null +++ b/src/apps/fuzzers/fuzzerHierarchy.c @@ -0,0 +1,64 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellToParent and cellToChildren functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +#define MAX_CHILDREN_DIFF 10 + +typedef struct { + H3Index index; + int parentRes; + int childRes; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + H3Index parent; + H3_EXPORT(cellToParent)(args->index, args->parentRes, &parent); + + H3Index out; + H3_EXPORT(cellToCenterChild)(args->index, args->childRes, &out); + + // Check for underflow before using args->childRes in subtraction. + // getResolution will always produce outputs in the range of [0, 15], never + // negative. + if (args->childRes >= INT32_MIN + H3_EXPORT(getResolution)(args->index)) { + int resDiff = args->childRes - H3_EXPORT(getResolution)(args->index); + if (resDiff < MAX_CHILDREN_DIFF) { + int64_t childrenSize; + H3Error err = H3_EXPORT(cellToChildrenSize)( + args->index, args->childRes, &childrenSize); + if (!err) { + H3Index *children = calloc(childrenSize, sizeof(H3Index)); + H3_EXPORT(cellToChildren) + (args->index, args->childRes, children); + free(children); + } + } + } + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerIndexIO.c b/src/apps/fuzzers/fuzzerIndexIO.c new file mode 100644 index 000000000..8746c9476 --- /dev/null +++ b/src/apps/fuzzers/fuzzerIndexIO.c @@ -0,0 +1,50 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for h3ToString and stringToH3 + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +#define STRING_LENGTH 32 + +typedef struct { + H3Index index; + char str[STRING_LENGTH]; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + inputArgs args; + // Copy the input data array since we need to modify it on the next line + // to ensure it is zero terminated. (We are not interested in non-zero + // terminated bugs since that fails the contract.) + memcpy(&args, data, sizeof(inputArgs)); + args.str[STRING_LENGTH - 1] = 0; + + char str[STRING_LENGTH]; + H3_EXPORT(h3ToString)(args.index, str, STRING_LENGTH); + H3Index index; + H3_EXPORT(stringToH3)(args.str, &index); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerInternalAlgos.c b/src/apps/fuzzers/fuzzerInternalAlgos.c new file mode 100644 index 000000000..f70a43c35 --- /dev/null +++ b/src/apps/fuzzers/fuzzerInternalAlgos.c @@ -0,0 +1,57 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for internal functions in algos.c + */ + +#include "aflHarness.h" +#include "algos.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + Direction dir; + int rotations; + H3Index index2; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + H3Index out; + int rotations = args->rotations; + h3NeighborRotations(args->index, args->dir, &rotations, &out); + + directionForNeighbor(args->index, args->index2); + + VertexGraph graph; + H3Index *h3Set = (H3Index *)data; + size_t inputSize = size / sizeof(H3Index); + H3Error err = h3SetToVertexGraph(h3Set, inputSize, &graph); + if (!err) { + LinkedGeoPolygon linkedGeoPolygon; + _vertexGraphToLinkedGeo(&graph, &linkedGeoPolygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&linkedGeoPolygon); + destroyVertexGraph(&graph); + } + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerInternalCoordIjk.c b/src/apps/fuzzers/fuzzerInternalCoordIjk.c new file mode 100644 index 000000000..9c84c80e4 --- /dev/null +++ b/src/apps/fuzzers/fuzzerInternalCoordIjk.c @@ -0,0 +1,53 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for internal functions in coordijk.c + */ + +#include "aflHarness.h" +#include "algos.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + CoordIJK ijk; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + // These functions require that input be non-negative + if (args->ijk.i >= 0 && args->ijk.j >= 0 && args->ijk.k >= 0) { + CoordIJK ijkCopy1 = args->ijk; + _upAp7Checked(&ijkCopy1); + CoordIJK ijkCopy2 = args->ijk; + _upAp7rChecked(&ijkCopy2); + } + // This function needs a guard check to be safe and that guard + // check assumes k = 0. + CoordIJK ijkCopy3 = args->ijk; + ijkCopy3.k = 0; + if (!_ijkNormalizeCouldOverflow(&ijkCopy3)) { + _ijkNormalize(&ijkCopy3); + } + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerLatLngToCell.c b/src/apps/fuzzers/fuzzerLatLngToCell.c new file mode 100644 index 000000000..657f77d5f --- /dev/null +++ b/src/apps/fuzzers/fuzzerLatLngToCell.c @@ -0,0 +1,41 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for latLngToCell + */ + +#include "aflHarness.h" +#include "h3api.h" + +typedef struct { + double lat; + double lng; + int res; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + LatLng g = {.lat = args->lat, .lng = args->lng}; + H3Index h; + H3_EXPORT(latLngToCell)(&g, args->res, &h); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerLocalIj.c b/src/apps/fuzzers/fuzzerLocalIj.c new file mode 100644 index 000000000..810983793 --- /dev/null +++ b/src/apps/fuzzers/fuzzerLocalIj.c @@ -0,0 +1,77 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for local IJ and related functions (gridDistance, + * gridPathCells) + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + H3Index index2; + int i; + int j; + uint32_t mode; +} inputArgs; + +void testTwoIndexes(H3Index index, H3Index index2) { + int64_t distance; + H3_EXPORT(gridDistance)(index, index2, &distance); + int64_t size; + H3Error err = H3_EXPORT(gridPathCellsSize)(index, index2, &size); + if (!err) { + H3Index *output = calloc(size, sizeof(H3Index)); + H3_EXPORT(gridPathCells)(index, index2, output); + free(output); + } +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + // Note that index and index2 need to be in the approximate area for these + // tests to make sense. + // Test with mode set to 0 since that is expected to yield more interesting + // results. + testTwoIndexes(args->index, args->index2); + H3Index out; + CoordIJ ij = {.i = args->i, .j = args->j}; + H3Error err = H3_EXPORT(localIjToCell)(args->index, &ij, 0, &out); + if (!err) { + testTwoIndexes(args->index, out); + } + + H3_EXPORT(cellToLocalIj)(args->index, args->index2, 0, &ij); + + // Test again with mode + uint32_t mode = args->mode; + err = H3_EXPORT(localIjToCell)(args->index, &ij, mode, &out); + if (!err) { + testTwoIndexes(args->index, out); + } + + H3_EXPORT(cellToLocalIj)(args->index, args->index2, mode, &ij); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerPolygonToCells.c b/src/apps/fuzzers/fuzzerPolygonToCells.c new file mode 100644 index 000000000..84fe863b7 --- /dev/null +++ b/src/apps/fuzzers/fuzzerPolygonToCells.c @@ -0,0 +1,104 @@ +/* + * Copyright 2022-2024 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for polygonToCells and related functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "polygon.h" +#include "utility.h" + +typedef struct { + int res; + int numHoles; + // repeating: num verts, verts + // We add a large fixed buffer so our test case generator for AFL + // knows how large to make the file. + uint8_t buffer[1024]; +} inputArgs; + +const int MAX_RES = 15; +const int MAX_SZ = 4000000; +const int MAX_HOLES = 100; + +int populateGeoLoop(GeoLoop *g, const uint8_t *data, size_t *offset, + size_t size) { + if (size < *offset + sizeof(int)) { + return 1; + } + int numVerts = *(const int *)(data + *offset); + *offset = *offset + sizeof(int); + g->numVerts = numVerts; + if (size < *offset + sizeof(LatLng) * numVerts) { + return 1; + } + g->verts = (LatLng *)(data + *offset); + *offset = *offset + sizeof(LatLng) * numVerts; + return 0; +} + +void run(GeoPolygon *geoPolygon, uint32_t flags, int res) { + int64_t sz; + H3Error err = H3_EXPORT(maxPolygonToCellsSize)(geoPolygon, res, flags, &sz); + if (!err && sz < MAX_SZ) { + H3Index *out = calloc(sz, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(geoPolygon, res, flags, out); + free(out); + } +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // TODO: It is difficult for the fuzzer to generate inputs that are + // considered valid by this fuzzer. fuzzerPolygonToCellsNoHoles.c + // is a workaround for that. + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + int res = args->res % (MAX_RES + 1); + + GeoPolygon geoPolygon; + int originalNumHoles = args->numHoles % MAX_HOLES; + geoPolygon.numHoles = originalNumHoles; + if (geoPolygon.numHoles < 0) { + return 0; + } + geoPolygon.holes = calloc(geoPolygon.numHoles, sizeof(GeoLoop)); + size_t offset = sizeof(inputArgs) - sizeof(args->buffer); + if (populateGeoLoop(&geoPolygon.geoloop, data, &offset, size)) { + free(geoPolygon.holes); + return 0; + } + for (int i = 0; i < geoPolygon.numHoles; i++) { + if (populateGeoLoop(&geoPolygon.holes[i], data, &offset, size)) { + free(geoPolygon.holes); + return 0; + } + } + + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + geoPolygon.numHoles = originalNumHoles; + run(&geoPolygon, 0, res); + geoPolygon.numHoles = 0; + run(&geoPolygon, 0, res); + } + free(geoPolygon.holes); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerPolygonToCellsExperimental.c b/src/apps/fuzzers/fuzzerPolygonToCellsExperimental.c new file mode 100644 index 000000000..aaa7e4673 --- /dev/null +++ b/src/apps/fuzzers/fuzzerPolygonToCellsExperimental.c @@ -0,0 +1,106 @@ +/* + * Copyright 2023-2024 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for polygonToCells2 and related functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "polyfill.h" +#include "polygon.h" +#include "utility.h" + +typedef struct { + int res; + int numHoles; + // repeating: num verts, verts + // We add a large fixed buffer so our test case generator for AFL + // knows how large to make the file. + uint8_t buffer[1024]; +} inputArgs; + +const int MAX_RES = 15; +const int MAX_SZ = 4000000; +const int MAX_HOLES = 100; + +int populateGeoLoop(GeoLoop *g, const uint8_t *data, size_t *offset, + size_t size) { + if (size < *offset + sizeof(int)) { + return 1; + } + int numVerts = *(const int *)(data + *offset); + *offset = *offset + sizeof(int); + g->numVerts = numVerts; + if (size < *offset + sizeof(LatLng) * numVerts) { + return 1; + } + g->verts = (LatLng *)(data + *offset); + *offset = *offset + sizeof(LatLng) * numVerts; + return 0; +} + +void run(GeoPolygon *geoPolygon, uint32_t flags, int res) { + int64_t sz; + H3Error err = H3_EXPORT(maxPolygonToCellsSizeExperimental)(geoPolygon, res, + flags, &sz); + if (!err && sz < MAX_SZ) { + H3Index *out = calloc(sz, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental)(geoPolygon, res, flags, sz, out); + free(out); + } +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // TODO: It is difficult for the fuzzer to generate inputs that are + // considered valid by this fuzzer. fuzzerPolygonToCellsNoHoles.c + // is a workaround for that. + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + int res = args->res % (MAX_RES + 1); + + GeoPolygon geoPolygon; + int originalNumHoles = args->numHoles % MAX_HOLES; + geoPolygon.numHoles = originalNumHoles; + if (geoPolygon.numHoles < 0) { + return 0; + } + geoPolygon.holes = calloc(geoPolygon.numHoles, sizeof(GeoLoop)); + size_t offset = sizeof(inputArgs) - sizeof(args->buffer); + if (populateGeoLoop(&geoPolygon.geoloop, data, &offset, size)) { + free(geoPolygon.holes); + return 0; + } + for (int i = 0; i < geoPolygon.numHoles; i++) { + if (populateGeoLoop(&geoPolygon.holes[i], data, &offset, size)) { + free(geoPolygon.holes); + return 0; + } + } + + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + geoPolygon.numHoles = originalNumHoles; + run(&geoPolygon, flags, res); + geoPolygon.numHoles = 0; + run(&geoPolygon, flags, res); + } + free(geoPolygon.holes); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerPolygonToCellsExperimentalNoHoles.c b/src/apps/fuzzers/fuzzerPolygonToCellsExperimentalNoHoles.c new file mode 100644 index 000000000..d6d7c7e6c --- /dev/null +++ b/src/apps/fuzzers/fuzzerPolygonToCellsExperimentalNoHoles.c @@ -0,0 +1,64 @@ +/* + * Copyright 2023-2024 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for polygonToCellsExperimental and related functions, + * without holes + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "polyfill.h" +#include "polygon.h" +#include "utility.h" + +const int MAX_RES = 15; +const int MAX_SZ = 4000000; + +void run(GeoPolygon *geoPolygon, uint32_t flags, int res) { + int64_t sz; + H3Error err = H3_EXPORT(maxPolygonToCellsSizeExperimental)(geoPolygon, res, + flags, &sz); + if (!err && sz < MAX_SZ) { + H3Index *out = calloc(sz, sizeof(H3Index)); + H3_EXPORT(polygonToCellsExperimental)(geoPolygon, res, flags, sz, out); + free(out); + } +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(int)) { + return 0; + } + + uint8_t res = *data; + size_t vertsSize = size - 1; + int numVerts = vertsSize / sizeof(LatLng); + + GeoPolygon geoPolygon; + geoPolygon.numHoles = 0; + geoPolygon.holes = NULL; + geoPolygon.geoloop.numVerts = numVerts; + // Offset by 1 since *data was used for `res`, above. + geoPolygon.geoloop.verts = (LatLng *)(data + 1); + + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + run(&geoPolygon, flags, res); + } + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(H3Index) * 1024); diff --git a/src/apps/fuzzers/fuzzerPolygonToCellsNoHoles.c b/src/apps/fuzzers/fuzzerPolygonToCellsNoHoles.c new file mode 100644 index 000000000..b4e1d47bf --- /dev/null +++ b/src/apps/fuzzers/fuzzerPolygonToCellsNoHoles.c @@ -0,0 +1,61 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for polygonToCells and related functions, without holes + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "polygon.h" +#include "utility.h" + +const int MAX_RES = 15; +const int MAX_SZ = 4000000; + +void run(GeoPolygon *geoPolygon, uint32_t flags, int res) { + int64_t sz; + H3Error err = H3_EXPORT(maxPolygonToCellsSize)(geoPolygon, res, flags, &sz); + if (!err && sz < MAX_SZ) { + H3Index *out = calloc(sz, sizeof(H3Index)); + H3_EXPORT(polygonToCells)(geoPolygon, res, flags, out); + free(out); + } +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(int)) { + return 0; + } + + uint8_t res = *data; + size_t vertsSize = size - 1; + int numVerts = vertsSize / sizeof(LatLng); + + GeoPolygon geoPolygon; + geoPolygon.numHoles = 0; + geoPolygon.holes = NULL; + geoPolygon.geoloop.numVerts = numVerts; + // Offset by 1 since *data was used for `res`, above. + geoPolygon.geoloop.verts = (LatLng *)(data + 1); + + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + run(&geoPolygon, flags, res); + } + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(H3Index) * 1024); diff --git a/src/apps/fuzzers/fuzzerResolutions.c b/src/apps/fuzzers/fuzzerResolutions.c new file mode 100644 index 000000000..a3d4d8d06 --- /dev/null +++ b/src/apps/fuzzers/fuzzerResolutions.c @@ -0,0 +1,49 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for resolution specific functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + int res; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + double out; + H3_EXPORT(getHexagonAreaAvgKm2)(args->res, &out); + H3_EXPORT(getHexagonAreaAvgM2)(args->res, &out); + H3_EXPORT(getHexagonEdgeLengthAvgKm)(args->res, &out); + H3_EXPORT(getHexagonEdgeLengthAvgM)(args->res, &out); + + int64_t outInt; + H3_EXPORT(getNumCells)(args->res, &outInt); + + H3Index pentagons[12]; + H3_EXPORT(getPentagons)(args->res, pentagons); + + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/fuzzers/fuzzerVertexes.c b/src/apps/fuzzers/fuzzerVertexes.c new file mode 100644 index 000000000..2ff808b86 --- /dev/null +++ b/src/apps/fuzzers/fuzzerVertexes.c @@ -0,0 +1,45 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief Fuzzer program for cellToVertex and related functions + */ + +#include "aflHarness.h" +#include "h3api.h" +#include "utility.h" + +typedef struct { + H3Index index; + int vertexNum; +} inputArgs; + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < sizeof(inputArgs)) { + return 0; + } + const inputArgs *args = (const inputArgs *)data; + + H3Index out; + H3_EXPORT(cellToVertex)(args->index, args->vertexNum, &out); + H3Index outArr[6]; + H3_EXPORT(cellToVertexes)(args->index, outArr); + LatLng geo; + H3_EXPORT(vertexToLatLng)(args->index, &geo); + H3_EXPORT(isValidVertex)(args->index); + return 0; +} + +AFL_HARNESS_MAIN(sizeof(inputArgs)); diff --git a/src/apps/miscapps/README.md b/src/apps/miscapps/README.md new file mode 100644 index 000000000..362425b78 --- /dev/null +++ b/src/apps/miscapps/README.md @@ -0,0 +1,18 @@ +# miscapps + +These apps generate data, either static tables used in the library or test data used in regression tests. + +## Generate Test Data + +For a specific base cell at a specific res: + + ./bin/cellToLatLngHier -p 800bfffffffffff -r 8 > tests/inputfiles/bc05r08centers.txt + ./bin/cellToBoundaryHier -p 800bfffffffffff -r 8 > tests/inputfiles/bc05r08cells.txt + +For all cells at a given res: + + ./bin/h3ToHier -r 0 | xargs -I {} ./bin/cellToBoundaryHier -p {} -r 3 > tests/inputfiles/res03cells.txt + +For a random sample of cells at a given res: + + ./bin/mkRandGeoBoundary -n 5000 -r 5 > tests/inputfiles/rand05cells.txt diff --git a/src/apps/miscapps/cellToBoundaryHier.c b/src/apps/miscapps/cellToBoundaryHier.c new file mode 100644 index 000000000..b41178fc9 --- /dev/null +++ b/src/apps/miscapps/cellToBoundaryHier.c @@ -0,0 +1,171 @@ +/* + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief takes an H3 index and generates cell boundaries for all descendants + * at a specified resolution. + * + * See `cellToBoundaryHier` for usage. + * + * The program generates the cell boundaries in lat/lng coordinates for all + * hierarchical children of H3Index at the specified resolution. If the + * specified resolution is less than or equal to the resolution of H3Index + * the single cell H3Index is processed. + * + * `resolution` should be a positive integer. The default is 0 (i.e., only the + * specified cell H3Index would be processed). + * + * `--kml` indicates KML output format; if not specified plain text output is + * the default. + * + * Examples: + * --------- + * + * `cellToBoundaryHier --parent 836e9bfffffffff` + * - outputs the cell boundary in lat/lng for cell `836e9bfffffffff` as + * plain text + * + * `cellToBoundaryHier --parent 820ceffffffffff --resolution 4 --kml > + * cells.kml` + * - outputs the cell boundaries of all of the resolution 4 descendants + * of cell `820ceffffffffff` as a KML file (redirected to `cells.kml`). + * + * `cellToBoundaryHier --parent 86283082fffffff --resolution 9 --kml > + * uber9cells.kml` + * - creates a KML file containing the cell boundaries of all of the + * resolution 9 hexagons covering Uber HQ and the surrounding region of + * San Francisco + */ + +#include +#include +#include +#include + +#include "args.h" +#include "baseCells.h" +#include "h3Index.h" +#include "h3api.h" +#include "kml.h" +#include "utility.h" + +void doCell(H3Index h, int isKmlOut) { + CellBoundary b; + H3_EXPORT(cellToBoundary)(h, &b); + + char label[BUFF_SIZE]; + H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); + + if (isKmlOut) { + outputBoundaryKML(&b, label); + } else { + printf("%s\n", label); + cellBoundaryPrintln(&b); + } +} + +void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { + for (int d = 0; d < 7; d++) { + // skip the pentagonal deleted subsequence + if (H3_EXPORT(isPentagon)(h) && d == 1) { + continue; + } + + H3_SET_INDEX_DIGIT(h, res, d); + + if (res == H3_GET_RESOLUTION(h)) { + doCell(h, isKmlOut); + } else { + recursiveH3IndexToGeo(h, res + 1, isKmlOut); + } + } +} + +int main(int argc, char *argv[]) { + int res; + H3Index parentIndex = 0; + + Arg helpArg = ARG_HELP; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, if less than the resolution of the parent " + "only the parent is printed. Default the resolution of " + "the parent."}; + Arg parentArg = { + .names = {"-p", "--parent"}, + .scanFormat = "%" PRIx64, + .valueName = "parent", + .value = &parentIndex, + .required = true, + .helpText = "Print cell boundaries descendent from this index."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); + + Arg *args[] = {&helpArg, &resArg, &parentArg, + &kmlArg, &kmlNameArg, &kmlDescArg}; + const int numArgs = 6; + const char *helpText = "Print cell boundaries for descendants of an index"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } + + if (!H3_EXPORT(isValidCell)(parentIndex)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Parent index is invalid.", NULL); + return 1; + } + + int rootRes = H3_GET_RESOLUTION(parentIndex); + + if (kmlArg.found) { + char *kmlName; + if (kmlNameArg.found) { + kmlName = strdup(userKmlName); + } else { + kmlName = calloc(BUFF_SIZE, sizeof(char)); + + sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex, + ((res <= rootRes) ? rootRes : res)); + } + + char *kmlDesc = "Generated by cellToBoundaryHier"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; + + kmlBoundaryHeader(kmlName, kmlDesc); + + free(kmlName); + } + + // generate the points + if (res <= rootRes) { + doCell(parentIndex, kmlArg.found); + } else { + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found); + } + + if (kmlArg.found) kmlBoundaryFooter(); +} diff --git a/src/apps/miscapps/cellToLatLngHier.c b/src/apps/miscapps/cellToLatLngHier.c new file mode 100644 index 000000000..3e6a55d1a --- /dev/null +++ b/src/apps/miscapps/cellToLatLngHier.c @@ -0,0 +1,173 @@ +/* + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief takes an H3 index and generates cell center points for descendants a + * specified resolution. + * + * See `cellToLatLngHier --help` for usage. + * + * The program generates the cell center points in lat/lng coordinates for all + * hierarchical children of H3Index at the specified resolution. If the + * specified resolution is less than or equal to the resolution of H3Index + * the single cell H3Index is processed. + * + * `resolution` should be a positive integer. The default is 0 (i.e., only the + * specified cell H3Index would be processed). + * + * `--kml` indicates KML output format; if not specified plain text output is + * the default. + * + * Examples: + * --------- + * + * `cellToLatLngHier --parent 836e9bfffffffff` + * - outputs the cell center point in lat/lng for cell + * `836e9bfffffffff` as plain text + * + * `cellToLatLngHier --parent 820ceffffffffff --resolution 4 --kml > + * pts.kml` + * - outputs the cell center points of all of the resolution 4 + * descendants of cell `820ceffffffffff` as a KML file (redirected to + * `pts.kml`). + * + * `cellToLatLngHier --parent 86283082fffffff --resolution 9 --kml > + * uber9pts.kml` + * - creates a KML file containing the cell center points of all of the + * resolution 9 hexagons covering Uber HQ and the surrounding region of + * San Francisco. + */ + +#include +#include +#include +#include + +#include "args.h" +#include "h3Index.h" +#include "h3api.h" +#include "kml.h" +#include "utility.h" + +void doCell(H3Index h, int isKmlOut) { + LatLng g; + H3_EXPORT(cellToLatLng)(h, &g); + + char label[BUFF_SIZE]; + H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); + + if (isKmlOut) { + outputPointKML(&g, label); + } else { + printf("%s ", label); + geoPrintlnNoFmt(&g); + } +} + +void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { + for (int d = 0; d < 7; d++) { + // skip the pentagonal deleted subsequence + if (H3_EXPORT(isPentagon)(h) && d == 1) { + continue; + } + + H3_SET_INDEX_DIGIT(h, res, d); + + if (res == H3_GET_RESOLUTION(h)) { + doCell(h, isKmlOut); + } else { + recursiveH3IndexToGeo(h, res + 1, isKmlOut); + } + } +} + +int main(int argc, char *argv[]) { + int res = 0; + H3Index parentIndex = 0; + + Arg helpArg = ARG_HELP; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, if less than the resolution of the parent " + "only the parent is printed. Default the resolution of " + "the parent."}; + Arg parentArg = { + .names = {"-p", "--parent"}, + .scanFormat = "%" PRIx64, + .valueName = "parent", + .value = &parentIndex, + .required = true, + .helpText = "Print cell centers descendent from this index."}; + Arg kmlArg = ARG_KML; + DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg); + DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg); + + Arg *args[] = {&helpArg, &resArg, &parentArg, + &kmlArg, &kmlNameArg, &kmlDescArg}; + const int numArgs = 6; + const char *helpText = + "Print cell center points for descendants of an index"; + + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } + + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } + + if (!H3_EXPORT(isValidCell)(parentIndex)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Parent index is invalid.", NULL); + return 1; + } + + int rootRes = H3_GET_RESOLUTION(parentIndex); + + if (kmlArg.found) { + char *kmlName; + if (kmlNameArg.found) { + kmlName = strdup(userKmlName); + } else { + kmlName = calloc(BUFF_SIZE, sizeof(char)); + + sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex, + ((res <= rootRes) ? rootRes : res)); + } + + char *kmlDesc = "Generated by cellToLatLngHier"; + if (kmlDescArg.found) kmlDesc = userKmlDesc; + + kmlBoundaryHeader(kmlName, kmlDesc); + + free(kmlName); + } + + // generate the points + + if (res <= rootRes) { + doCell(parentIndex, kmlArg.found); + } else { + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found); + } + + if (kmlArg.found) kmlBoundaryFooter(); +} diff --git a/src/apps/miscapps/generateBaseCellNeighbors.c b/src/apps/miscapps/generateBaseCellNeighbors.c index f2e0c5379..2b22469e6 100644 --- a/src/apps/miscapps/generateBaseCellNeighbors.c +++ b/src/apps/miscapps/generateBaseCellNeighbors.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,13 +81,13 @@ static void auditBaseCellNeighbors(int baseCellNeighbors[NUM_BASE_CELLS][7], /** * Generates and prints the baseCellNeighbors and baseCellRotations tables. */ -static void generate() { +static void generate(void) { int baseCellNeighbors[NUM_BASE_CELLS][7]; int baseCellRotations[NUM_BASE_CELLS][7]; for (int i = 0; i < NUM_BASE_CELLS; i++) { if (!_isBaseCellPentagon(i)) { - for (int dir = 0; dir <= NUM_DIRS; dir++) { + for (int dir = CENTER_DIGIT; dir <= NUM_DIRS; dir++) { FaceIJK fijk; _baseCellToFaceIjk(i, &fijk); _neighbor(&fijk.coord, dir); @@ -161,7 +161,7 @@ static void generate() { if (dir == K_AXES_DIGIT) { // 4 and 117 are 'polar' type pentagons, which have // some different behavior. - if (i == 4 || i == 117) { + if (_isBaseCellPentagon(i)) { _ijkRotate60cw(&ijk); _ijkRotate60cw(&ijk); } else { @@ -172,7 +172,7 @@ static void generate() { // Adjust for the deleted k-subsequence distortion int rotAdj = 0; - if (i == 4 || i == 117) { + if (_isBaseCellPolarPentagon(i)) { // 'polar' type pentagon with all faces pointing // towards i if (dir == IK_AXES_DIGIT) { @@ -250,7 +250,7 @@ static void generate() { printf("};\n"); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { // check command line args if (argc > 1) { fprintf(stderr, "usage: %s\n", argv[0]); diff --git a/src/apps/miscapps/generateFaceCenterPoint.c b/src/apps/miscapps/generateFaceCenterPoint.c index 68752efb0..027c6e63c 100644 --- a/src/apps/miscapps/generateFaceCenterPoint.c +++ b/src/apps/miscapps/generateFaceCenterPoint.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,16 +20,42 @@ */ #include + #include "faceijk.h" #include "vec3d.h" +/** @brief icosahedron face centers in lat/lng radians. Copied from faceijk.c. + */ +const LatLng faceCenterGeoCopy[NUM_ICOSA_FACES] = { + {0.803582649718989942, 1.248397419617396099}, // face 0 + {1.307747883455638156, 2.536945009877921159}, // face 1 + {1.054751253523952054, -1.347517358900396623}, // face 2 + {0.600191595538186799, -0.450603909469755746}, // face 3 + {0.491715428198773866, 0.401988202911306943}, // face 4 + {0.172745327415618701, 1.678146885280433686}, // face 5 + {0.605929321571350690, 2.953923329812411617}, // face 6 + {0.427370518328979641, -1.888876200336285401}, // face 7 + {-0.079066118549212831, -0.733429513380867741}, // face 8 + {-0.230961644455383637, 0.506495587332349035}, // face 9 + {0.079066118549212831, 2.408163140208925497}, // face 10 + {0.230961644455383637, -2.635097066257444203}, // face 11 + {-0.172745327415618701, -1.463445768309359553}, // face 12 + {-0.605929321571350690, -0.187669323777381622}, // face 13 + {-0.427370518328979641, 1.252716453253507838}, // face 14 + {-0.600191595538186799, 2.690988744120037492}, // face 15 + {-0.491715428198773866, -2.739604450678486295}, // face 16 + {-0.803582649718989942, -1.893195233972397139}, // face 17 + {-1.307747883455638156, -0.604647643711872080}, // face 18 + {-1.054751253523952054, 1.794075294689396615}, // face 19 +}; + /** * Generates and prints the faceCenterPoint table. */ -static void generate() { +static void generate(void) { printf("static const Vec3d faceCenterPoint[NUM_ICOSA_FACES] = {\n"); for (int i = 0; i < NUM_ICOSA_FACES; i++) { - GeoCoord centerCoords = faceCenterGeo[i]; + LatLng centerCoords = faceCenterGeoCopy[i]; Vec3d centerPoint; _geoToVec3d(¢erCoords, ¢erPoint); printf(" {%.16f, %.16f, %.16f}, // face %2d\n", centerPoint.x, @@ -38,7 +64,7 @@ static void generate() { printf("};\n"); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { // check command line args if (argc > 1) { fprintf(stderr, "usage: %s\n", argv[0]); diff --git a/src/apps/miscapps/generateNumHexagons.c b/src/apps/miscapps/generateNumHexagons.c deleted file mode 100644 index 41326dc29..000000000 --- a/src/apps/miscapps/generateNumHexagons.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file generateNumHexagons.c - * @brief Generates the tables for numHexagons. - * - * usage: `generateNumHexagons` - * - * This program generates the number of unique indexes (not necessarily - * hexagons) at each H3 resolution. It assumes aperture 7 and 12 pentagons - * per resolution. - */ - -#include -#include -#include -#include "constants.h" - -#define NUM_PENTAGONS 12 - -/** - * Generates and prints the numHexagons table. - */ -static void generate() { - printf("static const int64_t nums[] = {\n"); - int64_t count = NUM_BASE_CELLS; - for (int i = 0; i <= MAX_H3_RES; i++) { - printf(" %" PRId64 "L,\n", count); - // Each hexagon has 7 children, and each pentagon has 6 children - count = ((count - NUM_PENTAGONS) * 7) + (NUM_PENTAGONS * 6); - } - printf("};\n"); -} - -int main(int argc, char* argv[]) { - // check command line args - if (argc > 1) { - fprintf(stderr, "usage: %s\n", argv[0]); - exit(1); - } - - generate(); -} diff --git a/src/apps/miscapps/generatePentagonDirectionFaces.c b/src/apps/miscapps/generatePentagonDirectionFaces.c new file mode 100644 index 000000000..468d238bb --- /dev/null +++ b/src/apps/miscapps/generatePentagonDirectionFaces.c @@ -0,0 +1,68 @@ +/* + * Copyright 2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file generatePentagonDirectionFaces.c + * @brief Generates the pentagonDirectionFaces table + * + * usage: `generatePentagonDirectionFaces` + */ + +#include + +#include "algos.h" +#include "baseCells.h" +#include "h3Index.h" + +static void generate(void) { + H3Index pentagons[NUM_PENTAGONS] = {0}; + // Get the res 2 pentagons, whose neighbors have the same base cell + // and are unambiguously on the correct faces + H3_EXPORT(getPentagons)(2, pentagons); + + printf( + "static const PentagonDirectionFaces " + "pentagonDirectionFaces[NUM_PENTAGONS] = " + "{\n"); + + for (int i = 0; i < NUM_PENTAGONS; i++) { + H3Index pentagon = pentagons[i]; + int baseCell = H3_EXPORT(getBaseCellNumber)(pentagon); + printf(" {%d, {", baseCell); + // Get the neighbors in each direction, in order + FaceIJK fijk; + for (Direction dir = J_AXES_DIGIT; dir < NUM_DIGITS; dir++) { + int r = 0; + H3Index neighbor; + h3NeighborRotations(pentagon, dir, &r, &neighbor); + _h3ToFaceIjk(neighbor, &fijk); + + if (dir > J_AXES_DIGIT) printf(", "); + printf("%d", fijk.face); + } + printf("}},\n"); + } + + printf("};\n"); +} + +int main(int argc, char *argv[]) { + // check command line args + if (argc > 1) { + fprintf(stderr, "usage: %s\n", argv[0]); + exit(1); + } + + generate(); +} diff --git a/src/apps/miscapps/h3ToGeoBoundaryHier.c b/src/apps/miscapps/h3ToGeoBoundaryHier.c deleted file mode 100644 index 64dc673cc..000000000 --- a/src/apps/miscapps/h3ToGeoBoundaryHier.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief takes an H3 index and generates cell boundaries for all descendants - * at a specified resolution. - * - * usage: `h3ToGeoBoundaryHier H3Index [resolution outputMode]` - * - * The program generates the cell boundaries in lat/lon coordinates for all - * hierarchical children of H3Index at the specified resolution. If the - * specified resolution is less than or equal to the resolution of H3Index - * the single cell H3Index is processed. - * - * `resolution` should be a positive integer. The default is 0 (i.e., only the - * specified cell H3Index would be processed). - * - * `outputMode` indicates the type of output; currently the choices are 0 for - * plain text output (the default) and 1 for KML output. - * - * Examples: - * --------- - * - * `h3ToGeoBoundaryHier 836e9bfffffffff` - * - outputs the cell boundary in lat/lon for cell `836e9bfffffffff` as - * plain text - * - * `h3ToGeoBoundaryHier 820ceffffffffff 4 1 > cells.kml` - * - outputs the cell boundaries of all of the resolution 4 descendants - * of cell `820ceffffffffff` as a KML file (redirected to `cells.kml`). - * - * `h3ToGeoBoundaryHier 86283082fffffff 9 1 > uber9cells.kml` - * - creates a KML file containing the cell boundaries of all of the - * resolution 9 hexagons covering Uber HQ and the surrounding region of - * San Francisco - */ - -#include -#include -#include -#include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "h3api.h" -#include "kml.h" -#include "utility.h" -#include "vec2d.h" - -void doCell(H3Index h, int isKmlOut) { - GeoBoundary b; - H3_EXPORT(h3ToGeoBoundary)(h, &b); - - char label[BUFF_SIZE]; - H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); - - if (isKmlOut) { - outputBoundaryKML(&b, label); - } else { - printf("%s\n", label); - geoBoundaryPrintln(&b); - } -} - -void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { - for (int d = 0; d < 7; d++) { - H3_SET_INDEX_DIGIT(h, res, d); - - // skip the pentagonal deleted subsequence - - if (_isBaseCellPentagon(H3_GET_BASE_CELL(h)) && - _h3LeadingNonZeroDigit(h) == 1) { - continue; - } - - if (res == H3_GET_RESOLUTION(h)) { - doCell(h, isKmlOut); - } else { - recursiveH3IndexToGeo(h, res + 1, isKmlOut); - } - } -} - -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 5) { - fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]); - exit(1); - } - - H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]); - int baseCell = H3_GET_BASE_CELL(rootCell); - int rootRes = H3_GET_RESOLUTION(rootCell); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); - } - - int res = 0; - int isKmlOut = 0; - if (argc > 2) { - if (!sscanf(argv[2], "%d", &res)) - error("resolution must be an integer"); - - if (res > MAX_H3_RES) - error("specified resolution exceeds max resolution"); - - if (argc > 3) { - if (!sscanf(argv[3], "%d", &isKmlOut)) - error("outputMode must be an integer"); - - if (isKmlOut != 0 && isKmlOut != 1) - error("outputMode must be 0 or 1"); - - if (isKmlOut) { - char name[BUFF_SIZE]; - - sprintf(name, "Cell %" PRIx64 " Res %d", rootCell, - ((res <= rootRes) ? rootRes : res)); - - kmlBoundaryHeader(name, "cell boundary"); - } - } - } - - // generate the points - - if (res <= rootRes) { - doCell(rootCell, isKmlOut); - } else { - H3_SET_RESOLUTION(rootCell, res); - recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut); - } - - if (isKmlOut) kmlBoundaryFooter(); -} diff --git a/src/apps/miscapps/h3ToGeoHier.c b/src/apps/miscapps/h3ToGeoHier.c deleted file mode 100644 index 0c202dbb3..000000000 --- a/src/apps/miscapps/h3ToGeoHier.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief takes an H3 index and generates cell center points for descendants a - * specified resolution. - * - * usage: `h3ToGeoHier H3Index [resolution outputMode]` - * - * The program generates the cell center points in lat/lon coordinates for all - * hierarchical children of H3Index at the specified resolution. If the - * specified resolution is less than or equal to the resolution of H3Index - * the single cell H3Index is processed. - * - * `resolution` should be a positive integer. The default is 0 (i.e., only the - * specified cell H3Index would be processed). - * - * `outputMode` indicates the type of output; currently the choices are 0 for - * plain text output (the default) and 1 for KML output. - * - * Examples: - * --------- - * - * `h3ToGeoHier 836e9bfffffffff` - * - outputs the cell center point in lat/lon for cell - * `836e9bfffffffff` as plain text - * - * `h3ToGeoHier 820ceffffffffff 4 1 > pts.kml` - * - outputs the cell center points of all of the resolution 4 - * descendants of cell `820ceffffffffff` as a KML file (redirected to - * `pts.kml`). - * - * `h3ToGeoHier 86283082fffffff 9 1 > uber9pts.kml` - * - creates a KML file containing the cell center points of all of the - * resolution 9 hexagons covering Uber HQ and the surrounding region of - * San Francisco. - */ - -#include -#include -#include -#include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "h3api.h" -#include "kml.h" -#include "utility.h" -#include "vec2d.h" - -void doCell(H3Index h, int isKmlOut) { - GeoCoord g; - H3_EXPORT(h3ToGeo)(h, &g); - - char label[BUFF_SIZE]; - H3_EXPORT(h3ToString)(h, label, BUFF_SIZE); - - if (isKmlOut) { - outputPointKML(&g, label); - } else { - printf("%s ", label); - geoPrintlnNoFmt(&g); - } -} - -void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) { - for (int d = 0; d < 7; d++) { - H3_SET_INDEX_DIGIT(h, res, d); - - // skip the pentagonal deleted subsequence - - if (_isBaseCellPentagon(H3_GET_BASE_CELL(h)) && - _h3LeadingNonZeroDigit(h) == 1) { - continue; - } - - if (res == H3_GET_RESOLUTION(h)) { - doCell(h, isKmlOut); - } else { - recursiveH3IndexToGeo(h, res + 1, isKmlOut); - } - } -} - -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 5) { - fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]); - exit(1); - } - - H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]); - int baseCell = H3_GET_BASE_CELL(rootCell); - int rootRes = H3_GET_RESOLUTION(rootCell); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); - } - - int res = 0; - int isKmlOut = 0; - if (argc > 2) { - if (!sscanf(argv[2], "%d", &res)) - error("resolution must be an integer"); - - if (res > MAX_H3_RES) - error("specified resolution exceeds max resolution"); - - if (argc > 3) { - if (!sscanf(argv[3], "%d", &isKmlOut)) - error("outputMode must be an integer"); - - if (isKmlOut != 0 && isKmlOut != 1) - error("outputMode must be 0 or 1"); - - if (isKmlOut) { - char name[BUFF_SIZE]; - - sprintf(name, "Cell %" PRIx64 " Res %d", rootCell, - ((res <= rootRes) ? rootRes : res)); - - kmlBoundaryHeader(name, "cell center"); - } - } - } - - // generate the points - - if (res <= rootRes) { - doCell(rootCell, isKmlOut); - } else { - H3_SET_RESOLUTION(rootCell, res); - recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut); - } - - if (isKmlOut) kmlBoundaryFooter(); -} diff --git a/src/apps/miscapps/h3ToHier.c b/src/apps/miscapps/h3ToHier.c index 708743c5a..d3acb4ec5 100644 --- a/src/apps/miscapps/h3ToHier.c +++ b/src/apps/miscapps/h3ToHier.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ * @brief takes an optional H3 index and generates all descendant cells at the * specified resolution. * - * usage: `h3ToHier [resolution H3Index]` + * See `h3ToHier --help` for usage. * * The program generates all cells at the specified resolution, optionally * only the children of the given index. @@ -25,35 +25,29 @@ * `resolution` should be a positive integer. The default is 0 (i.e., only the * base cells). * - * `H3Index` should be an H3Index. By default, all indices at the specified + * `parent` should be an H3Index. By default, all indices at the specified * resolution are generated. */ +#include #include #include -#include -#include "baseCells.h" -#include "coordijk.h" -#include "geoCoord.h" + +#include "args.h" #include "h3Index.h" #include "h3api.h" #include "kml.h" #include "utility.h" -#include "vec2d.h" - -#include "algos.h" void recursiveH3IndexToHier(H3Index h, int res) { for (int d = 0; d < 7; d++) { - H3_SET_INDEX_DIGIT(h, res, d); - // skip the pentagonal deleted subsequence - - if (_isBaseCellPentagon(H3_GET_BASE_CELL(h)) && - _h3LeadingNonZeroDigit(h) == 1) { + if (H3_EXPORT(isPentagon)(h) && d == 1) { continue; } + H3_SET_INDEX_DIGIT(h, res, d); + if (res == H3_GET_RESOLUTION(h)) { h3Println(h); } else { @@ -62,32 +56,58 @@ void recursiveH3IndexToHier(H3Index h, int res) { } } -int main(int argc, char* argv[]) { - // check command line args - if (argc < 2 || argc > 3) { - fprintf(stderr, "usage: %s [resolution H3Index]\n", argv[0]); - exit(1); - } +int main(int argc, char *argv[]) { + int res; + H3Index parentIndex = 0; - int res = 0; - if (!sscanf(argv[1], "%d", &res)) error("resolution must be an integer"); + Arg helpArg = ARG_HELP; + Arg resArg = {.names = {"-r", "--resolution"}, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .required = true, + .helpText = "Resolution, 0-15 inclusive."}; + Arg parentArg = { + .names = {"-p", "--parent"}, + .scanFormat = "%" PRIx64, + .valueName = "parent", + .value = &parentIndex, + .helpText = "Print only indexes descendent from this index."}; - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + Arg *args[] = {&helpArg, &resArg, &parentArg}; + const int numArgs = 3; + const char *helpText = "Print all indexes at the specified resolution"; - H3Index prefixIndex = 0; - if (argc > 2) { - prefixIndex = H3_EXPORT(stringToH3)(argv[2]); - int h3BaseCell = H3_GET_BASE_CELL(prefixIndex); - if (h3BaseCell < 0 || h3BaseCell >= NUM_BASE_CELLS) { - error("invalid base cell number"); - } + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; } - if (prefixIndex == 0) { + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } + + if (parentArg.found && !H3_EXPORT(isValidCell)(parentIndex)) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Parent index is invalid.", NULL); + return 1; + } + + if (parentArg.found) { + // parent is the same or higher resolution than the target. + if (res <= H3_GET_RESOLUTION(parentIndex)) { + h3Println(parentIndex); + } else { + int rootRes = H3_GET_RESOLUTION(parentIndex); + H3_SET_RESOLUTION(parentIndex, res); + recursiveH3IndexToHier(parentIndex, rootRes + 1); + } + } else { // Generate all for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { H3Index rootCell = H3_INIT; - H3_SET_MODE(rootCell, H3_HEXAGON_MODE); + H3_SET_MODE(rootCell, H3_CELL_MODE); H3_SET_BASE_CELL(rootCell, bc); if (res == 0) { h3Println(rootCell); @@ -96,15 +116,5 @@ int main(int argc, char* argv[]) { recursiveH3IndexToHier(rootCell, 1); } } - } else { - // prefix is the same or higher resolution than - // the target. - if (res <= H3_GET_RESOLUTION(prefixIndex)) { - h3Println(prefixIndex); - } else { - int rootRes = H3_GET_RESOLUTION(prefixIndex); - H3_SET_RESOLUTION(prefixIndex, res); - recursiveH3IndexToHier(prefixIndex, rootRes + 1); - } } } diff --git a/src/apps/testapps/mkRandGeo.c b/src/apps/testapps/mkRandGeo.c index 54bd06030..00c6f38dc 100644 --- a/src/apps/testapps/mkRandGeo.c +++ b/src/apps/testapps/mkRandGeo.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,58 +14,65 @@ * limitations under the License. */ /** @file - * @brief generates random lat/lon pairs and bins them at the specified + * @brief generates random lat/lng pairs and bins them at the specified * resolution * - * usage: `mkRandGeo numPoints resolution` + * See `mkRandGeo --help` for usage. * - * The program generates `numPoints` random lat/lon coordinates and outputs + * The program generates `numPoints` random lat/lng coordinates and outputs * them along with the corresponding H3Index at the specified `resolution`. */ #include #include -#include -#include "baseCells.h" -#include "h3Index.h" -#include "utility.h" -void randomGeo(GeoCoord* g) { - static int init = 0; - if (!init) { - srand((unsigned int)time(0)); - init = 1; - } +#include "args.h" +#include "utility.h" - g->lat = H3_EXPORT(degsToRads)( - (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); - g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; -} +int main(int argc, char *argv[]) { + int res = 0; + int numPoints = 0; -int main(int argc, char* argv[]) { - // check command line args - if (argc > 3) { - fprintf(stderr, "usage: %s numPoints resolution\n", argv[0]); - exit(1); - } + Arg helpArg = ARG_HELP; + Arg numPointsArg = { + .names = {"-n", "--num-points"}, + .required = true, + .scanFormat = "%d", + .valueName = "num", + .value = &numPoints, + .helpText = "Number of random lat/lng pairs to generate."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; - int numPoints = 0; - if (!sscanf(argv[1], "%d", &numPoints)) - error("numPoints must be an integer"); + Arg *args[] = {&helpArg, &numPointsArg, &resArg}; + const int numArgs = 3; + const char *helpText = + "Generates random lat/lng pairs and indexes them at the specified " + "resolution."; - int res = 0; - if (!sscanf(argv[2], "%d", &res)) error("resolution must be an integer"); + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } for (int i = 0; i < numPoints; i++) { - GeoCoord g; + LatLng g; randomGeo(&g); - H3Index h = H3_EXPORT(geoToH3)(&g, res); - - h3Print(h); - printf(" "); - geoPrintlnNoFmt(&g); + H3Index h; + if (!H3_EXPORT(latLngToCell)(&g, res, &h)) { + h3Print(h); + printf(" "); + geoPrintlnNoFmt(&g); + } } } diff --git a/src/apps/testapps/mkRandGeoBoundary.c b/src/apps/testapps/mkRandGeoBoundary.c index 778d9fd4f..c8d0da4b3 100644 --- a/src/apps/testapps/mkRandGeoBoundary.c +++ b/src/apps/testapps/mkRandGeoBoundary.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2019-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,56 +16,64 @@ /** @file * @brief generates random cell indexes and the corresponding cell boundaries * - * usage: `mkRandGeoBoundary numPoints resolution` + * See `mkRandCellBoundary --help` for usage. * - * The program generates `numPoints` random lat/lon coordinates and outputs + * The program generates `numPoints` random lat/lng coordinates and outputs * them along with the corresponding H3Index at the specified `resolution`. */ #include #include -#include -#include "baseCells.h" -#include "h3Index.h" + +#include "args.h" #include "utility.h" -void randomGeo(GeoCoord* g) { - static int init = 0; - if (!init) { - srand((unsigned int)time(0)); - init = 1; - } +int main(int argc, char *argv[]) { + int res = 0; + int numPoints = 0; - g->lat = H3_EXPORT(degsToRads)( - (((float)rand() / (float)(RAND_MAX)) * 180.0) - 90.0); - g->lon = H3_EXPORT(degsToRads)((float)rand() / (float)(RAND_MAX)) * 360.0; -} + Arg helpArg = ARG_HELP; + Arg numPointsArg = { + .names = {"-n", "--num-points"}, + .required = true, + .scanFormat = "%d", + .valueName = "num", + .value = &numPoints, + .helpText = "Number of random lat/lng pairs to generate."}; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = "Resolution, 0-15 inclusive."}; -int main(int argc, char* argv[]) { - // check command line args - if (argc > 3) { - fprintf(stderr, "usage: %s numPoints resolution\n", argv[0]); - exit(1); - } + Arg *args[] = {&helpArg, &numPointsArg, &resArg}; + const int numArgs = 3; + const char *helpText = + "Generates random cell indexes and cell boundaries at the specified " + "resolution."; - int numPoints = 0; - if (!sscanf(argv[1], "%d", &numPoints)) - error("numPoints must be an integer"); - - int res = 0; - if (!sscanf(argv[2], "%d", &res)) error("resolution must be an integer"); + if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) { + return helpArg.found ? 0 : 1; + } - if (res > MAX_H3_RES) error("specified resolution exceeds max resolution"); + if (res > MAX_H3_RES) { + printHelp(stderr, argv[0], helpText, numArgs, args, + "Resolution exceeds maximum resolution.", NULL); + return 1; + } for (int i = 0; i < numPoints; i++) { - GeoCoord g; + LatLng g; randomGeo(&g); - H3Index h = H3_EXPORT(geoToH3)(&g, res); - GeoBoundary b; - H3_EXPORT(h3ToGeoBoundary)(h, &b); + H3Index h; + if (!H3_EXPORT(latLngToCell)(&g, res, &h)) { + CellBoundary b; + H3_EXPORT(cellToBoundary)(h, &b); - h3Println(h); - geoBoundaryPrintln(&b); + h3Println(h); + cellBoundaryPrintln(&b); + } } } diff --git a/src/apps/testapps/testBBox.c b/src/apps/testapps/testBBox.c deleted file mode 100644 index e4f710a46..000000000 --- a/src/apps/testapps/testBBox.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright 2016-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "bbox.h" -#include "constants.h" -#include "geoCoord.h" -#include "polygon.h" -#include "test.h" - -void assertBBox(const Geofence* geofence, const BBox* expected, - const GeoCoord* inside, const GeoCoord* outside) { - BBox result; - - bboxFromGeofence(geofence, &result); - - t_assert(bboxEquals(&result, expected), "Got expected bbox"); - t_assert(bboxContains(&result, inside), "Contains expected inside point"); - t_assert(!bboxContains(&result, outside), - "Does not contain expected outside point"); -} - -SUITE(BBox) { - TEST(posLatPosLon) { - GeoCoord verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {1.1, 0.7, 0.7, 0.2}; - const GeoCoord inside = {0.9, 0.4}; - const GeoCoord outside = {0.0, 0.0}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(negLatPosLon) { - GeoCoord verts[] = {{-0.3, 0.6}, {-0.4, 0.9}, {-0.2, 0.8}, {-0.1, 0.6}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {-0.1, -0.4, 0.9, 0.6}; - const GeoCoord inside = {-0.3, 0.8}; - const GeoCoord outside = {0.0, 0.0}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(posLatNegLon) { - GeoCoord verts[] = {{0.7, -1.4}, {0.8, -0.9}, {1.0, -0.8}, {1.1, -1.3}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {1.1, 0.7, -0.8, -1.4}; - const GeoCoord inside = {0.9, -1.0}; - const GeoCoord outside = {0.0, 0.0}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(negLatNegLon) { - GeoCoord verts[] = { - {-0.4, -1.4}, {-0.3, -1.1}, {-0.1, -1.2}, {-0.2, -1.4}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {-0.1, -0.4, -1.1, -1.4}; - const GeoCoord inside = {-0.3, -1.2}; - const GeoCoord outside = {0.0, 0.0}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(aroundZeroZero) { - GeoCoord verts[] = {{0.4, -0.4}, {0.4, 0.4}, {-0.4, 0.4}, {-0.4, -0.4}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {0.4, -0.4, 0.4, -0.4}; - const GeoCoord inside = {-0.1, -0.1}; - const GeoCoord outside = {1.0, -1.0}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(transmeridian) { - GeoCoord verts[] = {{0.4, M_PI - 0.1}, - {0.4, -M_PI + 0.1}, - {-0.4, -M_PI + 0.1}, - {-0.4, M_PI - 0.1}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {0.4, -0.4, -M_PI + 0.1, M_PI - 0.1}; - const GeoCoord insideOnMeridian = {-0.1, M_PI}; - const GeoCoord outside = {1.0, M_PI - 0.5}; - assertBBox(&geofence, &expected, &insideOnMeridian, &outside); - - const GeoCoord westInside = {0.1, M_PI - 0.05}; - t_assert(bboxContains(&expected, &westInside), - "Contains expected west inside point"); - const GeoCoord eastInside = {0.1, -M_PI + 0.05}; - t_assert(bboxContains(&expected, &eastInside), - "Contains expected east outside point"); - - const GeoCoord westOutside = {0.1, M_PI - 0.5}; - t_assert(!bboxContains(&expected, &westOutside), - "Does not contain expected west outside point"); - const GeoCoord eastOutside = {0.1, -M_PI + 0.5}; - t_assert(!bboxContains(&expected, &eastOutside), - "Does not contain expected east outside point"); - } - - TEST(edgeOnNorthPole) { - GeoCoord verts[] = {{M_PI_2 - 0.1, 0.1}, - {M_PI_2 - 0.1, 0.8}, - {M_PI_2, 0.8}, - {M_PI_2, 0.1}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {M_PI_2, M_PI_2 - 0.1, 0.8, 0.1}; - const GeoCoord inside = {M_PI_2 - 0.01, 0.4}; - const GeoCoord outside = {M_PI_2, 0.9}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(edgeOnSouthPole) { - GeoCoord verts[] = {{-M_PI_2 + 0.1, 0.1}, - {-M_PI_2 + 0.1, 0.8}, - {-M_PI_2, 0.8}, - {-M_PI_2, 0.1}}; - const Geofence geofence = {.numVerts = 4, .verts = verts}; - const BBox expected = {-M_PI_2 + 0.1, -M_PI_2, 0.8, 0.1}; - const GeoCoord inside = {-M_PI_2 + 0.01, 0.4}; - const GeoCoord outside = {-M_PI_2, 0.9}; - assertBBox(&geofence, &expected, &inside, &outside); - } - - TEST(containsEdges) { - const BBox bbox = {0.1, -0.1, 0.2, -0.2}; - GeoCoord points[] = { - {0.1, 0.2}, {0.1, 0.0}, {0.1, -0.2}, {0.0, 0.2}, - {-0.1, 0.2}, {-0.1, 0.0}, {-0.1, -0.2}, {0.0, -0.2}, - }; - const int numPoints = 8; - - for (int i = 0; i < numPoints; i++) { - t_assert(bboxContains(&bbox, &points[i]), "Contains edge point"); - } - } - - TEST(containsEdgesTransmeridian) { - const BBox bbox = {0.1, -0.1, -M_PI + 0.2, M_PI - 0.2}; - GeoCoord points[] = { - {0.1, -M_PI + 0.2}, {0.1, M_PI}, {0.1, M_PI - 0.2}, - {0.0, -M_PI + 0.2}, {-0.1, -M_PI + 0.2}, {-0.1, M_PI}, - {-0.1, M_PI - 0.2}, {0.0, M_PI - 0.2}, - }; - const int numPoints = 8; - - for (int i = 0; i < numPoints; i++) { - t_assert(bboxContains(&bbox, &points[i]), - "Contains transmeridian edge point"); - } - } - - TEST(bboxCenterBasicQuandrants) { - GeoCoord center; - - BBox bbox1 = {1.0, 0.8, 1.0, 0.8}; - GeoCoord expected1 = {0.9, 0.9}; - bboxCenter(&bbox1, ¢er); - t_assert(geoAlmostEqual(¢er, &expected1), "pos/pos as expected"); - - BBox bbox2 = {-0.8, -1.0, 1.0, 0.8}; - GeoCoord expected2 = {-0.9, 0.9}; - bboxCenter(&bbox2, ¢er); - t_assert(geoAlmostEqual(¢er, &expected2), "neg/pos as expected"); - - BBox bbox3 = {1.0, 0.8, -0.8, -1.0}; - GeoCoord expected3 = {0.9, -0.9}; - bboxCenter(&bbox3, ¢er); - t_assert(geoAlmostEqual(¢er, &expected3), "pos/neg as expected"); - - BBox bbox4 = {-0.8, -1.0, -0.8, -1.0}; - GeoCoord expected4 = {-0.9, -0.9}; - bboxCenter(&bbox4, ¢er); - t_assert(geoAlmostEqual(¢er, &expected4), "neg/neg as expected"); - - BBox bbox5 = {0.8, -0.8, 1.0, -1.0}; - GeoCoord expected5 = {0.0, 0.0}; - bboxCenter(&bbox5, ¢er); - t_assert(geoAlmostEqual(¢er, &expected5), - "around origin as expected"); - } - - TEST(bboxCenterTransmeridian) { - GeoCoord center; - - BBox bbox1 = {1.0, 0.8, -M_PI + 0.3, M_PI - 0.1}; - GeoCoord expected1 = {0.9, -M_PI + 0.1}; - bboxCenter(&bbox1, ¢er); - - t_assert(geoAlmostEqual(¢er, &expected1), "skew east as expected"); - - BBox bbox2 = {1.0, 0.8, -M_PI + 0.1, M_PI - 0.3}; - GeoCoord expected2 = {0.9, M_PI - 0.1}; - bboxCenter(&bbox2, ¢er); - t_assert(geoAlmostEqual(¢er, &expected2), "skew west as expected"); - - BBox bbox3 = {1.0, 0.8, -M_PI + 0.1, M_PI - 0.1}; - GeoCoord expected3 = {0.9, M_PI}; - bboxCenter(&bbox3, ¢er); - t_assert(geoAlmostEqual(¢er, &expected3), - "on antimeridian as expected"); - } - - TEST(bboxIsTransmeridian) { - BBox bboxNormal = {1.0, 0.8, 1.0, 0.8}; - t_assert(!bboxIsTransmeridian(&bboxNormal), - "Normal bbox not transmeridian"); - - BBox bboxTransmeridian = {1.0, 0.8, -M_PI + 0.3, M_PI - 0.1}; - t_assert(bboxIsTransmeridian(&bboxTransmeridian), - "Transmeridian bbox is transmeridian"); - } -} diff --git a/src/apps/testapps/testBBoxInternal.c b/src/apps/testapps/testBBoxInternal.c new file mode 100644 index 000000000..00fff60fa --- /dev/null +++ b/src/apps/testapps/testBBoxInternal.c @@ -0,0 +1,437 @@ +/* + * Copyright 2016-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "bbox.h" +#include "constants.h" +#include "latLng.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +void assertBBoxFromGeoLoop(const GeoLoop *geoloop, const BBox *expected, + const LatLng *inside, const LatLng *outside) { + BBox result; + + bboxFromGeoLoop(geoloop, &result); + + t_assert(bboxEquals(&result, expected), "Got expected bbox"); + t_assert(bboxContains(&result, inside), "Contains expected inside point"); + t_assert(!bboxContains(&result, outside), + "Does not contain expected outside point"); +} + +void assertBBox(const BBox *bbox, const BBox *expected) { + LatLng actualNE = {.lat = bbox->north, .lng = bbox->east}; + LatLng expectedNE = {.lat = expected->north, .lng = expected->east}; + t_assert(geoAlmostEqual(&actualNE, &expectedNE), "NE corner matches"); + + LatLng actualSW = {.lat = bbox->south, .lng = bbox->west}; + LatLng expectedSW = {.lat = expected->south, .lng = expected->west}; + t_assert(geoAlmostEqual(&actualSW, &expectedSW), "SW corner matches"); +} + +SUITE(BBox) { + TEST(posLatPosLng) { + LatLng verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {1.1, 0.7, 0.7, 0.2}; + const LatLng inside = {0.9, 0.4}; + const LatLng outside = {0.0, 0.0}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(negLatPosLng) { + LatLng verts[] = {{-0.3, 0.6}, {-0.4, 0.9}, {-0.2, 0.8}, {-0.1, 0.6}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {-0.1, -0.4, 0.9, 0.6}; + const LatLng inside = {-0.3, 0.8}; + const LatLng outside = {0.0, 0.0}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(posLatNegLng) { + LatLng verts[] = {{0.7, -1.4}, {0.8, -0.9}, {1.0, -0.8}, {1.1, -1.3}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {1.1, 0.7, -0.8, -1.4}; + const LatLng inside = {0.9, -1.0}; + const LatLng outside = {0.0, 0.0}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(negLatNegLng) { + LatLng verts[] = { + {-0.4, -1.4}, {-0.3, -1.1}, {-0.1, -1.2}, {-0.2, -1.4}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {-0.1, -0.4, -1.1, -1.4}; + const LatLng inside = {-0.3, -1.2}; + const LatLng outside = {0.0, 0.0}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(aroundZeroZero) { + LatLng verts[] = {{0.4, -0.4}, {0.4, 0.4}, {-0.4, 0.4}, {-0.4, -0.4}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {0.4, -0.4, 0.4, -0.4}; + const LatLng inside = {-0.1, -0.1}; + const LatLng outside = {1.0, -1.0}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(transmeridian) { + LatLng verts[] = {{0.4, M_PI - 0.1}, + {0.4, -M_PI + 0.1}, + {-0.4, -M_PI + 0.1}, + {-0.4, M_PI - 0.1}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {0.4, -0.4, -M_PI + 0.1, M_PI - 0.1}; + const LatLng insideOnMeridian = {-0.1, M_PI}; + const LatLng outside = {1.0, M_PI - 0.5}; + assertBBoxFromGeoLoop(&geoloop, &expected, &insideOnMeridian, &outside); + + const LatLng westInside = {0.1, M_PI - 0.05}; + t_assert(bboxContains(&expected, &westInside), + "Contains expected west inside point"); + const LatLng eastInside = {0.1, -M_PI + 0.05}; + t_assert(bboxContains(&expected, &eastInside), + "Contains expected east outside point"); + + const LatLng westOutside = {0.1, M_PI - 0.5}; + t_assert(!bboxContains(&expected, &westOutside), + "Does not contain expected west outside point"); + const LatLng eastOutside = {0.1, -M_PI + 0.5}; + t_assert(!bboxContains(&expected, &eastOutside), + "Does not contain expected east outside point"); + } + + TEST(edgeOnNorthPole) { + LatLng verts[] = {{M_PI_2 - 0.1, 0.1}, + {M_PI_2 - 0.1, 0.8}, + {M_PI_2, 0.8}, + {M_PI_2, 0.1}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {M_PI_2, M_PI_2 - 0.1, 0.8, 0.1}; + const LatLng inside = {M_PI_2 - 0.01, 0.4}; + const LatLng outside = {M_PI_2, 0.9}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(edgeOnSouthPole) { + LatLng verts[] = {{-M_PI_2 + 0.1, 0.1}, + {-M_PI_2 + 0.1, 0.8}, + {-M_PI_2, 0.8}, + {-M_PI_2, 0.1}}; + const GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + const BBox expected = {-M_PI_2 + 0.1, -M_PI_2, 0.8, 0.1}; + const LatLng inside = {-M_PI_2 + 0.01, 0.4}; + const LatLng outside = {-M_PI_2, 0.9}; + assertBBoxFromGeoLoop(&geoloop, &expected, &inside, &outside); + } + + TEST(containsEdges) { + const BBox bbox = {0.1, -0.1, 0.2, -0.2}; + LatLng points[] = { + {0.1, 0.2}, {0.1, 0.0}, {0.1, -0.2}, {0.0, 0.2}, + {-0.1, 0.2}, {-0.1, 0.0}, {-0.1, -0.2}, {0.0, -0.2}, + }; + const int numPoints = 8; + + for (int i = 0; i < numPoints; i++) { + t_assert(bboxContains(&bbox, &points[i]), "Contains edge point"); + } + } + + TEST(containsEdgesTransmeridian) { + const BBox bbox = {0.1, -0.1, -M_PI + 0.2, M_PI - 0.2}; + LatLng points[] = { + {0.1, -M_PI + 0.2}, {0.1, M_PI}, {0.1, M_PI - 0.2}, + {0.0, -M_PI + 0.2}, {-0.1, -M_PI + 0.2}, {-0.1, M_PI}, + {-0.1, M_PI - 0.2}, {0.0, M_PI - 0.2}, + }; + const int numPoints = 8; + + for (int i = 0; i < numPoints; i++) { + t_assert(bboxContains(&bbox, &points[i]), + "Contains transmeridian edge point"); + } + } + + TEST(bboxOverlapsBBox) { + BBox a = {1.0, 0.0, 1.0, 0.0}; + + BBox b1 = {1.0, 0.0, -1.0, -1.5}; + t_assert(!bboxOverlapsBBox(&a, &b1), "no intersection to the west"); + t_assert(!bboxOverlapsBBox(&b1, &a), + "no intersection to the west, reverse"); + + BBox b2 = {1.0, 0.0, 2.0, 1.5}; + t_assert(!bboxOverlapsBBox(&a, &b2), "no intersection to the east"); + t_assert(!bboxOverlapsBBox(&b2, &a), + "no intersection to the east, reverse"); + + BBox b3 = {-1.0, -1.5, 1.0, 0.0}; + t_assert(!bboxOverlapsBBox(&a, &b3), "no intersection to the south"); + t_assert(!bboxOverlapsBBox(&b3, &a), + "no intersection to the south, reverse"); + + BBox b4 = {2.0, 1.5, 1.0, 0.0}; + t_assert(!bboxOverlapsBBox(&a, &b4), "no intersection to the north"); + t_assert(!bboxOverlapsBBox(&b4, &a), + "no intersection to the north, reverse"); + + BBox b5 = {1.0, 0.0, 0.5, -1.5}; + t_assert(bboxOverlapsBBox(&a, &b5), "intersection to the west"); + + BBox b6 = {1.0, 0.0, 2.0, 0.5}; + t_assert(bboxOverlapsBBox(&a, &b6), "intersection to the east"); + + BBox b7 = {0.5, -1.5, 1.0, 0.0}; + t_assert(bboxOverlapsBBox(&a, &b7), "intersection to the south"); + + BBox b8 = {2.0, 0.5, 1.0, 0.0}; + t_assert(bboxOverlapsBBox(&a, &b8), "intersection to the north"); + + BBox b9 = {1.5, -0.5, 1.5, -0.5}; + t_assert(bboxOverlapsBBox(&a, &b9), "intersection, b contains a"); + + BBox b10 = {0.5, 0.25, 0.5, 0.25}; + t_assert(bboxOverlapsBBox(&a, &b10), "intersection, a contains b"); + + BBox b11 = {1.0, 0.0, 1.0, 0.0}; + t_assert(bboxOverlapsBBox(&a, &b11), "intersection, a equals b"); + } + + TEST(bboxOverlapsBBoxTransmeridian) { + BBox a = {1.0, 0.0, -M_PI + 0.5, M_PI - 0.5}; + + BBox b1 = {1.0, 0.0, M_PI - 0.7, M_PI - 0.9}; + t_assert(!bboxOverlapsBBox(&a, &b1), "no intersection to the west"); + t_assert(!bboxOverlapsBBox(&b1, &a), + "no intersection to the west, reverse"); + + BBox b2 = {1.0, 0.0, -M_PI + 0.9, -M_PI + 0.7}; + t_assert(!bboxOverlapsBBox(&a, &b2), "no intersection to the east"); + t_assert(!bboxOverlapsBBox(&b2, &a), "no intersection to the east"); + + BBox b3 = {1.0, 0.0, M_PI - 0.4, M_PI - 0.9}; + t_assert(bboxOverlapsBBox(&a, &b3), "intersection to the west"); + t_assert(bboxOverlapsBBox(&b3, &a), + "intersection to the west, reverse"); + + BBox b4 = {1.0, 0.0, -M_PI + 0.9, -M_PI + 0.4}; + t_assert(bboxOverlapsBBox(&a, &b4), "intersection to the east"); + t_assert(bboxOverlapsBBox(&b4, &a), + "intersection to the east, reverse"); + + BBox b5 = {1.0, 0.0, -M_PI + 0.4, M_PI - 0.4}; + t_assert(bboxOverlapsBBox(&a, &b5), "intersection, a contains b"); + t_assert(bboxOverlapsBBox(&b5, &a), + "intersection, a contains b, reverse"); + + BBox b6 = {1.0, 0.0, -M_PI + 0.6, M_PI - 0.6}; + t_assert(bboxOverlapsBBox(&a, &b6), "intersection, b contains a"); + t_assert(bboxOverlapsBBox(&b6, &a), + "intersection, b contains a, reverse"); + + BBox b7 = {1.0, 0.0, -M_PI + 0.5, M_PI - 0.5}; + t_assert(bboxOverlapsBBox(&a, &b7), "intersection, a equals b"); + + BBox b8 = {1.0, 0.0, -M_PI + 0.9, M_PI - 0.4}; + t_assert(bboxOverlapsBBox(&a, &b8), + "intersection, transmeridian to the east"); + t_assert(bboxOverlapsBBox(&b8, &a), + "intersection, transmeridian to the east, reverse"); + + BBox b9 = {1.0, 0.0, -M_PI + 0.4, M_PI - 0.9}; + t_assert(bboxOverlapsBBox(&a, &b9), + "intersection, transmeridian to the west"); + t_assert(bboxOverlapsBBox(&b9, &a), + "intersection, transmeridian to the west, reverse"); + } + + TEST(bboxCenterBasicQuandrants) { + LatLng center; + + BBox bbox1 = {1.0, 0.8, 1.0, 0.8}; + LatLng expected1 = {0.9, 0.9}; + bboxCenter(&bbox1, ¢er); + t_assert(geoAlmostEqual(¢er, &expected1), "pos/pos as expected"); + + BBox bbox2 = {-0.8, -1.0, 1.0, 0.8}; + LatLng expected2 = {-0.9, 0.9}; + bboxCenter(&bbox2, ¢er); + t_assert(geoAlmostEqual(¢er, &expected2), "neg/pos as expected"); + + BBox bbox3 = {1.0, 0.8, -0.8, -1.0}; + LatLng expected3 = {0.9, -0.9}; + bboxCenter(&bbox3, ¢er); + t_assert(geoAlmostEqual(¢er, &expected3), "pos/neg as expected"); + + BBox bbox4 = {-0.8, -1.0, -0.8, -1.0}; + LatLng expected4 = {-0.9, -0.9}; + bboxCenter(&bbox4, ¢er); + t_assert(geoAlmostEqual(¢er, &expected4), "neg/neg as expected"); + + BBox bbox5 = {0.8, -0.8, 1.0, -1.0}; + LatLng expected5 = {0.0, 0.0}; + bboxCenter(&bbox5, ¢er); + t_assert(geoAlmostEqual(¢er, &expected5), + "around origin as expected"); + } + + TEST(bboxCenterTransmeridian) { + LatLng center; + + BBox bbox1 = {1.0, 0.8, -M_PI + 0.3, M_PI - 0.1}; + LatLng expected1 = {0.9, -M_PI + 0.1}; + bboxCenter(&bbox1, ¢er); + + t_assert(geoAlmostEqual(¢er, &expected1), "skew east as expected"); + + BBox bbox2 = {1.0, 0.8, -M_PI + 0.1, M_PI - 0.3}; + LatLng expected2 = {0.9, M_PI - 0.1}; + bboxCenter(&bbox2, ¢er); + t_assert(geoAlmostEqual(¢er, &expected2), "skew west as expected"); + + BBox bbox3 = {1.0, 0.8, -M_PI + 0.1, M_PI - 0.1}; + LatLng expected3 = {0.9, M_PI}; + bboxCenter(&bbox3, ¢er); + t_assert(geoAlmostEqual(¢er, &expected3), + "on antimeridian as expected"); + } + + TEST(bboxIsTransmeridian) { + BBox bboxNormal = {1.0, 0.8, 1.0, 0.8}; + t_assert(!bboxIsTransmeridian(&bboxNormal), + "Normal bbox not transmeridian"); + + BBox bboxTransmeridian = {1.0, 0.8, -M_PI + 0.3, M_PI - 0.1}; + t_assert(bboxIsTransmeridian(&bboxTransmeridian), + "Transmeridian bbox is transmeridian"); + } + + TEST(bboxEquals) { + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + BBox north = bbox; + north.north += 0.1; + BBox south = bbox; + south.south += 0.1; + BBox east = bbox; + east.east += 0.1; + BBox west = bbox; + west.west += 0.1; + + t_assert(bboxEquals(&bbox, &bbox), "Equals self"); + t_assert(!bboxEquals(&bbox, &north), "Not equals different north"); + t_assert(!bboxEquals(&bbox, &south), "Not equals different south"); + t_assert(!bboxEquals(&bbox, &east), "Not equals different east"); + t_assert(!bboxEquals(&bbox, &west), "Not equals different west"); + } + + TEST(bboxHexEstimate_invalidRes) { + int64_t numHexagons; + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + t_assert(bboxHexEstimate(&bbox, -1, &numHexagons) == E_RES_DOMAIN, + "bboxHexEstimate of invalid resolution fails"); + } + + TEST(bboxHexEstimate_ratio) { + BBox bbox1 = {0.82294, 0.82273, 0.131671, 0.131668}; + BBox bbox2 = {0.131671, 0.131668, 0.82294, 0.82273}; + int64_t numHexagons1; + int64_t numHexagons2; + + t_assertSuccess(bboxHexEstimate(&bbox1, 15, &numHexagons1)); + t_assertSuccess(bboxHexEstimate(&bbox2, 15, &numHexagons2)); + + double diffPercentage = fabs(1.0 - numHexagons1 / (double)numHexagons2); + + // numHexagons1 and numHexagons2 cannot be exactly equal because the + // diameter of the two bboxes is not exactly the same (it's calculated + // using greatCircleDistanceKm) + t_assert( + diffPercentage < 0.03, + "Should be true for bounding boxes with (almost) the same diameter " + "and side ratio"); + } + + TEST(lineHexEstimate_invalidRes) { + int64_t numHexagons; + LatLng origin = {0.0, 0.0}; + LatLng destination = {1.0, 1.0}; + t_assert(lineHexEstimate(&origin, &destination, -1, &numHexagons) == + E_RES_DOMAIN, + "lineHexEstimate of invalid resolution fails"); + } + + TEST(scaleBBox_noop) { + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + BBox expected = {1.0, 0.0, 1.0, 0.0}; + scaleBBox(&bbox, 1); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_basicGrow) { + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + BBox expected = {1.5, -0.5, 1.5, -0.5}; + scaleBBox(&bbox, 2); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_basicShrink) { + BBox bbox = {1.0, 0.0, 1.0, 0.0}; + BBox expected = {0.75, 0.25, 0.75, 0.25}; + scaleBBox(&bbox, 0.5); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_clampNorthSouth) { + BBox bbox = {M_PI_2 * 0.9, -M_PI_2 * 0.9, 1.0, 0.0}; + BBox expected = {M_PI_2, -M_PI_2, 1.5, -0.5}; + scaleBBox(&bbox, 2); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_clampEastPos) { + BBox bbox = {1.0, 0.0, M_PI - 0.1, M_PI - 1.1}; + BBox expected = {1.5, -0.5, -M_PI + 0.4, M_PI - 1.6}; + scaleBBox(&bbox, 2); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_clampEastNeg) { + BBox bbox = {1.5, -0.5, -M_PI + 0.4, M_PI - 1.6}; + BBox expected = {1.0, 0.0, M_PI - 0.1, M_PI - 1.1}; + scaleBBox(&bbox, 0.5); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_clampWestPos) { + BBox bbox = {1.0, 0.0, -M_PI + 0.9, M_PI - 0.1}; + BBox expected = {0.75, 0.25, -M_PI + 0.65, -M_PI + 0.15}; + scaleBBox(&bbox, 0.5); + assertBBox(&bbox, &expected); + } + + TEST(scaleBBox_clampWestNeg) { + BBox bbox = {0.75, 0.25, -M_PI + 0.65, -M_PI + 0.15}; + BBox expected = {1.0, 0.0, -M_PI + 0.9, M_PI - 0.1}; + scaleBBox(&bbox, 2); + assertBBox(&bbox, &expected); + } +} diff --git a/cmake/vla_test.c b/src/apps/testapps/testBaseCells.c similarity index 52% rename from cmake/vla_test.c rename to src/apps/testapps/testBaseCells.c index 48d687fc7..5c3d7b119 100644 --- a/cmake/vla_test.c +++ b/src/apps/testapps/testBaseCells.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2017-2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,19 @@ * limitations under the License. */ -#include -#include +#include -int main(void) { - int x; - scanf("%d", &x); - char vla[x]; - (void)vla; - return 0; +#include "baseCells.h" +#include "h3api.h" +#include "test.h" + +SUITE(baseCells) { + TEST(getRes0Cells) { + int count = H3_EXPORT(res0CellCount)(); + H3Index *indexes = malloc(count * sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(getRes0Cells)(indexes)); + t_assert(indexes[0] == 0x8001fffffffffff, "correct first basecell"); + t_assert(indexes[121] == 0x80f3fffffffffff, "correct last basecell"); + free(indexes); + } } diff --git a/src/apps/testapps/testBaseCellsInternal.c b/src/apps/testapps/testBaseCellsInternal.c new file mode 100644 index 000000000..1da5d60d8 --- /dev/null +++ b/src/apps/testapps/testBaseCellsInternal.c @@ -0,0 +1,45 @@ +/* + * Copyright 2017-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "baseCells.h" +#include "h3api.h" +#include "test.h" + +SUITE(baseCellsInternal) { + TEST(baseCellToCCWrot60) { + // a few random spot-checks + t_assert(_baseCellToCCWrot60(16, 0) == 0, "got expected rotation"); + t_assert(_baseCellToCCWrot60(32, 0) == 3, "got expected rotation"); + t_assert(_baseCellToCCWrot60(7, 3) == 1, "got expected rotation"); + } + + TEST(baseCellToCCWrot60_invalid) { + t_assert(_baseCellToCCWrot60(16, 42) == INVALID_ROTATIONS, + "should return invalid rotation for invalid face"); + t_assert(_baseCellToCCWrot60(16, -1) == INVALID_ROTATIONS, + "should return invalid rotation for invalid face (negative)"); + t_assert(_baseCellToCCWrot60(1, 0) == INVALID_ROTATIONS, + "should return invalid rotation for base cell not appearing " + "on face"); + } + + TEST(isBaseCellPentagon_invalid) { + t_assert(_isBaseCellPentagon(-1) == false, + "isBaseCellPentagon handles negative"); + } +} diff --git a/src/apps/testapps/testCellToBBoxExhaustive.c b/src/apps/testapps/testCellToBBoxExhaustive.c new file mode 100644 index 000000000..bfbbeb4a3 --- /dev/null +++ b/src/apps/testapps/testCellToBBoxExhaustive.c @@ -0,0 +1,100 @@ +/* + * Copyright 2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 function `cellToBBox` + * + * usage: `testCellToBBoxExhaustive` + */ + +#include +#include +#include + +#include "bbox.h" +#include "h3Index.h" +#include "h3api.h" +#include "polyfill.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +static void cellBBox_assertions(H3Index h3) { + BBox bbox; + t_assertSuccess(cellToBBox(h3, &bbox, false)); + + CellBoundary verts; + t_assertSuccess(H3_EXPORT(cellToBoundary)(h3, &verts)); + for (int j = 0; j < verts.numVerts; j++) { + if (!bboxContains(&bbox, &verts.verts[j])) { + printf("cell: "); + h3Println(h3); + bboxPrintln(&bbox); + geoPrintln(&verts.verts[j]); + } + t_assert(bboxContains(&bbox, &verts.verts[j]), + "BBox contains cell vertex"); + } +} + +static void childBBox_assertions(H3Index h3) { + int parentRes = H3_GET_RESOLUTION(h3); + + BBox bbox; + t_assertSuccess(cellToBBox(h3, &bbox, true)); + + for (int resolutionOffset = 0; resolutionOffset < 5; resolutionOffset++) { + // Test whether all verts of all children are inside the bbox + int childRes = parentRes + resolutionOffset; + int64_t numChildren; + t_assertSuccess( + H3_EXPORT(cellToChildrenSize)(h3, childRes, &numChildren)); + + H3Index *children = calloc(numChildren, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(h3, childRes, children)); + + for (int64_t i = 0; i < numChildren; i++) { + CellBoundary childVerts; + t_assertSuccess( + H3_EXPORT(cellToBoundary)(children[i], &childVerts)); + for (int j = 0; j < childVerts.numVerts; j++) { + if (!bboxContains(&bbox, &childVerts.verts[j])) { + printf("parent: "); + h3Println(h3); + bboxPrintln(&bbox); + h3Println(children[i]); + geoPrintln(&childVerts.verts[j]); + } + t_assert(bboxContains(&bbox, &childVerts.verts[j]), + "BBox contains child vertex"); + } + } + + free(children); + } +} + +SUITE(cellToBBox) { + TEST(cellBBox_correctness) { + iterateAllIndexesAtRes(0, cellBBox_assertions); + iterateAllIndexesAtRes(1, cellBBox_assertions); + iterateAllIndexesAtRes(2, cellBBox_assertions); + } + TEST(childBBox_correctness) { + iterateAllIndexesAtRes(0, childBBox_assertions); + iterateAllIndexesAtRes(1, childBBox_assertions); + iterateAllIndexesAtRes(2, childBBox_assertions); + } +} diff --git a/src/apps/testapps/testCellToBoundary.c b/src/apps/testapps/testCellToBoundary.c new file mode 100644 index 000000000..f7aafb5e2 --- /dev/null +++ b/src/apps/testapps/testCellToBoundary.c @@ -0,0 +1,121 @@ +/* + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 function `cellToBoundary` + * + * usage: `testCellToBoundary` + * + * The program reads H3 indexes and associated cell boundaries from + * stdin until EOF is encountered. For each input cell, the program + * uses `cellToBoundary` to generate the boundary and then compares that + * generated boundary to the original input boundary. + */ + +#include +#include +#include + +#include "baseCells.h" +#include "h3Index.h" +#include "latLng.h" +#include "test.h" +#include "utility.h" + +/** + * Assumes `f` is open and ready for reading. + * @return 0 on success, EOF on EOF + */ +int readBoundary(FILE *f, CellBoundary *b) { + char buff[BUFF_SIZE]; + + // get the first line, which should be a "{" + if (!fgets(buff, BUFF_SIZE, f)) { + if (feof(stdin)) { + return EOF; + } else { + printf("reading CellBoundary from input"); + return -1; + } + } + + if (buff[0] != '{') { + printf("missing CellBoundary {"); + return -2; + } + + // now read the verts + + b->numVerts = 0; + while (1) { + if (!fgets(buff, BUFF_SIZE, f)) { + printf("reading CellBoundary from input"); + return -3; + } + + if (buff[0] == '}') { + if (b->numVerts == 0) { + printf("reading empty cell boundary"); + return -4; + } else { + break; + } + } + + if (b->numVerts == MAX_CELL_BNDRY_VERTS) { + printf("too many vertices in CellBoundary from input"); + return -5; + } + + double latDegs, lngDegs; + if (sscanf(buff, "%lf %lf", &latDegs, &lngDegs) != 2) { + printf("parsing CellBoundary from input"); + return -6; + } + + setGeoDegs(&b->verts[b->numVerts], latDegs, lngDegs); + b->numVerts++; + } + + return 0; +} + +int main(int argc, char *argv[]) { + // check command line args + if (argc > 1) { + fprintf(stderr, "usage: %s\n", argv[0]); + exit(1); + } + + // process the indexes on stdin + char buff[BUFF_SIZE]; + while (1) { + // get an index from stdin + if (!fgets(buff, BUFF_SIZE, stdin)) { + if (feof(stdin)) + break; + else + error("reading input H3 index from stdin"); + } + + H3Index h3; + t_assertSuccess(H3_EXPORT(stringToH3)(buff, &h3)); + + CellBoundary b; + readBoundary(stdin, &b); + + t_assertBoundary(h3, &b); + } +} diff --git a/src/apps/testapps/testCellToBoundaryEdgeCases.c b/src/apps/testapps/testCellToBoundaryEdgeCases.c new file mode 100644 index 000000000..f7eca1742 --- /dev/null +++ b/src/apps/testapps/testCellToBoundaryEdgeCases.c @@ -0,0 +1,60 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "bbox.h" +#include "h3api.h" +#include "latLng.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +SUITE(cellToBoundaryEdgeCases) { + TEST(doublePrecisionVertex) { + // The carefully constructed case here: + // - A res 1 pentagon cell with distortion vertexes that change + // when we use a double instead of a float in _v2dIntersect + // - One of the previous (float-based) distortion vertexes + // This is the only case yet found where a point indexed to the + // cell is shown to be incorrectly outside of the geo boundary + // when we use the float version. Presumably more could be found. + H3Index cell = 0x81083ffffffffff; + LatLng point = {.lat = H3_EXPORT(degsToRads)(61.890838431), + .lng = H3_EXPORT(degsToRads)(8.644221328)}; + + CellBoundary boundary; + t_assertSuccess(H3_EXPORT(cellToBoundary)(cell, &boundary)); + + LatLng *verts = boundary.verts; + GeoLoop geoloop = {.numVerts = boundary.numVerts, .verts = verts}; + + BBox bbox; + bboxFromGeoLoop(&geoloop, &bbox); + + H3Index cell2; + t_assertSuccess(H3_EXPORT(latLngToCell)(&point, 1, &cell2)); + // Check whether the point is physically inside the geo boundary + if (cell2 == cell) { + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &point), + "Boundary contains input point"); + } else { + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "Boundary does not contain input point"); + } + } +} diff --git a/src/apps/testapps/testCellToCenterChild.c b/src/apps/testapps/testCellToCenterChild.c new file mode 100644 index 000000000..215e657a5 --- /dev/null +++ b/src/apps/testapps/testCellToCenterChild.c @@ -0,0 +1,82 @@ +/* + * Copyright 2019-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "h3Index.h" +#include "test.h" + +SUITE(cellToCenterChild) { + H3Index baseHex; + LatLng baseCentroid; + setH3Index(&baseHex, 8, 4, 2); + H3_EXPORT(cellToLatLng)(baseHex, &baseCentroid); + + TEST(propertyTests) { + for (int res = 0; res <= MAX_H3_RES - 1; res++) { + for (int childRes = res + 1; childRes <= MAX_H3_RES; childRes++) { + LatLng centroid; + H3Index h3Index; + t_assertSuccess( + H3_EXPORT(latLngToCell)(&baseCentroid, res, &h3Index)); + H3_EXPORT(cellToLatLng)(h3Index, ¢roid); + + H3Index geoChild; + t_assertSuccess( + H3_EXPORT(latLngToCell)(¢roid, childRes, &geoChild)); + H3Index centerChild; + t_assertSuccess(H3_EXPORT(cellToCenterChild)(h3Index, childRes, + ¢erChild)); + + t_assert( + centerChild == geoChild, + "center child should be same as indexed centroid at child " + "resolution"); + t_assert(H3_EXPORT(getResolution)(centerChild) == childRes, + "center child should have correct resolution"); + H3Index parent; + t_assertSuccess( + H3_EXPORT(cellToParent)(centerChild, res, &parent)); + t_assert( + parent == h3Index, + "parent at original resolution should be initial index"); + } + } + } + + TEST(sameRes) { + int res = H3_EXPORT(getResolution)(baseHex); + H3Index child; + t_assertSuccess(H3_EXPORT(cellToCenterChild)(baseHex, res, &child)); + t_assert(child == baseHex, + "center child at same resolution should return self"); + } + + TEST(invalidInputs) { + int res = H3_EXPORT(getResolution)(baseHex); + H3Index child; + t_assert(H3_EXPORT(cellToCenterChild)(baseHex, res - 1, &child) == + E_RES_DOMAIN, + "should fail at coarser resolution"); + t_assert( + H3_EXPORT(cellToCenterChild)(baseHex, -1, &child) == E_RES_DOMAIN, + "should fail for negative resolution"); + t_assert(H3_EXPORT(cellToCenterChild)(baseHex, MAX_H3_RES + 1, + &child) == E_RES_DOMAIN, + "should fail beyond finest resolution"); + } +} diff --git a/src/apps/testapps/testCellToChildPos.c b/src/apps/testapps/testCellToChildPos.c new file mode 100644 index 000000000..0253839da --- /dev/null +++ b/src/apps/testapps/testCellToChildPos.c @@ -0,0 +1,143 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 functions `cellToChildPos` and `childPosToCell` + * + * usage: `testCellToChildPos` + */ + +#include + +#include "h3Index.h" +#include "h3api.h" +#include "test.h" +#include "utility.h" + +static void childPos_assertions(H3Index h3) { + int parentRes = H3_GET_RESOLUTION(h3); + + for (int resolutionOffset = 0; resolutionOffset < 4; resolutionOffset++) { + int childRes = parentRes + resolutionOffset; + int64_t numChildren; + t_assertSuccess( + H3_EXPORT(cellToChildrenSize)(h3, childRes, &numChildren)); + + H3Index *children = calloc(numChildren, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(h3, childRes, children)); + + int64_t childPos; + H3Index cell; + for (int64_t i = 0; i < numChildren; i++) { + // Test cellToChildPos + t_assertSuccess( + H3_EXPORT(cellToChildPos)(children[i], parentRes, &childPos)); + t_assert(childPos == i, "childPos matches iteration index"); + // Test childPosToCell + t_assertSuccess( + H3_EXPORT(childPosToCell)(childPos, h3, childRes, &cell)); + t_assert(cell == children[i], "cell matches expected"); + } + + free(children); + } +} + +SUITE(cellToChildPos) { + TEST(childPos_correctness) { + iterateAllIndexesAtRes(0, childPos_assertions); + iterateAllIndexesAtRes(1, childPos_assertions); + iterateAllIndexesAtRes(2, childPos_assertions); + } + + TEST(cellToChildPos_res_errors) { + int64_t childPos; + // random res 8 cell + H3Index child = 0x88283080ddfffff; + t_assert( + H3_EXPORT(cellToChildPos)(child, -1, &childPos) == E_RES_DOMAIN, + "error matches expected for invalid res"); + t_assert( + H3_EXPORT(cellToChildPos)(child, 42, &childPos) == E_RES_DOMAIN, + "error matches expected for invalid res"); + t_assert( + H3_EXPORT(cellToChildPos)(child, 9, &childPos) == E_RES_MISMATCH, + "error matches expected for parent res finer than child"); + } + + TEST(childPosToCell_res_errors) { + H3Index cell; + // random res 8 cell + H3Index parent = 0x88283080ddfffff; + int64_t childPos = 27; + t_assert(H3_EXPORT(childPosToCell)(childPos, parent, 42, &cell) == + E_RES_DOMAIN, + "error matches expected for invalid res"); + t_assert(H3_EXPORT(childPosToCell)(childPos, parent, -1, &cell) == + E_RES_DOMAIN, + "error matches expected for invalid res"); + t_assert(H3_EXPORT(childPosToCell)(childPos, parent, 7, &cell) == + E_RES_MISMATCH, + "error matches expected for child res coarser than parent"); + } + + TEST(childPosToCell_childPos_errors) { + H3Index cell; + // random res 8 cell + H3Index parent = 0x88283080ddfffff; + int res = 10; + t_assert(H3_EXPORT(childPosToCell)(-1, parent, res, &cell) == E_DOMAIN, + "error matches expected for negative childPos"); + + // res is two steps down, so max valid child pos is 48 + t_assert(H3_EXPORT(childPosToCell)(48, parent, res, &cell) == E_SUCCESS, + "No error for max valid child pos"); + t_assert(H3_EXPORT(childPosToCell)(49, parent, res, &cell) == E_DOMAIN, + "error matches expected for childPos greater than max"); + } + + TEST(cellToChildPos_invalid_digit) { + // random res 8 cell + H3Index child = 0x88283080ddfffff; + H3_SET_INDEX_DIGIT(child, 6, INVALID_DIGIT); + + int64_t childPos; + t_assert( + H3_EXPORT(cellToChildPos)(child, 0, &childPos) == E_CELL_INVALID, + "error matches expected for invalid cell"); + } + + TEST(cellToChildPos_invalid_pentagon_digit) { + // Res 7 hexagon child of a pentagon + H3Index child = 0x870800006ffffff; + H3_SET_INDEX_DIGIT(child, 7, INVALID_DIGIT); + + int64_t childPos; + t_assert( + H3_EXPORT(cellToChildPos)(child, 0, &childPos) == E_CELL_INVALID, + "error matches expected for invalid cell"); + } + + TEST(cellToChildPos_invalid_pentagon_kaxis) { + H3Index child; + // Create a res 8 index located in a deleted subsequence of a pentagon. + setH3Index(&child, 8, 4, K_AXES_DIGIT); + + int64_t childPos; + t_assert( + H3_EXPORT(cellToChildPos)(child, 0, &childPos) == E_CELL_INVALID, + "error matches expected for invalid cell"); + } +} diff --git a/src/apps/testapps/testCellToChildren.c b/src/apps/testapps/testCellToChildren.c new file mode 100644 index 000000000..a079a4451 --- /dev/null +++ b/src/apps/testapps/testCellToChildren.c @@ -0,0 +1,177 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 functions `cellToChildren` and `cellToChildrenSize` + * + * usage: `testCellToChildren` + */ + +#include + +#include "h3api.h" +#include "test.h" + +static void assertNoDuplicates(H3Index *cells, int n) { + for (int i = 0; i < n; i++) { + if (cells[i] == H3_NULL) continue; + t_assert(H3_EXPORT(isValidCell)(cells[i]), "must be valid H3 cell"); + for (int j = i + 1; j < n; j++) { + t_assert(cells[i] != cells[j], "can't have duplicate cells in set"); + } + } +} + +// assert that set1 is a subset of set2 +static void assertSubset(H3Index *set1, int len1, H3Index *set2, int len2) { + assertNoDuplicates(set1, len1); + + for (int i = 0; i < len1; i++) { + if (set1[i] == H3_NULL) continue; + + bool present = false; + for (int j = 0; j < len2; j++) { + if (set1[i] == set2[j]) { + present = true; + break; + }; + } + t_assert(present, "children must match"); + } +} + +/* +Assert that two arrays of h3 cells are equal sets: + - No duplicate cells allowed. + - Ignore zero elements (so array sizes may be different). + - Ignore array order. + */ +static void assertSetsEqual(H3Index *set1, int len1, H3Index *set2, int len2) { + assertSubset(set1, len1, set2, len2); + assertSubset(set2, len2, set1, len1); +} + +static void checkChildren(H3Index h, int res, H3Error expectedError, + H3Index *expected, int numExpected) { + int64_t numChildren; + H3Error numChildrenError = + H3_EXPORT(cellToChildrenSize)(h, res, &numChildren); + t_assert(numChildrenError == expectedError, "Expected error code"); + if (expectedError != E_SUCCESS) { + return; + } + H3Index *children = calloc(numChildren, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(h, res, children)); + + assertSetsEqual(children, numChildren, expected, numExpected); + + free(children); +} + +SUITE(cellToChildren_new) { + TEST(oneResStep) { + H3Index h = 0x88283080ddfffff; + int res = 9; + + H3Index expected[] = {0x89283080dc3ffff, 0x89283080dc7ffff, + 0x89283080dcbffff, 0x89283080dcfffff, + 0x89283080dd3ffff, 0x89283080dd7ffff, + 0x89283080ddbffff}; + + checkChildren(h, res, E_SUCCESS, expected, + sizeof(expected) / sizeof(H3Index)); + } + + TEST(multipleResSteps) { + H3Index h = 0x88283080ddfffff; + int res = 10; + + H3Index expected[] = { + 0x8a283080dd27fff, 0x8a283080dd37fff, 0x8a283080dc47fff, + 0x8a283080dcdffff, 0x8a283080dc5ffff, 0x8a283080dc27fff, + 0x8a283080ddb7fff, 0x8a283080dc07fff, 0x8a283080dd8ffff, + 0x8a283080dd5ffff, 0x8a283080dc4ffff, 0x8a283080dd47fff, + 0x8a283080dce7fff, 0x8a283080dd1ffff, 0x8a283080dceffff, + 0x8a283080dc6ffff, 0x8a283080dc87fff, 0x8a283080dcaffff, + 0x8a283080dd2ffff, 0x8a283080dcd7fff, 0x8a283080dd9ffff, + 0x8a283080dd6ffff, 0x8a283080dcc7fff, 0x8a283080dca7fff, + 0x8a283080dccffff, 0x8a283080dd77fff, 0x8a283080dc97fff, + 0x8a283080dd4ffff, 0x8a283080dd97fff, 0x8a283080dc37fff, + 0x8a283080dc8ffff, 0x8a283080dcb7fff, 0x8a283080dcf7fff, + 0x8a283080dd87fff, 0x8a283080dda7fff, 0x8a283080dc9ffff, + 0x8a283080dc77fff, 0x8a283080dc67fff, 0x8a283080dc57fff, + 0x8a283080ddaffff, 0x8a283080dd17fff, 0x8a283080dc17fff, + 0x8a283080dd57fff, 0x8a283080dc0ffff, 0x8a283080dd07fff, + 0x8a283080dc1ffff, 0x8a283080dd0ffff, 0x8a283080dc2ffff, + 0x8a283080dd67fff}; + + checkChildren(h, res, E_SUCCESS, expected, + sizeof(expected) / sizeof(H3Index)); + } + + TEST(sameRes) { + H3Index h = 0x88283080ddfffff; + int res = 8; + + H3Index expected[] = {h}; + + checkChildren(h, res, E_SUCCESS, expected, + sizeof(expected) / sizeof(H3Index)); + } + + TEST(childResTooCoarse) { + H3Index h = 0x88283080ddfffff; + int res = 7; + + H3Index expected[] = {0}; // empty set; zeros are ignored + + checkChildren(h, res, E_RES_DOMAIN, expected, + sizeof(expected) / sizeof(H3Index)); + } + + TEST(childResTooFine) { + H3Index h = 0x8f283080dcb0ae2; // res 15 cell + int res = MAX_H3_RES + 1; + + H3Index expected[] = {0}; // empty set; zeros are ignored + + checkChildren(h, res, E_RES_DOMAIN, expected, + sizeof(expected) / sizeof(H3Index)); + } + + TEST(pentagonChildren) { + H3Index h = 0x81083ffffffffff; // res 1 pentagon + int res = 3; + + H3Index expected[] = { + 0x830800fffffffff, 0x830802fffffffff, 0x830803fffffffff, + 0x830804fffffffff, 0x830805fffffffff, 0x830806fffffffff, + 0x830810fffffffff, 0x830811fffffffff, 0x830812fffffffff, + 0x830813fffffffff, 0x830814fffffffff, 0x830815fffffffff, + 0x830816fffffffff, 0x830818fffffffff, 0x830819fffffffff, + 0x83081afffffffff, 0x83081bfffffffff, 0x83081cfffffffff, + 0x83081dfffffffff, 0x83081efffffffff, 0x830820fffffffff, + 0x830821fffffffff, 0x830822fffffffff, 0x830823fffffffff, + 0x830824fffffffff, 0x830825fffffffff, 0x830826fffffffff, + 0x830828fffffffff, 0x830829fffffffff, 0x83082afffffffff, + 0x83082bfffffffff, 0x83082cfffffffff, 0x83082dfffffffff, + 0x83082efffffffff, 0x830830fffffffff, 0x830831fffffffff, + 0x830832fffffffff, 0x830833fffffffff, 0x830834fffffffff, + 0x830835fffffffff, 0x830836fffffffff}; + + checkChildren(h, res, E_SUCCESS, expected, + sizeof(expected) / sizeof(H3Index)); + } +} diff --git a/src/apps/testapps/testCellToChildrenSize.c b/src/apps/testapps/testCellToChildrenSize.c new file mode 100644 index 000000000..8707c0322 --- /dev/null +++ b/src/apps/testapps/testCellToChildrenSize.c @@ -0,0 +1,71 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "h3api.h" +#include "test.h" + +SUITE(cellToChildrenSize) { + TEST(cellToChildrenSize_hexagon) { + H3Index h = 0x87283080dffffff; // res 7 *hexagon* + + int64_t sz; + t_assert(H3_EXPORT(cellToChildrenSize)(h, 3, &sz) == E_RES_DOMAIN, + "got expected size for coarser res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 7, &sz)); + t_assert(sz == 1, "got expected size for same res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 8, &sz)); + t_assert(sz == 7, "got expected size for child res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 9, &sz)); + t_assert(sz == 7 * 7, "got expected size for grandchild res"); + } + + TEST(cellToChildrenSize_pentagon) { + H3Index h = 0x870800000ffffff; // res 7 *pentagon* + + int64_t sz; + t_assert(H3_EXPORT(cellToChildrenSize)(h, 3, &sz) == E_RES_DOMAIN, + "got expected size for coarser res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 7, &sz)); + t_assert(sz == 1, "got expected size for same res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 8, &sz)); + t_assert(sz == 6, "got expected size for child res"); + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 9, &sz)); + t_assert(sz == (5 * 7) + (1 * 6), + "got expected size for grandchild res"); + } + + TEST(cellToChildrenSize_largest_hexagon) { + H3Index h = 0x806dfffffffffff; // res 0 *hexagon* + int64_t expected = 4747561509943L; // 7^15 + int64_t out; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 15, &out)); + + t_assert(out == expected, + "got right size for children 15 levels below"); + } + + TEST(cellToChildrenSize_largest_pentagon) { + H3Index h = 0x8009fffffffffff; // res 0 *pentagon* + int64_t expected = 3956301258286L; // 1 + 5*(7^15 - 1)/6 + int64_t out; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h, 15, &out)); + + t_assert(out == expected, + "got right size for children 15 levels below"); + } +} diff --git a/src/apps/testapps/testH3ToGeo.c b/src/apps/testapps/testCellToLatLng.c similarity index 58% rename from src/apps/testapps/testH3ToGeo.c rename to src/apps/testapps/testCellToLatLng.c index d95ce660d..7dfe19ff5 100644 --- a/src/apps/testapps/testH3ToGeo.c +++ b/src/apps/testapps/testCellToLatLng.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,47 +14,49 @@ * limitations under the License. */ /** @file - * @brief tests H3 function `h3ToGeo` + * @brief tests H3 function `cellToLatLng` * - * usage: `testH3ToGeo` + * usage: `testCellToLatLng` * - * The program reads lines containing H3 indexes and lat/lon center + * The program reads lines containing H3 indexes and lat/lng center * point pairs from stdin until EOF is encountered. For each input line, - * the program calls `h3ToGeo` to convert H3 index to a lat/lng, then + * the program calls `cellToLatLng` to convert H3 index to a lat/lng, then * validates against the input lat/lng within a given threshold */ #include #include + #include "constants.h" -#include "geoCoord.h" #include "h3Index.h" +#include "latLng.h" #include "test.h" #include "utility.h" -void assertExpected(H3Index h1, const GeoCoord* g1) { +void assertExpected(H3Index h1, const LatLng *g1) { const double epsilon = 0.000001 * M_PI_180; - // convert H3 to lat/lon and verify - GeoCoord g2; - H3_EXPORT(h3ToGeo)(h1, &g2); + // convert H3 to lat/lng and verify + LatLng g2; + H3_EXPORT(cellToLatLng)(h1, &g2); t_assert(geoAlmostEqualThreshold(&g2, g1, epsilon), - "got expected h3ToGeo output"); + "got expected cellToLatLng output"); // Convert back to H3 to verify - int res = H3_EXPORT(h3GetResolution)(h1); - H3Index h2 = H3_EXPORT(geoToH3)(&g2, res); - t_assert(h1 == h2, "got expected geoToH3 output"); + int res = H3_EXPORT(getResolution)(h1); + H3Index h2; + t_assertSuccess(H3_EXPORT(latLngToCell)(&g2, res, &h2)); + t_assert(h1 == h2, "got expected latLngToCell output"); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { // check command line args if (argc > 1) { fprintf(stderr, "usage: %s\n", argv[0]); exit(1); } - // process the indexes and lat/lons on stdin + // process the indexes and lat/lngs on stdin char buff[BUFF_SIZE]; char h3Str[BUFF_SIZE]; while (1) { @@ -66,15 +68,15 @@ int main(int argc, char* argv[]) { error("reading input from stdin"); } - double latDegs, lonDegs; - if (sscanf(buff, "%s %lf %lf", h3Str, &latDegs, &lonDegs) != 3) - error("parsing input (should be \"H3Index lat lon\")"); + double latDegs, lngDegs; + if (sscanf(buff, "%s %lf %lf", h3Str, &latDegs, &lngDegs) != 3) + error("parsing input (should be \"H3Index lat lng\")"); H3Index h3; - h3 = H3_EXPORT(stringToH3)(h3Str); + t_assertSuccess(H3_EXPORT(stringToH3)(h3Str, &h3)); - GeoCoord coord; - setGeoDegs(&coord, latDegs, lonDegs); + LatLng coord; + setGeoDegs(&coord, latDegs, lngDegs); assertExpected(h3, &coord); } diff --git a/src/apps/testapps/testCellToLocalIj.c b/src/apps/testapps/testCellToLocalIj.c new file mode 100644 index 000000000..049a0a733 --- /dev/null +++ b/src/apps/testapps/testCellToLocalIj.c @@ -0,0 +1,268 @@ +/* + * Copyright 2018-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 index to local IJ and IJK+ grid functions. + * + * usage: `testCellToLocalIj` + */ + +#include +#include +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +SUITE(h3ToLocalIj) { + // Some indexes that represent base cells. Base cells + // are hexagons except for `pent1`. + H3Index bc1 = H3_INIT; + setH3Index(&bc1, 0, 15, 0); + + H3Index bc2 = H3_INIT; + setH3Index(&bc2, 0, 8, 0); + + H3Index bc3 = H3_INIT; + setH3Index(&bc3, 0, 31, 0); + + H3Index pent1 = H3_INIT; + setH3Index(&pent1, 0, 4, 0); + + TEST(ijBaseCells) { + CoordIJ ij = {.i = 0, .j = 0}; + H3Index origin = 0x8029fffffffffff; + H3Index retrieved; + t_assert( + H3_EXPORT(localIjToCell)(origin, &ij, 0, &retrieved) == E_SUCCESS, + "got origin back"); + t_assert(retrieved == 0x8029fffffffffff, "origin matches self"); + ij.i = 1; + t_assert( + H3_EXPORT(localIjToCell)(origin, &ij, 0, &retrieved) == E_SUCCESS, + "got offset index"); + t_assert(retrieved == 0x8051fffffffffff, + "modified index matches expected"); + ij.i = 2; + t_assert( + H3_EXPORT(localIjToCell)(origin, &ij, 0, &retrieved) == E_FAILED, + "out of range base cell (1)"); + ij.i = 0; + ij.j = 2; + t_assert( + H3_EXPORT(localIjToCell)(origin, &ij, 0, &retrieved) == E_FAILED, + "out of range base cell (2)"); + ij.i = -2; + ij.j = -2; + t_assert( + H3_EXPORT(localIjToCell)(origin, &ij, 0, &retrieved) == E_FAILED, + "out of range base cell (3)"); + } + + TEST(ijOutOfRange) { + const int numCoords = 7; + const CoordIJ coords[] = {{0, 0}, {1, 0}, {2, 0}, {3, 0}, + {4, 0}, {-4, 0}, {0, 4}}; + const H3Index expected[] = {0x81283ffffffffff, + 0x81293ffffffffff, + 0x8150bffffffffff, + 0x8151bffffffffff, + H3_NULL, + H3_NULL, + H3_NULL}; + + for (int i = 0; i < numCoords; i++) { + H3Index result; + const H3Error err = + H3_EXPORT(localIjToCell)(expected[0], &coords[i], 0, &result); + if (expected[i] == H3_NULL) { + t_assert(err != 0, "coordinates out of range"); + } else { + t_assert(err == 0, "coordinates in range"); + t_assert(result == expected[i], "result matches expectation"); + } + } + } + + TEST(cellToLocalIjFailed) { + CoordIJ ij; + + t_assert(H3_EXPORT(cellToLocalIj)(bc1, bc1, 0, &ij) == 0, + "found IJ (1)"); + t_assert(ij.i == 0 && ij.j == 0, "ij correct (1)"); + t_assert(H3_EXPORT(cellToLocalIj)(bc1, pent1, 0, &ij) == 0, + "found IJ (2)"); + t_assert(ij.i == 1 && ij.j == 0, "ij correct (2)"); + t_assert(H3_EXPORT(cellToLocalIj)(bc1, bc2, 0, &ij) == 0, + "found IJ (3)"); + t_assert(ij.i == 0 && ij.j == -1, "ij correct (3)"); + t_assert(H3_EXPORT(cellToLocalIj)(bc1, bc3, 0, &ij) == 0, + "found IJ (4)"); + t_assert(ij.i == -1 && ij.j == 0, "ij correct (4)"); + t_assert(H3_EXPORT(cellToLocalIj)(pent1, bc3, 0, &ij) == E_FAILED, + "found IJ (5)"); + } + + TEST(cellToLocalIjInvalid) { + CoordIJ ij; + H3Index invalidIndex = 0x7fffffffffffffff; + H3_SET_RESOLUTION(invalidIndex, H3_GET_RESOLUTION(bc1)); + t_assert(H3_EXPORT(cellToLocalIj)(bc1, invalidIndex, 0, &ij) == + E_CELL_INVALID, + "invalid index"); + t_assert(H3_EXPORT(cellToLocalIj)(0x7fffffffffffffff, bc1, 0, &ij) == + E_RES_MISMATCH, + "invalid origin"); + t_assert( + H3_EXPORT(cellToLocalIj)(0x7fffffffffffffff, 0x7fffffffffffffff, 0, + &ij) == E_CELL_INVALID, + "invalid origin and index"); + } + + TEST(localIjToCellInvalid) { + CoordIJ ij = {0, 0}; + H3Index index; + t_assert(H3_EXPORT(localIjToCell)(0x7fffffffffffffff, &ij, 0, &index) == + E_CELL_INVALID, + "invalid origin for ijToH3"); + } + + /** + * Tests for INVALID_DIGIT being detected and failed on in various cases. + */ + TEST(indexOnPentInvalid) { + H3Index onPentInvalid; + setH3Index(&onPentInvalid, 1, 4, INVALID_DIGIT); + H3Index offPent; + setH3Index(&offPent, 1, 3, CENTER_DIGIT); + CoordIJ ij; + t_assert(H3_EXPORT(cellToLocalIj)(offPent, onPentInvalid, 0, &ij) == + E_CELL_INVALID, + "invalid index on pentagon"); + + H3Index onPentValid; + setH3Index(&onPentValid, 1, 4, CENTER_DIGIT); + t_assert(H3_EXPORT(cellToLocalIj)(onPentInvalid, onPentValid, 0, &ij) == + E_CELL_INVALID, + "invalid both on pentagon"); + t_assert(H3_EXPORT(cellToLocalIj)(onPentValid, onPentInvalid, 0, &ij) == + E_CELL_INVALID, + "invalid both on pentagon"); + + ij.i = 0; + ij.j = 0; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(onPentInvalid, &ij, 0, &out) == + E_CELL_INVALID, + "invalid both on pentagon"); + + ij.i = 3; + ij.j = 3; + t_assert(H3_EXPORT(localIjToCell)(onPentInvalid, &ij, 0, &out) == + E_CELL_INVALID, + "invalid origin on pentagon"); + } + + TEST(invalidMode) { + CoordIJ ij; + H3Index cell = 0x85283473fffffff; + t_assertSuccess(H3_EXPORT(cellToLocalIj)(cell, cell, 0, &ij)); + + for (uint32_t i = 1; i <= 32; i++) { + CoordIJ ij2; + t_assert(H3_EXPORT(cellToLocalIj)(cell, cell, i, &ij2) == + E_OPTION_INVALID, + "Invalid mode fail for cellToLocalIj"); + H3Index cell2; + t_assert(H3_EXPORT(localIjToCell)(cell, &ij2, i, &cell2) == + E_OPTION_INVALID, + "Invalid mode fail for cellToLocalIj"); + } + } + + TEST(invalid_negativeIj) { + H3Index index = 0x200f202020202020; + CoordIJ ij = {.i = -14671840, .j = INT32_MIN}; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(index, &ij, 0, &out) == E_FAILED, + "Negative I and J components fail"); + } + + TEST(localIjToCell_overflow_i) { + H3Index origin; + setH3Index(&origin, 2, 2, CENTER_DIGIT); + CoordIJ ij = {.i = INT32_MIN, .j = INT32_MAX}; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "High magnitude I and J components fail"); + } + + TEST(localIjToCell_overflow_j) { + H3Index origin; + setH3Index(&origin, 2, 2, CENTER_DIGIT); + CoordIJ ij = {.i = INT32_MAX, .j = INT32_MIN}; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "High magnitude J and I components fail"); + } + + TEST(localIjToCell_overflow_ij) { + H3Index origin; + setH3Index(&origin, 2, 2, CENTER_DIGIT); + CoordIJ ij = {.i = INT32_MIN, .j = INT32_MIN}; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "High magnitude J and I components fail"); + } + + TEST(localIjToCell_overflow_particularCases) { + H3Index origin; + setH3Index(&origin, 2, 2, CENTER_DIGIT); + H3Index originRes3; + setH3Index(&originRes3, 2, 2, CENTER_DIGIT); + + CoordIJ ij = {.i = 553648127, .j = -2145378272}; + H3Index out; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "Particular high magnitude J and I components fail (1)"); + + ij.i = INT32_MAX - 10; + ij.j = -11; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "Particular high magnitude J and I components fail (2)"); + + ij.i = 553648127; + ij.j = -2145378272; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "Particular high magnitude J and I components fail (3)"); + + ij.i = INT32_MAX - 10; + ij.j = -10; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "Particular high magnitude J and I components fail (4)"); + + ij.i = INT32_MAX - 10; + ij.j = -9; + t_assert(H3_EXPORT(localIjToCell)(origin, &ij, 0, &out) == E_FAILED, + "Particular high magnitude J and I components fail (5)"); + } +} diff --git a/src/apps/testapps/testH3ToLocalIj.c b/src/apps/testapps/testCellToLocalIjExhaustive.c similarity index 57% rename from src/apps/testapps/testH3ToLocalIj.c rename to src/apps/testapps/testCellToLocalIjExhaustive.c index 75a972552..9065be331 100644 --- a/src/apps/testapps/testH3ToLocalIj.c +++ b/src/apps/testapps/testCellToLocalIjExhaustive.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2019-2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,29 +14,30 @@ * limitations under the License. */ /** @file - * @brief tests H3 index to local IJ and IJK+ grid functions. + * @brief tests H3 index to local IJ and IJK+ grid functions using + * tests over a large number of indexes. * - * usage: `testH3ToLocalIj` + * usage: `testCellToLocalIjExhaustive` */ #include #include #include #include + #include "algos.h" #include "baseCells.h" #include "constants.h" #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; -// The same traversal constants from algos.c (for hexRange) here reused as local -// IJ vectors. +// The same traversal constants from algos.c (for gridDiskUnsafe) here reused as +// local IJ vectors. static const CoordIJ DIRECTIONS[6] = {{0, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, 0}, {1, 1}}; @@ -47,11 +48,11 @@ static const CoordIJ NEXT_RING_DIRECTION = {1, 0}; */ void localIjToH3_identity_assertions(H3Index h3) { CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + t_assert(H3_EXPORT(cellToLocalIj)(h3, h3, 0, &ij) == 0, "able to setup localIjToH3 test"); H3Index retrieved; - t_assert(H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, + t_assert(H3_EXPORT(localIjToCell)(h3, &ij, 0, &retrieved) == 0, "got an index back from localIjTOh3"); t_assert(h3 == retrieved, "round trip through local IJ space works"); } @@ -65,10 +66,10 @@ void h3ToLocalIj_coordinates_assertions(H3Index h3) { int r = H3_GET_RESOLUTION(h3); CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + t_assert(H3_EXPORT(cellToLocalIj)(h3, h3, 0, &ij) == 0, "get ij for origin"); CoordIJK ijk; - ijToIjk(&ij, &ijk); + t_assertSuccess(ijToIjk(&ij, &ijk)); if (r == 0) { t_assert(_ijkMatches(&ijk, &UNIT_VECS[0]) == 1, "res 0 cell at 0,0,0"); } else if (r == 1) { @@ -91,24 +92,25 @@ void h3ToLocalIj_coordinates_assertions(H3Index h3) { */ void h3ToLocalIj_neighbors_assertions(H3Index h3) { CoordIJ origin = {0}; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &origin) == 0, + t_assert(H3_EXPORT(cellToLocalIj)(h3, h3, 0, &origin) == 0, "got ij for origin"); CoordIJK originIjk; - ijToIjk(&origin, &originIjk); + t_assertSuccess(ijToIjk(&origin, &originIjk)); for (Direction d = K_AXES_DIGIT; d < INVALID_DIGIT; d++) { - if (d == K_AXES_DIGIT && H3_EXPORT(h3IsPentagon)(h3)) { + if (d == K_AXES_DIGIT && H3_EXPORT(isPentagon)(h3)) { continue; } int rotations = 0; - H3Index offset = h3NeighborRotations(h3, d, &rotations); + H3Index offset; + t_assertSuccess(h3NeighborRotations(h3, d, &rotations, &offset)); CoordIJ ij = {0}; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, offset, &ij) == 0, + t_assert(H3_EXPORT(cellToLocalIj)(h3, offset, 0, &ij) == 0, "got ij for destination"); CoordIJK ijk; - ijToIjk(&ij, &ijk); + t_assertSuccess(ijToIjk(&ij, &ijk)); CoordIJK invertedIjk = {0}; _neighbor(&invertedIjk, d); for (int i = 0; i < 3; i++) { @@ -121,37 +123,88 @@ void h3ToLocalIj_neighbors_assertions(H3Index h3) { } } +/** + * Test the the immediate neighbors of an index with invalid digits return + * error. + */ +void h3ToLocalIj_invalid_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r > 0, "resolution supported by test function (invalid digits)"); + t_assert(r <= 5, "resolution supported by test function (invalid digits)"); + int maxK = MAX_DISTANCES[r]; + + int64_t sz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(maxK, &sz)); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); + + t_assertSuccess( + H3_EXPORT(gridDiskDistances)(h3, maxK, neighbors, distances)); + + for (int64_t i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + + CoordIJ ij; + // Don't consider indexes which we can't unfold in the first place + if (H3_EXPORT(cellToLocalIj)(h3, neighbors[i], 0, &ij) == E_SUCCESS) { + for (int j = 0; j < 2; j++) { + Direction dir = j == 0 ? INVALID_DIGIT : K_AXES_DIGIT; + // Valgrind / ASAN / UBSAN are used to test these assertions + H3Index h3Invalid = h3; + H3_SET_INDEX_DIGIT(h3Invalid, 0, dir); + CoordIJ ij2; + H3_EXPORT(cellToLocalIj) + (h3Invalid, neighbors[i], 0, &ij2); + H3Index neighborInvalid = neighbors[i]; + H3_SET_INDEX_DIGIT(neighborInvalid, 0, dir); + H3_EXPORT(cellToLocalIj)(h3, neighborInvalid, 0, &ij2); + H3Index out; + H3_EXPORT(localIjToCell)(h3Invalid, &ij, 0, &out); + } + } + } + + free(distances); + free(neighbors); +} + /** * Test that the neighbors (k-ring), if they can be found in the local IJ * coordinate space, can be converted back to indexes. */ -void localIjToH3_kRing_assertions(H3Index h3) { +void localIjToH3_gridDisk_assertions(H3Index h3) { int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); + t_assert(r <= 5, "resolution supported by test function (gridDisk)"); int maxK = MAX_DISTANCES[r]; - int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - STACK_ARRAY_CALLOC(int, distances, sz); + int64_t sz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(maxK, &sz)); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); - H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); + t_assertSuccess( + H3_EXPORT(gridDiskDistances)(h3, maxK, neighbors, distances)); - for (int i = 0; i < sz; i++) { + for (int64_t i = 0; i < sz; i++) { if (neighbors[i] == 0) { continue; } CoordIJ ij; // Don't consider indexes which we can't unfold in the first place - if (H3_EXPORT(experimentalH3ToLocalIj)(h3, neighbors[i], &ij) == 0) { + if (H3_EXPORT(cellToLocalIj)(h3, neighbors[i], 0, &ij) == 0) { H3Index retrieved; - t_assert( - H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &retrieved) == 0, - "retrieved index for unfolded coordinates"); + t_assert(H3_EXPORT(localIjToCell)(h3, &ij, 0, &retrieved) == 0, + "retrieved index for unfolded coordinates"); t_assert(retrieved == neighbors[i], "round trip neighboring index matches expected"); } } + + free(distances); + free(neighbors); } void localIjToH3_traverse_assertions(H3Index h3) { @@ -160,10 +213,10 @@ void localIjToH3_traverse_assertions(H3Index h3) { int k = MAX_DISTANCES[r]; CoordIJ ij; - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(h3, h3, &ij) == 0, + t_assert(H3_EXPORT(cellToLocalIj)(h3, h3, 0, &ij) == 0, "Got origin coordinates"); - // This logic is from hexRangeDistances. + // This logic is from gridDiskDistancesUnsafe. // 0 < ring <= k, current ring int ring = 1; // 0 <= direction < 6, current side of the ring @@ -182,14 +235,14 @@ void localIjToH3_traverse_assertions(H3Index h3) { H3Index testH3; - int failed = H3_EXPORT(experimentalLocalIjToH3)(h3, &ij, &testH3); + int failed = H3_EXPORT(localIjToCell)(h3, &ij, 0, &testH3); if (!failed) { - t_assert(H3_EXPORT(h3IsValid)(testH3), + t_assert(H3_EXPORT(isValidCell)(testH3), "test coordinates result in valid index"); CoordIJ expectedIj; int reverseFailed = - H3_EXPORT(experimentalH3ToLocalIj)(h3, testH3, &expectedIj); + H3_EXPORT(cellToLocalIj)(h3, testH3, 0, &expectedIj); // If it doesn't give a coordinate for this origin,index pair that's // OK. if (!reverseFailed) { @@ -198,8 +251,8 @@ void localIjToH3_traverse_assertions(H3Index h3) { // pentagon distortion. In that case, the other coordinates // should also belong to the same index. H3Index testTestH3; - t_assert(H3_EXPORT(experimentalLocalIjToH3)( - h3, &expectedIj, &testTestH3) == 0, + t_assert(H3_EXPORT(localIjToCell)(h3, &expectedIj, 0, + &testTestH3) == 0, "converted coordinates again"); t_assert(testH3 == testTestH3, "index has normalizable coordinates in " @@ -223,20 +276,6 @@ void localIjToH3_traverse_assertions(H3Index h3) { } SUITE(h3ToLocalIj) { - // Some indexes that represent base cells. Base cells - // are hexagons except for `pent1`. - H3Index bc1 = H3_INIT; - setH3Index(&bc1, 0, 15, 0); - - H3Index bc2 = H3_INIT; - setH3Index(&bc2, 0, 8, 0); - - H3Index bc3 = H3_INIT; - setH3Index(&bc3, 0, 31, 0); - - H3Index pent1 = H3_INIT; - setH3Index(&pent1, 0, 4, 0); - TEST(localIjToH3_identity) { iterateAllIndexesAtRes(0, localIjToH3_identity_assertions); iterateAllIndexesAtRes(1, localIjToH3_identity_assertions); @@ -255,12 +294,17 @@ SUITE(h3ToLocalIj) { iterateAllIndexesAtRes(2, h3ToLocalIj_neighbors_assertions); } - TEST(localIjToH3_kRing) { - iterateAllIndexesAtRes(0, localIjToH3_kRing_assertions); - iterateAllIndexesAtRes(1, localIjToH3_kRing_assertions); - iterateAllIndexesAtRes(2, localIjToH3_kRing_assertions); + TEST(h3ToLocalIj_invalid) { + iterateAllIndexesAtRes(1, h3ToLocalIj_invalid_assertions); + iterateAllIndexesAtRes(2, h3ToLocalIj_invalid_assertions); + } + + TEST(localIjToH3_gridDisk) { + iterateAllIndexesAtRes(0, localIjToH3_gridDisk_assertions); + iterateAllIndexesAtRes(1, localIjToH3_gridDisk_assertions); + iterateAllIndexesAtRes(2, localIjToH3_gridDisk_assertions); // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, localIjToH3_kRing_assertions, 27); + iterateAllIndexesAtResPartial(3, localIjToH3_gridDisk_assertions, 27); // Further resolutions aren't tested to save time. } @@ -272,71 +316,4 @@ SUITE(h3ToLocalIj) { iterateAllIndexesAtResPartial(3, localIjToH3_traverse_assertions, 27); // Further resolutions aren't tested to save time. } - - TEST(ijkBaseCells) { - CoordIJK ijk; - t_assert(h3ToLocalIjk(pent1, bc1, &ijk) == 0, - "got ijk for base cells 4 and 15"); - t_assert(_ijkMatches(&ijk, &UNIT_VECS[2]) == 1, - "neighboring base cell at 0,1,0"); - } - - TEST(ijBaseCells) { - CoordIJ ij = {.i = 0, .j = 0}; - H3Index origin = 0x8029fffffffffff; - H3Index retrieved; - t_assert( - H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) == 0, - "got origin back"); - t_assert(retrieved == 0x8029fffffffffff, "origin matches self"); - ij.i = 1; - t_assert( - H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) == 0, - "got offset index"); - t_assert(retrieved == 0x8051fffffffffff, - "modified index matches expected"); - ij.i = 2; - t_assert( - H3_EXPORT(experimentalLocalIjToH3)(origin, &ij, &retrieved) != 0, - "out of range base cell"); - } - - TEST(ijOutOfRange) { - const int numCoords = 5; - const CoordIJ coords[] = {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}; - const H3Index expected[] = {0x81283ffffffffff, 0x81293ffffffffff, - 0x8150bffffffffff, 0x8151bffffffffff, - H3_INVALID_INDEX}; - - for (int i = 0; i < numCoords; i++) { - H3Index result; - const int err = H3_EXPORT(experimentalLocalIjToH3)( - expected[0], &coords[i], &result); - if (expected[i] == H3_INVALID_INDEX) { - t_assert(err != 0, "coordinates out of range"); - } else { - t_assert(err == 0, "coordinates in range"); - t_assert(result == expected[i], "result matches expectation"); - } - } - } - - TEST(experimentalH3ToLocalIjFailed) { - CoordIJ ij; - - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(bc1, bc1, &ij) == 0, - "found IJ (1)"); - t_assert(ij.i == 0 && ij.j == 0, "ij correct (1)"); - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(bc1, pent1, &ij) == 0, - "found IJ (2)"); - t_assert(ij.i == 1 && ij.j == 0, "ij correct (2)"); - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(bc1, bc2, &ij) == 0, - "found IJ (3)"); - t_assert(ij.i == 0 && ij.j == -1, "ij correct (3)"); - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(bc1, bc3, &ij) == 0, - "found IJ (4)"); - t_assert(ij.i == -1 && ij.j == 0, "ij correct (4)"); - t_assert(H3_EXPORT(experimentalH3ToLocalIj)(pent1, bc3, &ij) != 0, - "found IJ (5)"); - } } diff --git a/src/apps/testapps/testCellToLocalIjInternal.c b/src/apps/testapps/testCellToLocalIjInternal.c new file mode 100644 index 000000000..fc0848d69 --- /dev/null +++ b/src/apps/testapps/testCellToLocalIjInternal.c @@ -0,0 +1,118 @@ +/* + * Copyright 2018-2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 index to local IJ and IJK+ grid functions. + * + * usage: `testCellToLocalIjInternal` + */ + +#include +#include +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +SUITE(h3ToLocalIjInternal) { + // Some indexes that represent base cells. Base cells + // are hexagons except for `pent1`. + H3Index bc1 = H3_INIT; + setH3Index(&bc1, 0, 15, 0); + + H3Index pent1 = H3_INIT; + setH3Index(&pent1, 0, 4, 0); + + TEST(ijkBaseCells) { + CoordIJK ijk; + t_assert(cellToLocalIjk(pent1, bc1, &ijk) == E_SUCCESS, + "got ijk for base cells 4 and 15"); + t_assert(_ijkMatches(&ijk, &UNIT_VECS[2]) == 1, + "neighboring base cell at 0,1,0"); + } + + /** + * Test that coming from the same direction outside the pentagon is handled + * the same as coming from the same direction inside the pentagon. + */ + TEST(onOffPentagonSame) { + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + for (int res = 1; res <= MAX_H3_RES; res++) { + // K_AXES_DIGIT is the first internal direction, and it's also + // invalid for pentagons, so skip to next. + Direction startDir = K_AXES_DIGIT; + if (_isBaseCellPentagon(bc)) { + startDir++; + } + + for (Direction dir = startDir; dir < NUM_DIGITS; dir++) { + H3Index internalOrigin; + setH3Index(&internalOrigin, res, bc, dir); + + H3Index externalOrigin; + setH3Index(&externalOrigin, res, + _getBaseCellNeighbor(bc, dir), CENTER_DIGIT); + + for (Direction testDir = startDir; testDir < NUM_DIGITS; + testDir++) { + H3Index testIndex; + setH3Index(&testIndex, res, bc, testDir); + + CoordIJ internalIj; + int internalIjFailed = H3_EXPORT(cellToLocalIj)( + internalOrigin, testIndex, 0, &internalIj); + CoordIJ externalIj; + int externalIjFailed = H3_EXPORT(cellToLocalIj)( + externalOrigin, testIndex, 0, &externalIj); + + t_assert( + (bool)internalIjFailed == (bool)externalIjFailed, + "internal/external failed matches when getting IJ"); + + if (internalIjFailed) { + continue; + } + + H3Index internalIndex; + int internalIjFailed2 = H3_EXPORT(localIjToCell)( + internalOrigin, &internalIj, 0, &internalIndex); + H3Index externalIndex; + int externalIjFailed2 = H3_EXPORT(localIjToCell)( + externalOrigin, &externalIj, 0, &externalIndex); + + t_assert( + (bool)internalIjFailed2 == (bool)externalIjFailed2, + "internal/external failed matches when getting " + "index"); + + if (internalIjFailed2) { + continue; + } + + t_assert(internalIndex == externalIndex, + "internal/external index matches"); + } + } + } + } + } +} diff --git a/src/apps/testapps/testH3ToParent.c b/src/apps/testapps/testCellToParent.c similarity index 54% rename from src/apps/testapps/testH3ToParent.c rename to src/apps/testapps/testCellToParent.c index d2197acbc..4b4288918 100644 --- a/src/apps/testapps/testH3ToParent.c +++ b/src/apps/testapps/testCellToParent.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,11 +15,12 @@ */ #include + #include "h3Index.h" #include "test.h" -SUITE(h3ToParent) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; +SUITE(cellToParent) { + LatLng sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; TEST(ancestorsForEachRes) { H3Index child; @@ -28,9 +29,11 @@ SUITE(h3ToParent) { for (int res = 1; res < 15; res++) { for (int step = 0; step < res; step++) { - child = H3_EXPORT(geoToH3)(&sf, res); - parent = H3_EXPORT(h3ToParent)(child, res - step); - comparisonParent = H3_EXPORT(geoToH3)(&sf, res - step); + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, res, &child)); + t_assertSuccess( + H3_EXPORT(cellToParent)(child, res - step, &parent)); + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, res - step, + &comparisonParent)); t_assert(parent == comparisonParent, "Got expected parent"); } @@ -38,13 +41,17 @@ SUITE(h3ToParent) { } TEST(invalidInputs) { - H3Index child = H3_EXPORT(geoToH3)(&sf, 5); + H3Index child; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, 5, &child)); - t_assert(H3_EXPORT(h3ToParent)(child, 6) == 0, + H3Index parent; + t_assert(H3_EXPORT(cellToParent)(child, 6, &parent) == E_RES_MISMATCH, "Higher resolution fails"); - t_assert(H3_EXPORT(h3ToParent)(child, -1) == 0, + t_assert(H3_EXPORT(cellToParent)(child, -1, &parent) == E_RES_DOMAIN, + "Invalid resolution fails"); + t_assert(H3_EXPORT(cellToParent)(child, 15, &parent) == E_RES_MISMATCH, "Invalid resolution fails"); - t_assert(H3_EXPORT(h3ToParent)(child, 15) == 0, + t_assert(H3_EXPORT(cellToParent)(child, 16, &parent) == E_RES_DOMAIN, "Invalid resolution fails"); } } diff --git a/src/apps/testapps/testH3SetToLinkedGeo.c b/src/apps/testapps/testCellsToLinkedMultiPolygon.c similarity index 64% rename from src/apps/testapps/testH3SetToLinkedGeo.c rename to src/apps/testapps/testCellsToLinkedMultiPolygon.c index 72e01255e..5c903386e 100644 --- a/src/apps/testapps/testH3SetToLinkedGeo.c +++ b/src/apps/testapps/testCellsToLinkedMultiPolygon.c @@ -15,19 +15,21 @@ */ #include + #include "algos.h" #include "test.h" #include "utility.h" -SUITE(h3SetToLinkedGeo) { +SUITE(cellsToLinkedMultiPolygon) { TEST(empty) { LinkedGeoPolygon polygon; - H3_EXPORT(h3SetToLinkedGeo)(NULL, 0, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(NULL, 0, &polygon)); t_assert(countLinkedLoops(&polygon) == 0, "No loops added to polygon"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(singleHex) { @@ -35,13 +37,24 @@ SUITE(h3SetToLinkedGeo) { H3Index set[] = {0x890dab6220bffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == 6, "6 coords added to loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(invalid) { + LinkedGeoPolygon polygon; + H3Index set[] = {0xfffffffffffffff}; + int numHexes = ARRAY_SIZE(set); + + t_assert(H3_EXPORT(cellsToLinkedMultiPolygon)( + set, numHexes, &polygon) == E_CELL_INVALID, + "Invalid set fails"); } TEST(contiguous2) { @@ -49,13 +62,14 @@ SUITE(h3SetToLinkedGeo) { H3Index set[] = {0x8928308291bffff, 0x89283082957ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == 10, "All coords added to loop except 2 shared"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } // TODO: This test asserts incorrect behavior - we should be creating @@ -66,7 +80,8 @@ SUITE(h3SetToLinkedGeo) { H3Index set[] = {0x8928308291bffff, 0x89283082943ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedPolygons(&polygon) == 2, "2 polygons added"); t_assert(countLinkedLoops(&polygon) == 1, @@ -78,7 +93,7 @@ SUITE(h3SetToLinkedGeo) { t_assert(countLinkedCoords(polygon.next->first) == 6, "All coords for one hex added to second polygon"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(contiguous3) { @@ -87,13 +102,14 @@ SUITE(h3SetToLinkedGeo) { 0x8928308289bffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == 12, "All coords added to loop except 6 shared"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(hole) { @@ -103,7 +119,7 @@ SUITE(h3SetToLinkedGeo) { 0x8928308288fffff, 0x89283082883ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon); t_assert(countLinkedLoops(&polygon) == 2, "2 loops added to polygon"); t_assert(countLinkedCoords(polygon.first) == 6 * 3, @@ -111,7 +127,7 @@ SUITE(h3SetToLinkedGeo) { t_assert(countLinkedCoords(polygon.first->next) == 6, "All inner coords added to second loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(pentagon) { @@ -119,16 +135,17 @@ SUITE(h3SetToLinkedGeo) { H3Index set[] = {0x851c0003fffffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == 10, "10 coords (distorted pentagon) added to loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } - TEST(2Ring) { + TEST(twoRing) { LinkedGeoPolygon polygon; // 2-ring, in order returned by k-ring algo H3Index set[] = { @@ -141,16 +158,17 @@ SUITE(h3SetToLinkedGeo) { 0x89300628303ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == (6 * (2 * 2 + 1)), "Expected number of coords added to loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } - TEST(2RingUnordered) { + TEST(twoRingUnordered) { LinkedGeoPolygon polygon; // 2-ring in random order H3Index set[] = { @@ -163,13 +181,14 @@ SUITE(h3SetToLinkedGeo) { 0x893006283c7ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == (6 * (2 * 2 + 1)), "Expected number of coords added to loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(nestedDonut) { @@ -186,7 +205,8 @@ SUITE(h3SetToLinkedGeo) { 0x892830828b3ffff, 0x89283082887ffff, 0x89283082883ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); // Note that the polygon order here is arbitrary, making this test // somewhat brittle, but it's difficult to assert correctness otherwise @@ -204,7 +224,7 @@ SUITE(h3SetToLinkedGeo) { t_assert(countLinkedCoords(polygon.next->first->next) == 6, "Got expected inner loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(nestedDonutTransmeridian) { @@ -221,7 +241,8 @@ SUITE(h3SetToLinkedGeo) { 0x897eb572287ffff, 0x897eb572283ffff, 0x897eb57229bffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); // Note that the polygon order here is arbitrary, making this test // somewhat brittle, but it's difficult to assert correctness otherwise @@ -239,7 +260,7 @@ SUITE(h3SetToLinkedGeo) { t_assert(countLinkedCoords(polygon.next->first->next) == 30, "Got expected big inner loop"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(contiguous2distorted) { @@ -247,20 +268,22 @@ SUITE(h3SetToLinkedGeo) { H3Index set[] = {0x894cc5365afffff, 0x894cc536537ffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedLoops(&polygon) == 1, "1 loop added to polygon"); t_assert(countLinkedCoords(polygon.first) == 12, "All coords added to loop except 2 shared"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); } TEST(negativeHashedCoordinates) { LinkedGeoPolygon polygon; H3Index set[] = {0x88ad36c547fffff, 0x88ad36c467fffff}; int numHexes = ARRAY_SIZE(set); - H3_EXPORT(h3SetToLinkedGeo)(set, numHexes, &polygon); + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, &polygon)); t_assert(countLinkedPolygons(&polygon) == 2, "2 polygons added"); t_assert(countLinkedLoops(&polygon) == 1, @@ -272,6 +295,82 @@ SUITE(h3SetToLinkedGeo) { t_assert(countLinkedCoords(polygon.next->first) == 6, "All coords for one hex added to second polygon"); - H3_EXPORT(destroyLinkedPolygon)(&polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(specificLeak) { + // Test for a case where a leak can occur, detected by fuzzer. + // The leak detection part will be enforced here by valgrind. + LinkedGeoPolygon polygon; + H3Index set[] = {0xd60006d60000f100, 0x3c3c403c1300d668}; + int numHexes = ARRAY_SIZE(set); + t_assert(H3_EXPORT(cellsToLinkedMultiPolygon)(set, numHexes, + &polygon) == E_FAILED, + "invalid cells fail"); + } + + TEST(gridDiskResolutions) { + // This is a center-face base cell, no pentagon siblings + H3Index baseCell = 0x8073fffffffffff; + H3Index origin = baseCell; + + H3Index indexes[19] = {0}; + int numHexes = ARRAY_SIZE(indexes); + + for (int res = 1; res < 15; res++) { + // Take the 2-disk of the center child at res + t_assertSuccess( + H3_EXPORT(cellToCenterChild)(baseCell, res, &origin)); + t_assertSuccess(H3_EXPORT(gridDisk)(origin, 2, indexes)); + + // Test the polygon output + LinkedGeoPolygon polygon; + t_assertSuccess(H3_EXPORT(cellsToLinkedMultiPolygon)( + indexes, numHexes, &polygon)); + t_assert(countLinkedPolygons(&polygon) == 1, "1 polygon added"); + t_assert(countLinkedLoops(&polygon) == 1, + "1 loop on the first polygon"); + t_assert(countLinkedCoords(polygon.first) == 30, + "All coords for all hexes added to first loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + } + + TEST(gridDiskResolutionsPentagon) { + // This is a pentagon base cell + H3Index baseCell = 0x8031fffffffffff; + H3Index origin = baseCell; + + H3Index diskIndexes[7] = {0}; + H3Index indexes[6] = {0}; + + for (int res = 1; res < 15; res++) { + // Take the 1-disk of the center child at res. Note: We can't take + // the 2-disk here, as increased distortion around the pentagon will + // still fail at res 1. TODO: Use a 2-ring, start at res 0 + // when output is correct. + t_assertSuccess( + H3_EXPORT(cellToCenterChild)(baseCell, res, &origin)); + t_assertSuccess(H3_EXPORT(gridDisk)(origin, 1, diskIndexes)); + + int j = 0; + for (int i = 0; i < 7; i++) { + if (diskIndexes[i]) indexes[j++] = diskIndexes[i]; + } + t_assert(j == 6, "Filled all 6 indexes"); + + // Test the polygon output + LinkedGeoPolygon polygon; + t_assertSuccess( + H3_EXPORT(cellsToLinkedMultiPolygon)(indexes, 6, &polygon)); + t_assert(countLinkedPolygons(&polygon) == 1, "1 polygon added"); + t_assert(countLinkedLoops(&polygon) == 1, + "1 loop on the first polygon"); + t_assert(countLinkedCoords(polygon.first) == 15, + "All coords for all hexes added to first loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } } } diff --git a/src/apps/testapps/testCompact.c b/src/apps/testapps/testCompact.c deleted file mode 100644 index 39a949333..000000000 --- a/src/apps/testapps/testCompact.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "constants.h" -#include "h3Index.h" -#include "test.h" - -H3Index sunnyvale = 0x89283470c27ffff; - -H3Index uncompactable[] = {0x89283470803ffff, 0x8928347081bffff, - 0x8928347080bffff}; - -SUITE(compact) { - TEST(roundtrip) { - int k = 9; - int hexCount = H3_EXPORT(maxKringSize)(k); - int expectedCompactCount = 73; - - // Generate a set of hexagons to compact - H3Index* sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); - H3_EXPORT(kRing)(sunnyvale, k, sunnyvaleExpanded); - - H3Index* compressed = calloc(hexCount, sizeof(H3Index)); - int err = H3_EXPORT(compact)(sunnyvaleExpanded, compressed, hexCount); - t_assert(err == 0, "no error on compact"); - - int count = 0; - for (int i = 0; i < hexCount; i++) { - if (compressed[i] != 0) { - count++; - } - } - t_assert(count == expectedCompactCount, "got expected compacted count"); - - H3Index* decompressed = calloc( - H3_EXPORT(maxUncompactSize)(compressed, count, 9), sizeof(H3Index)); - int err2 = - H3_EXPORT(uncompact)(compressed, count, decompressed, hexCount, 9); - t_assert(err2 == 0, "no error on uncompact"); - - int count2 = 0; - for (int i = 0; i < hexCount; i++) { - if (decompressed[i] != 0) { - count2++; - } - } - t_assert(count2 == hexCount, "got expected uncompacted count"); - - free(compressed); - free(decompressed); - free(sunnyvaleExpanded); - } - - TEST(res0) { - int hexCount = NUM_BASE_CELLS; - - H3Index* res0Hexes = calloc(hexCount, sizeof(H3Index)); - for (int i = 0; i < hexCount; i++) { - setH3Index(&res0Hexes[i], 0, i, 0); - } - H3Index* compressed = calloc(hexCount, sizeof(H3Index)); - int err = H3_EXPORT(compact)(res0Hexes, compressed, hexCount); - t_assert(err == 0, "no error on compact"); - - for (int i = 0; i < hexCount; i++) { - // At resolution 0, it will be an exact copy. - // The test is further optimizing that it will be in order (which - // isn't guaranteed.) - t_assert(compressed[i] == res0Hexes[i], - "got expected compressed result"); - } - - H3Index* decompressed = - calloc(H3_EXPORT(maxUncompactSize)(compressed, hexCount, 0), - sizeof(H3Index)); - int err2 = H3_EXPORT(uncompact)(compressed, hexCount, decompressed, - hexCount, 0); - t_assert(err2 == 0, "no error on uncompact"); - - int count2 = 0; - for (int i = 0; i < hexCount; i++) { - if (decompressed[i] != 0) { - count2++; - } - } - t_assert(count2 == hexCount, "got expected uncompacted count"); - - free(res0Hexes); - free(compressed); - free(decompressed); - } - - TEST(uncompactable) { - int hexCount = 3; - int expectedCompactCount = 3; - - H3Index* compressed = calloc(hexCount, sizeof(H3Index)); - int err = H3_EXPORT(compact)(uncompactable, compressed, hexCount); - t_assert(err == 0, "no error on compact"); - - int count = 0; - for (int i = 0; i < hexCount; i++) { - if (compressed[i] != 0) { - count++; - } - } - t_assert(count == expectedCompactCount, "got expected compacted count"); - - H3Index* decompressed = calloc( - H3_EXPORT(maxUncompactSize)(compressed, count, 9), sizeof(H3Index)); - int err2 = - H3_EXPORT(uncompact)(compressed, count, decompressed, hexCount, 9); - t_assert(err2 == 0, "no error on uncompact"); - - int count2 = 0; - for (int i = 0; i < hexCount; i++) { - if (decompressed[i] != 0) { - count2++; - } - } - t_assert(count2 == hexCount, "got expected uncompacted count"); - - free(compressed); - free(decompressed); - } - - TEST(compact_duplicate) { - int numHex = 10; - H3Index someHexagons[10] = {0}; - for (int i = 0; i < numHex; i++) { - setH3Index(&someHexagons[i], 5, 0, 2); - } - H3Index compressed[10]; - - t_assert(H3_EXPORT(compact)(someHexagons, compressed, numHex) != 0, - "compact fails on duplicate input"); - } - - TEST(uncompact_wrongRes) { - int numHex = 3; - H3Index someHexagons[] = {0, 0, 0}; - for (int i = 0; i < numHex; i++) { - setH3Index(&someHexagons[i], 5, i, 0); - } - - int sizeResult = H3_EXPORT(maxUncompactSize)(someHexagons, numHex, 4); - t_assert(sizeResult < 0, - "maxUncompactSize fails when given illogical resolutions"); - sizeResult = H3_EXPORT(maxUncompactSize)(someHexagons, numHex, -1); - t_assert(sizeResult < 0, - "maxUncompactSize fails when given illegal resolutions"); - - H3Index uncompressed[] = {0, 0, 0}; - int uncompactResult = - H3_EXPORT(uncompact)(someHexagons, numHex, uncompressed, numHex, 0); - t_assert(uncompactResult != 0, - "uncompact fails when given illogical resolutions"); - uncompactResult = - H3_EXPORT(uncompact)(someHexagons, numHex, uncompressed, numHex, 6); - t_assert(uncompactResult != 0, - "uncompact fails when given too little buffer"); - uncompactResult = H3_EXPORT(uncompact)(someHexagons, numHex, - uncompressed, numHex - 1, 5); - t_assert( - uncompactResult != 0, - "uncompact fails when given too little buffer (same resolution)"); - } - - TEST(someHexagon) { - H3Index origin; - setH3Index(&origin, 1, 5, 0); - - int childrenSz = H3_EXPORT(maxUncompactSize)(&origin, 1, 2); - H3Index* children = calloc(childrenSz, sizeof(H3Index)); - int uncompactResult = - H3_EXPORT(uncompact)(&origin, 1, children, childrenSz, 2); - t_assert(uncompactResult == 0, "uncompact origin succeeds"); - - H3Index* result = calloc(childrenSz, sizeof(H3Index)); - int compactResult = H3_EXPORT(compact)(children, result, childrenSz); - t_assert(compactResult == 0, "compact origin succeeds"); - - int found = 0; - for (int i = 0; i < childrenSz; i++) { - if (result[i] != 0) { - found++; - t_assert(result[i] == origin, "compacted to correct origin"); - } - } - t_assert(found == 1, "compacted to a single hexagon"); - - free(children); - free(result); - } - - TEST(pentagon) { - H3Index pentagon; - setH3Index(&pentagon, 1, 4, 0); - - int childrenSz = H3_EXPORT(maxUncompactSize)(&pentagon, 1, 2); - H3Index* children = calloc(childrenSz, sizeof(H3Index)); - int uncompactResult = - H3_EXPORT(uncompact)(&pentagon, 1, children, childrenSz, 2); - t_assert(uncompactResult == 0, "uncompact pentagon succeeds"); - - H3Index* result = calloc(childrenSz, sizeof(H3Index)); - int compactResult = H3_EXPORT(compact)(children, result, childrenSz); - t_assert(compactResult == 0, "compact pentagon succeeds"); - - int found = 0; - for (int i = 0; i < childrenSz; i++) { - if (result[i] != 0) { - found++; - t_assert(result[i] == pentagon, - "compacted to correct pentagon"); - } - } - t_assert(found == 1, "compacted to a single pentagon"); - - free(children); - free(result); - } -} diff --git a/src/apps/testapps/testCompactCells.c b/src/apps/testapps/testCompactCells.c new file mode 100644 index 000000000..bab73abc2 --- /dev/null +++ b/src/apps/testapps/testCompactCells.c @@ -0,0 +1,612 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "constants.h" +#include "h3Index.h" +#include "test.h" + +H3Index sunnyvale = 0x89283470c27ffff; + +H3Index uncompactable[] = {0x89283470803ffff, 0x8928347081bffff, + 0x8928347080bffff}; +H3Index uncompactableWithZero[] = {0x89283470803ffff, 0x8928347081bffff, 0, + 0x8928347080bffff}; + +SUITE(compactCells) { + TEST(roundtrip) { + int k = 9; + int64_t hexCount; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &hexCount)); + int expectedCompactCount = 73; + + // Generate a set of hexagons to compact + H3Index *sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(gridDisk)(sunnyvale, k, sunnyvaleExpanded)); + + H3Index *compressed = calloc(hexCount, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount)); + + int count = 0; + for (int64_t i = 0; i < hexCount; i++) { + if (compressed[i] != 0) { + count++; + } + } + t_assert(count == expectedCompactCount, "got expected compacted count"); + + int64_t countUncompact; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(compressed, count, 9, + &countUncompact)); + H3Index *decompressed = calloc(countUncompact, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(uncompactCells)(compressed, count, + decompressed, hexCount, 9)); + + int count2 = 0; + for (int i = 0; i < hexCount; i++) { + if (decompressed[i] != 0) { + count2++; + } + } + t_assert(count2 == hexCount, "got expected uncompacted count"); + + free(compressed); + free(decompressed); + free(sunnyvaleExpanded); + } + + TEST(res0children) { + H3Index parent; + setH3Index(&parent, 0, 0, 0); + + int64_t arrSize; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(parent, 1, &arrSize)); + + H3Index *children = calloc(arrSize, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(parent, 1, children)); + + H3Index *compressed = calloc(arrSize, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(compactCells(children, compressed, arrSize))); + t_assert(compressed[0] == parent, "got expected parent"); + for (int idx = 1; idx < arrSize; idx++) { + t_assert(compressed[idx] == 0, "expected only 1 cell"); + } + + free(compressed); + free(children); + } + + TEST(allRes1) { + const int64_t numRes0 = 122; + const int64_t numRes1 = 842; + H3Index *cells0 = calloc(numRes0, sizeof(H3Index)); + H3Index *cells1 = calloc(numRes1, sizeof(H3Index)); + H3Index *out = calloc(numRes1, sizeof(H3Index)); + + H3_EXPORT(getRes0Cells)(cells0); + t_assert(cells0[0] == 0x8001fffffffffff, + "got expected first res0 cell"); + + t_assertSuccess( + H3_EXPORT(uncompactCells)(cells0, numRes0, cells1, numRes1, 1)); + + int64_t numUncompacted = numRes1; + t_assertSuccess(H3_EXPORT(compactCells)(cells1, out, numUncompacted)); + + // Assert that the output of this function matches exactly the set of + // res 0 cells + size_t foundCount = 0; + for (size_t res1Idx = 0; res1Idx < numRes1; res1Idx++) { + H3Index compactedCell = out[res1Idx]; + + if (compactedCell) { + for (size_t res1DupIdx = 0; res1DupIdx < res1Idx; + res1DupIdx++) { + t_assert(out[res1DupIdx] != compactedCell, + "Duplicated output found"); + } + + bool found = false; + for (size_t res0Idx = 0; res0Idx < numRes0; res0Idx++) { + if (cells0[res0Idx] == compactedCell) { + found = true; + break; + } + } + t_assert(found, "Res 0 cell is found"); + foundCount++; + } + } + t_assert(foundCount == numRes0, "all res 0 cells found"); + + free(cells0); + free(cells1); + free(out); + } + + TEST(allRes1_variousRanges) { + const int64_t numRes0 = 122; + const int64_t numRes1 = 842; + H3Index *cells0 = calloc(numRes0, sizeof(H3Index)); + H3Index *cells1 = calloc(numRes1, sizeof(H3Index)); + H3Index *out = calloc(numRes1, sizeof(H3Index)); + + H3_EXPORT(getRes0Cells)(cells0); + t_assert(cells0[0] == 0x8001fffffffffff, + "got expected first res0 cell"); + + t_assertSuccess( + H3_EXPORT(uncompactCells)(cells0, numRes0, cells1, numRes1, 1)); + + // Test various (but not all possible combinations) ranges of res 1 + // cells + for (int64_t offset = 0; offset < numRes1; offset++) { + for (int64_t numUncompacted = numRes1 - offset; numUncompacted >= 0; + numUncompacted--) { + memset(out, 0, sizeof(H3Index) * numRes1); + + t_assertSuccess(H3_EXPORT(compactCells)(&cells1[offset], out, + numUncompacted)); + } + } + + free(cells0); + free(cells1); + free(out); + } + + TEST(res0) { + int hexCount = NUM_BASE_CELLS; + + H3Index *res0Hexes = calloc(hexCount, sizeof(H3Index)); + for (int i = 0; i < hexCount; i++) { + setH3Index(&res0Hexes[i], 0, i, 0); + } + H3Index *compressed = calloc(hexCount, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(compactCells)(res0Hexes, compressed, hexCount)); + + for (int i = 0; i < hexCount; i++) { + // At resolution 0, it will be an exact copy. + // The test is further optimizing that it will be in order (which + // isn't guaranteed.) + t_assert(compressed[i] == res0Hexes[i], + "got expected compressed result"); + } + + int64_t countUncompact; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(compressed, hexCount, 0, + &countUncompact)); + H3Index *decompressed = calloc(countUncompact, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(uncompactCells)(compressed, hexCount, + decompressed, hexCount, 0)); + + int count2 = 0; + for (int i = 0; i < hexCount; i++) { + if (decompressed[i] != 0) { + count2++; + } + } + t_assert(count2 == hexCount, "got expected uncompacted count"); + + free(res0Hexes); + free(compressed); + free(decompressed); + } + + TEST(uncompactable) { + int hexCount = 3; + int expectedCompactCount = 3; + + H3Index *compressed = calloc(hexCount, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(compactCells)(uncompactable, compressed, hexCount)); + + int count = 0; + for (int i = 0; i < hexCount; i++) { + if (compressed[i] != 0) { + count++; + } + } + t_assert(count == expectedCompactCount, "got expected compacted count"); + + int64_t countUncompact; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(compressed, count, 9, + &countUncompact)); + H3Index *decompressed = calloc(countUncompact, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(uncompactCells)(compressed, count, + decompressed, hexCount, 9)); + + int count2 = 0; + for (int i = 0; i < hexCount; i++) { + if (decompressed[i] != 0) { + count2++; + } + } + t_assert(count2 == hexCount, "got expected uncompacted count"); + + free(compressed); + free(decompressed); + } + + TEST(compactCells_duplicate) { + int numHex = 10; + H3Index someHexagons[10] = {0}; + for (int i = 0; i < numHex; i++) { + setH3Index(&someHexagons[i], 5, 0, 2); + } + H3Index compressed[10]; + + t_assert(H3_EXPORT(compactCells)(someHexagons, compressed, numHex) == + E_DUPLICATE_INPUT, + "compactCells fails on duplicate input"); + } + + TEST(compactCells_duplicateMinimum) { + // Test that the minimum number of duplicate hexagons causes failure + H3Index h3; + int res = 10; + // Arbitrary index + setH3Index(&h3, res, 0, 2); + + int64_t arrSize; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h3, res + 1, &arrSize)); + arrSize++; + H3Index *children = calloc(arrSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(cellToChildren)(h3, res + 1, children)); + // duplicate one index + children[arrSize - 1] = children[0]; + + H3Index *output = calloc(arrSize, sizeof(H3Index)); + + H3Error compactCellsResult = + H3_EXPORT(compactCells)(children, output, arrSize); + t_assert(compactCellsResult == E_DUPLICATE_INPUT, + "compactCells fails on duplicate input (single duplicate)"); + + free(output); + free(children); + } + + TEST(compactCells_duplicatePentagonLimit) { + // Test that the minimum number of duplicate hexagons causes failure + H3Index h3; + int res = 10; + // Arbitrary pentagon parent cell + setH3Index(&h3, res, 4, 0); + + int64_t arrSize; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h3, res + 1, &arrSize)); + arrSize++; + H3Index *children = calloc(arrSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(cellToChildren)(h3, res + 1, children)); + // duplicate one index + t_assertSuccess( + H3_EXPORT(cellToCenterChild)(h3, res + 1, &children[arrSize - 1])); + + H3Index *output = calloc(arrSize, sizeof(H3Index)); + + H3Error compactCellsResult = + H3_EXPORT(compactCells)(children, output, arrSize); + t_assert(compactCellsResult == E_DUPLICATE_INPUT, + "compactCells fails on duplicate input (pentagon parent)"); + + free(output); + free(children); + } + + TEST(compactCells_duplicateIgnored) { + // Test that duplicated cells are not rejected by compactCells. + // This is not necessarily desired - just asserting the + // existing behavior. + H3Index h3; + int res = 10; + // Arbitrary index + setH3Index(&h3, res, 0, 2); + + int64_t arrSize; + t_assertSuccess(H3_EXPORT(cellToChildrenSize)(h3, res + 1, &arrSize)); + H3Index *children = calloc(arrSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(cellToChildren)(h3, res + 1, children)); + // duplicate one index + children[arrSize - 1] = children[0]; + + H3Index *output = calloc(arrSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(compactCells)(children, output, arrSize)); + + free(output); + free(children); + } + + TEST(compactCells_empty) { + t_assert(H3_EXPORT(compactCells)(NULL, NULL, 0) == E_SUCCESS, + "compactCells succeeds on empty input"); + } + + TEST(compactCells_disparate) { + // Exercises a case where compaction needs to be tested but none is + // possible + const int numHex = 7; + H3Index disparate[] = {0, 0, 0, 0, 0, 0, 0}; + for (int i = 0; i < numHex; i++) { + setH3Index(&disparate[i], 1, i, CENTER_DIGIT); + } + H3Index output[] = {0, 0, 0, 0, 0, 0, 0}; + + t_assert( + H3_EXPORT(compactCells)(disparate, output, numHex) == E_SUCCESS, + "compactCells succeeds on disparate input"); + + // Assumes that `output` is an exact copy of `disparate`, including + // the ordering (which may not necessarily be the case) + for (int i = 0; i < numHex; i++) { + t_assert(disparate[i] == output[i], "output set equals input set"); + } + } + + TEST(compactCells_reservedBitsSet) { + const int numHex = 7; + H3Index bad[] = { + 0x0010000000010000, 0x0180c6c6c6c61616, 0x1616ffffffffffff, + 0xffff8affffffffff, 0xffffffffffffc6c6, 0xffffffffffffffc6, + 0xc6c6c6c6c66fffe0, + }; + H3Index output[] = {0, 0, 0, 0, 0, 0, 0}; + + t_assert(H3_EXPORT(compactCells)(bad, output, numHex) == E_CELL_INVALID, + "compactCells returns E_CELL_INVALID on bad input"); + } + + TEST(compactCells_parentError) { + const int numHex = 3; + H3Index bad[] = {0, 0, 0}; + H3Index output[] = {0, 0, 0}; + H3_SET_RESOLUTION(bad[0], 10); + H3_SET_RESOLUTION(bad[1], 5); + + t_assert( + H3_EXPORT(compactCells)(bad, output, numHex) == E_RES_MISMATCH, + "compactCells returns E_RES_MISMATCH on bad input (parent error)"); + } + + TEST(compactCells_parentError2) { + // This test primarily ensures memory is not leaked upon invalid input, + // and ensures coverage of a very particular error branch in + // compactCells. The particular error code is not important. + const int numHex = 43; + H3Index bad[] = {0x2010202020202020, + 0x2100000000, + 0x7, + 0x400000000, + 0x20000000, + 0x5000000000, + 0x100321, + 0x2100000000, + 0x7, + 0x400000000, + 0x20000000, + 0x2100000000, + 0x7, + 0x400000000, + 0x20000000, + 0x5000000000, + 0x100321, + 0x20000000, + 0x5000000000, + 0x100321, + 0x2100000000, + 0x7, + 0x400000000, + 0x5000000000, + 0x100321, + 0x2100000000, + 0x7, + 0x400000000, + 0x20000000, + 0x5000000000, + 0x100321, + 0x2100000000, + 0x7, + 0x400000000, + 0x20000000, + 0x5000000000, + 0x100321, + 0x20000000, + 0x5000000000, + 0x100321, + 0x2100000000, + 0x7, + 0x400000000}; + H3Index output[43] = {0}; + t_assertSuccess(H3_EXPORT(compactCells)(bad, output, numHex)); + } + + TEST(uncompactCells_wrongRes) { + int numHex = 3; + H3Index someHexagons[] = {0, 0, 0}; + for (int i = 0; i < numHex; i++) { + setH3Index(&someHexagons[i], 5, i, 0); + } + + int64_t sizeResult; + t_assert(H3_EXPORT(uncompactCellsSize)(someHexagons, numHex, 4, + &sizeResult) == E_RES_MISMATCH, + "uncompactCellsSize fails when given illogical resolutions"); + t_assert(H3_EXPORT(uncompactCellsSize)(someHexagons, numHex, -1, + &sizeResult) == E_RES_MISMATCH, + "uncompactCellsSize fails when given illegal resolutions"); + t_assert( + H3_EXPORT(uncompactCellsSize)(someHexagons, numHex, MAX_H3_RES + 1, + &sizeResult) == E_RES_MISMATCH, + "uncompactCellsSize fails when given resolutions beyond max"); + + H3Index uncompressed[] = {0, 0, 0}; + H3Error uncompactCellsResult = H3_EXPORT(uncompactCells)( + someHexagons, numHex, uncompressed, numHex, 0); + t_assert(uncompactCellsResult == E_RES_MISMATCH, + "uncompactCells fails when given illogical resolutions"); + uncompactCellsResult = H3_EXPORT(uncompactCells)( + someHexagons, numHex, uncompressed, numHex, 6); + t_assert(uncompactCellsResult == E_MEMORY_BOUNDS, + "uncompactCells fails when given too little buffer"); + uncompactCellsResult = H3_EXPORT(uncompactCells)( + someHexagons, numHex, uncompressed, numHex - 1, 5); + t_assert(uncompactCellsResult == E_MEMORY_BOUNDS, + "uncompactCells fails when given too little buffer (same " + "resolution)"); + + for (int i = 0; i < numHex; i++) { + setH3Index(&someHexagons[i], MAX_H3_RES, i, 0); + } + uncompactCellsResult = H3_EXPORT(uncompactCells)( + someHexagons, numHex, uncompressed, numHex * 7, MAX_H3_RES + 1); + t_assert(uncompactCellsResult == E_RES_MISMATCH, + "uncompactCells fails when given resolutions beyond max"); + } + + TEST(someHexagon) { + H3Index origin; + setH3Index(&origin, 1, 5, 0); + + int64_t childrenSz; + t_assertSuccess( + H3_EXPORT(uncompactCellsSize)(&origin, 1, 2, &childrenSz)); + H3Index *children = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(uncompactCells)(&origin, 1, children, childrenSz, 2)); + + H3Index *result = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(compactCells)(children, result, childrenSz)); + + int found = 0; + for (int i = 0; i < childrenSz; i++) { + if (result[i] != 0) { + found++; + t_assert(result[i] == origin, "compacted to correct origin"); + } + } + t_assert(found == 1, "compacted to a single hexagon"); + + free(children); + free(result); + } + + TEST(uncompactCells_empty) { + int64_t uncompactSz; + t_assertSuccess( + H3_EXPORT(uncompactCellsSize)(NULL, 0, 0, &uncompactSz)); + t_assert(uncompactSz == 0, "uncompactCellsSize accepts empty input"); + t_assert(H3_EXPORT(uncompactCells)(NULL, 0, NULL, 0, 0) == E_SUCCESS, + "uncompactCells accepts empty input"); + } + + TEST(uncompactCells_onlyZero) { + // uncompactCellsSize and uncompactCells both permit 0 indexes + // in the input array, and skip them. When only a zero is + // given, it's a no-op. + + H3Index origin = 0; + + int64_t childrenSz; + t_assertSuccess( + H3_EXPORT(uncompactCellsSize)(&origin, 1, 2, &childrenSz)); + H3Index *children = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(uncompactCells)(&origin, 1, children, childrenSz, 2)); + + free(children); + } + + TEST(uncompactCells_withZero) { + // uncompactCellsSize and uncompactSize both permit 0 indexes + // in the input array, and skip them. + + int64_t childrenSz; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(uncompactableWithZero, 4, + 10, &childrenSz)); + H3Index *children = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(uncompactCells)(uncompactableWithZero, 4, + children, childrenSz, 10)); + + int found = 0; + for (int i = 0; i < childrenSz; i++) { + if (children[i] != 0) { + found++; + } + } + t_assert(found == childrenSz, + "uncompacted with zero to expected number of hexagons"); + + free(children); + } + + TEST(pentagon) { + H3Index pentagon; + setH3Index(&pentagon, 1, 4, 0); + + int64_t childrenSz; + t_assertSuccess( + H3_EXPORT(uncompactCellsSize)(&pentagon, 1, 2, &childrenSz)); + H3Index *children = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(uncompactCells)(&pentagon, 1, children, childrenSz, 2)); + + H3Index *result = calloc(childrenSz, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(compactCells)(children, result, childrenSz)); + + int found = 0; + for (int i = 0; i < childrenSz; i++) { + if (result[i] != 0) { + found++; + t_assert(result[i] == pentagon, + "compacted to correct pentagon"); + } + } + t_assert(found == 1, "compacted to a single pentagon"); + + free(children); + free(result); + } + + TEST(large_uncompact_size_hexagon) { + H3Index cells[] = {0x806dfffffffffff}; // res 0 *hexagon* + int res = 15; + + int64_t expected = 4747561509943L; // 7^15 + int64_t out; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(cells, 1, res, &out)); + + t_assert(out == expected, "uncompactCells size needs 64 bit int"); + } + + TEST(large_uncompact_size_pentagon) { + H3Index cells[] = {0x8009fffffffffff}; // res 0 *pentagon* + int res = 15; + + int64_t expected = 3956301258286L; // 1 + 5*(7^15 - 1)/6 + int64_t out; + t_assertSuccess(H3_EXPORT(uncompactCellsSize)(cells, 1, res, &out)); + + t_assert(out == expected, "uncompactCells size needs 64 bit int"); + } +} diff --git a/src/apps/testapps/testCoordIj.c b/src/apps/testapps/testCoordIjInternal.c similarity index 92% rename from src/apps/testapps/testCoordIj.c rename to src/apps/testapps/testCoordIjInternal.c index c4db4ac42..7dc4c89d0 100644 --- a/src/apps/testapps/testCoordIj.c +++ b/src/apps/testapps/testCoordIjInternal.c @@ -16,23 +16,23 @@ /** @file * @brief tests IJ grid functions and IJK distance functions. * - * usage: `testCoordIj` + * usage: `testCoordIjInternal` */ #include #include #include + #include "algos.h" #include "baseCells.h" #include "constants.h" #include "h3Index.h" #include "h3api.h" #include "localij.h" -#include "stackAlloc.h" #include "test.h" #include "utility.h" -SUITE(coordIj) { +SUITE(coordIjInternal) { TEST(ijkToIj_zero) { CoordIJK ijk = {0}; CoordIJ ij = {0}; @@ -41,7 +41,7 @@ SUITE(coordIj) { t_assert(ij.i == 0, "ij.i zero"); t_assert(ij.j == 0, "ij.j zero"); - ijToIjk(&ij, &ijk); + t_assertSuccess(ijToIjk(&ij, &ijk)); t_assert(ijk.i == 0, "ijk.i zero"); t_assert(ijk.j == 0, "ijk.j zero"); t_assert(ijk.k == 0, "ijk.k zero"); @@ -56,7 +56,7 @@ SUITE(coordIj) { ijkToIj(&ijk, &ij); CoordIJK recovered = {0}; - ijToIjk(&ij, &recovered); + t_assertSuccess(ijToIjk(&ij, &recovered)); t_assert(_ijkMatches(&ijk, &recovered), "got same ijk coordinates back"); diff --git a/src/apps/testapps/testCoordIjkInternal.c b/src/apps/testapps/testCoordIjkInternal.c new file mode 100644 index 000000000..64d2e59db --- /dev/null +++ b/src/apps/testapps/testCoordIjkInternal.c @@ -0,0 +1,95 @@ +/* + * Copyright 2019 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests IJK grid functions + * + * usage: `testCoordIjkInternal` + */ + +#include "coordijk.h" +#include "test.h" + +SUITE(coordIjkInternal) { + TEST(_unitIjkToDigit) { + CoordIJK zero = {0}; + CoordIJK i = {1, 0, 0}; + CoordIJK outOfRange = {2, 0, 0}; + CoordIJK unnormalizedZero = {2, 2, 2}; + + t_assert(_unitIjkToDigit(&zero) == CENTER_DIGIT, "Unit IJK to zero"); + t_assert(_unitIjkToDigit(&i) == I_AXES_DIGIT, "Unit IJK to I axis"); + t_assert(_unitIjkToDigit(&outOfRange) == INVALID_DIGIT, + "Unit IJK out of range"); + t_assert(_unitIjkToDigit(&unnormalizedZero) == CENTER_DIGIT, + "Unnormalized unit IJK to zero"); + } + + TEST(_neighbor) { + CoordIJK ijk = {0}; + + CoordIJK zero = {0}; + CoordIJK i = {1, 0, 0}; + + _neighbor(&ijk, CENTER_DIGIT); + t_assert(_ijkMatches(&ijk, &zero), "Center neighbor is self"); + _neighbor(&ijk, I_AXES_DIGIT); + t_assert(_ijkMatches(&ijk, &i), "I neighbor as expected"); + _neighbor(&ijk, INVALID_DIGIT); + t_assert(_ijkMatches(&ijk, &i), "Invalid neighbor is self"); + } + + TEST(_upAp7Checked) { + CoordIJK ijk; + + _setIJK(&ijk, 0, 0, 0); + t_assertSuccess(_upAp7Checked(&ijk)); + _setIJK(&ijk, INT32_MAX, 0, 0); + t_assert(_upAp7Checked(&ijk) == E_FAILED, "i + i overflows"); + _setIJK(&ijk, INT32_MAX / 2, 0, 0); + t_assert(_upAp7Checked(&ijk) == E_FAILED, "i * 3 overflows"); + _setIJK(&ijk, 0, INT32_MAX, 0); + t_assert(_upAp7Checked(&ijk) == E_FAILED, "j + j overflows"); + // This input should be invalid because j < 0 + _setIJK(&ijk, INT32_MAX / 3, -2, 0); + t_assert(_upAp7Checked(&ijk) == E_FAILED, "(i * 3) - j overflows"); + _setIJK(&ijk, INT32_MAX / 3, INT32_MAX / 2, 0); + t_assert(_upAp7Checked(&ijk) == E_FAILED, "i + (j * 2) overflows"); + // This input should be invalid because j < 0 + _setIJK(&ijk, -1, 0, 0); + t_assert(_upAp7Checked(&ijk) == E_SUCCESS, "i < 0 succeeds"); + } + + TEST(_upAp7rChecked) { + CoordIJK ijk; + + _setIJK(&ijk, 0, 0, 0); + t_assertSuccess(_upAp7rChecked(&ijk)); + _setIJK(&ijk, INT32_MAX, 0, 0); + t_assert(_upAp7rChecked(&ijk) == E_FAILED, "i + i overflows"); + _setIJK(&ijk, 0, INT32_MAX, 0); + t_assert(_upAp7rChecked(&ijk) == E_FAILED, "j + j overflows"); + _setIJK(&ijk, 0, INT32_MAX / 2, 0); + t_assert(_upAp7rChecked(&ijk) == E_FAILED, "3 * j overflows"); + _setIJK(&ijk, INT32_MAX / 2, INT32_MAX / 3, 0); + t_assert(_upAp7rChecked(&ijk) == E_FAILED, "(i * 2) + j overflows"); + // This input should be invalid because i < 0 + _setIJK(&ijk, -2, INT32_MAX / 3, 0); + t_assert(_upAp7rChecked(&ijk) == E_FAILED, "(j * 3) - 1 overflows"); + // This input should be invalid because j < 0 + _setIJK(&ijk, -1, 0, 0); + t_assert(_upAp7rChecked(&ijk) == E_SUCCESS, "i < 0 succeeds"); + } +} diff --git a/src/apps/testapps/testDescribeH3Error.c b/src/apps/testapps/testDescribeH3Error.c new file mode 100644 index 000000000..d275c6abd --- /dev/null +++ b/src/apps/testapps/testDescribeH3Error.c @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 function `describeH3Error` + * + * usage: `testDescribeH3Error` + * + * This program confirms that the `describeH3Error` function will provide + * a string output describing the error code (either providing a description + * of the error, or telling you that the error code is itself in error) + */ + +#include + +#include "h3Index.h" +#include "test.h" + +SUITE(describeH3Error) { + TEST(noError) { + H3Error err = E_SUCCESS; + t_assert(strcmp(H3_EXPORT(describeH3Error)(err), "Success") == 0, + "got expected success message"); + } + + TEST(invalidCell) { + H3Error err = E_CELL_INVALID; + t_assert(strcmp(H3_EXPORT(describeH3Error)(err), + "Cell argument was not valid") == 0, + "got expected error message"); + } + + TEST(invalidH3Error) { + H3Error err = 9001; // Will probably never hit this + t_assert( + strcmp(H3_EXPORT(describeH3Error)(err), "Invalid error code") == 0, + "got expected failure message"); + } +} diff --git a/src/apps/testapps/testDirectedEdge.c b/src/apps/testapps/testDirectedEdge.c new file mode 100644 index 000000000..89fcfc418 --- /dev/null +++ b/src/apps/testapps/testDirectedEdge.c @@ -0,0 +1,471 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file testDirectedEdge.c + * @brief Tests functions for manipulating directed edge H3Indexes + * + * usage: `testDirectedEdge` + */ + +#include + +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "test.h" +#include "utility.h" + +// Fixtures +static LatLng sfGeo = {0.659966917655, -2.1364398519396}; + +SUITE(directedEdge) { + TEST(areNeighborCells) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index ring[7] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 1, ring)); + + int isNeighbor; + t_assertSuccess(H3_EXPORT(areNeighborCells)(sf, sf, &isNeighbor)); + t_assert(!isNeighbor, "an index does not neighbor itself"); + + int neighbors = 0; + int64_t neighborsSize; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(1, &neighborsSize)); + for (int64_t i = 0; i < neighborsSize; i++) { + if (ring[i] != 0) { + t_assertSuccess( + H3_EXPORT(areNeighborCells)(sf, ring[i], &isNeighbor)); + if (isNeighbor) { + neighbors++; + } + } + } + t_assert(neighbors == 6, + "got the expected number of neighbors from a k-ring of 1"); + + H3Index largerRing[19] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 2, largerRing)); + + neighbors = 0; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(2, &neighborsSize)); + for (int64_t i = 0; i < neighborsSize; i++) { + if (largerRing[i] != 0) { + t_assertSuccess(H3_EXPORT(areNeighborCells)(sf, largerRing[i], + &isNeighbor)); + if (isNeighbor) { + neighbors++; + } + } + } + t_assert(neighbors == 0, + "got no neighbors, as expected, from a k-ring of 2"); + + H3Index sfBroken = sf; + H3_SET_MODE(sfBroken, H3_DIRECTEDEDGE_MODE); + t_assert(H3_EXPORT(areNeighborCells)(sf, sfBroken, &isNeighbor) == + E_CELL_INVALID, + "broken H3Indexes can't be neighbors"); + t_assert(H3_EXPORT(areNeighborCells)(sfBroken, sf, &isNeighbor) == + E_CELL_INVALID, + "broken H3Indexes can't be neighbors (reversed)"); + + H3Index sfBigger; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 7, &sfBigger)); + t_assert(H3_EXPORT(areNeighborCells)(sf, sfBigger, &isNeighbor) == + E_RES_MISMATCH, + "hexagons of different resolution can't be neighbors"); + + t_assertSuccess( + H3_EXPORT(areNeighborCells)(ring[2], ring[1], &isNeighbor)); + t_assert(isNeighbor, "hexagons in a ring are neighbors"); + } + + TEST(areNeighborCells_invalid) { + H3Index origin; + setH3Index(&origin, 5, 0, CENTER_DIGIT); + H3Index dest = origin; + H3_SET_INDEX_DIGIT(origin, 5, INVALID_DIGIT); + H3_SET_INDEX_DIGIT(dest, 5, JK_AXES_DIGIT); + int out; + + t_assert( + H3_EXPORT(areNeighborCells)(origin, dest, &out) == E_CELL_INVALID, + "Invalid index digit origin is rejected"); + + setH3Index(&origin, 5, 4, CENTER_DIGIT); + dest = origin; + H3_SET_INDEX_DIGIT(origin, 5, K_AXES_DIGIT); + H3_SET_INDEX_DIGIT(dest, 5, IK_AXES_DIGIT); + t_assert( + H3_EXPORT(areNeighborCells)(origin, dest, &out) == E_CELL_INVALID, + "Invalid k subsequence origin is rejected"); + H3_SET_INDEX_DIGIT(origin, 5, IK_AXES_DIGIT); + H3_SET_INDEX_DIGIT(dest, 5, K_AXES_DIGIT); + t_assert( + H3_EXPORT(areNeighborCells)(origin, dest, &out) == E_CELL_INVALID, + "Invalid k subsequence destination is rejected"); + // Can't test origin and dest both having K_AXES_DIGIT as this will be + // rejected as the same cell. + } + + TEST(cellsToDirectedEdgeAndFriends) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index ring[7] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 1, ring)); + H3Index sf2 = ring[0]; + + H3Index edge; + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)(sf, sf2, &edge)); + H3Index edgeOrigin; + t_assertSuccess(H3_EXPORT(getDirectedEdgeOrigin)(edge, &edgeOrigin)); + t_assert(sf == edgeOrigin, "can retrieve the origin from the edge"); + H3Index edgeDestination; + t_assertSuccess( + H3_EXPORT(getDirectedEdgeDestination)(edge, &edgeDestination)); + t_assert(sf2 == edgeDestination, + "can retrieve the destination from the edge"); + + H3Index originDestination[2] = {0}; + t_assertSuccess( + H3_EXPORT(directedEdgeToCells)(edge, originDestination)); + t_assert(originDestination[0] == sf, + "got the origin first in the pair request"); + t_assert(originDestination[1] == sf2, + "got the destination last in the pair request"); + + t_assert(H3_EXPORT(directedEdgeToCells)(0, originDestination) == + E_DIR_EDGE_INVALID, + "directedEdgeToCells fails for invalid edges"); + H3Index invalidEdge; + setH3Index(&invalidEdge, 1, 4, 0); + H3_SET_RESERVED_BITS(invalidEdge, INVALID_DIGIT); + H3_SET_MODE(invalidEdge, H3_DIRECTEDEDGE_MODE); + t_assert(H3_EXPORT(directedEdgeToCells)(invalidEdge, + originDestination) != E_SUCCESS, + "directedEdgeToCells fails for invalid edges"); + + H3Index largerRing[19] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 2, largerRing)); + H3Index sf3 = largerRing[0]; + + H3Index notEdge; + t_assert(H3_EXPORT(cellsToDirectedEdge)(sf, sf3, ¬Edge) == + E_NOT_NEIGHBORS, + "Non-neighbors can't have edges"); + } + + TEST(getDirectedEdgeOriginBadInput) { + H3Index hexagon = 0x891ea6d6533ffff; + + H3Index out; + t_assert(H3_EXPORT(getDirectedEdgeOrigin)(hexagon, &out) == + E_DIR_EDGE_INVALID, + "getting the origin from a hexagon index returns error"); + t_assert( + H3_EXPORT(getDirectedEdgeOrigin)(0, &out) == E_DIR_EDGE_INVALID, + "getting the origin from a null index returns error"); + } + + TEST(getDirectedEdgeOriginBadInput) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index ring[7] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 1, ring)); + H3Index sf2 = ring[0]; + + H3Index edge; + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)(sf, sf2, &edge)); + H3_SET_RESERVED_BITS(edge, INVALID_DIGIT); + H3Index out; + t_assert(H3_EXPORT(getDirectedEdgeDestination)(edge, &out) == E_FAILED, + "Invalid directed edge fails"); + } + + TEST(getDirectedEdgeDestination) { + H3Index hexagon = 0x891ea6d6533ffff; + + H3Index out; + t_assert(H3_EXPORT(getDirectedEdgeDestination)(hexagon, &out) == + E_DIR_EDGE_INVALID, + "getting the destination from a hexagon index returns 0"); + t_assert(H3_EXPORT(getDirectedEdgeDestination)(0, &out) == + E_DIR_EDGE_INVALID, + "getting the destination from a null index returns 0"); + } + + TEST(cellsToDirectedEdgeFromPentagon) { + H3Index pentagons[NUM_PENTAGONS] = {0}; + H3Index ring[7] = {0}; + H3Index pentagon; + H3Index edge; + + for (int res = 0; res <= MAX_H3_RES; res++) { + t_assertSuccess(H3_EXPORT(getPentagons)(res, pentagons)); + for (int p = 0; p < NUM_PENTAGONS; p++) { + pentagon = pentagons[p]; + t_assertSuccess(H3_EXPORT(gridDisk)(pentagon, 1, ring)); + + for (int i = 0; i < 7; i++) { + H3Index neighbor = ring[i]; + if (neighbor == pentagon || neighbor == H3_NULL) continue; + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)( + pentagon, neighbor, &edge)); + t_assert(H3_EXPORT(isValidDirectedEdge)(edge), + "pentagon-to-neighbor is a valid edge"); + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)( + neighbor, pentagon, &edge)); + t_assert(H3_EXPORT(isValidDirectedEdge)(edge), + "neighbor-to-pentagon is a valid edge"); + } + } + } + } + + TEST(isValidDirectedEdge) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index ring[7] = {0}; + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sf, 1, ring)); + H3Index sf2 = ring[0]; + + H3Index edge; + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)(sf, sf2, &edge)); + t_assert(H3_EXPORT(isValidDirectedEdge)(edge) == 1, + "edges validate correctly"); + t_assert(H3_EXPORT(isValidDirectedEdge)(sf) == 0, + "hexagons do not validate"); + + H3Index undirectedEdge = edge; + H3_SET_MODE(undirectedEdge, H3_EDGE_MODE); + t_assert(H3_EXPORT(isValidDirectedEdge)(undirectedEdge) == 0, + "undirected edges do not validate"); + + H3Index hexagonWithReserved = sf; + H3_SET_RESERVED_BITS(hexagonWithReserved, 1); + t_assert(H3_EXPORT(isValidDirectedEdge)(hexagonWithReserved) == 0, + "hexagons with reserved bits do not validate"); + + H3Index fakeEdge = sf; + H3_SET_MODE(fakeEdge, H3_DIRECTEDEDGE_MODE); + t_assert(H3_EXPORT(isValidDirectedEdge)(fakeEdge) == 0, + "edges without an edge specified don't work"); + H3Index invalidEdge = sf; + H3_SET_MODE(invalidEdge, H3_DIRECTEDEDGE_MODE); + H3_SET_RESERVED_BITS(invalidEdge, INVALID_DIGIT); + t_assert(H3_EXPORT(isValidDirectedEdge)(invalidEdge) == 0, + "edges with an invalid edge specified don't work"); + + H3Index pentagon = 0x821c07fffffffff; + H3Index goodPentagonalEdge = pentagon; + H3_SET_MODE(goodPentagonalEdge, H3_DIRECTEDEDGE_MODE); + H3_SET_RESERVED_BITS(goodPentagonalEdge, 2); + t_assert(H3_EXPORT(isValidDirectedEdge)(goodPentagonalEdge) == 1, + "pentagonal edge validates"); + + H3Index badPentagonalEdge = goodPentagonalEdge; + H3_SET_RESERVED_BITS(badPentagonalEdge, 1); + t_assert(H3_EXPORT(isValidDirectedEdge)(badPentagonalEdge) == 0, + "missing pentagonal edge does not validate"); + + H3Index highBitEdge = edge; + H3_SET_HIGH_BIT(highBitEdge, 1); + t_assert(H3_EXPORT(isValidDirectedEdge)(highBitEdge) == 0, + "high bit set edge does not validate"); + } + + TEST(originToDirectedEdges) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index edges[6] = {0}; + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(sf, edges)); + + for (int i = 0; i < 6; i++) { + t_assert(H3_EXPORT(isValidDirectedEdge)(edges[i]) == 1, + "edge is an edge"); + H3Index origin; + t_assertSuccess( + H3_EXPORT(getDirectedEdgeOrigin)(edges[i], &origin)); + t_assert(sf == origin, "origin is correct"); + H3Index destination; + t_assertSuccess( + H3_EXPORT(getDirectedEdgeDestination)(edges[i], &destination)); + t_assert(sf != destination, "destination is not origin"); + } + } + + TEST(getH3DirectedEdgesFromPentagon) { + H3Index pentagon = 0x821c07fffffffff; + H3Index edges[6] = {0}; + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(pentagon, edges)); + + int missingEdgeCount = 0; + for (int i = 0; i < 6; i++) { + if (edges[i] == 0) { + missingEdgeCount++; + } else { + t_assert(H3_EXPORT(isValidDirectedEdge)(edges[i]) == 1, + "edge is an edge"); + H3Index origin; + t_assertSuccess( + H3_EXPORT(getDirectedEdgeOrigin)(edges[i], &origin)); + t_assert(pentagon == origin, "origin is correct"); + H3Index destination; + t_assertSuccess(H3_EXPORT(getDirectedEdgeDestination)( + edges[i], &destination)); + t_assert(pentagon != destination, "destination is not origin"); + } + } + t_assert(missingEdgeCount == 1, + "Only one edge was deleted for the pentagon"); + } + + TEST(directedEdgeToBoundary) { + H3Index sf; + CellBoundary boundary; + CellBoundary edgeBoundary; + H3Index edges[6] = {0}; + + const int expectedVertices[][2] = {{3, 4}, {1, 2}, {2, 3}, + {5, 0}, {4, 5}, {0, 1}}; + + for (int res = 0; res <= MAX_H3_RES; res++) { + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, res, &sf)); + t_assertSuccess(H3_EXPORT(cellToBoundary)(sf, &boundary)); + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(sf, edges)); + + for (int i = 0; i < 6; i++) { + t_assertSuccess( + H3_EXPORT(directedEdgeToBoundary)(edges[i], &edgeBoundary)); + t_assert(edgeBoundary.numVerts == 2, + "Got the expected number of vertices back"); + for (int j = 0; j < edgeBoundary.numVerts; j++) { + t_assert( + geoAlmostEqual(&edgeBoundary.verts[j], + &boundary.verts[expectedVertices[i][j]]), + "Got expected vertex"); + } + } + } + } + + TEST(directedEdgeToBoundaryPentagonClassIII) { + H3Index pentagon; + CellBoundary boundary; + CellBoundary edgeBoundary; + H3Index edges[6] = {0}; + + const int expectedVertices[][3] = {{-1, -1, -1}, {2, 3, 4}, {4, 5, 6}, + {8, 9, 0}, {6, 7, 8}, {0, 1, 2}}; + + for (int res = 1; res <= MAX_H3_RES; res += 2) { + setH3Index(&pentagon, res, 24, 0); + t_assertSuccess(H3_EXPORT(cellToBoundary)(pentagon, &boundary)); + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(pentagon, edges)); + + int missingEdgeCount = 0; + for (int i = 0; i < 6; i++) { + if (edges[i] == 0) { + missingEdgeCount++; + } else { + t_assertSuccess(H3_EXPORT(directedEdgeToBoundary)( + edges[i], &edgeBoundary)); + t_assert(edgeBoundary.numVerts == 3, + "Got the expected number of vertices back for a " + "Class III " + "pentagon"); + for (int j = 0; j < edgeBoundary.numVerts; j++) { + t_assert(geoAlmostEqual( + &edgeBoundary.verts[j], + &boundary.verts[expectedVertices[i][j]]), + "Got expected vertex"); + } + } + } + t_assert(missingEdgeCount == 1, + "Only one edge was deleted for the pentagon"); + } + } + + TEST(directedEdgeToBoundaryPentagonClassII) { + H3Index pentagon; + CellBoundary boundary; + CellBoundary edgeBoundary; + H3Index edges[6] = {0}; + + const int expectedVertices[][3] = {{-1, -1}, {1, 2}, {2, 3}, + {4, 0}, {3, 4}, {0, 1}}; + + for (int res = 0; res <= MAX_H3_RES; res += 2) { + setH3Index(&pentagon, res, 24, 0); + t_assertSuccess(H3_EXPORT(cellToBoundary)(pentagon, &boundary)); + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(pentagon, edges)); + + int missingEdgeCount = 0; + for (int i = 0; i < 6; i++) { + if (edges[i] == 0) { + missingEdgeCount++; + } else { + t_assertSuccess(H3_EXPORT(directedEdgeToBoundary)( + edges[i], &edgeBoundary)); + t_assert(edgeBoundary.numVerts == 2, + "Got the expected number of vertices back for a " + "Class II " + "pentagon"); + for (int j = 0; j < edgeBoundary.numVerts; j++) { + t_assert(geoAlmostEqual( + &edgeBoundary.verts[j], + &boundary.verts[expectedVertices[i][j]]), + "Got expected vertex"); + } + } + } + t_assert(missingEdgeCount == 1, + "Only one edge was deleted for the pentagon"); + } + } + + TEST(directedEdgeToBoundary_invalid) { + H3Index sf; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sfGeo, 9, &sf)); + H3Index invalidEdge = sf; + H3_SET_MODE(invalidEdge, H3_DIRECTEDEDGE_MODE); + CellBoundary cb; + t_assert(H3_EXPORT(directedEdgeToBoundary)(invalidEdge, &cb) == + E_DIR_EDGE_INVALID, + "directedEdgeToBoundary fails on invalid edge direction"); + + H3Index invalidEdge2 = sf; + H3_SET_RESERVED_BITS(invalidEdge2, 1); + H3_SET_BASE_CELL(invalidEdge2, NUM_BASE_CELLS + 1); + H3_SET_MODE(invalidEdge2, H3_DIRECTEDEDGE_MODE); + t_assert( + H3_EXPORT(directedEdgeToBoundary)(invalidEdge2, &cb) != E_SUCCESS, + "directedEdgeToBoundary fails on invalid edge indexing digit"); + } + + TEST(edgeLength_invalid) { + double length; + // Test that invalid inputs do not cause crashes. + t_assert(H3_EXPORT(edgeLengthRads)(0, &length) == E_DIR_EDGE_INVALID, + "Invalid edge has zero length"); + LatLng zero = {0, 0}; + H3Index h3; + t_assertSuccess(H3_EXPORT(latLngToCell)(&zero, 0, &h3)); + t_assert(H3_EXPORT(edgeLengthRads)(h3, &length) == E_DIR_EDGE_INVALID, + "Non-edge (cell) has zero edge length"); + } +} diff --git a/src/apps/testapps/testDirectedEdgeExhaustive.c b/src/apps/testapps/testDirectedEdgeExhaustive.c new file mode 100644 index 000000000..784cbc3bb --- /dev/null +++ b/src/apps/testapps/testDirectedEdgeExhaustive.c @@ -0,0 +1,116 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 directed edge functions using tests over a large number + * of indexes. + * + * usage: `testDirectedEdgeExhaustive` + */ + +#include +#include +#include + +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "test.h" +#include "utility.h" + +static void directedEdge_correctness_assertions(H3Index h3) { + H3Index edges[6] = {H3_NULL}; + int pentagon = H3_EXPORT(isPentagon)(h3); + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(h3, edges)); + + for (int i = 0; i < 6; i++) { + if (pentagon && i == 0) { + t_assert(edges[i] == H3_NULL, "last pentagon edge is empty"); + continue; + } + t_assert(H3_EXPORT(isValidDirectedEdge)(edges[i]) == 1, + "edge is an edge"); + H3Index origin; + t_assertSuccess(H3_EXPORT(getDirectedEdgeOrigin)(edges[i], &origin)); + t_assert(origin == h3, "origin matches input origin"); + + H3Index destination; + t_assertSuccess( + H3_EXPORT(getDirectedEdgeDestination)(edges[i], &destination)); + int isNeighbor; + t_assertSuccess( + H3_EXPORT(areNeighborCells)(h3, destination, &isNeighbor)); + t_assert(isNeighbor, "destination is a neighbor"); + } +} + +static void directedEdge_boundary_assertions(H3Index h3) { + H3Index edges[6] = {H3_NULL}; + t_assertSuccess(H3_EXPORT(originToDirectedEdges)(h3, edges)); + H3Index destination; + H3Index revEdge; + CellBoundary edgeBoundary; + CellBoundary revEdgeBoundary; + + for (int i = 0; i < 6; i++) { + if (edges[i] == H3_NULL) continue; + t_assertSuccess( + H3_EXPORT(directedEdgeToBoundary)(edges[i], &edgeBoundary)); + t_assertSuccess( + H3_EXPORT(getDirectedEdgeDestination)(edges[i], &destination)); + t_assertSuccess( + H3_EXPORT(cellsToDirectedEdge)(destination, h3, &revEdge)); + t_assertSuccess( + H3_EXPORT(directedEdgeToBoundary)(revEdge, &revEdgeBoundary)); + + t_assert(edgeBoundary.numVerts == revEdgeBoundary.numVerts, + "numVerts is equal for edge and reverse"); + + for (int j = 0; j < edgeBoundary.numVerts; j++) { + int almostEqual = geoAlmostEqualThreshold( + &edgeBoundary.verts[j], + &revEdgeBoundary.verts[revEdgeBoundary.numVerts - 1 - j], + 0.000001); + t_assert(almostEqual, "Got expected vertex"); + } + } +} + +SUITE(directedEdge) { + TEST(directedEdge_correctness) { + iterateAllIndexesAtRes(0, directedEdge_correctness_assertions); + iterateAllIndexesAtRes(1, directedEdge_correctness_assertions); + iterateAllIndexesAtRes(2, directedEdge_correctness_assertions); + iterateAllIndexesAtRes(3, directedEdge_correctness_assertions); + iterateAllIndexesAtRes(4, directedEdge_correctness_assertions); + } + + TEST(directedEdge_boundary) { + iterateAllIndexesAtRes(0, directedEdge_boundary_assertions); + iterateAllIndexesAtRes(1, directedEdge_boundary_assertions); + iterateAllIndexesAtRes(2, directedEdge_boundary_assertions); + iterateAllIndexesAtRes(3, directedEdge_boundary_assertions); + iterateAllIndexesAtRes(4, directedEdge_boundary_assertions); + // Res 5: normal base cell + iterateBaseCellIndexesAtRes(5, directedEdge_boundary_assertions, 0); + // Res 5: pentagon base cell + iterateBaseCellIndexesAtRes(5, directedEdge_boundary_assertions, 14); + // Res 5: polar pentagon base cell + iterateBaseCellIndexesAtRes(5, directedEdge_boundary_assertions, 117); + // Res 6: Test one pentagon just to check for new edge cases + iterateBaseCellIndexesAtRes(6, directedEdge_boundary_assertions, 14); + } +} diff --git a/src/apps/testapps/testGetIcosahedronFaces.c b/src/apps/testapps/testGetIcosahedronFaces.c new file mode 100644 index 000000000..73db7c0c6 --- /dev/null +++ b/src/apps/testapps/testGetIcosahedronFaces.c @@ -0,0 +1,156 @@ +/* + * Copyright 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests the getIcosahedronFaces function + */ + +#include +#include + +#include "baseCells.h" +#include "h3Index.h" +#include "h3api.h" +#include "test.h" +#include "utility.h" + +static int countFaces(H3Index h3, int expectedMax) { + int sz; + t_assertSuccess(H3_EXPORT(maxFaceCount)(h3, &sz)); + t_assert(sz == expectedMax, "got expected max face count"); + int *faces = calloc(sz, sizeof(int)); + + t_assertSuccess(H3_EXPORT(getIcosahedronFaces)(h3, faces)); + + int validCount = 0; + for (int i = 0; i < sz; i++) { + if (faces[i] >= 0 && faces[i] <= 19) validCount++; + } + + free(faces); + return validCount; +} + +static void assertSingleHexFace(H3Index h3) { + int validCount = countFaces(h3, 2); + t_assert(validCount == 1, "got a single valid face"); +} + +static void assertMultipleHexFaces(H3Index h3) { + int validCount = countFaces(h3, 2); + t_assert(validCount == 2, "got multiple valid faces for a hexagon"); +} + +static void assertPentagonFaces(H3Index h3) { + t_assert(H3_EXPORT(isPentagon)(h3), "got a pentagon"); + int validCount = countFaces(h3, 5); + t_assert(validCount == 5, "got 5 valid faces for a pentagon"); +} + +SUITE(getIcosahedronFaces) { + TEST(singleFaceHexes) { + // base cell 16 is at the center of an icosahedron face, + // so all children should have the same face + iterateBaseCellIndexesAtRes(2, assertSingleHexFace, 16); + iterateBaseCellIndexesAtRes(3, assertSingleHexFace, 16); + } + + TEST(hexagonWithEdgeVertices) { + // Class II pentagon neighbor - one face, two adjacent vertices on edge + H3Index h3 = 0x821c37fffffffff; + assertSingleHexFace(h3); + } + + TEST(hexagonWithDistortion) { + // Class III pentagon neighbor, distortion across faces + H3Index h3 = 0x831c06fffffffff; + assertMultipleHexFaces(h3); + } + + TEST(hexagonCrossingFaces) { + // Class II hex with two vertices on edge + H3Index h3 = 0x821ce7fffffffff; + assertMultipleHexFaces(h3); + } + + TEST(classIIIPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 1, 4, 0); + assertPentagonFaces(pentagon); + } + + TEST(classIIPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 2, 4, 0); + assertPentagonFaces(pentagon); + } + + TEST(res15Pentagon) { + H3Index pentagon; + setH3Index(&pentagon, 15, 4, 0); + assertPentagonFaces(pentagon); + } + + TEST(baseCellHexagons) { + int singleCount = 0; + int multipleCount = 0; + for (int i = 0; i < NUM_BASE_CELLS; i++) { + if (!_isBaseCellPentagon(i)) { + // Make the base cell index + H3Index baseCell; + setH3Index(&baseCell, 0, i, 0); + int validCount = countFaces(baseCell, 2); + t_assert(validCount > 0, "got at least one face"); + if (validCount == 1) + singleCount++; + else + multipleCount++; + } + } + t_assert(singleCount == 4 * 20, + "got single face for 4 aligned hex base cells per face"); + t_assert(multipleCount == 1.5 * 20, + "got multiple faces for non-aligned hex base cells"); + } + + TEST(baseCellPentagons) { + for (int i = 0; i < NUM_BASE_CELLS; i++) { + if (_isBaseCellPentagon(i)) { + // Make the base cell index + H3Index baseCell; + setH3Index(&baseCell, 0, i, 0); + assertPentagonFaces(baseCell); + } + } + } + + TEST(invalid) { + H3Index invalid = 0xFFFFFFFFFFFFFFFF; + int out; + t_assert( + H3_EXPORT(getIcosahedronFaces)(invalid, &out) == E_CELL_INVALID, + "Invalid cell"); + } + + TEST(invalid2) { + H3Index invalid = 0x71330073003f004e; + int sz; + t_assertSuccess(H3_EXPORT(maxFaceCount)(invalid, &sz)); + int *faces = calloc(sz, sizeof(int)); + t_assert(H3_EXPORT(getIcosahedronFaces)(invalid, faces) == E_FAILED, + "Invalid cell"); + free(faces); + } +} diff --git a/src/apps/testapps/testKRing.c b/src/apps/testapps/testGridDisk.c similarity index 70% rename from src/apps/testapps/testKRing.c rename to src/apps/testapps/testGridDisk.c index df410b8ab..015a4d2dd 100644 --- a/src/apps/testapps/testKRing.c +++ b/src/apps/testapps/testGridDisk.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,39 +14,41 @@ * limitations under the License. */ /** @file - * @brief tests H3 function `kRing` and `kRingDistances` + * @brief tests H3 function `gridDisk` and `gridDiskDistances` * - * usage: `testKRing` + * usage: `testGridDisk` */ -#include #include + #include "algos.h" #include "baseCells.h" #include "h3Index.h" #include "test.h" #include "utility.h" -static void kRing_equals_kRingInternal_assertions(H3Index h3) { +static void gridDisk_equals_gridDiskDistancesSafe_assertions(H3Index h3) { for (int k = 0; k < 3; k++) { - int kSz = H3_EXPORT(maxKringSize)(k); + int64_t kSz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &kSz)); - STACK_ARRAY_CALLOC(H3Index, neighbors, kSz); - STACK_ARRAY_CALLOC(int, distances, kSz); - H3_EXPORT(kRingDistances) - (h3, k, neighbors, distances); + H3Index *neighbors = calloc(kSz, sizeof(H3Index)); + int *distances = calloc(kSz, sizeof(int)); + t_assertSuccess( + H3_EXPORT(gridDiskDistances)(h3, k, neighbors, distances)); - STACK_ARRAY_CALLOC(H3Index, internalNeighbors, kSz); - STACK_ARRAY_CALLOC(int, internalDistances, kSz); - _kRingInternal(h3, k, internalNeighbors, internalDistances, kSz, 0); + H3Index *internalNeighbors = calloc(kSz, sizeof(H3Index)); + int *internalDistances = calloc(kSz, sizeof(int)); + t_assertSuccess(H3_EXPORT(gridDiskDistancesSafe)( + h3, k, internalNeighbors, internalDistances)); int found = 0; int internalFound = 0; - for (int iNeighbor = 0; iNeighbor < kSz; iNeighbor++) { + for (int64_t iNeighbor = 0; iNeighbor < kSz; iNeighbor++) { if (neighbors[iNeighbor] != 0) { found++; - for (int iInternal = 0; iInternal < kSz; iInternal++) { + for (int64_t iInternal = 0; iInternal < kSz; iInternal++) { if (internalNeighbors[iInternal] == neighbors[iNeighbor]) { internalFound++; @@ -64,13 +66,20 @@ static void kRing_equals_kRingInternal_assertions(H3Index h3) { "produce same output"); } } + + free(internalDistances); + free(internalNeighbors); + + free(distances); + free(neighbors); } } -SUITE(kRing) { - TEST(kRing0) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; - H3Index sfHex0 = H3_EXPORT(geoToH3)(&sf, 0); +SUITE(gridDisk) { + TEST(gridDisk0) { + LatLng sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; + H3Index sfHex0; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, 0, &sfHex0)); H3Index k1[] = {0, 0, 0, 0, 0, 0, 0}; int k1Dist[] = {0, 0, 0, 0, 0, 0, 0}; @@ -78,7 +87,7 @@ SUITE(kRing) { 0x8013fffffffffff, 0x8027fffffffffff, 0x8049fffffffffff, 0x8051fffffffffff, 0x8037fffffffffff}; - H3_EXPORT(kRingDistances)(sfHex0, 1, k1, k1Dist); + t_assertSuccess(H3_EXPORT(gridDiskDistances)(sfHex0, 1, k1, k1Dist)); for (int i = 0; i < 7; i++) { t_assert(k1[i] != 0, "index is populated"); @@ -94,7 +103,7 @@ SUITE(kRing) { } } - TEST(kRing0_PolarPentagon) { + TEST(gridDisk0_PolarPentagon) { H3Index polar; setH3Index(&polar, 0, 4, 0); H3Index k2[] = {0, 0, 0, 0, 0, 0, 0}; @@ -106,7 +115,7 @@ SUITE(kRing) { 0x801ffffffffffff, 0x8019fffffffffff, 0}; - H3_EXPORT(kRingDistances)(polar, 1, k2, k2Dist); + t_assertSuccess(H3_EXPORT(gridDiskDistances)(polar, 1, k2, k2Dist)); int k2present = 0; for (int i = 0; i < 7; i++) { @@ -126,7 +135,7 @@ SUITE(kRing) { t_assert(k2present == 6, "pentagon has 5 neighbors"); } - TEST(kRing1_PolarPentagon) { + TEST(gridDisk1_PolarPentagon) { H3Index polar; setH3Index(&polar, 1, 4, 0); H3Index k2[] = {0, 0, 0, 0, 0, 0, 0}; @@ -138,7 +147,7 @@ SUITE(kRing) { 0x8108bffffffffff, 0x8109bffffffffff, 0}; - H3_EXPORT(kRingDistances)(polar, 1, k2, k2Dist); + t_assertSuccess(H3_EXPORT(gridDiskDistances)(polar, 1, k2, k2Dist)); int k2present = 0; for (int i = 0; i < 7; i++) { @@ -158,7 +167,7 @@ SUITE(kRing) { t_assert(k2present == 6, "pentagon has 5 neighbors"); } - TEST(kRing1_PolarPentagon_k3) { + TEST(gridDisk1_PolarPentagon_k3) { H3Index polar; setH3Index(&polar, 1, 4, 0); H3Index k2[37] = {0}; @@ -203,7 +212,7 @@ SUITE(kRing) { int expectedK2Dist[37] = {2, 3, 2, 1, 3, 3, 3, 2, 2, 3, 1, 3, 0, 2, 3, 3, 2, 2, 3, 1, 3, 3, 2, 2, 3, 1, 2, 3, 1, 3, 3, 0, 0, 0, 0, 0, 0}; - H3_EXPORT(kRingDistances)(polar, 3, k2, k2Dist); + t_assertSuccess(H3_EXPORT(gridDiskDistances)(polar, 3, k2, k2Dist)); int k2present = 0; for (int i = 0; i < 37; i++) { @@ -223,7 +232,7 @@ SUITE(kRing) { t_assert(k2present == 31, "pentagon has 30 neighbors"); } - TEST(kRing1_Pentagon_k4) { + TEST(gridDisk1_Pentagon_k4) { H3Index pent; setH3Index(&pent, 1, 14, 0); H3Index k2[61] = {0}; @@ -281,7 +290,7 @@ SUITE(kRing) { 0x81137ffffffffff, 0, 0}; - H3_EXPORT(kRingDistances)(pent, 4, k2, k2Dist); + t_assertSuccess(H3_EXPORT(gridDiskDistances)(pent, 4, k2, k2Dist)); int k2present = 0; for (int i = 0; i < 61; i++) { @@ -299,51 +308,81 @@ SUITE(kRing) { t_assert(k2present == 51, "pentagon has 50 neighbors"); } - TEST(kRing_equals_kRingInternal) { - // Check that kRingDistances output matches _kRingInternal, - // since kRingDistances will sometimes use a different implementation. + TEST(gridDisk_equals_gridDiskDistancesSafe) { + // Check that gridDiskDistances output matches gridDiskDistancesSafe, + // since gridDiskDistances will sometimes use a different + // implementation. for (int res = 0; res < 2; res++) { - iterateAllIndexesAtRes(res, kRing_equals_kRingInternal_assertions); + iterateAllIndexesAtRes( + res, gridDisk_equals_gridDiskDistancesSafe_assertions); } } - TEST(h3NeighborRotations_identity) { - // This is undefined behavior, but it's helpful for it to make sense. - H3Index origin = 0x811d7ffffffffffL; - int rotations = 0; - t_assert( - h3NeighborRotations(origin, CENTER_DIGIT, &rotations) == origin, - "Moving to self goes to self"); + TEST(gridDiskInvalid) { + int k = 1000; + int64_t kSz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &kSz)); + H3Index *neighbors = calloc(kSz, sizeof(H3Index)); + t_assert(H3_EXPORT(gridDisk)(0x7fffffffffffffff, k, neighbors) == + E_CELL_INVALID, + "gridDisk returns error for invalid input"); + free(neighbors); } - TEST(cwOffsetPent) { - // Try to find a case where h3NeighborRotations would not pass the - // cwOffsetPent check, and would hit a line marked as unreachable. + TEST(gridDiskInvalidDigit) { + int k = 2; + int64_t kSz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &kSz)); + H3Index *neighbors = calloc(kSz, sizeof(H3Index)); + t_assert(H3_EXPORT(gridDisk)(0x4d4b00fe5c5c3030, k, neighbors) == + E_CELL_INVALID, + "gridDisk returns error for invalid input"); + free(neighbors); + } + + TEST(gridDiskDistances_invalidK) { + H3Index index = 0x811d7ffffffffff; + t_assert( + H3_EXPORT(gridDiskDistances)(index, -1, NULL, NULL) == E_DOMAIN, + "gridDiskDistances invalid k"); + t_assert(H3_EXPORT(gridDiskDistancesUnsafe)(index, -1, NULL, NULL) == + E_DOMAIN, + "gridDiskDistancesUnsafe invalid k"); + t_assert( + H3_EXPORT(gridDiskDistancesSafe)(index, -1, NULL, NULL) == E_DOMAIN, + "gridDiskDistancesSafe invalid k"); + } - // To do this, we need to find a case that would move from one - // non-pentagon base cell into the deleted k-subsequence of a pentagon - // base cell, and neither of the cwOffsetPent values are the original - // base cell's face. + TEST(maxGridDiskSize_invalid) { + int64_t sz; + t_assert(H3_EXPORT(maxGridDiskSize)(-1, &sz) == E_DOMAIN, + "negative k is invalid"); + } - for (int pentagon = 0; pentagon < NUM_BASE_CELLS; pentagon++) { - if (!_isBaseCellPentagon(pentagon)) { - continue; - } + TEST(maxGridDiskSize_large) { + int64_t sz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(26755, &sz)); + t_assert(sz == 2147570341, "large (> 32 bit signed int) k works"); + } - for (int neighbor = 0; neighbor < NUM_BASE_CELLS; neighbor++) { - FaceIJK homeFaceIjk; - _baseCellToFaceIjk(neighbor, &homeFaceIjk); - int neighborFace = homeFaceIjk.face; - - // Only direction 2 needs to be checked, because that is the - // only direction where we can move from digit 2 to digit 1, and - // into the deleted k subsequence. - t_assert( - _getBaseCellNeighbor(neighbor, J_AXES_DIGIT) != pentagon || - _baseCellIsCwOffset(pentagon, neighborFace), - "cwOffsetPent is reachable"); - } + TEST(maxGridDiskSize_numCells) { + int64_t sz; + int64_t prev = 0; + int64_t max; + t_assertSuccess(H3_EXPORT(getNumCells)(15, &max)); + // 13780510 will produce values above max + for (int k = 13780510 - 100; k < 13780510 + 100; k++) { + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &sz)); + t_assert(sz <= max, + "maxGridDiskSize does not produce estimates above the " + "number of grid cells"); + t_assert(prev <= sz, "maxGridDiskSize is monotonically increasing"); + prev = sz; } + + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(INT32_MAX, &sz)); + t_assert(sz == max, + "maxGridDiskSize of INT32_MAX produces valid result"); } } diff --git a/src/apps/testapps/testGridDiskInternal.c b/src/apps/testapps/testGridDiskInternal.c new file mode 100644 index 000000000..2d1c41226 --- /dev/null +++ b/src/apps/testapps/testGridDiskInternal.c @@ -0,0 +1,120 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 function `gridDisk` and `gridDiskDistances` + * + * usage: `testGridDiskInternal` + */ + +#include + +#include "algos.h" +#include "baseCells.h" +#include "h3Index.h" +#include "test.h" +#include "utility.h" + +SUITE(gridDiskInternal) { + TEST(h3NeighborRotations_identity) { + // This is not used in gridDisk, but it's helpful for it to make sense. + H3Index origin = 0x811d7ffffffffffL; + int rotations = 0; + H3Index out; + t_assertSuccess( + h3NeighborRotations(origin, CENTER_DIGIT, &rotations, &out)); + t_assert(out == origin, "Moving to self goes to self"); + t_assert(rotations == 0, "Expected rotations"); + } + + TEST(h3NeighborRotations_rotationsOverflow) { + // Check for possible signed integer overflow of `rotations` + H3Index origin; + setH3Index(&origin, 0, 0, CENTER_DIGIT); + // A multiple of 6, so effectively no rotation. Very close + // to INT32_MAX. + int rotations = 2147483646; + H3Index out; + t_assertSuccess( + h3NeighborRotations(origin, K_AXES_DIGIT, &rotations, &out)); + H3Index expected; + // Determined by looking at the base cell table + setH3Index(&expected, 0, 1, CENTER_DIGIT); + t_assert(out == expected, "Expected neighbor"); + t_assert(rotations == 5, "Expected rotations value"); + } + + TEST(h3NeighborRotations_rotationsOverflow2) { + // Check for possible signed integer overflow of `rotations` + H3Index origin; + setH3Index(&origin, 0, 4, CENTER_DIGIT); + // This modulo 6 is 1. + int rotations = INT32_MAX; + H3Index out; + // This will try to move in the K direction off of origin, + // which will be adjusted to the IK direction. + t_assertSuccess( + h3NeighborRotations(origin, JK_AXES_DIGIT, &rotations, &out)); + H3Index expected; + // Determined by looking at the base cell table + setH3Index(&expected, 0, 0, CENTER_DIGIT); + t_assert(out == expected, "Expected neighbor"); + // 1 (original value) + 4 (newRotations for IK direction) + 1 (applied + // when adjusting to the IK direction) = 6, 6 modulo 6 = 0 + t_assert(rotations == 0, "Expected rotations value"); + } + + TEST(h3NeighborRotations_invalid) { + H3Index origin = 0x811d7ffffffffffL; + int rotations = 0; + H3Index out; + t_assert(h3NeighborRotations(origin, -1, &rotations, &out) == E_FAILED, + "Invalid direction fails (-1)"); + t_assert(h3NeighborRotations(origin, 7, &rotations, &out) == E_FAILED, + "Invalid direction fails (7)"); + t_assert(h3NeighborRotations(origin, 100, &rotations, &out) == E_FAILED, + "Invalid direction fails (100)"); + } + + TEST(cwOffsetPent) { + // Try to find a case where h3NeighborRotations would not pass the + // cwOffsetPent check, and would hit a line marked as unreachable. + + // To do this, we need to find a case that would move from one + // non-pentagon base cell into the deleted k-subsequence of a pentagon + // base cell, and neither of the cwOffsetPent values are the original + // base cell's face. + + for (int pentagon = 0; pentagon < NUM_BASE_CELLS; pentagon++) { + if (!_isBaseCellPentagon(pentagon)) { + continue; + } + + for (int neighbor = 0; neighbor < NUM_BASE_CELLS; neighbor++) { + FaceIJK homeFaceIjk; + _baseCellToFaceIjk(neighbor, &homeFaceIjk); + int neighborFace = homeFaceIjk.face; + + // Only direction 2 needs to be checked, because that is the + // only direction where we can move from digit 2 to digit 1, and + // into the deleted k subsequence. + t_assert( + _getBaseCellNeighbor(neighbor, J_AXES_DIGIT) != pentagon || + _baseCellIsCwOffset(pentagon, neighborFace), + "cwOffsetPent is reachable"); + } + } + } +} diff --git a/src/apps/testapps/testHexRanges.c b/src/apps/testapps/testGridDisksUnsafe.c similarity index 63% rename from src/apps/testapps/testHexRanges.c rename to src/apps/testapps/testGridDisksUnsafe.c index 44cba031b..516b09b9a 100644 --- a/src/apps/testapps/testHexRanges.c +++ b/src/apps/testapps/testGridDisksUnsafe.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,36 +15,33 @@ */ #include + #include "algos.h" #include "test.h" -SUITE(hexRanges) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; - H3Index sfHex = H3_EXPORT(geoToH3)(&sf, 9); - H3Index* sfHexPtr = &sfHex; +SUITE(gridDisksUnsafe) { + LatLng sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; + H3Index sfHex; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, 9, &sfHex)); + H3Index *sfHexPtr = &sfHex; H3Index k1[] = {0x89283080ddbffff, 0x89283080c37ffff, 0x89283080c27ffff, 0x89283080d53ffff, 0x89283080dcfffff, 0x89283080dc3ffff}; + H3Index withPentagon[] = {0x8029fffffffffff, 0x801dfffffffffff}; - TEST(identityKRing) { - int err; - + TEST(identityGridDiskCells) { H3Index k0[] = {0}; - err = H3_EXPORT(hexRanges)(sfHexPtr, 1, 0, k0); + t_assertSuccess(H3_EXPORT(gridDisksUnsafe)(sfHexPtr, 1, 0, k0)); - t_assert(err == 0, "No error on hexRanges"); t_assert(k0[0] == sfHex, "generated identity k-ring"); } TEST(ring1of1) { - int err; H3Index allKrings[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - err = H3_EXPORT(hexRanges)(k1, 6, 1, allKrings); - - t_assert(err == 0, "No error on hexRanges"); + t_assertSuccess(H3_EXPORT(gridDisksUnsafe)(k1, 6, 1, allKrings)); for (int i = 0; i < 42; i++) { t_assert(allKrings[i] != 0, "index is populated"); @@ -57,11 +54,8 @@ SUITE(hexRanges) { } TEST(ring2of1) { - int err; - H3Index* allKrings2 = calloc(6 * (1 + 6 + 12), sizeof(H3Index)); - err = H3_EXPORT(hexRanges)(k1, 6, 2, allKrings2); - - t_assert(err == 0, "No error on hexRanges"); + H3Index *allKrings2 = calloc(6 * (1 + 6 + 12), sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(gridDisksUnsafe)(k1, 6, 2, allKrings2)); for (int i = 0; i < (6 * (1 + 6 + 12)); i++) { t_assert(allKrings2[i] != 0, "index is populated"); @@ -74,4 +68,17 @@ SUITE(hexRanges) { } free(allKrings2); } + + TEST(failed) { + H3Index *allKrings = calloc(2 * (1 + 6), sizeof(H3Index)); + t_assert(H3_EXPORT(gridDisksUnsafe)(withPentagon, 2, 1, allKrings) == + E_PENTAGON, + "Expected error on gridDisksUnsafe"); + free(allKrings); + } + + TEST(invalid_k) { + t_assert(H3_EXPORT(gridDisksUnsafe)(k1, 6, -1, NULL) == E_DOMAIN, + "gridDisksUnsafe invalid k"); + } } diff --git a/src/apps/testapps/testGridDistance.c b/src/apps/testapps/testGridDistance.c new file mode 100644 index 000000000..be35a35e5 --- /dev/null +++ b/src/apps/testapps/testGridDistance.c @@ -0,0 +1,147 @@ +/* + * Copyright 2018-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function. + * + * usage: `testGridDistance` + */ + +#include +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +SUITE(gridDistance) { + // Some indexes that represent base cells. Base cells + // are hexagons except for `pent1`. + H3Index bc1 = H3_INIT; + setH3Index(&bc1, 0, 15, 0); + + H3Index bc2 = H3_INIT; + setH3Index(&bc2, 0, 8, 0); + + H3Index bc3 = H3_INIT; + setH3Index(&bc3, 0, 31, 0); + + H3Index pent1 = H3_INIT; + setH3Index(&pent1, 0, 4, 0); + + TEST(testIndexDistance) { + H3Index bc = 0; + setH3Index(&bc, 1, 17, 0); + H3Index p = 0; + setH3Index(&p, 1, 14, 0); + H3Index p2; + setH3Index(&p2, 1, 14, 2); + H3Index p3; + setH3Index(&p3, 1, 14, 3); + H3Index p4; + setH3Index(&p4, 1, 14, 4); + H3Index p5; + setH3Index(&p5, 1, 14, 5); + H3Index p6; + setH3Index(&p6, 1, 14, 6); + + int64_t distance; + t_assertSuccess(H3_EXPORT(gridDistance)(bc, p, &distance)); + t_assert(distance == 3, "distance onto pentagon"); + t_assertSuccess(H3_EXPORT(gridDistance)(bc, p2, &distance)); + t_assert(distance == 2, "distance onto p2"); + t_assertSuccess(H3_EXPORT(gridDistance)(bc, p3, &distance)); + t_assert(distance == 3, "distance onto p3"); + // TODO works correctly but is rejected due to possible pentagon + // distortion. + // t_assertSuccess(H3_EXPORT(gridDistance)(bc, p4, &distance)); + // t_assert(distance == 3, "distance onto p4"); + // t_assertSuccess(H3_EXPORT(gridDistance)(bc, p5, &distance)); + // t_assert(distance == 4, "distance onto p5"); + t_assertSuccess(H3_EXPORT(gridDistance)(bc, p6, &distance)); + t_assert(distance == 2, "distance onto p6"); + } + + TEST(testIndexDistance2) { + H3Index origin = 0x820c4ffffffffffL; + // Destination is on the other side of the pentagon + H3Index destination = 0x821ce7fffffffffL; + + // TODO doesn't work because of pentagon distortion. Both should be 5. + int64_t distance; + t_assert(H3_EXPORT(gridDistance)(destination, origin, &distance) != + E_SUCCESS, + "distance in res 2 across pentagon"); + t_assert(H3_EXPORT(gridDistance)(origin, destination, &distance) != + E_SUCCESS, + "distance in res 2 across pentagon (reversed)"); + } + + TEST(gridDistanceBaseCells) { + int64_t distance; + t_assertSuccess(H3_EXPORT(gridDistance)(bc1, pent1, &distance)); + t_assert(distance == 1, "distance to neighbor is 1 (15, 4)"); + t_assertSuccess(H3_EXPORT(gridDistance)(bc1, bc2, &distance)); + t_assert(distance == 1, "distance to neighbor is 1 (15, 8)"); + t_assertSuccess(H3_EXPORT(gridDistance)(bc1, bc3, &distance)); + t_assert(distance == 1, "distance to neighbor is 1 (15, 31)"); + t_assert(H3_EXPORT(gridDistance)(pent1, bc3, &distance) != E_SUCCESS, + "distance to neighbor is invalid"); + } + + TEST(gridDistanceResolutionMismatch) { + int64_t distance; + t_assert(H3_EXPORT(gridDistance)(0x832830fffffffffL, 0x822837fffffffffL, + &distance) == E_RES_MISMATCH, + "cannot compare at different resolutions"); + } + + TEST(gridDistanceEdge) { + H3Index origin = 0x832830fffffffffL; + H3Index dest = 0x832834fffffffffL; + H3Index edge; + t_assertSuccess(H3_EXPORT(cellsToDirectedEdge)(origin, dest, &edge)); + + t_assert(0 != edge, "test edge is valid"); + int64_t distance; + t_assertSuccess(H3_EXPORT(gridDistance)(edge, origin, &distance)); + t_assert(distance == 0, "edge has zero distance to origin"); + t_assertSuccess(H3_EXPORT(gridDistance)(origin, edge, &distance)); + t_assert(distance == 0, "origin has zero distance to edge"); + + t_assertSuccess(H3_EXPORT(gridDistance)(edge, dest, &distance)); + t_assert(distance == 1, "edge has distance to destination"); + t_assertSuccess(H3_EXPORT(gridDistance)(dest, edge, &distance)); + t_assert(distance == 1, "destination has distance to edge"); + } + + TEST(gridDistanceInvalid) { + H3Index invalid = 0xffffffffffffffff; + int64_t distance; + t_assert(H3_EXPORT(gridDistance)(invalid, invalid, &distance) == + E_CELL_INVALID, + "distance from invalid cell"); + + t_assert( + H3_EXPORT(gridDistance)(bc1, invalid, &distance) == E_RES_MISMATCH, + "distance to invalid cell"); + } +} diff --git a/src/apps/testapps/testGridDistanceExhaustive.c b/src/apps/testapps/testGridDistanceExhaustive.c new file mode 100644 index 000000000..eb3f7a014 --- /dev/null +++ b/src/apps/testapps/testGridDistanceExhaustive.c @@ -0,0 +1,92 @@ +/* + * Copyright 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function using tests over a large number of indexes. + * + * usage: `testGridDistanceExhaustive` + */ + +#include +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; + +static void gridDistance_identity_assertions(H3Index h3) { + int64_t distance; + t_assertSuccess(H3_EXPORT(gridDistance)(h3, h3, &distance)); + t_assert(distance == 0, "distance to self is 0"); +} + +static void gridDistance_gridDisk_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (gridDisk)"); + int maxK = MAX_DISTANCES[r]; + + int64_t sz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(maxK, &sz)); + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + int *distances = calloc(sz, sizeof(int)); + + t_assertSuccess( + H3_EXPORT(gridDiskDistances)(h3, maxK, neighbors, distances)); + + for (int64_t i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + + int64_t calculatedDistance; + H3Error calculatedError = + H3_EXPORT(gridDistance)(h3, neighbors[i], &calculatedDistance); + + // Don't consider indexes where gridDistance reports failure to + // generate + if (calculatedError == E_SUCCESS) { + t_assert(calculatedDistance == distances[i], + "gridDiskDistances matches gridDistance"); + } + } + + free(distances); + free(neighbors); +} + +SUITE(gridDistance) { + TEST(gridDistance_identity) { + iterateAllIndexesAtRes(0, gridDistance_identity_assertions); + iterateAllIndexesAtRes(1, gridDistance_identity_assertions); + iterateAllIndexesAtRes(2, gridDistance_identity_assertions); + } + + TEST(gridDistance_gridDisk) { + iterateAllIndexesAtRes(0, gridDistance_gridDisk_assertions); + iterateAllIndexesAtRes(1, gridDistance_gridDisk_assertions); + iterateAllIndexesAtRes(2, gridDistance_gridDisk_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, gridDistance_gridDisk_assertions, 27); + // Further resolutions aren't tested to save time. + } +} diff --git a/src/apps/testapps/testGridDistanceInternal.c b/src/apps/testapps/testGridDistanceInternal.c new file mode 100644 index 000000000..37ee005f4 --- /dev/null +++ b/src/apps/testapps/testGridDistanceInternal.c @@ -0,0 +1,56 @@ +/* + * Copyright 2018-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 distance function. + * + * usage: `testGridDistanceInternal` + */ + +#include +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "constants.h" +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +SUITE(gridDistanceInternal) { + TEST(ijkDistance) { + CoordIJK z = {0, 0, 0}; + CoordIJK i = {1, 0, 0}; + CoordIJK ik = {1, 0, 1}; + CoordIJK ij = {1, 1, 0}; + CoordIJK j2 = {0, 2, 0}; + + t_assert(ijkDistance(&z, &z) == 0, "identity distance 0,0,0"); + t_assert(ijkDistance(&i, &i) == 0, "identity distance 1,0,0"); + t_assert(ijkDistance(&ik, &ik) == 0, "identity distance 1,0,1"); + t_assert(ijkDistance(&ij, &ij) == 0, "identity distance 1,1,0"); + t_assert(ijkDistance(&j2, &j2) == 0, "identity distance 0,2,0"); + + t_assert(ijkDistance(&z, &i) == 1, "0,0,0 to 1,0,0"); + t_assert(ijkDistance(&z, &j2) == 2, "0,0,0 to 0,2,0"); + t_assert(ijkDistance(&z, &ik) == 1, "0,0,0 to 1,0,1"); + t_assert(ijkDistance(&i, &ik) == 1, "1,0,0 to 1,0,1"); + t_assert(ijkDistance(&ik, &j2) == 3, "1,0,1 to 0,2,0"); + t_assert(ijkDistance(&ij, &ik) == 2, "1,0,1 to 1,1,0"); + } +} diff --git a/src/apps/testapps/testGridPathCells.c b/src/apps/testapps/testGridPathCells.c new file mode 100644 index 000000000..a99d33c19 --- /dev/null +++ b/src/apps/testapps/testGridPathCells.c @@ -0,0 +1,54 @@ +/* + * Copyright 2018-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 grid path function. + * + * usage: `testGridPathCells` + */ + +#include +#include +#include + +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +SUITE(gridPathCells) { + TEST(gridPathCells_acrossMultipleFaces) { + H3Index start = 0x85285aa7fffffff; + H3Index end = 0x851d9b1bfffffff; + + int64_t size; + H3Error lineError = H3_EXPORT(gridPathCellsSize)(start, end, &size); + t_assert(lineError == E_FAILED, + "Line not computable across multiple icosa faces"); + } + + TEST(gridPathCells_pentagon) { + H3Index start = 0x820807fffffffff; + H3Index end = 0x8208e7fffffffff; + + int64_t size; + t_assertSuccess(H3_EXPORT(gridPathCellsSize)(start, end, &size)); + H3Index *path = calloc(sizeof(H3Index), size); + t_assert(H3_EXPORT(gridPathCells)(start, end, path) == E_PENTAGON, + "Line not computable due to pentagon distortion"); + free(path); + } +} diff --git a/src/apps/testapps/testGridPathCellsExhaustive.c b/src/apps/testapps/testGridPathCellsExhaustive.c new file mode 100644 index 000000000..92cf7d2a5 --- /dev/null +++ b/src/apps/testapps/testGridPathCellsExhaustive.c @@ -0,0 +1,124 @@ +/* + * Copyright 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests grid path cells function using tests over a large number of + * indexes. + * + * usage: `testGridPathCellsExhaustive` + */ + +#include +#include +#include + +#include "h3Index.h" +#include "h3api.h" +#include "localij.h" +#include "test.h" +#include "utility.h" + +static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; + +/** + * Property-based testing of gridPathCells output + */ +static void gridPathCells_assertions(H3Index start, H3Index end) { + int64_t sz; + t_assertSuccess(H3_EXPORT(gridPathCellsSize)(start, end, &sz)); + t_assert(sz > 0, "got valid size"); + H3Index *line = calloc(sz, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(gridPathCells)(start, end, line)); + + t_assert(line[0] == start, "line starts with start index"); + t_assert(line[sz - 1] == end, "line ends with end index"); + + for (int i = 1; i < sz; i++) { + t_assert(H3_EXPORT(isValidCell)(line[i]), "index is valid"); + int isNeighbor; + t_assertSuccess( + H3_EXPORT(areNeighborCells)(line[i], line[i - 1], &isNeighbor)); + t_assert(isNeighbor, "index is a neighbor of the previous index"); + if (i > 1) { + t_assertSuccess( + H3_EXPORT(areNeighborCells)(line[i], line[i - 2], &isNeighbor)); + t_assert( + !isNeighbor, + "index is not a neighbor of the index before the previous"); + } + } + + free(line); +} + +/** + * Tests for invalid gridPathCells input + */ +static void gridPathCells_invalid_assertions(H3Index start, H3Index end) { + int64_t sz; + t_assert(H3_EXPORT(gridPathCellsSize)(start, end, &sz) != E_SUCCESS, + "line size marked as invalid"); + + H3Index *line = {0}; + H3Error err = H3_EXPORT(gridPathCells)(start, end, line); + t_assert(err != E_SUCCESS, "line marked as invalid"); +} + +/** + * Test for lines from an index to all neighbors within a gridDisk + */ +static void gridPathCells_gridDisk_assertions(H3Index h3) { + int r = H3_GET_RESOLUTION(h3); + t_assert(r <= 5, "resolution supported by test function (gridDisk)"); + int maxK = MAX_DISTANCES[r]; + + int64_t sz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(maxK, &sz)); + + if (H3_EXPORT(isPentagon)(h3)) { + return; + } + + H3Index *neighbors = calloc(sz, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(gridDisk)(h3, maxK, neighbors)); + + for (int i = 0; i < sz; i++) { + if (neighbors[i] == 0) { + continue; + } + int64_t distance; + H3Error distanceError = + H3_EXPORT(gridDistance)(h3, neighbors[i], &distance); + if (distanceError == E_SUCCESS) { + gridPathCells_assertions(h3, neighbors[i]); + } else { + gridPathCells_invalid_assertions(h3, neighbors[i]); + } + } + + free(neighbors); +} + +SUITE(gridPathCells) { + TEST(gridPathCells_gridDisk) { + iterateAllIndexesAtRes(0, gridPathCells_gridDisk_assertions); + iterateAllIndexesAtRes(1, gridPathCells_gridDisk_assertions); + iterateAllIndexesAtRes(2, gridPathCells_gridDisk_assertions); + // Don't iterate all of res 3, to save time + iterateAllIndexesAtResPartial(3, gridPathCells_gridDisk_assertions, 6); + // Further resolutions aren't tested to save time. + } +} diff --git a/src/apps/testapps/testHexRing.c b/src/apps/testapps/testGridRingUnsafe.c similarity index 74% rename from src/apps/testapps/testHexRing.c rename to src/apps/testapps/testGridRingUnsafe.c index 9782119fe..24c01d75d 100644 --- a/src/apps/testapps/testHexRing.c +++ b/src/apps/testapps/testGridRingUnsafe.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,35 +15,29 @@ */ #include + #include "algos.h" #include "constants.h" #include "h3Index.h" #include "test.h" -SUITE(hexRing) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; - H3Index sfHex = H3_EXPORT(geoToH3)(&sf, 9); - - TEST(identityKRing) { - int err; +SUITE(gridRingUnsafe) { + LatLng sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; + H3Index sfHex; + t_assertSuccess(H3_EXPORT(latLngToCell)(&sf, 9, &sfHex)); + TEST(identityGridRing) { H3Index k0[] = {0}; - err = H3_EXPORT(hexRing)(sfHex, 0, k0); - - t_assert(err == 0, "No error on hexRing"); + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sfHex, 0, k0)); t_assert(k0[0] == sfHex, "generated identity k-ring"); } TEST(ring1) { - int err; - H3Index k1[] = {0, 0, 0, 0, 0, 0}; H3Index expectedK1[] = {0x89283080ddbffff, 0x89283080c37ffff, 0x89283080c27ffff, 0x89283080d53ffff, 0x89283080dcfffff, 0x89283080dc3ffff}; - err = H3_EXPORT(hexRing)(sfHex, 1, k1); - - t_assert(err == 0, "No error on hexRing"); + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sfHex, 1, k1)); for (int i = 0; i < 6; i++) { t_assert(k1[i] != 0, "index is populated"); @@ -58,17 +52,13 @@ SUITE(hexRing) { } TEST(ring2) { - int err; - H3Index k2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; H3Index expectedK2[] = { 0x89283080ca7ffff, 0x89283080cafffff, 0x89283080c33ffff, 0x89283080c23ffff, 0x89283080c2fffff, 0x89283080d5bffff, 0x89283080d43ffff, 0x89283080d57ffff, 0x89283080d1bffff, 0x89283080dc7ffff, 0x89283080dd7ffff, 0x89283080dd3ffff}; - err = H3_EXPORT(hexRing)(sfHex, 2, k2); - - t_assert(err == 0, "No error on hexRing"); + t_assertSuccess(H3_EXPORT(gridRingUnsafe)(sfHex, 2, k2)); for (int i = 0; i < 12; i++) { t_assert(k2[i] != 0, "index is populated"); @@ -83,45 +73,38 @@ SUITE(hexRing) { } TEST(nearPentagonRing1) { - int err; - H3Index nearPentagon = 0x837405fffffffff; H3Index kp1[] = {0, 0, 0, 0, 0, 0}; - err = H3_EXPORT(hexRing)(nearPentagon, 1, kp1); - - t_assert(err != 0, "Should return an error when hitting a pentagon"); + t_assert(H3_EXPORT(gridRingUnsafe)(nearPentagon, 1, kp1) == E_PENTAGON, + "Should return an error when hitting a pentagon"); } TEST(nearPentagonRing2) { - int err; - H3Index nearPentagon = 0x837405fffffffff; H3Index kp2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - err = H3_EXPORT(hexRing)(nearPentagon, 2, kp2); - - t_assert(err != 0, "Should return an error when hitting a pentagon"); + t_assert(H3_EXPORT(gridRingUnsafe)(nearPentagon, 2, kp2) == E_PENTAGON, + "Should return an error when hitting a pentagon"); } TEST(onPentagon) { - int err; - H3Index nearPentagon; setH3Index(&nearPentagon, 0, 4, 0); H3Index kp2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - err = H3_EXPORT(hexRing)(nearPentagon, 2, kp2); - - t_assert(err != 0, + t_assert(H3_EXPORT(gridRingUnsafe)(nearPentagon, 2, kp2) == E_PENTAGON, "Should return an error when starting at a pentagon"); } - TEST(hexRing_matches_kRingInternal) { + TEST(gridRingUnsafe_matches_gridDiskDistancesSafe) { for (int res = 0; res < 2; res++) { for (int i = 0; i < NUM_BASE_CELLS; i++) { H3Index bc; setH3Index(&bc, 0, i, 0); - int childrenSz = H3_EXPORT(maxUncompactSize)(&bc, 1, res); + int64_t childrenSz; + t_assertSuccess( + H3_EXPORT(uncompactCellsSize)(&bc, 1, res, &childrenSz)); H3Index *children = calloc(childrenSz, sizeof(H3Index)); - H3_EXPORT(uncompact)(&bc, 1, children, childrenSz, res); + t_assertSuccess(H3_EXPORT(uncompactCells)(&bc, 1, children, + childrenSz, res)); for (int j = 0; j < childrenSz; j++) { if (children[j] == 0) { @@ -130,17 +113,20 @@ SUITE(hexRing) { for (int k = 0; k < 3; k++) { int ringSz = k != 0 ? 6 * k : 1; - int kSz = H3_EXPORT(maxKringSize)(k); + int64_t kSz; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &kSz)); H3Index *ring = calloc(ringSz, sizeof(H3Index)); - int failed = H3_EXPORT(hexRing)(children[j], k, ring); + H3Error failed = + H3_EXPORT(gridRingUnsafe)(children[j], k, ring); if (!failed) { H3Index *internalNeighbors = calloc(kSz, sizeof(H3Index)); int *internalDistances = calloc(kSz, sizeof(int)); - _kRingInternal(children[j], k, internalNeighbors, - internalDistances, kSz, 0); + t_assertSuccess(H3_EXPORT(gridDiskDistancesSafe)( + children[j], k, internalNeighbors, + internalDistances)); int found = 0; int internalFound = 0; @@ -148,7 +134,7 @@ SUITE(hexRing) { if (ring[iRing] != 0) { found++; - for (int iInternal = 0; iInternal < kSz; + for (int64_t iInternal = 0; iInternal < kSz; iInternal++) { if (internalNeighbors[iInternal] == ring[iRing]) { diff --git a/src/apps/testapps/testH3Api.c b/src/apps/testapps/testH3Api.c index 78d25e3e6..20f8d1d79 100644 --- a/src/apps/testapps/testH3Api.c +++ b/src/apps/testapps/testH3Api.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,54 +20,58 @@ */ #include -#include "geoCoord.h" + +#include "h3Index.h" #include "h3api.h" +#include "latLng.h" #include "test.h" #include "utility.h" SUITE(h3Api) { - TEST(geoToH3_res) { - GeoCoord anywhere = {0, 0}; + TEST(latLngToCell_res) { + H3Index h; + LatLng anywhere = {0, 0}; - t_assert(H3_EXPORT(geoToH3)(&anywhere, -1) == 0, + t_assert(H3_EXPORT(latLngToCell)(&anywhere, -1, &h) == E_RES_DOMAIN, "resolution below 0 is invalid"); - t_assert(H3_EXPORT(geoToH3)(&anywhere, 16) == 0, + t_assert(H3_EXPORT(latLngToCell)(&anywhere, 16, &h) == E_RES_DOMAIN, "resolution above 15 is invalid"); } - TEST(geoToH3_coord) { - GeoCoord invalidLat = {NAN, 0}; - GeoCoord invalidLon = {0, NAN}; - GeoCoord invalidLatLon = {INFINITY, -INFINITY}; + TEST(latLngToCell_coord) { + H3Index h; + LatLng invalidLat = {NAN, 0}; + LatLng invalidLng = {0, NAN}; + LatLng invalidLatLng = {INFINITY, -INFINITY}; - t_assert(H3_EXPORT(geoToH3)(&invalidLat, 1) == 0, + t_assert(H3_EXPORT(latLngToCell)(&invalidLat, 1, &h) == E_LATLNG_DOMAIN, "invalid latitude is rejected"); - t_assert(H3_EXPORT(geoToH3)(&invalidLon, 1) == 0, + t_assert(H3_EXPORT(latLngToCell)(&invalidLng, 1, &h) == E_LATLNG_DOMAIN, "invalid longitude is rejected"); - t_assert(H3_EXPORT(geoToH3)(&invalidLatLon, 1) == 0, - "coordinates with infinity are rejected"); + t_assert( + H3_EXPORT(latLngToCell)(&invalidLatLng, 1, &h) == E_LATLNG_DOMAIN, + "coordinates with infinity are rejected"); } - TEST(h3ToGeoBoundary_classIIIEdgeVertex) { + TEST(cellToBoundary_classIIIEdgeVertex) { // Bug test for https://github.com/uber/h3/issues/45 - char* hexes[] = { - "894cc5349b7ffff", "894cc534d97ffff", "894cc53682bffff", - "894cc536b17ffff", "894cc53688bffff", "894cead92cbffff", - "894cc536537ffff", "894cc5acbabffff", "894cc536597ffff"}; + H3Index hexes[] = { + 0x894cc5349b7ffff, 0x894cc534d97ffff, 0x894cc53682bffff, + 0x894cc536b17ffff, 0x894cc53688bffff, 0x894cead92cbffff, + 0x894cc536537ffff, 0x894cc5acbabffff, 0x894cc536597ffff}; int numHexes = sizeof(hexes) / sizeof(hexes[0]); - H3Index h3; - GeoBoundary b; + CellBoundary b; for (int i = 0; i < numHexes; i++) { - h3 = H3_EXPORT(stringToH3)(hexes[i]); - H3_EXPORT(h3ToGeoBoundary)(h3, &b); + H3_EXPORT(cellToBoundary)(hexes[i], &b); t_assert(b.numVerts == 7, "got expected vertex count"); } } - TEST(h3ToGeoBoundary_classIIIEdgeVertex_exact) { + TEST(cellToBoundary_classIIIEdgeVertex_exact) { // Bug test for https://github.com/uber/h3/issues/45 - H3Index h3 = H3_EXPORT(stringToH3)("894cc536537ffff"); - GeoBoundary boundary; + H3Index h3; + t_assertSuccess(H3_EXPORT(stringToH3)("894cc536537ffff", &h3)); + CellBoundary boundary; boundary.numVerts = 7; setGeoDegs(&boundary.verts[0], 18.043333154, -66.27836523500002); setGeoDegs(&boundary.verts[1], 18.042238363, -66.27929062800001); @@ -78,4 +82,45 @@ SUITE(h3Api) { setGeoDegs(&boundary.verts[6], 18.043007860, -66.27669118199998); t_assertBoundary(h3, &boundary); } + + TEST(cellToBoundary_coslngConstrain) { + // Bug test for https://github.com/uber/h3/issues/212 + H3Index h3 = 0x87dc6d364ffffffL; + CellBoundary boundary; + boundary.numVerts = 6; + setGeoDegs(&boundary.verts[0], -52.0130533678236091, + -34.6232931343713091); + setGeoDegs(&boundary.verts[1], -52.0041156384652012, + -34.6096733160584549); + setGeoDegs(&boundary.verts[2], -51.9929610229502472, + -34.6165157145896387); + setGeoDegs(&boundary.verts[3], -51.9907410568096608, + -34.6369680004259877); + setGeoDegs(&boundary.verts[4], -51.9996738734672377, + -34.6505896528323660); + setGeoDegs(&boundary.verts[5], -52.0108315681413629, + -34.6437571897165668); + t_assertBoundary(h3, &boundary); + } + + TEST(cellToBoundary_failed) { + H3Index h = 0x87dc6d364ffffffL; + H3_SET_BASE_CELL(h, NUM_BASE_CELLS + 1); + CellBoundary gb; + t_assert(H3_EXPORT(cellToBoundary(h, &gb) == E_CELL_INVALID), + "cellToBoundary fails on invalid index"); + } + + TEST(cellToLatLngInvalid) { + LatLng coord; + t_assert(H3_EXPORT(cellToLatLng)(0x7fffffffffffffff, &coord) == + E_CELL_INVALID, + "invalid cell gives error"); + } + + TEST(version) { + t_assert(H3_VERSION_MAJOR >= 0, "major version is set"); + t_assert(H3_VERSION_MINOR >= 0, "minor version is set"); + t_assert(H3_VERSION_PATCH >= 0, "patch version is set"); + } } diff --git a/src/apps/testapps/testH3CellArea.c b/src/apps/testapps/testH3CellArea.c new file mode 100644 index 000000000..060e14d16 --- /dev/null +++ b/src/apps/testapps/testH3CellArea.c @@ -0,0 +1,60 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * @brief tests H3 cell area functions on a few specific cases + * + * usage: `testH3CellArea` + */ + +#include + +#include "h3Index.h" +#include "test.h" + +static const double areasKm2[] = { + 2.562182162955496e+06, 4.476842017201860e+05, 6.596162242711056e+04, + 9.228872919002590e+03, 1.318694490797110e+03, 1.879593512281298e+02, + 2.687164354763186e+01, 3.840848847060638e+00, 5.486939641329893e-01, + 7.838600808637444e-02, 1.119834221989390e-02, 1.599777169186614e-03, + 2.285390931423380e-04, 3.264850232091780e-05, 4.664070326136774e-06, + 6.662957615868888e-07}; + +SUITE(h3CellArea) { + TEST(specific_cell_area) { + LatLng gc = {0.0, 0.0}; + for (int res = 0; res <= MAX_H3_RES - 1; res++) { + H3Index cell; + t_assertSuccess(H3_EXPORT(latLngToCell)(&gc, res, &cell)); + double area; + t_assertSuccess(H3_EXPORT(cellAreaKm2)(cell, &area)); + + t_assert(fabs(area - areasKm2[res]) < 1e-8, + "cell area should match expectation"); + } + } + + TEST(cell_area_invalid) { + H3Index invalid = 0xFFFFFFFFFFFFFFFF; + double area; + t_assert(H3_EXPORT(cellAreaRads2)(invalid, &area) == E_CELL_INVALID, + "cellAreaRads2 invalid input"); + t_assert(H3_EXPORT(cellAreaKm2)(invalid, &area) == E_CELL_INVALID, + "cellAreaKm2 invalid input"); + t_assert(H3_EXPORT(cellAreaM2)(invalid, &area) == E_CELL_INVALID, + "cellAreaM2 invalid input"); + } +} diff --git a/src/apps/testapps/testH3CellAreaExhaustive.c b/src/apps/testapps/testH3CellAreaExhaustive.c new file mode 100644 index 000000000..13261dae1 --- /dev/null +++ b/src/apps/testapps/testH3CellAreaExhaustive.c @@ -0,0 +1,203 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * @brief tests H3 cell area functions using tests over a large number + * of indexes. + * + * usage: `testH3CellAreaExhaustive` + */ + +#include + +#include "constants.h" +#include "h3api.h" +#include "iterators.h" +#include "test.h" +#include "utility.h" + +/** + * Basic checks around the great circle distance between the centers of two + * neighboring cells. Tests positivity and commutativity. + * + * Tests the functions: + * greatCircleDistanceRads + * greatCircleDistanceKm + * greatCircleDistanceM + * + * @param edge H3 directed edge denoting neighboring cells + */ +static void haversine_assert(H3Index edge) { + LatLng a, b; + H3Index origin, destination; + + t_assertSuccess(H3_EXPORT(getDirectedEdgeOrigin)(edge, &origin)); + t_assertSuccess(H3_EXPORT(cellToLatLng)(origin, &a)); + + t_assertSuccess(H3_EXPORT(getDirectedEdgeDestination)(edge, &destination)); + t_assertSuccess(H3_EXPORT(cellToLatLng)(destination, &b)); + + char pos[] = "distance between cell centers should be positive"; + char comm[] = "pairwise cell distances should be commutative"; + + double ab, ba; + + ab = H3_EXPORT(greatCircleDistanceRads)(&a, &b); + ba = H3_EXPORT(greatCircleDistanceRads)(&b, &a); + t_assert(ab > 0, pos); + t_assert(ab == ba, comm); + + ab = H3_EXPORT(greatCircleDistanceKm)(&a, &b); + ba = H3_EXPORT(greatCircleDistanceKm)(&b, &a); + t_assert(ab > 0, pos); + t_assert(ab == ba, comm); + + ab = H3_EXPORT(greatCircleDistanceM)(&a, &b); + ba = H3_EXPORT(greatCircleDistanceM)(&b, &a); + t_assert(ab > 0, pos); + t_assert(ab == ba, comm); + + t_assert(H3_EXPORT(greatCircleDistanceKm)(&a, &b) > + H3_EXPORT(greatCircleDistanceRads)(&a, &b), + "measurement in kilometers should be greater than in radians"); + t_assert(H3_EXPORT(greatCircleDistanceM)(&a, &b) > + H3_EXPORT(greatCircleDistanceKm)(&a, &b), + "measurement in meters should be greater than in kilometers"); +} + +/** + * Tests positivity of edge length calculation for the functions: + * + * edgeLengthRads + * edgeLengthKm + * edgeLengthM + * + * @param edge edge to compute the length of + */ +static void edge_length_assert(H3Index edge) { + char msg[] = "edge has positive length"; + + double length; + t_assertSuccess(H3_EXPORT(edgeLengthRads)(edge, &length)); + t_assert(length > 0, msg); + t_assertSuccess(H3_EXPORT(edgeLengthKm)(edge, &length)); + t_assert(length > 0, msg); + t_assertSuccess(H3_EXPORT(edgeLengthM)(edge, &length)); + t_assert(length > 0, msg); +} + +/** + * Test that cell area calculations are positive for the functions: + * + * cellAreaRads2 + * cellAreaKm2 + * cellAreaM2 + * + * @param cell cell to compute the area of + */ +static void cell_area_assert(H3Index cell) { + char msg[] = "cell has positive area"; + + double areaRads; + t_assertSuccess(H3_EXPORT(cellAreaRads2)(cell, &areaRads)); + t_assert(areaRads > 0, msg); + double areaKm2; + t_assertSuccess(H3_EXPORT(cellAreaKm2)(cell, &areaKm2)); + t_assert(areaKm2 > 0, msg); + double areaM2; + t_assertSuccess(H3_EXPORT(cellAreaM2)(cell, &areaM2)); + t_assert(areaM2 > 0, msg); + + t_assert(areaRads < areaKm2, "area in rads smaller than area in km2"); + t_assert(areaKm2 < areaM2, "area in km2 smaller than area in m2"); +} + +/** + * Apply a cell area calculation function to every cell on the earth at a given + * resolution, and check that it sums up the total earth area. + * + * @param res resolution of the cells + * @param cell_area callback to compute area of each cell + * @param target expected earth area in some units + * @param tol error tolerance allowed between expected and actual + */ +static void earth_area_test(int res, H3Error (*cell_area)(H3Index, double *), + double target, double tol) { + double area = 0.0; + for (IterCellsResolution iter = iterInitRes(res); iter.h; + iterStepRes(&iter)) { + double cellArea; + t_assertSuccess((*cell_area)(iter.h, &cellArea)); + area += cellArea; + } + + t_assert(fabs(area - target) < tol, + "sum of all cells should give earth area"); +} + +SUITE(h3CellAreaExhaustive) { + TEST(haversine_distances) { + iterateAllDirectedEdgesAtRes(0, haversine_assert); + iterateAllDirectedEdgesAtRes(1, haversine_assert); + iterateAllDirectedEdgesAtRes(2, haversine_assert); + iterateAllDirectedEdgesAtRes(3, haversine_assert); + } + + TEST(edge_length) { + iterateAllDirectedEdgesAtRes(0, edge_length_assert); + iterateAllDirectedEdgesAtRes(1, edge_length_assert); + iterateAllDirectedEdgesAtRes(2, edge_length_assert); + iterateAllDirectedEdgesAtRes(3, edge_length_assert); + } + + TEST(cell_area_positive) { + iterateAllIndexesAtRes(0, cell_area_assert); + iterateAllIndexesAtRes(1, cell_area_assert); + iterateAllIndexesAtRes(2, cell_area_assert); + iterateAllIndexesAtRes(3, cell_area_assert); + } + + TEST(cell_area_earth) { + // earth area in different units + double rads2 = 4 * M_PI; + double km2 = rads2 * EARTH_RADIUS_KM * EARTH_RADIUS_KM; + double m2 = km2 * 1000 * 1000; + + // Notice the drop in accuracy at resolution 1. + // I think this has something to do with Class II vs Class III + // resolutions. + + earth_area_test(0, H3_EXPORT(cellAreaRads2), rads2, 1e-14); + earth_area_test(0, H3_EXPORT(cellAreaKm2), km2, 1e-6); + earth_area_test(0, H3_EXPORT(cellAreaM2), m2, 1e0); + + earth_area_test(1, H3_EXPORT(cellAreaRads2), rads2, 1e-9); + earth_area_test(1, H3_EXPORT(cellAreaKm2), km2, 1e-1); + earth_area_test(1, H3_EXPORT(cellAreaM2), m2, 1e5); + + earth_area_test(2, H3_EXPORT(cellAreaRads2), rads2, 1e-12); + earth_area_test(2, H3_EXPORT(cellAreaKm2), km2, 1e-5); + earth_area_test(2, H3_EXPORT(cellAreaM2), m2, 1e0); + + earth_area_test(3, H3_EXPORT(cellAreaRads2), rads2, 1e-11); + earth_area_test(3, H3_EXPORT(cellAreaKm2), km2, 1e-3); + earth_area_test(3, H3_EXPORT(cellAreaM2), m2, 1e3); + + earth_area_test(4, H3_EXPORT(cellAreaRads2), rads2, 1e-11); + earth_area_test(4, H3_EXPORT(cellAreaKm2), km2, 1e-3); + earth_area_test(4, H3_EXPORT(cellAreaM2), m2, 1e2); + } +} diff --git a/src/apps/testapps/testH3Distance.c b/src/apps/testapps/testH3Distance.c deleted file mode 100644 index 27803cb85..000000000 --- a/src/apps/testapps/testH3Distance.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief tests H3 distance function. - * - * usage: `testH3Distance` - */ - -#include -#include -#include -#include "algos.h" -#include "baseCells.h" -#include "constants.h" -#include "h3Index.h" -#include "h3api.h" -#include "localij.h" -#include "stackAlloc.h" -#include "test.h" -#include "utility.h" - -static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; - -static void h3Distance_identity_assertions(H3Index h3) { - t_assert(H3_EXPORT(h3Distance)(h3, h3) == 0, "distance to self is 0"); -} - -static void h3Distance_kRing_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); - int maxK = MAX_DISTANCES[r]; - - int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - STACK_ARRAY_CALLOC(int, distances, sz); - - H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances); - - for (int i = 0; i < sz; i++) { - if (neighbors[i] == 0) { - continue; - } - - int calculatedDistance = H3_EXPORT(h3Distance)(h3, neighbors[i]); - - // Don't consider indexes where h3Distance reports failure to - // generate - t_assert(calculatedDistance == distances[i] || calculatedDistance == -1, - "kRingDistances matches h3Distance"); - } -} - -SUITE(h3Distance) { - // Some indexes that represent base cells. Base cells - // are hexagons except for `pent1`. - H3Index bc1 = H3_INIT; - setH3Index(&bc1, 0, 15, 0); - - H3Index bc2 = H3_INIT; - setH3Index(&bc2, 0, 8, 0); - - H3Index bc3 = H3_INIT; - setH3Index(&bc3, 0, 31, 0); - - H3Index pent1 = H3_INIT; - setH3Index(&pent1, 0, 4, 0); - - TEST(testIndexDistance) { - H3Index bc = 0; - setH3Index(&bc, 1, 17, 0); - H3Index p = 0; - setH3Index(&p, 1, 14, 0); - H3Index p2; - setH3Index(&p2, 1, 14, 2); - H3Index p3; - setH3Index(&p3, 1, 14, 3); - H3Index p4; - setH3Index(&p4, 1, 14, 4); - H3Index p5; - setH3Index(&p5, 1, 14, 5); - H3Index p6; - setH3Index(&p6, 1, 14, 6); - - t_assert(H3_EXPORT(h3Distance)(bc, p) == 3, "distance onto pentagon"); - t_assert(H3_EXPORT(h3Distance)(bc, p2) == 2, "distance onto p2"); - t_assert(H3_EXPORT(h3Distance)(bc, p3) == 3, "distance onto p3"); - // TODO works correctly but is rejected due to possible pentagon - // distortion. - // t_assert(H3_EXPORT(h3Distance)(bc, p4) == 3, "distance onto p4"); - // t_assert(H3_EXPORT(h3Distance)(bc, p5) == 4, "distance onto p5"); - t_assert(H3_EXPORT(h3Distance)(bc, p6) == 2, "distance onto p6"); - } - - TEST(testIndexDistance2) { - H3Index origin = 0x820c4ffffffffffL; - // Destination is on the other side of the pentagon - H3Index destination = 0x821ce7fffffffffL; - - // TODO doesn't work because of pentagon distortion. Both should be 5. - t_assert(H3_EXPORT(h3Distance)(destination, origin) == -1, - "distance in res 2 across pentagon"); - t_assert(H3_EXPORT(h3Distance)(origin, destination) == -1, - "distance in res 2 across pentagon (reversed)"); - } - - TEST(h3Distance_identity) { - iterateAllIndexesAtRes(0, h3Distance_identity_assertions); - iterateAllIndexesAtRes(1, h3Distance_identity_assertions); - iterateAllIndexesAtRes(2, h3Distance_identity_assertions); - } - - TEST(h3Distance_kRing) { - iterateAllIndexesAtRes(0, h3Distance_kRing_assertions); - iterateAllIndexesAtRes(1, h3Distance_kRing_assertions); - iterateAllIndexesAtRes(2, h3Distance_kRing_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, h3Distance_kRing_assertions, 27); - // Further resolutions aren't tested to save time. - } - - TEST(h3DistanceBaseCells) { - t_assert(H3_EXPORT(h3Distance)(bc1, pent1) == 1, - "distance to neighbor is 1 (15, 4)"); - t_assert(H3_EXPORT(h3Distance)(bc1, bc2) == 1, - "distance to neighbor is 1 (15, 8)"); - t_assert(H3_EXPORT(h3Distance)(bc1, bc3) == 1, - "distance to neighbor is 1 (15, 31)"); - t_assert(H3_EXPORT(h3Distance)(pent1, bc3) == -1, - "distance to neighbor is invalid"); - } - - TEST(ijkDistance) { - CoordIJK z = {0, 0, 0}; - CoordIJK i = {1, 0, 0}; - CoordIJK ik = {1, 0, 1}; - CoordIJK ij = {1, 1, 0}; - CoordIJK j2 = {0, 2, 0}; - - t_assert(ijkDistance(&z, &z) == 0, "identity distance 0,0,0"); - t_assert(ijkDistance(&i, &i) == 0, "identity distance 1,0,0"); - t_assert(ijkDistance(&ik, &ik) == 0, "identity distance 1,0,1"); - t_assert(ijkDistance(&ij, &ij) == 0, "identity distance 1,1,0"); - t_assert(ijkDistance(&j2, &j2) == 0, "identity distance 0,2,0"); - - t_assert(ijkDistance(&z, &i) == 1, "0,0,0 to 1,0,0"); - t_assert(ijkDistance(&z, &j2) == 2, "0,0,0 to 0,2,0"); - t_assert(ijkDistance(&z, &ik) == 1, "0,0,0 to 1,0,1"); - t_assert(ijkDistance(&i, &ik) == 1, "1,0,0 to 1,0,1"); - t_assert(ijkDistance(&ik, &j2) == 3, "1,0,1 to 0,2,0"); - t_assert(ijkDistance(&ij, &ik) == 2, "1,0,1 to 1,1,0"); - } - - TEST(h3DistanceResolutionMismatch) { - t_assert( - H3_EXPORT(h3Distance)(0x832830fffffffffL, 0x822837fffffffffL) == -1, - "cannot compare at different resolutions"); - } - - TEST(h3DistanceEdge) { - H3Index origin = 0x832830fffffffffL; - H3Index dest = 0x832834fffffffffL; - H3Index edge = H3_EXPORT(getH3UnidirectionalEdge(origin, dest)); - - t_assert(0 != edge, "test edge is valid"); - t_assert(H3_EXPORT(h3Distance)(edge, origin) == 0, - "edge has zero distance to origin"); - t_assert(H3_EXPORT(h3Distance)(origin, edge) == 0, - "origin has zero distance to edge"); - - t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, - "edge has distance to destination"); - t_assert(H3_EXPORT(h3Distance)(edge, dest) == 1, - "destination has distance to edge"); - } -} diff --git a/src/apps/testapps/testH3Index.c b/src/apps/testapps/testH3Index.c index f6c3c8832..929eb9017 100644 --- a/src/apps/testapps/testH3Index.c +++ b/src/apps/testapps/testH3Index.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,137 +22,169 @@ #include #include #include + #include "constants.h" #include "h3Index.h" #include "test.h" #include "utility.h" SUITE(h3Index) { - TEST(geoToH3ExtremeCoordinates) { + TEST(latLngToCellExtremeCoordinates) { + H3Index h; // Check that none of these cause crashes. - GeoCoord g = {0, 1E45}; - H3_EXPORT(geoToH3)(&g, 14); + LatLng g = {0, 1E45}; + t_assertSuccess(H3_EXPORT(latLngToCell)(&g, 14, &h)); - GeoCoord g2 = {1E46, 1E45}; - H3_EXPORT(geoToH3)(&g2, 15); + LatLng g2 = {1E46, 1E45}; + t_assertSuccess(H3_EXPORT(latLngToCell)(&g2, 15, &h)); - GeoCoord g4; + LatLng g4; setGeoDegs(&g4, 2, -3E39); - H3_EXPORT(geoToH3)(&g4, 0); + t_assertSuccess(H3_EXPORT(latLngToCell)(&g4, 0, &h)); } - TEST(faceIjkToH3ExtremeCoordinates) { - FaceIJK fijk0I = {0, {3, 0, 0}}; - t_assert(_faceIjkToH3(&fijk0I, 0) == 0, "i out of bounds at res 0"); - FaceIJK fijk0J = {1, {0, 4, 0}}; - t_assert(_faceIjkToH3(&fijk0J, 0) == 0, "j out of bounds at res 0"); - FaceIJK fijk0K = {2, {2, 0, 5}}; - t_assert(_faceIjkToH3(&fijk0K, 0) == 0, "k out of bounds at res 0"); - - FaceIJK fijk1I = {3, {6, 0, 0}}; - t_assert(_faceIjkToH3(&fijk1I, 1) == 0, "i out of bounds at res 1"); - FaceIJK fijk1J = {4, {0, 7, 1}}; - t_assert(_faceIjkToH3(&fijk1J, 1) == 0, "j out of bounds at res 1"); - FaceIJK fijk1K = {5, {2, 0, 8}}; - t_assert(_faceIjkToH3(&fijk1K, 1) == 0, "k out of bounds at res 1"); - - FaceIJK fijk2I = {6, {18, 0, 0}}; - t_assert(_faceIjkToH3(&fijk2I, 2) == 0, "i out of bounds at res 2"); - FaceIJK fijk2J = {7, {0, 19, 1}}; - t_assert(_faceIjkToH3(&fijk2J, 2) == 0, "j out of bounds at res 2"); - FaceIJK fijk2K = {8, {2, 0, 20}}; - t_assert(_faceIjkToH3(&fijk2K, 2) == 0, "k out of bounds at res 2"); - } - - TEST(h3IsValidAtResolution) { + TEST(isValidCellAtResolution) { for (int i = 0; i <= MAX_H3_RES; i++) { - GeoCoord geoCoord = {0, 0}; - H3Index h3 = H3_EXPORT(geoToH3)(&geoCoord, i); + LatLng g = {0, 0}; + H3Index h3; + t_assertSuccess(H3_EXPORT(latLngToCell)(&g, i, &h3)); char failureMessage[BUFF_SIZE]; - sprintf(failureMessage, "h3IsValid failed on resolution %d", i); - t_assert(H3_EXPORT(h3IsValid)(h3), failureMessage); + sprintf(failureMessage, "isValidCell failed on resolution %d", i); + t_assert(H3_EXPORT(isValidCell)(h3), failureMessage); } } - TEST(h3IsValidDigits) { - GeoCoord geoCoord = {0, 0}; - H3Index h3 = H3_EXPORT(geoToH3)(&geoCoord, 1); + TEST(isValidCellDigits) { + LatLng g = {0, 0}; + H3Index h3; + t_assertSuccess(H3_EXPORT(latLngToCell)(&g, 1, &h3)); // Set a bit for an unused digit to something else. h3 ^= 1; - t_assert(!H3_EXPORT(h3IsValid)(h3), - "h3IsValid failed on invalid unused digits"); + t_assert(!H3_EXPORT(isValidCell)(h3), + "isValidCell failed on invalid unused digits"); } - TEST(h3IsValidBaseCell) { + TEST(isValidCellBaseCell) { for (int i = 0; i < NUM_BASE_CELLS; i++) { H3Index h = H3_INIT; - H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_MODE(h, H3_CELL_MODE); H3_SET_BASE_CELL(h, i); char failureMessage[BUFF_SIZE]; - sprintf(failureMessage, "h3IsValid failed on base cell %d", i); - t_assert(H3_EXPORT(h3IsValid)(h), failureMessage); + sprintf(failureMessage, "isValidCell failed on base cell %d", i); + t_assert(H3_EXPORT(isValidCell)(h), failureMessage); - t_assert(H3_EXPORT(h3GetBaseCell)(h) == i, + t_assert(H3_EXPORT(getBaseCellNumber)(h) == i, "failed to recover base cell"); } } - TEST(h3IsValidBaseCellInvalid) { + TEST(isValidCellBaseCellInvalid) { H3Index hWrongBaseCell = H3_INIT; - H3_SET_MODE(hWrongBaseCell, H3_HEXAGON_MODE); + H3_SET_MODE(hWrongBaseCell, H3_CELL_MODE); H3_SET_BASE_CELL(hWrongBaseCell, NUM_BASE_CELLS); - t_assert(!H3_EXPORT(h3IsValid)(hWrongBaseCell), - "h3IsValid failed on invalid base cell"); + t_assert(!H3_EXPORT(isValidCell)(hWrongBaseCell), + "isValidCell failed on invalid base cell"); } - TEST(h3IsValidWithMode) { + TEST(isValidCellWithMode) { for (int i = 0; i <= 0xf; i++) { H3Index h = H3_INIT; H3_SET_MODE(h, i); - char failureMessage[BUFF_SIZE]; - sprintf(failureMessage, "h3IsValid failed on mode %d", i); - t_assert(!H3_EXPORT(h3IsValid)(h) || i == 1, failureMessage); + if (i == H3_CELL_MODE) { + t_assert(H3_EXPORT(isValidCell)(h), + "isValidCell succeeds on valid mode"); + } else { + char failureMessage[BUFF_SIZE]; + sprintf(failureMessage, "isValidCell failed on mode %d", i); + t_assert(!H3_EXPORT(isValidCell)(h), failureMessage); + } } } + TEST(isValidCellReservedBits) { + for (int i = 0; i < 8; i++) { + H3Index h = H3_INIT; + H3_SET_MODE(h, H3_CELL_MODE); + H3_SET_RESERVED_BITS(h, i); + if (i == 0) { + t_assert(H3_EXPORT(isValidCell)(h), + "isValidCell succeeds on valid reserved bits"); + } else { + char failureMessage[BUFF_SIZE]; + sprintf(failureMessage, + "isValidCell failed on reserved bits %d", i); + t_assert(!H3_EXPORT(isValidCell)(h), failureMessage); + } + } + } + + TEST(isValidCellHighBit) { + H3Index h = H3_INIT; + H3_SET_MODE(h, H3_CELL_MODE); + H3_SET_HIGH_BIT(h, 1); + t_assert(!H3_EXPORT(isValidCell)(h), "isValidCell failed on high bit"); + } + TEST(h3BadDigitInvalid) { H3Index h = H3_INIT; // By default the first index digit is out of range. - H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_MODE(h, H3_CELL_MODE); H3_SET_RESOLUTION(h, 1); - t_assert(!H3_EXPORT(h3IsValid)(h), - "h3IsValid failed on too large digit"); + t_assert(!H3_EXPORT(isValidCell)(h), + "isValidCell failed on too large digit"); } TEST(h3DeletedSubsequenceInvalid) { H3Index h; // Create an index located in a deleted subsequence of a pentagon. setH3Index(&h, 1, 4, K_AXES_DIGIT); - t_assert(!H3_EXPORT(h3IsValid)(h), - "h3IsValid failed on deleted subsequence"); + t_assert(!H3_EXPORT(isValidCell)(h), + "isValidCell failed on deleted subsequence"); + } + + TEST(moreDeletedSubsequenceInvalid) { + H3Index p = 0x80c3fffffffffff; // res 0 pentagon + H3Index h; + + for (int res = 1; res <= 15; res++) { + t_assertSuccess(H3_EXPORT(cellToCenterChild)(p, res, &h)); + t_assert(H3_EXPORT(isValidCell)(h), "should be a valid pentagon"); + + for (int d = 0; d <= 6; d++) { + H3_SET_INDEX_DIGIT(h, res, d); + if (d == 1) { + t_assert(!H3_EXPORT(isValidCell)(h), + "fail on deleted subsequence"); + } else { + t_assert(H3_EXPORT(isValidCell)(h), "should be valid"); + } + } + } } TEST(h3ToString) { const size_t bufSz = 17; char buf[17] = {0}; - H3_EXPORT(h3ToString)(0x1234, buf, bufSz - 1); - // Buffer should be unmodified because the size was too small - t_assert(buf[0] == 0, "h3ToString failed on buffer too small"); - H3_EXPORT(h3ToString)(0xcafe, buf, bufSz); + t_assert( + H3_EXPORT(h3ToString)(0x1234, buf, bufSz - 1) == E_MEMORY_BOUNDS, + "h3ToString failed on buffer too small"); + t_assertSuccess(H3_EXPORT(h3ToString)(0xcafe, buf, bufSz)); t_assert(strcmp(buf, "cafe") == 0, "h3ToString failed to produce base 16 results"); - H3_EXPORT(h3ToString)(0xffffffffffffffff, buf, bufSz); + t_assertSuccess(H3_EXPORT(h3ToString)(0xffffffffffffffff, buf, bufSz)); t_assert(strcmp(buf, "ffffffffffffffff") == 0, "h3ToString failed on large input"); t_assert(buf[bufSz - 1] == 0, "didn't null terminate"); } TEST(stringToH3) { - t_assert(H3_EXPORT(stringToH3)("") == 0, "got an index from nothing"); - t_assert(H3_EXPORT(stringToH3)("**") == 0, "got an index from junk"); - t_assert( - H3_EXPORT(stringToH3)("ffffffffffffffff") == 0xffffffffffffffff, - "failed on large input"); + H3Index h3; + t_assert(H3_EXPORT(stringToH3)("", &h3) == E_FAILED, + "no index from nothing"); + t_assert(H3_EXPORT(stringToH3)("**", &h3) == E_FAILED, + "no index from junk"); + t_assertSuccess(H3_EXPORT(stringToH3)("ffffffffffffffff", &h3)); + t_assert(h3 == 0xffffffffffffffff, "got expected on large input"); } TEST(setH3Index) { @@ -160,7 +192,7 @@ SUITE(h3Index) { setH3Index(&h, 5, 12, 1); t_assert(H3_GET_RESOLUTION(h) == 5, "resolution as expected"); t_assert(H3_GET_BASE_CELL(h) == 12, "base cell as expected"); - t_assert(H3_GET_MODE(h) == H3_HEXAGON_MODE, "mode as expected"); + t_assert(H3_GET_MODE(h) == H3_CELL_MODE, "mode as expected"); for (int i = 1; i <= 5; i++) { t_assert(H3_GET_INDEX_DIGIT(h, i) == 1, "digit as expected"); } @@ -171,11 +203,12 @@ SUITE(h3Index) { t_assert(h == 0x85184927fffffffL, "index matches expected"); } - TEST(h3IsResClassIII) { - GeoCoord coord = {0, 0}; + TEST(isResClassIII) { + LatLng coord = {0, 0}; for (int i = 0; i <= MAX_H3_RES; i++) { - H3Index h = H3_EXPORT(geoToH3)(&coord, i); - t_assert(H3_EXPORT(h3IsResClassIII)(h) == isResClassIII(i), + H3Index h; + t_assertSuccess(H3_EXPORT(latLngToCell)(&coord, i, &h)); + t_assert(H3_EXPORT(isResClassIII)(h) == isResolutionClassIII(i), "matches existing definition"); } } diff --git a/src/apps/testapps/testH3IndexInternal.c b/src/apps/testapps/testH3IndexInternal.c new file mode 100644 index 000000000..c7ed6c5cb --- /dev/null +++ b/src/apps/testapps/testH3IndexInternal.c @@ -0,0 +1,54 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 functions for manipulating H3 indexes + * + * usage: `testH3IndexInternal` + */ + +#include +#include +#include + +#include "constants.h" +#include "h3Index.h" +#include "test.h" +#include "utility.h" + +SUITE(h3IndexInternal) { + TEST(faceIjkToH3ExtremeCoordinates) { + FaceIJK fijk0I = {0, {3, 0, 0}}; + t_assert(_faceIjkToH3(&fijk0I, 0) == 0, "i out of bounds at res 0"); + FaceIJK fijk0J = {1, {0, 4, 0}}; + t_assert(_faceIjkToH3(&fijk0J, 0) == 0, "j out of bounds at res 0"); + FaceIJK fijk0K = {2, {2, 0, 5}}; + t_assert(_faceIjkToH3(&fijk0K, 0) == 0, "k out of bounds at res 0"); + + FaceIJK fijk1I = {3, {6, 0, 0}}; + t_assert(_faceIjkToH3(&fijk1I, 1) == 0, "i out of bounds at res 1"); + FaceIJK fijk1J = {4, {0, 7, 1}}; + t_assert(_faceIjkToH3(&fijk1J, 1) == 0, "j out of bounds at res 1"); + FaceIJK fijk1K = {5, {2, 0, 8}}; + t_assert(_faceIjkToH3(&fijk1K, 1) == 0, "k out of bounds at res 1"); + + FaceIJK fijk2I = {6, {18, 0, 0}}; + t_assert(_faceIjkToH3(&fijk2I, 2) == 0, "i out of bounds at res 2"); + FaceIJK fijk2J = {7, {0, 19, 1}}; + t_assert(_faceIjkToH3(&fijk2J, 2) == 0, "j out of bounds at res 2"); + FaceIJK fijk2K = {8, {2, 0, 20}}; + t_assert(_faceIjkToH3(&fijk2K, 2) == 0, "k out of bounds at res 2"); + } +} diff --git a/src/apps/testapps/testH3IteratorsInternal.c b/src/apps/testapps/testH3IteratorsInternal.c new file mode 100644 index 000000000..094af3821 --- /dev/null +++ b/src/apps/testapps/testH3IteratorsInternal.c @@ -0,0 +1,129 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * @brief tests the H3 cell iterators + * + * usage: `testH3IteratorsInternal` + */ + +#include "h3api.h" +#include "iterators.h" +#include "test.h" + +static void test_number(int res) { + int64_t count = 0; + for (IterCellsResolution iter = iterInitRes(res); iter.h; + iterStepRes(&iter)) { + count++; + } + + int64_t expected; + t_assertSuccess(H3_EXPORT(getNumCells)(res, &expected)); + + t_assert(count == expected, + "expect the correct number of cells from the iterator"); +} + +static void test_valid(int res) { + for (IterCellsResolution iter = iterInitRes(res); iter.h; + iterStepRes(&iter)) { + t_assert(H3_EXPORT(isValidCell)(iter.h), "iterator cell is valid"); + } +} + +static void test_resolution(int res) { + for (IterCellsResolution iter = iterInitRes(res); iter.h; + iterStepRes(&iter)) { + t_assert(H3_EXPORT(getResolution)(iter.h) == res, + "iterator cell is the correct resolution"); + } +} + +// also verifies uniqueness of iterated cells +static void test_ordered(int res) { + IterCellsResolution iter = iterInitRes(res); + H3Index prev = iter.h; + iterStepRes(&iter); + + for (; iter.h; iterStepRes(&iter)) { + t_assert(prev < iter.h, + "cells should be iterated in order without duplicates"); + prev = iter.h; + } +} + +static void assert_is_null_iterator(IterCellsChildren iter) { + t_assert(iter.h == H3_NULL, "null iterator cell is H3_NULL"); + t_assert(iter._parentRes == -1, "null iterator parentRes is -1"); + t_assert(iter._skipDigit == -1, "null iterator skipDigit is -1"); +} + +SUITE(h3IteratorsInternal) { + TEST(iterator_setup_invalid) { + assert_is_null_iterator(iterInitBaseCellNum(-1, 0)); + assert_is_null_iterator(iterInitBaseCellNum(1000, 0)); + assert_is_null_iterator(iterInitBaseCellNum(0, -1)); + assert_is_null_iterator(iterInitBaseCellNum(0, 100)); + + assert_is_null_iterator(iterInitParent(0, 0)); + H3Index test = 0x85283473fffffff; + assert_is_null_iterator(iterInitParent(test, 0)); + assert_is_null_iterator(iterInitParent(test, 100)); + } + + TEST(null_iterator_base_cell) { + IterCellsChildren iter = iterInitBaseCellNum(-1, 0); + assert_is_null_iterator(iter); + iterStepChild(&iter); + t_assert(iter.h == H3_NULL, "null iterator returns null"); + } + + TEST(null_iterator_res) { + IterCellsResolution iter = iterInitRes(-1); + assert_is_null_iterator(iter._itC); + iterStepRes(&iter); + t_assert(iter.h == H3_NULL, "null iterator returns null"); + } + + TEST(iterator_cell_count) { + test_number(0); + test_number(1); + test_number(2); + test_number(3); + } + + TEST(iterator_cell_valid) { + test_valid(0); + test_valid(1); + test_valid(2); + test_valid(3); + } + + TEST(iterator_cell_resolution) { + test_resolution(0); + test_resolution(1); + test_resolution(2); + test_resolution(3); + } + + TEST(iterator_cell_ordered) { + test_ordered(0); + test_ordered(1); + test_ordered(2); + test_ordered(3); + } +} diff --git a/src/apps/testapps/testH3Line.c b/src/apps/testapps/testH3Line.c deleted file mode 100644 index 210054976..000000000 --- a/src/apps/testapps/testH3Line.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief tests H3 distance function. - * - * usage: `testH3Distance` - */ - -#include -#include -#include -#include "h3Index.h" -#include "h3api.h" -#include "localij.h" -#include "stackAlloc.h" -#include "test.h" -#include "utility.h" - -static const int MAX_DISTANCES[] = {1, 2, 5, 12, 19, 26}; - -/** - * Property-based testing of h3Line output - */ -static void h3Line_assertions(H3Index start, H3Index end) { - int sz = H3_EXPORT(h3LineSize)(start, end); - t_assert(sz > 0, "got valid size"); - STACK_ARRAY_CALLOC(H3Index, line, sz); - - int err = H3_EXPORT(h3Line)(start, end, line); - - t_assert(err == 0, "no error on line"); - t_assert(line[0] == start, "line starts with start index"); - t_assert(line[sz - 1] == end, "line ends with end index"); - - for (int i = 1; i < sz; i++) { - t_assert(H3_EXPORT(h3IsValid)(line[i]), "index is valid"); - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 1]), - "index is a neighbor of the previous index"); - if (i > 1) { - t_assert( - !H3_EXPORT(h3IndexesAreNeighbors)(line[i], line[i - 3]), - "index is not a neighbor of the index before the previous"); - } - } -} - -/** - * Tests for invalid h3Line input - */ -static void h3Line_invalid_assertions(H3Index start, H3Index end) { - int sz = H3_EXPORT(h3LineSize)(start, end); - t_assert(sz < 0, "line size marked as invalid"); - - H3Index* line = {0}; - int err = H3_EXPORT(h3Line)(start, end, line); - t_assert(err != 0, "line marked as invalid"); -} - -/** - * Test for lines from an index to all neighbors within a kRing - */ -static void h3Line_kRing_assertions(H3Index h3) { - int r = H3_GET_RESOLUTION(h3); - t_assert(r <= 5, "resolution supported by test function (kRing)"); - int maxK = MAX_DISTANCES[r]; - - int sz = H3_EXPORT(maxKringSize)(maxK); - STACK_ARRAY_CALLOC(H3Index, neighbors, sz); - H3_EXPORT(kRing)(h3, maxK, neighbors); - - if (H3_EXPORT(h3IsPentagon)(h3)) { - return; - } - - for (int i = 0; i < sz; i++) { - if (neighbors[i] == 0) { - continue; - } - int distance = H3_EXPORT(h3Distance)(h3, neighbors[i]); - if (distance >= 0) { - h3Line_assertions(h3, neighbors[i]); - } else { - h3Line_invalid_assertions(h3, neighbors[i]); - } - } -} - -SUITE(h3Line) { - TEST(h3Line_kRing) { - iterateAllIndexesAtRes(0, h3Line_kRing_assertions); - iterateAllIndexesAtRes(1, h3Line_kRing_assertions); - iterateAllIndexesAtRes(2, h3Line_kRing_assertions); - // Don't iterate all of res 3, to save time - iterateAllIndexesAtResPartial(3, h3Line_kRing_assertions, 6); - // Further resolutions aren't tested to save time. - } -} diff --git a/src/apps/testapps/testH3Memory.c b/src/apps/testapps/testH3Memory.c new file mode 100644 index 000000000..76687b17d --- /dev/null +++ b/src/apps/testapps/testH3Memory.c @@ -0,0 +1,259 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests main H3 core library memory management. + * + * usage: `testH3Memory` + */ + +#include +#include + +#include "h3Index.h" +#include "h3api.h" +#include "latLng.h" +#include "polyfill.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +// Whether to fail all allocations +static bool failAlloc = false; +// Actual number of malloc/calloc/realloc calls observed +static int actualAllocCalls = 0; +// Actual number of free calls observed +static int actualFreeCalls = 0; +// Set to non-zero to begin failing allocations after a certain number of calls +static int permittedAllocCalls = 0; + +void resetMemoryCounters(int permitted) { + failAlloc = false; + actualAllocCalls = 0; + actualFreeCalls = 0; + permittedAllocCalls = permitted; +} + +void *test_prefix_malloc(size_t size) { + actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } + if (failAlloc) { + return NULL; + } + return malloc(size); +} + +void *test_prefix_calloc(size_t num, size_t size) { + actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } + if (failAlloc) { + return NULL; + } + return calloc(num, size); +} + +void *test_prefix_realloc(void *ptr, size_t size) { + actualAllocCalls++; + if (permittedAllocCalls && actualAllocCalls > permittedAllocCalls) { + failAlloc = true; + } + if (failAlloc) { + return NULL; + } + return realloc(ptr, size); +} + +void test_prefix_free(void *ptr) { + actualFreeCalls++; + free(ptr); +} + +H3Index sunnyvale = 0x89283470c27ffff; +H3Index pentagon = 0x89080000003ffff; + +static LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; +static GeoLoop sfGeoLoop = {.numVerts = 6, .verts = sfVerts}; +static GeoPolygon sfGeoPolygon; + +SUITE(h3Memory) { + TEST(gridDisk) { + int k = 2; + int64_t hexCount; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &hexCount)); + H3Index *gridDiskOutput = calloc(hexCount, sizeof(H3Index)); + + resetMemoryCounters(0); + t_assertSuccess(H3_EXPORT(gridDisk)(sunnyvale, k, gridDiskOutput)); + t_assert(actualAllocCalls == 0, "gridDisk did not call alloc"); + t_assert(actualFreeCalls == 0, "gridDisk did not call free"); + + resetMemoryCounters(0); + t_assertSuccess(H3_EXPORT(gridDisk)(pentagon, k, gridDiskOutput)); + t_assert(actualAllocCalls == 1, "gridDisk called alloc"); + t_assert(actualFreeCalls == 1, "gridDisk called free"); + + resetMemoryCounters(0); + failAlloc = true; + memset(gridDiskOutput, 0, hexCount * sizeof(H3Index)); + t_assert( + H3_EXPORT(gridDisk)(pentagon, k, gridDiskOutput) == E_MEMORY_ALLOC, + "gridDisk returns E_MEMORY_ALLOC"); + t_assert(actualAllocCalls == 1, "gridDisk called alloc"); + t_assert(actualFreeCalls == 0, "gridDisk did not call free"); + + for (int64_t i = 0; i < hexCount; i++) { + t_assert(!gridDiskOutput[i], + "gridDisk did not produce output without alloc"); + } + + free(gridDiskOutput); + } + + TEST(compactCells) { + int k = 9; + int64_t hexCount; + t_assertSuccess(H3_EXPORT(maxGridDiskSize)(k, &hexCount)); + int64_t expectedCompactCount = 73; + + // Generate a set of hexagons to compact + H3Index *sunnyvaleExpanded = calloc(hexCount, sizeof(H3Index)); + resetMemoryCounters(0); + t_assertSuccess(H3_EXPORT(gridDisk)(sunnyvale, k, sunnyvaleExpanded)); + t_assert(actualAllocCalls == 0, "gridDisk did not call alloc"); + t_assert(actualFreeCalls == 0, "gridDisk did not call free"); + + H3Index *compressed = calloc(hexCount, sizeof(H3Index)); + + resetMemoryCounters(0); + failAlloc = true; + H3Error err = + H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == E_MEMORY_ALLOC, "malloc failed (1)"); + t_assert(actualAllocCalls == 1, "alloc called once"); + t_assert(actualFreeCalls == 0, "free not called"); + + resetMemoryCounters(1); + err = H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == E_MEMORY_ALLOC, "malloc failed (2)"); + t_assert(actualAllocCalls == 2, "alloc called twice"); + t_assert(actualFreeCalls == 1, "free called once"); + + resetMemoryCounters(2); + err = H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == E_MEMORY_ALLOC, "malloc failed (3)"); + t_assert(actualAllocCalls == 3, "alloc called three times"); + t_assert(actualFreeCalls == 2, "free called twice"); + + resetMemoryCounters(3); + err = H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == E_MEMORY_ALLOC, "compactCells failed (4)"); + t_assert(actualAllocCalls == 4, "alloc called four times"); + t_assert(actualFreeCalls == 3, "free called three times"); + + resetMemoryCounters(4); + err = H3_EXPORT(compactCells)(sunnyvaleExpanded, compressed, hexCount); + t_assert(err == E_SUCCESS, "compact using successful malloc"); + t_assert(actualAllocCalls == 4, "alloc called four times"); + t_assert(actualFreeCalls == 4, "free called four times"); + + int64_t count = 0; + for (int64_t i = 0; i < hexCount; i++) { + if (compressed[i] != 0) { + count++; + } + } + t_assert(count == expectedCompactCount, "got expected compact count"); + + free(compressed); + free(sunnyvaleExpanded); + } + + TEST(polygonToCells) { + sfGeoPolygon.geoloop = sfGeoLoop; + sfGeoPolygon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&sfGeoPolygon, 9, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + resetMemoryCounters(0); + failAlloc = true; + H3Error err = H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons); + t_assert(err == E_MEMORY_ALLOC, "polygonToCells failed (1)"); + t_assert(actualAllocCalls == 1, "alloc called once"); + t_assert(actualFreeCalls == 0, "free not called"); + + resetMemoryCounters(1); + err = H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons); + t_assert(err == E_MEMORY_ALLOC, "polygonToCells failed (2)"); + t_assert(actualAllocCalls == 2, "alloc called twice"); + t_assert(actualFreeCalls == 1, "free called once"); + + resetMemoryCounters(2); + err = H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons); + t_assert(err == E_MEMORY_ALLOC, "polygonToCells failed (3)"); + t_assert(actualAllocCalls == 3, "alloc called three times"); + t_assert(actualFreeCalls == 2, "free called twice"); + + resetMemoryCounters(3); + err = H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons); + t_assert(err == E_SUCCESS, "polygonToCells succeeded (4)"); + t_assert(actualAllocCalls == 3, "alloc called three times"); + t_assert(actualFreeCalls == 3, "free called three times"); + + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + t_assert(actualNumIndexes == 1253, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsExperimental) { + sfGeoPolygon.geoloop = sfGeoLoop; + sfGeoPolygon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + resetMemoryCounters(0); + failAlloc = true; + H3Error err = H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons); + t_assert(err == E_MEMORY_ALLOC, + "polygonToCellsExperimental failed (1)"); + t_assert(actualAllocCalls == 1, "alloc called once"); + t_assert(actualFreeCalls == 0, "free not called"); + + resetMemoryCounters(1); + err = H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons); + t_assert(err == E_SUCCESS, "polygonToCellsExperimental succeeded (1)"); + t_assert(actualAllocCalls == 1, "alloc called one time"); + t_assert(actualFreeCalls == 1, "free called one time"); + + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + t_assert(actualNumIndexes == 1253, + "got expected polygonToCellsExperimental size"); + free(hexagons); + } +} diff --git a/src/apps/testapps/testH3NeighborRotations.c b/src/apps/testapps/testH3NeighborRotations.c index 50505f6d6..da8e95797 100644 --- a/src/apps/testapps/testH3NeighborRotations.c +++ b/src/apps/testapps/testH3NeighborRotations.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,13 @@ * limitations under the License. */ /** @file - * @brief tests hexRange vs. _kRingInternal. + * @brief tests gridDiskUnsafe vs. gridDiskDistancesSafe. * * usage: `testH3NeighborRotations resolution [maxK]` * - * All indexes at `resolution` will be tested. For each index, kRing + * All indexes at `resolution` will be tested. For each index, gridDisk * of `k` up to `maxK` (default 5) will be run. Standard out will show - * the number of cases that returned each return code from hexRange. + * the number of cases that returned each return code from gridDiskUnsafe. * * If `FAILED` is present in the output, the numbers following it * are the number of test cases that failed validation. @@ -29,6 +29,7 @@ #include #include #include + #include "algos.h" #include "baseCells.h" #include "h3Index.h" @@ -37,7 +38,7 @@ /** * @brief testH3NeighborRotations validation result * - * Number of cases with the given return code from hexRange. + * Number of cases with the given return code from gridDiskUnsafe. */ typedef struct { int ret0; @@ -47,21 +48,24 @@ typedef struct { int ret2; } TestOutput; -void doCell(H3Index h, int maxK, TestOutput* testOutput) { +void doCell(H3Index h, int maxK, TestOutput *testOutput) { for (int k = 0; k < maxK; k++) { - int maxSz = H3_EXPORT(maxKringSize)(k); - H3Index* kRingInternalOutput = calloc(sizeof(H3Index), maxSz); - H3Index* hexRangeOutput = calloc(sizeof(H3Index), maxSz); - int* kRingInternalDistances = calloc(sizeof(int), maxSz); - - _kRingInternal(h, k, kRingInternalOutput, kRingInternalDistances, maxSz, - 0); - int hexRangeFailed = H3_EXPORT(hexRange)(h, k, hexRangeOutput); - - if (hexRangeFailed == 2) { + int64_t maxSz; + H3_EXPORT(maxGridDiskSize)(k, &maxSz); + H3Index *gridDiskInternalOutput = calloc(sizeof(H3Index), maxSz); + H3Index *gridDiskUnsafeOutput = calloc(sizeof(H3Index), maxSz); + int *gridDiskInternalDistances = calloc(sizeof(int), maxSz); + + H3_EXPORT(gridDiskDistancesSafe) + (h, k, gridDiskInternalOutput, gridDiskInternalDistances); + H3Error gridDiskUnsafeFailed = + H3_EXPORT(gridDiskUnsafe)(h, k, gridDiskUnsafeOutput); + + if (gridDiskUnsafeFailed == E_FAILED) { + // TODO: Unreachable testOutput->ret2++; continue; - } else if (hexRangeFailed == 0) { + } else if (gridDiskUnsafeFailed == E_SUCCESS) { testOutput->ret0++; int startIdx = 0; // i is the current ring number @@ -71,12 +75,12 @@ void doCell(H3Index h, int maxK, TestOutput* testOutput) { if (i == 0) n = 1; for (int ii = 0; ii < n; ii++) { - H3Index h2 = hexRangeOutput[ii + startIdx]; + H3Index h2 = gridDiskUnsafeOutput[ii + startIdx]; int found = 0; - for (int iii = 0; iii < maxSz; iii++) { - if (kRingInternalOutput[iii] == h2 && - kRingInternalDistances[iii] == i) { + for (int64_t iii = 0; iii < maxSz; iii++) { + if (gridDiskInternalOutput[iii] == h2 && + gridDiskInternalDistances[iii] == i) { found = 1; break; } @@ -93,18 +97,18 @@ void doCell(H3Index h, int maxK, TestOutput* testOutput) { startIdx += n; } - } else if (hexRangeFailed == 1) { + } else if (gridDiskUnsafeFailed == E_PENTAGON) { testOutput->ret1++; int foundPent = 0; - for (int i = 0; i < maxSz; i++) { - if (H3_EXPORT(h3IsPentagon)(kRingInternalOutput[i])) { + for (int64_t i = 0; i < maxSz; i++) { + if (H3_EXPORT(isPentagon)(gridDiskInternalOutput[i])) { foundPent = 1; break; } } if (!foundPent) { - // Failed to find the pentagon that caused hexRange + // Failed to find the pentagon that caused gridDiskUnsafe // to fail. printf("NO C k=%d h=%" PRIx64 "\n", k, h); testOutput->ret1ValidationFailures++; @@ -112,14 +116,14 @@ void doCell(H3Index h, int maxK, TestOutput* testOutput) { } } - free(kRingInternalOutput); - free(hexRangeOutput); - free(kRingInternalDistances); + free(gridDiskInternalOutput); + free(gridDiskUnsafeOutput); + free(gridDiskInternalDistances); } } void recursiveH3IndexToGeo(H3Index h, int res, int maxK, - TestOutput* testOutput) { + TestOutput *testOutput) { for (int d = 0; d < 7; d++) { H3_SET_INDEX_DIGIT(h, res, d); @@ -138,7 +142,7 @@ void recursiveH3IndexToGeo(H3Index h, int res, int maxK, } } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { // check command line args if (argc != 2 && argc != 3) { fprintf(stderr, "usage: %s resolution [maxK]\n", argv[0]); @@ -158,7 +162,7 @@ int main(int argc, char* argv[]) { // generate the test cases for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { H3Index rootCell = H3_INIT; - H3_SET_MODE(rootCell, H3_HEXAGON_MODE); + H3_SET_MODE(rootCell, H3_CELL_MODE); H3_SET_BASE_CELL(rootCell, bc); if (res == 0) { diff --git a/src/apps/testapps/testH3SetToVertexGraph.c b/src/apps/testapps/testH3SetToVertexGraphInternal.c similarity index 84% rename from src/apps/testapps/testH3SetToVertexGraph.c rename to src/apps/testapps/testH3SetToVertexGraphInternal.c index 9d6af7363..499fbf089 100644 --- a/src/apps/testapps/testH3SetToVertexGraph.c +++ b/src/apps/testapps/testH3SetToVertexGraphInternal.c @@ -15,15 +15,16 @@ */ #include + #include "algos.h" #include "test.h" #include "utility.h" -SUITE(h3SetToVertexGraph) { +SUITE(h3SetToVertexGraphInternal) { TEST(empty) { VertexGraph graph; - h3SetToVertexGraph(NULL, 0, &graph); + t_assertSuccess(h3SetToVertexGraph(NULL, 0, &graph)); t_assert(graph.size == 0, "No edges added to graph"); @@ -35,7 +36,7 @@ SUITE(h3SetToVertexGraph) { H3Index set[] = {0x890dab6220bffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == 6, "All edges of one hex added to graph"); destroyVertexGraph(&graph); @@ -46,7 +47,7 @@ SUITE(h3SetToVertexGraph) { H3Index set[] = {0x8928308291bffff, 0x89283082943ffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == 12, "All edges of two non-contiguous hexes added to graph"); @@ -58,7 +59,7 @@ SUITE(h3SetToVertexGraph) { H3Index set[] = {0x8928308291bffff, 0x89283082957ffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == 10, "All edges except 2 shared added to graph"); destroyVertexGraph(&graph); @@ -69,7 +70,7 @@ SUITE(h3SetToVertexGraph) { H3Index set[] = {0x894cc5365afffff, 0x894cc536537ffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == 12, "All edges except 2 shared added to graph"); destroyVertexGraph(&graph); @@ -81,7 +82,7 @@ SUITE(h3SetToVertexGraph) { 0x8928308289bffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == 3 * 4, "All edges except 6 shared added to graph"); @@ -95,7 +96,7 @@ SUITE(h3SetToVertexGraph) { 0x8928308288fffff, 0x89283082883ffff}; int numHexes = ARRAY_SIZE(set); - h3SetToVertexGraph(set, numHexes, &graph); + t_assertSuccess(h3SetToVertexGraph(set, numHexes, &graph)); t_assert(graph.size == (6 * 3) + 6, "All outer edges and inner hole edges added to graph"); diff --git a/src/apps/testapps/testH3ToChildren.c b/src/apps/testapps/testH3ToChildren.c deleted file mode 100644 index 6d9cb6454..000000000 --- a/src/apps/testapps/testH3ToChildren.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "h3Index.h" -#include "test.h" - -#define PADDED_COUNT 10 - -static void verifyCountAndUniqueness(H3Index* children, int paddedCount, - int expectedCount) { - int numFound = 0; - for (int i = 0; i < paddedCount; i++) { - H3Index currIndex = children[i]; - if (currIndex == 0) { - continue; - } - numFound++; - // verify uniqueness - int indexSeen = 0; - for (int j = i + 1; j < paddedCount; j++) { - if (children[j] == currIndex) { - indexSeen++; - } - } - t_assert(indexSeen == 0, "index was seen only once"); - } - t_assert(numFound == expectedCount, "got expected number of children"); -} - -SUITE(h3ToChildren) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; - H3Index sfHex8 = H3_EXPORT(geoToH3)(&sf, 8); - - TEST(oneResStep) { - const int expectedCount = 7; - const int paddedCount = 10; - - H3Index sfHex9s[PADDED_COUNT] = {0}; - H3_EXPORT(h3ToChildren)(sfHex8, 9, sfHex9s); - - GeoCoord center; - H3_EXPORT(h3ToGeo)(sfHex8, ¢er); - H3Index sfHex9_0 = H3_EXPORT(geoToH3)(¢er, 9); - - int numFound = 0; - - // Find the center - for (int i = 0; i < paddedCount; i++) { - if (sfHex9_0 == sfHex9s[i]) { - numFound++; - } - } - t_assert(numFound == 1, "found the center hex"); - - // Get the neighbor hexagons by averaging the center point and outer - // points then query for those independently - - GeoBoundary outside; - H3_EXPORT(h3ToGeoBoundary)(sfHex8, &outside); - for (int i = 0; i < outside.numVerts; i++) { - GeoCoord avg = {0}; - avg.lat = (outside.verts[i].lat + center.lat) / 2; - avg.lon = (outside.verts[i].lon + center.lon) / 2; - H3Index avgHex9 = H3_EXPORT(geoToH3)(&avg, 9); - for (int j = 0; j < expectedCount; j++) { - if (avgHex9 == sfHex9s[j]) { - numFound++; - } - } - } - - t_assert(numFound == expectedCount, "found all expected children"); - } - - TEST(multipleResSteps) { - // Lots of children. Will just confirm number and uniqueness - const int expectedCount = 49; - const int paddedCount = 60; - - H3Index* children = calloc(paddedCount, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(sfHex8, 10, children); - - verifyCountAndUniqueness(children, paddedCount, expectedCount); - free(children); - } - - TEST(sameRes) { - const int expectedCount = 1; - const int paddedCount = 7; - - H3Index* children = calloc(paddedCount, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(sfHex8, 8, children); - - verifyCountAndUniqueness(children, paddedCount, expectedCount); - free(children); - } - - TEST(childResTooHigh) { - const int expectedCount = 0; - const int paddedCount = 7; - - H3Index* children = calloc(paddedCount, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(sfHex8, 7, children); - - verifyCountAndUniqueness(children, paddedCount, expectedCount); - free(children); - } - - TEST(pentagonChildren) { - H3Index pentagon; - setH3Index(&pentagon, 1, 4, 0); - - const int expectedCount = (5 * 7) + 6; - const int paddedCount = H3_EXPORT(maxH3ToChildrenSize)(pentagon, 3); - - H3Index* children = calloc(paddedCount, sizeof(H3Index)); - H3_EXPORT(h3ToChildren)(sfHex8, 10, children); - H3_EXPORT(h3ToChildren)(pentagon, 3, children); - - verifyCountAndUniqueness(children, paddedCount, expectedCount); - free(children); - } -} diff --git a/src/apps/testapps/testH3ToGeoBoundary.c b/src/apps/testapps/testH3ToGeoBoundary.c deleted file mode 100644 index 11394dd1f..000000000 --- a/src/apps/testapps/testH3ToGeoBoundary.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file - * @brief tests H3 function `h3ToGeoBoundary` - * - * usage: `testH3ToGeoBoundary` - * - * The program reads H3 indexes and associated cell boundaries from - * stdin until EOF is encountered. For each input cell, the program - * uses `h3ToGeoBoundary` to generate the boundary and then compares that - * generated boundary to the original input boundary. - */ - -#include -#include -#include -#include "baseCells.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "test.h" -#include "utility.h" - -int main(int argc, char* argv[]) { - // check command line args - if (argc > 1) { - fprintf(stderr, "usage: %s\n", argv[0]); - exit(1); - } - - // process the indexes on stdin - char buff[BUFF_SIZE]; - while (1) { - // get an index from stdin - if (!fgets(buff, BUFF_SIZE, stdin)) { - if (feof(stdin)) - break; - else - error("reading input H3 index from stdin"); - } - - H3Index h3 = H3_EXPORT(stringToH3)(buff); - - GeoBoundary b; - readBoundary(stdin, &b); - - t_assertBoundary(h3, &b); - } -} diff --git a/src/apps/testapps/testH3UniEdge.c b/src/apps/testapps/testH3UniEdge.c deleted file mode 100644 index caf00fe8b..000000000 --- a/src/apps/testapps/testH3UniEdge.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file testH3UniEdge.c - * @brief Tests functions for manipulating unidirectional edge H3Indexes - * - * usage: `testH3UniEdge` - */ - -#include -#include "constants.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "stackAlloc.h" -#include "test.h" - -// Fixtures -static GeoCoord sfGeo = {0.659966917655, -2.1364398519396}; - -SUITE(h3UniEdge) { - TEST(h3IndexesAreNeighbors) { - H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); - H3_EXPORT(hexRing)(sf, 1, ring); - - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sf) == 0, - "an index does not neighbor itself"); - - int neighbors = 0; - for (int i = 0; i < H3_EXPORT(maxKringSize)(1); i++) { - if (ring[i] != 0 && H3_EXPORT(h3IndexesAreNeighbors)(sf, ring[i])) { - neighbors++; - } - } - t_assert(neighbors == 6, - "got the expected number of neighbors from a k-ring of 1"); - - STACK_ARRAY_CALLOC(H3Index, largerRing, H3_EXPORT(maxKringSize)(2)); - H3_EXPORT(hexRing)(sf, 2, largerRing); - - neighbors = 0; - for (int i = 0; i < H3_EXPORT(maxKringSize)(2); i++) { - if (largerRing[i] != 0 && - H3_EXPORT(h3IndexesAreNeighbors)(sf, largerRing[i])) { - neighbors++; - } - } - t_assert(neighbors == 0, - "got no neighbors, as expected, from a k-ring of 2"); - - H3Index sfBroken = sf; - H3_SET_MODE(sfBroken, H3_UNIEDGE_MODE); - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sfBroken) == 0, - "broken H3Indexes can't be neighbors"); - - H3Index sfBigger = H3_EXPORT(geoToH3)(&sfGeo, 7); - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(sf, sfBigger) == 0, - "hexagons of different resolution can't be neighbors"); - - t_assert(H3_EXPORT(h3IndexesAreNeighbors)(ring[2], ring[1]) == 1, - "hexagons in a ring are neighbors"); - } - - TEST(getH3UnidirectionalEdgeAndFriends) { - H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); - H3_EXPORT(hexRing)(sf, 1, ring); - H3Index sf2 = ring[0]; - - H3Index edge = H3_EXPORT(getH3UnidirectionalEdge)(sf, sf2); - t_assert(sf == H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(edge), - "can retrieve the origin from the edge"); - t_assert( - sf2 == H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(edge), - "can retrieve the destination from the edge"); - - H3Index originDestination[2] = {0}; - H3_EXPORT(getH3IndexesFromUnidirectionalEdge)(edge, originDestination); - t_assert(originDestination[0] == sf, - "got the origin first in the pair request"); - t_assert(originDestination[1] == sf2, - "got the destination last in the pair request"); - - STACK_ARRAY_CALLOC(H3Index, largerRing, H3_EXPORT(maxKringSize)(2)); - H3_EXPORT(hexRing)(sf, 2, largerRing); - H3Index sf3 = largerRing[0]; - - H3Index notEdge = H3_EXPORT(getH3UnidirectionalEdge)(sf, sf3); - t_assert(notEdge == 0, "Non-neighbors can't have edges"); - } - - TEST(getOriginH3IndexFromUnidirectionalEdgeBadInput) { - H3Index hexagon = 0x891ea6d6533ffff; - - t_assert( - H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(hexagon) == 0, - "getting the origin from a hexagon index returns 0"); - t_assert(H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(0) == 0, - "getting the origin from a null index returns 0"); - } - - TEST(getDestinationH3IndexFromUnidirectionalEdge) { - H3Index hexagon = 0x891ea6d6533ffff; - - t_assert(H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)( - hexagon) == 0, - "getting the destination from a hexagon index returns 0"); - t_assert(H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(0) == 0, - "getting the destination from a null index returns 0"); - } - - TEST(getH3UnidirectionalEdgeFromPentagon) { - H3Index pentagon; - setH3Index(&pentagon, 0, 4, 0); - H3Index adjacent; - setH3Index(&adjacent, 0, 8, 0); - - H3Index edge = H3_EXPORT(getH3UnidirectionalEdge)(pentagon, adjacent); - t_assert(edge != 0, "Produces a valid edge"); - } - - TEST(h3UnidirectionalEdgeIsValid) { - H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, ring, H3_EXPORT(maxKringSize)(1)); - H3_EXPORT(hexRing)(sf, 1, ring); - H3Index sf2 = ring[0]; - - H3Index edge = H3_EXPORT(getH3UnidirectionalEdge)(sf, sf2); - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(edge) == 1, - "edges validate correctly"); - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(sf) == 0, - "hexagons do not validate"); - - H3Index fakeEdge = sf; - H3_SET_MODE(fakeEdge, H3_UNIEDGE_MODE); - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(fakeEdge) == 0, - "edges without an edge specified don't work"); - - H3Index pentagon = 0x821c07fffffffff; - H3Index goodPentagonalEdge = pentagon; - H3_SET_MODE(goodPentagonalEdge, H3_UNIEDGE_MODE); - H3_SET_RESERVED_BITS(goodPentagonalEdge, 2); - t_assert( - H3_EXPORT(h3UnidirectionalEdgeIsValid)(goodPentagonalEdge) == 1, - "pentagonal edge validates"); - - H3Index badPentagonalEdge = goodPentagonalEdge; - H3_SET_RESERVED_BITS(badPentagonalEdge, 1); - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(badPentagonalEdge) == 0, - "missing pentagonal edge does not validate"); - } - - TEST(getH3UnidirectionalEdgesFromHexagon) { - H3Index sf = H3_EXPORT(geoToH3)(&sfGeo, 9); - STACK_ARRAY_CALLOC(H3Index, edges, 6); - H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(sf, edges); - - for (int i = 0; i < 6; i++) { - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(edges[i]) == 1, - "edge is an edge"); - t_assert(sf == H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)( - edges[i]), - "origin is correct"); - t_assert( - sf != H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)( - edges[i]), - "destination is not origin"); - } - } - - TEST(getH3UnidirectionalEdgesFromPentagon) { - H3Index pentagon = 0x821c07fffffffff; - STACK_ARRAY_CALLOC(H3Index, edges, 6); - H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(pentagon, edges); - - int missingEdgeCount = 0; - for (int i = 0; i < 6; i++) { - if (edges[i] == 0) { - missingEdgeCount++; - } else { - t_assert(H3_EXPORT(h3UnidirectionalEdgeIsValid)(edges[i]) == 1, - "edge is an edge"); - t_assert(pentagon == - H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)( - edges[i]), - "origin is correct"); - t_assert( - pentagon != - H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)( - edges[i]), - "destination is not origin"); - } - } - t_assert(missingEdgeCount == 1, - "Only one edge was deleted for the pentagon"); - } - - TEST(getH3UnidirectionalEdgeBoundary) { - H3Index sf; - GeoBoundary boundary; - GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); - - const int expectedVertices[][2] = {{3, 4}, {1, 2}, {2, 3}, - {5, 0}, {4, 5}, {0, 1}}; - - // TODO: The current implementation relies on lat/lon comparison and - // fails on resolutions finer than 12 - for (int res = 0; res < 13; res++) { - sf = H3_EXPORT(geoToH3)(&sfGeo, res); - H3_EXPORT(h3ToGeoBoundary)(sf, &boundary); - H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(sf, edges); - - for (int i = 0; i < 6; i++) { - H3_EXPORT(getH3UnidirectionalEdgeBoundary) - (edges[i], &edgeBoundary); - t_assert(edgeBoundary.numVerts == 2, - "Got the expected number of vertices back"); - for (int j = 0; j < edgeBoundary.numVerts; j++) { - t_assert( - geoAlmostEqual(&edgeBoundary.verts[j], - &boundary.verts[expectedVertices[i][j]]), - "Got expected vertex"); - } - } - } - } - - TEST(getH3UnidirectionalEdgeBoundaryPentagonClassIII) { - H3Index pentagon; - GeoBoundary boundary; - GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); - - const int expectedVertices[][3] = {{-1, -1, -1}, {2, 3, 4}, {4, 5, 6}, - {8, 9, 0}, {6, 7, 8}, {0, 1, 2}}; - - // TODO: The current implementation relies on lat/lon comparison and - // fails on resolutions finer than 12 - for (int res = 1; res < 13; res += 2) { - setH3Index(&pentagon, res, 24, 0); - H3_EXPORT(h3ToGeoBoundary)(pentagon, &boundary); - H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(pentagon, edges); - - int missingEdgeCount = 0; - for (int i = 0; i < 6; i++) { - if (edges[i] == 0) { - missingEdgeCount++; - } else { - H3_EXPORT(getH3UnidirectionalEdgeBoundary) - (edges[i], &edgeBoundary); - t_assert(edgeBoundary.numVerts == 3, - "Got the expected number of vertices back for a " - "Class III " - "pentagon"); - for (int j = 0; j < edgeBoundary.numVerts; j++) { - t_assert(geoAlmostEqual( - &edgeBoundary.verts[j], - &boundary.verts[expectedVertices[i][j]]), - "Got expected vertex"); - } - } - } - t_assert(missingEdgeCount == 1, - "Only one edge was deleted for the pentagon"); - } - } - - TEST(getH3UnidirectionalEdgeBoundaryPentagonClassII) { - H3Index pentagon; - GeoBoundary boundary; - GeoBoundary edgeBoundary; - STACK_ARRAY_CALLOC(H3Index, edges, 6); - - const int expectedVertices[][3] = {{-1, -1}, {1, 2}, {2, 3}, - {4, 0}, {3, 4}, {0, 1}}; - - // TODO: The current implementation relies on lat/lon comparison and - // fails on resolutions finer than 12 - for (int res = 0; res < 12; res += 2) { - setH3Index(&pentagon, res, 24, 0); - H3_EXPORT(h3ToGeoBoundary)(pentagon, &boundary); - H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(pentagon, edges); - - int missingEdgeCount = 0; - for (int i = 0; i < 6; i++) { - if (edges[i] == 0) { - missingEdgeCount++; - } else { - H3_EXPORT(getH3UnidirectionalEdgeBoundary) - (edges[i], &edgeBoundary); - t_assert(edgeBoundary.numVerts == 2, - "Got the expected number of vertices back for a " - "Class II " - "pentagon"); - for (int j = 0; j < edgeBoundary.numVerts; j++) { - t_assert(geoAlmostEqual( - &edgeBoundary.verts[j], - &boundary.verts[expectedVertices[i][j]]), - "Got expected vertex"); - } - } - } - t_assert(missingEdgeCount == 1, - "Only one edge was deleted for the pentagon"); - } - } -} diff --git a/src/apps/testapps/testLatLng.c b/src/apps/testapps/testLatLng.c new file mode 100644 index 000000000..e8bfd7002 --- /dev/null +++ b/src/apps/testapps/testLatLng.c @@ -0,0 +1,161 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file testLatLng.c + * @brief Tests geographic coordinate functions + * + * usage: `testLatLng` + */ + +#include +#include + +#include "constants.h" +#include "h3api.h" +#include "latLng.h" +#include "test.h" +#include "utility.h" + +/** + * Test a function for all resolutions, where the value should be decreasing as + * resolution increases. + * + * @param function + * @param message + */ +static void testDecreasingFunction(H3Error (*function)(int, double *), + const char *message) { + double last = 0; + double next; + for (int i = MAX_H3_RES; i >= 0; i--) { + t_assertSuccess(function(i, &next)); + t_assert(next > last, message); + last = next; + } +} + +SUITE(latLng) { + TEST(radsToDegs) { + double originalRads = 1; + double degs = H3_EXPORT(radsToDegs)(originalRads); + double rads = H3_EXPORT(degsToRads)(degs); + t_assert(fabs(rads - originalRads) < EPSILON_RAD, + "radsToDegs/degsToRads invertible"); + } + + TEST(distanceRads) { + LatLng p1; + setGeoDegs(&p1, 10, 10); + LatLng p2; + setGeoDegs(&p2, 0, 10); + + // TODO: Epsilon is relatively large + t_assert( + H3_EXPORT(greatCircleDistanceRads)(&p1, &p1) < EPSILON_RAD * 1000, + "0 distance as expected"); + t_assert(fabs(H3_EXPORT(greatCircleDistanceRads)(&p1, &p2) - + H3_EXPORT(degsToRads)(10)) < EPSILON_RAD * 1000, + "distance along longitude as expected"); + } + + TEST(distanceRads_wrappedLongitude) { + const LatLng negativeLongitude = {.lat = 0, .lng = -(M_PI + M_PI_2)}; + const LatLng zero = {.lat = 0, .lng = 0}; + + t_assert(fabs(M_PI_2 - H3_EXPORT(greatCircleDistanceRads)( + &negativeLongitude, &zero)) < EPSILON_RAD, + "Distance with wrapped longitude"); + t_assert(fabs(M_PI_2 - H3_EXPORT(greatCircleDistanceRads)( + &zero, &negativeLongitude)) < EPSILON_RAD, + "Distance with wrapped longitude and swapped arguments"); + } + + TEST(doubleConstants) { + // Simple checks for ordering of values + testDecreasingFunction(H3_EXPORT(getHexagonAreaAvgKm2), + "getHexagonAreaAvgKm2 ordering"); + testDecreasingFunction(H3_EXPORT(getHexagonAreaAvgM2), + "getHexagonAreaAvgM2 ordering"); + testDecreasingFunction(H3_EXPORT(getHexagonEdgeLengthAvgKm), + "getHexagonEdgeLengthAvgKm ordering"); + testDecreasingFunction(H3_EXPORT(getHexagonEdgeLengthAvgM), + "getHexagonEdgeLengthAvgM ordering"); + } + + TEST(doubleConstantsErrors) { + double out; + t_assert(H3_EXPORT(getHexagonAreaAvgKm2)(-1, &out) == E_RES_DOMAIN, + "getHexagonAreaAvgKm2 resolution negative"); + t_assert(H3_EXPORT(getHexagonAreaAvgKm2)(16, &out) == E_RES_DOMAIN, + "getHexagonAreaAvgKm2 resolution too high"); + t_assert(H3_EXPORT(getHexagonAreaAvgM2)(-1, &out) == E_RES_DOMAIN, + "getHexagonAreaAvgM2 resolution negative"); + t_assert(H3_EXPORT(getHexagonAreaAvgM2)(16, &out) == E_RES_DOMAIN, + "getHexagonAreaAvgM2 resolution too high"); + t_assert(H3_EXPORT(getHexagonEdgeLengthAvgKm)(-1, &out) == E_RES_DOMAIN, + "getHexagonEdgeLengthAvgKm resolution negative"); + t_assert(H3_EXPORT(getHexagonEdgeLengthAvgKm)(16, &out) == E_RES_DOMAIN, + "getHexagonEdgeLengthAvgKm resolution too high"); + t_assert(H3_EXPORT(getHexagonEdgeLengthAvgM)(-1, &out) == E_RES_DOMAIN, + "getHexagonEdgeLengthAvgM resolution negative"); + t_assert(H3_EXPORT(getHexagonEdgeLengthAvgM)(16, &out) == E_RES_DOMAIN, + "getHexagonEdgeLengthAvgM resolution too high"); + } + + TEST(intConstants) { + // Simple checks for ordering of values + int64_t last = 0; + int64_t next; + for (int i = 0; i <= MAX_H3_RES; i++) { + t_assertSuccess(H3_EXPORT(getNumCells)(i, &next)); + t_assert(next > last, "getNumCells ordering"); + last = next; + } + } + + TEST(intConstantsErrors) { + int64_t out; + t_assert(H3_EXPORT(getNumCells)(-1, &out) == E_RES_DOMAIN, + "getNumCells resolution negative"); + t_assert(H3_EXPORT(getNumCells)(16, &out) == E_RES_DOMAIN, + "getNumCells resolution too high"); + } + + TEST(numHexagons) { + // Test numHexagon counts of the number of *cells* at each resolution + static const int64_t expected[] = {122L, + 842L, + 5882L, + 41162L, + 288122L, + 2016842L, + 14117882L, + 98825162L, + 691776122L, + 4842432842L, + 33897029882L, + 237279209162L, + 1660954464122L, + 11626681248842L, + 81386768741882L, + 569707381193162L}; + + for (int r = 0; r <= MAX_H3_RES; r++) { + int64_t num; + t_assertSuccess(H3_EXPORT(getNumCells)(r, &num)); + t_assert(num == expected[r], "incorrect numHexagons count"); + } + } +} diff --git a/src/apps/testapps/testGeoCoord.c b/src/apps/testapps/testLatLngInternal.c similarity index 62% rename from src/apps/testapps/testGeoCoord.c rename to src/apps/testapps/testLatLngInternal.c index 34e4efc5d..fc8535c47 100644 --- a/src/apps/testapps/testGeoCoord.c +++ b/src/apps/testapps/testLatLngInternal.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,56 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** @file testGeoCoord.c +/** @file testLatLngInternal.c * @brief Tests geographic coordinate functions * - * usage: `testGeoCoord` + * usage: `testLatLngInternal` */ +#include #include + #include "constants.h" -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" #include "test.h" - -/** - * Test a function for all resolutions, where the value should be decreasing as - * resolution increases. - * - * @param function - * @param message - */ -void testDecreasingFunction(double (*function)(int), const char* message) { - double last = 0; - double next; - for (int i = MAX_H3_RES; i >= 0; i--) { - next = function(i); - t_assert(next > last, message); - last = next; - } -} - -SUITE(geoCoord) { - TEST(radsToDegs) { - double originalRads = 1; - double degs = H3_EXPORT(radsToDegs)(originalRads); - double rads = H3_EXPORT(degsToRads)(degs); - t_assert(fabs(rads - originalRads) < EPSILON_RAD, - "radsToDegs/degsToRads invertible"); - } - - TEST(_geoDistRads) { - GeoCoord p1; - setGeoDegs(&p1, 10, 10); - GeoCoord p2; - setGeoDegs(&p2, 0, 10); - - // TODO: Epsilon is relatively large - t_assert(_geoDistRads(&p1, &p1) < EPSILON_RAD * 1000, - "0 distance as expected"); - t_assert(fabs(_geoDistRads(&p1, &p2) - H3_EXPORT(degsToRads)(10)) < - EPSILON_RAD * 1000, - "distance along longitude as expected"); +#include "utility.h" + +SUITE(latLngInternal) { + TEST(geoAlmostEqualThreshold) { + LatLng a = {15, 10}; + LatLng b = {15, 10}; + t_assert(geoAlmostEqualThreshold(&a, &b, DBL_EPSILON), "same point"); + + b.lat = 15.00001; + b.lng = 10.00002; + t_assert(geoAlmostEqualThreshold(&a, &b, 0.0001), + "differences under threshold"); + + b.lat = 15.00001; + b.lng = 10; + t_assert(!geoAlmostEqualThreshold(&a, &b, 0.000001), + "lat over threshold"); + + b.lat = 15; + b.lng = 10.00001; + t_assert(!geoAlmostEqualThreshold(&a, &b, 0.000001), + "lng over threshold"); } TEST(constrainLatLng) { @@ -82,9 +67,9 @@ SUITE(geoCoord) { } TEST(_geoAzDistanceRads_noop) { - GeoCoord start = {15, 10}; - GeoCoord out; - GeoCoord expected = {15, 10}; + LatLng start = {15, 10}; + LatLng out; + LatLng expected = {15, 10}; _geoAzDistanceRads(&start, 0, 0, &out); t_assert(geoAlmostEqual(&expected, &out), @@ -92,9 +77,9 @@ SUITE(geoCoord) { } TEST(_geoAzDistanceRads_dueNorthSouth) { - GeoCoord start; - GeoCoord out; - GeoCoord expected; + LatLng start; + LatLng out; + LatLng expected; // Due north to north pole setGeoDegs(&start, 45, 1); @@ -127,9 +112,9 @@ SUITE(geoCoord) { } TEST(_geoAzDistanceRads_poleToPole) { - GeoCoord start; - GeoCoord out; - GeoCoord expected; + LatLng start; + LatLng out; + LatLng expected; // Azimuth doesn't really matter in this case. Any azimuth from the // north pole is south, any azimuth from the south pole is north. @@ -150,41 +135,23 @@ SUITE(geoCoord) { } TEST(_geoAzDistanceRads_invertible) { - GeoCoord start; + LatLng start; setGeoDegs(&start, 15, 10); - GeoCoord out; + LatLng out; double azimuth = H3_EXPORT(degsToRads)(20); double degrees180 = H3_EXPORT(degsToRads)(180); double distance = H3_EXPORT(degsToRads)(15); _geoAzDistanceRads(&start, azimuth, distance, &out); - t_assert(fabs(_geoDistRads(&start, &out) - distance) < EPSILON_RAD, + t_assert(fabs(H3_EXPORT(greatCircleDistanceRads)(&start, &out) - + distance) < EPSILON_RAD, "moved distance is as expected"); - GeoCoord start2 = out; + LatLng start2 = out; _geoAzDistanceRads(&start2, azimuth + degrees180, distance, &out); // TODO: Epsilon is relatively large - t_assert(_geoDistRads(&start, &out) < 0.01, "moved back to origin"); - } - - TEST(doubleConstants) { - // Simple checks for ordering of values - testDecreasingFunction(H3_EXPORT(hexAreaKm2), "hexAreaKm2 ordering"); - testDecreasingFunction(H3_EXPORT(hexAreaM2), "hexAreaM2 ordering"); - testDecreasingFunction(H3_EXPORT(edgeLengthKm), - "edgeLengthKm ordering"); - testDecreasingFunction(H3_EXPORT(edgeLengthM), "edgeLengthM ordering"); - } - - TEST(intConstants) { - // Simple checks for ordering of values - int64_t last = 0; - int64_t next; - for (int i = 0; i <= MAX_H3_RES; i++) { - next = H3_EXPORT(numHexagons)(i); - t_assert(next > last, "numHexagons ordering"); - last = next; - } + t_assert(H3_EXPORT(greatCircleDistanceRads)(&start, &out) < 0.01, + "moved back to origin"); } } diff --git a/src/apps/testapps/testGeoToH3.c b/src/apps/testapps/testLatLngToCell.c similarity index 57% rename from src/apps/testapps/testGeoToH3.c rename to src/apps/testapps/testLatLngToCell.c index 0630038bf..34ddfdd0e 100644 --- a/src/apps/testapps/testGeoToH3.c +++ b/src/apps/testapps/testLatLngToCell.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,38 +14,40 @@ * limitations under the License. */ /** @file - * @brief tests H3 function `geoToH3` + * @brief tests H3 function `latLngToCell` * - * usage: `testGeoToH3` + * usage: `testLatLngToCell` * - * The program reads lines containing H3 indexes and lat/lon pairs from - * stdin until EOF is encountered. For each input line, it calls `geoToH3` - * to convert the input lat/lon to an H3 index, and then validates the + * The program reads lines containing H3 indexes and lat/lng pairs from + * stdin until EOF is encountered. For each input line, it calls `latLngToCell` + * to convert the input lat/lng to an H3 index, and then validates the * index against the original input index. */ #include #include -#include "geoCoord.h" + #include "h3Index.h" +#include "latLng.h" #include "test.h" #include "utility.h" -static void assertExpected(H3Index h1, const GeoCoord* g1) { - // convert lat/lon to H3 and verify - int res = H3_EXPORT(h3GetResolution)(h1); - H3Index h2 = H3_EXPORT(geoToH3)(g1, res); - t_assert(h1 == h2, "got expected geoToH3 output"); +static void assertExpected(H3Index h1, const LatLng *g1) { + // convert lat/lng to H3 and verify + int res = H3_EXPORT(getResolution)(h1); + H3Index h2; + t_assertSuccess(H3_EXPORT(latLngToCell)(g1, res, &h2)); + t_assert(h1 == h2, "got expected latLngToCell output"); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { // check command line args if (argc > 1) { fprintf(stderr, "usage: %s\n", argv[0]); exit(1); } - // process the indexes and lat/lons on stdin + // process the indexes and lat/lngs on stdin char buff[BUFF_SIZE]; char h3Str[BUFF_SIZE]; while (1) { @@ -57,15 +59,15 @@ int main(int argc, char* argv[]) { error("reading input from stdin"); } - double latDegs, lonDegs; - if (sscanf(buff, "%s %lf %lf", h3Str, &latDegs, &lonDegs) != 3) - error("parsing input (should be \"H3Index lat lon\")"); + double latDegs, lngDegs; + if (sscanf(buff, "%s %lf %lf", h3Str, &latDegs, &lngDegs) != 3) + error("parsing input (should be \"H3Index lat lng\")"); H3Index h3; - h3 = H3_EXPORT(stringToH3)(h3Str); + t_assertSuccess(H3_EXPORT(stringToH3)(h3Str, &h3)); - GeoCoord coord; - setGeoDegs(&coord, latDegs, lonDegs); + LatLng coord; + setGeoDegs(&coord, latDegs, lngDegs); assertExpected(h3, &coord); } diff --git a/src/apps/testapps/testLinkedGeo.c b/src/apps/testapps/testLinkedGeoInternal.c similarity index 82% rename from src/apps/testapps/testLinkedGeo.c rename to src/apps/testapps/testLinkedGeoInternal.c index 825c0744a..6f0276c46 100644 --- a/src/apps/testapps/testLinkedGeo.c +++ b/src/apps/testapps/testLinkedGeoInternal.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,27 +16,28 @@ #include #include -#include "geoCoord.h" + #include "h3api.h" +#include "latLng.h" #include "linkedGeo.h" #include "test.h" // Fixtures -static GeoCoord vertex1; -static GeoCoord vertex2; -static GeoCoord vertex3; -static GeoCoord vertex4; +static LatLng vertex1; +static LatLng vertex2; +static LatLng vertex3; +static LatLng vertex4; -SUITE(linkedGeo) { +SUITE(linkedGeoInternal) { setGeoDegs(&vertex1, 87.372002166, 166.160981117); setGeoDegs(&vertex2, 87.370101364, 166.160184306); setGeoDegs(&vertex3, 87.369088356, 166.196239997); setGeoDegs(&vertex4, 87.369975080, 166.233115768); TEST(createLinkedGeo) { - LinkedGeoPolygon* polygon = calloc(1, sizeof(LinkedGeoPolygon)); - LinkedGeoLoop* loop; - LinkedGeoCoord* coord; + LinkedGeoPolygon *polygon = calloc(1, sizeof(LinkedGeoPolygon)); + LinkedGeoLoop *loop; + LinkedLatLng *coord; loop = addNewLinkedLoop(polygon); t_assert(loop != NULL, "Loop created"); @@ -61,12 +62,12 @@ SUITE(linkedGeo) { t_assert(countLinkedCoords(polygon->last) == 2, "Coord count 2 correct"); - LinkedGeoPolygon* nextPolygon = addNewLinkedPolygon(polygon); + LinkedGeoPolygon *nextPolygon = addNewLinkedPolygon(polygon); t_assert(nextPolygon != NULL, "polygon created"); t_assert(countLinkedPolygons(polygon) == 2, "Polygon count correct"); - H3_EXPORT(destroyLinkedPolygon)(polygon); + H3_EXPORT(destroyLinkedMultiPolygon)(polygon); free(polygon); } } diff --git a/src/apps/testapps/testMathExtensionsInternal.c b/src/apps/testapps/testMathExtensionsInternal.c new file mode 100644 index 000000000..c08c66d43 --- /dev/null +++ b/src/apps/testapps/testMathExtensionsInternal.c @@ -0,0 +1,109 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests functions and macros in mathExtensions.h + * + * usage: `testMathExtensionsInternal` + */ + +#include "mathExtensions.h" +#include "test.h" +#include "utility.h" + +#define ASSERT_SUB_OVERFLOW(a, b) \ + t_assert(SUB_INT32S_OVERFLOWS((a), (b)), #a " - " #b " Overflows") +#define ASSERT_SUB_DOES_NOT_OVERFLOW(a, b) \ + t_assert(!SUB_INT32S_OVERFLOWS((a), (b)), #a " - " #b \ + " Does Not " \ + "Overflow") +#define ASSERT_ADD_OVERFLOW(a, b) \ + t_assert(ADD_INT32S_OVERFLOWS((a), (b)), #a " + " #b " Overflows") +#define ASSERT_ADD_DOES_NOT_OVERFLOW(a, b) \ + t_assert(!ADD_INT32S_OVERFLOWS((a), (b)), #a " + " #b \ + " Does Not " \ + "Overflow") + +SUITE(mathExtensionsInternal) { + TEST(_ipow) { + t_assert(_ipow(7, 0) == 1, "7 ** 0 == 1"); + t_assert(_ipow(7, 1) == 7, "7 ** 1 == 7"); + t_assert(_ipow(7, 2) == 49, "7 ** 2 == 49"); + t_assert(_ipow(1, 20) == 1, "1 ** 20 == 1"); + t_assert(_ipow(2, 5) == 32, "2 ** 5 == 32"); + } + + TEST(subOverflows) { + ASSERT_SUB_DOES_NOT_OVERFLOW(0, 0); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, 0); + ASSERT_SUB_OVERFLOW(INT32_MIN, 1); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, -1); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, 0); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, 1); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, -1); + ASSERT_SUB_OVERFLOW(INT32_MIN + 1, 2); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, -2); + ASSERT_SUB_DOES_NOT_OVERFLOW(100, 10); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, 0); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, 1); + ASSERT_SUB_OVERFLOW(INT32_MAX, -1); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX - 1, 1); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX - 1, -1); + ASSERT_SUB_OVERFLOW(INT32_MAX - 1, -2); + ASSERT_SUB_OVERFLOW(INT32_MAX - 1, -2); + ASSERT_SUB_OVERFLOW(INT32_MIN, INT32_MAX); + ASSERT_SUB_OVERFLOW(INT32_MAX, INT32_MIN); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, INT32_MIN); + ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, INT32_MAX); + ASSERT_SUB_DOES_NOT_OVERFLOW(-1, 0); + ASSERT_SUB_DOES_NOT_OVERFLOW(-1, 10); + ASSERT_SUB_DOES_NOT_OVERFLOW(-1, -10); + ASSERT_SUB_DOES_NOT_OVERFLOW(-1, INT32_MAX); + ASSERT_SUB_OVERFLOW(-2, INT32_MAX); + ASSERT_SUB_DOES_NOT_OVERFLOW(-1, INT32_MIN); + ASSERT_SUB_OVERFLOW(0, INT32_MIN); + } + + TEST(addOverflows) { + ASSERT_ADD_DOES_NOT_OVERFLOW(0, 0); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, 0); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, 1); + ASSERT_ADD_OVERFLOW(INT32_MIN, -1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 0); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, -1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 2); + ASSERT_ADD_OVERFLOW(INT32_MIN + 1, -2); + ASSERT_ADD_DOES_NOT_OVERFLOW(100, 10); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, 0); + ASSERT_ADD_OVERFLOW(INT32_MAX, 1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, -1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, 1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, -1); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, -2); + ASSERT_ADD_OVERFLOW(INT32_MAX - 1, 2); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, INT32_MAX); + ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, INT32_MIN); + ASSERT_ADD_OVERFLOW(INT32_MAX, INT32_MAX); + ASSERT_ADD_OVERFLOW(INT32_MIN, INT32_MIN); + ASSERT_ADD_DOES_NOT_OVERFLOW(-1, 0); + ASSERT_ADD_DOES_NOT_OVERFLOW(-1, 10); + ASSERT_ADD_DOES_NOT_OVERFLOW(-1, -10); + ASSERT_ADD_DOES_NOT_OVERFLOW(-1, INT32_MAX); + ASSERT_ADD_DOES_NOT_OVERFLOW(-2, INT32_MAX); + ASSERT_ADD_OVERFLOW(-1, INT32_MIN); + ASSERT_ADD_DOES_NOT_OVERFLOW(0, INT32_MIN); + } +} \ No newline at end of file diff --git a/src/apps/testapps/testMaxH3ToChildrenSize.c b/src/apps/testapps/testMaxH3ToChildrenSize.c deleted file mode 100644 index 79371bbd3..000000000 --- a/src/apps/testapps/testMaxH3ToChildrenSize.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "h3Index.h" -#include "test.h" - -SUITE(maxH3ToChildrenSize) { - GeoCoord sf = {0.659966917655, 2 * 3.14159 - 2.1364398519396}; - - TEST(maxH3ToChildrenSize) { - H3Index parent = H3_EXPORT(geoToH3)(&sf, 7); - - t_assert(H3_EXPORT(maxH3ToChildrenSize)(parent, 3) == 0, - "got expected size for coarser res"); - t_assert(H3_EXPORT(maxH3ToChildrenSize)(parent, 7) == 1, - "got expected size for same res"); - t_assert(H3_EXPORT(maxH3ToChildrenSize)(parent, 8) == 7, - "got expected size for child res"); - t_assert(H3_EXPORT(maxH3ToChildrenSize)(parent, 9) == 7 * 7, - "got expected size for grandchild res"); - } -} diff --git a/src/apps/testapps/testPentagonIndexes.c b/src/apps/testapps/testPentagonIndexes.c new file mode 100644 index 000000000..417401d67 --- /dev/null +++ b/src/apps/testapps/testPentagonIndexes.c @@ -0,0 +1,74 @@ +/* + * Copyright 2019-2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "h3api.h" +#include "test.h" + +#define PADDED_COUNT 16 + +SUITE(getPentagons) { + TEST(propertyTests) { + int expectedCount = H3_EXPORT(pentagonCount)(); + + for (int res = 0; res <= 15; res++) { + H3Index h3Indexes[PADDED_COUNT] = {0}; + t_assertSuccess(H3_EXPORT(getPentagons)(res, h3Indexes)); + + int numFound = 0; + + for (int i = 0; i < PADDED_COUNT; i++) { + H3Index h3Index = h3Indexes[i]; + if (h3Index) { + numFound++; + t_assert(H3_EXPORT(isValidCell(h3Index)), + "index should be valid"); + t_assert(H3_EXPORT(isPentagon(h3Index)), + "index should be pentagon"); + t_assert(H3_EXPORT(getResolution(h3Index)) == res, + "index should have correct resolution"); + + // verify uniqueness + for (int j = i + 1; j < PADDED_COUNT; j++) { + if (h3Indexes[j] == h3Index) { + t_assert(false, "index should be seen only once"); + } + } + } + } + + t_assert(numFound == expectedCount, + "there should be exactly 12 pentagons"); + } + } + + TEST(getPentagonsInvalid) { + H3Index h3Indexes[PADDED_COUNT] = {0}; + t_assert(H3_EXPORT(getPentagons)(16, h3Indexes) == E_RES_DOMAIN, + "getPentagons of invalid resolutions fails"); + t_assert(H3_EXPORT(getPentagons)(100, h3Indexes) == E_RES_DOMAIN, + "getPentagons of invalid resolutions fails"); + t_assert(H3_EXPORT(getPentagons)(-1, h3Indexes) == E_RES_DOMAIN, + "getPentagons of invalid resolutions fails"); + } + + TEST(invalidPentagons) { + t_assert(!H3_EXPORT(isPentagon)(0), "0 is not a pentagon"); + t_assert(!H3_EXPORT(isPentagon)(0x7fffffffffffffff), + "all but high bit is not a pentagon"); + } +} diff --git a/src/apps/testapps/testPolyfill.c b/src/apps/testapps/testPolyfill.c deleted file mode 100644 index df9db2e90..000000000 --- a/src/apps/testapps/testPolyfill.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "algos.h" -#include "constants.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "test.h" - -// Fixtures -static GeoCoord sfVerts[] = { - {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, - {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, - {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; -static Geofence sfGeofence = {.numVerts = 6, .verts = sfVerts}; -static GeoPolygon sfGeoPolygon; - -static GeoCoord holeVerts[] = {{0.6595072188743, -2.1371053983433}, - {0.6591482046471, -2.1373141048153}, - {0.6592295020837, -2.1365222838402}}; -static Geofence holeGeofence = {.numVerts = 3, .verts = holeVerts}; -static GeoPolygon holeGeoPolygon; - -static GeoCoord emptyVerts[] = {{0.659966917655, -2.1364398519394}, - {0.659966917655, -2.1364398519395}, - {0.659966917655, -2.1364398519396}}; -static Geofence emptyGeofence = {.numVerts = 3, .verts = emptyVerts}; -static GeoPolygon emptyGeoPolygon; - -static int countActualHexagons(H3Index* hexagons, int numHexagons) { - int actualNumHexagons = 0; - for (int i = 0; i < numHexagons; i++) { - if (hexagons[i] != 0) { - actualNumHexagons++; - } - } - return actualNumHexagons; -} - -SUITE(polyfill) { - sfGeoPolygon.geofence = sfGeofence; - sfGeoPolygon.numHoles = 0; - - holeGeoPolygon.geofence = sfGeofence; - holeGeoPolygon.numHoles = 1; - holeGeoPolygon.holes = &holeGeofence; - - emptyGeoPolygon.geofence = emptyGeofence; - emptyGeoPolygon.numHoles = 0; - - TEST(maxPolyfillSize) { - int numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - t_assert(numHexagons == 3169, "got expected max polyfill size"); - - numHexagons = H3_EXPORT(maxPolyfillSize)(&holeGeoPolygon, 9); - t_assert(numHexagons == 3169, "got expected max polyfill size (hole)"); - - numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); - t_assert(numHexagons == 1, "got expected max polyfill size (empty)"); - } - - TEST(polyfill) { - int numHexagons = H3_EXPORT(maxPolyfillSize)(&sfGeoPolygon, 9); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&sfGeoPolygon, 9, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 1253, "got expected polyfill size"); - free(hexagons); - } - - TEST(polyfillHole) { - int numHexagons = H3_EXPORT(maxPolyfillSize)(&holeGeoPolygon, 9); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&holeGeoPolygon, 9, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 1214, - "got expected polyfill size (hole)"); - free(hexagons); - } - - TEST(polyfillEmpty) { - int numHexagons = H3_EXPORT(maxPolyfillSize)(&emptyGeoPolygon, 9); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&emptyGeoPolygon, 9, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 0, "got expected polyfill size (empty)"); - free(hexagons); - } - - TEST(polyfillExact) { - GeoCoord somewhere = {1, 2}; - H3Index origin = H3_EXPORT(geoToH3)(&somewhere, 9); - GeoBoundary boundary; - H3_EXPORT(h3ToGeoBoundary)(origin, &boundary); - - GeoCoord* verts = calloc(boundary.numVerts + 1, sizeof(GeoCoord)); - for (int i = 0; i < boundary.numVerts; i++) { - verts[i] = boundary.verts[i]; - } - verts[boundary.numVerts] = boundary.verts[0]; - - Geofence someGeofence; - someGeofence.numVerts = boundary.numVerts + 1; - someGeofence.verts = verts; - GeoPolygon someHexagon; - someHexagon.geofence = someGeofence; - someHexagon.numHoles = 0; - - int numHexagons = H3_EXPORT(maxPolyfillSize)(&someHexagon, 9); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&someHexagon, 9, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 1, "got expected polyfill size (1)"); - free(hexagons); - free(verts); - } - - TEST(polyfillTransmeridian) { - GeoCoord primeMeridianVerts[] = { - {0.01, 0.01}, {0.01, -0.01}, {-0.01, -0.01}, {-0.01, 0.01}}; - Geofence primeMeridianGeofence = {.numVerts = 4, - .verts = primeMeridianVerts}; - GeoPolygon primeMeridianGeoPolygon = {.geofence = primeMeridianGeofence, - .numHoles = 0}; - - GeoCoord transMeridianVerts[] = {{0.01, -M_PI + 0.01}, - {0.01, M_PI - 0.01}, - {-0.01, M_PI - 0.01}, - {-0.01, -M_PI + 0.01}}; - Geofence transMeridianGeofence = {.numVerts = 4, - .verts = transMeridianVerts}; - GeoPolygon transMeridianGeoPolygon = {.geofence = transMeridianGeofence, - .numHoles = 0}; - - GeoCoord transMeridianHoleVerts[] = {{0.005, -M_PI + 0.005}, - {0.005, M_PI - 0.005}, - {-0.005, M_PI - 0.005}, - {-0.005, -M_PI + 0.005}}; - Geofence transMeridianHoleGeofence = {.numVerts = 4, - .verts = transMeridianHoleVerts}; - GeoPolygon transMeridianHoleGeoPolygon = { - .geofence = transMeridianGeofence, - .numHoles = 1, - .holes = &transMeridianHoleGeofence}; - GeoPolygon transMeridianFilledHoleGeoPolygon = { - .geofence = transMeridianHoleGeofence, .numHoles = 0}; - - int expectedSize; - - // Prime meridian case - expectedSize = 4228; - int numHexagons = - H3_EXPORT(maxPolyfillSize)(&primeMeridianGeoPolygon, 7); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&primeMeridianGeoPolygon, 7, hexagons); - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == expectedSize, - "got expected polyfill size (prime meridian)"); - - // Transmeridian case - // This doesn't exactly match the prime meridian count because of slight - // differences in hex size and grid offset between the two cases - expectedSize = 4238; - numHexagons = H3_EXPORT(maxPolyfillSize)(&transMeridianGeoPolygon, 7); - H3Index* hexagonsTM = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&transMeridianGeoPolygon, 7, hexagonsTM); - actualNumHexagons = countActualHexagons(hexagonsTM, numHexagons); - - t_assert(actualNumHexagons == expectedSize, - "got expected polyfill size (transmeridian)"); - - // Transmeridian filled hole case -- only needed for calculating hole - // size - numHexagons = - H3_EXPORT(maxPolyfillSize)(&transMeridianFilledHoleGeoPolygon, 7); - H3Index* hexagonsTMFH = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill) - (&transMeridianFilledHoleGeoPolygon, 7, hexagonsTMFH); - int actualNumHoleHexagons = - countActualHexagons(hexagonsTMFH, numHexagons); - - // Transmeridian hole case - numHexagons = - H3_EXPORT(maxPolyfillSize)(&transMeridianHoleGeoPolygon, 7); - H3Index* hexagonsTMH = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&transMeridianHoleGeoPolygon, 7, hexagonsTMH); - actualNumHexagons = countActualHexagons(hexagonsTMH, numHexagons); - - t_assert(actualNumHexagons == expectedSize - actualNumHoleHexagons, - "got expected polyfill size (transmeridian hole)"); - - free(hexagons); - free(hexagonsTM); - free(hexagonsTMFH); - free(hexagonsTMH); - } - - TEST(polyfillTransmeridianComplex) { - // This polygon is "complex" in that it has > 4 vertices - this - // tests for a bug that was taking the max and min longitude as - // the bounds for transmeridian polygons - GeoCoord verts[] = {{0.1, -M_PI + 0.00001}, {0.1, M_PI - 0.00001}, - {0.05, M_PI - 0.2}, {-0.1, M_PI - 0.00001}, - {-0.1, -M_PI + 0.00001}, {-0.05, -M_PI + 0.2}}; - Geofence geofence = {.numVerts = 6, .verts = verts}; - GeoPolygon polygon = {.geofence = geofence, .numHoles = 0}; - - int numHexagons = H3_EXPORT(maxPolyfillSize)(&polygon, 4); - - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - H3_EXPORT(polyfill)(&polygon, 4, hexagons); - - int actualNumHexagons = countActualHexagons(hexagons, numHexagons); - - t_assert(actualNumHexagons == 1204, - "got expected polyfill size (complex transmeridian)"); - - free(hexagons); - } - - TEST(polyfillPentagon) { - H3Index pentagon; - setH3Index(&pentagon, 9, 24, 0); - GeoCoord coord; - H3_EXPORT(h3ToGeo)(pentagon, &coord); - - // Length of half an edge of the polygon, in radians - double edgeLength2 = H3_EXPORT(degsToRads)(0.001); - - GeoCoord boundingTopRigt = coord; - boundingTopRigt.lat += edgeLength2; - boundingTopRigt.lon += edgeLength2; - - GeoCoord boundingTopLeft = coord; - boundingTopLeft.lat += edgeLength2; - boundingTopLeft.lon -= edgeLength2; - - GeoCoord boundingBottomRight = coord; - boundingBottomRight.lat -= edgeLength2; - boundingBottomRight.lon += edgeLength2; - - GeoCoord boundingBottomLeft = coord; - boundingBottomLeft.lat -= edgeLength2; - boundingBottomLeft.lon -= edgeLength2; - - GeoCoord verts[] = {boundingBottomLeft, boundingTopLeft, - boundingTopRigt, boundingBottomRight}; - - Geofence geofence; - geofence.verts = verts; - geofence.numVerts = 4; - - GeoPolygon polygon; - polygon.geofence = geofence; - polygon.numHoles = 0; - - int numHexagons = H3_EXPORT(maxPolyfillSize)(&polygon, 9); - H3Index* hexagons = calloc(numHexagons, sizeof(H3Index)); - - H3_EXPORT(polyfill)(&polygon, 9, hexagons); - - int found = 0; - int numPentagons = 0; - for (int i = 0; i < numHexagons; i++) { - if (hexagons[i] != 0) { - found++; - } - if (H3_EXPORT(h3IsPentagon)(hexagons[i])) { - numPentagons++; - } - } - t_assert(found == 1, "one index found"); - t_assert(numPentagons == 1, "one pentagon found"); - free(hexagons); - } -} diff --git a/src/apps/testapps/testPolyfillInternal.c b/src/apps/testapps/testPolyfillInternal.c new file mode 100644 index 000000000..915378f8c --- /dev/null +++ b/src/apps/testapps/testPolyfillInternal.c @@ -0,0 +1,225 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "bbox.h" +#include "h3Index.h" +#include "h3api.h" +#include "latLng.h" +#include "polyfill.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +// Fixtures +static GeoPolygon sfGeoPolygon = { + .geoloop = {.numVerts = 6, + .verts = (LatLng[]){{0.659966917655, -2.1364398519396}, + {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, + {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, + {0.6599990002976, -2.1376771158464}}}, + .numHoles = 0}; + +SUITE(polyfillInternal) { + TEST(iterInitPolygonCompact_errors) { + IterCellsPolygonCompact iter; + + iter = iterInitPolygonCompact(&sfGeoPolygon, -1, CONTAINMENT_CENTER); + t_assert(iter.error == E_RES_DOMAIN, + "Got expected error for invalid res"); + t_assert(iter.cell == H3_NULL, "Got null output for invalid res"); + + iter = iterInitPolygonCompact(&sfGeoPolygon, 16, CONTAINMENT_CENTER); + t_assert(iter.error == E_RES_DOMAIN, + "Got expected error for invalid res"); + t_assert(iter.cell == H3_NULL, "Got null output for invalid res"); + + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, 42); + t_assert(iter.error == E_OPTION_INVALID, + "Got expected error for invalid flags"); + t_assert(iter.cell == H3_NULL, "Got null output for invalid flags"); + } + + TEST(iterStepPolygonCompact_invalidCellErrors) { + IterCellsPolygonCompact iter; + H3Index cell; + + // Give the iterator a cell with a bad base cell + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, CONTAINMENT_CENTER); + t_assertSuccess(iter.error); + + cell = 0x85283473fffffff; + H3_SET_BASE_CELL(cell, 123); + iter.cell = cell; + + iterStepPolygonCompact(&iter); + t_assert(iter.error == E_CELL_INVALID, + "Got expected error for invalid cell"); + t_assert(iter.cell == H3_NULL, "Got null output for invalid cell"); + + // Give the iterator a cell with a bad base cell, at the target res + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, CONTAINMENT_CENTER); + t_assertSuccess(iter.error); + + cell = 0x89283470003ffff; + H3_SET_BASE_CELL(cell, 123); + iter.cell = cell; + + iterStepPolygonCompact(&iter); + t_assert(iter.error == E_CELL_INVALID, + "Got expected error for invalid cell"); + t_assert(iter.cell == H3_NULL, + "Got null output for invalid cell at res"); + + // Give the iterator a cell with a bad base cell, at the target res + // (full containment) + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, CONTAINMENT_FULL); + t_assertSuccess(iter.error); + + cell = 0x89283470003ffff; + H3_SET_BASE_CELL(cell, 123); + iter.cell = cell; + + iterStepPolygonCompact(&iter); + t_assert(iter.error == E_CELL_INVALID, + "Got expected error for invalid cell"); + t_assert(iter.cell == H3_NULL, + "Got null output for invalid cell at res"); + + // Give the iterator a cell with a bad base cell, at the target res + // (overlapping bounding box) + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, + CONTAINMENT_OVERLAPPING_BBOX); + t_assertSuccess(iter.error); + + cell = 0x89283470003ffff; + H3_SET_BASE_CELL(cell, 123); + iter.cell = cell; + + iterStepPolygonCompact(&iter); + t_assert(iter.error == E_CELL_INVALID, + "Got expected error for invalid cell"); + t_assert(iter.cell == H3_NULL, + "Got null output for invalid cell at res"); + + // Give the iterator a cell that's too fine for a child check, + // and a target resolution that allows this to run. This cell has + // to be inside the polygon to reach the error. + iter = iterInitPolygonCompact(&sfGeoPolygon, 9, CONTAINMENT_CENTER); + t_assertSuccess(iter.error); + + cell = 0x8f283080dcb019a; + iter.cell = cell; + iter._res = 42; + + iterStepPolygonCompact(&iter); + t_assert(iter.error == E_RES_DOMAIN, + "Got expected error for too-fine cell"); + t_assert(iter.cell == H3_NULL, "Got null output for invalid cell"); + } + + TEST(iterDestroyPolygonCompact) { + IterCellsPolygonCompact iter = + iterInitPolygonCompact(&sfGeoPolygon, 9, CONTAINMENT_CENTER); + t_assertSuccess(iter.error); + + iterDestroyPolygonCompact(&iter); + t_assert(iter.error == E_SUCCESS, "Got success for destroyed iterator"); + t_assert(iter.cell == H3_NULL, + "Got null output for destroyed iterator"); + + for (int i = 0; i < 3; i++) { + iterStepPolygonCompact(&iter); + t_assert(iter.cell == H3_NULL, + "Got null output for destroyed iterator"); + } + } + + TEST(iterDestroyPolygon) { + IterCellsPolygon iter = + iterInitPolygon(&sfGeoPolygon, 9, CONTAINMENT_CENTER); + t_assertSuccess(iter.error); + + iterDestroyPolygon(&iter); + t_assert(iter.error == E_SUCCESS, "Got success for destroyed iterator"); + t_assert(iter.cell == H3_NULL, + "Got null output for destroyed iterator"); + + for (int i = 0; i < 3; i++) { + iterStepPolygon(&iter); + t_assert(iter.cell == H3_NULL, + "Got null output for destroyed iterator"); + } + } + + TEST(cellToBBox_noScale) { + // arbitrary cell + H3Index cell = 0x85283473fffffff; + BBox bbox; + t_assertSuccess(cellToBBox(cell, &bbox, false)); + + double cellArea; + t_assertSuccess(H3_EXPORT(cellAreaRads2)(cell, &cellArea)); + double bboxArea = bboxWidthRads(&bbox) * bboxHeightRads(&bbox); + double ratio = bboxArea / cellArea; + + CellBoundary verts; + t_assertSuccess(H3_EXPORT(cellToBoundary)(cell, &verts)); + + t_assert(ratio < 3 && ratio > 1, + "Got reasonable area ratio between cell and bbox"); + } + + TEST(cellToBBox_boundaryError) { + // arbitrary cell + H3Index cell = 0x85283473fffffff; + H3_SET_BASE_CELL(cell, 123); + + BBox bbox; + t_assert(cellToBBox(cell, &bbox, false) == E_CELL_INVALID, + "Got expected error for cell with invalid base cell"); + } + + TEST(cellToBBox_res0boundaryError) { + // arbitrary res 0 cell + H3Index cell = 0x8001fffffffffff; + H3_SET_BASE_CELL(cell, 123); + + BBox bbox; + t_assert(cellToBBox(cell, &bbox, false) == E_CELL_INVALID, + "Got expected error for res 0 cell with invalid base cell"); + } + + TEST(baseCellNumToCell) { + for (int i = 0; i < NUM_BASE_CELLS; i++) { + H3Index cell = baseCellNumToCell(i); + t_assert(H3_EXPORT(isValidCell)(cell), "Cell is valid"); + t_assert( + H3_GET_BASE_CELL(cell) == i && H3_GET_RESOLUTION(cell) == 0, + "Cell has correct base number and res"); + } + } + + TEST(baseCellNumToCell_boundaryErrors) { + t_assert(baseCellNumToCell(-1) == H3_NULL, + "Expected null for less than 0"); + t_assert(baseCellNumToCell(NUM_BASE_CELLS) == H3_NULL, + "Expected null for positive out of bounds"); + } +} diff --git a/src/apps/testapps/testPolygon.c b/src/apps/testapps/testPolygon.c deleted file mode 100644 index e8fd51bd6..000000000 --- a/src/apps/testapps/testPolygon.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "bbox.h" -#include "constants.h" -#include "geoCoord.h" -#include "h3Index.h" -#include "linkedGeo.h" -#include "polygon.h" -#include "test.h" - -// Fixtures -static GeoCoord sfVerts[] = { - {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, - {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, - {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; - -static void createLinkedLoop(LinkedGeoLoop* loop, GeoCoord* verts, - int numVerts) { - *loop = (LinkedGeoLoop){0}; - for (int i = 0; i < numVerts; i++) { - addLinkedCoord(loop, verts++); - } -} - -SUITE(polygon) { - TEST(pointInsideGeofence) { - Geofence geofence = {.numVerts = 6, .verts = sfVerts}; - - GeoCoord inside = {0.659, -2.136}; - GeoCoord somewhere = {1, 2}; - - BBox bbox; - bboxFromGeofence(&geofence, &bbox); - - t_assert(!pointInsideGeofence(&geofence, &bbox, &sfVerts[0]), - "contains exact"); - t_assert(pointInsideGeofence(&geofence, &bbox, &sfVerts[4]), - "contains exact 4"); - t_assert(pointInsideGeofence(&geofence, &bbox, &inside), - "contains point inside"); - t_assert(!pointInsideGeofence(&geofence, &bbox, &somewhere), - "contains somewhere else"); - } - - TEST(pointInsideGeofenceTransmeridian) { - GeoCoord verts[] = {{0.01, -M_PI + 0.01}, - {0.01, M_PI - 0.01}, - {-0.01, M_PI - 0.01}, - {-0.01, -M_PI + 0.01}}; - Geofence transMeridianGeofence = {.numVerts = 4, .verts = verts}; - - GeoCoord eastPoint = {0.001, -M_PI + 0.001}; - GeoCoord eastPointOutside = {0.001, -M_PI + 0.1}; - GeoCoord westPoint = {0.001, M_PI - 0.001}; - GeoCoord westPointOutside = {0.001, M_PI - 0.1}; - - BBox bbox; - bboxFromGeofence(&transMeridianGeofence, &bbox); - - t_assert(pointInsideGeofence(&transMeridianGeofence, &bbox, &westPoint), - "contains point to the west of the antimeridian"); - t_assert(pointInsideGeofence(&transMeridianGeofence, &bbox, &eastPoint), - "contains point to the east of the antimeridian"); - t_assert( - !pointInsideGeofence(&transMeridianGeofence, &bbox, - &westPointOutside), - "does not contain outside point to the west of the antimeridian"); - t_assert( - !pointInsideGeofence(&transMeridianGeofence, &bbox, - &eastPointOutside), - "does not contain outside point to the east of the antimeridian"); - } - - TEST(pointInsideLinkedGeoLoop) { - GeoCoord somewhere = {1, 2}; - GeoCoord inside = {0.659, -2.136}; - - LinkedGeoLoop loop; - createLinkedLoop(&loop, &sfVerts[0], 6); - - BBox bbox; - bboxFromLinkedGeoLoop(&loop, &bbox); - - t_assert(pointInsideLinkedGeoLoop(&loop, &bbox, &inside), - "contains exact4"); - t_assert(!pointInsideLinkedGeoLoop(&loop, &bbox, &somewhere), - "contains somewhere else"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(bboxFromGeofence) { - GeoCoord verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; - Geofence geofence = {.numVerts = 4, .verts = verts}; - - const BBox expected = {1.1, 0.7, 0.7, 0.2}; - - BBox result; - bboxFromGeofence(&geofence, &result); - t_assert(bboxEquals(&result, &expected), "Got expected bbox"); - } - - TEST(bboxFromGeofenceTransmeridian) { - GeoCoord verts[] = {{0.1, -M_PI + 0.1}, {0.1, M_PI - 0.1}, - {0.05, M_PI - 0.2}, {-0.1, M_PI - 0.1}, - {-0.1, -M_PI + 0.1}, {-0.05, -M_PI + 0.2}}; - Geofence geofence = {.numVerts = 6, .verts = verts}; - - const BBox expected = {0.1, -0.1, -M_PI + 0.2, M_PI - 0.2}; - - BBox result; - bboxFromGeofence(&geofence, &result); - t_assert(bboxEquals(&result, &expected), - "Got expected transmeridian bbox"); - } - - TEST(bboxFromGeofenceNoVertices) { - Geofence geofence; - geofence.verts = NULL; - geofence.numVerts = 0; - - const BBox expected = {0.0, 0.0, 0.0, 0.0}; - - BBox result; - bboxFromGeofence(&geofence, &result); - - t_assert(bboxEquals(&result, &expected), "Got expected bbox"); - } - - TEST(bboxesFromGeoPolygon) { - GeoCoord verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; - Geofence geofence = {.numVerts = 4, .verts = verts}; - GeoPolygon polygon = {.geofence = geofence, .numHoles = 0}; - - const BBox expected = {1.1, 0.7, 0.7, 0.2}; - - BBox* result = calloc(sizeof(BBox), 1); - bboxesFromGeoPolygon(&polygon, result); - t_assert(bboxEquals(&result[0], &expected), "Got expected bbox"); - - free(result); - } - - TEST(bboxesFromGeoPolygonHole) { - GeoCoord verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; - Geofence geofence = {.numVerts = 4, .verts = verts}; - - // not a real hole, but doesn't matter for the test - GeoCoord holeVerts[] = {{0.9, 0.3}, {0.9, 0.5}, {1.0, 0.7}, {0.9, 0.3}}; - Geofence holeGeofence = {.numVerts = 4, .verts = holeVerts}; - - GeoPolygon polygon = { - .geofence = geofence, .numHoles = 1, .holes = &holeGeofence}; - - const BBox expected = {1.1, 0.7, 0.7, 0.2}; - const BBox expectedHole = {1.0, 0.9, 0.7, 0.3}; - - BBox* result = calloc(sizeof(BBox), 2); - bboxesFromGeoPolygon(&polygon, result); - t_assert(bboxEquals(&result[0], &expected), "Got expected bbox"); - t_assert(bboxEquals(&result[1], &expectedHole), - "Got expected hole bbox"); - - free(result); - } - - TEST(bboxFromLinkedGeoLoop) { - GeoCoord verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; - - LinkedGeoLoop loop; - createLinkedLoop(&loop, &verts[0], 4); - - const BBox expected = {1.1, 0.7, 0.7, 0.2}; - - BBox result; - bboxFromLinkedGeoLoop(&loop, &result); - t_assert(bboxEquals(&result, &expected), "Got expected bbox"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(bboxFromLinkedGeoLoopNoVertices) { - LinkedGeoLoop loop = {0}; - - const BBox expected = {0.0, 0.0, 0.0, 0.0}; - - BBox result; - bboxFromLinkedGeoLoop(&loop, &result); - - t_assert(bboxEquals(&result, &expected), "Got expected bbox"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(isClockwiseGeofence) { - GeoCoord verts[] = {{0, 0}, {0.1, 0.1}, {0, 0.1}}; - Geofence geofence = {.numVerts = 3, .verts = verts}; - - t_assert(isClockwiseGeofence(&geofence), - "Got true for clockwise geofence"); - } - - TEST(isClockwiseLinkedGeoLoop) { - GeoCoord verts[] = {{0.1, 0.1}, {0.2, 0.2}, {0.1, 0.2}}; - LinkedGeoLoop loop; - createLinkedLoop(&loop, &verts[0], 3); - - t_assert(isClockwiseLinkedGeoLoop(&loop), - "Got true for clockwise loop"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(isNotClockwiseLinkedGeoLoop) { - GeoCoord verts[] = {{0, 0}, {0, 0.4}, {0.4, 0.4}, {0.4, 0}}; - LinkedGeoLoop loop; - createLinkedLoop(&loop, &verts[0], 4); - - t_assert(!isClockwiseLinkedGeoLoop(&loop), - "Got false for counter-clockwise loop"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(isClockwiseGeofenceTransmeridian) { - GeoCoord verts[] = {{0.4, M_PI - 0.1}, - {0.4, -M_PI + 0.1}, - {-0.4, -M_PI + 0.1}, - {-0.4, M_PI - 0.1}}; - Geofence geofence = {.numVerts = 4, .verts = verts}; - - t_assert(isClockwiseGeofence(&geofence), - "Got true for clockwise geofence"); - } - - TEST(isClockwiseLinkedGeoLoopTransmeridian) { - GeoCoord verts[] = {{0.4, M_PI - 0.1}, - {0.4, -M_PI + 0.1}, - {-0.4, -M_PI + 0.1}, - {-0.4, M_PI - 0.1}}; - LinkedGeoLoop loop; - createLinkedLoop(&loop, &verts[0], 4); - - t_assert(isClockwiseLinkedGeoLoop(&loop), - "Got true for clockwise transmeridian loop"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(isNotClockwiseLinkedGeoLoopTransmeridian) { - GeoCoord verts[] = {{0.4, M_PI - 0.1}, - {-0.4, M_PI - 0.1}, - {-0.4, -M_PI + 0.1}, - {0.4, -M_PI + 0.1}}; - LinkedGeoLoop loop; - createLinkedLoop(&loop, &verts[0], 4); - - t_assert(!isClockwiseLinkedGeoLoop(&loop), - "Got false for counter-clockwise transmeridian loop"); - - destroyLinkedGeoLoop(&loop); - } - - TEST(normalizeMultiPolygonSingle) { - GeoCoord verts[] = {{0, 0}, {0, 1}, {1, 1}}; - - LinkedGeoLoop* outer = malloc(sizeof(*outer)); - assert(outer != NULL); - createLinkedLoop(outer, &verts[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, outer); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 1, "Loop count correct"); - t_assert(polygon.first == outer, "Got expected loop"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonTwoOuterLoops) { - GeoCoord verts1[] = {{0, 0}, {0, 1}, {1, 1}}; - - LinkedGeoLoop* outer1 = malloc(sizeof(*outer1)); - assert(outer1 != NULL); - createLinkedLoop(outer1, &verts1[0], 3); - - GeoCoord verts2[] = {{2, 2}, {2, 3}, {3, 3}}; - - LinkedGeoLoop* outer2 = malloc(sizeof(*outer2)); - assert(outer2 != NULL); - createLinkedLoop(outer2, &verts2[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, outer1); - addLinkedLoop(&polygon, outer2); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 1, - "Loop count on first polygon correct"); - t_assert(countLinkedLoops(polygon.next) == 1, - "Loop count on second polygon correct"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonOneHole) { - GeoCoord verts[] = {{0, 0}, {0, 3}, {3, 3}, {3, 0}}; - - LinkedGeoLoop* outer = malloc(sizeof(*outer)); - assert(outer != NULL); - createLinkedLoop(outer, &verts[0], 4); - - GeoCoord verts2[] = {{1, 1}, {2, 2}, {1, 2}}; - - LinkedGeoLoop* inner = malloc(sizeof(*inner)); - assert(inner != NULL); - createLinkedLoop(inner, &verts2[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, inner); - addLinkedLoop(&polygon, outer); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 2, - "Loop count on first polygon correct"); - t_assert(polygon.first == outer, "Got expected outer loop"); - t_assert(polygon.first->next == inner, "Got expected inner loop"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonTwoHoles) { - GeoCoord verts[] = {{0, 0}, {0, 0.4}, {0.4, 0.4}, {0.4, 0}}; - - LinkedGeoLoop* outer = malloc(sizeof(*outer)); - assert(outer != NULL); - createLinkedLoop(outer, &verts[0], 4); - - GeoCoord verts2[] = {{0.1, 0.1}, {0.2, 0.2}, {0.1, 0.2}}; - - LinkedGeoLoop* inner1 = malloc(sizeof(*inner1)); - assert(inner1 != NULL); - createLinkedLoop(inner1, &verts2[0], 3); - - GeoCoord verts3[] = {{0.2, 0.2}, {0.3, 0.3}, {0.2, 0.3}}; - - LinkedGeoLoop* inner2 = malloc(sizeof(*inner2)); - assert(inner2 != NULL); - createLinkedLoop(inner2, &verts3[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, inner2); - addLinkedLoop(&polygon, outer); - addLinkedLoop(&polygon, inner1); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 1, - "Polygon count correct for 2 holes"); - t_assert(polygon.first == outer, "Got expected outer loop"); - t_assert(countLinkedLoops(&polygon) == 3, - "Loop count on first polygon correct"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonTwoDonuts) { - GeoCoord verts[] = {{0, 0}, {0, 3}, {3, 3}, {3, 0}}; - LinkedGeoLoop* outer = malloc(sizeof(*outer)); - assert(outer != NULL); - createLinkedLoop(outer, &verts[0], 4); - - GeoCoord verts2[] = {{1, 1}, {2, 2}, {1, 2}}; - LinkedGeoLoop* inner = malloc(sizeof(*inner)); - assert(inner != NULL); - createLinkedLoop(inner, &verts2[0], 3); - - GeoCoord verts3[] = {{0, 0}, {0, -3}, {-3, -3}, {-3, 0}}; - LinkedGeoLoop* outer2 = malloc(sizeof(*outer)); - assert(outer2 != NULL); - createLinkedLoop(outer2, &verts3[0], 4); - - GeoCoord verts4[] = {{-1, -1}, {-2, -2}, {-1, -2}}; - LinkedGeoLoop* inner2 = malloc(sizeof(*inner)); - assert(inner2 != NULL); - createLinkedLoop(inner2, &verts4[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, inner2); - addLinkedLoop(&polygon, inner); - addLinkedLoop(&polygon, outer); - addLinkedLoop(&polygon, outer2); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 2, - "Loop count on first polygon correct"); - t_assert(countLinkedCoords(polygon.first) == 4, - "Got expected outer loop"); - t_assert(countLinkedCoords(polygon.first->next) == 3, - "Got expected inner loop"); - t_assert(countLinkedLoops(polygon.next) == 2, - "Loop count on second polygon correct"); - t_assert(countLinkedCoords(polygon.next->first) == 4, - "Got expected outer loop"); - t_assert(countLinkedCoords(polygon.next->first->next) == 3, - "Got expected inner loop"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonNestedDonuts) { - GeoCoord verts[] = {{0.2, 0.2}, {0.2, -0.2}, {-0.2, -0.2}, {-0.2, 0.2}}; - LinkedGeoLoop* outer = malloc(sizeof(*outer)); - assert(outer != NULL); - createLinkedLoop(outer, &verts[0], 4); - - GeoCoord verts2[] = { - {0.1, 0.1}, {-0.1, 0.1}, {-0.1, -0.1}, {0.1, -0.1}}; - LinkedGeoLoop* inner = malloc(sizeof(*inner)); - assert(inner != NULL); - createLinkedLoop(inner, &verts2[0], 4); - - GeoCoord verts3[] = { - {0.6, 0.6}, {0.6, -0.6}, {-0.6, -0.6}, {-0.6, 0.6}}; - LinkedGeoLoop* outerBig = malloc(sizeof(*outerBig)); - assert(outerBig != NULL); - createLinkedLoop(outerBig, &verts3[0], 4); - - GeoCoord verts4[] = { - {0.5, 0.5}, {-0.5, 0.5}, {-0.5, -0.5}, {0.5, -0.5}}; - LinkedGeoLoop* innerBig = malloc(sizeof(*innerBig)); - assert(innerBig != NULL); - createLinkedLoop(innerBig, &verts4[0], 4); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, inner); - addLinkedLoop(&polygon, outerBig); - addLinkedLoop(&polygon, innerBig); - addLinkedLoop(&polygon, outer); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_SUCCESS, "No error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 2, - "Loop count on first polygon correct"); - t_assert(polygon.first == outerBig, "Got expected outer loop"); - t_assert(polygon.first->next == innerBig, "Got expected inner loop"); - t_assert(countLinkedLoops(polygon.next) == 2, - "Loop count on second polygon correct"); - t_assert(polygon.next->first == outer, "Got expected outer loop"); - t_assert(polygon.next->first->next == inner, "Got expected inner loop"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonNoOuterLoops) { - GeoCoord verts1[] = {{0, 0}, {1, 1}, {0, 1}}; - - LinkedGeoLoop* outer1 = malloc(sizeof(*outer1)); - assert(outer1 != NULL); - createLinkedLoop(outer1, &verts1[0], 3); - - GeoCoord verts2[] = {{2, 2}, {3, 3}, {2, 3}}; - - LinkedGeoLoop* outer2 = malloc(sizeof(*outer2)); - assert(outer2 != NULL); - createLinkedLoop(outer2, &verts2[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, outer1); - addLinkedLoop(&polygon, outer2); - - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_ERR_UNASSIGNED_HOLES, - "Expected error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 0, - "Loop count as expected with invalid input"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } - - TEST(normalizeMultiPolygonAlreadyNormalized) { - GeoCoord verts1[] = {{0, 0}, {0, 1}, {1, 1}}; - - LinkedGeoLoop* outer1 = malloc(sizeof(*outer1)); - assert(outer1 != NULL); - createLinkedLoop(outer1, &verts1[0], 3); - - GeoCoord verts2[] = {{2, 2}, {2, 3}, {3, 3}}; - - LinkedGeoLoop* outer2 = malloc(sizeof(*outer2)); - assert(outer2 != NULL); - createLinkedLoop(outer2, &verts2[0], 3); - - LinkedGeoPolygon polygon = {0}; - addLinkedLoop(&polygon, outer1); - LinkedGeoPolygon* next = addNewLinkedPolygon(&polygon); - addLinkedLoop(next, outer2); - - // Should be a no-op - int result = normalizeMultiPolygon(&polygon); - - t_assert(result == NORMALIZATION_ERR_MULTIPLE_POLYGONS, - "Expected error code returned"); - - t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); - t_assert(countLinkedLoops(&polygon) == 1, - "Loop count on first polygon correct"); - t_assert(polygon.first == outer1, "Got expected outer loop"); - t_assert(countLinkedLoops(polygon.next) == 1, - "Loop count on second polygon correct"); - t_assert(polygon.next->first == outer2, "Got expected outer loop"); - - H3_EXPORT(destroyLinkedPolygon)(&polygon); - } -} diff --git a/src/apps/testapps/testPolygonInternal.c b/src/apps/testapps/testPolygonInternal.c new file mode 100644 index 000000000..3cc91d114 --- /dev/null +++ b/src/apps/testapps/testPolygonInternal.c @@ -0,0 +1,900 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "bbox.h" +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "linkedGeo.h" +#include "polygon.h" +#include "test.h" + +// Fixtures +static LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; + +static void createLinkedLoop(LinkedGeoLoop *loop, LatLng *verts, int numVerts) { + *loop = (LinkedGeoLoop){0}; + for (int i = 0; i < numVerts; i++) { + addLinkedCoord(loop, verts++); + } +} + +SUITE(polygonInternal) { + TEST(pointInsideGeoLoop) { + GeoLoop geoloop = {.numVerts = 6, .verts = sfVerts}; + + LatLng inside = {0.659, -2.136}; + LatLng somewhere = {1, 2}; + + BBox bbox; + bboxFromGeoLoop(&geoloop, &bbox); + + // For exact points on the polygon, we bias west and south + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &sfVerts[0]), + "does not contain exact vertex 0"); + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &sfVerts[3]), + "contains exact vertex 3"); + + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &inside), + "contains point inside"); + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &somewhere), + "contains somewhere else"); + } + + TEST(pointInsideGeoLoopCornerCases) { + LatLng verts[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + BBox bbox; + bboxFromGeoLoop(&geoloop, &bbox); + + LatLng point = {0, 0}; + + // Test corners. For exact points on the polygon, we bias west and + // north, so only the southeast corner is contained. + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "does not contain sw corner"); + point.lat = 1; + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "does not contain nw corner "); + point.lng = 1; + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "does not contain ne corner "); + point.lat = 0; + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &point), + "contains se corner "); + } + + TEST(pointInsideGeoLoopEdgeCases) { + LatLng verts[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + BBox bbox; + bboxFromGeoLoop(&geoloop, &bbox); + + LatLng point; + + // Test edges. Only points on south and east edges are contained. + point.lat = 0.5; + point.lng = 0; + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "does not contain point on west edge"); + point.lat = 1; + point.lng = 0.5; + t_assert(!pointInsideGeoLoop(&geoloop, &bbox, &point), + "does not contain point on north edge"); + point.lat = 0.5; + point.lng = 1; + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &point), + "contains point on east edge"); + point.lat = 0; + point.lng = 0.5; + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &point), + "contains point on south edge"); + } + + TEST(pointInsideGeoLoopExtraEdgeCase) { + // This is a carefully crafted shape + point to hit an otherwise + // missed branch in coverage + LatLng verts[] = {{0, 0}, {1, 0.5}, {0, 1}}; + GeoLoop geoloop = {.numVerts = 3, .verts = verts}; + + BBox bbox; + bboxFromGeoLoop(&geoloop, &bbox); + + LatLng point = {0.5, 0.5}; + t_assert(pointInsideGeoLoop(&geoloop, &bbox, &point), + "contains inside point matching longitude of a vertex"); + } + + TEST(pointInsideGeoLoopTransmeridian) { + LatLng verts[] = {{0.01, -M_PI + 0.01}, + {0.01, M_PI - 0.01}, + {-0.01, M_PI - 0.01}, + {-0.01, -M_PI + 0.01}}; + GeoLoop transMeridianGeoLoop = {.numVerts = 4, .verts = verts}; + + LatLng eastPoint = {0.001, -M_PI + 0.001}; + LatLng eastPointOutside = {0.001, -M_PI + 0.1}; + LatLng westPoint = {0.001, M_PI - 0.001}; + LatLng westPointOutside = {0.001, M_PI - 0.1}; + + BBox bbox; + bboxFromGeoLoop(&transMeridianGeoLoop, &bbox); + + t_assert(pointInsideGeoLoop(&transMeridianGeoLoop, &bbox, &westPoint), + "contains point to the west of the antimeridian"); + t_assert(pointInsideGeoLoop(&transMeridianGeoLoop, &bbox, &eastPoint), + "contains point to the east of the antimeridian"); + t_assert( + !pointInsideGeoLoop(&transMeridianGeoLoop, &bbox, + &westPointOutside), + "does not contain outside point to the west of the antimeridian"); + t_assert( + !pointInsideGeoLoop(&transMeridianGeoLoop, &bbox, + &eastPointOutside), + "does not contain outside point to the east of the antimeridian"); + } + + TEST(pointInsideLinkedGeoLoop) { + LatLng somewhere = {1, 2}; + LatLng inside = {0.659, -2.136}; + + LinkedGeoLoop loop; + createLinkedLoop(&loop, &sfVerts[0], 6); + + BBox bbox; + bboxFromLinkedGeoLoop(&loop, &bbox); + + t_assert(pointInsideLinkedGeoLoop(&loop, &bbox, &inside), + "contains exact4"); + t_assert(!pointInsideLinkedGeoLoop(&loop, &bbox, &somewhere), + "contains somewhere else"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(bboxFromGeoLoop) { + LatLng verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + const BBox expected = {1.1, 0.7, 0.7, 0.2}; + + BBox result; + bboxFromGeoLoop(&geoloop, &result); + t_assert(bboxEquals(&result, &expected), "Got expected bbox"); + } + + TEST(bboxFromGeoLoopTransmeridian) { + LatLng verts[] = {{0.1, -M_PI + 0.1}, {0.1, M_PI - 0.1}, + {0.05, M_PI - 0.2}, {-0.1, M_PI - 0.1}, + {-0.1, -M_PI + 0.1}, {-0.05, -M_PI + 0.2}}; + GeoLoop geoloop = {.numVerts = 6, .verts = verts}; + + const BBox expected = {0.1, -0.1, -M_PI + 0.2, M_PI - 0.2}; + + BBox result; + bboxFromGeoLoop(&geoloop, &result); + t_assert(bboxEquals(&result, &expected), + "Got expected transmeridian bbox"); + } + + TEST(bboxFromGeoLoopNoVertices) { + GeoLoop geoloop; + geoloop.verts = NULL; + geoloop.numVerts = 0; + + const BBox expected = {0.0, 0.0, 0.0, 0.0}; + + BBox result; + bboxFromGeoLoop(&geoloop, &result); + + t_assert(bboxEquals(&result, &expected), "Got expected bbox"); + } + + TEST(bboxesFromGeoPolygon) { + LatLng verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + + const BBox expected = {1.1, 0.7, 0.7, 0.2}; + + BBox *result = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, result); + t_assert(bboxEquals(&result[0], &expected), "Got expected bbox"); + + free(result); + } + + TEST(bboxesFromGeoPolygonHole) { + LatLng verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + // not a real hole, but doesn't matter for the test + LatLng holeVerts[] = {{0.9, 0.3}, {0.9, 0.5}, {1.0, 0.7}, {0.9, 0.3}}; + GeoLoop holeGeoLoop = {.numVerts = 4, .verts = holeVerts}; + + GeoPolygon polygon = { + .geoloop = geoloop, .numHoles = 1, .holes = &holeGeoLoop}; + + const BBox expected = {1.1, 0.7, 0.7, 0.2}; + const BBox expectedHole = {1.0, 0.9, 0.7, 0.3}; + + BBox *result = calloc(sizeof(BBox), 2); + bboxesFromGeoPolygon(&polygon, result); + t_assert(bboxEquals(&result[0], &expected), "Got expected bbox"); + t_assert(bboxEquals(&result[1], &expectedHole), + "Got expected hole bbox"); + + free(result); + } + + TEST(bboxFromLinkedGeoLoop) { + LatLng verts[] = {{0.8, 0.3}, {0.7, 0.6}, {1.1, 0.7}, {1.0, 0.2}}; + + LinkedGeoLoop loop; + createLinkedLoop(&loop, &verts[0], 4); + + const BBox expected = {1.1, 0.7, 0.7, 0.2}; + + BBox result; + bboxFromLinkedGeoLoop(&loop, &result); + t_assert(bboxEquals(&result, &expected), "Got expected bbox"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(bboxFromLinkedGeoLoopNoVertices) { + LinkedGeoLoop loop = {0}; + + const BBox expected = {0.0, 0.0, 0.0, 0.0}; + + BBox result; + bboxFromLinkedGeoLoop(&loop, &result); + + t_assert(bboxEquals(&result, &expected), "Got expected bbox"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(isClockwiseGeoLoop) { + LatLng verts[] = {{0, 0}, {0.1, 0.1}, {0, 0.1}}; + GeoLoop geoloop = {.numVerts = 3, .verts = verts}; + + t_assert(isClockwiseGeoLoop(&geoloop), + "Got true for clockwise geoloop"); + } + + TEST(isClockwiseLinkedGeoLoop) { + LatLng verts[] = {{0.1, 0.1}, {0.2, 0.2}, {0.1, 0.2}}; + LinkedGeoLoop loop; + createLinkedLoop(&loop, &verts[0], 3); + + t_assert(isClockwiseLinkedGeoLoop(&loop), + "Got true for clockwise loop"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(isNotClockwiseLinkedGeoLoop) { + LatLng verts[] = {{0, 0}, {0, 0.4}, {0.4, 0.4}, {0.4, 0}}; + LinkedGeoLoop loop; + createLinkedLoop(&loop, &verts[0], 4); + + t_assert(!isClockwiseLinkedGeoLoop(&loop), + "Got false for counter-clockwise loop"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(isClockwiseGeoLoopTransmeridian) { + LatLng verts[] = {{0.4, M_PI - 0.1}, + {0.4, -M_PI + 0.1}, + {-0.4, -M_PI + 0.1}, + {-0.4, M_PI - 0.1}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + t_assert(isClockwiseGeoLoop(&geoloop), + "Got true for clockwise geoloop"); + } + + TEST(isClockwiseLinkedGeoLoopTransmeridian) { + LatLng verts[] = {{0.4, M_PI - 0.1}, + {0.4, -M_PI + 0.1}, + {-0.4, -M_PI + 0.1}, + {-0.4, M_PI - 0.1}}; + LinkedGeoLoop loop; + createLinkedLoop(&loop, &verts[0], 4); + + t_assert(isClockwiseLinkedGeoLoop(&loop), + "Got true for clockwise transmeridian loop"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(isNotClockwiseLinkedGeoLoopTransmeridian) { + LatLng verts[] = {{0.4, M_PI - 0.1}, + {-0.4, M_PI - 0.1}, + {-0.4, -M_PI + 0.1}, + {0.4, -M_PI + 0.1}}; + LinkedGeoLoop loop; + createLinkedLoop(&loop, &verts[0], 4); + + t_assert(!isClockwiseLinkedGeoLoop(&loop), + "Got false for counter-clockwise transmeridian loop"); + + destroyLinkedGeoLoop(&loop); + } + + TEST(normalizeMultiPolygonSingle) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}}; + + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, outer); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 1, "Loop count correct"); + t_assert(polygon.first == outer, "Got expected loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonTwoOuterLoops) { + LatLng verts1[] = {{0, 0}, {0, 1}, {1, 1}}; + + LinkedGeoLoop *outer1 = malloc(sizeof(*outer1)); + assert(outer1 != NULL); + createLinkedLoop(outer1, &verts1[0], 3); + + LatLng verts2[] = {{2, 2}, {2, 3}, {3, 3}}; + + LinkedGeoLoop *outer2 = malloc(sizeof(*outer2)); + assert(outer2 != NULL); + createLinkedLoop(outer2, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, outer1); + addLinkedLoop(&polygon, outer2); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 1, + "Loop count on first polygon correct"); + t_assert(countLinkedLoops(polygon.next) == 1, + "Loop count on second polygon correct"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonOneHole) { + LatLng verts[] = {{0, 0}, {0, 3}, {3, 3}, {3, 0}}; + + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + LatLng verts2[] = {{1, 1}, {2, 2}, {1, 2}}; + + LinkedGeoLoop *inner = malloc(sizeof(*inner)); + assert(inner != NULL); + createLinkedLoop(inner, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner); + addLinkedLoop(&polygon, outer); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 2, + "Loop count on first polygon correct"); + t_assert(polygon.first == outer, "Got expected outer loop"); + t_assert(polygon.first->next == inner, "Got expected inner loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonTwoHoles) { + LatLng verts[] = {{0, 0}, {0, 0.4}, {0.4, 0.4}, {0.4, 0}}; + + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + LatLng verts2[] = {{0.1, 0.1}, {0.2, 0.2}, {0.1, 0.2}}; + + LinkedGeoLoop *inner1 = malloc(sizeof(*inner1)); + assert(inner1 != NULL); + createLinkedLoop(inner1, &verts2[0], 3); + + LatLng verts3[] = {{0.2, 0.2}, {0.3, 0.3}, {0.2, 0.3}}; + + LinkedGeoLoop *inner2 = malloc(sizeof(*inner2)); + assert(inner2 != NULL); + createLinkedLoop(inner2, &verts3[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner2); + addLinkedLoop(&polygon, outer); + addLinkedLoop(&polygon, inner1); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 1, + "Polygon count correct for 2 holes"); + t_assert(polygon.first == outer, "Got expected outer loop"); + t_assert(countLinkedLoops(&polygon) == 3, + "Loop count on first polygon correct"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonTwoDonuts) { + LatLng verts[] = {{0, 0}, {0, 3}, {3, 3}, {3, 0}}; + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + LatLng verts2[] = {{1, 1}, {2, 2}, {1, 2}}; + LinkedGeoLoop *inner = malloc(sizeof(*inner)); + assert(inner != NULL); + createLinkedLoop(inner, &verts2[0], 3); + + LatLng verts3[] = {{0, 0}, {0, -3}, {-3, -3}, {-3, 0}}; + LinkedGeoLoop *outer2 = malloc(sizeof(*outer)); + assert(outer2 != NULL); + createLinkedLoop(outer2, &verts3[0], 4); + + LatLng verts4[] = {{-1, -1}, {-2, -2}, {-1, -2}}; + LinkedGeoLoop *inner2 = malloc(sizeof(*inner)); + assert(inner2 != NULL); + createLinkedLoop(inner2, &verts4[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner2); + addLinkedLoop(&polygon, inner); + addLinkedLoop(&polygon, outer); + addLinkedLoop(&polygon, outer2); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 2, + "Loop count on first polygon correct"); + t_assert(countLinkedCoords(polygon.first) == 4, + "Got expected outer loop"); + t_assert(countLinkedCoords(polygon.first->next) == 3, + "Got expected inner loop"); + t_assert(countLinkedLoops(polygon.next) == 2, + "Loop count on second polygon correct"); + t_assert(countLinkedCoords(polygon.next->first) == 4, + "Got expected outer loop"); + t_assert(countLinkedCoords(polygon.next->first->next) == 3, + "Got expected inner loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonNestedDonuts) { + LatLng verts[] = {{0.2, 0.2}, {0.2, -0.2}, {-0.2, -0.2}, {-0.2, 0.2}}; + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + LatLng verts2[] = {{0.1, 0.1}, {-0.1, 0.1}, {-0.1, -0.1}, {0.1, -0.1}}; + LinkedGeoLoop *inner = malloc(sizeof(*inner)); + assert(inner != NULL); + createLinkedLoop(inner, &verts2[0], 4); + + LatLng verts3[] = {{0.6, 0.6}, {0.6, -0.6}, {-0.6, -0.6}, {-0.6, 0.6}}; + LinkedGeoLoop *outerBig = malloc(sizeof(*outerBig)); + assert(outerBig != NULL); + createLinkedLoop(outerBig, &verts3[0], 4); + + LatLng verts4[] = {{0.5, 0.5}, {-0.5, 0.5}, {-0.5, -0.5}, {0.5, -0.5}}; + LinkedGeoLoop *innerBig = malloc(sizeof(*innerBig)); + assert(innerBig != NULL); + createLinkedLoop(innerBig, &verts4[0], 4); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner); + addLinkedLoop(&polygon, outerBig); + addLinkedLoop(&polygon, innerBig); + addLinkedLoop(&polygon, outer); + + t_assertSuccess(normalizeMultiPolygon(&polygon)); + + t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 2, + "Loop count on first polygon correct"); + t_assert(polygon.first == outerBig, "Got expected outer loop"); + t_assert(polygon.first->next == innerBig, "Got expected inner loop"); + t_assert(countLinkedLoops(polygon.next) == 2, + "Loop count on second polygon correct"); + t_assert(polygon.next->first == outer, "Got expected outer loop"); + t_assert(polygon.next->first->next == inner, "Got expected inner loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonNoOuterLoops) { + LatLng verts1[] = {{0, 0}, {1, 1}, {0, 1}}; + + LinkedGeoLoop *outer1 = malloc(sizeof(*outer1)); + assert(outer1 != NULL); + createLinkedLoop(outer1, &verts1[0], 3); + + LatLng verts2[] = {{2, 2}, {3, 3}, {2, 3}}; + + LinkedGeoLoop *outer2 = malloc(sizeof(*outer2)); + assert(outer2 != NULL); + createLinkedLoop(outer2, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, outer1); + addLinkedLoop(&polygon, outer2); + + t_assert(normalizeMultiPolygon(&polygon) == E_FAILED, + "Expected error code returned"); + + t_assert(countLinkedPolygons(&polygon) == 1, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 0, + "Loop count as expected with invalid input"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygonAlreadyNormalized) { + LatLng verts1[] = {{0, 0}, {0, 1}, {1, 1}}; + + LinkedGeoLoop *outer1 = malloc(sizeof(*outer1)); + assert(outer1 != NULL); + createLinkedLoop(outer1, &verts1[0], 3); + + LatLng verts2[] = {{2, 2}, {2, 3}, {3, 3}}; + + LinkedGeoLoop *outer2 = malloc(sizeof(*outer2)); + assert(outer2 != NULL); + createLinkedLoop(outer2, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, outer1); + LinkedGeoPolygon *next = addNewLinkedPolygon(&polygon); + addLinkedLoop(next, outer2); + + // Should be a no-op + t_assert(normalizeMultiPolygon(&polygon) == E_FAILED, + "Expected error code returned"); + + t_assert(countLinkedPolygons(&polygon) == 2, "Polygon count correct"); + t_assert(countLinkedLoops(&polygon) == 1, + "Loop count on first polygon correct"); + t_assert(polygon.first == outer1, "Got expected outer loop"); + t_assert(countLinkedLoops(polygon.next) == 1, + "Loop count on second polygon correct"); + t_assert(polygon.next->first == outer2, "Got expected outer loop"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(normalizeMultiPolygon_unassignedHole) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + + LinkedGeoLoop *outer = malloc(sizeof(*outer)); + assert(outer != NULL); + createLinkedLoop(outer, &verts[0], 4); + + LatLng verts2[] = {{2, 2}, {3, 3}, {2, 3}}; + + LinkedGeoLoop *inner = malloc(sizeof(*inner)); + assert(inner != NULL); + createLinkedLoop(inner, &verts2[0], 3); + + LinkedGeoPolygon polygon = {0}; + addLinkedLoop(&polygon, inner); + addLinkedLoop(&polygon, outer); + + t_assert(normalizeMultiPolygon(&polygon) == E_FAILED, + "Expected error code returned"); + + H3_EXPORT(destroyLinkedMultiPolygon)(&polygon); + } + + TEST(lineCrossesLine) { + LatLng lines1[4] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; + t_assert( + lineCrossesLine(&lines1[0], &lines1[1], &lines1[2], &lines1[3]), + "diagonal intersection"); + + LatLng lines2[4] = {{1, 1}, {0, 0}, {1, 0}, {0, 1}}; + t_assert( + lineCrossesLine(&lines2[0], &lines2[1], &lines2[2], &lines2[3]), + "diagonal intersection, reverse vertexes"); + + LatLng lines3[4] = {{0.5, 0}, {0.5, 1}, {0, 0.5}, {1, 0.5}}; + t_assert( + lineCrossesLine(&lines3[0], &lines3[1], &lines3[2], &lines3[3]), + "horizontal/vertical intersection"); + + LatLng lines4[4] = {{0.5, 1}, {0.5, 0}, {1, 0.5}, {0, 0.5}}; + t_assert( + lineCrossesLine(&lines4[0], &lines4[1], &lines4[2], &lines4[3]), + "horizontal/vertical intersection, reverse vertexes"); + + LatLng lines5[4] = {{0, 0}, {0.4, 0.4}, {0, 1}, {1, 0}}; + t_assert( + !lineCrossesLine(&lines5[0], &lines5[1], &lines5[2], &lines5[3]), + "diagonal non-intersection, below"); + + LatLng lines6[4] = {{0.6, 0.6}, {1, 1}, {0, 1}, {1, 0}}; + t_assert( + !lineCrossesLine(&lines6[0], &lines6[1], &lines6[2], &lines6[3]), + "diagonal non-intersection, above"); + + LatLng lines7[4] = {{0.5, 0}, {0.5, 1}, {0, 0.5}, {0.4, 0.5}}; + t_assert( + !lineCrossesLine(&lines7[0], &lines7[1], &lines7[2], &lines7[3]), + "horizontal/vertical non-intersection, below"); + + LatLng lines8[4] = {{0.5, 0}, {0.5, 1}, {0.6, 0.5}, {1, 0.5}}; + t_assert( + !lineCrossesLine(&lines8[0], &lines8[1], &lines8[2], &lines8[3]), + "horizontal/vertical non-intersection, above"); + + LatLng lines9[4] = {{0.5, 0}, {0.5, 0.4}, {0, 0.5}, {1, 0.5}}; + t_assert( + !lineCrossesLine(&lines9[0], &lines9[1], &lines9[2], &lines9[3]), + "horizontal/vertical non-intersection, left"); + + LatLng lines10[4] = {{0.5, 0.6}, {0.5, 1}, {0, 0.5}, {1, 0.5}}; + t_assert(!lineCrossesLine(&lines10[0], &lines10[1], &lines10[2], + &lines10[3]), + "horizontal/vertical non-intersection, right"); + } + + TEST(cellBoundaryInsidePolygon_inside) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "simple containment is inside"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_insideTransmeridianWest) { + LatLng verts[] = {{0, M_PI - 0.5}, + {0, -M_PI + 0.5}, + {1, -M_PI + 0.5}, + {1, M_PI - 0.5}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = {.numVerts = 4, + .verts = {{0.6, M_PI - 0.1}, + {0.6, M_PI - 0.2}, + {0.4, M_PI - 0.2}, + {0.4, M_PI - 0.1}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "simple containment is inside, west side of transmeridian"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_insideTransmeridianEast) { + LatLng verts[] = {{0, M_PI - 0.5}, + {0, -M_PI + 0.5}, + {1, -M_PI + 0.5}, + {1, M_PI - 0.5}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = {.numVerts = 4, + .verts = {{0.6, -M_PI + 0.4}, + {0.6, -M_PI + 0.2}, + {0.4, -M_PI + 0.2}, + {0.4, -M_PI + 0.4}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "simple containment is inside, east side of transmeridian"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_insideWithHole) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + LatLng holeVerts[] = {{0.3, 0.3}, {0.3, 0.1}, {0.1, 0.1}, {0.1, 0.3}}; + GeoLoop holeGeoLoop = {.numVerts = 4, .verts = holeVerts}; + + GeoPolygon polygon = { + .geoloop = geoloop, .numHoles = 1, .holes = &holeGeoLoop}; + + BBox *bboxes = calloc(sizeof(BBox), 2); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "simple containment is inside, with hole"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInside) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{1.6, 1.6}, {1.6, 1.4}, {1.4, 1.4}, {1.4, 1.6}}}; + BBox boundaryBBox = {1.6, 1.4, 1.6, 1.4}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "fully outside is not inside"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInsideIntersect) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.6, 0.6}, {1.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}}; + BBox boundaryBBox = {1.6, 0.4, 0.6, 0.4}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "intersecting polygon is not inside"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInsideIntersectHole) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + LatLng holeVerts[] = {{0.3, 0.3}, {0.5, 0.5}, {0.1, 0.1}, {0.1, 0.3}}; + GeoLoop holeGeoLoop = {.numVerts = 4, .verts = holeVerts}; + + GeoPolygon polygon = { + .geoloop = geoloop, .numHoles = 1, .holes = &holeGeoLoop}; + + BBox *bboxes = calloc(sizeof(BBox), 2); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "not inside with hole intersection"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInsideWithinHole) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + LatLng holeVerts[] = {{0.9, 0.9}, {0.9, 0.1}, {0.1, 0.1}, {0.1, 0.9}}; + GeoLoop holeGeoLoop = {.numVerts = 4, .verts = holeVerts}; + + GeoPolygon polygon = { + .geoloop = geoloop, .numHoles = 1, .holes = &holeGeoLoop}; + + BBox *bboxes = calloc(sizeof(BBox), 2); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}}; + BBox boundaryBBox = {0.6, 0.4, 0.6, 0.4}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "not inside when within hole"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInsideContains) { + LatLng verts[] = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + BBox *bboxes = calloc(sizeof(BBox), 1); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = {.numVerts = 4, + .verts = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}}; + BBox boundaryBBox = {0, 1, 0, 1}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "not inside when it contains outer"); + free(bboxes); + } + + TEST(cellBoundaryInsidePolygon_notInsideContainsHole) { + LatLng verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + GeoLoop geoloop = {.numVerts = 4, .verts = verts}; + + LatLng holeVerts[] = {{0.6, 0.6}, {0.6, 0.4}, {0.4, 0.4}, {0.4, 0.6}}; + + GeoLoop holeGeoLoop = {.numVerts = 4, .verts = holeVerts}; + + GeoPolygon polygon = { + .geoloop = geoloop, .numHoles = 1, .holes = &holeGeoLoop}; + + BBox *bboxes = calloc(sizeof(BBox), 2); + bboxesFromGeoPolygon(&polygon, bboxes); + + CellBoundary boundary = { + .numVerts = 4, + .verts = {{0.9, 0.9}, {0.9, 0.1}, {0.1, 0.1}, {0.1, 0.9}}}; + BBox boundaryBBox = {0.9, 0.1, 0.9, 0.1}; + + t_assert(!cellBoundaryInsidePolygon(&polygon, bboxes, &boundary, + &boundaryBBox), + "not inside when it contains hole"); + free(bboxes); + } +} diff --git a/src/apps/testapps/testPolygonToCells.c b/src/apps/testapps/testPolygonToCells.c new file mode 100644 index 000000000..f8724bac9 --- /dev/null +++ b/src/apps/testapps/testPolygonToCells.c @@ -0,0 +1,519 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "algos.h" +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +// Fixtures +static LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; +static GeoLoop sfGeoLoop = {.numVerts = 6, .verts = sfVerts}; +static GeoPolygon sfGeoPolygon; + +static LatLng holeVerts[] = {{0.6595072188743, -2.1371053983433}, + {0.6591482046471, -2.1373141048153}, + {0.6592295020837, -2.1365222838402}}; +static GeoLoop holeGeoLoop = {.numVerts = 3, .verts = holeVerts}; +static GeoPolygon holeGeoPolygon; + +static LatLng emptyVerts[] = {{0.659966917655, -2.1364398519394}, + {0.659966917656, -2.1364398519395}, + {0.659966917657, -2.1364398519396}}; +static GeoLoop emptyGeoLoop = {.numVerts = 3, .verts = emptyVerts}; +static GeoPolygon emptyGeoPolygon; + +static LatLng invalidVerts[] = {{INFINITY, INFINITY}, {-INFINITY, -INFINITY}}; +static GeoLoop invalidGeoLoop = {.numVerts = 2, .verts = invalidVerts}; +static GeoPolygon invalidGeoPolygon; + +static LatLng invalid2Verts[] = {{NAN, NAN}, {-NAN, -NAN}}; +static GeoLoop invalid2GeoLoop = {.numVerts = 2, .verts = invalid2Verts}; +static GeoPolygon invalid2GeoPolygon; + +static LatLng pointVerts[] = {{0, 0}}; +static GeoLoop pointGeoLoop = {.numVerts = 1, .verts = pointVerts}; +static GeoPolygon pointGeoPolygon; + +static LatLng lineVerts[] = {{0, 0}, {1, 0}}; +static GeoLoop lineGeoLoop = {.numVerts = 2, .verts = lineVerts}; +static GeoPolygon lineGeoPolygon; + +/** + * Return true if the cell crosses the meridian. + */ +static bool isTransmeridianCell(H3Index h) { + CellBoundary bndry; + H3_EXPORT(cellToBoundary)(h, &bndry); + + double minLng = M_PI, maxLng = -M_PI; + for (int i = 0; i < bndry.numVerts; i++) { + if (bndry.verts[i].lng < minLng) minLng = bndry.verts[i].lng; + if (bndry.verts[i].lng > maxLng) maxLng = bndry.verts[i].lng; + } + + return maxLng - minLng > M_PI - (M_PI / 4); +} + +static void fillIndex_assertions(H3Index h) { + if (isTransmeridianCell(h)) { + // TODO: these do not work correctly + return; + } + + int currentRes = H3_EXPORT(getResolution)(h); + // TODO: Not testing more than one depth because the assertions fail. + for (int nextRes = currentRes; nextRes <= currentRes + 1; nextRes++) { + CellBoundary bndry; + H3_EXPORT(cellToBoundary)(h, &bndry); + GeoPolygon polygon = { + .geoloop = {.numVerts = bndry.numVerts, .verts = bndry.verts}, + .numHoles = 0, + .holes = 0}; + + int64_t polygonToCellsSize; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&polygon, nextRes, 0, + &polygonToCellsSize)); + H3Index *polygonToCellsOut = + calloc(polygonToCellsSize, sizeof(H3Index)); + t_assertSuccess( + H3_EXPORT(polygonToCells)(&polygon, nextRes, 0, polygonToCellsOut)); + + int64_t polygonToCellsCount = + countNonNullIndexes(polygonToCellsOut, polygonToCellsSize); + + int64_t childrenSize; + t_assertSuccess( + H3_EXPORT(cellToChildrenSize)(h, nextRes, &childrenSize)); + H3Index *children = calloc(childrenSize, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(h, nextRes, children)); + + int64_t cellToChildrenCount = + countNonNullIndexes(children, childrenSize); + + t_assert(polygonToCellsCount == cellToChildrenCount, + "PolygonToCells count matches cellToChildren count"); + + for (int i = 0; i < childrenSize; i++) { + bool found = false; + if (children[i] == H3_NULL) continue; + for (int j = 0; j < polygonToCellsSize; j++) { + if (polygonToCellsOut[j] == children[i]) { + found = true; + break; + } + } + t_assert( + found, + "All indexes match between polygonToCells and cellToChildren"); + } + + free(polygonToCellsOut); + free(children); + } +} + +SUITE(polygonToCells) { + sfGeoPolygon.geoloop = sfGeoLoop; + sfGeoPolygon.numHoles = 0; + + holeGeoPolygon.geoloop = sfGeoLoop; + holeGeoPolygon.numHoles = 1; + holeGeoPolygon.holes = &holeGeoLoop; + + emptyGeoPolygon.geoloop = emptyGeoLoop; + emptyGeoPolygon.numHoles = 0; + + invalidGeoPolygon.geoloop = invalidGeoLoop; + invalidGeoPolygon.numHoles = 0; + + invalid2GeoPolygon.geoloop = invalid2GeoLoop; + invalid2GeoPolygon.numHoles = 0; + + pointGeoPolygon.geoloop = pointGeoLoop; + pointGeoPolygon.numHoles = 0; + + lineGeoPolygon.geoloop = lineGeoLoop; + lineGeoPolygon.numHoles = 0; + + // -------------------------------------------- + // maxPolygonToCellsSize + // -------------------------------------------- + + TEST(maxPolygonToCellsSize) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&sfGeoPolygon, 9, 0, + &numHexagons)); + t_assert(numHexagons == 5613, "got expected max polygonToCells size"); + + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&holeGeoPolygon, 9, 0, + &numHexagons)); + t_assert(numHexagons == 5613, + "got expected max polygonToCells size (hole)"); + + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&emptyGeoPolygon, 9, 0, + &numHexagons)); + t_assert(numHexagons == 15, + "got expected max polygonToCells size (empty)"); + } + + TEST(maxPolygonToCellsSizeInvalid) { + int64_t numHexagons; + t_assert( + H3_EXPORT(maxPolygonToCellsSize)(&invalidGeoPolygon, 9, 0, + &numHexagons) == E_FAILED, + "Cannot determine cell size to invalid geo polygon with Infinity"); + t_assert(H3_EXPORT(maxPolygonToCellsSize)(&invalid2GeoPolygon, 9, 0, + &numHexagons) == E_FAILED, + "Cannot determine cell size to invalid geo polygon with NaNs"); + } + + TEST(maxPolygonToCellsSizePoint) { + int64_t numHexagons; + t_assert(H3_EXPORT(maxPolygonToCellsSize)(&pointGeoPolygon, 9, 0, + &numHexagons) == E_FAILED, + "Cannot estimate for single point"); + } + + TEST(maxPolygonToCellsSizeLine) { + int64_t numHexagons; + t_assert(H3_EXPORT(maxPolygonToCellsSize)(&lineGeoPolygon, 9, 0, + &numHexagons) == E_FAILED, + "Cannot estimate for straight line"); + } + + // -------------------------------------------- + // polygonToCells + // -------------------------------------------- + + TEST(polygonToCells) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&sfGeoPolygon, 9, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1253, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsHole) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&holeGeoPolygon, 9, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&holeGeoPolygon, 9, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1214, + "got expected polygonToCells size (hole)"); + free(hexagons); + } + + TEST(polygonToCellsEmpty) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&emptyGeoPolygon, 9, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&emptyGeoPolygon, 9, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, + "got expected polygonToCells size (empty)"); + free(hexagons); + } + + TEST(polygonToCellsExact) { + LatLng somewhere = {1, 2}; + H3Index origin; + t_assertSuccess(H3_EXPORT(latLngToCell)(&somewhere, 9, &origin)); + CellBoundary boundary; + H3_EXPORT(cellToBoundary)(origin, &boundary); + + LatLng *verts = calloc(boundary.numVerts + 1, sizeof(LatLng)); + for (int i = 0; i < boundary.numVerts; i++) { + verts[i] = boundary.verts[i]; + } + verts[boundary.numVerts] = boundary.verts[0]; + + GeoLoop someGeoLoop; + someGeoLoop.numVerts = boundary.numVerts + 1; + someGeoLoop.verts = verts; + GeoPolygon someHexagon; + someHexagon.geoloop = someGeoLoop; + someHexagon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess( + H3_EXPORT(maxPolygonToCellsSize)(&someHexagon, 9, 0, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&someHexagon, 9, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1, "got expected polygonToCells size (1)"); + free(hexagons); + free(verts); + } + + TEST(polygonToCellsTransmeridian) { + LatLng primeMeridianVerts[] = { + {0.01, 0.01}, {0.01, -0.01}, {-0.01, -0.01}, {-0.01, 0.01}}; + GeoLoop primeMeridianGeoLoop = {.numVerts = 4, + .verts = primeMeridianVerts}; + GeoPolygon primeMeridianGeoPolygon = {.geoloop = primeMeridianGeoLoop, + .numHoles = 0}; + + LatLng transMeridianVerts[] = {{0.01, -M_PI + 0.01}, + {0.01, M_PI - 0.01}, + {-0.01, M_PI - 0.01}, + {-0.01, -M_PI + 0.01}}; + GeoLoop transMeridianGeoLoop = {.numVerts = 4, + .verts = transMeridianVerts}; + GeoPolygon transMeridianGeoPolygon = {.geoloop = transMeridianGeoLoop, + .numHoles = 0}; + + LatLng transMeridianHoleVerts[] = {{0.005, -M_PI + 0.005}, + {0.005, M_PI - 0.005}, + {-0.005, M_PI - 0.005}, + {-0.005, -M_PI + 0.005}}; + GeoLoop transMeridianHoleGeoLoop = {.numVerts = 4, + .verts = transMeridianHoleVerts}; + GeoPolygon transMeridianHoleGeoPolygon = { + .geoloop = transMeridianGeoLoop, + .numHoles = 1, + .holes = &transMeridianHoleGeoLoop}; + GeoPolygon transMeridianFilledHoleGeoPolygon = { + .geoloop = transMeridianHoleGeoLoop, .numHoles = 0}; + + int64_t expectedSize; + + // Prime meridian case + expectedSize = 4228; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &primeMeridianGeoPolygon, 7, 0, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&primeMeridianGeoPolygon, 7, + 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == expectedSize, + "got expected polygonToCells size (prime meridian)"); + + // Transmeridian case + // This doesn't exactly match the prime meridian count because of slight + // differences in hex size and grid offset between the two cases + expectedSize = 4238; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &transMeridianGeoPolygon, 7, 0, &numHexagons)); + H3Index *hexagonsTM = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&transMeridianGeoPolygon, 7, + 0, hexagonsTM)); + actualNumIndexes = countNonNullIndexes(hexagonsTM, numHexagons); + + t_assert(actualNumIndexes == expectedSize, + "got expected polygonToCells size (transmeridian)"); + + // Transmeridian filled hole case -- only needed for calculating hole + // size + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &transMeridianFilledHoleGeoPolygon, 7, 0, &numHexagons)); + H3Index *hexagonsTMFH = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)( + &transMeridianFilledHoleGeoPolygon, 7, 0, hexagonsTMFH)); + int64_t actualNumHoleIndexes = + countNonNullIndexes(hexagonsTMFH, numHexagons); + + // Transmeridian hole case + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &transMeridianHoleGeoPolygon, 7, 0, &numHexagons)); + H3Index *hexagonsTMH = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&transMeridianHoleGeoPolygon, + 7, 0, hexagonsTMH)); + actualNumIndexes = countNonNullIndexes(hexagonsTMH, numHexagons); + + t_assert(actualNumIndexes == expectedSize - actualNumHoleIndexes, + "got expected polygonToCells size (transmeridian hole)"); + + free(hexagons); + free(hexagonsTM); + free(hexagonsTMFH); + free(hexagonsTMH); + } + + TEST(polygonToCellsTransmeridianComplex) { + // This polygon is "complex" in that it has > 4 vertices - this + // tests for a bug that was taking the max and min longitude as + // the bounds for transmeridian polygons + LatLng verts[] = {{0.1, -M_PI + 0.00001}, {0.1, M_PI - 0.00001}, + {0.05, M_PI - 0.2}, {-0.1, M_PI - 0.00001}, + {-0.1, -M_PI + 0.00001}, {-0.05, -M_PI + 0.2}}; + GeoLoop geoloop = {.numVerts = 6, .verts = verts}; + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + + int64_t numHexagons; + t_assertSuccess( + H3_EXPORT(maxPolygonToCellsSize)(&polygon, 4, 0, &numHexagons)); + + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(polygonToCells)(&polygon, 4, 0, hexagons)); + + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1204, + "got expected polygonToCells size (complex transmeridian)"); + + free(hexagons); + } + + TEST(polygonToCellsPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 9, 24, 0); + LatLng coord; + H3_EXPORT(cellToLatLng)(pentagon, &coord); + + // Length of half an edge of the polygon, in radians + double edgeLength2 = H3_EXPORT(degsToRads)(0.001); + + LatLng boundingTopRigt = coord; + boundingTopRigt.lat += edgeLength2; + boundingTopRigt.lng += edgeLength2; + + LatLng boundingTopLeft = coord; + boundingTopLeft.lat += edgeLength2; + boundingTopLeft.lng -= edgeLength2; + + LatLng boundingBottomRight = coord; + boundingBottomRight.lat -= edgeLength2; + boundingBottomRight.lng += edgeLength2; + + LatLng boundingBottomLeft = coord; + boundingBottomLeft.lat -= edgeLength2; + boundingBottomLeft.lng -= edgeLength2; + + LatLng verts[] = {boundingBottomLeft, boundingTopLeft, boundingTopRigt, + boundingBottomRight}; + + GeoLoop geoloop; + geoloop.verts = verts; + geoloop.numVerts = 4; + + GeoPolygon polygon; + polygon.geoloop = geoloop; + polygon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess( + H3_EXPORT(maxPolygonToCellsSize)(&polygon, 9, 0, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&polygon, 9, 0, hexagons)); + + int found = 0; + int numPentagons = 0; + for (int i = 0; i < numHexagons; i++) { + if (hexagons[i] != 0) { + found++; + } + if (H3_EXPORT(isPentagon)(hexagons[i])) { + numPentagons++; + } + } + t_assert(found == 1, "one index found"); + t_assert(numPentagons == 1, "one pentagon found"); + free(hexagons); + } + + TEST(invalidFlags) { + int64_t numHexagons; + for (uint32_t flags = CONTAINMENT_INVALID; flags <= 32; flags++) { + t_assert( + H3_EXPORT(maxPolygonToCellsSize)( + &sfGeoPolygon, 9, flags, &numHexagons) == E_OPTION_INVALID, + "Flags other than polyfill modes are invalid for " + "maxPolygonToCellsSize"); + } + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&sfGeoPolygon, 9, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + for (uint32_t flags = CONTAINMENT_INVALID; flags <= 32; flags++) { + t_assert(H3_EXPORT(polygonToCells)(&sfGeoPolygon, 9, flags, + hexagons) == E_OPTION_INVALID, + "Flags other than polyfill modes are invalid for " + "polygonToCells"); + } + free(hexagons); + } + + TEST(polygonToCellsInvalidPolygon) { + // Chosen arbitrarily, polygonToCells should error out before this is an + // issue. + int64_t numHexagons = 0; + + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + t_assert(H3_EXPORT(polygonToCells)(&invalidGeoPolygon, 9, 0, + hexagons) == E_FAILED, + "Invalid geo polygon cannot be evaluated"); + free(hexagons); + } + + TEST(fillIndex) { + iterateAllIndexesAtRes(0, fillIndex_assertions); + iterateAllIndexesAtRes(1, fillIndex_assertions); + iterateAllIndexesAtRes(2, fillIndex_assertions); + } + + TEST(getEdgeHexagonsInvalid) { + int64_t numHexagons = 100; + H3Index *search = calloc(numHexagons, sizeof(H3Index)); + assert(search != NULL); + H3Index *found = calloc(numHexagons, sizeof(H3Index)); + assert(found != NULL); + + int res = 0; + int64_t numSearchHexes = 0; + H3Error err = _getEdgeHexagons(&invalidGeoLoop, numHexagons, res, + &numSearchHexes, search, found); + t_assert(err != E_SUCCESS, + "_getEdgeHexagons returns error for invalid geoloop"); + + free(found); + free(search); + } +} diff --git a/src/apps/testapps/testPolygonToCellsExperimental.c b/src/apps/testapps/testPolygonToCellsExperimental.c new file mode 100644 index 000000000..371629d4e --- /dev/null +++ b/src/apps/testapps/testPolygonToCellsExperimental.c @@ -0,0 +1,1118 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "polyfill.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +// Fixtures +static LatLng sfVerts[] = { + {0.659966917655, -2.1364398519396}, {0.6595011102219, -2.1359434279405}, + {0.6583348114025, -2.1354884206045}, {0.6581220034068, -2.1382437718946}, + {0.6594479998527, -2.1384597563896}, {0.6599990002976, -2.1376771158464}}; +static GeoLoop sfGeoLoop = {.numVerts = 6, .verts = sfVerts}; +static GeoPolygon sfGeoPolygon; + +static LatLng holeVerts[] = {{0.6595072188743, -2.1371053983433}, + {0.6591482046471, -2.1373141048153}, + {0.6592295020837, -2.1365222838402}}; +static GeoLoop holeGeoLoop = {.numVerts = 3, .verts = holeVerts}; +static GeoPolygon holeGeoPolygon; + +static LatLng emptyVerts[] = {{0.659966917655, -2.1364398519394}, + {0.659966917656, -2.1364398519395}, + {0.659966917657, -2.1364398519396}}; +static GeoLoop emptyGeoLoop = {.numVerts = 3, .verts = emptyVerts}; +static GeoPolygon emptyGeoPolygon; + +static LatLng invalidVerts[] = {{INFINITY, INFINITY}, {-INFINITY, -INFINITY}}; +static GeoLoop invalidGeoLoop = {.numVerts = 2, .verts = invalidVerts}; +static GeoPolygon invalidGeoPolygon; + +static LatLng outOfBoundsVert[] = {{-2000, -2000}}; +static GeoLoop outOfBoundsVertGeoLoop = {.numVerts = 1, + .verts = outOfBoundsVert}; +static GeoPolygon outOfBoundsVertGeoPolygon; + +static LatLng invalid2Verts[] = {{NAN, NAN}, {-NAN, -NAN}}; +static GeoLoop invalid2GeoLoop = {.numVerts = 2, .verts = invalid2Verts}; +static GeoPolygon invalid2GeoPolygon; + +static GeoLoop nullGeoLoop = {.numVerts = 0}; +static GeoPolygon nullGeoPolygon; + +static LatLng pointVerts[] = {{0.6595072188743, -2.1371053983433}}; +static GeoLoop pointGeoLoop = {.numVerts = 1, .verts = pointVerts}; +static GeoPolygon pointGeoPolygon; + +static LatLng lineVerts[] = {{0.6595072188743, -2.1371053983433}, + {0.6591482046471, -2.1373141048153}}; +static GeoLoop lineGeoLoop = {.numVerts = 2, .verts = lineVerts}; +static GeoPolygon lineGeoPolygon; + +static GeoPolygon nullHoleGeoPolygon; +static GeoPolygon pointHoleGeoPolygon; +static GeoPolygon lineHoleGeoPolygon; + +/** + * Return true if the cell crosses the meridian. + */ +static bool isTransmeridianCell(H3Index h) { + CellBoundary bndry; + H3_EXPORT(cellToBoundary)(h, &bndry); + + double minLng = M_PI, maxLng = -M_PI; + for (int i = 0; i < bndry.numVerts; i++) { + if (bndry.verts[i].lng < minLng) minLng = bndry.verts[i].lng; + if (bndry.verts[i].lng > maxLng) maxLng = bndry.verts[i].lng; + } + + return maxLng - minLng > M_PI - (M_PI / 4); +} + +static void fillIndex_assertions(H3Index h) { + if (isTransmeridianCell(h)) { + // TODO: these do not work correctly + return; + } + + int currentRes = H3_EXPORT(getResolution)(h); + // TODO: Not testing more than one depth because the assertions fail. + for (int nextRes = currentRes; nextRes <= currentRes + 1; nextRes++) { + CellBoundary bndry; + H3_EXPORT(cellToBoundary)(h, &bndry); + GeoPolygon polygon = { + .geoloop = {.numVerts = bndry.numVerts, .verts = bndry.verts}, + .numHoles = 0, + .holes = 0}; + + int64_t polygonToCellsSize; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &polygon, nextRes, 0, &polygonToCellsSize)); + H3Index *polygonToCellsOut = + calloc(polygonToCellsSize, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &polygon, nextRes, CONTAINMENT_CENTER, polygonToCellsSize, + polygonToCellsOut)); + + int64_t polygonToCellsCount = + countNonNullIndexes(polygonToCellsOut, polygonToCellsSize); + + int64_t childrenSize; + t_assertSuccess( + H3_EXPORT(cellToChildrenSize)(h, nextRes, &childrenSize)); + H3Index *children = calloc(childrenSize, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(cellToChildren)(h, nextRes, children)); + + int64_t cellToChildrenCount = + countNonNullIndexes(children, childrenSize); + + t_assert(polygonToCellsCount == cellToChildrenCount, + "PolygonToCells count matches cellToChildren count"); + + for (int i = 0; i < childrenSize; i++) { + bool found = false; + if (children[i] == H3_NULL) continue; + for (int j = 0; j < polygonToCellsSize; j++) { + if (polygonToCellsOut[j] == children[i]) { + found = true; + break; + } + } + t_assert( + found, + "All indexes match between polygonToCells and cellToChildren"); + } + + free(polygonToCellsOut); + free(children); + } +} + +SUITE(polygonToCells) { + sfGeoPolygon.geoloop = sfGeoLoop; + sfGeoPolygon.numHoles = 0; + + holeGeoPolygon.geoloop = sfGeoLoop; + holeGeoPolygon.numHoles = 1; + holeGeoPolygon.holes = &holeGeoLoop; + + nullHoleGeoPolygon.geoloop = sfGeoLoop; + nullHoleGeoPolygon.numHoles = 1; + nullHoleGeoPolygon.holes = &nullGeoLoop; + + pointHoleGeoPolygon.geoloop = sfGeoLoop; + pointHoleGeoPolygon.numHoles = 1; + pointHoleGeoPolygon.holes = &pointGeoLoop; + + lineHoleGeoPolygon.geoloop = sfGeoLoop; + lineHoleGeoPolygon.numHoles = 1; + lineHoleGeoPolygon.holes = &lineGeoLoop; + + emptyGeoPolygon.geoloop = emptyGeoLoop; + emptyGeoPolygon.numHoles = 0; + + invalidGeoPolygon.geoloop = invalidGeoLoop; + invalidGeoPolygon.numHoles = 0; + + invalid2GeoPolygon.geoloop = invalid2GeoLoop; + invalid2GeoPolygon.numHoles = 0; + + outOfBoundsVertGeoPolygon.geoloop = outOfBoundsVertGeoLoop; + outOfBoundsVertGeoPolygon.numHoles = 0; + + nullGeoPolygon.geoloop = nullGeoLoop; + nullGeoPolygon.numHoles = 0; + + pointGeoPolygon.geoloop = pointGeoLoop; + pointGeoPolygon.numHoles = 0; + + lineGeoPolygon.geoloop = lineGeoLoop; + lineGeoPolygon.numHoles = 0; + + TEST(polygonToCells_ZeroSize) { + t_assert(H3_EXPORT(polygonToCellsExperimental)(&sfGeoPolygon, 9, + CONTAINMENT_CENTER, 0, + NULL) == E_MEMORY_BOUNDS, + "Doesn't write to empty array"); + } + + TEST(polygonToCells_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1253, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCells_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1175, + "got expected polygonToCells size (full containment mode)"); + free(hexagons); + } + + TEST(polygonToCells_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1334, + "got expected polygonToCells size (overlapping mode)"); + free(hexagons); + } + + TEST(polygonToCells_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1416, + "got expected polygonToCells size (overlapping bbox mode)"); + free(hexagons); + } + + TEST(polygonToCellsHole_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1214, + "got expected polygonToCells size (hole)"); + free(hexagons); + } + + TEST(polygonToCellsHole_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert( + actualNumIndexes == 1118, + "got expected polygonToCells size (hole, full containment mode)"); + free(hexagons); + } + + TEST(polygonToCellsHole_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1311, + "got expected polygonToCells size (hole, overlapping mode)"); + free(hexagons); + } + + TEST(polygonToCellsHole_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &holeGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert( + actualNumIndexes == 1403, + "got expected polygonToCells size (hole, overlapping bbox mode)"); + free(hexagons); + } + + TEST(polygonToCellsHoleParentIssue) { + // This checks a specific issue where the bounding box of the parent + // cell fully contains the hole. + LatLng outer[] = {{0.7774570821346158, 0.19441847890170674}, + {0.7528853613617879, 0.19441847890170674}, + {0.7528853613617879, 0.23497118026107888}, + {0.7774570821346158, 0.23497118026107888}}; + LatLng sanMarino[] = {{0.7662242554877188, 0.21790879024779208}, + {0.7660964275733029, 0.21688101821117023}, + {0.7668029019479251, 0.21636628570817204}, + {0.7676380769015895, 0.21713838446266925}, + {0.7677659048160054, 0.21823092566783267}, + {0.7671241996099247, 0.2184218123281233}, + {0.7662242554877188, 0.21790879024779208}}; + GeoPolygon polygon = { + .geoloop = {.numVerts = ARRAY_SIZE(outer), .verts = outer}, + .numHoles = 1, + .holes = (GeoLoop[]){ + {.numVerts = ARRAY_SIZE(sanMarino), .verts = sanMarino}}}; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &polygon, 6, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &polygon, 6, CONTAINMENT_CENTER, numHexagons, hexagons)); + + // This is the cell inside San Marino (i.e. inside the hole) + H3Index holeCell = 0x861ea3cefffffff; + + int found = 0; + for (int64_t i = 0; i < numHexagons; i++) { + if (hexagons[i] == holeCell) found = 1; + } + + t_assert(!found, "Did not include cell in hole"); + free(hexagons); + } + + TEST(polygonToCellsEmpty) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &emptyGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &emptyGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, + "got expected polygonToCells size (empty)"); + free(hexagons); + } + + TEST(polygonToCellsContainsPolygon) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsContainsPolygon_CenterContainment) { + // Contains the center point of a res 4 cell + LatLng centerVerts[] = {{0.6595645, -2.1353315}, + {0.6595645, -2.1353314}, + {0.6595644, -2.1353314}, + {0.6595644, -2.1353314265}}; + GeoLoop centerGeoLoop = {.numVerts = 4, .verts = centerVerts}; + GeoPolygon centerGeoPolygon; + centerGeoPolygon.geoloop = centerGeoLoop; + centerGeoPolygon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + ¢erGeoPolygon, 4, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + ¢erGeoPolygon, 4, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1, "got expected polygonToCells size"); + t_assert(hexagons[0] == 0x8428309ffffffff, "got expected hexagon"); + + free(hexagons); + } + + TEST(polygonToCellsContainsPolygon_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, + "got expected polygonToCells size (full containment mode)"); + free(hexagons); + } + + TEST(polygonToCellsContainsPolygon_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_OVERLAPPING, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1, + "got expected polygonToCells size (overlapping mode)"); + t_assert(hexagons[0] == 0x8428309ffffffff, "got expected hexagon"); + free(hexagons); + } + + TEST(polygonToCellsContainsPolygon_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_OVERLAPPING_BBOX, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 4, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 5, + "got expected polygonToCells size (overlapping bbox mode)"); + t_assert(hexagons[0] == 0x8428309ffffffff, "got expected hexagon"); + free(hexagons); + } + + TEST(polygonToCellsExact) { + LatLng somewhere = {1, 2}; + H3Index origin; + t_assertSuccess(H3_EXPORT(latLngToCell)(&somewhere, 9, &origin)); + CellBoundary boundary; + H3_EXPORT(cellToBoundary)(origin, &boundary); + + LatLng *verts = calloc(boundary.numVerts + 1, sizeof(LatLng)); + for (int i = 0; i < boundary.numVerts; i++) { + verts[i] = boundary.verts[i]; + } + verts[boundary.numVerts] = boundary.verts[0]; + + GeoLoop someGeoLoop; + someGeoLoop.numVerts = boundary.numVerts + 1; + someGeoLoop.verts = verts; + GeoPolygon someHexagon; + someHexagon.geoloop = someGeoLoop; + someHexagon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &someHexagon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + int64_t actualNumIndexes; + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &someHexagon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + t_assert(actualNumIndexes == 1, + "got expected polygonToCells size for center containment (1)"); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &someHexagon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + t_assert(actualNumIndexes == 1, + "got expected polygonToCells size for full containment (1)"); + + // TODO: CONTAINMENT_OVERLAPPING yields 7 cells, presumably due to FPE + // in the various cell boundaries + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &someHexagon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + // Overlapping BBox is very rough, so we get a couple of overlaps from + // non-neighboring cells + t_assert(actualNumIndexes == 9, + "got expected polygonToCells size for overlapping bbox " + "containment"); + + free(hexagons); + free(verts); + } + + TEST(polygonToCellsTransmeridian) { + LatLng primeMeridianVerts[] = { + {0.01, 0.01}, {0.01, -0.01}, {-0.01, -0.01}, {-0.01, 0.01}}; + GeoLoop primeMeridianGeoLoop = {.numVerts = 4, + .verts = primeMeridianVerts}; + GeoPolygon primeMeridianGeoPolygon = {.geoloop = primeMeridianGeoLoop, + .numHoles = 0}; + + LatLng transMeridianVerts[] = {{0.01, -M_PI + 0.01}, + {0.01, M_PI - 0.01}, + {-0.01, M_PI - 0.01}, + {-0.01, -M_PI + 0.01}}; + GeoLoop transMeridianGeoLoop = {.numVerts = 4, + .verts = transMeridianVerts}; + GeoPolygon transMeridianGeoPolygon = {.geoloop = transMeridianGeoLoop, + .numHoles = 0}; + + LatLng transMeridianHoleVerts[] = {{0.005, -M_PI + 0.005}, + {0.005, M_PI - 0.005}, + {-0.005, M_PI - 0.005}, + {-0.005, -M_PI + 0.005}}; + GeoLoop transMeridianHoleGeoLoop = {.numVerts = 4, + .verts = transMeridianHoleVerts}; + GeoPolygon transMeridianHoleGeoPolygon = { + .geoloop = transMeridianGeoLoop, + .numHoles = 1, + .holes = &transMeridianHoleGeoLoop}; + GeoPolygon transMeridianFilledHoleGeoPolygon = { + .geoloop = transMeridianHoleGeoLoop, .numHoles = 0}; + + int64_t expectedSize; + + // Prime meridian case + expectedSize = 4228; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &primeMeridianGeoPolygon, 7, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &primeMeridianGeoPolygon, 7, CONTAINMENT_CENTER, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == expectedSize, + "got expected polygonToCells size (prime meridian)"); + + // Transmeridian case + // This doesn't exactly match the prime meridian count because of slight + // differences in hex size and grid offset between the two cases + expectedSize = 4238; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &transMeridianGeoPolygon, 7, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagonsTM = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &transMeridianGeoPolygon, 7, CONTAINMENT_CENTER, numHexagons, + hexagonsTM)); + actualNumIndexes = countNonNullIndexes(hexagonsTM, numHexagons); + + t_assert(actualNumIndexes == expectedSize, + "got expected polygonToCells size (transmeridian)"); + + // Transmeridian filled hole case -- only needed for calculating hole + // size + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &transMeridianFilledHoleGeoPolygon, 7, CONTAINMENT_CENTER, + &numHexagons)); + H3Index *hexagonsTMFH = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &transMeridianFilledHoleGeoPolygon, 7, CONTAINMENT_CENTER, + numHexagons, hexagonsTMFH)); + int64_t actualNumHoleIndexes = + countNonNullIndexes(hexagonsTMFH, numHexagons); + + // Transmeridian hole case + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &transMeridianHoleGeoPolygon, 7, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagonsTMH = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &transMeridianHoleGeoPolygon, 7, CONTAINMENT_CENTER, numHexagons, + hexagonsTMH)); + actualNumIndexes = countNonNullIndexes(hexagonsTMH, numHexagons); + + t_assert(actualNumIndexes == expectedSize - actualNumHoleIndexes, + "got expected polygonToCells size (transmeridian hole)"); + + free(hexagons); + free(hexagonsTM); + free(hexagonsTMFH); + free(hexagonsTMH); + } + + TEST(polygonToCellsTransmeridianComplex) { + // This polygon is "complex" in that it has > 4 vertices - this + // tests for a bug that was taking the max and min longitude as + // the bounds for transmeridian polygons + LatLng verts[] = {{0.1, -M_PI + 0.00001}, {0.1, M_PI - 0.00001}, + {0.05, M_PI - 0.2}, {-0.1, M_PI - 0.00001}, + {-0.1, -M_PI + 0.00001}, {-0.05, -M_PI + 0.2}}; + GeoLoop geoloop = {.numVerts = 6, .verts = verts}; + GeoPolygon polygon = {.geoloop = geoloop, .numHoles = 0}; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &polygon, 4, CONTAINMENT_CENTER, &numHexagons)); + + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &polygon, 4, CONTAINMENT_CENTER, numHexagons, hexagons)); + + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1204, + "got expected polygonToCells size (complex transmeridian)"); + + free(hexagons); + } + + TEST(polygonToCellsPentagon) { + H3Index pentagon; + setH3Index(&pentagon, 9, 24, 0); + LatLng coord; + H3_EXPORT(cellToLatLng)(pentagon, &coord); + + // Length of half an edge of the polygon, in radians + double edgeLength2 = H3_EXPORT(degsToRads)(0.001); + + LatLng boundingTopRigt = coord; + boundingTopRigt.lat += edgeLength2; + boundingTopRigt.lng += edgeLength2; + + LatLng boundingTopLeft = coord; + boundingTopLeft.lat += edgeLength2; + boundingTopLeft.lng -= edgeLength2; + + LatLng boundingBottomRight = coord; + boundingBottomRight.lat -= edgeLength2; + boundingBottomRight.lng += edgeLength2; + + LatLng boundingBottomLeft = coord; + boundingBottomLeft.lat -= edgeLength2; + boundingBottomLeft.lng -= edgeLength2; + + LatLng verts[] = {boundingBottomLeft, boundingTopLeft, boundingTopRigt, + boundingBottomRight}; + + GeoLoop geoloop; + geoloop.verts = verts; + geoloop.numVerts = 4; + + GeoPolygon polygon; + polygon.geoloop = geoloop; + polygon.numHoles = 0; + + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &polygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &polygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + + int found = 0; + int numPentagons = 0; + for (int i = 0; i < numHexagons; i++) { + if (hexagons[i] != 0) { + found++; + } + if (H3_EXPORT(isPentagon)(hexagons[i])) { + numPentagons++; + } + } + t_assert(found == 1, "one index found"); + t_assert(numPentagons == 1, "one pentagon found"); + free(hexagons); + } + + TEST(polygonToCellsNullPolygon) { + for (int res = 0; res <= MAX_H3_RES; res++) { + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &nullGeoPolygon, res, flags, &numHexagons)); + t_assert(numHexagons == 0, "got expected estimated size"); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &nullGeoPolygon, res, flags, numHexagons, hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, + "got expected polygonToCells size"); + free(hexagons); + } + } + } + + TEST(polygonToCellsPointPolygon_CenterContainment) { + for (int res = 0; res <= MAX_H3_RES; res++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointGeoPolygon, res, CONTAINMENT_CENTER, &numHexagons)); + t_assert(numHexagons >= 1 && numHexagons <= 5, + "got expected estimated size"); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointGeoPolygon, res, CONTAINMENT_CENTER, numHexagons, + hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, "got expected polygonToCells size"); + free(hexagons); + } + } + + TEST(polygonToCellsPointPolygon_FullContainment) { + for (int res = 0; res <= MAX_H3_RES; res++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointGeoPolygon, res, CONTAINMENT_FULL, &numHexagons)); + t_assert(numHexagons >= 1 && numHexagons <= 5, + "got expected estimated size"); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointGeoPolygon, res, CONTAINMENT_FULL, numHexagons, + hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, "got expected polygonToCells size"); + free(hexagons); + } + } + + TEST(polygonToCellsPointPolygon_Overlapping) { + for (int res = 0; res <= MAX_H3_RES; res++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointGeoPolygon, res, CONTAINMENT_OVERLAPPING, &numHexagons)); + t_assert(numHexagons >= 1 && numHexagons <= 5, + "got expected estimated size"); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointGeoPolygon, res, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 1, "got expected polygonToCells size"); + free(hexagons); + } + } + + TEST(polygonToCellsPointPolygon_OverlappingBBox) { + for (int res = 0; res <= MAX_H3_RES; res++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointGeoPolygon, res, CONTAINMENT_OVERLAPPING_BBOX, + &numHexagons)); + t_assert(numHexagons >= 1 && numHexagons <= 5, + "got expected estimated size"); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointGeoPolygon, res, CONTAINMENT_OVERLAPPING_BBOX, + numHexagons, hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes >= 1 && actualNumIndexes <= 5, + "got expected polygonToCells size"); + free(hexagons); + } + } + + TEST(polygonToCellsOutOfBoundsPolygon) { + for (int res = 0; res <= MAX_H3_RES; res++) { + for (uint32_t flags = 0; flags < CONTAINMENT_INVALID; flags++) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &outOfBoundsVertGeoPolygon, res, flags, &numHexagons)); + t_assert(numHexagons == 0, "got expected estimated size"); + // Note: We're allocating more memory than the estimate to test + // for out-of-bounds writes here + H3Index *hexagons = calloc(10, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &outOfBoundsVertGeoPolygon, res, flags, numHexagons, + hexagons)); + int64_t actualNumIndexes = + countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, + "got expected polygonToCells size"); + free(hexagons); + } + } + } + + TEST(polygonToCellsLinePolygon_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsLinePolygon_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 0, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsLinePolygon_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 9, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsLinePolygon_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 21, "got expected polygonToCells size"); + free(hexagons); + } + + TEST(polygonToCellsNullHole_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1253, + "got expected polygonToCells size (null hole)"); + free(hexagons); + } + + TEST(polygonToCellsNullHole_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1175, + "got expected polygonToCells size (null hole)"); + free(hexagons); + } + + TEST(polygonToCellsNullHole_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1334, + "got expected polygonToCells size (null hole)"); + free(hexagons); + } + + TEST(polygonToCellsNullHole_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &nullHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1416, + "got expected polygonToCells size (null hole)"); + free(hexagons); + } + + TEST(polygonToCellsPointHole_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1253, + "got expected polygonToCells size (point hole)"); + free(hexagons); + } + + TEST(polygonToCellsPointHole_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // We expect that the cell containing the hole is not included + t_assert(actualNumIndexes == 1175 - 1, + "got expected polygonToCells size (point hole)"); + free(hexagons); + } + + TEST(polygonToCellsPointHole_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1334, + "got expected polygonToCells size (point hole)"); + free(hexagons); + } + + TEST(polygonToCellsPointHole_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &pointHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1416, + "got expected polygonToCells size (point hole)"); + free(hexagons); + } + + TEST(polygonToCellsLineHole_CenterContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1253, + "got expected polygonToCells size (line hole)"); + free(hexagons); + } + + TEST(polygonToCellsLineHole_FullContainment) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_FULL, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_FULL, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // We expect that the cells intersecting the line are not included + t_assert(actualNumIndexes == 1175 - 9, + "got expected polygonToCells size (line hole)"); + free(hexagons); + } + + TEST(polygonToCellsLineHole_Overlapping) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1334, + "got expected polygonToCells size (line hole)"); + free(hexagons); + } + + TEST(polygonToCellsLineHole_OverlappingBBox) { + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &lineHoleGeoPolygon, 9, CONTAINMENT_OVERLAPPING_BBOX, numHexagons, + hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + // Same as without the hole + t_assert(actualNumIndexes == 1416, + "got expected polygonToCells size (line hole)"); + free(hexagons); + } + + TEST(invalidFlags) { + int64_t numHexagons; + for (uint32_t flags = CONTAINMENT_INVALID; flags <= 32; flags++) { + t_assert( + H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, flags, &numHexagons) == E_OPTION_INVALID, + "Flags other than polyfill modes are invalid for " + "maxPolygonToCellsSizeExperimental"); + } + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &sfGeoPolygon, 9, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + for (uint32_t flags = CONTAINMENT_INVALID; flags <= 32; flags++) { + t_assert(H3_EXPORT(polygonToCellsExperimental)( + &sfGeoPolygon, 9, flags, numHexagons, hexagons) == + E_OPTION_INVALID, + "Flags other than polyfill modes are invalid for " + "polygonToCellsExperimental"); + } + free(hexagons); + } + + TEST(fillIndex) { + iterateAllIndexesAtRes(0, fillIndex_assertions); + iterateAllIndexesAtRes(1, fillIndex_assertions); + iterateAllIndexesAtRes(2, fillIndex_assertions); + } +} diff --git a/src/apps/testapps/testPolygonToCellsReported.c b/src/apps/testapps/testPolygonToCellsReported.c new file mode 100644 index 000000000..8e4d9a9ed --- /dev/null +++ b/src/apps/testapps/testPolygonToCellsReported.c @@ -0,0 +1,206 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "algos.h" +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "test.h" +#include "utility.h" + +// Tests for specific polygonToCells examples + +SUITE(polygonToCells_reported) { + // https://github.com/uber/h3-js/issues/76#issuecomment-561204505 + TEST(entireWorld) { + // TODO: Fails for a single worldwide polygon + LatLng worldVerts[] = { + {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; + GeoLoop worldGeoLoop = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon = {.geoloop = worldGeoLoop, .numHoles = 0}; + LatLng worldVerts2[] = { + {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; + GeoLoop worldGeoLoop2 = {.numVerts = 4, .verts = worldVerts2}; + GeoPolygon worldGeoPolygon2 = {.geoloop = worldGeoLoop2, .numHoles = 0}; + + for (int res = 0; res < 3; res++) { + int64_t polygonToCellsSize; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &worldGeoPolygon, res, 0, &polygonToCellsSize)); + H3Index *polygonToCellsOut = + calloc(polygonToCellsSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&worldGeoPolygon, res, 0, + polygonToCellsOut)); + int64_t actualNumIndexes = + countNonNullIndexes(polygonToCellsOut, polygonToCellsSize); + + int64_t polygonToCellsSize2; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &worldGeoPolygon2, res, 0, &polygonToCellsSize2)); + H3Index *polygonToCellsOut2 = + calloc(polygonToCellsSize2, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCells)(&worldGeoPolygon2, res, 0, + polygonToCellsOut2)); + int64_t actualNumIndexes2 = + countNonNullIndexes(polygonToCellsOut2, polygonToCellsSize2); + + int64_t expectedTotalWorld; + t_assertSuccess(H3_EXPORT(getNumCells)(res, &expectedTotalWorld)); + t_assert(actualNumIndexes + actualNumIndexes2 == expectedTotalWorld, + "got expected polygonToCells size (entire world)"); + + // Sets should be disjoint + for (int i = 0; i < polygonToCellsSize; i++) { + if (polygonToCellsOut[i] == 0) continue; + + bool found = false; + for (int j = 0; j < polygonToCellsSize2; j++) { + if (polygonToCellsOut[i] == polygonToCellsOut2[j]) { + found = true; + break; + } + } + t_assert( + !found, + "Index found more than once when polygonToCellsing the " + "entire world"); + } + + free(polygonToCellsOut); + free(polygonToCellsOut2); + } + } + + // https://github.com/uber/h3-js/issues/67 + TEST(h3js_67) { + double east = H3_EXPORT(degsToRads)(-56.25); + double north = H3_EXPORT(degsToRads)(-33.13755119234615); + double south = H3_EXPORT(degsToRads)(-34.30714385628804); + double west = H3_EXPORT(degsToRads)(-57.65625); + + LatLng testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 7; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&testPolygon, res, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&testPolygon, res, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4499, + "got expected polygonToCells size (h3-js#67)"); + free(hexagons); + } + + // 2nd test case from h3-js#67 + TEST(h3js_67_2nd) { + double east = H3_EXPORT(degsToRads)(-57.65625); + double north = H3_EXPORT(degsToRads)(-34.30714385628804); + double south = H3_EXPORT(degsToRads)(-35.4606699514953); + double west = H3_EXPORT(degsToRads)(-59.0625); + + LatLng testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 7; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&testPolygon, res, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&testPolygon, res, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4609, + "got expected polygonToCells size (h3-js#67, 2nd case)"); + free(hexagons); + } + + // https://github.com/uber/h3/issues/136 + TEST(h3_136) { + LatLng testVerts[] = {{0.10068990369902957, 0.8920772174196191}, + {0.10032914690616246, 0.8915914753447348}, + {0.10033349237998787, 0.8915860128746426}, + {0.10069496685903621, 0.8920742194546231}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 13; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&testPolygon, res, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&testPolygon, res, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4353, "got expected polygonToCells size"); + free(hexagons); + } + + // https://github.com/uber/h3/issues/595 + TEST(h3_136) { + H3Index center = 0x85283473fffffff; + LatLng centerLatLng; + H3_EXPORT(cellToLatLng)(center, ¢erLatLng); + + // This polygon should include the center cell. The issue here arises + // when one of the polygon vertexes is to the east of the index center, + // with exactly the same latitude + LatLng testVerts[] = {{.lat = centerLatLng.lat, -2.121207808248113}, + {0.6565301558937859, -2.1281107217935986}, + {0.6515463604919347, -2.1345342663428695}, + {0.6466583305904194, -2.1276313527973842}}; + + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 5; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)(&testPolygon, res, 0, + &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess( + H3_EXPORT(polygonToCells)(&testPolygon, res, 0, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 8, "got expected polygonToCells size"); + free(hexagons); + } +} diff --git a/src/apps/testapps/testPolygonToCellsReportedExperimental.c b/src/apps/testapps/testPolygonToCellsReportedExperimental.c new file mode 100644 index 000000000..9c7c1418a --- /dev/null +++ b/src/apps/testapps/testPolygonToCellsReportedExperimental.c @@ -0,0 +1,242 @@ +/* + * Copyright 2017-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "algos.h" +#include "constants.h" +#include "h3Index.h" +#include "latLng.h" +#include "polyfill.h" +#include "polygon.h" +#include "test.h" +#include "utility.h" + +// Tests for specific polygonToCells examples + +SUITE(polygonToCells_reported) { + // fuzzer crash due to inconsistent handling of CONTAINMENT_OVERLAPPING + TEST(fuzzer_crash) { + uint8_t data[] = { + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xa, 0xa, 0xa, 0xa, 0xa, 0xff, + }; + + uint8_t res = 0; + size_t vertsSize = sizeof(data); + int numVerts = vertsSize / sizeof(LatLng); + + GeoPolygon geoPolygon; + geoPolygon.numHoles = 0; + geoPolygon.holes = NULL; + geoPolygon.geoloop.numVerts = numVerts; + // Offset by 1 since *data was used for `res`, above. + geoPolygon.geoloop.verts = (LatLng *)(data); + + uint32_t flags = CONTAINMENT_OVERLAPPING; + int64_t sz; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSizeExperimental)( + &geoPolygon, res, flags, &sz)); + t_assert(sz == 1, "Expected output count"); + H3Index *out = calloc(sz, sizeof(H3Index)); + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)(&geoPolygon, res, + flags, sz, out)); + free(out); + } + + // https://github.com/uber/h3-js/issues/76#issuecomment-561204505 + TEST(entireWorld) { + // TODO: Fails for a single worldwide polygon + LatLng worldVerts[] = { + {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}}; + GeoLoop worldGeoLoop = {.numVerts = 4, .verts = worldVerts}; + GeoPolygon worldGeoPolygon = {.geoloop = worldGeoLoop, .numHoles = 0}; + LatLng worldVerts2[] = { + {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}}; + GeoLoop worldGeoLoop2 = {.numVerts = 4, .verts = worldVerts2}; + GeoPolygon worldGeoPolygon2 = {.geoloop = worldGeoLoop2, .numHoles = 0}; + + for (int res = 0; res < 3; res++) { + int64_t polygonToCellsSize; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &worldGeoPolygon, res, CONTAINMENT_CENTER, + &polygonToCellsSize)); + H3Index *polygonToCellsOut = + calloc(polygonToCellsSize, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &worldGeoPolygon, res, CONTAINMENT_CENTER, polygonToCellsSize, + polygonToCellsOut)); + int64_t actualNumIndexes = + countNonNullIndexes(polygonToCellsOut, polygonToCellsSize); + + int64_t polygonToCellsSize2; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &worldGeoPolygon2, res, CONTAINMENT_CENTER, + &polygonToCellsSize2)); + H3Index *polygonToCellsOut2 = + calloc(polygonToCellsSize2, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &worldGeoPolygon2, res, CONTAINMENT_CENTER, polygonToCellsSize2, + polygonToCellsOut2)); + int64_t actualNumIndexes2 = + countNonNullIndexes(polygonToCellsOut2, polygonToCellsSize2); + + int64_t expectedTotalWorld; + t_assertSuccess(H3_EXPORT(getNumCells)(res, &expectedTotalWorld)); + t_assert(actualNumIndexes + actualNumIndexes2 == expectedTotalWorld, + "got expected polygonToCells size (entire world)"); + + // Sets should be disjoint + for (int i = 0; i < polygonToCellsSize; i++) { + if (polygonToCellsOut[i] == 0) continue; + + bool found = false; + for (int j = 0; j < polygonToCellsSize2; j++) { + if (polygonToCellsOut[i] == polygonToCellsOut2[j]) { + found = true; + break; + } + } + t_assert( + !found, + "Index found more than once when polygonToCellsing the " + "entire world"); + } + + free(polygonToCellsOut); + free(polygonToCellsOut2); + } + } + + // https://github.com/uber/h3-js/issues/67 + TEST(h3js_67) { + double east = H3_EXPORT(degsToRads)(-56.25); + double north = H3_EXPORT(degsToRads)(-33.13755119234615); + double south = H3_EXPORT(degsToRads)(-34.30714385628804); + double west = H3_EXPORT(degsToRads)(-57.65625); + + LatLng testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 7; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &testPolygon, res, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &testPolygon, res, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4499, + "got expected polygonToCells size (h3-js#67)"); + free(hexagons); + } + + // 2nd test case from h3-js#67 + TEST(h3js_67_2nd) { + double east = H3_EXPORT(degsToRads)(-57.65625); + double north = H3_EXPORT(degsToRads)(-34.30714385628804); + double south = H3_EXPORT(degsToRads)(-35.4606699514953); + double west = H3_EXPORT(degsToRads)(-59.0625); + + LatLng testVerts[] = { + {north, east}, {south, east}, {south, west}, {north, west}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 7; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &testPolygon, res, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &testPolygon, res, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4609, + "got expected polygonToCells size (h3-js#67, 2nd case)"); + free(hexagons); + } + + // https://github.com/uber/h3/issues/136 + TEST(h3_136) { + LatLng testVerts[] = {{0.10068990369902957, 0.8920772174196191}, + {0.10032914690616246, 0.8915914753447348}, + {0.10033349237998787, 0.8915860128746426}, + {0.10069496685903621, 0.8920742194546231}}; + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 13; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &testPolygon, res, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &testPolygon, res, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 4353, "got expected polygonToCells size"); + free(hexagons); + } + + // https://github.com/uber/h3/issues/595 + TEST(h3_136) { + H3Index center = 0x85283473fffffff; + LatLng centerLatLng; + H3_EXPORT(cellToLatLng)(center, ¢erLatLng); + + // This polygon should include the center cell. The issue here arises + // when one of the polygon vertexes is to the east of the index center, + // with exactly the same latitude + LatLng testVerts[] = {{.lat = centerLatLng.lat, -2.121207808248113}, + {0.6565301558937859, -2.1281107217935986}, + {0.6515463604919347, -2.1345342663428695}, + {0.6466583305904194, -2.1276313527973842}}; + + GeoLoop testGeoLoop = {.numVerts = 4, .verts = testVerts}; + GeoPolygon testPolygon; + testPolygon.geoloop = testGeoLoop; + testPolygon.numHoles = 0; + + int res = 5; + int64_t numHexagons; + t_assertSuccess(H3_EXPORT(maxPolygonToCellsSize)( + &testPolygon, res, CONTAINMENT_CENTER, &numHexagons)); + H3Index *hexagons = calloc(numHexagons, sizeof(H3Index)); + + t_assertSuccess(H3_EXPORT(polygonToCellsExperimental)( + &testPolygon, res, CONTAINMENT_CENTER, numHexagons, hexagons)); + int64_t actualNumIndexes = countNonNullIndexes(hexagons, numHexagons); + + t_assert(actualNumIndexes == 8, "got expected polygonToCells size"); + free(hexagons); + } +} diff --git a/src/apps/testapps/testVec2d.c b/src/apps/testapps/testVec2dInternal.c similarity index 79% rename from src/apps/testapps/testVec2d.c rename to src/apps/testapps/testVec2dInternal.c index 34a3cb789..e1e284bd2 100644 --- a/src/apps/testapps/testVec2d.c +++ b/src/apps/testapps/testVec2dInternal.c @@ -17,10 +17,11 @@ #include #include #include + #include "test.h" #include "vec2d.h" -SUITE(Vec2d) { +SUITE(Vec2dInternal) { TEST(_v2dMag) { Vec2d v = {3.0, 4.0}; double expected = 5.0; @@ -46,14 +47,16 @@ SUITE(Vec2d) { "Y coord as expected"); } - TEST(_v2dEquals) { + TEST(_v2dAlmostEquals) { Vec2d v1 = {3.0, 4.0}; Vec2d v2 = {3.0, 4.0}; Vec2d v3 = {3.5, 4.0}; Vec2d v4 = {3.0, 4.5}; + Vec2d v5 = {3.0 + DBL_EPSILON, 4.0 - DBL_EPSILON}; - t_assert(_v2dEquals(&v1, &v2), "true for equal vectors"); - t_assert(!_v2dEquals(&v1, &v3), "false for different x"); - t_assert(!_v2dEquals(&v1, &v4), "false for different y"); + t_assert(_v2dAlmostEquals(&v1, &v2), "true for equal vectors"); + t_assert(!_v2dAlmostEquals(&v1, &v3), "false for different x"); + t_assert(!_v2dAlmostEquals(&v1, &v4), "false for different y"); + t_assert(_v2dAlmostEquals(&v1, &v5), "true for almost equal"); } } diff --git a/src/apps/testapps/testVec3d.c b/src/apps/testapps/testVec3dInternal.c similarity index 92% rename from src/apps/testapps/testVec3d.c rename to src/apps/testapps/testVec3dInternal.c index 2743bd8ac..71ffb8a74 100644 --- a/src/apps/testapps/testVec3d.c +++ b/src/apps/testapps/testVec3dInternal.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,11 @@ #include #include #include + #include "test.h" #include "vec3d.h" -SUITE(Vec3d) { +SUITE(Vec3dInternal) { TEST(_pointSquareDist) { Vec3d v1 = {0, 0, 0}; Vec3d v2 = {1, 0, 0}; @@ -43,19 +44,19 @@ SUITE(Vec3d) { TEST(_geoToVec3d) { Vec3d origin = {0}; - GeoCoord c1 = {0, 0}; + LatLng c1 = {0, 0}; Vec3d p1; _geoToVec3d(&c1, &p1); t_assert(fabs(_pointSquareDist(&origin, &p1) - 1) < EPSILON_RAD, "Geo point is on the unit sphere"); - GeoCoord c2 = {M_PI_2, 0}; + LatLng c2 = {M_PI_2, 0}; Vec3d p2; _geoToVec3d(&c2, &p2); t_assert(fabs(_pointSquareDist(&p1, &p2) - 2) < EPSILON_RAD, "Geo point is on another axis"); - GeoCoord c3 = {M_PI, 0}; + LatLng c3 = {M_PI, 0}; Vec3d p3; _geoToVec3d(&c3, &p3); t_assert(fabs(_pointSquareDist(&p1, &p3) - 4) < EPSILON_RAD, diff --git a/src/apps/testapps/testVertex.c b/src/apps/testapps/testVertex.c new file mode 100644 index 000000000..180f00a4d --- /dev/null +++ b/src/apps/testapps/testVertex.c @@ -0,0 +1,142 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 vertex functions. + */ + +#include "test.h" +#include "utility.h" +#include "vertex.h" + +SUITE(Vertex) { + TEST(cellToVertex_badVerts) { + H3Index origin = 0x823d6ffffffffff; + + H3Index vert; + t_assert(H3_EXPORT(cellToVertex)(origin, -1, &vert) == E_DOMAIN, + "negative vertex should return null index"); + t_assert(H3_EXPORT(cellToVertex)(origin, 6, &vert) == E_DOMAIN, + "invalid vertex should return null index"); + + H3Index pentagon = 0x823007fffffffff; + t_assert(H3_EXPORT(cellToVertex)(pentagon, 5, &vert) == E_DOMAIN, + "invalid pent vertex should return null index"); + } + + TEST(cellToVertex_invalid) { + H3Index invalid = 0xFFFFFFFFFFFFFFFF; + H3Index vert; + t_assert(H3_EXPORT(cellToVertex)(invalid, 3, &vert) == E_FAILED, + "Invalid cell returns error"); + } + + TEST(cellToVertex_invalid2) { + H3Index index = 0x685b2396e900fff9; + H3Index vert; + t_assert(H3_EXPORT(cellToVertex)(index, 2, &vert) == E_CELL_INVALID, + "Invalid cell returns error"); + } + + TEST(cellToVertex_invalid3) { + H3Index index = 0x20ff20202020ff35; + H3Index vert; + t_assert(H3_EXPORT(cellToVertex)(index, 0, &vert) == E_CELL_INVALID, + "Invalid cell returns error"); + } + + TEST(isValidVertex_hex) { + H3Index origin = 0x823d6ffffffffff; + H3Index vert = 0x2222597fffffffff; + + t_assert(H3_EXPORT(isValidVertex)(vert), "known vertex is valid"); + + for (int i = 0; i < NUM_HEX_VERTS; i++) { + t_assertSuccess(H3_EXPORT(cellToVertex)(origin, i, &vert)); + t_assert(H3_EXPORT(isValidVertex)(vert), "vertex is valid"); + } + } + + TEST(isValidVertex_invalidOwner) { + H3Index origin = 0x823d6ffffffffff; + int vertexNum = 0; + H3Index vert; + t_assertSuccess(H3_EXPORT(cellToVertex)(origin, vertexNum, &vert)); + + // Set a bit for an unused digit to something else. + vert ^= 1; + + t_assert(H3_EXPORT(isValidVertex)(vert) == 0, + "vertex with invalid owner is not valid"); + } + + TEST(isValidVertex_wrongOwner) { + H3Index origin = 0x823d6ffffffffff; + int vertexNum = 0; + H3Index vert; + t_assertSuccess(H3_EXPORT(cellToVertex)(origin, vertexNum, &vert)); + + // Assert that origin does not own the vertex + H3Index owner = vert; + H3_SET_MODE(owner, H3_CELL_MODE); + H3_SET_RESERVED_BITS(owner, 0); + + t_assert(origin != owner, "origin does not own the canonical vertex"); + + H3Index nonCanonicalVertex = origin; + H3_SET_MODE(nonCanonicalVertex, H3_VERTEX_MODE); + H3_SET_RESERVED_BITS(nonCanonicalVertex, vertexNum); + + t_assert(H3_EXPORT(isValidVertex)(nonCanonicalVertex) == 0, + "vertex with incorrect owner is not valid"); + } + + TEST(isValidVertex_badVerts) { + H3Index origin = 0x823d6ffffffffff; + t_assert(H3_EXPORT(isValidVertex)(origin) == 0, "cell is not valid"); + + H3Index fakeEdge = origin; + H3_SET_MODE(fakeEdge, H3_DIRECTEDEDGE_MODE); + t_assert(H3_EXPORT(isValidVertex)(fakeEdge) == 0, + "edge mode is not valid"); + + H3Index vert; + t_assertSuccess(H3_EXPORT(cellToVertex)(origin, 0, &vert)); + H3_SET_RESERVED_BITS(vert, 6); + t_assert(H3_EXPORT(isValidVertex)(vert) == 0, + "invalid vertexNum is not valid"); + + H3Index pentagon = 0x823007fffffffff; + H3Index vert2; + t_assertSuccess(H3_EXPORT(cellToVertex)(pentagon, 0, &vert2)); + H3_SET_RESERVED_BITS(vert2, 5); + t_assert(H3_EXPORT(isValidVertex)(vert2) == 0, + "invalid pentagon vertexNum is not valid"); + } + + TEST(vertexToLatLng_invalid) { + H3Index invalid = 0xFFFFFFFFFFFFFFFF; + LatLng latLng; + t_assert(H3_EXPORT(vertexToLatLng)(invalid, &latLng) != E_SUCCESS, + "Invalid vertex returns error"); + } + + TEST(cellToVertexes_invalid) { + H3Index invalid = 0xFFFFFFFFFFFFFFFF; + H3Index verts[6] = {0}; + t_assert(H3_EXPORT(cellToVertexes)(invalid, verts) == E_FAILED, + "cellToVertexes fails for invalid cell"); + } +} diff --git a/src/apps/testapps/testVertexExhaustive.c b/src/apps/testapps/testVertexExhaustive.c new file mode 100644 index 000000000..3ee1147e3 --- /dev/null +++ b/src/apps/testapps/testVertexExhaustive.c @@ -0,0 +1,153 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 vertex functions, exhaustively checking all cells at res 0-4 + */ + +#include "test.h" +#include "utility.h" +#include "vertex.h" + +static void directionForVertexNum_symmetry_assertions(H3Index h3) { + int numVerts = H3_EXPORT(isPentagon)(h3) ? NUM_PENT_VERTS : NUM_HEX_VERTS; + for (int i = 0; i < numVerts; i++) { + Direction dir = directionForVertexNum(h3, i); + int vertexNum = vertexNumForDirection(h3, dir); + t_assert( + vertexNum == i, + "directionForVertexNum and vertexNumForDirection are symmetrical"); + } +} + +static void cellToVertex_point_assertions(H3Index h3) { + CellBoundary gb; + H3_EXPORT(cellToBoundary)(h3, &gb); + int numVerts = H3_EXPORT(isPentagon)(h3) ? NUM_PENT_VERTS : NUM_HEX_VERTS; + + // This test won't work if there are distortion vertexes in the boundary + if (numVerts < gb.numVerts) return; + + LatLng coord; + for (int i = 0; i < numVerts; i++) { + H3Index vertex; + t_assertSuccess(H3_EXPORT(cellToVertex)(h3, i, &vertex)); + t_assertSuccess(H3_EXPORT(vertexToLatLng)(vertex, &coord)); + int almostEqual = + geoAlmostEqualThreshold(&gb.verts[i], &coord, 0.000001); + t_assert(almostEqual, "Vertex coordinates match boundary vertex"); + } +} + +static void cellToVertex_uniqueness_assertions(H3Index h3) { + H3Index originVerts[NUM_HEX_VERTS] = {0}; + t_assertSuccess(H3_EXPORT(cellToVertexes)(h3, originVerts)); + + for (int v1 = 0; v1 < NUM_HEX_VERTS - 1; v1++) { + for (int v2 = v1 + 1; v2 < NUM_HEX_VERTS; v2++) { + if (originVerts[v1] == originVerts[v2]) { + t_assert(false, "vertex should be unique"); + } + } + } +} + +static void cellToVertex_validity_assertions(H3Index h3) { + H3Index verts[NUM_HEX_VERTS] = {0}; + t_assertSuccess(H3_EXPORT(cellToVertexes)(h3, verts)); + + for (int i = 0; i < NUM_HEX_VERTS - 1; i++) { + if (verts[i] != H3_NULL) { + t_assert(H3_EXPORT(isValidVertex(verts[i])), "vertex is valid"); + } + } +} + +static void cellToVertex_neighbor_assertions(H3Index h3) { + H3Index neighbors[7] = {0}; + H3Index originVerts[NUM_HEX_VERTS] = {0}; + H3Index neighborVerts[NUM_HEX_VERTS] = {0}; + + t_assertSuccess(H3_EXPORT(gridDisk)(h3, 1, neighbors)); + t_assertSuccess(H3_EXPORT(cellToVertexes)(h3, originVerts)); + + for (int i = 0; i < 7; i++) { + H3Index neighbor = neighbors[i]; + if (neighbor == H3_NULL || neighbor == h3) continue; + t_assertSuccess(H3_EXPORT(cellToVertexes)(neighbor, neighborVerts)); + + // calculate the set intersection + int intersection = 0; + for (int v1 = 0; v1 < NUM_HEX_VERTS; v1++) { + for (int v2 = 0; v2 < NUM_HEX_VERTS; v2++) { + if (neighborVerts[v1] == originVerts[v2]) { + intersection++; + } + } + } + + t_assert(intersection == 2, + "Neighbor shares 2 unique vertexes with origin"); + } +} + +SUITE(Vertex) { + TEST(directionForVertexNum_symmetry) { + iterateAllIndexesAtRes(0, directionForVertexNum_symmetry_assertions); + iterateAllIndexesAtRes(1, directionForVertexNum_symmetry_assertions); + iterateAllIndexesAtRes(2, directionForVertexNum_symmetry_assertions); + iterateAllIndexesAtRes(3, directionForVertexNum_symmetry_assertions); + iterateAllIndexesAtRes(4, directionForVertexNum_symmetry_assertions); + } + + TEST(cellToVertex_point) { + iterateAllIndexesAtRes(0, cellToVertex_point_assertions); + iterateAllIndexesAtRes(1, cellToVertex_point_assertions); + iterateAllIndexesAtRes(2, cellToVertex_point_assertions); + iterateAllIndexesAtRes(3, cellToVertex_point_assertions); + iterateAllIndexesAtRes(4, cellToVertex_point_assertions); + + // Res 5: normal base cell + iterateBaseCellIndexesAtRes(5, cellToVertex_point_assertions, 0); + // Res 5: pentagon base cell + iterateBaseCellIndexesAtRes(5, cellToVertex_point_assertions, 14); + // Res 5: polar pentagon base cell + iterateBaseCellIndexesAtRes(5, cellToVertex_point_assertions, 117); + } + + TEST(cellToVertex_neighbors) { + iterateAllIndexesAtRes(0, cellToVertex_neighbor_assertions); + iterateAllIndexesAtRes(1, cellToVertex_neighbor_assertions); + iterateAllIndexesAtRes(2, cellToVertex_neighbor_assertions); + iterateAllIndexesAtRes(3, cellToVertex_neighbor_assertions); + iterateAllIndexesAtRes(4, cellToVertex_neighbor_assertions); + } + + TEST(cellToVertex_uniqueness) { + iterateAllIndexesAtRes(0, cellToVertex_uniqueness_assertions); + iterateAllIndexesAtRes(1, cellToVertex_uniqueness_assertions); + iterateAllIndexesAtRes(2, cellToVertex_uniqueness_assertions); + iterateAllIndexesAtRes(3, cellToVertex_uniqueness_assertions); + iterateAllIndexesAtRes(4, cellToVertex_uniqueness_assertions); + } + + TEST(cellToVertex_validity) { + iterateAllIndexesAtRes(0, cellToVertex_validity_assertions); + iterateAllIndexesAtRes(1, cellToVertex_validity_assertions); + iterateAllIndexesAtRes(2, cellToVertex_validity_assertions); + iterateAllIndexesAtRes(3, cellToVertex_validity_assertions); + iterateAllIndexesAtRes(4, cellToVertex_validity_assertions); + } +} diff --git a/src/apps/testapps/testVertexGraph.c b/src/apps/testapps/testVertexGraphInternal.c similarity index 93% rename from src/apps/testapps/testVertexGraph.c rename to src/apps/testapps/testVertexGraphInternal.c index a5380a887..c14411eb7 100644 --- a/src/apps/testapps/testVertexGraph.c +++ b/src/apps/testapps/testVertexGraphInternal.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,21 +16,22 @@ #include #include -#include "geoCoord.h" + #include "h3api.h" +#include "latLng.h" #include "test.h" #include "vertexGraph.h" // Fixtures -static GeoCoord center; -static GeoCoord vertex1; -static GeoCoord vertex2; -static GeoCoord vertex3; -static GeoCoord vertex4; -static GeoCoord vertex5; -static GeoCoord vertex6; - -SUITE(vertexGraph) { +static LatLng center; +static LatLng vertex1; +static LatLng vertex2; +static LatLng vertex3; +static LatLng vertex4; +static LatLng vertex5; +static LatLng vertex6; + +SUITE(vertexGraphInternal) { setGeoDegs(¢er, 37.77362016769341, -122.41673772517154); setGeoDegs(&vertex1, 87.372002166, 166.160981117); setGeoDegs(&vertex2, 87.370101364, 166.160184306); @@ -49,14 +50,15 @@ SUITE(vertexGraph) { TEST(vertexHash) { H3Index centerIndex; - GeoBoundary outline; + CellBoundary outline; uint32_t hash1; uint32_t hash2; int numBuckets = 1000; for (int res = 0; res < 11; res++) { - centerIndex = H3_EXPORT(geoToH3)(¢er, res); - H3_EXPORT(h3ToGeoBoundary)(centerIndex, &outline); + t_assertSuccess( + H3_EXPORT(latLngToCell)(¢er, res, ¢erIndex)); + H3_EXPORT(cellToBoundary)(centerIndex, &outline); for (int i = 0; i < outline.numVerts; i++) { hash1 = _hashVertex(&outline.verts[i], res, numBuckets); hash2 = _hashVertex(&outline.verts[(i + 1) % outline.numVerts], @@ -77,8 +79,8 @@ SUITE(vertexGraph) { TEST(addVertexNode) { VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; - VertexNode* addedNode; + VertexNode *node; + VertexNode *addedNode; // Basic add addedNode = addVertexNode(&graph, &vertex1, &vertex2); @@ -115,8 +117,8 @@ SUITE(vertexGraph) { TEST(addVertexNodeDupe) { VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; - VertexNode* addedNode; + VertexNode *node; + VertexNode *addedNode; // Basic add addedNode = addVertexNode(&graph, &vertex1, &vertex2); @@ -137,7 +139,7 @@ SUITE(vertexGraph) { // Basic lookup tested in testAddVertexNode, only test failures here VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; + VertexNode *node; // Empty graph node = findNodeForEdge(&graph, &vertex1, &vertex2); @@ -168,7 +170,7 @@ SUITE(vertexGraph) { TEST(findNodeForVertex) { VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; + VertexNode *node; // Empty graph node = findNodeForVertex(&graph, &vertex1); @@ -189,7 +191,7 @@ SUITE(vertexGraph) { TEST(removeVertexNode) { VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; + VertexNode *node; int success; // Straight removal @@ -263,8 +265,8 @@ SUITE(vertexGraph) { TEST(firstVertexNode) { VertexGraph graph; initVertexGraph(&graph, 10, 9); - VertexNode* node; - VertexNode* addedNode; + VertexNode *node; + VertexNode *addedNode; node = firstVertexNode(&graph); t_assert(node == NULL, "No node found for empty graph"); @@ -286,7 +288,7 @@ SUITE(vertexGraph) { TEST(singleBucketVertexGraph) { VertexGraph graph; initVertexGraph(&graph, 1, 9); - VertexNode* node; + VertexNode *node; t_assert(graph.numBuckets == 1, "1 bucket created"); diff --git a/src/apps/testapps/testVertexInternal.c b/src/apps/testapps/testVertexInternal.c new file mode 100644 index 000000000..e2a084d19 --- /dev/null +++ b/src/apps/testapps/testVertexInternal.c @@ -0,0 +1,88 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file + * @brief tests H3 vertex functions. + */ + +#include "test.h" +#include "utility.h" +#include "vertex.h" + +SUITE(VertexInternal) { + TEST(vertexNumForDirection_hex) { + H3Index origin = 0x823d6ffffffffff; + int vertexNums[NUM_HEX_VERTS] = {0}; + for (Direction dir = K_AXES_DIGIT; dir < NUM_DIGITS; dir++) { + int vertexNum = vertexNumForDirection(origin, dir); + t_assert(vertexNum >= 0 && vertexNum < NUM_HEX_VERTS, + "vertex number appears valid"); + t_assert(!vertexNums[vertexNum], "vertex number appears only once"); + vertexNums[vertexNum] = 1; + } + } + + TEST(vertexNumForDirection_pent) { + H3Index pentagon = 0x823007fffffffff; + int vertexNums[NUM_PENT_VERTS] = {0}; + for (Direction dir = J_AXES_DIGIT; dir < NUM_DIGITS; dir++) { + int vertexNum = vertexNumForDirection(pentagon, dir); + t_assert(vertexNum >= 0 && vertexNum < NUM_PENT_VERTS, + "vertex number appears valid"); + t_assert(!vertexNums[vertexNum], "vertex number appears only once"); + vertexNums[vertexNum] = 1; + } + } + + TEST(vertexNumForDirection_badDirections) { + H3Index origin = 0x823007fffffffff; + + t_assert( + vertexNumForDirection(origin, CENTER_DIGIT) == INVALID_VERTEX_NUM, + "center digit should return invalid vertex"); + t_assert( + vertexNumForDirection(origin, INVALID_DIGIT) == INVALID_VERTEX_NUM, + "invalid digit should return invalid vertex"); + + H3Index pentagon = 0x823007fffffffff; + t_assert( + vertexNumForDirection(pentagon, K_AXES_DIGIT) == INVALID_VERTEX_NUM, + "K direction on pentagon should return invalid vertex"); + } + + TEST(directionForVertexNum_hex) { + H3Index origin = 0x823d6ffffffffff; + bool seenDirs[NUM_DIGITS] = {false}; + for (int vertexNum = 0; vertexNum < NUM_HEX_VERTS; vertexNum++) { + Direction dir = directionForVertexNum(origin, vertexNum); + t_assert(dir > 0 && dir < INVALID_DIGIT, "direction appears valid"); + t_assert(!seenDirs[dir], "direction appears only once"); + seenDirs[dir] = true; + } + } + + TEST(directionForVertexNum_badVerts) { + H3Index origin = 0x823d6ffffffffff; + + t_assert(directionForVertexNum(origin, -1) == INVALID_DIGIT, + "negative vertex should return invalid direction"); + t_assert(directionForVertexNum(origin, 6) == INVALID_DIGIT, + "invalid vertex should return invalid direction"); + + H3Index pentagon = 0x823007fffffffff; + t_assert(directionForVertexNum(pentagon, 5) == INVALID_DIGIT, + "invalid pent vertex should return invalid direction"); + } +} diff --git a/src/h3lib/include/algos.h b/src/h3lib/include/algos.h index 029800dcc..740343861 100644 --- a/src/h3lib/include/algos.h +++ b/src/h3lib/include/algos.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2018, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,17 +27,30 @@ #include "vertexGraph.h" // neighbor along the ijk coordinate system of the current face, rotated -H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations); +H3Error h3NeighborRotations(H3Index origin, Direction dir, int *rotations, + H3Index *out); + +// IJK direction of neighbor +Direction directionForNeighbor(H3Index origin, H3Index destination); // k-ring implementation -void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances, +void _kRingInternal(H3Index origin, int k, H3Index *out, int *distances, int maxIdx, int curK); // Create a vertex graph from a set of hexagons -void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, - VertexGraph* out); +H3Error h3SetToVertexGraph(const H3Index *h3Set, const int numHexes, + VertexGraph *out); // Create a LinkedGeoPolygon from a vertex graph -void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out); +void _vertexGraphToLinkedGeo(VertexGraph *graph, LinkedGeoPolygon *out); + +// Internal function for polygonToCells that traces a geoloop with hexagons of +// a specific size +H3Error _getEdgeHexagons(const GeoLoop *geoloop, int64_t numHexagons, int res, + int64_t *numSearchHexes, H3Index *search, + H3Index *found); +// The safe gridDiskDistances algorithm. +H3Error _gridDiskDistancesInternal(H3Index origin, int k, H3Index *out, + int *distances, int64_t maxIdx, int curK); #endif diff --git a/src/h3lib/include/alloc.h b/src/h3lib/include/alloc.h new file mode 100644 index 000000000..a40f9ca87 --- /dev/null +++ b/src/h3lib/include/alloc.h @@ -0,0 +1,49 @@ +/* + * Copyright 2020 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file alloc.h + * @brief Memory management functions + * + * This file contains macros and the necessary declarations to be able + * to point H3 at different memory management functions than the standard + * malloc/free/etc functions. + */ + +#ifndef ALLOC_H +#define ALLOC_H + +#include "h3api.h" // for TJOIN + +#ifdef H3_ALLOC_PREFIX +#define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name) + +#ifdef __cplusplus +extern "C" { +#endif + +void *H3_MEMORY(malloc)(size_t size); +void *H3_MEMORY(calloc)(size_t num, size_t size); +void *H3_MEMORY(realloc)(void *ptr, size_t size); +void H3_MEMORY(free)(void *ptr); + +#ifdef __cplusplus +} +#endif + +#else +#define H3_MEMORY(name) name +#endif + +#endif diff --git a/src/h3lib/include/baseCells.h b/src/h3lib/include/baseCells.h index eadf3cf27..653b47b6c 100644 --- a/src/h3lib/include/baseCells.h +++ b/src/h3lib/include/baseCells.h @@ -45,12 +45,16 @@ extern const BaseCellData baseCellData[NUM_BASE_CELLS]; /** Maximum input for any component to face-to-base-cell lookup functions */ #define MAX_FACE_COORD 2 +/** Invalid number of rotations */ +#define INVALID_ROTATIONS -1 + // Internal functions int _isBaseCellPentagon(int baseCell); bool _isBaseCellPolarPentagon(int baseCell); -int _faceIjkToBaseCell(const FaceIJK* h); -int _faceIjkToBaseCellCCWrot60(const FaceIJK* h); -void _baseCellToFaceIjk(int baseCell, FaceIJK* h); +int _faceIjkToBaseCell(const FaceIJK *h); +int _faceIjkToBaseCellCCWrot60(const FaceIJK *h); +int _baseCellToCCWrot60(int baseCell, int face); +void _baseCellToFaceIjk(int baseCell, FaceIJK *h); bool _baseCellIsCwOffset(int baseCell, int testFace); int _getBaseCellNeighbor(int baseCell, Direction dir); Direction _getBaseCellDirection(int originBaseCell, int destinationBaseCell); diff --git a/src/h3lib/include/bbox.h b/src/h3lib/include/bbox.h index c5f918cb2..1c56982f4 100644 --- a/src/h3lib/include/bbox.h +++ b/src/h3lib/include/bbox.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,9 @@ #define BBOX_H #include -#include "geoCoord.h" + +#include "h3api.h" +#include "latLng.h" /** @struct BBox * @brief Geographic bounding box with coordinates defined in radians @@ -33,10 +35,21 @@ typedef struct { double west; ///< west longitude } BBox; -bool bboxIsTransmeridian(const BBox* bbox); -void bboxCenter(const BBox* bbox, GeoCoord* center); -bool bboxContains(const BBox* bbox, const GeoCoord* point); -bool bboxEquals(const BBox* b1, const BBox* b2); -int bboxHexRadius(const BBox* bbox, int res); +double bboxWidthRads(const BBox *bbox); +double bboxHeightRads(const BBox *bbox); +bool bboxIsTransmeridian(const BBox *bbox); +void bboxCenter(const BBox *bbox, LatLng *center); +bool bboxContains(const BBox *bbox, const LatLng *point); +bool bboxContainsBBox(const BBox *a, const BBox *b); +bool bboxOverlapsBBox(const BBox *a, const BBox *b); +bool bboxEquals(const BBox *b1, const BBox *b2); +CellBoundary bboxToCellBoundary(const BBox *bbox); +H3Error bboxHexEstimate(const BBox *bbox, int res, int64_t *out); +H3Error lineHexEstimate(const LatLng *origin, const LatLng *destination, + int res, int64_t *out); +void scaleBBox(BBox *bbox, double scale); +void bboxNormalization(const BBox *a, const BBox *b, + LongitudeNormalization *aNormalization, + LongitudeNormalization *bNormalization); #endif diff --git a/src/h3lib/include/constants.h b/src/h3lib/include/constants.h index d6ef3ae02..90b7036aa 100644 --- a/src/h3lib/include/constants.h +++ b/src/h3lib/include/constants.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2017, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,37 +31,46 @@ #endif /** 2.0 * PI */ -#define M_2PI 6.28318530717958647692528676655900576839433L +#define M_2PI 6.28318530717958647692528676655900576839433 /** pi / 180 */ -#define M_PI_180 0.0174532925199432957692369076848861271111L -/** pi * 180 */ -#define M_180_PI 57.29577951308232087679815481410517033240547L +#define M_PI_180 0.0174532925199432957692369076848861271111 +/** 180 / pi */ +#define M_180_PI 57.29577951308232087679815481410517033240547 /** threshold epsilon */ -#define EPSILON 0.0000000000000001L +#define EPSILON 0.0000000000000001 /** sqrt(3) / 2.0 */ -#define M_SQRT3_2 0.8660254037844386467637231707529361834714L +#define M_SQRT3_2 0.8660254037844386467637231707529361834714 /** sin(60') */ #define M_SIN60 M_SQRT3_2 +/** 1/sin(60') **/ +#define M_RSIN60 1.1547005383792515290182975610039149112953 + +/** one third **/ +#define M_ONETHIRD 0.333333333333333333333333333333333333333 + +/** one seventh (1/7) **/ +#define M_ONESEVENTH 0.14285714285714285714285714285714285 /** rotation angle between Class II and Class III resolution axes * (asin(sqrt(3.0 / 28.0))) */ -#define M_AP7_ROT_RADS 0.333473172251832115336090755351601070065900389L +#define M_AP7_ROT_RADS 0.333473172251832115336090755351601070065900389 /** sin(M_AP7_ROT_RADS) */ -#define M_SIN_AP7_ROT 0.3273268353539885718950318L +#define M_SIN_AP7_ROT 0.3273268353539885718950318 /** cos(M_AP7_ROT_RADS) */ -#define M_COS_AP7_ROT 0.9449111825230680680167902L +#define M_COS_AP7_ROT 0.9449111825230680680167902 /** earth radius in kilometers using WGS84 authalic radius */ -#define EARTH_RADIUS_KM 6371.007180918475L +#define EARTH_RADIUS_KM 6371.007180918475 /** scaling factor from hex2d resolution 0 unit length * (or distance between adjacent cell center points * on the plane) to gnomonic unit length. */ -#define RES0_U_GNOMONIC 0.38196601125010500003L +#define RES0_U_GNOMONIC 0.38196601125010500003 +#define INV_RES0_U_GNOMONIC 2.61803398874989588842 /** max H3 resolution; H3 version 1 has 16 resolutions, numbered 0 through 15 */ #define MAX_H3_RES 15 @@ -74,9 +83,13 @@ #define NUM_HEX_VERTS 6 /** The number of vertices in a pentagon */ #define NUM_PENT_VERTS 5 +/** The number of pentagons per resolution **/ +#define NUM_PENTAGONS 12 /** H3 index modes */ -#define H3_HEXAGON_MODE 1 -#define H3_UNIEDGE_MODE 2 +#define H3_CELL_MODE 1 +#define H3_DIRECTEDEDGE_MODE 2 +#define H3_EDGE_MODE 3 +#define H3_VERTEX_MODE 4 #endif diff --git a/src/h3lib/include/coordijk.h b/src/h3lib/include/coordijk.h index db877bf67..422fdb1c1 100644 --- a/src/h3lib/include/coordijk.h +++ b/src/h3lib/include/coordijk.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2018, 2020-2022 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ /** @file coordijk.h - * @brief Header file for CoordIJK functions including conversion from lat/lon + * @brief Header file for CoordIJK functions including conversion from lat/lng * * References two Vec2d cartesian coordinate systems: * @@ -30,8 +30,8 @@ #ifndef COORDIJK_H #define COORDIJK_H -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" #include "vec2d.h" /** @struct CoordIJK @@ -79,35 +79,40 @@ typedef enum { INVALID_DIGIT = 7, /** Valid digits will be less than this value. Same value as INVALID_DIGIT. */ - NUM_DIGITS = INVALID_DIGIT + NUM_DIGITS = INVALID_DIGIT, + /** Child digit which is skipped for pentagons */ + PENTAGON_SKIPPED_DIGIT = K_AXES_DIGIT /* 1 */ } Direction; // Internal functions -void _setIJK(CoordIJK* ijk, int i, int j, int k); -void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h); -void _ijkToHex2d(const CoordIJK* h, Vec2d* v); -int _ijkMatches(const CoordIJK* c1, const CoordIJK* c2); -void _ijkAdd(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* sum); -void _ijkSub(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* diff); -void _ijkScale(CoordIJK* c, int factor); -void _ijkNormalize(CoordIJK* c); -Direction _unitIjkToDigit(const CoordIJK* ijk); -void _upAp7(CoordIJK* ijk); -void _upAp7r(CoordIJK* ijk); -void _downAp7(CoordIJK* ijk); -void _downAp7r(CoordIJK* ijk); -void _downAp3(CoordIJK* ijk); -void _downAp3r(CoordIJK* ijk); -void _neighbor(CoordIJK* ijk, Direction digit); -void _ijkRotate60ccw(CoordIJK* ijk); -void _ijkRotate60cw(CoordIJK* ijk); +void _setIJK(CoordIJK *ijk, int i, int j, int k); +void _hex2dToCoordIJK(const Vec2d *v, CoordIJK *h); +void _ijkToHex2d(const CoordIJK *h, Vec2d *v); +int _ijkMatches(const CoordIJK *c1, const CoordIJK *c2); +void _ijkAdd(const CoordIJK *h1, const CoordIJK *h2, CoordIJK *sum); +void _ijkSub(const CoordIJK *h1, const CoordIJK *h2, CoordIJK *diff); +void _ijkScale(CoordIJK *c, int factor); +bool _ijkNormalizeCouldOverflow(const CoordIJK *ijk); +void _ijkNormalize(CoordIJK *c); +Direction _unitIjkToDigit(const CoordIJK *ijk); +H3Error _upAp7Checked(CoordIJK *ijk); +H3Error _upAp7rChecked(CoordIJK *ijk); +void _upAp7(CoordIJK *ijk); +void _upAp7r(CoordIJK *ijk); +void _downAp7(CoordIJK *ijk); +void _downAp7r(CoordIJK *ijk); +void _downAp3(CoordIJK *ijk); +void _downAp3r(CoordIJK *ijk); +void _neighbor(CoordIJK *ijk, Direction digit); +void _ijkRotate60ccw(CoordIJK *ijk); +void _ijkRotate60cw(CoordIJK *ijk); Direction _rotate60ccw(Direction digit); Direction _rotate60cw(Direction digit); -int ijkDistance(const CoordIJK* a, const CoordIJK* b); -void ijkToIj(const CoordIJK* ijk, CoordIJ* ij); -void ijToIjk(const CoordIJ* ij, CoordIJK* ijk); -void ijkToCube(CoordIJK* ijk); -void cubeToIjk(CoordIJK* ijk); +int ijkDistance(const CoordIJK *a, const CoordIJK *b); +void ijkToIj(const CoordIJK *ijk, CoordIJ *ij); +H3Error ijToIjk(const CoordIJ *ij, CoordIJK *ijk); +void ijkToCube(CoordIJK *ijk); +void cubeToIjk(CoordIJK *ijk); #endif diff --git a/src/h3lib/include/h3UniEdge.h b/src/h3lib/include/directedEdge.h similarity index 77% rename from src/h3lib/include/h3UniEdge.h rename to src/h3lib/include/directedEdge.h index 5d62ea560..89da4a259 100644 --- a/src/h3lib/include/h3UniEdge.h +++ b/src/h3lib/include/directedEdge.h @@ -1,5 +1,5 @@ /* - * Copyright 2017 Uber Technologies, Inc. + * Copyright 2017, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** @file h3UniEdge.h - * @brief H3UniEdge functions for manipulating unidirectional edge indexes. +/** @file directedEdge.h + * @brief DirectedEdge functions for manipulating directed edge indexes. */ -#ifndef H3UNIEDGE_H -#define H3UNIEDGE_H +#ifndef DIRECTEDEDGE_H +#define DIRECTEDEDGE_H #include "algos.h" #include "h3Index.h" diff --git a/src/h3lib/include/faceijk.h b/src/h3lib/include/faceijk.h index 4224b51f2..c05cbf298 100644 --- a/src/h3lib/include/faceijk.h +++ b/src/h3lib/include/faceijk.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ /** @file faceijk.h - * @brief FaceIJK functions including conversion to/from lat/lon. + * @brief FaceIJK functions including conversion to/from lat/lng. * * References the Vec2d cartesian coordinate systems hex2d: local face-centered * coordinate system scaled a specific H3 grid resolution unit length and @@ -25,7 +25,7 @@ #define FACEIJK_H #include "coordijk.h" -#include "geoCoord.h" +#include "latLng.h" #include "vec2d.h" /** @struct FaceIJK @@ -47,13 +47,9 @@ typedef struct { /// face } FaceOrientIJK; -extern const GeoCoord faceCenterGeo[NUM_ICOSA_FACES]; +extern const LatLng faceCenterGeo[NUM_ICOSA_FACES]; // indexes for faceNeighbors table -/** Invalid faceNeighbors table direction */ -#define INVALID -1 -/** Center faceNeighbors table direction */ -#define CENTER 0 /** IJ quadrant faceNeighbors table direction */ #define IJ 1 /** KI quadrant faceNeighbors table direction */ @@ -61,16 +57,34 @@ extern const GeoCoord faceCenterGeo[NUM_ICOSA_FACES]; /** JK quadrant faceNeighbors table direction */ #define JK 3 +/** Invalid face index */ +#define INVALID_FACE -1 + +/** Digit representing overage type */ +typedef enum { + /** No overage (on original face) */ + NO_OVERAGE = 0, + /** On face edge (only occurs on substrate grids) */ + FACE_EDGE = 1, + /** Overage on new face interior */ + NEW_FACE = 2 +} Overage; + // Internal functions -void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h); -void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v); -void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g); -void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, - GeoBoundary* g); -void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g); -void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, GeoCoord* g); -int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, - int substrate); +void _geoToFaceIjk(const LatLng *g, int res, FaceIJK *h); +void _geoToHex2d(const LatLng *g, int res, int *face, Vec2d *v); +void _faceIjkToGeo(const FaceIJK *h, int res, LatLng *g); +void _faceIjkToCellBoundary(const FaceIJK *h, int res, int start, int length, + CellBoundary *g); +void _faceIjkPentToCellBoundary(const FaceIJK *h, int res, int start, + int length, CellBoundary *g); +void _faceIjkToVerts(FaceIJK *fijk, int *res, FaceIJK *fijkVerts); +void _faceIjkPentToVerts(FaceIJK *fijk, int *res, FaceIJK *fijkVerts); +void _hex2dToGeo(const Vec2d *v, int face, int res, int substrate, LatLng *g); +Overage _adjustOverageClassII(FaceIJK *fijk, int res, int pentLeading4, + int substrate); +Overage _adjustPentVertOverage(FaceIJK *fijk, int res); +void _geoToClosestFace(const LatLng *g, int *face, double *sqd); #endif diff --git a/src/h3lib/include/h3Assert.h b/src/h3lib/include/h3Assert.h new file mode 100644 index 000000000..125cc5ad7 --- /dev/null +++ b/src/h3lib/include/h3Assert.h @@ -0,0 +1,125 @@ +/* + * Copyright 2022 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file h3Assert.h + * @brief Support code for unit testing and assertions + * + * This file defines macros needed for defensive programming in the H3 core + * library. H3 strives to have complete code and branch coverage, but this is + * not feasible if some branches cannot be reached because they are defensive - + * that is, we do not know of a test case that would exercise the branch but we + * do have an opinion of how to recover from such an error. These defensive + * branches are excluded from coverage. + * + * In other testing, such as unit tests or fuzzer testing, they trigger + * assertions if the conditions fail. + * + * Adapted from https://www.sqlite.org/testing.html and + * https://www.sqlite.org/assert.html + * + * Used under the terms of the SQLite3 project, reproduced below: + * The author disclaims copyright to this source code. In place of + * a legal notice, here is a blessing: + * + * May you do good and not evil. + * May you find forgiveness for yourself and forgive others. + * May you share freely, never taking more than you give. + */ + +#ifndef H3ASSERT_H +#define H3ASSERT_H + +#include + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +*/ +#if defined(H3_COVERAGE_TEST) || defined(H3_DEBUG) +extern unsigned int h3CoverageCounter; +#define testcase(X) \ + if (X) { \ + h3CoverageCounter += (unsigned)__LINE__; \ + } +#else +#define testcase(X) +#endif + +/* +** Disable ALWAYS() and NEVER() (make them pass-throughs) for coverage +** and mutation testing +*/ +#if defined(H3_COVERAGE_TEST) +#define H3_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(H3_COVERAGE_TEST) +#define TESTONLY(X) X +#else +#define TESTONLY(X) +#endif + +/* +** The DEFENSEONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within ALWAYS() or NEVER() macros. +*/ +#if !defined(H3_OMIT_AUXILIARY_SAFETY_CHECKS) +#define DEFENSEONLY(X) X +#else +#define DEFENSEONLY(X) +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of the H3 library to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code they specify will +** not be counted as untested code. +*/ +#if defined(H3_OMIT_AUXILIARY_SAFETY_CHECKS) +#define ALWAYS(X) (1) +#define NEVER(X) (0) +#elif !defined(NDEBUG) +#define ALWAYS(X) ((X) ? 1 : (assert(0), 0)) +#define NEVER(X) ((X) ? (assert(0), 1) : 0) +#else +#define ALWAYS(X) (X) +#define NEVER(X) (X) +#endif + +#endif diff --git a/src/h3lib/include/h3Index.h b/src/h3lib/include/h3Index.h index 9b7fc913e..6ced3c4cd 100644 --- a/src/h3lib/include/h3Index.h +++ b/src/h3lib/include/h3Index.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2018, 2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,6 +46,12 @@ /** The number of bits in a single H3 resolution digit. */ #define H3_PER_DIGIT_OFFSET 3 +/** 1 in the highest bit, 0's everywhere else. */ +#define H3_HIGH_BIT_MASK ((uint64_t)(1) << H3_MAX_OFFSET) + +/** 0 in the highest bit, 1's everywhere else. */ +#define H3_HIGH_BIT_MASK_NEGATIVE (~H3_HIGH_BIT_MASK) + /** 1's in the 4 mode bits, 0's everywhere else. */ #define H3_MODE_MASK ((uint64_t)(15) << H3_MODE_OFFSET) @@ -74,11 +80,27 @@ #define H3_DIGIT_MASK ((uint64_t)(7)) /** 0's in the 7 base cell bits, 1's everywhere else. */ -#define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK_NEGATIVE) +#define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK) -/** H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. */ +/** + * H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. + * Typically used to initialize the creation of an H3 cell index, which + * expects all direction digits to be 7 beyond the cell's resolution. + */ #define H3_INIT (UINT64_C(35184372088831)) +/** + * Gets the highest bit of the H3 index. + */ +#define H3_GET_HIGH_BIT(h3) ((int)((((h3)&H3_HIGH_BIT_MASK) >> H3_MAX_OFFSET))) + +/** + * Sets the highest bit of the h3 to v. + */ +#define H3_SET_HIGH_BIT(h3, v) \ + (h3) = (((h3)&H3_HIGH_BIT_MASK_NEGATIVE) | \ + (((uint64_t)(v)) << H3_MAX_OFFSET)) + /** * Gets the integer mode of h3. */ @@ -142,22 +164,19 @@ (((uint64_t)(digit)) \ << ((MAX_H3_RES - (res)) * H3_PER_DIGIT_OFFSET))) -/** - * Invalid index used to indicate an error from geoToH3 and related functions. - */ -#define H3_INVALID_INDEX 0 - -void setH3Index(H3Index* h, int res, int baseCell, Direction initDigit); -int isResClassIII(int res); +void setH3Index(H3Index *h, int res, int baseCell, Direction initDigit); +int isResolutionClassIII(int r); // Internal functions -int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk); -H3Index _faceIjkToH3(const FaceIJK* fijk, int res); +int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK *fijk); +H3Error _h3ToFaceIjk(H3Index h, FaceIJK *fijk); +H3Index _faceIjkToH3(const FaceIJK *fijk, int res); Direction _h3LeadingNonZeroDigit(H3Index h); H3Index _h3RotatePent60ccw(H3Index h); H3Index _h3RotatePent60cw(H3Index h); H3Index _h3Rotate60ccw(H3Index h); H3Index _h3Rotate60cw(H3Index h); +DECLSPEC H3Index _zeroIndexDigits(H3Index h, int start, int end); #endif diff --git a/src/h3lib/include/h3api.h b/src/h3lib/include/h3api.h deleted file mode 100644 index cdf8373c3..000000000 --- a/src/h3lib/include/h3api.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Copyright 2016-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file h3api.h - * @brief Primary H3 core library entry points. - * - * This file defines the public API of the H3 library. Incompatible changes to - * these functions require the library's major version be increased. - */ - -#ifndef H3API_H -#define H3API_H - -/* - * Preprocessor code to support renaming (prefixing) the public API. - * All public functions should be wrapped in H3_EXPORT so they can be - * renamed. - */ -#ifdef H3_PREFIX -#define XTJOIN(a, b) a##b -#define TJOIN(a, b) XTJOIN(a, b) - -/* export joins the user provided prefix with our exported function name */ -#define H3_EXPORT(name) TJOIN(H3_PREFIX, name) -#else -#define H3_EXPORT(name) name -#endif - -/* For uint64_t */ -#include -/* For size_t */ -#include - -/* - * H3 is compiled as C, not C++ code. `extern "C"` is needed for C++ code - * to be able to use the library. - */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief the H3Index fits within a 64-bit unsigned integer */ -typedef uint64_t H3Index; - -/** Maximum number of cell boundary vertices; worst case is pentagon: - * 5 original verts + 5 edge crossings - */ -#define MAX_CELL_BNDRY_VERTS 10 - -/** @struct GeoCoord - @brief latitude/longitude in radians -*/ -typedef struct { - double lat; ///< latitude in radians - double lon; ///< longitude in radians -} GeoCoord; - -/** @struct GeoBoundary - @brief cell boundary in latitude/longitude -*/ -typedef struct { - int numVerts; ///< number of vertices - GeoCoord verts[MAX_CELL_BNDRY_VERTS]; ///< vertices in ccw order -} GeoBoundary; - -/** @struct Geofence - * @brief similar to GeoBoundary, but requires more alloc work - */ -typedef struct { - int numVerts; - GeoCoord *verts; -} Geofence; - -/** @struct GeoPolygon - * @brief Simplified core of GeoJSON Polygon coordinates definition - */ -typedef struct { - Geofence geofence; ///< exterior boundary of the polygon - int numHoles; ///< number of elements in the array pointed to by holes - Geofence *holes; ///< interior boundaries (holes) in the polygon -} GeoPolygon; - -/** @struct GeoMultiPolygon - * @brief Simplified core of GeoJSON MultiPolygon coordinates definition - */ -typedef struct { - int numPolygons; - GeoPolygon *polygons; -} GeoMultiPolygon; - -/** @struct LinkedGeoCoord - * @brief A coordinate node in a linked geo structure, part of a linked list - */ -typedef struct LinkedGeoCoord LinkedGeoCoord; -struct LinkedGeoCoord { - GeoCoord vertex; - LinkedGeoCoord *next; -}; - -/** @struct LinkedGeoLoop - * @brief A loop node in a linked geo structure, part of a linked list - */ -typedef struct LinkedGeoLoop LinkedGeoLoop; -struct LinkedGeoLoop { - LinkedGeoCoord *first; - LinkedGeoCoord *last; - LinkedGeoLoop *next; -}; - -/** @struct LinkedGeoPolygon - * @brief A polygon node in a linked geo structure, part of a linked list. - */ -typedef struct LinkedGeoPolygon LinkedGeoPolygon; -struct LinkedGeoPolygon { - LinkedGeoLoop *first; - LinkedGeoLoop *last; - LinkedGeoPolygon *next; -}; - -/** @struct CoordIJ - * @brief IJ hexagon coordinates - * - * Each axis is spaced 120 degrees apart. - */ -typedef struct { - int i; ///< i component - int j; ///< j component -} CoordIJ; - -/** @defgroup geoToH3 geoToH3 - * Functions for geoToH3 - * @{ - */ -/** @brief find the H3 index of the resolution res cell containing the lat/lon g - */ -H3Index H3_EXPORT(geoToH3)(const GeoCoord *g, int res); -/** @} */ - -/** @defgroup h3ToGeo h3ToGeo - * Functions for h3ToGeo - * @{ - */ -/** @brief find the lat/lon center point g of the cell h3 */ -void H3_EXPORT(h3ToGeo)(H3Index h3, GeoCoord *g); -/** @} */ - -/** @defgroup h3ToGeoBoundary h3ToGeoBoundary - * Functions for h3ToGeoBoundary - * @{ - */ -/** @brief give the cell boundary in lat/lon coordinates for the cell h3 */ -void H3_EXPORT(h3ToGeoBoundary)(H3Index h3, GeoBoundary *gp); -/** @} */ - -/** @defgroup kRing kRing - * Functions for kRing - * @{ - */ -/** @brief maximum number of hexagons in k-ring */ -int H3_EXPORT(maxKringSize)(int k); - -/** @brief hexagons neighbors in all directions, assuming no pentagons */ -int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index *out); -/** @} */ - -/** @brief hexagons neighbors in all directions, assuming no pentagons, - * reporting - * distance from origin */ -int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index *out, - int *distances); - -/** @brief collection of hex rings sorted by ring for all given hexagons */ -int H3_EXPORT(hexRanges)(H3Index *h3Set, int length, int k, H3Index *out); - -/** @brief hexagon neighbors in all directions */ -void H3_EXPORT(kRing)(H3Index origin, int k, H3Index *out); -/** @} */ - -/** @defgroup kRingDistances kRingDistances - * Functions for kRingDistances - * @{ - */ -/** @brief hexagon neighbors in all directions, reporting distance from origin - */ -void H3_EXPORT(kRingDistances)(H3Index origin, int k, H3Index *out, - int *distances); -/** @} */ - -/** @defgroup hexRing hexRing - * Functions for hexRing - * @{ - */ -/** @brief hollow hexagon ring at some origin */ -int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index *out); -/** @} */ - -/** @defgroup polyfill polyfill - * Functions for polyfill - * @{ - */ -/** @brief maximum number of hexagons in the geofence */ -int H3_EXPORT(maxPolyfillSize)(const GeoPolygon *geoPolygon, int res); - -/** @brief hexagons within the given geofence */ -void H3_EXPORT(polyfill)(const GeoPolygon *geoPolygon, int res, H3Index *out); -/** @} */ - -/** @defgroup h3SetToMultiPolygon h3SetToMultiPolygon - * Functions for h3SetToMultiPolygon (currently a binding-only concept) - * @{ - */ -/** @brief Create a LinkedGeoPolygon from a set of contiguous hexagons */ -void H3_EXPORT(h3SetToLinkedGeo)(const H3Index *h3Set, const int numHexes, - LinkedGeoPolygon *out); - -/** @brief Free all memory created for a LinkedGeoPolygon */ -void H3_EXPORT(destroyLinkedPolygon)(LinkedGeoPolygon *polygon); -/** @} */ - -/** @defgroup degsToRads degsToRads - * Functions for degsToRads - * @{ - */ -/** @brief converts degrees to radians */ -double H3_EXPORT(degsToRads)(double degrees); -/** @} */ - -/** @defgroup radsToDegs radsToDegs - * Functions for radsToDegs - * @{ - */ -/** @brief converts radians to degrees */ -double H3_EXPORT(radsToDegs)(double radians); -/** @} */ - -/** @defgroup hexArea hexArea - * Functions for hexArea - * @{ - */ -/** @brief hexagon area in square kilometers */ -double H3_EXPORT(hexAreaKm2)(int res); - -/** @brief hexagon area in square meters */ -double H3_EXPORT(hexAreaM2)(int res); -/** @} */ - -/** @defgroup edgeLength edgeLength - * Functions for edgeLength - * @{ - */ -/** @brief hexagon edge length in kilometers */ -double H3_EXPORT(edgeLengthKm)(int res); - -/** @brief hexagon edge length in meters */ -double H3_EXPORT(edgeLengthM)(int res); -/** @} */ - -/** @defgroup numHexagons numHexagons - * Functions for numHexagons - * @{ - */ -/** @brief number of hexagons for a given resolution */ -int64_t H3_EXPORT(numHexagons)(int res); -/** @} */ - -/** @defgroup h3GetResolution h3GetResolution - * Functions for h3GetResolution - * @{ - */ -/** @brief returns the resolution of the provided hexagon */ -int H3_EXPORT(h3GetResolution)(H3Index h); -/** @} */ - -/** @defgroup h3GetBaseCell h3GetBaseCell - * Functions for h3GetBaseCell - * @{ - */ -/** @brief returns the base cell of the provided hexagon */ -int H3_EXPORT(h3GetBaseCell)(H3Index h); -/** @} */ - -/** @defgroup stringToH3 stringToH3 - * Functions for stringToH3 - * @{ - */ -/** @brief converts the canonical string format to H3Index format */ -H3Index H3_EXPORT(stringToH3)(const char *str); -/** @} */ - -/** @defgroup h3ToString h3ToString - * Functions for h3ToString - * @{ - */ -/** @brief converts an H3Index to a canonical string */ -void H3_EXPORT(h3ToString)(H3Index h, char *str, size_t sz); -/** @} */ - -/** @defgroup h3IsValid h3IsValid - * Functions for h3IsValid - * @{ - */ -/** @brief confirms if an H3Index is valid */ -int H3_EXPORT(h3IsValid)(H3Index h); -/** @} */ - -/** @defgroup h3ToParent h3ToParent - * Functions for h3ToParent - * @{ - */ -/** @brief returns the parent (or grandparent, etc) hexagon of the given hexagon - */ -H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes); -/** @} */ - -/** @defgroup h3ToChildren h3ToChildren - * Functions for h3ToChildren - * @{ - */ -/** @brief determines the maximum number of children (or grandchildren, etc) - * that - * could be returned for the given hexagon */ -int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes); - -/** @brief provides the children (or grandchildren, etc) of the given hexagon */ -void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index *children); -/** @} */ - -/** @defgroup compact compact - * Functions for compact - * @{ - */ -/** @brief compacts the given set of hexagons as best as possible */ -int H3_EXPORT(compact)(const H3Index *h3Set, H3Index *compactedSet, - const int numHexes); -/** @} */ - -/** @defgroup uncompact uncompact - * Functions for uncompact - * @{ - */ -/** @brief determines the maximum number of hexagons that could be uncompacted - * from the compacted set */ -int H3_EXPORT(maxUncompactSize)(const H3Index *compactedSet, const int numHexes, - const int res); - -/** @brief uncompacts the compacted hexagon set */ -int H3_EXPORT(uncompact)(const H3Index *compactedSet, const int numHexes, - H3Index *h3Set, const int maxHexes, const int res); -/** @} */ - -/** @defgroup h3IsResClassIII h3IsResClassIII - * Functions for h3IsResClassIII - * @{ - */ -/** @brief determines if a hexagon is Class III (or Class II) */ -int H3_EXPORT(h3IsResClassIII)(H3Index h); -/** @} */ - -/** @defgroup h3IsPentagon h3IsPentagon - * Functions for h3IsPentagon - * @{ - */ -/** @brief determines if a hexagon is actually a pentagon */ -int H3_EXPORT(h3IsPentagon)(H3Index h); -/** @} */ - -/** @defgroup h3IndexesAreNeighbors h3IndexesAreNeighbors - * Functions for h3IndexesAreNeighbors - * @{ - */ -/** @brief returns whether or not the provided hexagons border */ -int H3_EXPORT(h3IndexesAreNeighbors)(H3Index origin, H3Index destination); -/** @} */ - -/** @defgroup getH3UnidirectionalEdge getH3UnidirectionalEdge - * Functions for getH3UnidirectionalEdge - * @{ - */ -/** @brief returns the unidirectional edge H3Index for the specified origin and - * destination */ -H3Index H3_EXPORT(getH3UnidirectionalEdge)(H3Index origin, H3Index destination); -/** @} */ - -/** @defgroup h3UnidirectionalEdgeIsValid h3UnidirectionalEdgeIsValid - * Functions for h3UnidirectionalEdgeIsValid - * @{ - */ -/** @brief returns whether the H3Index is a valid unidirectional edge */ -int H3_EXPORT(h3UnidirectionalEdgeIsValid)(H3Index edge); -/** @} */ - -/** @defgroup getOriginH3IndexFromUnidirectionalEdge \ - * getOriginH3IndexFromUnidirectionalEdge - * Functions for getOriginH3IndexFromUnidirectionalEdge - * @{ - */ -/** @brief Returns the origin hexagon H3Index from the unidirectional edge - * H3Index */ -H3Index H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(H3Index edge); -/** @} */ - -/** @defgroup getDestinationH3IndexFromUnidirectionalEdge \ - * getDestinationH3IndexFromUnidirectionalEdge - * Functions for getDestinationH3IndexFromUnidirectionalEdge - * @{ - */ -/** @brief Returns the destination hexagon H3Index from the unidirectional edge - * H3Index */ -H3Index H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(H3Index edge); -/** @} */ - -/** @defgroup getH3IndexesFromUnidirectionalEdge \ - * getH3IndexesFromUnidirectionalEdge - * Functions for getH3IndexesFromUnidirectionalEdge - * @{ - */ -/** @brief Returns the origin and destination hexagons from the unidirectional - * edge H3Index */ -void H3_EXPORT(getH3IndexesFromUnidirectionalEdge)(H3Index edge, - H3Index *originDestination); -/** @} */ - -/** @defgroup getH3UnidirectionalEdgesFromHexagon \ - * getH3UnidirectionalEdgesFromHexagon - * Functions for getH3UnidirectionalEdgesFromHexagon - * @{ - */ -/** @brief Returns the 6 (or 5 for pentagons) edges associated with the H3Index - */ -void H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(H3Index origin, - H3Index *edges); -/** @} */ - -/** @defgroup getH3UnidirectionalEdgeBoundary getH3UnidirectionalEdgeBoundary - * Functions for getH3UnidirectionalEdgeBoundary - * @{ - */ -/** @brief Returns the GeoBoundary containing the coordinates of the edge */ -void H3_EXPORT(getH3UnidirectionalEdgeBoundary)(H3Index edge, GeoBoundary *gb); -/** @} */ - -/** @defgroup h3Distance h3Distance - * Functions for h3Distance - * @{ - */ -/** @brief Returns grid distance between two indexes */ -int H3_EXPORT(h3Distance)(H3Index origin, H3Index h3); -/** @} */ - -/** @defgroup h3Line h3Line - * Functions for h3Line - * @{ - */ -/** @brief Number of indexes in a line connecting two indexes */ -int H3_EXPORT(h3LineSize)(H3Index start, H3Index end); - -/** @brief Line of h3 indexes connecting two indexes */ -int H3_EXPORT(h3Line)(H3Index start, H3Index end, H3Index *out); -/** @} */ - -/** @defgroup experimentalH3ToLocalIj experimentalH3ToLocalIj - * Functions for experimentalH3ToLocalIj - * @{ - */ -/** @brief Returns two dimensional coordinates for the given index */ -int H3_EXPORT(experimentalH3ToLocalIj)(H3Index origin, H3Index h3, - CoordIJ *out); -/** @} */ - -/** @defgroup experimentalLocalIjToH3 experimentalLocalIjToH3 - * Functions for experimentalLocalIjToH3 - * @{ - */ -/** @brief Returns index for the given two dimensional coordinates */ -int H3_EXPORT(experimentalLocalIjToH3)(H3Index origin, const CoordIJ *ij, - H3Index *out); -/** @} */ - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/src/h3lib/include/h3api.h.in b/src/h3lib/include/h3api.h.in new file mode 100644 index 000000000..466762c1a --- /dev/null +++ b/src/h3lib/include/h3api.h.in @@ -0,0 +1,803 @@ +/* + * Copyright 2016-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file h3api.h + * @brief Primary H3 core library entry points. + * + * This file defines the public API of the H3 library. Incompatible changes to + * these functions require the library's major version be increased. + */ + +#ifndef H3API_H +#define H3API_H + +/* + * Preprocessor code to support renaming (prefixing) the public API. + * All public functions should be wrapped in H3_EXPORT so they can be + * renamed. + */ +#ifdef H3_PREFIX +#define XTJOIN(a, b) a##b +#define TJOIN(a, b) XTJOIN(a, b) + +/* export joins the user provided prefix with our exported function name */ +#define H3_EXPORT(name) TJOIN(H3_PREFIX, name) +#else +#define H3_EXPORT(name) name +#endif + +/* Windows DLL requires attributes indicating what to export */ +#if _WIN32 && BUILD_SHARED_LIBS +#if BUILDING_H3 +#define DECLSPEC __declspec(dllexport) +#else +#define DECLSPEC __declspec(dllimport) +#endif +#else +#define DECLSPEC +#endif + +/* For uint64_t */ +#include +/* For size_t */ +#include + +/* + * H3 is compiled as C, not C++ code. `extern "C"` is needed for C++ code + * to be able to use the library. + */ +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Identifier for an object (cell, edge, etc) in the H3 system. + * + * The H3Index fits within a 64-bit unsigned integer. + */ +typedef uint64_t H3Index; + +/** + * Invalid index used to indicate an error from latLngToCell and related + * functions or missing data in arrays of H3 indices. Analogous to NaN in + * floating point. + */ +#define H3_NULL 0 + +/** @brief Result code (success or specific error) from an H3 operation */ +typedef uint32_t H3Error; + +typedef enum { + E_SUCCESS = 0, // Success (no error) + E_FAILED = + 1, // The operation failed but a more specific error is not available + E_DOMAIN = 2, // Argument was outside of acceptable range (when a more + // specific error code is not available) + E_LATLNG_DOMAIN = + 3, // Latitude or longitude arguments were outside of acceptable range + E_RES_DOMAIN = 4, // Resolution argument was outside of acceptable range + E_CELL_INVALID = 5, // `H3Index` cell argument was not valid + E_DIR_EDGE_INVALID = 6, // `H3Index` directed edge argument was not valid + E_UNDIR_EDGE_INVALID = + 7, // `H3Index` undirected edge argument was not valid + E_VERTEX_INVALID = 8, // `H3Index` vertex argument was not valid + E_PENTAGON = 9, // Pentagon distortion was encountered which the algorithm + // could not handle it + E_DUPLICATE_INPUT = 10, // Duplicate input was encountered in the arguments + // and the algorithm could not handle it + E_NOT_NEIGHBORS = 11, // `H3Index` cell arguments were not neighbors + E_RES_MISMATCH = + 12, // `H3Index` cell arguments had incompatible resolutions + E_MEMORY_ALLOC = 13, // Necessary memory allocation failed + E_MEMORY_BOUNDS = 14, // Bounds of provided memory were not large enough + E_OPTION_INVALID = 15 // Mode or flags argument was not valid. +} H3ErrorCodes; + +/** @defgroup describeH3Error describeH3Error + * Functions for describeH3Error + * @{ + */ +/** @brief converts the provided H3Error value into a description string */ +DECLSPEC const char *H3_EXPORT(describeH3Error)(H3Error err); +/** @} */ + +/* library version numbers generated from VERSION file */ +// clang-format off +#define H3_VERSION_MAJOR @H3_VERSION_MAJOR@ +#define H3_VERSION_MINOR @H3_VERSION_MINOR@ +#define H3_VERSION_PATCH @H3_VERSION_PATCH@ +// clang-format on + +/** Maximum number of cell boundary vertices; worst case is pentagon: + * 5 original verts + 5 edge crossings + */ +#define MAX_CELL_BNDRY_VERTS 10 + +/** @struct LatLng + @brief latitude/longitude in radians +*/ +typedef struct { + double lat; ///< latitude in radians + double lng; ///< longitude in radians +} LatLng; + +/** @struct CellBoundary + @brief cell boundary in latitude/longitude +*/ +typedef struct { + int numVerts; ///< number of vertices + LatLng verts[MAX_CELL_BNDRY_VERTS]; ///< vertices in ccw order +} CellBoundary; + +/** @struct GeoLoop + * @brief similar to CellBoundary, but requires more alloc work + */ +typedef struct { + int numVerts; + LatLng *verts; +} GeoLoop; + +/** @struct GeoPolygon + * @brief Simplified core of GeoJSON Polygon coordinates definition + */ +typedef struct { + GeoLoop geoloop; ///< exterior boundary of the polygon + int numHoles; ///< number of elements in the array pointed to by holes + GeoLoop *holes; ///< interior boundaries (holes) in the polygon +} GeoPolygon; + +/** @struct GeoMultiPolygon + * @brief Simplified core of GeoJSON MultiPolygon coordinates definition + */ +typedef struct { + int numPolygons; + GeoPolygon *polygons; +} GeoMultiPolygon; + +/** + * Values representing polyfill containment modes, to be used in + * the `flags` bit field for `polygonToCellsExperimental`. + */ +typedef enum { + CONTAINMENT_CENTER = 0, ///< Cell center is contained in the shape + CONTAINMENT_FULL = 1, ///< Cell is fully contained in the shape + CONTAINMENT_OVERLAPPING = 2, ///< Cell overlaps the shape at any point + CONTAINMENT_OVERLAPPING_BBOX = 3, ///< Cell bounding box overlaps shape + CONTAINMENT_INVALID = 4 ///< This mode is invalid and should not be used +} ContainmentMode; + +/** @struct LinkedLatLng + * @brief A coordinate node in a linked geo structure, part of a linked list + */ +typedef struct LinkedLatLng LinkedLatLng; +struct LinkedLatLng { + LatLng vertex; + LinkedLatLng *next; +}; + +/** @struct LinkedGeoLoop + * @brief A loop node in a linked geo structure, part of a linked list + */ +typedef struct LinkedGeoLoop LinkedGeoLoop; +struct LinkedGeoLoop { + LinkedLatLng *first; + LinkedLatLng *last; + LinkedGeoLoop *next; +}; + +/** @struct LinkedGeoPolygon + * @brief A polygon node in a linked geo structure, part of a linked list. + */ +typedef struct LinkedGeoPolygon LinkedGeoPolygon; +struct LinkedGeoPolygon { + LinkedGeoLoop *first; + LinkedGeoLoop *last; + LinkedGeoPolygon *next; +}; + +/** @struct CoordIJ + * @brief IJ hexagon coordinates + * + * Each axis is spaced 120 degrees apart. + */ +typedef struct { + int i; ///< i component + int j; ///< j component +} CoordIJ; + +/** @defgroup latLngToCell latLngToCell + * Functions for latLngToCell + * @{ + */ +/** @brief find the H3 index of the resolution res cell containing the lat/lng + */ +DECLSPEC H3Error H3_EXPORT(latLngToCell)(const LatLng *g, int res, + H3Index *out); +/** @} */ + +/** @defgroup cellToLatLng cellToLatLng + * Functions for cellToLatLng + * @{ + */ +/** @brief find the lat/lng center point g of the cell h3 */ +DECLSPEC H3Error H3_EXPORT(cellToLatLng)(H3Index h3, LatLng *g); +/** @} */ + +/** @defgroup cellToBoundary cellToBoundary + * Functions for cellToBoundary + * @{ + */ +/** @brief give the cell boundary in lat/lng coordinates for the cell h3 */ +DECLSPEC H3Error H3_EXPORT(cellToBoundary)(H3Index h3, CellBoundary *gp); +/** @} */ + +/** @defgroup gridDisk gridDisk + * Functions for gridDisk + * @{ + */ +/** @brief maximum number of hexagons in k-ring */ +DECLSPEC H3Error H3_EXPORT(maxGridDiskSize)(int k, int64_t *out); + +/** @brief hexagons neighbors in all directions, assuming no pentagons */ +DECLSPEC H3Error H3_EXPORT(gridDiskUnsafe)(H3Index origin, int k, H3Index *out); +/** @} */ + +/** @brief hexagons neighbors in all directions, assuming no pentagons, + * reporting distance from origin */ +DECLSPEC H3Error H3_EXPORT(gridDiskDistancesUnsafe)(H3Index origin, int k, + H3Index *out, + int *distances); + +/** @brief hexagons neighbors in all directions reporting distance from origin + */ +DECLSPEC H3Error H3_EXPORT(gridDiskDistancesSafe)(H3Index origin, int k, + H3Index *out, int *distances); + +/** @brief collection of hex rings sorted by ring for all given hexagons */ +DECLSPEC H3Error H3_EXPORT(gridDisksUnsafe)(H3Index *h3Set, int length, int k, + H3Index *out); + +/** @brief hexagon neighbors in all directions */ +DECLSPEC H3Error H3_EXPORT(gridDisk)(H3Index origin, int k, H3Index *out); +/** @} */ + +/** @defgroup gridDiskDistances gridDiskDistances + * Functions for gridDiskDistances + * @{ + */ +/** @brief hexagon neighbors in all directions, reporting distance from origin + */ +DECLSPEC H3Error H3_EXPORT(gridDiskDistances)(H3Index origin, int k, + H3Index *out, int *distances); +/** @} */ + +/** @defgroup gridRingUnsafe gridRingUnsafe + * Functions for gridRingUnsafe + * @{ + */ +/** @brief hollow hexagon ring at some origin */ +DECLSPEC H3Error H3_EXPORT(gridRingUnsafe)(H3Index origin, int k, H3Index *out); +/** @} */ + +/** @defgroup polygonToCells polygonToCells + * Functions for polygonToCells + * @{ + */ +/** @brief maximum number of cells that could be in the polygon */ +DECLSPEC H3Error H3_EXPORT(maxPolygonToCellsSize)(const GeoPolygon *geoPolygon, + int res, uint32_t flags, + int64_t *out); + +/** @brief cells within the given polygon */ +DECLSPEC H3Error H3_EXPORT(polygonToCells)(const GeoPolygon *geoPolygon, + int res, uint32_t flags, + H3Index *out); +/** @} */ + +/** @defgroup polygonToCellsExperimental polygonToCellsExperimental + * Functions for polygonToCellsExperimental. + * This is an experimental-only API and is subject to change in minor versions. + * @{ + */ +/** @brief maximum number of cells that could be in the polygon */ +DECLSPEC H3Error H3_EXPORT(maxPolygonToCellsSizeExperimental)( + const GeoPolygon *polygon, int res, uint32_t flags, int64_t *out); + +/** @brief cells within the given polygon */ +DECLSPEC H3Error H3_EXPORT(polygonToCellsExperimental)( + const GeoPolygon *polygon, int res, uint32_t flags, int64_t size, + H3Index *out); +/** @} */ + +/** @defgroup cellsToMultiPolygon cellsToMultiPolygon + * Functions for cellsToMultiPolygon (currently a binding-only concept) + * @{ + */ +/** @brief Create a LinkedGeoPolygon from a set of contiguous hexagons */ +DECLSPEC H3Error H3_EXPORT(cellsToLinkedMultiPolygon)(const H3Index *h3Set, + const int numHexes, + LinkedGeoPolygon *out); + +/** @brief Free all memory created for a LinkedGeoPolygon */ +DECLSPEC void H3_EXPORT(destroyLinkedMultiPolygon)(LinkedGeoPolygon *polygon); +/** @} */ + +/** @defgroup degsToRads degsToRads + * Functions for degsToRads + * @{ + */ +/** @brief converts degrees to radians */ +DECLSPEC double H3_EXPORT(degsToRads)(double degrees); +/** @} */ + +/** @defgroup radsToDegs radsToDegs + * Functions for radsToDegs + * @{ + */ +/** @brief converts radians to degrees */ +DECLSPEC double H3_EXPORT(radsToDegs)(double radians); +/** @} */ + +/** @defgroup greatCircleDistance greatCircleDistance + * Functions for distance + * @{ + */ +/** @brief "great circle distance" between pairs of LatLng points in radians*/ +DECLSPEC double H3_EXPORT(greatCircleDistanceRads)(const LatLng *a, + const LatLng *b); + +/** @brief "great circle distance" between pairs of LatLng points in + * kilometers*/ +DECLSPEC double H3_EXPORT(greatCircleDistanceKm)(const LatLng *a, + const LatLng *b); + +/** @brief "great circle distance" between pairs of LatLng points in meters*/ +DECLSPEC double H3_EXPORT(greatCircleDistanceM)(const LatLng *a, + const LatLng *b); +/** @} */ + +/** @defgroup getHexagonAreaAvg getHexagonAreaAvg + * Functions for getHexagonAreaAvg + * @{ + */ +/** @brief average hexagon area in square kilometers (excludes pentagons) */ +DECLSPEC H3Error H3_EXPORT(getHexagonAreaAvgKm2)(int res, double *out); + +/** @brief average hexagon area in square meters (excludes pentagons) */ +DECLSPEC H3Error H3_EXPORT(getHexagonAreaAvgM2)(int res, double *out); +/** @} */ + +/** @defgroup cellArea cellArea + * Functions for cellArea + * @{ + */ +/** @brief exact area for a specific cell (hexagon or pentagon) in radians^2 */ +DECLSPEC H3Error H3_EXPORT(cellAreaRads2)(H3Index h, double *out); + +/** @brief exact area for a specific cell (hexagon or pentagon) in kilometers^2 + */ +DECLSPEC H3Error H3_EXPORT(cellAreaKm2)(H3Index h, double *out); + +/** @brief exact area for a specific cell (hexagon or pentagon) in meters^2 */ +DECLSPEC H3Error H3_EXPORT(cellAreaM2)(H3Index h, double *out); +/** @} */ + +/** @defgroup getHexagonEdgeLengthAvg getHexagonEdgeLengthAvg + * Functions for getHexagonEdgeLengthAvg + * @{ + */ +/** @brief average hexagon edge length in kilometers (excludes pentagons) */ +DECLSPEC H3Error H3_EXPORT(getHexagonEdgeLengthAvgKm)(int res, double *out); + +/** @brief average hexagon edge length in meters (excludes pentagons) */ +DECLSPEC H3Error H3_EXPORT(getHexagonEdgeLengthAvgM)(int res, double *out); +/** @} */ + +/** @defgroup edgeLength edgeLength + * Functions for edgeLength + * @{ + */ +/** @brief exact length for a specific directed edge in radians*/ +DECLSPEC H3Error H3_EXPORT(edgeLengthRads)(H3Index edge, double *length); + +/** @brief exact length for a specific directed edge in kilometers*/ +DECLSPEC H3Error H3_EXPORT(edgeLengthKm)(H3Index edge, double *length); + +/** @brief exact length for a specific directed edge in meters*/ +DECLSPEC H3Error H3_EXPORT(edgeLengthM)(H3Index edge, double *length); +/** @} */ + +/** @defgroup getNumCells getNumCells + * Functions for getNumCells + * @{ + */ +/** @brief number of cells (hexagons and pentagons) for a given resolution + * + * It works out to be `2 + 120*7^r` for resolution `r`. + * + * # Mathematical notes + * + * Let h(n) be the number of children n levels below + * a single *hexagon*. + * + * Then h(n) = 7^n. + * + * Let p(n) be the number of children n levels below + * a single *pentagon*. + * + * Then p(0) = 1, and p(1) = 6, since each pentagon + * has 5 hexagonal immediate children and 1 pentagonal + * immediate child. + * + * In general, we have the recurrence relation + * + * p(n) = 5*h(n-1) + p(n-1) + * = 5*7^(n-1) + p(n-1). + * + * Working through the recurrence, we get that + * + * p(n) = 1 + 5*\sum_{k=1}^n 7^{k-1} + * = 1 + 5*(7^n - 1)/6, + * + * using the closed form for a geometric series. + * + * Using the closed forms for h(n) and p(n), we can + * get a closed form for the total number of cells + * at resolution r: + * + * c(r) = 12*p(r) + 110*h(r) + * = 2 + 120*7^r. + * + * + * @param res H3 cell resolution + * + * @return number of cells at resolution `res` + */ +DECLSPEC H3Error H3_EXPORT(getNumCells)(int res, int64_t *out); +/** @} */ + +/** @defgroup getRes0Cells getRes0Cells + * Functions for getRes0Cells + * @{ + */ +/** @brief returns the number of resolution 0 cells (hexagons and pentagons) */ +DECLSPEC int H3_EXPORT(res0CellCount)(void); + +/** @brief provides all base cells in H3Index format*/ +DECLSPEC H3Error H3_EXPORT(getRes0Cells)(H3Index *out); +/** @} */ + +/** @defgroup getPentagons getPentagons + * Functions for getPentagons + * @{ + */ +/** @brief returns the number of pentagons per resolution */ +DECLSPEC int H3_EXPORT(pentagonCount)(void); + +/** @brief generates all pentagons at the specified resolution */ +DECLSPEC H3Error H3_EXPORT(getPentagons)(int res, H3Index *out); +/** @} */ + +/** @defgroup getResolution getResolution + * Functions for getResolution + * @{ + */ +/** @brief returns the resolution of the provided H3 index + * Works on both cells and directed edges. */ +DECLSPEC int H3_EXPORT(getResolution)(H3Index h); +/** @} */ + +/** @defgroup getBaseCellNumber getBaseCellNumber + * Functions for getBaseCellNumber + * @{ + */ +/** @brief returns the base cell "number" (0 to 121) of the provided H3 cell + * + * Note: Technically works on H3 edges, but will return base cell of the + * origin cell. */ +DECLSPEC int H3_EXPORT(getBaseCellNumber)(H3Index h); +/** @} */ + +/** @defgroup stringToH3 stringToH3 + * Functions for stringToH3 + * @{ + */ +/** @brief converts the canonical string format to H3Index format */ +DECLSPEC H3Error H3_EXPORT(stringToH3)(const char *str, H3Index *out); +/** @} */ + +/** @defgroup h3ToString h3ToString + * Functions for h3ToString + * @{ + */ +/** @brief converts an H3Index to a canonical string */ +DECLSPEC H3Error H3_EXPORT(h3ToString)(H3Index h, char *str, size_t sz); +/** @} */ + +/** @defgroup isValidCell isValidCell + * Functions for isValidCell + * @{ + */ +/** @brief confirms if an H3Index is a valid cell (hexagon or pentagon) + * In particular, returns 0 (False) for H3 directed edges or invalid data + */ +DECLSPEC int H3_EXPORT(isValidCell)(H3Index h); +/** @} */ + +/** @defgroup cellToParent cellToParent + * Functions for cellToParent + * @{ + */ +/** @brief returns the parent (or grandparent, etc) cell of the given cell + */ +DECLSPEC H3Error H3_EXPORT(cellToParent)(H3Index h, int parentRes, + H3Index *parent); +/** @} */ + +/** @defgroup cellToChildren cellToChildren + * Functions for cellToChildren + * @{ + */ +/** @brief determines the exact number of children (or grandchildren, etc) + * that would be returned for the given cell */ +DECLSPEC H3Error H3_EXPORT(cellToChildrenSize)(H3Index h, int childRes, + int64_t *out); + +/** @brief provides the children (or grandchildren, etc) of the given cell */ +DECLSPEC H3Error H3_EXPORT(cellToChildren)(H3Index h, int childRes, + H3Index *children); +/** @} */ + +/** @defgroup cellToCenterChild cellToCenterChild + * Functions for cellToCenterChild + * @{ + */ +/** @brief returns the center child of the given cell at the specified + * resolution */ +DECLSPEC H3Error H3_EXPORT(cellToCenterChild)(H3Index h, int childRes, + H3Index *child); +/** @} */ + +/** @defgroup cellToChildPos cellToChildPos + * Functions for cellToChildPos + * @{ + */ +/** @brief Returns the position of the cell within an ordered list of all + * children of the cell's parent at the specified resolution */ +DECLSPEC H3Error H3_EXPORT(cellToChildPos)(H3Index child, int parentRes, + int64_t *out); +/** @} */ + +/** @defgroup childPosToCell childPosToCell + * Functions for childPosToCell + * @{ + */ +/** @brief Returns the child cell at a given position within an ordered list of + * all children at the specified resolution */ +DECLSPEC H3Error H3_EXPORT(childPosToCell)(int64_t childPos, H3Index parent, + int childRes, H3Index *child); +/** @} */ + +/** @defgroup compactCells compactCells + * Functions for compactCells + * @{ + */ +/** @brief compacts the given set of hexagons as best as possible */ +DECLSPEC H3Error H3_EXPORT(compactCells)(const H3Index *h3Set, + H3Index *compactedSet, + const int64_t numHexes); +/** @} */ + +/** @defgroup uncompactCells uncompactCells + * Functions for uncompactCells + * @{ + */ +/** @brief determines the exact number of hexagons that will be uncompacted + * from the compacted set */ +DECLSPEC H3Error H3_EXPORT(uncompactCellsSize)(const H3Index *compactedSet, + const int64_t numCompacted, + const int res, int64_t *out); + +/** @brief uncompacts the compacted hexagon set */ +DECLSPEC H3Error H3_EXPORT(uncompactCells)(const H3Index *compactedSet, + const int64_t numCompacted, + H3Index *outSet, + const int64_t numOut, const int res); +/** @} */ + +/** @defgroup isResClassIII isResClassIII + * Functions for isResClassIII + * @{ + */ +/** @brief determines if a hexagon is Class III (or Class II) */ +DECLSPEC int H3_EXPORT(isResClassIII)(H3Index h); +/** @} */ + +/** @defgroup isPentagon isPentagon + * Functions for isPentagon + * @{ + */ +/** @brief determines if an H3 cell is a pentagon */ +DECLSPEC int H3_EXPORT(isPentagon)(H3Index h); +/** @} */ + +/** @defgroup getIcosahedronFaces getIcosahedronFaces + * Functions for getIcosahedronFaces + * @{ + */ +/** @brief Max number of icosahedron faces intersected by an index */ +DECLSPEC H3Error H3_EXPORT(maxFaceCount)(H3Index h3, int *out); + +/** @brief Find all icosahedron faces intersected by a given H3 index */ +DECLSPEC H3Error H3_EXPORT(getIcosahedronFaces)(H3Index h3, int *out); +/** @} */ + +/** @defgroup areNeighborCells areNeighborCells + * Functions for areNeighborCells + * @{ + */ +/** @brief returns whether or not the provided hexagons border */ +DECLSPEC H3Error H3_EXPORT(areNeighborCells)(H3Index origin, + H3Index destination, int *out); +/** @} */ + +/** @defgroup cellsToDirectedEdge cellsToDirectedEdge + * Functions for cellsToDirectedEdge + * @{ + */ +/** @brief returns the directed edge H3Index for the specified origin and + * destination */ +DECLSPEC H3Error H3_EXPORT(cellsToDirectedEdge)(H3Index origin, + H3Index destination, + H3Index *out); +/** @} */ + +/** @defgroup isValidDirectedEdge isValidDirectedEdge + * Functions for isValidDirectedEdge + * @{ + */ +/** @brief returns whether the H3Index is a valid directed edge */ +DECLSPEC int H3_EXPORT(isValidDirectedEdge)(H3Index edge); +/** @} */ + +/** @defgroup getDirectedEdgeOrigin \ + * getDirectedEdgeOrigin + * Functions for getDirectedEdgeOrigin + * @{ + */ +/** @brief Returns the origin hexagon H3Index from the directed edge + * H3Index */ +DECLSPEC H3Error H3_EXPORT(getDirectedEdgeOrigin)(H3Index edge, H3Index *out); +/** @} */ + +/** @defgroup getDirectedEdgeDestination \ + * getDirectedEdgeDestination + * Functions for getDirectedEdgeDestination + * @{ + */ +/** @brief Returns the destination hexagon H3Index from the directed edge + * H3Index */ +DECLSPEC H3Error H3_EXPORT(getDirectedEdgeDestination)(H3Index edge, + H3Index *out); +/** @} */ + +/** @defgroup directedEdgeToCells \ + * directedEdgeToCells + * Functions for directedEdgeToCells + * @{ + */ +/** @brief Returns the origin and destination hexagons from the directed + * edge H3Index */ +DECLSPEC H3Error H3_EXPORT(directedEdgeToCells)(H3Index edge, + H3Index *originDestination); +/** @} */ + +/** @defgroup originToDirectedEdges \ + * originToDirectedEdges + * Functions for originToDirectedEdges + * @{ + */ +/** @brief Returns the 6 (or 5 for pentagons) edges associated with the H3Index + */ +DECLSPEC H3Error H3_EXPORT(originToDirectedEdges)(H3Index origin, + H3Index *edges); +/** @} */ + +/** @defgroup directedEdgeToBoundary directedEdgeToBoundary + * Functions for directedEdgeToBoundary + * @{ + */ +/** @brief Returns the CellBoundary containing the coordinates of the edge */ +DECLSPEC H3Error H3_EXPORT(directedEdgeToBoundary)(H3Index edge, + CellBoundary *gb); +/** @} */ + +/** @defgroup cellToVertex cellToVertex + * Functions for cellToVertex + * @{ + */ +/** @brief Returns a single vertex for a given cell, as an H3 index */ +DECLSPEC H3Error H3_EXPORT(cellToVertex)(H3Index origin, int vertexNum, + H3Index *out); +/** @} */ + +/** @defgroup cellToVertexes cellToVertexes + * Functions for cellToVertexes + * @{ + */ +/** @brief Returns all vertexes for a given cell, as H3 indexes */ +DECLSPEC H3Error H3_EXPORT(cellToVertexes)(H3Index origin, H3Index *vertexes); +/** @} */ + +/** @defgroup vertexToLatLng vertexToLatLng + * Functions for vertexToLatLng + * @{ + */ +/** @brief Returns a single vertex for a given cell, as an H3 index */ +DECLSPEC H3Error H3_EXPORT(vertexToLatLng)(H3Index vertex, LatLng *point); +/** @} */ + +/** @defgroup isValidVertex isValidVertex + * Functions for isValidVertex + * @{ + */ +/** @brief Whether the input is a valid H3 vertex */ +DECLSPEC int H3_EXPORT(isValidVertex)(H3Index vertex); +/** @} */ + +/** @defgroup gridDistance gridDistance + * Functions for gridDistance + * @{ + */ +/** @brief Returns grid distance between two indexes */ +DECLSPEC H3Error H3_EXPORT(gridDistance)(H3Index origin, H3Index h3, + int64_t *distance); +/** @} */ + +/** @defgroup gridPathCells gridPathCells + * Functions for gridPathCells + * @{ + */ +/** @brief Number of indexes in a line connecting two indexes */ +DECLSPEC H3Error H3_EXPORT(gridPathCellsSize)(H3Index start, H3Index end, + int64_t *size); + +/** @brief Line of h3 indexes connecting two indexes */ +DECLSPEC H3Error H3_EXPORT(gridPathCells)(H3Index start, H3Index end, + H3Index *out); +/** @} */ + +/** @defgroup cellToLocalIj cellToLocalIj + * Functions for cellToLocalIj + * @{ + */ +/** @brief Returns two dimensional coordinates for the given index */ +DECLSPEC H3Error H3_EXPORT(cellToLocalIj)(H3Index origin, H3Index h3, + uint32_t mode, CoordIJ *out); +/** @} */ + +/** @defgroup localIjToCell localIjToCell + * Functions for localIjToCell + * @{ + */ +/** @brief Returns index for the given two dimensional coordinates */ +DECLSPEC H3Error H3_EXPORT(localIjToCell)(H3Index origin, const CoordIJ *ij, + uint32_t mode, H3Index *out); +/** @} */ + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/src/h3lib/include/iterators.h b/src/h3lib/include/iterators.h new file mode 100644 index 000000000..9e1de9bfd --- /dev/null +++ b/src/h3lib/include/iterators.h @@ -0,0 +1,87 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file iterators.h + * @brief Iterator structs and functions for the children of a cell, + * or cells at a given resolution. + */ + +#ifndef ITERATORS_H +#define ITERATORS_H + +#include + +#include "h3api.h" + +/** + * IterCellsChildren: struct for iterating through the descendants of + * a given cell. + * + * Constructors: + * + * Initialize with either `iterInitParent` or `iterInitBaseCellNum`. + * `iterInitParent` sets up an iterator for all the children of a given + * parent cell at a given resolution. + * + * `iterInitBaseCellNum` sets up an iterator for children cells, given + * a base cell number (0--121). + * + * Iteration: + * + * Step iterator with `iterStepChild`. + * During the lifetime of the `IterCellsChildren`, the current iterate + * is accessed via the `IterCellsChildren.h` member. + * When the iterator is exhausted or if there was an error in initialization, + * `IterCellsChildren.h` will be `H3_NULL` even after calling `iterStepChild`. + */ +typedef struct { + H3Index h; + int _parentRes; // parent resolution + int _skipDigit; // this digit skips `1` for pentagons +} IterCellsChildren; + +DECLSPEC IterCellsChildren iterInitParent(H3Index h, int childRes); +void _iterInitParent(H3Index h, int childRes, IterCellsChildren *iter); +DECLSPEC IterCellsChildren iterInitBaseCellNum(int baseCellNum, int childRes); +DECLSPEC void iterStepChild(IterCellsChildren *iter); + +/** + * IterCellsResolution: struct for iterating through all cells at a given + * resolution + * + * Constructor: + * + * Initialize with `IterCellsResolution`. + * + * Iteration: + * + * Step iterator with `iterStepRes`. + * During the lifetime of the iterator the current iterate + * is accessed via the `IterCellsResolution.h` member. + * When the iterator is exhausted or if there was an error in initialization, + * `IterCellsResolution.h` will be `H3_NULL` even after calling `iterStepRes`. + */ +typedef struct { + H3Index h; + int _baseCellNum; + int _res; + IterCellsChildren _itC; +} IterCellsResolution; + +DECLSPEC IterCellsResolution iterInitRes(int res); +DECLSPEC void iterStepRes(IterCellsResolution *iter); + +#endif diff --git a/src/h3lib/include/geoCoord.h b/src/h3lib/include/latLng.h similarity index 53% rename from src/h3lib/include/geoCoord.h rename to src/h3lib/include/latLng.h index 74daf17b5..8d644e578 100644 --- a/src/h3lib/include/geoCoord.h +++ b/src/h3lib/include/latLng.h @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** @file geoCoord.h - * @brief Geodetic (lat/lon) functions. +/** @file latLng.h + * @brief Geodetic (lat/lng) functions. */ -#ifndef GEOCOORD_H -#define GEOCOORD_H +#ifndef GEOPOINT_H +#define GEOPOINT_H #include #include #include + #include "constants.h" #include "h3api.h" @@ -31,22 +32,28 @@ /** epsilon of ~0.1mm in radians */ #define EPSILON_RAD (EPSILON_DEG * M_PI_180) -void setGeoDegs(GeoCoord* p, double latDegs, double lonDegs); +typedef enum { + NORMALIZE_NONE = 0, // Do not normalize + NORMALIZE_EAST = 1, // Normalize negative numbers to the east + NORMALIZE_WEST = 2 // Normalize positive numbers to the west +} LongitudeNormalization; + +void setGeoDegs(LatLng *p, double latDegs, double lngDegs); double constrainLat(double lat); double constrainLng(double lng); +double normalizeLng(const double lng, + const LongitudeNormalization normalization); -bool geoAlmostEqual(const GeoCoord* p1, const GeoCoord* p2); -bool geoAlmostEqualThreshold(const GeoCoord* p1, const GeoCoord* p2, +bool geoAlmostEqual(const LatLng *p1, const LatLng *p2); +bool geoAlmostEqualThreshold(const LatLng *p1, const LatLng *p2, double threshold); // Internal functions double _posAngleRads(double rads); -void _setGeoRads(GeoCoord* p, double latRads, double lonRads); -double _geoDistRads(const GeoCoord* p1, const GeoCoord* p2); -double _geoDistKm(const GeoCoord* p1, const GeoCoord* p2); -double _geoAzimuthRads(const GeoCoord* p1, const GeoCoord* p2); -void _geoAzDistanceRads(const GeoCoord* p1, double az, double distance, - GeoCoord* p2); +void _setGeoRads(LatLng *p, double latRads, double lngRads); +double _geoAzimuthRads(const LatLng *p1, const LatLng *p2); +void _geoAzDistanceRads(const LatLng *p1, double az, double distance, + LatLng *p2); #endif diff --git a/src/h3lib/include/linkedGeo.h b/src/h3lib/include/linkedGeo.h index bcf6dc6d8..1abc341d5 100644 --- a/src/h3lib/include/linkedGeo.h +++ b/src/h3lib/include/linkedGeo.h @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,20 +21,16 @@ #define LINKED_GEO_H #include + #include "bbox.h" -#include "geoCoord.h" #include "h3api.h" - -// Error codes for normalizeMultiPolygon -#define NORMALIZATION_SUCCESS 0 -#define NORMALIZATION_ERR_MULTIPLE_POLYGONS 1 -#define NORMALIZATION_ERR_UNASSIGNED_HOLES 2 +#include "latLng.h" // Macros for use with polygonAlgos.h /** Macro: Init iteration vars for LinkedGeoLoop */ -#define INIT_ITERATION_LINKED_LOOP \ - LinkedGeoCoord* currentCoord = NULL; \ - LinkedGeoCoord* nextCoord = NULL +#define INIT_ITERATION_LINKED_LOOP \ + LinkedLatLng *currentCoord = NULL; \ + LinkedLatLng *nextCoord = NULL /** Macro: Get the next coord in a linked loop, wrapping if needed */ #define GET_NEXT_COORD(loop, coordToCheck) \ @@ -51,25 +47,25 @@ /** Macro: Whether a LinkedGeoLoop is empty */ #define IS_EMPTY_LINKED_LOOP(loop) loop->first == NULL -int normalizeMultiPolygon(LinkedGeoPolygon* root); -LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon); -LinkedGeoLoop* addNewLinkedLoop(LinkedGeoPolygon* polygon); -LinkedGeoLoop* addLinkedLoop(LinkedGeoPolygon* polygon, LinkedGeoLoop* loop); -LinkedGeoCoord* addLinkedCoord(LinkedGeoLoop* loop, const GeoCoord* vertex); -int countLinkedPolygons(LinkedGeoPolygon* polygon); -int countLinkedLoops(LinkedGeoPolygon* polygon); -int countLinkedCoords(LinkedGeoLoop* loop); -void destroyLinkedGeoLoop(LinkedGeoLoop* loop); +H3Error normalizeMultiPolygon(LinkedGeoPolygon *root); +LinkedGeoPolygon *addNewLinkedPolygon(LinkedGeoPolygon *polygon); +LinkedGeoLoop *addNewLinkedLoop(LinkedGeoPolygon *polygon); +LinkedGeoLoop *addLinkedLoop(LinkedGeoPolygon *polygon, LinkedGeoLoop *loop); +LinkedLatLng *addLinkedCoord(LinkedGeoLoop *loop, const LatLng *vertex); +int countLinkedPolygons(LinkedGeoPolygon *polygon); +int countLinkedLoops(LinkedGeoPolygon *polygon); +int countLinkedCoords(LinkedGeoLoop *loop); +void destroyLinkedGeoLoop(LinkedGeoLoop *loop); // The following functions are created via macro in polygonAlgos.h, // so their signatures are documented here: /** * Create a bounding box from a LinkedGeoLoop - * @param geofence Input Geofence + * @param geoloop Input GeoLoop * @param bbox Output bbox */ -void bboxFromLinkedGeoLoop(const LinkedGeoLoop* loop, BBox* bbox); +void bboxFromLinkedGeoLoop(const LinkedGeoLoop *loop, BBox *bbox); /** * Take a given LinkedGeoLoop data structure and check if it @@ -79,14 +75,14 @@ void bboxFromLinkedGeoLoop(const LinkedGeoLoop* loop, BBox* bbox); * @param coord The coordinate to check * @return Whether the point is contained */ -bool pointInsideLinkedGeoLoop(const LinkedGeoLoop* loop, const BBox* bbox, - const GeoCoord* coord); +bool pointInsideLinkedGeoLoop(const LinkedGeoLoop *loop, const BBox *bbox, + const LatLng *coord); /** * Whether the winding order of a given LinkedGeoLoop is clockwise * @param loop The loop to check * @return Whether the loop is clockwise */ -bool isClockwiseLinkedGeoLoop(const LinkedGeoLoop* loop); +bool isClockwiseLinkedGeoLoop(const LinkedGeoLoop *loop); #endif diff --git a/src/h3lib/include/localij.h b/src/h3lib/include/localij.h index ed0cda593..3ffa0e616 100644 --- a/src/h3lib/include/localij.h +++ b/src/h3lib/include/localij.h @@ -23,7 +23,7 @@ #include "coordijk.h" #include "h3api.h" -int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out); -int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out); +H3Error cellToLocalIjk(H3Index origin, H3Index h3, CoordIJK *out); +H3Error localIjkToCell(H3Index origin, const CoordIJK *ijk, H3Index *out); #endif diff --git a/src/h3lib/include/mathExtensions.h b/src/h3lib/include/mathExtensions.h index 650d6a982..1ac6cfdba 100644 --- a/src/h3lib/include/mathExtensions.h +++ b/src/h3lib/include/mathExtensions.h @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2022 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,33 @@ #ifndef MATHEXTENSIONS_H #define MATHEXTENSIONS_H +#include +#include + /** * MAX returns the maximum of two values. */ #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +/** Evaluates to true if a + b would overflow for int32 */ +static inline bool ADD_INT32S_OVERFLOWS(int32_t a, int32_t b) { + if (a > 0) { + return INT32_MAX - a < b; + } else { + return INT32_MIN - a > b; + } +} + +/** Evaluates to true if a - b would overflow for int32 */ +static inline bool SUB_INT32S_OVERFLOWS(int32_t a, int32_t b) { + if (a >= 0) { + return INT32_MIN + a >= b; + } else { + return INT32_MAX + a + 1 < b; + } +} + // Internal functions -int _ipow(int base, int exp); +int64_t _ipow(int64_t base, int64_t exp); #endif diff --git a/src/h3lib/include/polyfill.h b/src/h3lib/include/polyfill.h new file mode 100644 index 000000000..eccc62e0d --- /dev/null +++ b/src/h3lib/include/polyfill.h @@ -0,0 +1,84 @@ +/* + * Copyright 2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file polyfill.h + * @brief Functions relating to the polygon-to-cells functionality + */ + +#ifndef POLYFILL_H +#define POLYFILL_H + +#include + +#include "bbox.h" +#include "h3api.h" +#include "iterators.h" + +/** + * IterCellsPolygonCompact: struct for iterating through all the cells + * within a given polygon, outputting a compact set. + * + * Constructors: + * + * Initialize with `iterInitPolygon`. This will save a reference to the + * input polygon and allocate memory for data structures used in the + * iteration. Iterators initialized in this way must be destroyed by + * `iterDestroyPolygon` to free allocated memory. + * + * Iteration: + * + * Step iterator with `iterStepPolygonCompact`. + * During the lifetime of the `iterCellsPolygonCompact`, the current iterate + * is accessed via the `iterCellsPolygonCompact.cell` member. When the iterator + * is exhausted or if there was an error in initialization or iteration, + * `iterCellsPolygonCompact.cell` will be `H3_NULL` after calling + * `iterStepChild`. It is the responsibiliy of the caller to check + * `iterCellsPolygonCompact.error` when `H3_NULL` is received. + * + * Cleanup: + * + * Destroy the iterator and free allocated memory with `iterDestroyPolygon`. + */ +typedef struct { + H3Index cell; // current value + H3Error error; // error, if any + int _res; // target resolution + uint32_t _flags; // Mode flags for the polygonToCells operation + const GeoPolygon *_polygon; // the polygon we're filling + BBox *_bboxes; // Bounding box(es) for the polygon and its holes + bool _started; // Whether iteration has started +} IterCellsPolygonCompact; + +DECLSPEC IterCellsPolygonCompact +iterInitPolygonCompact(const GeoPolygon *polygon, int res, uint32_t flags); +DECLSPEC void iterStepPolygonCompact(IterCellsPolygonCompact *iter); +DECLSPEC void iterDestroyPolygonCompact(IterCellsPolygonCompact *iter); + +typedef struct { + H3Index cell; // current value + H3Error error; // error, if any + IterCellsPolygonCompact _cellIter; // sub-iterator for compact cells + IterCellsChildren _childIter; // sub-iterator for cell children +} IterCellsPolygon; + +DECLSPEC IterCellsPolygon iterInitPolygon(const GeoPolygon *polygon, int res, + uint32_t flags); +DECLSPEC void iterStepPolygon(IterCellsPolygon *iter); +DECLSPEC void iterDestroyPolygon(IterCellsPolygon *iter); + +H3Error cellToBBox(H3Index cell, BBox *out, bool coverChildren); +H3Index baseCellNumToCell(int baseCellNum); + +#endif diff --git a/src/h3lib/include/polygon.h b/src/h3lib/include/polygon.h index 1ce48048d..3aab8d943 100644 --- a/src/h3lib/include/polygon.h +++ b/src/h3lib/include/polygon.h @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,55 +21,73 @@ #define POLYGON_H #include + #include "bbox.h" -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" #include "linkedGeo.h" // Macros for use with polygonAlgos.h -/** Macro: Init iteration vars for Geofence */ +/** Macro: Init iteration vars for GeoLoop */ #define INIT_ITERATION_GEOFENCE int loopIndex = -1 -/** Macro: Increment Geofence loop iteration, or break if done. */ -#define ITERATE_GEOFENCE(geofence, vertexA, vertexB) \ - if (++loopIndex >= geofence->numVerts) break; \ - vertexA = geofence->verts[loopIndex]; \ - vertexB = geofence->verts[(loopIndex + 1) % geofence->numVerts] +/** Macro: Increment GeoLoop loop iteration, or break if done. */ +#define ITERATE_GEOFENCE(geoloop, vertexA, vertexB) \ + if (++loopIndex >= geoloop->numVerts) break; \ + vertexA = geoloop->verts[loopIndex]; \ + vertexB = geoloop->verts[(loopIndex + 1) % geoloop->numVerts] + +/** Macro: Whether a GeoLoop is empty */ +#define IS_EMPTY_GEOFENCE(geoloop) geoloop->numVerts == 0 -/** Macro: Whether a Geofence is empty */ -#define IS_EMPTY_GEOFENCE(geofence) geofence->numVerts == 0 +// 1s in the 4 bits defining the polyfill containment mode, 0s elsewhere +#define FLAG_CONTAINMENT_MODE_MASK ((uint32_t)(15)) +#define FLAG_GET_CONTAINMENT_MODE(flags) (flags & FLAG_CONTAINMENT_MODE_MASK) // Defined directly in polygon.c: -void bboxesFromGeoPolygon(const GeoPolygon* polygon, BBox* bboxes); -bool pointInsidePolygon(const GeoPolygon* geoPolygon, const BBox* bboxes, - const GeoCoord* coord); +H3Error validatePolygonFlags(uint32_t flags); +void bboxesFromGeoPolygon(const GeoPolygon *polygon, BBox *bboxes); +bool pointInsidePolygon(const GeoPolygon *geoPolygon, const BBox *bboxes, + const LatLng *coord); +bool cellBoundaryInsidePolygon(const GeoPolygon *geoPolygon, const BBox *bboxes, + const CellBoundary *boundary, + const BBox *boundaryBBox); +bool cellBoundaryCrossesPolygon(const GeoPolygon *geoPolygon, + const BBox *bboxes, + const CellBoundary *boundary, + const BBox *boundaryBBox); +bool cellBoundaryCrossesGeoLoop(const GeoLoop *geoloop, const BBox *loopBBox, + const CellBoundary *boundary, + const BBox *boundaryBBox); +bool lineCrossesLine(const LatLng *a1, const LatLng *a2, const LatLng *b1, + const LatLng *b2); // The following functions are created via macro in polygonAlgos.h, // so their signatures are documented here: /** - * Create a bounding box from a Geofence - * @param geofence Input Geofence + * Create a bounding box from a GeoLoop + * @param geoloop Input GeoLoop * @param bbox Output bbox */ -void bboxFromGeofence(const Geofence* loop, BBox* bbox); +void bboxFromGeoLoop(const GeoLoop *loop, BBox *bbox); /** - * Take a given Geofence data structure and check if it + * Take a given GeoLoop data structure and check if it * contains a given geo coordinate. - * @param loop The geofence + * @param loop The geoloop * @param bbox The bbox for the loop * @param coord The coordinate to check * @return Whether the point is contained */ -bool pointInsideGeofence(const Geofence* loop, const BBox* bbox, - const GeoCoord* coord); +bool pointInsideGeoLoop(const GeoLoop *loop, const BBox *bbox, + const LatLng *coord); /** - * Whether the winding order of a given Geofence is clockwise + * Whether the winding order of a given GeoLoop is clockwise * @param loop The loop to check * @return Whether the loop is clockwise */ -bool isClockwiseGeofence(const Geofence* geofence); +bool isClockwiseGeoLoop(const GeoLoop *geoloop); #endif diff --git a/src/h3lib/include/polygonAlgos.h b/src/h3lib/include/polygonAlgos.h index a6f0f5714..e6ce98403 100644 --- a/src/h3lib/include/polygonAlgos.h +++ b/src/h3lib/include/polygonAlgos.h @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ /** @file * @brief Include file for poylgon algorithms. This includes the core * logic for algorithms acting over loops of coordinates, - * allowing them to be reused for both Geofence and + * allowing them to be reused for both GeoLoop and * LinkegGeoLoop structures. This file is intended to be * included inline in a file that defines the type-specific * macros required for iteration. @@ -25,10 +25,11 @@ #include #include #include + #include "bbox.h" #include "constants.h" -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" #include "linkedGeo.h" #include "polygon.h" @@ -53,8 +54,8 @@ #define GENERIC_LOOP_ALGO(func) LOOP_ALGO_TJOIN(func, TYPE) /** Macro: Normalize longitude, dealing with transmeridian arcs */ -#define NORMALIZE_LON(lon, isTransmeridian) \ - (isTransmeridian && lon < 0 ? lon + (double)M_2PI : lon) +#define NORMALIZE_LNG(lng, isTransmeridian) \ + (isTransmeridian && lng < 0 ? lng + (double)M_2PI : lng) /** * pointInside is the core loop of the point-in-poly algorithm @@ -63,8 +64,8 @@ * @param coord The coordinate to check * @return Whether the point is contained */ -bool GENERIC_LOOP_ALGO(pointInside)(const TYPE* loop, const BBox* bbox, - const GeoCoord* coord) { +bool GENERIC_LOOP_ALGO(pointInside)(const TYPE *loop, const BBox *bbox, + const LatLng *coord) { // fail fast if we're outside the bounding box if (!bboxContains(bbox, coord)) { return false; @@ -73,10 +74,10 @@ bool GENERIC_LOOP_ALGO(pointInside)(const TYPE* loop, const BBox* bbox, bool contains = false; double lat = coord->lat; - double lng = NORMALIZE_LON(coord->lon, isTransmeridian); + double lng = NORMALIZE_LNG(coord->lng, isTransmeridian); - GeoCoord a; - GeoCoord b; + LatLng a; + LatLng b; INIT_ITERATION; @@ -86,19 +87,33 @@ bool GENERIC_LOOP_ALGO(pointInside)(const TYPE* loop, const BBox* bbox, // Ray casting algo requires the second point to always be higher // than the first, so swap if needed if (a.lat > b.lat) { - GeoCoord tmp = a; + LatLng tmp = a; a = b; b = tmp; } + // If the latitude matches exactly, we'll hit an edge case where + // the ray passes through the vertex twice on successive segment + // checks. To avoid this, adjust the latiude northward if needed. + // + // NOTE: This currently means that a point at the north pole cannot + // be contained in any polygon. This is acceptable in current usage, + // because the point we test in this function at present is always + // a cell center or vertex, and no cell has a center or vertex on the + // north pole. If we need to expand this algo to more generic uses we + // might need to handle this edge case. + if (lat == a.lat || lat == b.lat) { + lat += DBL_EPSILON; + } + // If we're totally above or below the latitude ranges, the test // ray cannot intersect the line segment, so let's move on if (lat < a.lat || lat > b.lat) { continue; } - double aLng = NORMALIZE_LON(a.lon, isTransmeridian); - double bLng = NORMALIZE_LON(b.lon, isTransmeridian); + double aLng = NORMALIZE_LNG(a.lng, isTransmeridian); + double bLng = NORMALIZE_LNG(b.lng, isTransmeridian); // Rays are cast in the longitudinal direction, in case a point // exactly matches, to decide tiebreakers, bias westerly @@ -113,7 +128,7 @@ bool GENERIC_LOOP_ALGO(pointInside)(const TYPE* loop, const BBox* bbox, // of a to b double ratio = (lat - a.lat) / (b.lat - a.lat); double testLng = - NORMALIZE_LON(aLng + (bLng - aLng) * ratio, isTransmeridian); + NORMALIZE_LNG(aLng + (bLng - aLng) * ratio, isTransmeridian); // Intersection of the ray if (testLng > lng) { @@ -133,7 +148,7 @@ bool GENERIC_LOOP_ALGO(pointInside)(const TYPE* loop, const BBox* bbox, * @param loop Loop of coordinates * @param bbox Output bbox */ -void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE* loop, BBox* bbox) { +void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE *loop, BBox *bbox) { // Early exit if there are no vertices if (IS_EMPTY(loop)) { *bbox = (BBox){0}; @@ -144,14 +159,14 @@ void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE* loop, BBox* bbox) { bbox->west = DBL_MAX; bbox->north = -DBL_MAX; bbox->east = -DBL_MAX; - double minPosLon = DBL_MAX; - double maxNegLon = -DBL_MAX; + double minPosLng = DBL_MAX; + double maxNegLng = -DBL_MAX; bool isTransmeridian = false; double lat; - double lon; - GeoCoord coord; - GeoCoord next; + double lng; + LatLng coord; + LatLng next; INIT_ITERATION; @@ -159,24 +174,24 @@ void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE* loop, BBox* bbox) { ITERATE(loop, coord, next); lat = coord.lat; - lon = coord.lon; + lng = coord.lng; if (lat < bbox->south) bbox->south = lat; - if (lon < bbox->west) bbox->west = lon; + if (lng < bbox->west) bbox->west = lng; if (lat > bbox->north) bbox->north = lat; - if (lon > bbox->east) bbox->east = lon; + if (lng > bbox->east) bbox->east = lng; // Save the min positive and max negative longitude for // use in the transmeridian case - if (lon > 0 && lon < minPosLon) minPosLon = lon; - if (lon < 0 && lon > maxNegLon) maxNegLon = lon; + if (lng > 0 && lng < minPosLng) minPosLng = lng; + if (lng < 0 && lng > maxNegLng) maxNegLng = lng; // check for arcs > 180 degrees longitude, flagging as transmeridian - if (fabs(lon - next.lon) > M_PI) { + if (fabs(lng - next.lng) > M_PI) { isTransmeridian = true; } } // Swap east and west if transmeridian if (isTransmeridian) { - bbox->east = maxNegLon; - bbox->west = minPosLon; + bbox->east = maxNegLng; + bbox->west = minPosLng; } } @@ -187,22 +202,22 @@ void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE* loop, BBox* bbox) { * @param isTransmeridian Whether the loop crosses the antimeridian * @return Whether the loop is clockwise */ -static bool GENERIC_LOOP_ALGO(isClockwiseNormalized)(const TYPE* loop, +static bool GENERIC_LOOP_ALGO(isClockwiseNormalized)(const TYPE *loop, bool isTransmeridian) { double sum = 0; - GeoCoord a; - GeoCoord b; + LatLng a; + LatLng b; INIT_ITERATION; while (true) { ITERATE(loop, a, b); // If we identify a transmeridian arc (> 180 degrees longitude), // start over with the transmeridian flag set - if (!isTransmeridian && fabs(a.lon - b.lon) > M_PI) { + if (!isTransmeridian && fabs(a.lng - b.lng) > M_PI) { return GENERIC_LOOP_ALGO(isClockwiseNormalized)(loop, true); } - sum += ((NORMALIZE_LON(b.lon, isTransmeridian) - - NORMALIZE_LON(a.lon, isTransmeridian)) * + sum += ((NORMALIZE_LNG(b.lng, isTransmeridian) - + NORMALIZE_LNG(a.lng, isTransmeridian)) * (b.lat + a.lat)); } @@ -215,6 +230,6 @@ static bool GENERIC_LOOP_ALGO(isClockwiseNormalized)(const TYPE* loop, * @param loop The loop to check * @return Whether the loop is clockwise */ -bool GENERIC_LOOP_ALGO(isClockwise)(const TYPE* loop) { +bool GENERIC_LOOP_ALGO(isClockwise)(const TYPE *loop) { return GENERIC_LOOP_ALGO(isClockwiseNormalized)(loop, false); } diff --git a/src/h3lib/include/stackAlloc.h b/src/h3lib/include/stackAlloc.h deleted file mode 100644 index 479f66b31..000000000 --- a/src/h3lib/include/stackAlloc.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2016-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file stackAlloc.h - * @brief Macro to provide cross-platform mechanism for allocating variable - * length arrays on the stack. - */ - -#ifndef STACKALLOC_H -#define STACKALLOC_H - -#include -#include - -#ifdef H3_HAVE_VLA - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type name##Buffer[(numElements)]; \ - memset(name##Buffer, 0, (numElements) * sizeof(type)); \ - type* name = name##Buffer - -#elif defined(H3_HAVE_ALLOCA) - -#ifdef _MSC_VER - -#include - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type* name = (type*)_alloca(sizeof(type) * (numElements)); \ - memset(name, 0, sizeof(type) * (numElements)) - -#else - -#include - -#define STACK_ARRAY_CALLOC(type, name, numElements) \ - assert((numElements) > 0); \ - type* name = (type*)alloca(sizeof(type) * (numElements)); \ - memset(name, 0, sizeof(type) * (numElements)) - -#endif - -#else - -#error \ - "This platform does not support stack array allocation, please submit an issue on https://github.com/uber/h3 to report this error" - -#endif - -#endif diff --git a/src/h3lib/include/vec2d.h b/src/h3lib/include/vec2d.h index 44030cca8..8ba0e9bd4 100644 --- a/src/h3lib/include/vec2d.h +++ b/src/h3lib/include/vec2d.h @@ -32,9 +32,9 @@ typedef struct { // Internal functions -double _v2dMag(const Vec2d* v); -void _v2dIntersect(const Vec2d* p0, const Vec2d* p1, const Vec2d* p2, - const Vec2d* p3, Vec2d* inter); -bool _v2dEquals(const Vec2d* p0, const Vec2d* p1); +double _v2dMag(const Vec2d *v); +void _v2dIntersect(const Vec2d *p0, const Vec2d *p1, const Vec2d *p2, + const Vec2d *p3, Vec2d *inter); +bool _v2dAlmostEquals(const Vec2d *p0, const Vec2d *p1); #endif diff --git a/src/h3lib/include/vec3d.h b/src/h3lib/include/vec3d.h index 8f9464f86..0bd9ac5a3 100644 --- a/src/h3lib/include/vec3d.h +++ b/src/h3lib/include/vec3d.h @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ #ifndef VEC3D_H #define VEC3D_H -#include "geoCoord.h" +#include "latLng.h" /** @struct Vec3D * @brief 3D floating point structure @@ -31,7 +31,7 @@ typedef struct { double z; ///< z component } Vec3d; -void _geoToVec3d(const GeoCoord* geo, Vec3d* point); -double _pointSquareDist(const Vec3d* p1, const Vec3d* p2); +void _geoToVec3d(const LatLng *geo, Vec3d *point); +double _pointSquareDist(const Vec3d *p1, const Vec3d *p2); #endif diff --git a/src/h3lib/include/vertex.h b/src/h3lib/include/vertex.h new file mode 100644 index 000000000..66a1395b4 --- /dev/null +++ b/src/h3lib/include/vertex.h @@ -0,0 +1,44 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file vertex.h + * @brief Functions for working with cell vertexes. + */ + +#ifndef H3VERTEX_H +#define H3VERTEX_H + +#include "faceijk.h" +#include "h3Index.h" + +/** @struct PentagonDirectionFaces + * @brief The faces in each axial direction of a given pentagon base cell + */ +typedef struct { + int baseCell; ///< base cell number + int faces[NUM_PENT_VERTS]; ///< face numbers for each axial direction, + /// in order, starting with J +} PentagonDirectionFaces; + +/** Invalid vertex number */ +#define INVALID_VERTEX_NUM -1 + +/** Max number of faces a base cell's descendants may appear on */ +#define MAX_BASE_CELL_FACES 5 + +int vertexNumForDirection(const H3Index origin, const Direction direction); +Direction directionForVertexNum(const H3Index origin, const int vertexNum); + +#endif diff --git a/src/h3lib/include/vertexGraph.h b/src/h3lib/include/vertexGraph.h index 11894fd30..5d17f59a6 100644 --- a/src/h3lib/include/vertexGraph.h +++ b/src/h3lib/include/vertexGraph.h @@ -1,5 +1,5 @@ /* - * Copyright 2017 Uber Technologies, Inc. + * Copyright 2017, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,48 +22,48 @@ #include #include -#include "geoCoord.h" + +#include "latLng.h" /** @struct VertexNode * @brief A single node in a vertex graph, part of a linked list */ typedef struct VertexNode VertexNode; struct VertexNode { - GeoCoord from; - GeoCoord to; - VertexNode* next; + LatLng from; + LatLng to; + VertexNode *next; }; /** @struct VertexGraph * @brief A data structure to store a graph of vertices */ typedef struct { - VertexNode** buckets; + VertexNode **buckets; int numBuckets; int size; int res; } VertexGraph; -void initVertexGraph(VertexGraph* graph, int numBuckets, int res); +void initVertexGraph(VertexGraph *graph, int numBuckets, int res); -void destroyVertexGraph(VertexGraph* graph); +void destroyVertexGraph(VertexGraph *graph); -VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, - const GeoCoord* toVtx); +VertexNode *addVertexNode(VertexGraph *graph, const LatLng *fromVtx, + const LatLng *toVtx); -int removeVertexNode(VertexGraph* graph, VertexNode* node); +int removeVertexNode(VertexGraph *graph, VertexNode *node); -VertexNode* findNodeForEdge(const VertexGraph* graph, const GeoCoord* fromVtx, - const GeoCoord* toVtx); +VertexNode *findNodeForEdge(const VertexGraph *graph, const LatLng *fromVtx, + const LatLng *toVtx); -VertexNode* findNodeForVertex(const VertexGraph* graph, - const GeoCoord* fromVtx); +VertexNode *findNodeForVertex(const VertexGraph *graph, const LatLng *fromVtx); -VertexNode* firstVertexNode(const VertexGraph* graph); +VertexNode *firstVertexNode(const VertexGraph *graph); // Internal functions -uint32_t _hashVertex(const GeoCoord* vertex, int res, int numBuckets); -void _initVertexNode(VertexNode* node, const GeoCoord* fromVtx, - const GeoCoord* toVtx); +uint32_t _hashVertex(const LatLng *vertex, int res, int numBuckets); +void _initVertexNode(VertexNode *node, const LatLng *fromVtx, + const LatLng *toVtx); #endif diff --git a/src/h3lib/lib/algos.c b/src/h3lib/lib/algos.c index 7f45991ba..1b20bf5ef 100644 --- a/src/h3lib/lib/algos.c +++ b/src/h3lib/lib/algos.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,28 +18,32 @@ */ #include "algos.h" + +#include #include #include #include #include +#include + +#include "alloc.h" #include "baseCells.h" #include "bbox.h" #include "faceijk.h" -#include "geoCoord.h" +#include "h3Assert.h" #include "h3Index.h" #include "h3api.h" +#include "latLng.h" #include "linkedGeo.h" #include "polygon.h" -#include "stackAlloc.h" #include "vertexGraph.h" /* - * Return codes from hexRange and related functions. + * Return codes from gridDiskUnsafe and related functions. */ -#define HEX_RANGE_SUCCESS 0 -#define HEX_RANGE_PENTAGON 1 -#define HEX_RANGE_K_SUBSEQUENCE 2 +#define MAX_ONE_RING_SIZE 7 +#define POLYGON_TO_CELLS_BUFFER 12 /** * Directions used for traversing a hexagonal ring counterclockwise around @@ -149,81 +153,126 @@ static const Direction NEW_ADJUSTMENT_III[7][7] = { CENTER_DIGIT, IJ_AXES_DIGIT}}; /** - * Maximum number of indices that result from the kRing algorithm with the given - * k. Formula source and proof: https://oeis.org/A003215 + * k value which will encompass all cells at resolution 15. + * This is the largest possible k in the H3 grid system. + */ +static const int K_ALL_CELLS_AT_RES_15 = 13780510; + +/** + * Maximum number of cells that result from the gridDisk algorithm with the + * given k. Formula source and proof: https://oeis.org/A003215 * - * @param k k value, k >= 0. + * @param k k value, k >= 0. + * @param out size in indexes */ -int H3_EXPORT(maxKringSize)(int k) { return 3 * k * (k + 1) + 1; } +H3Error H3_EXPORT(maxGridDiskSize)(int k, int64_t *out) { + if (k < 0) { + return E_DOMAIN; + } + if (k >= K_ALL_CELLS_AT_RES_15) { + // If a k value of this value or above is provided, this function will + // estimate more cells than exist in the H3 grid at the finest + // resolution. This is a problem since the function does signed integer + // arithmetic on `k`, which could overflow. To prevent that, instead + // substitute the maximum number of cells in the grid, as it should not + // be possible for the gridDisk functions to exceed that. Note this is + // not resolution specific. So, when resolution < 15, this function may + // still estimate a size larger than the number of cells in the grid. + return H3_EXPORT(getNumCells)(MAX_H3_RES, out); + } + *out = 3 * (int64_t)k * ((int64_t)k + 1) + 1; + return E_SUCCESS; +} /** - * k-rings produces indices within k distance of the origin index. + * Produce cells within grid distance k of the origin cell. * - * k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and - * all neighboring indices, and so on. + * k-ring 0 is defined as the origin cell, k-ring 1 is defined as k-ring 0 and + * all neighboring cells, and so on. * * Output is placed in the provided array in no particular order. Elements of * the output array may be left zero, as can happen when crossing a pentagon. * - * @param origin Origin location. - * @param k k >= 0 - * @param out Zero-filled array which must be of size maxKringSize(k). + * @param origin origin cell + * @param k k >= 0 + * @param out zero-filled array which must be of size maxGridDiskSize(k) */ -void H3_EXPORT(kRing)(H3Index origin, int k, H3Index* out) { - int maxIdx = H3_EXPORT(maxKringSize)(k); - int* distances = malloc(maxIdx * sizeof(int)); - H3_EXPORT(kRingDistances)(origin, k, out, distances); - free(distances); +H3Error H3_EXPORT(gridDisk)(H3Index origin, int k, H3Index *out) { + return H3_EXPORT(gridDiskDistances)(origin, k, out, NULL); } /** - * k-rings produces indices within k distance of the origin index. + * Produce cells and their distances from the given origin cell, up to + * distance k. * - * k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and - * all neighboring indices, and so on. + * k-ring 0 is defined as the origin cell, k-ring 1 is defined as k-ring 0 and + * all neighboring cells, and so on. * * Output is placed in the provided array in no particular order. Elements of * the output array may be left zero, as can happen when crossing a pentagon. * - * @param origin Origin location. - * @param k k >= 0 - * @param out Zero-filled array which must be of size maxKringSize(k). - * @param distances Zero-filled array which must be of size maxKringSize(k). + * @param origin origin cell + * @param k k >= 0 + * @param out zero-filled array which must be of size + * maxGridDiskSize(k) + * @param distances NULL or a zero-filled array which must be of size + * maxGridDiskSize(k) */ -void H3_EXPORT(kRingDistances)(H3Index origin, int k, H3Index* out, - int* distances) { - const int maxIdx = H3_EXPORT(maxKringSize)(k); - // Optimistically try the faster hexRange algorithm first - const bool failed = H3_EXPORT(hexRangeDistances)(origin, k, out, distances); +H3Error H3_EXPORT(gridDiskDistances)(H3Index origin, int k, H3Index *out, + int *distances) { + // Optimistically try the faster gridDiskUnsafe algorithm first + const H3Error failed = + H3_EXPORT(gridDiskDistancesUnsafe)(origin, k, out, distances); if (failed) { + int64_t maxIdx; + H3Error err = H3_EXPORT(maxGridDiskSize)(k, &maxIdx); + if (err) { + return err; + } // Fast algo failed, fall back to slower, correct algo // and also wipe out array because contents untrustworthy - memset(out, 0, maxIdx * sizeof(out[0])); - memset(distances, 0, maxIdx * sizeof(distances[0])); - _kRingInternal(origin, k, out, distances, maxIdx, 0); + memset(out, 0, maxIdx * sizeof(H3Index)); + + if (distances == NULL) { + distances = H3_MEMORY(calloc)(maxIdx, sizeof(int)); + if (!distances) { + return E_MEMORY_ALLOC; + } + H3Error result = _gridDiskDistancesInternal(origin, k, out, + distances, maxIdx, 0); + H3_MEMORY(free)(distances); + return result; + } else { + memset(distances, 0, maxIdx * sizeof(int)); + return _gridDiskDistancesInternal(origin, k, out, distances, maxIdx, + 0); + } + } else { + return E_SUCCESS; } } /** - * Internal helper function called recursively for kRingDistances. + * Internal algorithm for the safe but slow version of gridDiskDistances * - * Adds the origin index to the output set (treating it as a hash set) + * Adds the origin cell to the output set (treating it as a hash set) * and recurses to its neighbors, if needed. * - * @param origin - * @param k Maximum distance to move from the origin. - * @param out Array treated as a hash set, elements being either H3Index or 0. - * @param distances Scratch area, with elements paralleling the out array. - * Elements indicate ijk distance from the origin index to the output index. - * @param maxIdx Size of out and scratch arrays (must be maxKringSize(k)) - * @param curK Current distance from the origin. + * @param origin Origin cell + * @param k Maximum distance to move from the origin + * @param out Array treated as a hash set, elements being either + * H3Index or 0. + * @param distances Scratch area, with elements paralleling the out array. + * Elements indicate ijk distance from the origin cell to + * the output cell + * @param maxIdx Size of out and scratch arrays (must be + * maxGridDiskSize(k)) + * @param curK Current distance from the origin */ -void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances, - int maxIdx, int curK) { - if (origin == 0) return; - +H3Error _gridDiskDistancesInternal(H3Index origin, int k, H3Index *out, + int *distances, int64_t maxIdx, int curK) { // Put origin in the output array. out is used as a hash set. - int off = origin % maxIdx; + int64_t off = origin % maxIdx; while (out[off] != 0 && out[off] != origin) { off = (off + 1) % maxIdx; } @@ -231,20 +280,58 @@ void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances, // We either got a free slot in the hash set or hit a duplicate // We might need to process the duplicate anyways because we got // here on a longer path before. - if (out[off] == origin && distances[off] <= curK) return; + if (out[off] == origin && distances[off] <= curK) return E_SUCCESS; out[off] = origin; distances[off] = curK; // Base case: reached an index k away from the origin. - if (curK >= k) return; + if (curK >= k) return E_SUCCESS; // Recurse to all neighbors in no particular order. for (int i = 0; i < 6; i++) { int rotations = 0; - _kRingInternal(h3NeighborRotations(origin, DIRECTIONS[i], &rotations), - k, out, distances, maxIdx, curK + 1); + H3Index nextNeighbor; + H3Error neighborResult = h3NeighborRotations(origin, DIRECTIONS[i], + &rotations, &nextNeighbor); + if (neighborResult != E_PENTAGON) { + // E_PENTAGON is an expected case when trying to traverse off of + // pentagons. + if (neighborResult != E_SUCCESS) { + return neighborResult; + } + neighborResult = _gridDiskDistancesInternal( + nextNeighbor, k, out, distances, maxIdx, curK + 1); + if (neighborResult) { + return neighborResult; + } + } } + return E_SUCCESS; +} + +/** + * Safe but slow version of gridDiskDistances (also called by it when needed). + * + * Adds the origin cell to the output set (treating it as a hash set) + * and recurses to its neighbors, if needed. + * + * @param origin Origin cell + * @param k Maximum distance to move from the origin + * @param out Array treated as a hash set, elements being either + * H3Index or 0. + * @param distances Scratch area, with elements paralleling the out array. + * Elements indicate ijk distance from the origin cell to + * the output cell + */ +H3Error H3_EXPORT(gridDiskDistancesSafe)(H3Index origin, int k, H3Index *out, + int *distances) { + int64_t maxIdx; + H3Error err = H3_EXPORT(maxGridDiskSize)(k, &maxIdx); + if (err) { + return err; + } + return _gridDiskDistancesInternal(origin, k, out, distances, maxIdx, 0); } /** @@ -259,50 +346,65 @@ void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances, * @param rotations Number of ccw rotations to perform to reorient the * translation vector. Will be modified to the new number of * rotations to perform (such as when crossing a face edge.) - * @return H3Index of the specified neighbor or 0 if deleted k-subsequence - * distortion is encountered. + * @param out H3Index of the specified neighbor if succesful + * @return E_SUCCESS on success */ -H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { - H3Index out = origin; +H3Error h3NeighborRotations(H3Index origin, Direction dir, int *rotations, + H3Index *out) { + H3Index current = origin; + if (dir < CENTER_DIGIT || dir >= INVALID_DIGIT) { + return E_FAILED; + } + // Ensure that rotations is modulo'd by 6 before any possible addition, + // to protect against signed integer overflow. + *rotations = *rotations % 6; for (int i = 0; i < *rotations; i++) { dir = _rotate60ccw(dir); } int newRotations = 0; - int oldBaseCell = H3_GET_BASE_CELL(out); - Direction oldLeadingDigit = _h3LeadingNonZeroDigit(out); + int oldBaseCell = H3_GET_BASE_CELL(current); + if (NEVER(oldBaseCell < 0) || oldBaseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + return E_CELL_INVALID; + } + Direction oldLeadingDigit = _h3LeadingNonZeroDigit(current); // Adjust the indexing digits and, if needed, the base cell. - int r = H3_GET_RESOLUTION(out) - 1; + int r = H3_GET_RESOLUTION(current) - 1; while (true) { if (r == -1) { - H3_SET_BASE_CELL(out, baseCellNeighbors[oldBaseCell][dir]); + H3_SET_BASE_CELL(current, baseCellNeighbors[oldBaseCell][dir]); newRotations = baseCellNeighbor60CCWRots[oldBaseCell][dir]; - if (H3_GET_BASE_CELL(out) == INVALID_BASE_CELL) { + if (H3_GET_BASE_CELL(current) == INVALID_BASE_CELL) { // Adjust for the deleted k vertex at the base cell level. // This edge actually borders a different neighbor. - H3_SET_BASE_CELL(out, + H3_SET_BASE_CELL(current, baseCellNeighbors[oldBaseCell][IK_AXES_DIGIT]); newRotations = baseCellNeighbor60CCWRots[oldBaseCell][IK_AXES_DIGIT]; // perform the adjustment for the k-subsequence we're skipping // over. - out = _h3Rotate60ccw(out); + current = _h3Rotate60ccw(current); *rotations = *rotations + 1; } break; } else { - Direction oldDigit = H3_GET_INDEX_DIGIT(out, r + 1); + Direction oldDigit = H3_GET_INDEX_DIGIT(current, r + 1); Direction nextDir; - if (isResClassIII(r + 1)) { - H3_SET_INDEX_DIGIT(out, r + 1, NEW_DIGIT_II[oldDigit][dir]); + if (oldDigit == INVALID_DIGIT) { + // Only possible on invalid input + return E_CELL_INVALID; + } else if (isResolutionClassIII(r + 1)) { + H3_SET_INDEX_DIGIT(current, r + 1, NEW_DIGIT_II[oldDigit][dir]); nextDir = NEW_ADJUSTMENT_II[oldDigit][dir]; } else { - H3_SET_INDEX_DIGIT(out, r + 1, NEW_DIGIT_III[oldDigit][dir]); + H3_SET_INDEX_DIGIT(current, r + 1, + NEW_DIGIT_III[oldDigit][dir]); nextDir = NEW_ADJUSTMENT_III[oldDigit][dir]; } @@ -316,12 +418,12 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { } } - int newBaseCell = H3_GET_BASE_CELL(out); + int newBaseCell = H3_GET_BASE_CELL(current); if (_isBaseCellPentagon(newBaseCell)) { int alreadyAdjustedKSubsequence = 0; // force rotation out of missing k-axes sub-sequence - if (_h3LeadingNonZeroDigit(out) == K_AXES_DIGIT) { + if (_h3LeadingNonZeroDigit(current) == K_AXES_DIGIT) { if (oldBaseCell != newBaseCell) { // in this case, we traversed into the deleted // k subsequence of a pentagon base cell. @@ -329,13 +431,14 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { // on how we got here. // check for a cw/ccw offset face; default is ccw - if (_baseCellIsCwOffset( - newBaseCell, baseCellData[oldBaseCell].homeFijk.face)) { - out = _h3Rotate60cw(out); + if (ALWAYS(_baseCellIsCwOffset( + newBaseCell, + baseCellData[oldBaseCell].homeFijk.face))) { + current = _h3Rotate60cw(current); } else { - // See cwOffsetPent in testKRing.c for why this is + // See cwOffsetPent in testGridDisk.c for why this is // unreachable. - out = _h3Rotate60ccw(out); // LCOV_EXCL_LINE + current = _h3Rotate60ccw(current); } alreadyAdjustedKSubsequence = 1; } else { @@ -344,27 +447,28 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { // base cell. if (oldLeadingDigit == CENTER_DIGIT) { // Undefined: the k direction is deleted from here - return H3_INVALID_INDEX; + return E_PENTAGON; } else if (oldLeadingDigit == JK_AXES_DIGIT) { // Rotate out of the deleted k subsequence // We also need an additional change to the direction we're // moving in - out = _h3Rotate60ccw(out); + current = _h3Rotate60ccw(current); *rotations = *rotations + 1; } else if (oldLeadingDigit == IK_AXES_DIGIT) { // Rotate out of the deleted k subsequence // We also need an additional change to the direction we're // moving in - out = _h3Rotate60cw(out); + current = _h3Rotate60cw(current); *rotations = *rotations + 5; } else { - // Should never occur - return H3_INVALID_INDEX; // LCOV_EXCL_LINE + // TODO: Should never occur, but is reachable by fuzzer + return E_FAILED; } } } - for (int i = 0; i < newRotations; i++) out = _h3RotatePent60ccw(out); + for (int i = 0; i < newRotations; i++) + current = _h3RotatePent60ccw(current); // Account for differing orientation of the base cells (this edge // might not follow properties of some other edges.) @@ -373,10 +477,10 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { // 'polar' base cells behave differently because they have all // i neighbors. if (oldBaseCell != 118 && oldBaseCell != 8 && - _h3LeadingNonZeroDigit(out) != JK_AXES_DIGIT) { + _h3LeadingNonZeroDigit(current) != JK_AXES_DIGIT) { *rotations = *rotations + 1; } - } else if (_h3LeadingNonZeroDigit(out) == IK_AXES_DIGIT && + } else if (_h3LeadingNonZeroDigit(current) == IK_AXES_DIGIT && !alreadyAdjustedKSubsequence) { // account for distortion introduced to the 5 neighbor by the // deleted k subsequence. @@ -384,16 +488,44 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { } } } else { - for (int i = 0; i < newRotations; i++) out = _h3Rotate60ccw(out); + for (int i = 0; i < newRotations; i++) + current = _h3Rotate60ccw(current); } *rotations = (*rotations + newRotations) % 6; + *out = current; - return out; + return E_SUCCESS; } /** - * hexRange produces indexes within k distance of the origin index. + * Get the direction from the origin to a given neighbor. This is effectively + * the reverse operation for h3NeighborRotations. Returns INVALID_DIGIT if the + * cells are not neighbors. + * + * TODO: This is currently a brute-force algorithm, but as it's O(6) that's + * probably acceptable. + */ +Direction directionForNeighbor(H3Index origin, H3Index destination) { + bool isPent = H3_EXPORT(isPentagon)(origin); + // Checks each neighbor, in order, to determine which direction the + // destination neighbor is located. Skips CENTER_DIGIT since that + // would be the origin; skips deleted K direction for pentagons. + for (Direction direction = isPent ? J_AXES_DIGIT : K_AXES_DIGIT; + direction < NUM_DIGITS; direction++) { + H3Index neighbor; + int rotations = 0; + H3Error neighborError = + h3NeighborRotations(origin, direction, &rotations, &neighbor); + if (!neighborError && neighbor == destination) { + return direction; + } + } + return INVALID_DIGIT; +} + +/** + * gridDiskUnsafe produces indexes within k distance of the origin index. * Output behavior is undefined when one of the indexes returned by this * function is a pentagon or is in the pentagon distortion area. * @@ -405,16 +537,16 @@ H3Index h3NeighborRotations(H3Index origin, Direction dir, int* rotations) { * * @param origin Origin location. * @param k k >= 0 - * @param out Array which must be of size maxKringSize(k). + * @param out Array which must be of size maxGridDiskSize(k). * @return 0 if no pentagon or pentagonal distortion area was encountered. */ -int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index* out) { - return H3_EXPORT(hexRangeDistances)(origin, k, out, 0); +H3Error H3_EXPORT(gridDiskUnsafe)(H3Index origin, int k, H3Index *out) { + return H3_EXPORT(gridDiskDistancesUnsafe)(origin, k, out, NULL); } /** - * hexRange produces indexes within k distance of the origin index. - * Output behavior is undefined when one of the indexes returned by this + * gridDiskDistancesUnsafe produces indexes within k distance of the origin + * index. Output behavior is undefined when one of the indexes returned by this * function is a pentagon or is in the pentagon distortion area. * * k-ring 0 is defined as the origin index, k-ring 1 is defined as k-ring 0 and @@ -426,18 +558,21 @@ int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index* out) { * * @param origin Origin location. * @param k k >= 0 - * @param out Array which must be of size maxKringSize(k). - * @param distances Null or array which must be of size maxKringSize(k). + * @param out Array which must be of size maxGridDiskSize(k). + * @param distances Null or array which must be of size maxGridDiskSize(k). * @return 0 if no pentagon or pentagonal distortion area was encountered. */ -int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, - int* distances) { +H3Error H3_EXPORT(gridDiskDistancesUnsafe)(H3Index origin, int k, H3Index *out, + int *distances) { // Return codes: // 1 Pentagon was encountered // 2 Pentagon distortion (deleted k subsequence) was encountered // Pentagon being encountered is not itself a problem; really the deleted // k-subsequence is the problem, but for compatibility reasons we fail on // the pentagon. + if (k < 0) { + return E_DOMAIN; + } // k must be >= 0, so origin is always needed int idx = 0; @@ -447,9 +582,9 @@ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, } idx++; - if (H3_EXPORT(h3IsPentagon)(origin)) { + if (H3_EXPORT(isPentagon)(origin)) { // Pentagon was encountered; bail out as user doesn't want this. - return HEX_RANGE_PENTAGON; + return E_PENTAGON; } // 0 < ring <= k, current ring @@ -466,25 +601,25 @@ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, if (direction == 0 && i == 0) { // Not putting in the output set as it will be done later, at // the end of this ring. - origin = - h3NeighborRotations(origin, NEXT_RING_DIRECTION, &rotations); - if (origin == 0) { + H3Error neighborResult = h3NeighborRotations( + origin, NEXT_RING_DIRECTION, &rotations, &origin); + if (neighborResult) { // Should not be possible because `origin` would have to be a // pentagon - return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE + // TODO: Reachable via fuzzer + return neighborResult; } - if (H3_EXPORT(h3IsPentagon)(origin)) { + if (H3_EXPORT(isPentagon)(origin)) { // Pentagon was encountered; bail out as user doesn't want this. - return HEX_RANGE_PENTAGON; + return E_PENTAGON; } } - origin = h3NeighborRotations(origin, DIRECTIONS[direction], &rotations); - if (origin == 0) { - // Should not be possible because `origin` would have to be a - // pentagon - return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE + H3Error neighborResult = h3NeighborRotations( + origin, DIRECTIONS[direction], &rotations, &origin); + if (neighborResult) { + return neighborResult; } out[idx] = origin; if (distances) { @@ -504,73 +639,84 @@ int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index* out, } } - if (H3_EXPORT(h3IsPentagon)(origin)) { + if (H3_EXPORT(isPentagon)(origin)) { // Pentagon was encountered; bail out as user doesn't want this. - return HEX_RANGE_PENTAGON; + return E_PENTAGON; } } - return HEX_RANGE_SUCCESS; + return E_SUCCESS; } /** - * hexRanges takes an array of input hex IDs and a max k-ring and returns an - * array of hexagon IDs sorted first by the original hex IDs and then by the + * gridDisksUnsafe takes an array of input hex IDs and a max k-ring and returns + * an array of hexagon IDs sorted first by the original hex IDs and then by the * k-ring (0 to max), with no guaranteed sorting within each k-ring group. * * @param h3Set A pointer to an array of H3Indexes * @param length The total number of H3Indexes in h3Set * @param k The number of rings to generate * @param out A pointer to the output memory to dump the new set of H3Indexes to - * The memory block should be equal to maxKringSize(k) * length + * The memory block should be equal to maxGridDiskSize(k) * length * @return 0 if no pentagon is encountered. Cannot trust output otherwise */ -int H3_EXPORT(hexRanges)(H3Index* h3Set, int length, int k, H3Index* out) { - int success = 0; - H3Index* segment; - int segmentSize = H3_EXPORT(maxKringSize)(k); +H3Error H3_EXPORT(gridDisksUnsafe)(H3Index *h3Set, int length, int k, + H3Index *out) { + H3Index *segment; + int64_t segmentSize; + H3Error err = H3_EXPORT(maxGridDiskSize)(k, &segmentSize); + if (err) { + return err; + } for (int i = 0; i < length; i++) { // Determine the appropriate segment of the output array to operate on segment = out + i * segmentSize; - success = H3_EXPORT(hexRange)(h3Set[i], k, segment); - if (success != 0) return success; + H3Error failed = H3_EXPORT(gridDiskUnsafe)(h3Set[i], k, segment); + if (failed) return failed; } - return 0; + return E_SUCCESS; } /** - * Returns the hollow hexagonal ring centered at origin with sides of length k. + * Returns the "hollow" ring of hexagons at exactly grid distance k from + * the origin hexagon. In particular, k=0 returns just the origin hexagon. + * + * A nonzero failure code may be returned in some cases, for example, + * if a pentagon is encountered. + * Failure cases may be fixed in future versions. * * @param origin Origin location. * @param k k >= 0 * @param out Array which must be of size 6 * k (or 1 if k == 0) - * @return 0 if no pentagonal distortion was encountered. + * @return 0 if successful; nonzero otherwise. */ -int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { +H3Error H3_EXPORT(gridRingUnsafe)(H3Index origin, int k, H3Index *out) { // Short-circuit on 'identity' ring if (k == 0) { out[0] = origin; - return 0; + return E_SUCCESS; } int idx = 0; // Number of 60 degree ccw rotations to perform on the direction (based on // which faces have been crossed.) int rotations = 0; // Scratch structure for checking for pentagons - if (H3_EXPORT(h3IsPentagon)(origin)) { + if (H3_EXPORT(isPentagon)(origin)) { // Pentagon was encountered; bail out as user doesn't want this. - return HEX_RANGE_PENTAGON; + return E_PENTAGON; } for (int ring = 0; ring < k; ring++) { - origin = h3NeighborRotations(origin, NEXT_RING_DIRECTION, &rotations); - if (origin == 0) { + H3Error neighborResult = h3NeighborRotations( + origin, NEXT_RING_DIRECTION, &rotations, &origin); + if (neighborResult) { // Should not be possible because `origin` would have to be a // pentagon - return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE + // TODO: Reachable via fuzzer + return neighborResult; } - if (H3_EXPORT(h3IsPentagon)(origin)) { - return HEX_RANGE_PENTAGON; + if (H3_EXPORT(isPentagon)(origin)) { + return E_PENTAGON; } } @@ -581,12 +727,13 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { for (int direction = 0; direction < 6; direction++) { for (int pos = 0; pos < k; pos++) { - origin = - h3NeighborRotations(origin, DIRECTIONS[direction], &rotations); - if (origin == 0) { + H3Error neighborResult = h3NeighborRotations( + origin, DIRECTIONS[direction], &rotations, &origin); + if (neighborResult) { // Should not be possible because `origin` would have to be a // pentagon - return HEX_RANGE_K_SUBSEQUENCE; // LCOV_EXCL_LINE + // TODO: Reachable via fuzzer + return neighborResult; } // Skip the very last index, it was already added. We do @@ -596,8 +743,8 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { out[idx] = origin; idx++; - if (H3_EXPORT(h3IsPentagon)(origin)) { - return HEX_RANGE_PENTAGON; + if (H3_EXPORT(isPentagon)(origin)) { + return E_PENTAGON; } } } @@ -607,100 +754,316 @@ int H3_EXPORT(hexRing)(H3Index origin, int k, H3Index* out) { // it indicates pentagonal distortion occurred and we should report // failure. if (lastIndex != origin) { - return HEX_RANGE_PENTAGON; + return E_PENTAGON; } else { - return HEX_RANGE_SUCCESS; + return E_SUCCESS; } } /** - * maxPolyfillSize returns the number of hexagons to allocate space for when - * performing a polyfill on the given GeoJSON-like data structure. + * maxPolygonToCellsSize returns the number of cells to allocate space for + * when performing a polygonToCells on the given GeoJSON-like data structure. * - * Currently a laughably padded response, being a k-ring that wholly contains - * a bounding box of the GeoJSON, but still less wasted memory than initializing - * a Python application? ;) + * The size is the maximum of either the number of points in the geoloop or the + * number of cells in the bounding box of the geoloop. * * @param geoPolygon A GeoJSON-like data structure indicating the poly to fill * @param res Hexagon resolution (0-15) - * @return number of hexagons to allocate for + * @param out number of cells to allocate for + * @return 0 (E_SUCCESS) on success. */ -int H3_EXPORT(maxPolyfillSize)(const GeoPolygon* geoPolygon, int res) { +H3Error H3_EXPORT(maxPolygonToCellsSize)(const GeoPolygon *geoPolygon, int res, + uint32_t flags, int64_t *out) { + H3Error flagErr = validatePolygonFlags(flags); + if (flagErr) { + return flagErr; + } // Get the bounding box for the GeoJSON-like struct BBox bbox; - bboxFromGeofence(&geoPolygon->geofence, &bbox); - int minK = bboxHexRadius(&bbox, res); + const GeoLoop geoloop = geoPolygon->geoloop; + bboxFromGeoLoop(&geoloop, &bbox); + int64_t numHexagons; + H3Error estimateErr = bboxHexEstimate(&bbox, res, &numHexagons); + if (estimateErr) { + return estimateErr; + } + // This algorithm assumes that the number of vertices is usually less than + // the number of hexagons, but when it's wrong, this will keep it from + // failing + int totalVerts = geoloop.numVerts; + for (int i = 0; i < geoPolygon->numHoles; i++) { + totalVerts += geoPolygon->holes[i].numVerts; + } + if (numHexagons < totalVerts) numHexagons = totalVerts; + // When the polygon is very small, near an icosahedron edge and is an odd + // resolution, the line tracing needs an extra buffer than the estimator + // function provides (but beefing that up to cover causes most situations to + // overallocate memory) + numHexagons += POLYGON_TO_CELLS_BUFFER; + *out = numHexagons; + return E_SUCCESS; +} - // The total number of hexagons to allocate can now be determined by - // the k-ring hex allocation helper function. - return H3_EXPORT(maxKringSize)(minK); +/** + * _getEdgeHexagons takes a given geoloop ring (either the main geoloop or + * one of the holes) and traces it with hexagons and updates the search and + * found memory blocks. This is used for determining the initial hexagon set + * for the polygonToCells algorithm to execute on. + * + * @param geoloop The geoloop (or hole) to be traced + * @param numHexagons The maximum number of hexagons possible for the geoloop + * (also the bounds of the search and found arrays) + * @param res The hexagon resolution (0-15) + * @param numSearchHexes The number of hexagons found so far to be searched + * @param search The block of memory containing the hexagons to search from + * @param found The block of memory containing the hexagons found from the + * search + * + * @return An error code if the hash function cannot insert a found hexagon + * into the found array. + */ +H3Error _getEdgeHexagons(const GeoLoop *geoloop, int64_t numHexagons, int res, + int64_t *numSearchHexes, H3Index *search, + H3Index *found) { + for (int i = 0; i < geoloop->numVerts; i++) { + LatLng origin = geoloop->verts[i]; + LatLng destination = i == geoloop->numVerts - 1 ? geoloop->verts[0] + : geoloop->verts[i + 1]; + int64_t numHexesEstimate; + H3Error estimateErr = + lineHexEstimate(&origin, &destination, res, &numHexesEstimate); + if (estimateErr) { + return estimateErr; + } + for (int64_t j = 0; j < numHexesEstimate; j++) { + LatLng interpolate; + double invNumHexesEst = 1.0 / numHexesEstimate; + interpolate.lat = + (origin.lat * (numHexesEstimate - j) * invNumHexesEst) + + (destination.lat * j * invNumHexesEst); + interpolate.lng = + (origin.lng * (numHexesEstimate - j) * invNumHexesEst) + + (destination.lng * j * invNumHexesEst); + H3Index pointHex; + H3Error e = H3_EXPORT(latLngToCell)(&interpolate, res, &pointHex); + if (e) { + return e; + } + // A simple hash to store the hexagon, or move to another place if + // needed + int64_t loc = (int64_t)(pointHex % numHexagons); + int64_t loopCount = 0; + while (found[loc] != 0) { + // If this conditional is reached, the `found` memory block is + // too small for the given polygon. This should not happen. + // TODO: Reachable via fuzzer + if (loopCount > numHexagons) return E_FAILED; + if (found[loc] == pointHex) + break; // At least two points of the geoloop index to the + // same cell + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (found[loc] == pointHex) + continue; // Skip this hex, already exists in the found hash + // Otherwise, set it in the found hash for now + found[loc] = pointHex; + + search[*numSearchHexes] = pointHex; + (*numSearchHexes)++; + } + } + return E_SUCCESS; } /** - * polyfill takes a given GeoJSON-like data structure and preallocated, + * polygonToCells takes a given GeoJSON-like data structure and preallocated, * zeroed memory, and fills it with the hexagons that are contained by * the GeoJSON-like data structure. * - * The current implementation is very primitive and slow, but correct, - * performing a point-in-poly operation on every hexagon in a k-ring defined - * around the given geofence. + * This implementation traces the GeoJSON geoloop(s) in cartesian space with + * hexagons, tests them and their neighbors to be contained by the geoloop(s), + * and then any newly found hexagons are used to test again until no new + * hexagons are found. * - * @param geoPolygon The geofence and holes defining the relevant area + * @param geoPolygon The geoloop and holes defining the relevant area * @param res The Hexagon resolution (0-15) * @param out The slab of zeroed memory to write to. Assumed to be big enough. */ -void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { - // One of the goals of the polyfill algorithm is that two adjacent polygons - // with zero overlap have zero overlapping hexagons. That the hexagons are - // uniquely assigned. There are a few approaches to take here, such as - // deciding based on which polygon has the greatest overlapping area of the - // hexagon, or the most number of contained points on the hexagon (using the - // center point as a tiebreaker). +H3Error H3_EXPORT(polygonToCells)(const GeoPolygon *geoPolygon, int res, + uint32_t flags, H3Index *out) { + H3Error flagErr = validatePolygonFlags(flags); + if (flagErr) { + return flagErr; + } + // One of the goals of the polygonToCells algorithm is that two adjacent + // polygons with zero overlap have zero overlapping hexagons. That the + // hexagons are uniquely assigned. There are a few approaches to take here, + // such as deciding based on which polygon has the greatest overlapping area + // of the hexagon, or the most number of contained points on the hexagon + // (using the center point as a tiebreaker). // // But if the polygons are convex, both of these more complex algorithms can // be reduced down to checking whether or not the center of the hexagon is - // contained in the polygon, and so this is the approach that this polyfill - // algorithm will follow, as it's simpler, faster, and the error for concave - // polygons is still minimal (only affecting concave shapes on the order of - // magnitude of the hexagon size or smaller, not impacting larger concave - // shapes) + // contained in the polygon, and so this is the approach that this + // polygonToCells algorithm will follow, as it's simpler, faster, and the + // error for concave polygons is still minimal (only affecting concave + // shapes on the order of magnitude of the hexagon size or smaller, not + // impacting larger concave shapes) // - // This first part is identical to the maxPolyfillSize above. + // This first part is identical to the maxPolygonToCellsSize above. // Get the bounding boxes for the polygon and any holes - BBox* bboxes = malloc((geoPolygon->numHoles + 1) * sizeof(BBox)); - assert(bboxes != NULL); + BBox *bboxes = H3_MEMORY(malloc)((geoPolygon->numHoles + 1) * sizeof(BBox)); + if (!bboxes) { + return E_MEMORY_ALLOC; + } bboxesFromGeoPolygon(geoPolygon, bboxes); - int minK = bboxHexRadius(&bboxes[0], res); - int numHexagons = H3_EXPORT(maxKringSize)(minK); - - // Get the center hex - GeoCoord center; - bboxCenter(&bboxes[0], ¢er); - H3Index centerH3 = H3_EXPORT(geoToH3)(¢er, res); - - // From here on it works differently, first we get all potential - // hexagons inserted into the available memory - H3_EXPORT(kRing)(centerH3, minK, out); - - // Next we iterate through each hexagon, and test its center point to see if - // it's contained in the GeoJSON-like struct - for (int i = 0; i < numHexagons; i++) { - // Skip records that are already zeroed - if (out[i] == 0) { - continue; + + // Get the estimated number of hexagons and allocate some temporary memory + // for the hexagons + int64_t numHexagons; + H3Error numHexagonsError = + H3_EXPORT(maxPolygonToCellsSize)(geoPolygon, res, flags, &numHexagons); + if (numHexagonsError) { + H3_MEMORY(free)(bboxes); + return numHexagonsError; + } + H3Index *search = H3_MEMORY(calloc)(numHexagons, sizeof(H3Index)); + if (!search) { + H3_MEMORY(free)(bboxes); + return E_MEMORY_ALLOC; + } + H3Index *found = H3_MEMORY(calloc)(numHexagons, sizeof(H3Index)); + if (!found) { + H3_MEMORY(free)(bboxes); + H3_MEMORY(free)(search); + return E_MEMORY_ALLOC; + } + + // Some metadata for tracking the state of the search and found memory + // blocks + int64_t numSearchHexes = 0; + int64_t numFoundHexes = 0; + + // 1. Trace the hexagons along the polygon defining the outer geoloop and + // add them to the search hash. The hexagon containing the geoloop point + // may or may not be contained by the geoloop (as the hexagon's center + // point may be outside of the boundary.) + const GeoLoop geoloop = geoPolygon->geoloop; + H3Error edgeHexError = _getEdgeHexagons(&geoloop, numHexagons, res, + &numSearchHexes, search, found); + // If this branch is reached, we have exceeded the maximum number of + // hexagons possible and need to clean up the allocated memory. + // TODO: Reachable via fuzzer + if (edgeHexError) { + H3_MEMORY(free)(search); + H3_MEMORY(free)(found); + H3_MEMORY(free)(bboxes); + return edgeHexError; + } + + // 2. Iterate over all holes, trace the polygons defining the holes with + // hexagons and add to only the search hash. We're going to temporarily use + // the `found` hash to use for dedupe purposes and then re-zero it once + // we're done here, otherwise we'd have to scan the whole set on each insert + // to make sure there's no duplicates, which is very inefficient. + for (int i = 0; i < geoPolygon->numHoles; i++) { + GeoLoop *hole = &(geoPolygon->holes[i]); + edgeHexError = _getEdgeHexagons(hole, numHexagons, res, &numSearchHexes, + search, found); + // If this branch is reached, we have exceeded the maximum number of + // hexagons possible and need to clean up the allocated memory. + // TODO: Reachable via fuzzer + if (edgeHexError) { + H3_MEMORY(free)(search); + H3_MEMORY(free)(found); + H3_MEMORY(free)(bboxes); + return edgeHexError; } - // Check if hexagon is inside of polygon - GeoCoord hexCenter; - H3_EXPORT(h3ToGeo)(out[i], &hexCenter); - hexCenter.lat = constrainLat(hexCenter.lat); - hexCenter.lon = constrainLng(hexCenter.lon); - // And remove from list if not - if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { - out[i] = H3_INVALID_INDEX; + } + + // 3. Re-zero the found hash so it can be used in the main loop below + for (int64_t i = 0; i < numHexagons; i++) found[i] = H3_NULL; + + // 4. Begin main loop. While the search hash is not empty do the following + while (numSearchHexes > 0) { + // Iterate through all hexagons in the current search hash, then loop + // through all neighbors and test Point-in-Poly, if point-in-poly + // succeeds, add to out and found hashes if not already there. + int64_t currentSearchNum = 0; + int64_t i = 0; + while (currentSearchNum < numSearchHexes) { + H3Index ring[MAX_ONE_RING_SIZE] = {0}; + H3Index searchHex = search[i]; + H3_EXPORT(gridDisk)(searchHex, 1, ring); + for (int j = 0; j < MAX_ONE_RING_SIZE; j++) { + if (ring[j] == H3_NULL) { + continue; // Skip if this was a pentagon and only had 5 + // neighbors + } + + H3Index hex = ring[j]; + + // A simple hash to store the hexagon, or move to another place + // if needed. This MUST be done before the point-in-poly check + // since that's far more expensive + int64_t loc = (int64_t)(hex % numHexagons); + int64_t loopCount = 0; + while (out[loc] != 0) { + // If this branch is reached, we have exceeded the maximum + // number of hexagons possible and need to clean up the + // allocated memory. + // TODO: Reachable via fuzzer + if (loopCount > numHexagons) { + H3_MEMORY(free)(search); + H3_MEMORY(free)(found); + H3_MEMORY(free)(bboxes); + return E_FAILED; + } + if (out[loc] == hex) break; // Skip duplicates found + loc = (loc + 1) % numHexagons; + loopCount++; + } + if (out[loc] == hex) { + continue; // Skip this hex, already exists in the out hash + } + + // Check if the hexagon is in the polygon or not + LatLng hexCenter; + H3_EXPORT(cellToLatLng)(hex, &hexCenter); + + // If not, skip + if (!pointInsidePolygon(geoPolygon, bboxes, &hexCenter)) { + continue; + } + + // Otherwise set it in the output array + out[loc] = hex; + + // Set the hexagon in the found hash + found[numFoundHexes] = hex; + numFoundHexes++; + } + currentSearchNum++; + i++; } + + // Swap the search and found pointers, copy the found hex count to the + // search hex count, and zero everything related to the found memory. + H3Index *temp = search; + search = found; + found = temp; + for (int64_t j = 0; j < numSearchHexes; j++) found[j] = 0; + numSearchHexes = numFoundHexes; + numFoundHexes = 0; + // Repeat until no new hexagons are found } - free(bboxes); + // The out memory structure should be complete, end it here + H3_MEMORY(free)(bboxes); + H3_MEMORY(free)(search); + H3_MEMORY(free)(found); + return E_SUCCESS; } /** @@ -712,17 +1075,17 @@ void H3_EXPORT(polyfill)(const GeoPolygon* geoPolygon, int res, H3Index* out) { * @param numHexes Number of hexagons in the set * @param graph Output graph */ -void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, - VertexGraph* graph) { - GeoBoundary vertices; - GeoCoord* fromVtx; - GeoCoord* toVtx; - VertexNode* edge; +H3Error h3SetToVertexGraph(const H3Index *h3Set, const int numHexes, + VertexGraph *graph) { + CellBoundary vertices; + LatLng *fromVtx; + LatLng *toVtx; + VertexNode *edge; if (numHexes < 1) { // We still need to init the graph, or calls to destroyVertexGraph will // fail initVertexGraph(graph, 0, 0); - return; + return E_SUCCESS; } int res = H3_GET_RESOLUTION(h3Set[0]); const int minBuckets = 6; @@ -731,7 +1094,12 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, initVertexGraph(graph, numBuckets, res); // Iterate through every hexagon for (int i = 0; i < numHexes; i++) { - H3_EXPORT(h3ToGeoBoundary)(h3Set[i], &vertices); + H3Error boundaryErr = H3_EXPORT(cellToBoundary)(h3Set[i], &vertices); + if (boundaryErr) { + // Destroy vertex graph as caller will not know to do so. + destroyVertexGraph(graph); + return boundaryErr; + } // iterate through every edge for (int j = 0; j < vertices.numVerts; j++) { fromVtx = &vertices.verts[j]; @@ -748,21 +1116,23 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes, } } } + return E_SUCCESS; } /** * Internal: Create a LinkedGeoPolygon from a vertex graph. It is the - * responsibility of the caller to call destroyLinkedPolygon on the populated - * linked geo structure, or the memory for that structure will not be freed. + * responsibility of the caller to call destroyLinkedMultiPolygon on the + * populated linked geo structure, or the memory for that structure will not be + * freed. * @private * @param graph Input graph * @param out Output polygon */ -void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out) { +void _vertexGraphToLinkedGeo(VertexGraph *graph, LinkedGeoPolygon *out) { *out = (LinkedGeoPolygon){0}; - LinkedGeoLoop* loop; - VertexNode* edge; - GeoCoord nextVtx; + LinkedGeoLoop *loop; + VertexNode *edge; + LatLng nextVtx; // Find the next unused entry point while ((edge = firstVertexNode(graph)) != NULL) { loop = addNewLinkedLoop(out); @@ -782,9 +1152,9 @@ void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out) { * Polygon outlines will follow GeoJSON MultiPolygon order: Each polygon will * have one outer loop, which is first in the list, followed by any holes. * - * It is the responsibility of the caller to call destroyLinkedPolygon on the - * populated linked geo structure, or the memory for that structure will - * not be freed. + * It is the responsibility of the caller to call destroyLinkedMultiPolygon on + * the populated linked geo structure, or the memory for that structure will not + * be freed. * * It is expected that all hexagons in the set have the same resolution and * that the set contains no duplicates. Behavior is undefined if duplicates @@ -795,13 +1165,19 @@ void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out) { * @param numHexes Number of hexagons in set * @param out Output polygon */ -void H3_EXPORT(h3SetToLinkedGeo)(const H3Index* h3Set, const int numHexes, - LinkedGeoPolygon* out) { +H3Error H3_EXPORT(cellsToLinkedMultiPolygon)(const H3Index *h3Set, + const int numHexes, + LinkedGeoPolygon *out) { VertexGraph graph; - h3SetToVertexGraph(h3Set, numHexes, &graph); + H3Error err = h3SetToVertexGraph(h3Set, numHexes, &graph); + if (err) { + return err; + } _vertexGraphToLinkedGeo(&graph, out); - // TODO: The return value, possibly indicating an error, is discarded here - - // we should use this when we update the API to return a value - normalizeMultiPolygon(out); destroyVertexGraph(&graph); + H3Error normalizeResult = normalizeMultiPolygon(out); + if (normalizeResult) { + H3_EXPORT(destroyLinkedMultiPolygon)(out); + } + return normalizeResult; } diff --git a/src/h3lib/lib/baseCells.c b/src/h3lib/lib/baseCells.c index 9dfc87e82..1b971d620 100644 --- a/src/h3lib/lib/baseCells.c +++ b/src/h3lib/lib/baseCells.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,16 @@ #include "baseCells.h" -/** @struct BaseCellOrient +#include "h3Index.h" + +/** @struct BaseCellRotation * @brief base cell at a given ijk and required rotations into its system */ typedef struct { int baseCell; ///< base cell number int ccwRot60; ///< number of ccw 60 degree rotations relative to current /// face -} BaseCellOrient; +} BaseCellRotation; /** @brief Neighboring base cell ID in each IJK direction. * @@ -303,7 +305,7 @@ const int baseCellNeighbor60CCWRots[NUM_BASE_CELLS][7] = { * This table can be accessed using the functions `_faceIjkToBaseCell` and * `_faceIjkToBaseCellCCWrot60` */ -static const BaseCellOrient faceIjkBaseCells[NUM_ICOSA_FACES][3][3][3] = { +static const BaseCellRotation faceIjkBaseCells[NUM_ICOSA_FACES][3][3][3] = { {// face 0 { // i 0 @@ -820,6 +822,10 @@ const BaseCellData baseCellData[NUM_BASE_CELLS] = { /** @brief Return whether or not the indicated base cell is a pentagon. */ int _isBaseCellPentagon(int baseCell) { + if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + return false; + } return baseCellData[baseCell].isPentagon; } @@ -837,7 +843,7 @@ bool _isBaseCellPolarPentagon(int baseCell) { * * Valid ijk+ lookup coordinates are from (0, 0, 0) to (2, 2, 2). */ -int _faceIjkToBaseCell(const FaceIJK* h) { +int _faceIjkToBaseCell(const FaceIJK *h) { return faceIjkBaseCells[h->face][h->coord.i][h->coord.j][h->coord.k] .baseCell; } @@ -850,17 +856,38 @@ int _faceIjkToBaseCell(const FaceIJK* h) { * * Valid ijk+ lookup coordinates are from (0, 0, 0) to (2, 2, 2). */ -int _faceIjkToBaseCellCCWrot60(const FaceIJK* h) { +int _faceIjkToBaseCellCCWrot60(const FaceIJK *h) { return faceIjkBaseCells[h->face][h->coord.i][h->coord.j][h->coord.k] .ccwRot60; } /** @brief Find the FaceIJK given a base cell. */ -void _baseCellToFaceIjk(int baseCell, FaceIJK* h) { +void _baseCellToFaceIjk(int baseCell, FaceIJK *h) { *h = baseCellData[baseCell].homeFijk; } +/** + * @brief Given a base cell and the face it appears on, return + * the number of 60' ccw rotations for that base cell's + * coordinate system. + * @returns The number of rotations, or INVALID_ROTATIONS if the base + * cell is not found on the given face + */ +int _baseCellToCCWrot60(int baseCell, int face) { + if (face < 0 || face > NUM_ICOSA_FACES) return INVALID_ROTATIONS; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + if (faceIjkBaseCells[face][i][j][k].baseCell == baseCell) { + return faceIjkBaseCells[face][i][j][k].ccwRot60; + } + } + } + } + return INVALID_ROTATIONS; +} + /** @brief Return whether or not the tested face is a cw offset face. */ bool _baseCellIsCwOffset(int baseCell, int testFace) { @@ -886,3 +913,27 @@ Direction _getBaseCellDirection(int originBaseCell, int neighboringBaseCell) { } return INVALID_DIGIT; } + +/** + * res0CellCount returns the number of resolution 0 cells + * + * @return int count of resolution 0 cells + */ +int H3_EXPORT(res0CellCount)(void) { return NUM_BASE_CELLS; } + +/** + * getRes0Cells generates all base cells storing them into the provided + * memory pointer. Buffer must be of size NUM_BASE_CELLS * sizeof(H3Index). + * + * @param out H3Index* the memory to store the resulting base cells in + * @returns E_SUCCESS. + */ +H3Error H3_EXPORT(getRes0Cells)(H3Index *out) { + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + H3Index baseCell = H3_INIT; + H3_SET_MODE(baseCell, H3_CELL_MODE); + H3_SET_BASE_CELL(baseCell, bc); + out[bc] = baseCell; + } + return E_SUCCESS; +} diff --git a/src/h3lib/lib/bbox.c b/src/h3lib/lib/bbox.c index 90196b35d..2c0bb87bd 100644 --- a/src/h3lib/lib/bbox.c +++ b/src/h3lib/lib/bbox.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,30 +18,49 @@ */ #include "bbox.h" + #include #include #include + #include "constants.h" -#include "geoCoord.h" #include "h3Index.h" +#include "latLng.h" + +/** + * Width of the bounding box, in rads + * @param bbox Bounding box to inspect + * @return width, in rads + */ +double bboxWidthRads(const BBox *bbox) { + return bboxIsTransmeridian(bbox) ? bbox->east - bbox->west + M_2PI + : bbox->east - bbox->west; +} + +/** + * Height of the bounding box + * @param bbox Bounding box to inspect + * @return height, in rads + */ +double bboxHeightRads(const BBox *bbox) { return bbox->north - bbox->south; } /** * Whether the given bounding box crosses the antimeridian * @param bbox Bounding box to inspect * @return is transmeridian */ -bool bboxIsTransmeridian(const BBox* bbox) { return bbox->east < bbox->west; } +bool bboxIsTransmeridian(const BBox *bbox) { return bbox->east < bbox->west; } /** * Get the center of a bounding box * @param bbox Input bounding box * @param center Output center coordinate */ -void bboxCenter(const BBox* bbox, GeoCoord* center) { - center->lat = (bbox->north + bbox->south) / 2.0; +void bboxCenter(const BBox *bbox, LatLng *center) { + center->lat = (bbox->north + bbox->south) * 0.5; // If the bbox crosses the antimeridian, shift east 360 degrees double east = bboxIsTransmeridian(bbox) ? bbox->east + M_2PI : bbox->east; - center->lon = constrainLng((east + bbox->west) / 2.0); + center->lng = constrainLng((east + bbox->west) * 0.5); } /** @@ -50,14 +69,64 @@ void bboxCenter(const BBox* bbox, GeoCoord* center) { * @param point Point to test * @return Whether the point is contained */ -bool bboxContains(const BBox* bbox, const GeoCoord* point) { +bool bboxContains(const BBox *bbox, const LatLng *point) { return point->lat >= bbox->south && point->lat <= bbox->north && (bboxIsTransmeridian(bbox) ? // transmeridian case - (point->lon >= bbox->west || point->lon <= bbox->east) + (point->lng >= bbox->west || point->lng <= bbox->east) : // standard case - (point->lon >= bbox->west && point->lon <= bbox->east)); + (point->lng >= bbox->west && point->lng <= bbox->east)); +} + +/** + * Whether two bounding boxes overlap + * @param a First bounding box + * @param b Second bounding box + * @return Whether the bounding boxes overlap + */ +bool bboxOverlapsBBox(const BBox *a, const BBox *b) { + // Check whether latitude coords overlap + if (a->north < b->south || a->south > b->north) { + return false; + } + + // Check whether longitude coords overlap, accounting for transmeridian + // bboxes + LongitudeNormalization aNormalization; + LongitudeNormalization bNormalization; + bboxNormalization(a, b, &aNormalization, &bNormalization); + + if (normalizeLng(a->east, aNormalization) < + normalizeLng(b->west, bNormalization) || + normalizeLng(a->west, aNormalization) > + normalizeLng(b->east, bNormalization)) { + return false; + } + + return true; +} + +/** + * Whether one bounding box contains another + * @param a First bounding box + * @param b Second bounding box + * @return Whether a contains b + */ +bool bboxContainsBBox(const BBox *a, const BBox *b) { + // Check whether latitude coords are contained + if (a->north < b->north || a->south > b->south) { + return false; + } + // Check whether longitude coords are contained + // Account for transmeridian bboxes + LongitudeNormalization aNormalization; + LongitudeNormalization bNormalization; + bboxNormalization(a, b, &aNormalization, &bNormalization); + return normalizeLng(a->west, aNormalization) <= + normalizeLng(b->west, bNormalization) && + normalizeLng(a->east, aNormalization) >= + normalizeLng(b->east, bNormalization); } /** @@ -66,11 +135,21 @@ bool bboxContains(const BBox* bbox, const GeoCoord* point) { * @param b2 Bounding box 2 * @return Whether the boxes are equal */ -bool bboxEquals(const BBox* b1, const BBox* b2) { +bool bboxEquals(const BBox *b1, const BBox *b2) { return b1->north == b2->north && b1->south == b2->south && b1->east == b2->east && b1->west == b2->west; } +CellBoundary bboxToCellBoundary(const BBox *bbox) { + // Convert bbox to cell boundary, CCW vertex order + CellBoundary bboxBoundary = {.numVerts = 4, + .verts = {{bbox->north, bbox->east}, + {bbox->north, bbox->west}, + {bbox->south, bbox->west}, + {bbox->south, bbox->east}}}; + return bboxBoundary; +} + /** * _hexRadiusKm returns the radius of a given hexagon in Km * @@ -80,42 +159,153 @@ bool bboxEquals(const BBox* b1, const BBox* b2) { double _hexRadiusKm(H3Index h3Index) { // There is probably a cheaper way to determine the radius of a // hexagon, but this way is conceptually simple - GeoCoord h3Center; - GeoBoundary h3Boundary; - H3_EXPORT(h3ToGeo)(h3Index, &h3Center); - H3_EXPORT(h3ToGeoBoundary)(h3Index, &h3Boundary); - return _geoDistKm(&h3Center, h3Boundary.verts); + LatLng h3Center; + CellBoundary h3Boundary; + H3_EXPORT(cellToLatLng)(h3Index, &h3Center); + H3_EXPORT(cellToBoundary)(h3Index, &h3Boundary); + return H3_EXPORT(greatCircleDistanceKm)(&h3Center, h3Boundary.verts); +} + +/** + * bboxHexEstimate returns an estimated number of hexagons that fit + * within the cartesian-projected bounding box + * + * @param bbox the bounding box to estimate the hexagon fill level + * @param res the resolution of the H3 hexagons to fill the bounding box + * @param out the estimated number of hexagons to fill the bounding box + * @return E_SUCCESS (0) on success, or another value otherwise. + */ +H3Error bboxHexEstimate(const BBox *bbox, int res, int64_t *out) { + // Get the area of the pentagon as the maximally-distorted area possible + H3Index pentagons[12] = {0}; + H3Error pentagonsErr = H3_EXPORT(getPentagons)(res, pentagons); + if (pentagonsErr) { + return pentagonsErr; + } + double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); + // Area of a regular hexagon is 3/2*sqrt(3) * r * r + // The pentagon has the most distortion (smallest edges) and shares its + // edges with hexagons, so the most-distorted hexagons have this area, + // shrunk by 20% off chance that the bounding box perfectly bounds a + // pentagon. + double pentagonAreaKm2 = + 0.8 * (2.59807621135 * pentagonRadiusKm * pentagonRadiusKm); + + // Then get the area of the bounding box of the geoloop in question + LatLng p1, p2; + p1.lat = bbox->north; + p1.lng = bbox->east; + p2.lat = bbox->south; + p2.lng = bbox->west; + double d = H3_EXPORT(greatCircleDistanceKm)(&p1, &p2); + double lngDiff = fabs(p1.lng - p2.lng); + double latDiff = fabs(p1.lat - p2.lat); + if (lngDiff == 0 || latDiff == 0) { + return E_FAILED; + } + double length = fmax(lngDiff, latDiff); + double width = fmin(lngDiff, latDiff); + double ratio = length / width; + // Derived constant based on: https://math.stackexchange.com/a/1921940 + // Clamped to 3 as higher values tend to rapidly drag the estimate to zero. + double a = d * d / fmin(3.0, ratio); + + // Divide the two to get an estimate of the number of hexagons needed + double estimateDouble = ceil(a / pentagonAreaKm2); + if (!isfinite(estimateDouble)) { + return E_FAILED; + } + int64_t estimate = (int64_t)estimateDouble; + if (estimate == 0) estimate = 1; + *out = estimate; + return E_SUCCESS; +} + +/** + * lineHexEstimate returns an estimated number of hexagons that trace + * the cartesian-projected line + * + * @param origin the origin coordinates + * @param destination the destination coordinates + * @param res the resolution of the H3 hexagons to trace the line + * @param out Out parameter for the estimated number of hexagons required to + * trace the line + * @return E_SUCCESS (0) on success or another value otherwise. + */ +H3Error lineHexEstimate(const LatLng *origin, const LatLng *destination, + int res, int64_t *out) { + // Get the area of the pentagon as the maximally-distorted area possible + H3Index pentagons[12] = {0}; + H3Error pentagonsErr = H3_EXPORT(getPentagons)(res, pentagons); + if (pentagonsErr) { + return pentagonsErr; + } + double pentagonRadiusKm = _hexRadiusKm(pentagons[0]); + + double dist = H3_EXPORT(greatCircleDistanceKm)(origin, destination); + double distCeil = ceil(dist / (2 * pentagonRadiusKm)); + if (!isfinite(distCeil)) { + return E_FAILED; + } + int64_t estimate = (int64_t)distCeil; + if (estimate == 0) estimate = 1; + *out = estimate; + return E_SUCCESS; +} + +/** + * Scale a given bounding box by some factor. Scales both width and height + * by the factor, rather than scaling area, which will scale at scale^2. + * Note that this function is meant to handle bounding boxes and scales, + * within a reasonable domain, and does not guarantee reasonable results for + * extreme values. + * @param bbox Bounding box to scale, in-place + * @param scale Scale factor + */ +void scaleBBox(BBox *bbox, double scale) { + double width = bboxWidthRads(bbox); + double height = bboxHeightRads(bbox); + double widthBuffer = (width * scale - width) * 0.5; + double heightBuffer = (height * scale - height) * 0.5; + // Scale north and south, clamping to latitude domain + bbox->north += heightBuffer; + if (bbox->north > M_PI_2) bbox->north = M_PI_2; + bbox->south -= heightBuffer; + if (bbox->south < -M_PI_2) bbox->south = -M_PI_2; + // Scale east and west, clamping to longitude domain + bbox->east += widthBuffer; + if (bbox->east > M_PI) bbox->east -= M_2PI; + if (bbox->east < -M_PI) bbox->east += M_2PI; + bbox->west -= widthBuffer; + if (bbox->west > M_PI) bbox->west -= M_2PI; + if (bbox->west < -M_PI) bbox->west += M_2PI; } /** - * Get the radius of the bbox in hexagons - i.e. the radius of a k-ring centered - * on the bbox center and covering the entire bbox. - * @param bbox Bounding box to measure - * @param res Resolution of hexagons to use in measurement - * @return Radius in hexagons + * Determine the longitude normalization scheme for two bounding boxes, either + * or both of which might cross the antimeridian. The goal is to transform + * latitudes in one or both boxes so that they are in the same frame of + * reference and can be operated on with standard Cartesian functions. + * @param a First bounding box + * @param b Second bounding box + * @param aNormalization Output: Normalization for longitudes in the first box + * @param bNormalization Output: Normalization for longitudes in the second box */ -int bboxHexRadius(const BBox* bbox, int res) { - // Determine the center of the bounding box - GeoCoord center; - bboxCenter(bbox, ¢er); - - // Use a vertex on the side closest to the equator, to ensure the longest - // radius in cases with significant distortion. East/west is arbitrary. - double lat = - fabs(bbox->north) > fabs(bbox->south) ? bbox->south : bbox->north; - GeoCoord vertex = {lat, bbox->east}; - - // Determine the length of the bounding box "radius" to then use - // as a circle on the earth that the k-rings must be greater than - double bboxRadiusKm = _geoDistKm(¢er, &vertex); - - // Determine the radius of the center hexagon - double centerHexRadiusKm = _hexRadiusKm(H3_EXPORT(geoToH3)(¢er, res)); - - // The closest point along a hexagon drawn through the center points - // of a k-ring aggregation is exactly 1.5 radii of the hexagon. For - // any orientation of the GeoJSON encased in a circle defined by the - // bounding box radius and center, it is guaranteed to fit in this k-ring - // Rounded *up* to guarantee containment - return (int)ceil(bboxRadiusKm / (1.5 * centerHexRadiusKm)); +void bboxNormalization(const BBox *a, const BBox *b, + LongitudeNormalization *aNormalization, + LongitudeNormalization *bNormalization) { + bool aIsTransmeridian = bboxIsTransmeridian(a); + bool bIsTransmeridian = bboxIsTransmeridian(b); + bool aToBTrendsEast = a->west - b->east < b->west - a->east; + // If neither is transmeridian, no normalization. + // If both are transmeridian, normalize east by convention. + // If one is transmeridian and one is not, normalize toward the other. + *aNormalization = !aIsTransmeridian ? NORMALIZE_NONE + : bIsTransmeridian ? NORMALIZE_EAST + : aToBTrendsEast ? NORMALIZE_EAST + : NORMALIZE_WEST; + *bNormalization = !bIsTransmeridian ? NORMALIZE_NONE + : aIsTransmeridian ? NORMALIZE_EAST + : aToBTrendsEast ? NORMALIZE_WEST + : NORMALIZE_EAST; } diff --git a/src/h3lib/lib/coordijk.c b/src/h3lib/lib/coordijk.c index b7107e8ae..0bed0250b 100644 --- a/src/h3lib/lib/coordijk.c +++ b/src/h3lib/lib/coordijk.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2018, 2020-2023 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,18 +15,23 @@ */ /** @file coordijk.c * @brief Hex IJK coordinate systems functions including conversions to/from - * lat/lon. + * lat/lng. */ #include "coordijk.h" + #include #include #include #include + #include "constants.h" -#include "geoCoord.h" +#include "h3Assert.h" +#include "latLng.h" #include "mathExtensions.h" +#define INT32_MAX_3 (INT32_MAX / 3) + /** * Sets an IJK coordinate to the specified component values. * @@ -35,7 +40,7 @@ * @param j The desired j component value. * @param k The desired k component value. */ -void _setIJK(CoordIJK* ijk, int i, int j, int k) { +void _setIJK(CoordIJK *ijk, int i, int j, int k) { ijk->i = i; ijk->j = j; ijk->k = k; @@ -48,7 +53,7 @@ void _setIJK(CoordIJK* ijk, int i, int j, int k) { * @param v The 2D cartesian coordinate vector. * @param h The ijk+ coordinates of the containing hex. */ -void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h) { +void _hex2dToCoordIJK(const Vec2d *v, CoordIJK *h) { double a1, a2; double x1, x2; int m1, m2; @@ -61,20 +66,20 @@ void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h) { a2 = fabsl(v->y); // first do a reverse conversion - x2 = a2 / M_SIN60; - x1 = a1 + x2 / 2.0L; + x2 = a2 * M_RSIN60; + x1 = a1 + x2 / 2.0; // check if we have the center of a hex - m1 = x1; - m2 = x2; + m1 = (int)x1; + m2 = (int)x2; // otherwise round correctly r1 = x1 - m1; r2 = x2 - m2; - if (r1 < 0.5L) { - if (r1 < 1.0L / 3.0L) { - if (r2 < (1.0L + r1) / 2.0L) { + if (r1 < 0.5) { + if (r1 < 1.0 / 3.0) { + if (r2 < (1.0 + r1) / 2.0) { h->i = m1; h->j = m2; } else { @@ -82,33 +87,33 @@ void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h) { h->j = m2 + 1; } } else { - if (r2 < (1.0L - r1)) { + if (r2 < (1.0 - r1)) { h->j = m2; } else { h->j = m2 + 1; } - if ((1.0L - r1) <= r2 && r2 < (2.0 * r1)) { + if ((1.0 - r1) <= r2 && r2 < (2.0 * r1)) { h->i = m1 + 1; } else { h->i = m1; } } } else { - if (r1 < 2.0L / 3.0L) { - if (r2 < (1.0L - r1)) { + if (r1 < 2.0 / 3.0) { + if (r2 < (1.0 - r1)) { h->j = m2; } else { h->j = m2 + 1; } - if ((2.0L * r1 - 1.0L) < r2 && r2 < (1.0L - r1)) { + if ((2.0 * r1 - 1.0) < r2 && r2 < (1.0 - r1)) { h->i = m1; } else { h->i = m1 + 1; } } else { - if (r2 < (r1 / 2.0L)) { + if (r2 < (r1 / 2.0)) { h->i = m1 + 1; h->j = m2; } else { @@ -120,20 +125,20 @@ void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h) { // now fold across the axes if necessary - if (v->x < 0.0L) { + if (v->x < 0.0) { if ((h->j % 2) == 0) // even { long long int axisi = h->j / 2; long long int diff = h->i - axisi; - h->i = h->i - 2.0 * diff; + h->i = (int)(h->i - 2.0 * diff); } else { long long int axisi = (h->j + 1) / 2; long long int diff = h->i - axisi; - h->i = h->i - (2.0 * diff + 1); + h->i = (int)(h->i - (2.0 * diff + 1)); } } - if (v->y < 0.0L) { + if (v->y < 0.0) { h->i = h->i - (2 * h->j + 1) / 2; h->j = -1 * h->j; } @@ -147,11 +152,11 @@ void _hex2dToCoordIJK(const Vec2d* v, CoordIJK* h) { * @param h The ijk coordinates of the hex. * @param v The 2D cartesian coordinates of the hex center point. */ -void _ijkToHex2d(const CoordIJK* h, Vec2d* v) { +void _ijkToHex2d(const CoordIJK *h, Vec2d *v) { int i = h->i - h->k; int j = h->j - h->k; - v->x = i - 0.5L * j; + v->x = i - 0.5 * j; v->y = j * M_SQRT3_2; } @@ -163,7 +168,7 @@ void _ijkToHex2d(const CoordIJK* h, Vec2d* v) { * @param c2 The second set of ijk coordinates. * @return 1 if the two addresses match, 0 if they do not. */ -int _ijkMatches(const CoordIJK* c1, const CoordIJK* c2) { +int _ijkMatches(const CoordIJK *c1, const CoordIJK *c2) { return (c1->i == c2->i && c1->j == c2->j && c1->k == c2->k); } @@ -174,7 +179,7 @@ int _ijkMatches(const CoordIJK* c1, const CoordIJK* c2) { * @param h2 The second set of ijk coordinates. * @param sum The sum of the two sets of ijk coordinates. */ -void _ijkAdd(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* sum) { +void _ijkAdd(const CoordIJK *h1, const CoordIJK *h2, CoordIJK *sum) { sum->i = h1->i + h2->i; sum->j = h1->j + h2->j; sum->k = h1->k + h2->k; @@ -187,7 +192,7 @@ void _ijkAdd(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* sum) { * @param h2 The second set of ijk coordinates. * @param diff The difference of the two sets of ijk coordinates (h1 - h2). */ -void _ijkSub(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* diff) { +void _ijkSub(const CoordIJK *h1, const CoordIJK *h2, CoordIJK *diff) { diff->i = h1->i - h2->i; diff->j = h1->j - h2->j; diff->k = h1->k - h2->k; @@ -199,19 +204,59 @@ void _ijkSub(const CoordIJK* h1, const CoordIJK* h2, CoordIJK* diff) { * @param c The ijk coordinates to scale. * @param factor The scaling factor. */ -void _ijkScale(CoordIJK* c, int factor) { +void _ijkScale(CoordIJK *c, int factor) { c->i *= factor; c->j *= factor; c->k *= factor; } +/** + * Returns true if _ijkNormalize with the given input could have a signed + * integer overflow. Assumes k is set to 0. + */ +bool _ijkNormalizeCouldOverflow(const CoordIJK *ijk) { + // Check for the possibility of overflow + int max, min; + if (ijk->i > ijk->j) { + max = ijk->i; + min = ijk->j; + } else { + max = ijk->j; + min = ijk->i; + } + if (min < 0) { + // Only if the min is less than 0 will the resulting number be larger + // than max. If min is positive, then max is also positive, and a + // positive signed integer minus another positive signed integer will + // not overflow. + if (ADD_INT32S_OVERFLOWS(max, min)) { + // max + min would overflow + return true; + } + if (SUB_INT32S_OVERFLOWS(0, min)) { + // 0 - INT32_MIN would overflow + return true; + } + if (SUB_INT32S_OVERFLOWS(max, min)) { + // max - min would overflow + return true; + } + } + return false; +} + /** * Normalizes ijk coordinates by setting the components to the smallest possible * values. Works in place. * + * This function does not protect against signed integer overflow. The caller + * must ensure that none of (i - j), (i - k), (j - i), (j - k), (k - i), (k - j) + * will overflow. This function may be changed in the future to make that check + * itself and return an error code. + * * @param c The ijk coordinates to normalize. */ -void _ijkNormalize(CoordIJK* c) { +void _ijkNormalize(CoordIJK *c) { // remove any negative values if (c->i < 0) { c->j -= c->i; @@ -243,13 +288,14 @@ void _ijkNormalize(CoordIJK* c) { } /** - * Determines the H3 digit corresponding to a unit vector in ijk coordinates. + * Determines the H3 digit corresponding to a unit vector or the zero vector + * in ijk coordinates. * - * @param ijk The ijk coordinates; must be a unit vector. - * @return The H3 digit (0-6) corresponding to the ijk unit vector, or - * INVALID_DIGIT on failure. + * @param ijk The ijk coordinates; must be a unit vector or zero vector. + * @return The H3 digit (0-6) corresponding to the ijk unit vector, zero vector, + * or INVALID_DIGIT (7) on failure. */ -Direction _unitIjkToDigit(const CoordIJK* ijk) { +Direction _unitIjkToDigit(const CoordIJK *ijk) { CoordIJK c = *ijk; _ijkNormalize(&c); @@ -264,19 +310,115 @@ Direction _unitIjkToDigit(const CoordIJK* ijk) { return digit; } +/** + * Returns non-zero if _upAp7 with the given input could have a signed integer + * overflow. + * + * Assumes ijk is IJK+ coordinates (no negative numbers). + */ +H3Error _upAp7Checked(CoordIJK *ijk) { + // Doesn't need to be checked because i, j, and k must all be non-negative + int i = ijk->i - ijk->k; + int j = ijk->j - ijk->k; + + // <0 is checked because the input must all be non-negative, but some + // negative inputs are used in unit tests to exercise the below. + if (i >= INT32_MAX_3 || j >= INT32_MAX_3 || i < 0 || j < 0) { + if (ADD_INT32S_OVERFLOWS(i, i)) { + return E_FAILED; + } + int i2 = i + i; + if (ADD_INT32S_OVERFLOWS(i2, i)) { + return E_FAILED; + } + int i3 = i2 + i; + if (ADD_INT32S_OVERFLOWS(j, j)) { + return E_FAILED; + } + int j2 = j + j; + + if (SUB_INT32S_OVERFLOWS(i3, j)) { + return E_FAILED; + } + if (ADD_INT32S_OVERFLOWS(i, j2)) { + return E_FAILED; + } + } + + ijk->i = (int)lround(((i * 3) - j) * M_ONESEVENTH); + ijk->j = (int)lround((i + (j * 2)) * M_ONESEVENTH); + ijk->k = 0; + + // Expected not to be reachable, because max + min or max - min would need + // to overflow. + if (NEVER(_ijkNormalizeCouldOverflow(ijk))) { + return E_FAILED; + } + _ijkNormalize(ijk); + return E_SUCCESS; +} + +/** + * Returns non-zero if _upAp7r with the given input could have a signed integer + * overflow. + * + * Assumes ijk is IJK+ coordinates (no negative numbers). + */ +H3Error _upAp7rChecked(CoordIJK *ijk) { + // Doesn't need to be checked because i, j, and k must all be non-negative + int i = ijk->i - ijk->k; + int j = ijk->j - ijk->k; + + // <0 is checked because the input must all be non-negative, but some + // negative inputs are used in unit tests to exercise the below. + if (i >= INT32_MAX_3 || j >= INT32_MAX_3 || i < 0 || j < 0) { + if (ADD_INT32S_OVERFLOWS(i, i)) { + return E_FAILED; + } + int i2 = i + i; + if (ADD_INT32S_OVERFLOWS(j, j)) { + return E_FAILED; + } + int j2 = j + j; + if (ADD_INT32S_OVERFLOWS(j2, j)) { + return E_FAILED; + } + int j3 = j2 + j; + + if (ADD_INT32S_OVERFLOWS(i2, j)) { + return E_FAILED; + } + if (SUB_INT32S_OVERFLOWS(j3, i)) { + return E_FAILED; + } + } + + ijk->i = (int)lround(((i * 2) + j) * M_ONESEVENTH); + ijk->j = (int)lround(((j * 3) - i) * M_ONESEVENTH); + ijk->k = 0; + + // Expected not to be reachable, because max + min or max - min would need + // to overflow. + if (NEVER(_ijkNormalizeCouldOverflow(ijk))) { + return E_FAILED; + } + _ijkNormalize(ijk); + return E_SUCCESS; +} + /** * Find the normalized ijk coordinates of the indexing parent of a cell in a * counter-clockwise aperture 7 grid. Works in place. * * @param ijk The ijk coordinates. */ -void _upAp7(CoordIJK* ijk) { +void _upAp7(CoordIJK *ijk) { // convert to CoordIJ int i = ijk->i - ijk->k; int j = ijk->j - ijk->k; - ijk->i = (int)lroundl((3 * i - j) / 7.0L); - ijk->j = (int)lroundl((i + 2 * j) / 7.0L); + ijk->i = (int)lround((3 * i - j) * M_ONESEVENTH); + ijk->j = (int)lround((i + 2 * j) * M_ONESEVENTH); ijk->k = 0; _ijkNormalize(ijk); } @@ -287,13 +429,13 @@ void _upAp7(CoordIJK* ijk) { * * @param ijk The ijk coordinates. */ -void _upAp7r(CoordIJK* ijk) { +void _upAp7r(CoordIJK *ijk) { // convert to CoordIJ int i = ijk->i - ijk->k; int j = ijk->j - ijk->k; - ijk->i = (int)lroundl((2 * i + j) / 7.0L); - ijk->j = (int)lroundl((3 * j - i) / 7.0L); + ijk->i = (int)lround((2 * i + j) * M_ONESEVENTH); + ijk->j = (int)lround((3 * j - i) * M_ONESEVENTH); ijk->k = 0; _ijkNormalize(ijk); } @@ -305,7 +447,7 @@ void _upAp7r(CoordIJK* ijk) { * * @param ijk The ijk coordinates. */ -void _downAp7(CoordIJK* ijk) { +void _downAp7(CoordIJK *ijk) { // res r unit vectors in res r+1 CoordIJK iVec = {3, 0, 1}; CoordIJK jVec = {1, 3, 0}; @@ -327,7 +469,7 @@ void _downAp7(CoordIJK* ijk) { * * @param ijk The ijk coordinates. */ -void _downAp7r(CoordIJK* ijk) { +void _downAp7r(CoordIJK *ijk) { // res r unit vectors in res r+1 CoordIJK iVec = {3, 1, 0}; CoordIJK jVec = {0, 3, 1}; @@ -350,7 +492,7 @@ void _downAp7r(CoordIJK* ijk) { * @param ijk The ijk coordinates. * @param digit The digit direction from the original ijk coordinates. */ -void _neighbor(CoordIJK* ijk, Direction digit) { +void _neighbor(CoordIJK *ijk, Direction digit) { if (digit > CENTER_DIGIT && digit < NUM_DIGITS) { _ijkAdd(ijk, &UNIT_VECS[digit], ijk); _ijkNormalize(ijk); @@ -362,7 +504,7 @@ void _neighbor(CoordIJK* ijk, Direction digit) { * * @param ijk The ijk coordinates. */ -void _ijkRotate60ccw(CoordIJK* ijk) { +void _ijkRotate60ccw(CoordIJK *ijk) { // unit vector rotations CoordIJK iVec = {1, 1, 0}; CoordIJK jVec = {0, 1, 1}; @@ -383,7 +525,7 @@ void _ijkRotate60ccw(CoordIJK* ijk) { * * @param ijk The ijk coordinates. */ -void _ijkRotate60cw(CoordIJK* ijk) { +void _ijkRotate60cw(CoordIJK *ijk) { // unit vector rotations CoordIJK iVec = {1, 0, 1}; CoordIJK jVec = {1, 1, 0}; @@ -454,7 +596,7 @@ Direction _rotate60cw(Direction digit) { * * @param ijk The ijk coordinates. */ -void _downAp3(CoordIJK* ijk) { +void _downAp3(CoordIJK *ijk) { // res r unit vectors in res r+1 CoordIJK iVec = {2, 0, 1}; CoordIJK jVec = {1, 2, 0}; @@ -476,7 +618,7 @@ void _downAp3(CoordIJK* ijk) { * * @param ijk The ijk coordinates. */ -void _downAp3r(CoordIJK* ijk) { +void _downAp3r(CoordIJK *ijk) { // res r unit vectors in res r+1 CoordIJK iVec = {2, 1, 0}; CoordIJK jVec = {0, 2, 1}; @@ -498,7 +640,7 @@ void _downAp3r(CoordIJK* ijk) { * @param c1 The first set of ijk coordinates. * @param c2 The second set of ijk coordinates. */ -int ijkDistance(const CoordIJK* c1, const CoordIJK* c2) { +int ijkDistance(const CoordIJK *c1, const CoordIJK *c2) { CoordIJK diff; _ijkSub(c1, c2, &diff); _ijkNormalize(&diff); @@ -513,7 +655,7 @@ int ijkDistance(const CoordIJK* c1, const CoordIJK* c2) { * @param ijk The input IJK+ coordinates * @param ij The output IJ coordinates */ -void ijkToIj(const CoordIJK* ijk, CoordIJ* ij) { +void ijkToIj(const CoordIJK *ijk, CoordIJ *ij) { ij->i = ijk->i - ijk->k; ij->j = ijk->j - ijk->k; } @@ -524,20 +666,27 @@ void ijkToIj(const CoordIJK* ijk, CoordIJ* ij) { * * @param ij The input IJ coordinates * @param ijk The output IJK+ coordinates + * @returns E_SUCCESS on success, E_FAILED if signed integer overflow would have + * occurred. */ -void ijToIjk(const CoordIJ* ij, CoordIJK* ijk) { +H3Error ijToIjk(const CoordIJ *ij, CoordIJK *ijk) { ijk->i = ij->i; ijk->j = ij->j; ijk->k = 0; + if (_ijkNormalizeCouldOverflow(ijk)) { + return E_FAILED; + } + _ijkNormalize(ijk); + return E_SUCCESS; } /** * Convert IJK coordinates to cube coordinates, in place * @param ijk Coordinate to convert */ -void ijkToCube(CoordIJK* ijk) { +void ijkToCube(CoordIJK *ijk) { ijk->i = -ijk->i + ijk->k; ijk->j = ijk->j - ijk->k; ijk->k = -ijk->i - ijk->j; @@ -547,8 +696,8 @@ void ijkToCube(CoordIJK* ijk) { * Convert cube coordinates to IJK coordinates, in place * @param ijk Coordinate to convert */ -void cubeToIjk(CoordIJK* ijk) { +void cubeToIjk(CoordIJK *ijk) { ijk->i = -ijk->i; ijk->k = 0; _ijkNormalize(ijk); -} \ No newline at end of file +} diff --git a/src/h3lib/lib/directedEdge.c b/src/h3lib/lib/directedEdge.c new file mode 100644 index 000000000..f77436bb9 --- /dev/null +++ b/src/h3lib/lib/directedEdge.c @@ -0,0 +1,294 @@ +/* + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file directedEdge.c + * @brief DirectedEdge functions for manipulating directed edge indexes. + */ + +#include +#include + +#include "algos.h" +#include "constants.h" +#include "coordijk.h" +#include "h3Assert.h" +#include "h3Index.h" +#include "latLng.h" +#include "vertex.h" + +/** + * Returns whether or not the provided H3Indexes are neighbors. + * @param origin The origin H3 index. + * @param destination The destination H3 index. + * @param out Set to 1 if the indexes are neighbors, 0 otherwise + * @return Error code if the origin or destination are invalid or incomparable. + */ +H3Error H3_EXPORT(areNeighborCells)(H3Index origin, H3Index destination, + int *out) { + // Make sure they're hexagon indexes + if (H3_GET_MODE(origin) != H3_CELL_MODE || + H3_GET_MODE(destination) != H3_CELL_MODE) { + return E_CELL_INVALID; + } + + // Hexagons cannot be neighbors with themselves + if (origin == destination) { + *out = 0; + return E_SUCCESS; + } + + // Only hexagons in the same resolution can be neighbors + if (H3_GET_RESOLUTION(origin) != H3_GET_RESOLUTION(destination)) { + return E_RES_MISMATCH; + } + + // H3 Indexes that share the same parent are very likely to be neighbors + // Child 0 is neighbor with all of its parent's 'offspring', the other + // children are neighbors with 3 of the 7 children. So a simple comparison + // of origin and destination parents and then a lookup table of the children + // is a super-cheap way to possibly determine they are neighbors. + int parentRes = H3_GET_RESOLUTION(origin) - 1; + if (parentRes > 0) { + // TODO: Return error codes here + H3Index originParent; + H3_EXPORT(cellToParent)(origin, parentRes, &originParent); + H3Index destinationParent; + H3_EXPORT(cellToParent)(destination, parentRes, &destinationParent); + if (originParent == destinationParent) { + Direction originResDigit = + H3_GET_INDEX_DIGIT(origin, parentRes + 1); + Direction destinationResDigit = + H3_GET_INDEX_DIGIT(destination, parentRes + 1); + if (originResDigit == CENTER_DIGIT || + destinationResDigit == CENTER_DIGIT) { + *out = 1; + return E_SUCCESS; + } + if (originResDigit >= INVALID_DIGIT) { + // Prevent indexing off the end of the array below + return E_CELL_INVALID; + } + if ((originResDigit == K_AXES_DIGIT || + destinationResDigit == K_AXES_DIGIT) && + H3_EXPORT(isPentagon)(originParent)) { + // If these are invalid cells, fail rather than incorrectly + // reporting neighbors. For pentagon cells that are actually + // neighbors across the deleted subsequence, they will fail the + // optimized check below, but they will be accepted by the + // gridDisk check below that. + return E_CELL_INVALID; + } + // These sets are the relevant neighbors in the clockwise + // and counter-clockwise + const Direction neighborSetClockwise[] = { + CENTER_DIGIT, JK_AXES_DIGIT, IJ_AXES_DIGIT, J_AXES_DIGIT, + IK_AXES_DIGIT, K_AXES_DIGIT, I_AXES_DIGIT}; + const Direction neighborSetCounterclockwise[] = { + CENTER_DIGIT, IK_AXES_DIGIT, JK_AXES_DIGIT, K_AXES_DIGIT, + IJ_AXES_DIGIT, I_AXES_DIGIT, J_AXES_DIGIT}; + if (neighborSetClockwise[originResDigit] == destinationResDigit || + neighborSetCounterclockwise[originResDigit] == + destinationResDigit) { + *out = 1; + return E_SUCCESS; + } + } + } + + // Otherwise, we have to determine the neighbor relationship the "hard" way. + H3Index neighborRing[7] = {0}; + H3_EXPORT(gridDisk)(origin, 1, neighborRing); + for (int i = 0; i < 7; i++) { + if (neighborRing[i] == destination) { + *out = 1; + return E_SUCCESS; + } + } + + // Made it here, they definitely aren't neighbors + *out = 0; + return E_SUCCESS; +} + +/** + * Returns a directed edge H3 index based on the provided origin and + * destination + * @param origin The origin H3 hexagon index + * @param destination The destination H3 hexagon index + * @param out Output: The directed edge H3Index. + */ +H3Error H3_EXPORT(cellsToDirectedEdge)(H3Index origin, H3Index destination, + H3Index *out) { + // Determine the IJK direction from the origin to the destination + Direction direction = directionForNeighbor(origin, destination); + + // The direction will be invalid if the cells are not neighbors + if (direction == INVALID_DIGIT) { + return E_NOT_NEIGHBORS; + } + + // Create the edge index for the neighbor direction + H3Index output = origin; + H3_SET_MODE(output, H3_DIRECTEDEDGE_MODE); + H3_SET_RESERVED_BITS(output, direction); + + *out = output; + return E_SUCCESS; +} + +/** + * Returns the origin hexagon from the directed edge H3Index + * @param edge The edge H3 index + * @param out Output: The origin H3 hexagon index + */ +H3Error H3_EXPORT(getDirectedEdgeOrigin)(H3Index edge, H3Index *out) { + if (H3_GET_MODE(edge) != H3_DIRECTEDEDGE_MODE) { + return E_DIR_EDGE_INVALID; + } + H3Index origin = edge; + H3_SET_MODE(origin, H3_CELL_MODE); + H3_SET_RESERVED_BITS(origin, 0); + *out = origin; + return E_SUCCESS; +} + +/** + * Returns the destination hexagon from the directed edge H3Index + * @param edge The edge H3 index + * @param out Output: The destination H3 hexagon index + */ +H3Error H3_EXPORT(getDirectedEdgeDestination)(H3Index edge, H3Index *out) { + Direction direction = H3_GET_RESERVED_BITS(edge); + int rotations = 0; + H3Index origin; + // Note: This call is also checking for H3_DIRECTEDEDGE_MODE + H3Error originResult = H3_EXPORT(getDirectedEdgeOrigin)(edge, &origin); + if (originResult) { + return originResult; + } + return h3NeighborRotations(origin, direction, &rotations, out); +} + +/** + * Determines if the provided H3Index is a valid directed edge index + * @param edge The directed edge H3Index + * @return 1 if it is a directed edge H3Index, otherwise 0. + */ +int H3_EXPORT(isValidDirectedEdge)(H3Index edge) { + Direction neighborDirection = H3_GET_RESERVED_BITS(edge); + if (neighborDirection <= CENTER_DIGIT || neighborDirection >= NUM_DIGITS) { + return 0; + } + + H3Index origin; + // Note: This call is also checking for H3_DIRECTEDEDGE_MODE + H3Error originResult = H3_EXPORT(getDirectedEdgeOrigin)(edge, &origin); + if (originResult) { + return 0; + } + if (H3_EXPORT(isPentagon)(origin) && neighborDirection == K_AXES_DIGIT) { + return 0; + } + + return H3_EXPORT(isValidCell)(origin); +} + +/** + * Returns the origin, destination pair of hexagon IDs for the given edge ID + * @param edge The directed edge H3Index + * @param originDestination Pointer to memory to store origin and destination + * IDs + */ +H3Error H3_EXPORT(directedEdgeToCells)(H3Index edge, + H3Index *originDestination) { + H3Error originResult = + H3_EXPORT(getDirectedEdgeOrigin)(edge, &originDestination[0]); + if (originResult) { + return originResult; + } + H3Error destinationResult = + H3_EXPORT(getDirectedEdgeDestination)(edge, &originDestination[1]); + if (destinationResult) { + return destinationResult; + } + return E_SUCCESS; +} + +/** + * Provides all of the directed edges from the current H3Index. + * @param origin The origin hexagon H3Index to find edges for. + * @param edges The memory to store all of the edges inside. + */ +H3Error H3_EXPORT(originToDirectedEdges)(H3Index origin, H3Index *edges) { + // Determine if the origin is a pentagon and special treatment needed. + int isPent = H3_EXPORT(isPentagon)(origin); + + // This is actually quite simple. Just modify the bits of the origin + // slightly for each direction, except the 'k' direction in pentagons, + // which is zeroed. + for (int i = 0; i < 6; i++) { + if (isPent && i == 0) { + edges[i] = H3_NULL; + } else { + edges[i] = origin; + H3_SET_MODE(edges[i], H3_DIRECTEDEDGE_MODE); + H3_SET_RESERVED_BITS(edges[i], i + 1); + } + } + return E_SUCCESS; +} + +/** + * Provides the coordinates defining the directed edge. + * @param edge The directed edge H3Index + * @param cb The cellboundary object to store the edge coordinates. + */ +H3Error H3_EXPORT(directedEdgeToBoundary)(H3Index edge, CellBoundary *cb) { + // Get the origin and neighbor direction from the edge + Direction direction = H3_GET_RESERVED_BITS(edge); + H3Index origin; + H3Error originResult = H3_EXPORT(getDirectedEdgeOrigin)(edge, &origin); + if (originResult) { + return originResult; + } + + // Get the start vertex for the edge + int startVertex = vertexNumForDirection(origin, direction); + if (startVertex == INVALID_VERTEX_NUM) { + // This is not actually an edge (i.e. no valid direction), + // so return no vertices. + cb->numVerts = 0; + return E_DIR_EDGE_INVALID; + } + + // Get the geo boundary for the appropriate vertexes of the origin. Note + // that while there are always 2 topological vertexes per edge, the + // resulting edge boundary may have an additional distortion vertex if it + // crosses an edge of the icosahedron. + FaceIJK fijk; + H3Error fijkResult = _h3ToFaceIjk(origin, &fijk); + if (NEVER(fijkResult)) { + return fijkResult; + } + int res = H3_GET_RESOLUTION(origin); + int isPent = H3_EXPORT(isPentagon)(origin); + + if (isPent) { + _faceIjkPentToCellBoundary(&fijk, res, startVertex, 2, cb); + } else { + _faceIjkToCellBoundary(&fijk, res, startVertex, 2, cb); + } + return E_SUCCESS; +} diff --git a/src/h3lib/lib/faceijk.c b/src/h3lib/lib/faceijk.c index 27dc37cd0..a408bf0f3 100644 --- a/src/h3lib/lib/faceijk.c +++ b/src/h3lib/lib/faceijk.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 Uber Technologies, Inc. + * Copyright 2016-2023 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,22 +19,25 @@ */ #include "faceijk.h" + #include #include #include #include #include + #include "constants.h" #include "coordijk.h" -#include "geoCoord.h" #include "h3Index.h" +#include "latLng.h" #include "vec3d.h" -/** square root of 7 */ -#define M_SQRT7 2.6457513110645905905016157536392604257102L +/** square root of 7 and inverse square root of 7 */ +#define M_SQRT7 2.6457513110645905905016157536392604257102 +#define M_RSQRT7 0.37796447300922722721451653623418006081576 -/** @brief icosahedron face centers in lat/lon radians */ -const GeoCoord faceCenterGeo[NUM_ICOSA_FACES] = { +/** @brief icosahedron face centers in lat/lng radians */ +const LatLng faceCenterGeo[NUM_ICOSA_FACES] = { {0.803582649718989942, 1.248397419617396099}, // face 0 {1.307747883455638156, 2.536945009877921159}, // face 1 {1.054751253523952054, -1.347517358900396623}, // face 2 @@ -366,7 +369,7 @@ static const int unitScaleByCIIres[] = { * @param res The desired H3 resolution for the encoding. * @param h The FaceIJK address of the containing cell at resolution res. */ -void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h) { +void _geoToFaceIjk(const LatLng *g, int res, FaceIJK *h) { // first convert to hex2d Vec2d v; _geoToHex2d(g, res, &h->face, &v); @@ -384,26 +387,16 @@ void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h) { * @param face The icosahedral face containing the spherical coordinates. * @param v The 2D hex coordinates of the cell containing the point. */ -void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v) { - Vec3d v3d; - _geoToVec3d(g, &v3d); - +void _geoToHex2d(const LatLng *g, int res, int *face, Vec2d *v) { // determine the icosahedron face - *face = 0; - double sqd = _pointSquareDist(&faceCenterPoint[0], &v3d); - for (int f = 1; f < NUM_ICOSA_FACES; f++) { - double sqdT = _pointSquareDist(&faceCenterPoint[f], &v3d); - if (sqdT < sqd) { - *face = f; - sqd = sqdT; - } - } + double sqd; + _geoToClosestFace(g, face, &sqd); // cos(r) = 1 - 2 * sin^2(r/2) = 1 - 2 * (sqd / 4) = 1 - sqd/2 - double r = acos(1 - sqd / 2); + double r = acos(1 - sqd * 0.5); if (r < EPSILON) { - v->x = v->y = 0.0L; + v->x = v->y = 0.0; return; } @@ -413,13 +406,14 @@ void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v) { _posAngleRads(_geoAzimuthRads(&faceCenterGeo[*face], g))); // adjust theta for Class III (odd resolutions) - if (isResClassIII(res)) theta = _posAngleRads(theta - M_AP7_ROT_RADS); + if (isResolutionClassIII(res)) + theta = _posAngleRads(theta - M_AP7_ROT_RADS); // perform gnomonic scaling of r r = tan(r); // scale for current resolution length u - r /= RES0_U_GNOMONIC; + r *= INV_RES0_U_GNOMONIC; for (int i = 0; i < res; i++) r *= M_SQRT7; // we now have (r, theta) in hex2d with theta ccw from x-axes @@ -441,8 +435,7 @@ void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v) { * grid relative to the specified resolution. * @param g The spherical coordinates of the cell center point. */ -void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, - GeoCoord* g) { +void _hex2dToGeo(const Vec2d *v, int face, int res, int substrate, LatLng *g) { // calculate (r, theta) in hex2d double r = _v2dMag(v); @@ -454,12 +447,12 @@ void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, double theta = atan2(v->y, v->x); // scale for current resolution length u - for (int i = 0; i < res; i++) r /= M_SQRT7; + for (int i = 0; i < res; i++) r *= M_RSQRT7; // scale accordingly if this is a substrate grid if (substrate) { - r /= 3.0; - if (isResClassIII(res)) r /= M_SQRT7; + r *= M_ONETHIRD; + if (isResolutionClassIII(res)) r *= M_RSQRT7; } r *= RES0_U_GNOMONIC; @@ -469,7 +462,7 @@ void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, // adjust theta for Class III // if a substrate grid, then it's already been adjusted for Class III - if (!substrate && isResClassIII(res)) + if (!substrate && isResolutionClassIII(res)) theta = _posAngleRads(theta + M_AP7_ROT_RADS); // find theta as an azimuth @@ -487,7 +480,7 @@ void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, * @param res The H3 resolution of the cell. * @param g The spherical coordinates of the cell center point. */ -void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g) { +void _faceIjkToGeo(const FaceIJK *h, int res, LatLng *g) { Vec2d v; _ijkToHex2d(&h->coord, &v); _hex2dToGeo(&v, h->face, res, 0, g); @@ -499,89 +492,38 @@ void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g) { * * @param h The FaceIJK address of the pentagonal cell. * @param res The H3 resolution of the cell. + * @param start The first topological vertex to return. + * @param length The number of topological vertexes to return. * @param g The spherical coordinates of the cell boundary. */ -void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { - // the vertexes of an origin-centered pentagon in a Class II resolution on a - // substrate grid with aperture sequence 33r. The aperture 3 gets us the - // vertices, and the 3r gets us back to Class II. - // vertices listed ccw from the i-axes - CoordIJK vertsCII[NUM_PENT_VERTS] = { - {2, 1, 0}, // 0 - {1, 2, 0}, // 1 - {0, 2, 1}, // 2 - {0, 1, 2}, // 3 - {1, 0, 2}, // 4 - }; - - // the vertexes of an origin-centered pentagon in a Class III resolution on - // a substrate grid with aperture sequence 33r7r. The aperture 3 gets us the - // vertices, and the 3r7r gets us to Class II. vertices listed ccw from the - // i-axes - CoordIJK vertsCIII[NUM_PENT_VERTS] = { - {5, 4, 0}, // 0 - {1, 5, 0}, // 1 - {0, 5, 4}, // 2 - {0, 1, 5}, // 3 - {4, 0, 5}, // 4 - }; - - // get the correct set of substrate vertices for this resolution - CoordIJK* verts; - if (isResClassIII(res)) - verts = vertsCIII; - else - verts = vertsCII; - - // adjust the center point to be in an aperture 33r substrate grid - // these should be composed for speed - FaceIJK centerIJK = *h; - _downAp3(¢erIJK.coord); - _downAp3r(¢erIJK.coord); - - // if res is Class III we need to add a cw aperture 7 to get to - // icosahedral Class II +void _faceIjkPentToCellBoundary(const FaceIJK *h, int res, int start, + int length, CellBoundary *g) { int adjRes = res; - if (isResClassIII(res)) { - _downAp7r(¢erIJK.coord); - adjRes++; - } - - // The center point is now in the same substrate grid as the origin - // cell vertices. Add the center point substate coordinates - // to each vertex to translate the vertices to that cell. + FaceIJK centerIJK = *h; FaceIJK fijkVerts[NUM_PENT_VERTS]; - for (int v = 0; v < NUM_PENT_VERTS; v++) { - fijkVerts[v].face = centerIJK.face; - _ijkAdd(¢erIJK.coord, &verts[v], &fijkVerts[v].coord); - _ijkNormalize(&fijkVerts[v].coord); - } + _faceIjkPentToVerts(¢erIJK, &adjRes, fijkVerts); - // convert each vertex to lat/lon + // If we're returning the entire loop, we need one more iteration in case + // of a distortion vertex on the last edge + int additionalIteration = length == NUM_PENT_VERTS ? 1 : 0; + + // convert each vertex to lat/lng // adjust the face of each vertex as appropriate and introduce // edge-crossing vertices as needed g->numVerts = 0; FaceIJK lastFijk; - for (int vert = 0; vert < NUM_PENT_VERTS + 1; vert++) { + for (int vert = start; vert < start + length + additionalIteration; + vert++) { int v = vert % NUM_PENT_VERTS; FaceIJK fijk = fijkVerts[v]; - int pentLeading4 = 0; - int overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); - if (overage == 2) // in a different triangle - { - while (1) { - overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); - if (overage != 2) // not in a different triangle - break; - } - } + _adjustPentVertOverage(&fijk, adjRes); // all Class III pentagon edges cross icosa edges // note that Class II pentagons have vertices on the edge, // not edge intersections - if (isResClassIII(res) && vert > 0) { + if (isResolutionClassIII(res) && vert > start) { // find hex2d of the two vertexes on the last face FaceIJK tmpFijk = fijk; @@ -591,11 +533,11 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { int currentToLastDir = adjacentFaceDir[tmpFijk.face][lastFijk.face]; - const FaceOrientIJK* fijkOrient = + const FaceOrientIJK *fijkOrient = &faceNeighbors[tmpFijk.face][currentToLastDir]; tmpFijk.face = fijkOrient->face; - CoordIJK* ijk = &tmpFijk.coord; + CoordIJK *ijk = &tmpFijk.coord; // rotate and translate for adjacent face for (int i = 0; i < fijkOrient->ccwRot60; i++) _ijkRotate60ccw(ijk); @@ -614,8 +556,8 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { Vec2d v1 = {-1.5 * maxDim, 3.0 * M_SQRT3_2 * maxDim}; Vec2d v2 = {-1.5 * maxDim, -3.0 * M_SQRT3_2 * maxDim}; - Vec2d* edge0; - Vec2d* edge1; + Vec2d *edge0; + Vec2d *edge1; switch (adjacentFaceDir[tmpFijk.face][fijk.face]) { case IJ: edge0 = &v0; @@ -633,7 +575,7 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { break; } - // find the intersection and add the lat/lon point to the result + // find the intersection and add the lat/lng point to the result Vec2d inter; _v2dIntersect(&orig2d0, &orig2d1, edge0, edge1, &inter); _hex2dToGeo(&inter, tmpFijk.face, adjRes, 1, @@ -641,10 +583,10 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { g->numVerts++; } - // convert vertex to lat/lon and add to the result - // vert == NUM_PENT_VERTS is only used to test for possible intersection - // on last edge - if (vert < NUM_PENT_VERTS) { + // convert vertex to lat/lng and add to the result + // vert == start + NUM_PENT_VERTS is only used to test for possible + // intersection on last edge + if (vert < start + NUM_PENT_VERTS) { Vec2d vec; _ijkToHex2d(&fijk.coord, &vec); _hex2dToGeo(&vec, fijk.face, adjRes, 1, &g->verts[g->numVerts]); @@ -656,91 +598,102 @@ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g) { } /** - * Generates the cell boundary in spherical coordinates for a cell given by a - * FaceIJK address at a specified resolution. + * Get the vertices of a pentagon cell as substrate FaceIJK addresses * - * @param h The FaceIJK address of the cell. - * @param res The H3 resolution of the cell. - * @param isPentagon Whether or not the cell is a pentagon. - * @param g The spherical coordinates of the cell boundary. + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. This may be adjusted if + * necessary for the substrate grid resolution. + * @param fijkVerts Output array for the vertices */ -void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, - GeoBoundary* g) { - if (isPentagon) { - _faceIjkPentToGeoBoundary(h, res, g); - return; - } - - // the vertexes of an origin-centered cell in a Class II resolution on a +void _faceIjkPentToVerts(FaceIJK *fijk, int *res, FaceIJK *fijkVerts) { + // the vertexes of an origin-centered pentagon in a Class II resolution on a // substrate grid with aperture sequence 33r. The aperture 3 gets us the // vertices, and the 3r gets us back to Class II. // vertices listed ccw from the i-axes - CoordIJK vertsCII[NUM_HEX_VERTS] = { + CoordIJK vertsCII[NUM_PENT_VERTS] = { {2, 1, 0}, // 0 {1, 2, 0}, // 1 {0, 2, 1}, // 2 {0, 1, 2}, // 3 {1, 0, 2}, // 4 - {2, 0, 1} // 5 }; - // the vertexes of an origin-centered cell in a Class III resolution on a - // substrate grid with aperture sequence 33r7r. The aperture 3 gets us the - // vertices, and the 3r7r gets us to Class II. - // vertices listed ccw from the i-axes - CoordIJK vertsCIII[NUM_HEX_VERTS] = { + // the vertexes of an origin-centered pentagon in a Class III resolution on + // a substrate grid with aperture sequence 33r7r. The aperture 3 gets us the + // vertices, and the 3r7r gets us to Class II. vertices listed ccw from the + // i-axes + CoordIJK vertsCIII[NUM_PENT_VERTS] = { {5, 4, 0}, // 0 {1, 5, 0}, // 1 {0, 5, 4}, // 2 {0, 1, 5}, // 3 {4, 0, 5}, // 4 - {5, 0, 1} // 5 }; // get the correct set of substrate vertices for this resolution - CoordIJK* verts; - if (isResClassIII(res)) + CoordIJK *verts; + if (isResolutionClassIII(*res)) verts = vertsCIII; else verts = vertsCII; // adjust the center point to be in an aperture 33r substrate grid // these should be composed for speed - FaceIJK centerIJK = *h; - _downAp3(¢erIJK.coord); - _downAp3r(¢erIJK.coord); + _downAp3(&fijk->coord); + _downAp3r(&fijk->coord); // if res is Class III we need to add a cw aperture 7 to get to // icosahedral Class II - int adjRes = res; - if (isResClassIII(res)) { - _downAp7r(¢erIJK.coord); - adjRes++; + if (isResolutionClassIII(*res)) { + _downAp7r(&fijk->coord); + *res += 1; } // The center point is now in the same substrate grid as the origin // cell vertices. Add the center point substate coordinates // to each vertex to translate the vertices to that cell. - FaceIJK fijkVerts[NUM_HEX_VERTS]; - for (int v = 0; v < NUM_HEX_VERTS; v++) { - fijkVerts[v].face = centerIJK.face; - _ijkAdd(¢erIJK.coord, &verts[v], &fijkVerts[v].coord); + for (int v = 0; v < NUM_PENT_VERTS; v++) { + fijkVerts[v].face = fijk->face; + _ijkAdd(&fijk->coord, &verts[v], &fijkVerts[v].coord); _ijkNormalize(&fijkVerts[v].coord); } +} - // convert each vertex to lat/lon +/** + * Generates the cell boundary in spherical coordinates for a cell given by a + * FaceIJK address at a specified resolution. + * + * @param h The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. + * @param start The first topological vertex to return. + * @param length The number of topological vertexes to return. + * @param g The spherical coordinates of the cell boundary. + */ +void _faceIjkToCellBoundary(const FaceIJK *h, int res, int start, int length, + CellBoundary *g) { + int adjRes = res; + FaceIJK centerIJK = *h; + FaceIJK fijkVerts[NUM_HEX_VERTS]; + _faceIjkToVerts(¢erIJK, &adjRes, fijkVerts); + + // If we're returning the entire loop, we need one more iteration in case + // of a distortion vertex on the last edge + int additionalIteration = length == NUM_HEX_VERTS ? 1 : 0; + + // convert each vertex to lat/lng // adjust the face of each vertex as appropriate and introduce // edge-crossing vertices as needed g->numVerts = 0; int lastFace = -1; - int lastOverage = 0; // 0: none; 1: edge; 2: overage - for (int vert = 0; vert < NUM_HEX_VERTS + 1; vert++) { + Overage lastOverage = NO_OVERAGE; + for (int vert = start; vert < start + length + additionalIteration; + vert++) { int v = vert % NUM_HEX_VERTS; FaceIJK fijk = fijkVerts[v]; - int pentLeading4 = 0; - int overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); + const int pentLeading4 = 0; + Overage overage = _adjustOverageClassII(&fijk, adjRes, pentLeading4, 1); /* Check for edge-crossing. Each face of the underlying icosahedron is a @@ -751,8 +704,8 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, projection. Note that Class II cell edges have vertices on the face edge, with no edge line intersections. */ - if (isResClassIII(res) && vert > 0 && fijk.face != lastFace && - lastOverage != 1) { + if (isResolutionClassIII(res) && vert > start && + fijk.face != lastFace && lastOverage != FACE_EDGE) { // find hex2d of the two vertexes on original face int lastV = (v + 5) % NUM_HEX_VERTS; Vec2d orig2d0; @@ -768,8 +721,8 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, Vec2d v2 = {-1.5 * maxDim, -3.0 * M_SQRT3_2 * maxDim}; int face2 = ((lastFace == centerIJK.face) ? fijk.face : lastFace); - Vec2d* edge0; - Vec2d* edge1; + Vec2d *edge0; + Vec2d *edge1; switch (adjacentFaceDir[centerIJK.face][face2]) { case IJ: edge0 = &v0; @@ -779,7 +732,7 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, edge0 = &v1; edge1 = &v2; break; - case KI: + // case KI: default: assert(adjacentFaceDir[centerIJK.face][face2] == KI); edge0 = &v2; @@ -787,7 +740,7 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, break; } - // find the intersection and add the lat/lon point to the result + // find the intersection and add the lat/lng point to the result Vec2d inter; _v2dIntersect(&orig2d0, &orig2d1, edge0, edge1, &inter); /* @@ -795,8 +748,8 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, adjacent hexagon edge will lie completely on a single icosahedron face, and no additional vertex is required. */ - bool isIntersectionAtVertex = - _v2dEquals(&orig2d0, &inter) || _v2dEquals(&orig2d1, &inter); + bool isIntersectionAtVertex = _v2dAlmostEquals(&orig2d0, &inter) || + _v2dAlmostEquals(&orig2d1, &inter); if (!isIntersectionAtVertex) { _hex2dToGeo(&inter, centerIJK.face, adjRes, 1, &g->verts[g->numVerts]); @@ -804,10 +757,10 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, } } - // convert vertex to lat/lon and add to the result - // vert == NUM_HEX_VERTS is only used to test for possible intersection - // on last edge - if (vert < NUM_HEX_VERTS) { + // convert vertex to lat/lng and add to the result + // vert == start + NUM_HEX_VERTS is only used to test for possible + // intersection on last edge + if (vert < start + NUM_HEX_VERTS) { Vec2d vec; _ijkToHex2d(&fijk.coord, &vec); _hex2dToGeo(&vec, fijk.face, adjRes, 1, &g->verts[g->numVerts]); @@ -819,6 +772,70 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, } } +/** + * Get the vertices of a cell as substrate FaceIJK addresses + * + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. This may be adjusted if + * necessary for the substrate grid resolution. + * @param fijkVerts Output array for the vertices + */ +void _faceIjkToVerts(FaceIJK *fijk, int *res, FaceIJK *fijkVerts) { + // the vertexes of an origin-centered cell in a Class II resolution on a + // substrate grid with aperture sequence 33r. The aperture 3 gets us the + // vertices, and the 3r gets us back to Class II. + // vertices listed ccw from the i-axes + CoordIJK vertsCII[NUM_HEX_VERTS] = { + {2, 1, 0}, // 0 + {1, 2, 0}, // 1 + {0, 2, 1}, // 2 + {0, 1, 2}, // 3 + {1, 0, 2}, // 4 + {2, 0, 1} // 5 + }; + + // the vertexes of an origin-centered cell in a Class III resolution on a + // substrate grid with aperture sequence 33r7r. The aperture 3 gets us the + // vertices, and the 3r7r gets us to Class II. + // vertices listed ccw from the i-axes + CoordIJK vertsCIII[NUM_HEX_VERTS] = { + {5, 4, 0}, // 0 + {1, 5, 0}, // 1 + {0, 5, 4}, // 2 + {0, 1, 5}, // 3 + {4, 0, 5}, // 4 + {5, 0, 1} // 5 + }; + + // get the correct set of substrate vertices for this resolution + CoordIJK *verts; + if (isResolutionClassIII(*res)) + verts = vertsCIII; + else + verts = vertsCII; + + // adjust the center point to be in an aperture 33r substrate grid + // these should be composed for speed + _downAp3(&fijk->coord); + _downAp3r(&fijk->coord); + + // if res is Class III we need to add a cw aperture 7 to get to + // icosahedral Class II + if (isResolutionClassIII(*res)) { + _downAp7r(&fijk->coord); + *res += 1; + } + + // The center point is now in the same substrate grid as the origin + // cell vertices. Add the center point substate coordinates + // to each vertex to translate the vertices to that cell. + for (int v = 0; v < NUM_HEX_VERTS; v++) { + fijkVerts[v].face = fijk->face; + _ijkAdd(&fijk->coord, &verts[v], &fijkVerts[v].coord); + _ijkNormalize(&fijkVerts[v].coord); + } +} + /** * Adjusts a FaceIJK address in place so that the resulting cell address is * relative to the correct icosahedral face. @@ -831,11 +848,11 @@ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon, * @return 0 if on original face (no overage); 1 if on face edge (only occurs * on substrate grids); 2 if overage on new face interior */ -int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, - int substrate) { - int overage = 0; +Overage _adjustOverageClassII(FaceIJK *fijk, int res, int pentLeading4, + int substrate) { + Overage overage = NO_OVERAGE; - CoordIJK* ijk = &fijk->coord; + CoordIJK *ijk = &fijk->coord; // get the maximum dimension value; scale if a substrate grid int maxDim = maxDimByCIIres[res]; @@ -843,12 +860,12 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, // check for overage if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge - overage = 1; + overage = FACE_EDGE; else if (ijk->i + ijk->j + ijk->k > maxDim) // overage { - overage = 2; + overage = NEW_FACE; - const FaceOrientIJK* fijkOrient; + const FaceOrientIJK *fijkOrient; if (ijk->k > 0) { if (ijk->j > 0) // jk "quadrant" fijkOrient = &faceNeighbors[fijk->face][JK]; @@ -886,8 +903,51 @@ int _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4, // overage points on pentagon boundaries can end up on edges if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge - overage = 1; + overage = FACE_EDGE; } return overage; } + +/** + * Adjusts a FaceIJK address for a pentagon vertex in a substrate grid in + * place so that the resulting cell address is relative to the correct + * icosahedral face. + * + * @param fijk The FaceIJK address of the cell. + * @param res The H3 resolution of the cell. + */ +Overage _adjustPentVertOverage(FaceIJK *fijk, int res) { + int pentLeading4 = 0; + Overage overage; + do { + overage = _adjustOverageClassII(fijk, res, pentLeading4, 1); + } while (overage == NEW_FACE); + return overage; +} + +/** + * Encodes a coordinate on the sphere to the corresponding icosahedral face and + * containing the squared euclidean distance to that face center. + * + * @param g The spherical coordinates to encode. + * @param face The icosahedral face containing the spherical coordinates. + * @param sqd The squared euclidean distance to its icosahedral face center. + */ +void _geoToClosestFace(const LatLng *g, int *face, double *sqd) { + Vec3d v3d; + _geoToVec3d(g, &v3d); + + // determine the icosahedron face + *face = 0; + // The distance between two farthest points is 2.0, therefore the square of + // the distance between two points should always be less or equal than 4.0 . + *sqd = 5.0; + for (int f = 0; f < NUM_ICOSA_FACES; ++f) { + double sqdT = _pointSquareDist(&faceCenterPoint[f], &v3d); + if (sqdT < *sqd) { + *face = f; + *sqd = sqdT; + } + } +} diff --git a/src/h3lib/lib/geoCoord.c b/src/h3lib/lib/geoCoord.c deleted file mode 100644 index 3652ffd9b..000000000 --- a/src/h3lib/lib/geoCoord.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright 2016-2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file geoCoord.c - * @brief Functions for working with lat/lon coordinates. - */ - -#include "geoCoord.h" -#include -#include -#include "constants.h" -#include "h3api.h" - -/** - * Normalizes radians to a value between 0.0 and two PI. - * - * @param rads The input radians value. - * @return The normalized radians value. - */ -double _posAngleRads(double rads) { - double tmp = ((rads < 0.0L) ? rads + M_2PI : rads); - if (rads >= M_2PI) tmp -= M_2PI; - return tmp; -} - -/** - * Determines if the components of two spherical coordinates are within some - * threshold distance of each other. - * - * @param p1 The first spherical coordinates. - * @param p2 The second spherical coordinates. - * @param threshold The threshold distance. - * @return Whether or not the two coordinates are within the threshold distance - * of each other. - */ -bool geoAlmostEqualThreshold(const GeoCoord* p1, const GeoCoord* p2, - double threshold) { - return fabs(p1->lat - p2->lat) < threshold && - fabs(p1->lon - p2->lon) < threshold; -} - -/** - * Determines if the components of two spherical coordinates are within our - * standard epsilon distance of each other. - * - * @param p1 The first spherical coordinates. - * @param p2 The second spherical coordinates. - * @return Whether or not the two coordinates are within the epsilon distance - * of each other. - */ -bool geoAlmostEqual(const GeoCoord* p1, const GeoCoord* p2) { - return geoAlmostEqualThreshold(p1, p2, EPSILON_RAD); -} - -/** - * Set the components of spherical coordinates in decimal degrees. - * - * @param p The spherical coodinates. - * @param latDegs The desired latitidue in decimal degrees. - * @param lonDegs The desired longitude in decimal degrees. - */ -void setGeoDegs(GeoCoord* p, double latDegs, double lonDegs) { - _setGeoRads(p, H3_EXPORT(degsToRads)(latDegs), - H3_EXPORT(degsToRads)(lonDegs)); -} - -/** - * Set the components of spherical coordinates in radians. - * - * @param p The spherical coodinates. - * @param latRads The desired latitidue in decimal radians. - * @param lonRads The desired longitude in decimal radians. - */ -void _setGeoRads(GeoCoord* p, double latRads, double lonRads) { - p->lat = latRads; - p->lon = lonRads; -} - -/** - * Convert from decimal degrees to radians. - * - * @param degrees The decimal degrees. - * @return The corresponding radians. - */ -double H3_EXPORT(degsToRads)(double degrees) { return degrees * M_PI_180; } - -/** - * Convert from radians to decimal degrees. - * - * @param radians The radians. - * @return The corresponding decimal degrees. - */ -double H3_EXPORT(radsToDegs)(double radians) { return radians * M_180_PI; } - -/** - * constrainLat makes sure latitudes are in the proper bounds - * - * @param lat The original lat value - * @return The corrected lat value - */ -double constrainLat(double lat) { - while (lat > M_PI_2) { - lat = lat - M_PI; - } - return lat; -} - -/** - * constrainLng makes sure longitudes are in the proper bounds - * - * @param lng The origin lng value - * @return The corrected lng value - */ -double constrainLng(double lng) { - while (lng > M_PI) { - lng = lng - (2 * M_PI); - } - while (lng < -M_PI) { - lng = lng + (2 * M_PI); - } - return lng; -} - -/** - * Find the great circle distance in radians between two spherical coordinates. - * - * @param p1 The first spherical coordinates. - * @param p2 The second spherical coordinates. - * @return The great circle distance in radians between p1 and p2. - */ -double _geoDistRads(const GeoCoord* p1, const GeoCoord* p2) { - // use spherical triangle with p1 at A, p2 at B, and north pole at C - double bigC = fabs(p2->lon - p1->lon); - if (bigC > M_PI) // assume we want the complement - { - // note that in this case they can't both be negative - double lon1 = p1->lon; - if (lon1 < 0.0L) lon1 += 2.0L * M_PI; - double lon2 = p2->lon; - if (lon2 < 0.0L) lon2 += 2.0L * M_PI; - - bigC = fabs(lon2 - lon1); - } - - double b = M_PI_2 - p1->lat; - double a = M_PI_2 - p2->lat; - - // use law of cosines to find c - double cosc = cos(a) * cos(b) + sin(a) * sin(b) * cos(bigC); - if (cosc > 1.0L) cosc = 1.0L; - if (cosc < -1.0L) cosc = -1.0L; - - return acos(cosc); -} - -/** - * Find the great circle distance in kilometers between two spherical - * coordinates. - * - * @param p1 The first spherical coordinates. - * @param p2 The second spherical coordinates. - * @return The distance in kilometers between p1 and p2. - */ -double _geoDistKm(const GeoCoord* p1, const GeoCoord* p2) { - return EARTH_RADIUS_KM * _geoDistRads(p1, p2); -} - -/** - * Determines the azimuth to p2 from p1 in radians. - * - * @param p1 The first spherical coordinates. - * @param p2 The second spherical coordinates. - * @return The azimuth in radians from p1 to p2. - */ -double _geoAzimuthRads(const GeoCoord* p1, const GeoCoord* p2) { - return atan2(cos(p2->lat) * sin(p2->lon - p1->lon), - cos(p1->lat) * sin(p2->lat) - - sin(p1->lat) * cos(p2->lat) * cos(p2->lon - p1->lon)); -} - -/** - * Computes the point on the sphere a specified azimuth and distance from - * another point. - * - * @param p1 The first spherical coordinates. - * @param az The desired azimuth from p1. - * @param distance The desired distance from p1, must be non-negative. - * @param p2 The spherical coordinates at the desired azimuth and distance from - * p1. - */ -void _geoAzDistanceRads(const GeoCoord* p1, double az, double distance, - GeoCoord* p2) { - if (distance < EPSILON) { - *p2 = *p1; - return; - } - - double sinlat, sinlon, coslon; - - az = _posAngleRads(az); - - // check for due north/south azimuth - if (az < EPSILON || fabs(az - M_PI) < EPSILON) { - if (az < EPSILON) // due north - p2->lat = p1->lat + distance; - else // due south - p2->lat = p1->lat - distance; - - if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole - { - p2->lat = M_PI_2; - p2->lon = 0.0L; - } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole - { - p2->lat = -M_PI_2; - p2->lon = 0.0L; - } else - p2->lon = constrainLng(p1->lon); - } else // not due north or south - { - sinlat = sin(p1->lat) * cos(distance) + - cos(p1->lat) * sin(distance) * cos(az); - if (sinlat > 1.0L) sinlat = 1.0L; - if (sinlat < -1.0L) sinlat = -1.0L; - p2->lat = asin(sinlat); - if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole - { - p2->lat = M_PI_2; - p2->lon = 0.0L; - } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole - { - p2->lat = -M_PI_2; - p2->lon = 0.0L; - } else { - sinlon = sin(az) * sin(distance) / cos(p2->lat); - coslon = (cos(distance) - sin(p1->lat) * sin(p2->lat)) / - cos(p1->lat) / cos(p2->lat); - if (sinlon > 1.0L) sinlon = 1.0L; - if (sinlon < -1.0L) sinlon = -1.0L; - if (coslon > 1.0L) sinlon = 1.0L; - if (coslon < -1.0L) sinlon = -1.0L; - p2->lon = constrainLng(p1->lon + atan2(sinlon, coslon)); - } - } -} - -/* - * The following functions provide meta information about the H3 hexagons at - * each zoom level. Since there are only 16 total levels, these are current - * handled with hardwired static values, but it may be worthwhile to put these - * static values into another file that can be autogenerated by source code in - * the future. - */ - -double H3_EXPORT(hexAreaKm2)(int res) { - static const double areas[] = { - 4250546.848, 607220.9782, 86745.85403, 12392.26486, - 1770.323552, 252.9033645, 36.1290521, 5.1612932, - 0.7373276, 0.1053325, 0.0150475, 0.0021496, - 0.0003071, 0.0000439, 0.0000063, 0.0000009}; - return areas[res]; -} - -double H3_EXPORT(hexAreaM2)(int res) { - static const double areas[] = { - 4.25055E+12, 6.07221E+11, 86745854035, 12392264862, - 1770323552, 252903364.5, 36129052.1, 5161293.2, - 737327.6, 105332.5, 15047.5, 2149.6, - 307.1, 43.9, 6.3, 0.9}; - return areas[res]; -} - -double H3_EXPORT(edgeLengthKm)(int res) { - static const double lens[] = { - 1107.712591, 418.6760055, 158.2446558, 59.81085794, - 22.6063794, 8.544408276, 3.229482772, 1.220629759, - 0.461354684, 0.174375668, 0.065907807, 0.024910561, - 0.009415526, 0.003559893, 0.001348575, 0.000509713}; - return lens[res]; -} - -double H3_EXPORT(edgeLengthM)(int res) { - static const double lens[] = { - 1107712.591, 418676.0055, 158244.6558, 59810.85794, - 22606.3794, 8544.408276, 3229.482772, 1220.629759, - 461.3546837, 174.3756681, 65.90780749, 24.9105614, - 9.415526211, 3.559893033, 1.348574562, 0.509713273}; - return lens[res]; -} - -/** @brief Number of unique valid H3Indexes at given resolution. */ -int64_t H3_EXPORT(numHexagons)(int res) { - static const int64_t nums[] = {122L, - 842L, - 5882L, - 41162L, - 288122L, - 2016842L, - 14117882L, - 98825162L, - 691776122L, - 4842432842L, - 33897029882L, - 237279209162L, - 1660954464122L, - 11626681248842L, - 81386768741882L, - 569707381193162L}; - return nums[res]; -} diff --git a/cmake/alloca_test.c b/src/h3lib/lib/h3Assert.c similarity index 53% rename from cmake/alloca_test.c rename to src/h3lib/lib/h3Assert.c index bc144c238..7ea614ba8 100644 --- a/cmake/alloca_test.c +++ b/src/h3lib/lib/h3Assert.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2022 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,17 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/** @file h3Assert.c + * @brief Support code for unit testing + */ -#ifdef _MSC_VER -#include -#define alloc_fn _alloca -#else -#include -#define alloc_fn alloca -#endif +#include "h3Assert.h" -int main(void) { - char* vla = alloc_fn(10); - memset(vla, 0, 10); - return 0; -} +#if defined(H3_COVERAGE_TEST) || defined(H3_DEBUG) +/* +** Counter used for coverage testing. Does not come into play for +** release builds. +** +** Access to this global variable is not mutex protected. This might +** result in TSAN warnings. But as the variable does not exist in +** release builds, that should not be a concern. +*/ +unsigned int h3CoverageCounter; +#endif diff --git a/src/h3lib/lib/h3Index.c b/src/h3lib/lib/h3Index.c index cf4102356..368930471 100644 --- a/src/h3lib/lib/h3Index.c +++ b/src/h3lib/lib/h3Index.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 Uber Technologies, Inc. + * Copyright 2016-2021, 2024 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,40 +18,88 @@ * (see h3api.h for the main library entry functions) */ #include "h3Index.h" -#include + #include #include #include #include + +#include "alloc.h" #include "baseCells.h" #include "faceijk.h" +#include "h3Assert.h" +#include "iterators.h" #include "mathExtensions.h" -#include "stackAlloc.h" + +/** @var H3ErrorDescriptions + * @brief An array of strings describing each of the H3ErrorCodes enum values + */ +static char *H3ErrorDescriptions[] = { + /* E_SUCCESS */ "Success", + /* E_FAILED */ + "The operation failed but a more specific error is not available", + /* E_DOMAIN */ "Argument was outside of acceptable range", + /* E_LATLNG_DOMAIN */ + "Latitude or longitude arguments were outside of acceptable range", + /* E_RES_DOMAIN */ "Resolution argument was outside of acceptable range", + /* E_CELL_INVALID */ "Cell argument was not valid", + /* E_DIR_EDGE_INVALID */ "Directed edge argument was not valid", + /* E_UNDIR_EDGE_INVALID */ "Undirected edge argument was not valid", + /* E_VERTEX_INVALID */ "Vertex argument was not valid", + /* E_PENTAGON */ "Pentagon distortion was encountered", + /* E_DUPLICATE_INPUT */ "Duplicate input", + /* E_NOT_NEIGHBORS */ "Cell arguments were not neighbors", + /* E_RES_MISMATCH */ "Cell arguments had incompatible resolutions", + /* E_MEMORY_ALLOC */ "Memory allocation failed", + /* E_MEMORY_BOUNDS */ "Bounds of provided memory were insufficient", + /* E_OPTION_INVALID */ "Mode or flags argument was not valid"}; + +/** + * Returns the string describing the H3Error. This string is internally + * allocated and should not be `free`d. + * @param err The H3 error. + * @return The string describing the H3Error + */ +const char *H3_EXPORT(describeH3Error)(H3Error err) { + if (err >= 0 && err <= 15) { // TODO: Better way to bounds check here? + return H3ErrorDescriptions[err]; + } else { + return "Invalid error code"; + } +} /** * Returns the H3 resolution of an H3 index. * @param h The H3 index. * @return The resolution of the H3 index argument. */ -int H3_EXPORT(h3GetResolution)(H3Index h) { return H3_GET_RESOLUTION(h); } +int H3_EXPORT(getResolution)(H3Index h) { return H3_GET_RESOLUTION(h); } /** - * Returns the H3 base cell number of an H3 index. - * @param h The H3 index. - * @return The base cell of the H3 index argument. + * Returns the H3 base cell "number" of an H3 cell (hexagon or pentagon). + * + * Note: Technically works on H3 edges, but will return base cell of the + * origin cell. + * + * @param h The H3 cell. + * @return The base cell "number" of the H3 cell argument. */ -int H3_EXPORT(h3GetBaseCell)(H3Index h) { return H3_GET_BASE_CELL(h); } +int H3_EXPORT(getBaseCellNumber)(H3Index h) { return H3_GET_BASE_CELL(h); } /** * Converts a string representation of an H3 index into an H3 index. * @param str The string representation of an H3 index. - * @return The H3 index corresponding to the string argument, or 0 if invalid. + * @param out Output: The H3 index corresponding to the string argument */ -H3Index H3_EXPORT(stringToH3)(const char* str) { - H3Index h = H3_INVALID_INDEX; - // If failed, h will be unmodified and we should return 0 anyways. - sscanf(str, "%" PRIx64, &h); - return h; +H3Error H3_EXPORT(stringToH3)(const char *str, H3Index *out) { + H3Index h = H3_NULL; + // If failed, h will be unmodified and we should return H3_NULL anyways. + int read = sscanf(str, "%" PRIx64, &h); + if (read != 1) { + return E_FAILED; + } + *out = h; + return E_SUCCESS; } /** @@ -60,50 +108,195 @@ H3Index H3_EXPORT(stringToH3)(const char* str) { * @param str The string representation of the H3 index. * @param sz Size of the buffer `str` */ -void H3_EXPORT(h3ToString)(H3Index h, char* str, size_t sz) { +H3Error H3_EXPORT(h3ToString)(H3Index h, char *str, size_t sz) { // An unsigned 64 bit integer will be expressed in at most // 16 digits plus 1 for the null terminator. if (sz < 17) { // Buffer is potentially not large enough. - return; + return E_MEMORY_BOUNDS; } sprintf(str, "%" PRIx64, h); + return E_SUCCESS; } -/** - * Returns whether or not an H3 index is valid. - * @param h The H3 index to validate. - * @return 1 if the H3 index if valid, and 0 if it is not. - */ -int H3_EXPORT(h3IsValid)(H3Index h) { - if (H3_GET_MODE(h) != H3_HEXAGON_MODE) return 0; +/* +The top 8 bits of any cell should be a specific constant: - int baseCell = H3_GET_BASE_CELL(h); - if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) return 0; +- The 1 high bit should be `0` +- The 4 mode bits should be `0001` (H3_CELL_MODE) +- The 3 reserved bits should be `000` - int res = H3_GET_RESOLUTION(h); - if (res < 0 || res > MAX_H3_RES) return 0; +In total, the top 8 bits should be `0_0001_000` +*/ +static inline bool _hasGoodTopBits(H3Index h) { + h >>= (64 - 8); + return h == 0b00001000; +} - bool foundFirstNonZeroDigit = false; - for (int r = 1; r <= res; r++) { - Direction digit = H3_GET_INDEX_DIGIT(h, r); +/* Check that no digit from 1 to `res` is 7 (INVALID_DIGIT). - if (!foundFirstNonZeroDigit && digit != CENTER_DIGIT) { - foundFirstNonZeroDigit = true; - if (_isBaseCellPentagon(baseCell) && digit == K_AXES_DIGIT) { - return 0; - } - } +MHI = 0b100100100100100100100100100100100100100100100; +MLO = MHI >> 2; + +| d | d & MHI | ~d | ~d - MLO | d & MHI & (~d - MLO) | result | +|-----|---------|-----|----------|----------------------|---------| +| 000 | 000 | | | 000 | OK | +| 001 | 000 | | | 000 | OK | +| 010 | 000 | | | 000 | OK | +| 011 | 000 | | | 000 | OK | +| 100 | 100 | 011 | 010 | 000 | OK | +| 101 | 100 | 010 | 001 | 000 | OK | +| 110 | 100 | 001 | 000 | 000 | OK | +| 111 | 100 | 000 | 111* | 100 | invalid | + + *: carry happened + + +Note: only care about identifying the *lowest* 7. + +Examples with multiple digits: + +| d | d & MHI | ~d | ~d - MLO | d & MHI & (~d - MLO) | result | +|---------|---------|---------|----------|----------------------|---------| +| 111.111 | 100.100 | 000.000 | 110.111* | 100.100 | invalid | +| 110.111 | 100.100 | 001.000 | 111.111* | 100.100 | invalid | +| 110.110 | 100.100 | 001.001 | 000.000 | 000.000 | OK | - if (digit < CENTER_DIGIT || digit >= NUM_DIGITS) return 0; + *: carry happened + +In the second example with 110.111, we "misidentify" the 110 as a 7, due +to a carry from the lower bits. But this is OK because we correctly +identify the lowest (only, in this example) 7 just before it. + +We only have to worry about carries affecting higher bits in the case of +a 7; all other digits (0--6) don't cause a carry when computing ~d - MLO. +So even though a 7 can affect the results of higher bits, this is OK +because we will always correctly identify the lowest 7. + +For further notes, see the discussion here: +https://github.com/uber/h3/pull/496#discussion_r795851046 +*/ +static inline bool _hasAny7UptoRes(H3Index h, int res) { + const uint64_t MHI = 0b100100100100100100100100100100100100100100100; + const uint64_t MLO = MHI >> 2; + + int shift = 3 * (15 - res); + h >>= shift; + h <<= shift; + h = (h & MHI & (~h - MLO)); + + return h != 0; +} + +/* Check that all unused digits after `res` are set to 7 (INVALID_DIGIT). + +Bit shift to avoid looping through digits. +*/ +static inline bool _hasAll7AfterRes(H3Index h, int res) { + // NOTE: res check is needed because we can't shift by 64 + if (res < 15) { + int shift = 19 + 3 * res; + + h = ~h; + h <<= shift; + h >>= shift; + + return h == 0; } + return true; +} + +/* +Get index of first nonzero bit of an H3Index. + +When available, use compiler intrinsics, which should be fast. +If not available, fall back to a loop. +*/ +static inline int _firstOneIndex(H3Index h) { +#if defined(__GNUC__) || defined(__clang__) + return 63 - __builtin_clzll(h); +#elif defined(_MSC_VER) && defined(_M_X64) // doesn't work on win32 + unsigned long index; + _BitScanReverse64(&index, h); + return (int)index; +#else + // Portable fallback + int pos = 63 - 19; + H3Index m = 1; + while ((h & (m << pos)) == 0) pos--; + return pos; +#endif +} - for (int r = res + 1; r <= MAX_H3_RES; r++) { - Direction digit = H3_GET_INDEX_DIGIT(h, r); - if (digit != INVALID_DIGIT) return 0; +/* +One final validation just for cells whose base cell (res 0) +is a pentagon. + +Pentagon cells start with a sequence of 0's (CENTER_DIGIT's). +The first nonzero digit can't be a 1 (i.e., "deleted subsequence", +PENTAGON_SKIPPED_DIGIT, or K_AXES_DIGIT). + +We can check that (in the lower 45 = 15*3 bits) the position of the +first 1 bit isn't divisible by 3. +*/ +static inline bool _hasDeletedSubsequence(H3Index h, int base_cell) { + // TODO: https://github.com/uber/h3/issues/984 + static const bool isBaseCellPentagonArr[128] = { + [4] = 1, [14] = 1, [24] = 1, [38] = 1, [49] = 1, [58] = 1, + [63] = 1, [72] = 1, [83] = 1, [97] = 1, [107] = 1, [117] = 1}; + + if (isBaseCellPentagonArr[base_cell]) { + h <<= 19; + h >>= 19; + + if (h == 0) return false; // all zeros: res 15 pentagon + return _firstOneIndex(h) % 3 == 0; } + return false; +} - return 1; +/** + * Returns whether or not an H3 index is a valid cell (hexagon or pentagon). + * @param h The H3 index to validate. + * @return 1 if the H3 index if valid, and 0 if it is not. + */ +int H3_EXPORT(isValidCell)(H3Index h) { + /* + Look for bit patterns that would disqualify an H3Index from + being valid. If identified, exit early. + + For reference the H3 index bit layout: + + | Region | # bits | + |------------|--------| + | High | 1 | + | Mode | 4 | + | Reserved | 3 | + | Resolution | 4 | + | Base Cell | 7 | + | Digit 1 | 3 | + | Digit 2 | 3 | + | ... | ... | + | Digit 15 | 3 | + + Speed benefits come from using bit manipulation instead of loops, + whenever possible. + */ + if (!_hasGoodTopBits(h)) return false; + + // No need to check resolution; any 4 bits give a valid resolution. + const int res = H3_GET_RESOLUTION(h); + + // Get base cell number and check that it is valid. + const int bc = H3_GET_BASE_CELL(h); + if (bc >= NUM_BASE_CELLS) return false; + + if (_hasAny7UptoRes(h, res)) return false; + if (!_hasAll7AfterRes(h, res)) return false; + if (_hasDeletedSubsequence(h, bc)) return false; + + // If no disqualifications were identified, the index is a valid H3 cell. + return true; } /** @@ -113,9 +306,9 @@ int H3_EXPORT(h3IsValid)(H3Index h) { * @param baseCell The H3 base cell to initialize the index to. * @param initDigit The H3 digit (0-7) to initialize all of the index digits to. */ -void setH3Index(H3Index* hp, int res, int baseCell, Direction initDigit) { +void setH3Index(H3Index *hp, int res, int baseCell, Direction initDigit) { H3Index h = H3_INIT; - H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_MODE(h, H3_CELL_MODE); H3_SET_RESOLUTION(h, res); H3_SET_BASE_CELL(h, baseCell); for (int r = 1; r <= res; r++) H3_SET_INDEX_DIGIT(h, r, initDigit); @@ -123,45 +316,67 @@ void setH3Index(H3Index* hp, int res, int baseCell, Direction initDigit) { } /** - * h3ToParent produces the parent index for a given H3 index + * cellToParent produces the parent index for a given H3 index * * @param h H3Index to find parent of * @param parentRes The resolution to switch to (parent, grandparent, etc) - * - * @return H3Index of the parent, or 0 if you actually asked for a child + * @param out Output: H3Index of the parent */ -H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes) { +H3Error H3_EXPORT(cellToParent)(H3Index h, int parentRes, H3Index *out) { int childRes = H3_GET_RESOLUTION(h); - if (parentRes > childRes) { - return H3_INVALID_INDEX; + if (parentRes < 0 || parentRes > MAX_H3_RES) { + return E_RES_DOMAIN; + } else if (parentRes > childRes) { + return E_RES_MISMATCH; } else if (parentRes == childRes) { - return h; - } else if (parentRes < 0 || parentRes > MAX_H3_RES) { - return H3_INVALID_INDEX; + *out = h; + return E_SUCCESS; } H3Index parentH = H3_SET_RESOLUTION(h, parentRes); for (int i = parentRes + 1; i <= childRes; i++) { H3_SET_INDEX_DIGIT(parentH, i, H3_DIGIT_MASK); } - return parentH; + *out = parentH; + return E_SUCCESS; } /** - * maxH3ToChildrenSize returns the maximum number of children possible for a - * given child level. + * Determines whether one resolution is a valid child resolution for a cell. + * Each resolution is considered a valid child resolution of itself. * - * @param h H3Index to find the number of children of - * @param childRes The resolution of the child level you're interested in + * @param h h3Index parent cell + * @param childRes int resolution of the child * - * @return int count of maximum number of children (equal for hexagons, less for - * pentagons + * @return The validity of the child resolution */ -int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes) { +static bool _hasChildAtRes(H3Index h, int childRes) { int parentRes = H3_GET_RESOLUTION(h); - if (parentRes > childRes) { - return 0; + if (childRes < parentRes || childRes > MAX_H3_RES) { + return false; + } + return true; +} + +/** + * cellToChildrenSize returns the exact number of children for a cell at a + * given child resolution. + * + * @param h H3Index to find the number of children of + * @param childRes The child resolution you're interested in + * @param out Output: exact number of children (handles hexagons and + * pentagons correctly) + */ +H3Error H3_EXPORT(cellToChildrenSize)(H3Index h, int childRes, int64_t *out) { + if (!_hasChildAtRes(h, childRes)) return E_RES_DOMAIN; + + int n = childRes - H3_GET_RESOLUTION(h); + + if (H3_EXPORT(isPentagon)(h)) { + *out = 1 + 5 * (_ipow(7, n) - 1) / 6; + } else { + *out = _ipow(7, n); } - return _ipow(7, (childRes - parentRes)); + return E_SUCCESS; } /** @@ -182,127 +397,198 @@ H3Index makeDirectChild(H3Index h, int cellNumber) { } /** - * h3ToChildren takes the given hexagon id and generates all of the children + * cellToChildren takes the given hexagon id and generates all of the children * at the specified resolution storing them into the provided memory pointer. - * It's assumed that maxH3ToChildrenSize was used to determine the allocation. + * It's assumed that cellToChildrenSize was used to determine the allocation. * * @param h H3Index to find the children of * @param childRes int the child level to produce * @param children H3Index* the memory to store the resulting addresses in */ -void H3_EXPORT(h3ToChildren)(H3Index h, int childRes, H3Index* children) { - int parentRes = H3_GET_RESOLUTION(h); - if (parentRes > childRes) { - return; - } else if (parentRes == childRes) { - *children = h; - return; - } - int bufferSize = H3_EXPORT(maxH3ToChildrenSize)(h, childRes); - int bufferChildStep = (bufferSize / 7); - int isAPentagon = H3_EXPORT(h3IsPentagon)(h); - for (int i = 0; i < 7; i++) { - if (isAPentagon && i == K_AXES_DIGIT) { - H3Index* nextChild = children + bufferChildStep; - while (children < nextChild) { - *children = H3_INVALID_INDEX; - children++; - } - } else { - H3_EXPORT(h3ToChildren)(makeDirectChild(h, i), childRes, children); - children += bufferChildStep; - } +H3Error H3_EXPORT(cellToChildren)(H3Index h, int childRes, H3Index *children) { + int64_t i = 0; + for (IterCellsChildren iter = iterInitParent(h, childRes); iter.h; + iterStepChild(&iter)) { + children[i] = iter.h; + i++; } + return E_SUCCESS; +} + +/** + * Zero out index digits from start to end, inclusive. + * No-op if start > end. + */ +H3Index _zeroIndexDigits(H3Index h, int start, int end) { + if (start > end) return h; + + H3Index m = 0; + + m = ~m; + m <<= H3_PER_DIGIT_OFFSET * (end - start + 1); + m = ~m; + m <<= H3_PER_DIGIT_OFFSET * (MAX_H3_RES - end); + m = ~m; + + return h & m; } /** - * compact takes a set of hexagons all at the same resolution and compresses - * them by pruning full child branches to the parent level. This is also done - * for all parents recursively to get the minimum number of hex addresses that - * perfectly cover the defined space. + * cellToCenterChild produces the center child index for a given H3 index at + * the specified resolution + * + * @param h H3Index to find center child of + * @param childRes The resolution to switch to + * @param child H3Index of the center child + * @return 0 (E_SUCCESS) on success + */ +H3Error H3_EXPORT(cellToCenterChild)(H3Index h, int childRes, H3Index *child) { + if (!_hasChildAtRes(h, childRes)) return E_RES_DOMAIN; + + h = _zeroIndexDigits(h, H3_GET_RESOLUTION(h) + 1, childRes); + H3_SET_RESOLUTION(h, childRes); + *child = h; + return E_SUCCESS; +} + +/** + * compactCells takes a set of hexagons all at the same resolution and + * compresses them by pruning full child branches to the parent level. This is + * also done for all parents recursively to get the minimum number of hex + * addresses that perfectly cover the defined space. * @param h3Set Set of hexagons * @param compactedSet The output array of compressed hexagons (preallocated) * @param numHexes The size of the input and output arrays (possible that no * contiguous regions exist in the set at all and no compression possible) * @return an error code on bad input data */ -int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, - const int numHexes) { +H3Error H3_EXPORT(compactCells)(const H3Index *h3Set, H3Index *compactedSet, + const int64_t numHexes) { + if (numHexes == 0) { + return E_SUCCESS; + } int res = H3_GET_RESOLUTION(h3Set[0]); if (res == 0) { // No compaction possible, just copy the set to output - for (int i = 0; i < numHexes; i++) { + for (int64_t i = 0; i < numHexes; i++) { compactedSet[i] = h3Set[i]; } - return 0; + return E_SUCCESS; + } + H3Index *remainingHexes = H3_MEMORY(malloc)(numHexes * sizeof(H3Index)); + if (!remainingHexes) { + return E_MEMORY_ALLOC; } - H3Index* remainingHexes = malloc(numHexes * sizeof(H3Index)); memcpy(remainingHexes, h3Set, numHexes * sizeof(H3Index)); - H3Index* hashSetArray = calloc(numHexes, sizeof(H3Index)); - H3Index* compactedSetOffset = compactedSet; - int numRemainingHexes = numHexes; + H3Index *hashSetArray = H3_MEMORY(calloc)(numHexes, sizeof(H3Index)); + if (!hashSetArray) { + H3_MEMORY(free)(remainingHexes); + return E_MEMORY_ALLOC; + } + H3Index *compactedSetOffset = compactedSet; + int64_t numRemainingHexes = numHexes; while (numRemainingHexes) { res = H3_GET_RESOLUTION(remainingHexes[0]); int parentRes = res - 1; - // Put the parents of the hexagons into the temp array - // via a hashing mechanism, and use the reserved bits - // to track how many times a parent is duplicated - for (int i = 0; i < numRemainingHexes; i++) { - H3Index currIndex = remainingHexes[i]; - if (currIndex != 0) { - H3Index parent = H3_EXPORT(h3ToParent)(currIndex, parentRes); - // Modulus hash the parent into the temp array - int loc = (int)(parent % numRemainingHexes); - int loopCount = 0; - while (hashSetArray[loc] != 0) { - if (loopCount > numRemainingHexes) { - // LCOV_EXCL_START - // This case should not be possible because at most one - // index is placed into hashSetArray per - // numRemainingHexes. - free(remainingHexes); - free(hashSetArray); - return -1; - // LCOV_EXCL_STOP + + // If parentRes is less than zero, we've compacted all the way up to the + // base cells. Time to process the remaining cells. + if (parentRes >= 0) { + // Put the parents of the hexagons into the temp array + // via a hashing mechanism, and use the reserved bits + // to track how many times a parent is duplicated + for (int64_t i = 0; i < numRemainingHexes; i++) { + H3Index currIndex = remainingHexes[i]; + // TODO: This case is coverable (reachable by fuzzer) + if (currIndex != 0) { + // If the reserved bits were set by the caller, the + // algorithm below may encounter undefined behavior + // because it expects to have set the reserved bits + // itself. + if (H3_GET_RESERVED_BITS(currIndex) != 0) { + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_CELL_INVALID; + } + + H3Index parent; + H3Error parentError = + H3_EXPORT(cellToParent)(currIndex, parentRes, &parent); + // Should never be reachable as a result of the compact + // algorithm. Can happen if cellToParent errors e.g. + // because of incompatible resolutions. + if (parentError) { + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return parentError; } - H3Index tempIndex = - hashSetArray[loc] & H3_RESERVED_MASK_NEGATIVE; - if (tempIndex == parent) { - int count = H3_GET_RESERVED_BITS(hashSetArray[loc]) + 1; - if (count > 7) { - // Only possible on duplicate input - free(remainingHexes); - free(hashSetArray); - return -2; + // Modulus hash the parent into the temp array + int64_t loc = (int64_t)(parent % numRemainingHexes); + int64_t loopCount = 0; + while (hashSetArray[loc] != 0) { + if (NEVER(loopCount > numRemainingHexes)) { + // This case should not be possible because at + // most one index is placed into hashSetArray + // per numRemainingHexes. + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_FAILED; + } + H3Index tempIndex = + hashSetArray[loc] & H3_RESERVED_MASK_NEGATIVE; + if (tempIndex == parent) { + int count = + H3_GET_RESERVED_BITS(hashSetArray[loc]) + 1; + int limitCount = 7; + if (H3_EXPORT(isPentagon)( + tempIndex & H3_RESERVED_MASK_NEGATIVE)) { + limitCount--; + } + // One is added to count for this check to match + // one being added to count later in this + // function when checking for all children being + // present. + if (count + 1 > limitCount) { + // Only possible on duplicate input + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_DUPLICATE_INPUT; + } + H3_SET_RESERVED_BITS(parent, count); + hashSetArray[loc] = H3_NULL; + } else { + loc = (loc + 1) % numRemainingHexes; } - H3_SET_RESERVED_BITS(parent, count); - hashSetArray[loc] = H3_INVALID_INDEX; - } else { - loc = (loc + 1) % numRemainingHexes; + loopCount++; } - loopCount++; + hashSetArray[loc] = parent; } - hashSetArray[loc] = parent; } } + // Determine which parent hexagons have a complete set // of children and put them in the compactableHexes array - int compactableCount = 0; - int maxCompactableCount = + int64_t compactableCount = 0; + int64_t maxCompactableCount = numRemainingHexes / 6; // Somehow all pentagons; conservative if (maxCompactableCount == 0) { memcpy(compactedSetOffset, remainingHexes, numRemainingHexes * sizeof(remainingHexes[0])); break; } - H3Index* compactableHexes = - malloc(maxCompactableCount * sizeof(H3Index)); - for (int i = 0; i < numRemainingHexes; i++) { + H3Index *compactableHexes = + H3_MEMORY(calloc)(maxCompactableCount, sizeof(H3Index)); + if (!compactableHexes) { + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_MEMORY_ALLOC; + } + for (int64_t i = 0; i < numRemainingHexes; i++) { if (hashSetArray[i] == 0) continue; int count = H3_GET_RESERVED_BITS(hashSetArray[i]) + 1; // Include the deleted direction for pentagons as implicitly "there" - if (H3_EXPORT(h3IsPentagon)(hashSetArray[i] & - H3_RESERVED_MASK_NEGATIVE)) { + if (H3_EXPORT(isPentagon)(hashSetArray[i] & + H3_RESERVED_MASK_NEGATIVE)) { // We need this later on, no need to recalculate H3_SET_RESERVED_BITS(hashSetArray[i], count); // Increment count after setting the reserved bits, @@ -319,41 +605,54 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, } // Uncompactable hexes are immediately copied into the // output compactedSetOffset - int uncompactableCount = 0; - for (int i = 0; i < numRemainingHexes; i++) { + int64_t uncompactableCount = 0; + for (int64_t i = 0; i < numRemainingHexes; i++) { H3Index currIndex = remainingHexes[i]; - if (currIndex != H3_INVALID_INDEX) { - H3Index parent = H3_EXPORT(h3ToParent)(currIndex, parentRes); - // Modulus hash the parent into the temp array - // to determine if this index was included in - // the compactableHexes array - int loc = (int)(parent % numRemainingHexes); - int loopCount = 0; + // TODO: This case is coverable (reachable by fuzzer) + if (currIndex != H3_NULL) { bool isUncompactable = true; - do { - if (loopCount > numRemainingHexes) { - // LCOV_EXCL_START - // This case should not be possible because at most one - // index is placed into hashSetArray per input hexagon. - free(compactableHexes); - free(remainingHexes); - free(hashSetArray); - return -1; // Only possible on duplicate input - // LCOV_EXCL_STOP + // Resolution 0 cells always uncompactable, and trying to take + // the res -1 parent of a cell is invalid. + if (parentRes >= 0) { + H3Index parent; + H3Error parentError = + H3_EXPORT(cellToParent)(currIndex, parentRes, &parent); + if (NEVER(parentError)) { + H3_MEMORY(free)(compactableHexes); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return parentError; } - H3Index tempIndex = - hashSetArray[loc] & H3_RESERVED_MASK_NEGATIVE; - if (tempIndex == parent) { - int count = H3_GET_RESERVED_BITS(hashSetArray[loc]) + 1; - if (count == 7) { - isUncompactable = false; + // Modulus hash the parent into the temp array + // to determine if this index was included in + // the compactableHexes array + int64_t loc = (int64_t)(parent % numRemainingHexes); + int64_t loopCount = 0; + do { + if (NEVER(loopCount > numRemainingHexes)) { + // This case should not be possible because at most + // one index is placed into hashSetArray per input + // hexagon. + H3_MEMORY(free)(compactableHexes); + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_FAILED; } - break; - } else { - loc = (loc + 1) % numRemainingHexes; - } - loopCount++; - } while (hashSetArray[loc] != parent); + H3Index tempIndex = + hashSetArray[loc] & H3_RESERVED_MASK_NEGATIVE; + if (tempIndex == parent) { + int count = + H3_GET_RESERVED_BITS(hashSetArray[loc]) + 1; + if (count == 7) { + isUncompactable = false; + } + break; + } else { + loc = (loc + 1) % numRemainingHexes; + } + loopCount++; + } while (hashSetArray[loc] != parent); + } if (isUncompactable) { compactedSetOffset[uncompactableCount] = remainingHexes[i]; uncompactableCount++; @@ -366,105 +665,90 @@ int H3_EXPORT(compact)(const H3Index* h3Set, H3Index* compactedSet, memcpy(remainingHexes, compactableHexes, compactableCount * sizeof(H3Index)); numRemainingHexes = compactableCount; - free(compactableHexes); - } - free(remainingHexes); - free(hashSetArray); - return 0; -} - -/** - * uncompact takes a compressed set of hexagons and expands back to the - * original set of hexagons. - * @param compactedSet Set of hexagons - * @param numHexes The number of hexes in the input set - * @param h3Set Output array of decompressed hexagons (preallocated) - * @param maxHexes The size of the output array to bound check against - * @param res The hexagon resolution to decompress to - * @return An error code if output array is too small or any hexagon is - * smaller than the output resolution. - */ -int H3_EXPORT(uncompact)(const H3Index* compactedSet, const int numHexes, - H3Index* h3Set, const int maxHexes, const int res) { - int outOffset = 0; - for (int i = 0; i < numHexes; i++) { - if (outOffset >= maxHexes) { - // We went too far, abort! - return -1; - } - if (compactedSet[i] == 0) continue; - int currentRes = H3_GET_RESOLUTION(compactedSet[i]); - if (currentRes > res) { - // Nonsensical. Abort. - return -2; - } - if (currentRes == res) { - // Just copy and move along - h3Set[outOffset] = compactedSet[i]; - outOffset++; - } else { - // Bigger hexagon to reduce in size - int numHexesToGen = - H3_EXPORT(maxH3ToChildrenSize)(compactedSet[i], res); - if (outOffset + numHexesToGen > maxHexes) { - // We're about to go too far, abort! - return -1; - } - H3_EXPORT(h3ToChildren)(compactedSet[i], res, h3Set + outOffset); - outOffset += numHexesToGen; - } + H3_MEMORY(free)(compactableHexes); } - return 0; + H3_MEMORY(free)(remainingHexes); + H3_MEMORY(free)(hashSetArray); + return E_SUCCESS; } /** - * maxUncompactSize takes a compacted set of hexagons are provides an - * upper-bound estimate of the size of the uncompacted set of hexagons. - * @param compactedSet Set of hexagons - * @param numHexes The number of hexes in the input set - * @param res The hexagon resolution to decompress to - * @return The number of hexagons to allocate memory for, or a negative - * number if an error occurs. + * uncompactCells takes a compressed set of cells and expands back to the + * original set of cells. + * + * Skips elements that are H3_NULL (i.e., 0). + * + * @param compactedSet Set of compacted cells + * @param numCompacted The number of cells in the input compacted set + * @param outSet Output array for decompressed cells (preallocated) + * @param numOut The size of the output array to bound check against + * @param res The H3 resolution to decompress to + * @return An error code if output array is too small or any cell + * is smaller than the output resolution. */ -int H3_EXPORT(maxUncompactSize)(const H3Index* compactedSet, const int numHexes, - const int res) { - int maxNumHexagons = 0; - for (int i = 0; i < numHexes; i++) { - if (compactedSet[i] == 0) continue; - int currentRes = H3_GET_RESOLUTION(compactedSet[i]); - if (currentRes > res) { - // Nonsensical. Abort. - return -1; +H3Error H3_EXPORT(uncompactCells)(const H3Index *compactedSet, + const int64_t numCompacted, H3Index *outSet, + const int64_t numOut, const int res) { + int64_t i = 0; + + for (int64_t j = 0; j < numCompacted; j++) { + if (!_hasChildAtRes(compactedSet[j], res)) return E_RES_MISMATCH; + + for (IterCellsChildren iter = iterInitParent(compactedSet[j], res); + iter.h; i++, iterStepChild(&iter)) { + if (i >= numOut) return E_MEMORY_BOUNDS; // went too far; abort! + outSet[i] = iter.h; } - if (currentRes == res) { - maxNumHexagons++; - } else { - // Bigger hexagon to reduce in size - int numHexesToGen = - H3_EXPORT(maxH3ToChildrenSize)(compactedSet[i], res); - maxNumHexagons += numHexesToGen; + } + return E_SUCCESS; +} + +/** + * uncompactCellsSize takes a compacted set of hexagons and provides + * the exact size of the uncompacted set of hexagons. + * + * @param compactedSet Set of hexagons + * @param numCompacted The number of hexes in the input set + * @param res The hexagon resolution to decompress to + * @param out The number of hexagons to allocate memory for + * @returns E_SUCCESS on success, or another value on error + */ +H3Error H3_EXPORT(uncompactCellsSize)(const H3Index *compactedSet, + const int64_t numCompacted, const int res, + int64_t *out) { + int64_t numOut = 0; + for (int64_t i = 0; i < numCompacted; i++) { + if (compactedSet[i] == H3_NULL) continue; + + int64_t childrenSize; + H3Error childrenError = + H3_EXPORT(cellToChildrenSize)(compactedSet[i], res, &childrenSize); + if (childrenError) { + // The parent res does not contain `res`. + return E_RES_MISMATCH; } + numOut += childrenSize; } - return maxNumHexagons; + *out = numOut; + return E_SUCCESS; } /** - * h3IsResClassIII takes a hexagon ID and determines if it is in a + * isResClassIII takes a hexagon ID and determines if it is in a * Class III resolution (rotated versus the icosahedron and subject * to shape distortion adding extra points on icosahedron edges, making * them not true hexagons). * @param h The H3Index to check. * @return Returns 1 if the hexagon is class III, otherwise 0. */ -int H3_EXPORT(h3IsResClassIII)(H3Index h) { return H3_GET_RESOLUTION(h) % 2; } +int H3_EXPORT(isResClassIII)(H3Index h) { return H3_GET_RESOLUTION(h) % 2; } /** - * h3IsPentagon takes an H3Index and determines if it is actually a - * pentagon. + * isPentagon takes an H3Index and determines if it is actually a pentagon. * @param h The H3Index to check. * @return Returns 1 if it is a pentagon, otherwise 0. */ -int H3_EXPORT(h3IsPentagon)(H3Index h) { +int H3_EXPORT(isPentagon)(H3Index h) { return _isBaseCellPentagon(H3_GET_BASE_CELL(h)) && !_h3LeadingNonZeroDigit(h); } @@ -562,12 +846,12 @@ H3Index _h3Rotate60cw(H3Index h) { * Convert an FaceIJK address to the corresponding H3Index. * @param fijk The FaceIJK address. * @param res The cell resolution. - * @return The encoded H3Index (or 0 on failure). + * @return The encoded H3Index (or H3_NULL on failure). */ -H3Index _faceIjkToH3(const FaceIJK* fijk, int res) { +H3Index _faceIjkToH3(const FaceIJK *fijk, int res) { // initialize the index H3Index h = H3_INIT; - H3_SET_MODE(h, H3_HEXAGON_MODE); + H3_SET_MODE(h, H3_CELL_MODE); H3_SET_RESOLUTION(h, res); // check for res 0/base cell @@ -575,7 +859,7 @@ H3Index _faceIjkToH3(const FaceIJK* fijk, int res) { if (fijk->coord.i > MAX_FACE_COORD || fijk->coord.j > MAX_FACE_COORD || fijk->coord.k > MAX_FACE_COORD) { // out of range input - return H3_INVALID_INDEX; + return H3_NULL; } H3_SET_BASE_CELL(h, _faceIjkToBaseCell(fijk)); @@ -590,11 +874,11 @@ H3Index _faceIjkToH3(const FaceIJK* fijk, int res) { // build the H3Index from finest res up // adjust r for the fact that the res 0 base cell offsets the indexing // digits - CoordIJK* ijk = &fijkBC.coord; + CoordIJK *ijk = &fijkBC.coord; for (int r = res - 1; r >= 0; r--) { CoordIJK lastIJK = *ijk; CoordIJK lastCenter; - if (isResClassIII(r + 1)) { + if (isResolutionClassIII(r + 1)) { // rotate ccw _upAp7(ijk); lastCenter = *ijk; @@ -619,7 +903,7 @@ H3Index _faceIjkToH3(const FaceIJK* fijk, int res) { if (fijkBC.coord.i > MAX_FACE_COORD || fijkBC.coord.j > MAX_FACE_COORD || fijkBC.coord.k > MAX_FACE_COORD) { // out of range input - return H3_INVALID_INDEX; + return H3_NULL; } // lookup the correct base cell @@ -658,19 +942,25 @@ H3Index _faceIjkToH3(const FaceIJK* fijk, int res) { * * @param g The spherical coordinates to encode. * @param res The desired H3 resolution for the encoding. - * @return The encoded H3Index (or 0 on failure). + * @param out The encoded H3Index. + * @returns E_SUCCESS (0) on success, another value otherwise */ -H3Index H3_EXPORT(geoToH3)(const GeoCoord* g, int res) { +H3Error H3_EXPORT(latLngToCell)(const LatLng *g, int res, H3Index *out) { if (res < 0 || res > MAX_H3_RES) { - return H3_INVALID_INDEX; + return E_RES_DOMAIN; } - if (!isfinite(g->lat) || !isfinite(g->lon)) { - return H3_INVALID_INDEX; + if (!isfinite(g->lat) || !isfinite(g->lng)) { + return E_LATLNG_DOMAIN; } FaceIJK fijk; _geoToFaceIjk(g, res, &fijk); - return _faceIjkToH3(&fijk, res); + *out = _faceIjkToH3(&fijk, res); + if (ALWAYS(*out)) { + return E_SUCCESS; + } else { + return E_FAILED; + } } /** @@ -680,8 +970,8 @@ H3Index H3_EXPORT(geoToH3)(const GeoCoord* g, int res) { * and normalized base cell coordinates. * @return Returns 1 if the possibility of overage exists, otherwise 0. */ -int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk) { - CoordIJK* ijk = &fijk->coord; +int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK *fijk) { + CoordIJK *ijk = &fijk->coord; int res = H3_GET_RESOLUTION(h); // center base cell hierarchy is entirely on this face @@ -692,7 +982,7 @@ int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk) { possibleOverage = 0; for (int r = 1; r <= res; r++) { - if (isResClassIII(r)) { + if (isResolutionClassIII(r)) { // Class III == rotate ccw _downAp7(ijk); } else { @@ -711,8 +1001,15 @@ int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk) { * @param h The H3Index. * @param fijk The corresponding FaceIJK address. */ -void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { +H3Error _h3ToFaceIjk(H3Index h, FaceIJK *fijk) { int baseCell = H3_GET_BASE_CELL(h); + if (NEVER(baseCell < 0) || baseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + // To prevent reading uninitialized memory, we zero the output. + fijk->face = 0; + fijk->coord.i = fijk->coord.j = fijk->coord.k = 0; + return E_CELL_INVALID; + } // adjust for the pentagonal missing sequence; all of sub-sequence 5 needs // to be adjusted (and some of sub-sequence 4 below) if (_isBaseCellPentagon(baseCell) && _h3LeadingNonZeroDigit(h) == 5) @@ -721,7 +1018,7 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { // start with the "home" face and ijk+ coordinates for the base cell of c *fijk = baseCellData[baseCell].homeFijk; if (!_h3ToFaceIjkWithInitializedFijk(h, fijk)) - return; // no overage is possible; h lies on this face + return E_SUCCESS; // no overage is possible; h lies on this face // if we're here we have the potential for an "overage"; i.e., it is // possible that c lies on an adjacent face @@ -730,7 +1027,7 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { // if we're in Class III, drop into the next finer Class II grid int res = H3_GET_RESOLUTION(h); - if (isResClassIII(res)) { + if (isResolutionClassIII(res)) { // Class III _downAp7r(&fijk->coord); res++; @@ -740,19 +1037,19 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { // a pentagon base cell with a leading 4 digit requires special handling int pentLeading4 = (_isBaseCellPentagon(baseCell) && _h3LeadingNonZeroDigit(h) == 4); - if (_adjustOverageClassII(fijk, res, pentLeading4, 0)) { + if (_adjustOverageClassII(fijk, res, pentLeading4, 0) != NO_OVERAGE) { // if the base cell is a pentagon we have the potential for secondary // overages if (_isBaseCellPentagon(baseCell)) { - while (1) { - if (!_adjustOverageClassII(fijk, res, 0, 0)) break; - } + while (_adjustOverageClassII(fijk, res, 0, 0) != NO_OVERAGE) + continue; } if (res != H3_GET_RESOLUTION(h)) _upAp7r(&fijk->coord); } else if (res != H3_GET_RESOLUTION(h)) { fijk->coord = origIJK; } + return E_SUCCESS; } /** @@ -761,23 +1058,161 @@ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) { * @param h3 The H3 index. * @param g The spherical coordinates of the H3 cell center. */ -void H3_EXPORT(h3ToGeo)(H3Index h3, GeoCoord* g) { +H3Error H3_EXPORT(cellToLatLng)(H3Index h3, LatLng *g) { FaceIJK fijk; - _h3ToFaceIjk(h3, &fijk); + H3Error e = _h3ToFaceIjk(h3, &fijk); + if (e) { + return e; + } _faceIjkToGeo(&fijk, H3_GET_RESOLUTION(h3), g); + return E_SUCCESS; } /** * Determines the cell boundary in spherical coordinates for an H3 index. * * @param h3 The H3 index. - * @param gb The boundary of the H3 cell in spherical coordinates. + * @param cb The boundary of the H3 cell in spherical coordinates. + */ +H3Error H3_EXPORT(cellToBoundary)(H3Index h3, CellBoundary *cb) { + FaceIJK fijk; + H3Error e = _h3ToFaceIjk(h3, &fijk); + if (e) { + return e; + } + if (H3_EXPORT(isPentagon)(h3)) { + _faceIjkPentToCellBoundary(&fijk, H3_GET_RESOLUTION(h3), 0, + NUM_PENT_VERTS, cb); + } else { + _faceIjkToCellBoundary(&fijk, H3_GET_RESOLUTION(h3), 0, NUM_HEX_VERTS, + cb); + } + return E_SUCCESS; +} + +/** + * Returns the max number of possible icosahedron faces an H3 index + * may intersect. + * + * @return int count of faces + */ +H3Error H3_EXPORT(maxFaceCount)(H3Index h3, int *out) { + // a pentagon always intersects 5 faces, a hexagon never intersects more + // than 2 (but may only intersect 1) + *out = H3_EXPORT(isPentagon)(h3) ? 5 : 2; + return E_SUCCESS; +} + +/** + * Find all icosahedron faces intersected by a given H3 index, represented + * as integers from 0-19. The array is sparse; since 0 is a valid value, + * invalid array values are represented as -1. It is the responsibility of + * the caller to filter out invalid values. + * + * @param h3 The H3 index + * @param out Output array. Must be of size maxFaceCount(h3). */ -void H3_EXPORT(h3ToGeoBoundary)(H3Index h3, GeoBoundary* gb) { +H3Error H3_EXPORT(getIcosahedronFaces)(H3Index h3, int *out) { + int res = H3_GET_RESOLUTION(h3); + int isPent = H3_EXPORT(isPentagon)(h3); + + // We can't use the vertex-based approach here for class II pentagons, + // because all their vertices are on the icosahedron edges. Their + // direct child pentagons cross the same faces, so use those instead. + if (isPent && !isResolutionClassIII(res)) { + // Note that this would not work for res 15, but this is only run on + // Class II pentagons, it should never be invoked for a res 15 index. + H3Index childPentagon = makeDirectChild(h3, 0); + return H3_EXPORT(getIcosahedronFaces)(childPentagon, out); + } + + // convert to FaceIJK FaceIJK fijk; - _h3ToFaceIjk(h3, &fijk); - _faceIjkToGeoBoundary(&fijk, H3_GET_RESOLUTION(h3), - H3_EXPORT(h3IsPentagon)(h3), gb); + H3Error err = _h3ToFaceIjk(h3, &fijk); + if (err) { + return err; + } + + // Get all vertices as FaceIJK addresses. For simplicity, always + // initialize the array with 6 verts, ignoring the last one for pentagons + FaceIJK fijkVerts[NUM_HEX_VERTS]; + int vertexCount; + + if (isPent) { + vertexCount = NUM_PENT_VERTS; + _faceIjkPentToVerts(&fijk, &res, fijkVerts); + } else { + vertexCount = NUM_HEX_VERTS; + _faceIjkToVerts(&fijk, &res, fijkVerts); + } + + // We may not use all of the slots in the output array, + // so fill with invalid values to indicate unused slots + int faceCount; + H3Error maxFaceCountError = H3_EXPORT(maxFaceCount)(h3, &faceCount); + if (NEVER(maxFaceCountError != E_SUCCESS)) { + return maxFaceCountError; + } + for (int i = 0; i < faceCount; i++) { + out[i] = INVALID_FACE; + } + + // add each vertex face, using the output array as a hash set + for (int i = 0; i < vertexCount; i++) { + FaceIJK *vert = &fijkVerts[i]; + + // Adjust overage, determining whether this vertex is + // on another face + if (isPent) { + _adjustPentVertOverage(vert, res); + } else { + _adjustOverageClassII(vert, res, 0, 1); + } + + // Save the face to the output array + int face = vert->face; + int pos = 0; + // Find the first empty output position, or the first position + // matching the current face + while (out[pos] != INVALID_FACE && out[pos] != face) { + pos++; + if (pos >= faceCount) { + // Mismatch between the heuristic used in maxFaceCount and + // calculation here - indicates an invalid index. + return E_FAILED; + } + } + out[pos] = face; + } + return E_SUCCESS; +} + +/** + * pentagonCount returns the number of pentagons (same at any resolution) + * + * @return int count of pentagon indexes + */ +int H3_EXPORT(pentagonCount)(void) { return NUM_PENTAGONS; } + +/** + * Generates all pentagons at the specified resolution + * + * @param res The resolution to produce pentagons at. + * @param out Output array. Must be of size pentagonCount(). + */ +H3Error H3_EXPORT(getPentagons)(int res, H3Index *out) { + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + int i = 0; + for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { + if (_isBaseCellPentagon(bc)) { + H3Index pentagon; + setH3Index(&pentagon, res, bc, 0); + out[i++] = pentagon; + } + } + return E_SUCCESS; } /** @@ -787,4 +1222,172 @@ void H3_EXPORT(h3ToGeoBoundary)(H3Index h3, GeoBoundary* gb) { * @return 1 if the resolution is a Class III grid, and 0 if the resolution is * a Class II grid. */ -int isResClassIII(int res) { return res % 2; } +int isResolutionClassIII(int res) { return res % 2; } + +/** + * Validate a child position in the context of a given parent, returning + * an error if validation fails. + */ +static H3Error validateChildPos(int64_t childPos, H3Index parent, + int childRes) { + int64_t maxChildCount; + H3Error sizeError = + H3_EXPORT(cellToChildrenSize)(parent, childRes, &maxChildCount); + if (NEVER(sizeError)) { + return sizeError; + } + if (childPos < 0 || childPos >= maxChildCount) { + return E_DOMAIN; + } + return E_SUCCESS; +} + +/** + * Returns the position of the cell within an ordered list of all children of + * the cell's parent at the specified resolution + * @param child Child cell index + * @param parentRes Resolution of the parent cell to find the position within + * @param out Output: The position of the child cell within its parents cell + * list of children + */ +H3Error H3_EXPORT(cellToChildPos)(H3Index child, int parentRes, int64_t *out) { + int childRes = H3_GET_RESOLUTION(child); + // Get the parent at res. This will catch any resolution errors + H3Index originalParent; + H3Error parentError = + H3_EXPORT(cellToParent(child, parentRes, &originalParent)); + if (parentError) { + return parentError; + } + + // Define the initial parent. Note that these variables are reassigned + // within the loop. + H3Index parent = originalParent; + int parentIsPentagon = H3_EXPORT(isPentagon)(parent); + + // Walk up the resolution digits, incrementing the index + *out = 0; + if (parentIsPentagon) { + // Pentagon logic. Pentagon parents skip the 1 digit, so the offsets are + // different from hexagons + for (int res = childRes; res > parentRes; res--) { + H3Error parentError = + H3_EXPORT(cellToParent(child, res - 1, &parent)); + if (NEVER(parentError)) { + return parentError; + } + + parentIsPentagon = H3_EXPORT(isPentagon)(parent); + int rawDigit = H3_GET_INDEX_DIGIT(child, res); + // Validate the digit before proceeding + if (rawDigit == INVALID_DIGIT || + (parentIsPentagon && rawDigit == K_AXES_DIGIT)) { + return E_CELL_INVALID; + } + int digit = + parentIsPentagon && rawDigit > 0 ? rawDigit - 1 : rawDigit; + if (digit != CENTER_DIGIT) { + int64_t hexChildCount = _ipow(7, childRes - res); + // The offset for the 0-digit slot depends on whether the + // current index is the child of a pentagon. If so, the offset + // is based on the count of pentagon children, otherwise, + // hexagon children. + *out += (parentIsPentagon + ? // pentagon children. See the explanation + // for getNumCells in h3api.h.in + 1 + (5 * (hexChildCount - 1)) / 6 + : // one hexagon's children + hexChildCount) + + // the other hexagon children + (digit - 1) * hexChildCount; + } + } + } else { + // Hexagon logic. Offsets are simple powers of 7 + for (int res = childRes; res > parentRes; res--) { + int digit = H3_GET_INDEX_DIGIT(child, res); + if (digit == INVALID_DIGIT) { + return E_CELL_INVALID; + } + *out += digit * _ipow(7, childRes - res); + } + } + + if (NEVER(validateChildPos(*out, originalParent, childRes))) { + // This is the result of an internal error, so return E_FAILED + // instead of the validation error + return E_FAILED; + } + + return E_SUCCESS; +} + +/** + * Returns the child cell at a given position within an ordered list of all + * children at the specified resolution + * @param childPos Position within the ordered list + * @param parent Parent cell of the cell index to find + * @param childRes Resolution of the child cell index + * @param child Output: child cell index + */ +H3Error H3_EXPORT(childPosToCell)(int64_t childPos, H3Index parent, + int childRes, H3Index *child) { + // Validate resolution + if (childRes < 0 || childRes > MAX_H3_RES) { + return E_RES_DOMAIN; + } + // Validate parent resolution + int parentRes = H3_GET_RESOLUTION(parent); + if (childRes < parentRes) { + return E_RES_MISMATCH; + } + // Validate child pos + H3Error childPosErr = validateChildPos(childPos, parent, childRes); + if (childPosErr) { + return childPosErr; + } + + int resOffset = childRes - parentRes; + + *child = parent; + int64_t idx = childPos; + + H3_SET_RESOLUTION(*child, childRes); + + if (H3_EXPORT(isPentagon)(parent)) { + // Pentagon tile logic. Pentagon tiles skip the 1 digit, so the offsets + // are different + bool inPent = true; + for (int res = 1; res <= resOffset; res++) { + int64_t resWidth = _ipow(7, resOffset - res); + if (inPent) { + // While we are inside a parent pentagon, we need to check if + // this cell is a pentagon, and if not, we need to offset its + // digit to account for the skipped direction + int64_t pentWidth = 1 + (5 * (resWidth - 1)) / 6; + if (idx < pentWidth) { + H3_SET_INDEX_DIGIT(*child, parentRes + res, 0); + } else { + idx -= pentWidth; + inPent = false; + H3_SET_INDEX_DIGIT(*child, parentRes + res, + (idx / resWidth) + 2); + idx %= resWidth; + } + } else { + // We're no longer inside a pentagon, continue as for hex + H3_SET_INDEX_DIGIT(*child, parentRes + res, idx / resWidth); + idx %= resWidth; + } + } + } else { + // Hexagon tile logic. Offsets are simple powers of 7 + for (int res = 1; res <= resOffset; res++) { + int64_t resWidth = _ipow(7, resOffset - res); + H3_SET_INDEX_DIGIT(*child, parentRes + res, idx / resWidth); + idx %= resWidth; + } + } + + return E_SUCCESS; +} diff --git a/src/h3lib/lib/h3UniEdge.c b/src/h3lib/lib/h3UniEdge.c deleted file mode 100644 index c36453e5e..000000000 --- a/src/h3lib/lib/h3UniEdge.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** @file h3UniEdge.c - * @brief H3UniEdge functions for manipulating unidirectional edge indexes. - */ - -#include -#include -#include "algos.h" -#include "constants.h" -#include "coordijk.h" -#include "geoCoord.h" -#include "h3Index.h" - -/** - * Returns whether or not the provided H3Indexes are neighbors. - * @param origin The origin H3 index. - * @param destination The destination H3 index. - * @return 1 if the indexes are neighbors, 0 otherwise; - */ -int H3_EXPORT(h3IndexesAreNeighbors)(H3Index origin, H3Index destination) { - // Make sure they're hexagon indexes - if (H3_GET_MODE(origin) != H3_HEXAGON_MODE || - H3_GET_MODE(destination) != H3_HEXAGON_MODE) { - return 0; - } - - // Hexagons cannot be neighbors with themselves - if (origin == destination) { - return 0; - } - - // Only hexagons in the same resolution can be neighbors - if (H3_GET_RESOLUTION(origin) != H3_GET_RESOLUTION(destination)) { - return 0; - } - - // H3 Indexes that share the same parent are very likely to be neighbors - // Child 0 is neighbor with all of its parent's 'offspring', the other - // children are neighbors with 3 of the 7 children. So a simple comparison - // of origin and destination parents and then a lookup table of the children - // is a super-cheap way to possibly determine they are neighbors. - int parentRes = H3_GET_RESOLUTION(origin) - 1; - if (parentRes > 0 && (H3_EXPORT(h3ToParent)(origin, parentRes) == - H3_EXPORT(h3ToParent)(destination, parentRes))) { - Direction originResDigit = H3_GET_INDEX_DIGIT(origin, parentRes + 1); - Direction destinationResDigit = - H3_GET_INDEX_DIGIT(destination, parentRes + 1); - if (originResDigit == CENTER_DIGIT || - destinationResDigit == CENTER_DIGIT) { - return 1; - } - // These sets are the relevant neighbors in the clockwise - // and counter-clockwise - const Direction neighborSetClockwise[] = { - CENTER_DIGIT, JK_AXES_DIGIT, IJ_AXES_DIGIT, J_AXES_DIGIT, - IK_AXES_DIGIT, K_AXES_DIGIT, I_AXES_DIGIT}; - const Direction neighborSetCounterclockwise[] = { - CENTER_DIGIT, IK_AXES_DIGIT, JK_AXES_DIGIT, K_AXES_DIGIT, - IJ_AXES_DIGIT, I_AXES_DIGIT, J_AXES_DIGIT}; - if (neighborSetClockwise[originResDigit] == destinationResDigit || - neighborSetCounterclockwise[originResDigit] == - destinationResDigit) { - return 1; - } - } - - // Otherwise, we have to determine the neighbor relationship the "hard" way. - H3Index neighborRing[7] = {0}; - H3_EXPORT(kRing)(origin, 1, neighborRing); - for (int i = 0; i < 7; i++) { - if (neighborRing[i] == destination) { - return 1; - } - } - - // Made it here, they definitely aren't neighbors - return 0; -} - -/** - * Returns a unidirectional edge H3 index based on the provided origin and - * destination - * @param origin The origin H3 hexagon index - * @param destination The destination H3 hexagon index - * @return The unidirectional edge H3Index, or 0 on failure. - */ -H3Index H3_EXPORT(getH3UnidirectionalEdge)(H3Index origin, - H3Index destination) { - // Short-circuit and return an invalid index value if they are not neighbors - if (H3_EXPORT(h3IndexesAreNeighbors)(origin, destination) == 0) { - return H3_INVALID_INDEX; - } - - // Otherwise, determine the IJK direction from the origin to the destination - H3Index output = origin; - H3_SET_MODE(output, H3_UNIEDGE_MODE); - - // Checks each neighbor, in order, to determine which direction the - // destination neighbor is located. Skips CENTER_DIGIT since that - // would be this index. - H3Index neighbor; - for (Direction direction = K_AXES_DIGIT; direction < NUM_DIGITS; - direction++) { - int rotations = 0; - neighbor = h3NeighborRotations(origin, direction, &rotations); - if (neighbor == destination) { - H3_SET_RESERVED_BITS(output, direction); - return output; - } - } - - // This should be impossible, return an invalid H3Index in this case; - return H3_INVALID_INDEX; // LCOV_EXCL_LINE -} - -/** - * Returns the origin hexagon from the unidirectional edge H3Index - * @param edge The edge H3 index - * @return The origin H3 hexagon index - */ -H3Index H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(H3Index edge) { - if (H3_GET_MODE(edge) != H3_UNIEDGE_MODE) { - return H3_INVALID_INDEX; - } - H3Index origin = edge; - H3_SET_MODE(origin, H3_HEXAGON_MODE); - H3_SET_RESERVED_BITS(origin, 0); - return origin; -} - -/** - * Returns the destination hexagon from the unidirectional edge H3Index - * @param edge The edge H3 index - * @return The destination H3 hexagon index - */ -H3Index H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(H3Index edge) { - if (H3_GET_MODE(edge) != H3_UNIEDGE_MODE) { - return H3_INVALID_INDEX; - } - Direction direction = H3_GET_RESERVED_BITS(edge); - int rotations = 0; - H3Index destination = h3NeighborRotations( - H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(edge), direction, - &rotations); - return destination; -} - -/** - * Determines if the provided H3Index is a valid unidirectional edge index - * @param edge The unidirectional edge H3Index - * @return 1 if it is a unidirectional edge H3Index, otherwise 0. - */ -int H3_EXPORT(h3UnidirectionalEdgeIsValid)(H3Index edge) { - if (H3_GET_MODE(edge) != H3_UNIEDGE_MODE) { - return 0; - } - - Direction neighborDirection = H3_GET_RESERVED_BITS(edge); - if (neighborDirection <= CENTER_DIGIT || neighborDirection >= NUM_DIGITS) { - return 0; - } - - H3Index origin = H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(edge); - if (H3_EXPORT(h3IsPentagon)(origin) && neighborDirection == K_AXES_DIGIT) { - return 0; - } - - return H3_EXPORT(h3IsValid)(origin); -} - -/** - * Returns the origin, destination pair of hexagon IDs for the given edge ID - * @param edge The unidirectional edge H3Index - * @param originDestination Pointer to memory to store origin and destination - * IDs - */ -void H3_EXPORT(getH3IndexesFromUnidirectionalEdge)(H3Index edge, - H3Index* originDestination) { - originDestination[0] = - H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(edge); - originDestination[1] = - H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(edge); -} - -/** - * Provides all of the unidirectional edges from the current H3Index. - * @param origin The origin hexagon H3Index to find edges for. - * @param edges The memory to store all of the edges inside. - */ -void H3_EXPORT(getH3UnidirectionalEdgesFromHexagon)(H3Index origin, - H3Index* edges) { - // Determine if the origin is a pentagon and special treatment needed. - int isPentagon = H3_EXPORT(h3IsPentagon)(origin); - - // This is actually quite simple. Just modify the bits of the origin - // slightly for each direction, except the 'k' direction in pentagons, - // which is zeroed. - for (int i = 0; i < 6; i++) { - if (isPentagon && i == 0) { - edges[i] = H3_INVALID_INDEX; - } else { - edges[i] = origin; - H3_SET_MODE(edges[i], H3_UNIEDGE_MODE); - H3_SET_RESERVED_BITS(edges[i], i + 1); - } - } -} - -/** - * Whether the given coordinate has a matching vertex in the given geo boundary. - * @param vertex Coordinate to check - * @param boundary Geo boundary to look in - * @return Whether a match was found - */ -static bool _hasMatchingVertex(const GeoCoord* vertex, - const GeoBoundary* boundary) { - for (int i = 0; i < boundary->numVerts; i++) { - if (geoAlmostEqualThreshold(vertex, &boundary->verts[i], 0.000001)) { - return true; - } - } - return false; -} - -/** - * Provides the coordinates defining the unidirectional edge. - * @param edge The unidirectional edge H3Index - * @param gb The geoboundary object to store the edge coordinates. - */ -void H3_EXPORT(getH3UnidirectionalEdgeBoundary)(H3Index edge, GeoBoundary* gb) { - // TODO: More efficient solution :) - GeoBoundary origin = {0}; - GeoBoundary destination = {0}; - GeoCoord postponedVertex = {0}; - bool hasPostponedVertex = false; - - H3_EXPORT(h3ToGeoBoundary) - (H3_EXPORT(getOriginH3IndexFromUnidirectionalEdge)(edge), &origin); - H3_EXPORT(h3ToGeoBoundary) - (H3_EXPORT(getDestinationH3IndexFromUnidirectionalEdge)(edge), - &destination); - - int k = 0; - for (int i = 0; i < origin.numVerts; i++) { - if (_hasMatchingVertex(&origin.verts[i], &destination)) { - // If we are on vertex 0, we need to handle the case where it's the - // end of the edge, not the beginning. - if (i == 0 && - !_hasMatchingVertex(&origin.verts[i + 1], &destination)) { - postponedVertex = origin.verts[i]; - hasPostponedVertex = true; - } else { - gb->verts[k] = origin.verts[i]; - k++; - } - } - } - // If we postponed adding the last vertex, add it now - if (hasPostponedVertex) { - gb->verts[k] = postponedVertex; - k++; - } - gb->numVerts = k; -} diff --git a/src/h3lib/lib/iterators.c b/src/h3lib/lib/iterators.c new file mode 100644 index 000000000..ef4d1a785 --- /dev/null +++ b/src/h3lib/lib/iterators.c @@ -0,0 +1,330 @@ +/* + * Copyright 2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file IterCellsChildren.c + * @brief Iterator structs and functions for the children of a cell, + * or cells at a given resolution. + */ + +#include "iterators.h" + +#include "h3Index.h" + +// extract the `res` digit (0--7) of the current cell +static int _getResDigit(IterCellsChildren *it, int res) { + return H3_GET_INDEX_DIGIT(it->h, res); +} + +// increment the digit (0--7) at location `res` +// H3_PER_DIGIT_OFFSET == 3 +static void _incrementResDigit(IterCellsChildren *it, int res) { + H3Index val = 1; + val <<= H3_PER_DIGIT_OFFSET * (MAX_H3_RES - res); + it->h += val; +} + +/** + * Create a fully nulled-out child iterator for when an iterator is exhausted. + * This helps minimize the chance that a user will depend on the iterator + * internal state after it's exhausted, like the child resolution, for + * example. + */ +static IterCellsChildren _null_iter(void) { + return (IterCellsChildren){ + .h = H3_NULL, ._parentRes = -1, ._skipDigit = -1}; +} + +/** + +## Logic for iterating through the children of a cell + +We'll describe the logic for .... + +- normal (non pentagon iteration) +- pentagon iteration. define "pentagon digit" + + +### Cell Index Component Diagrams + +The lower 56 bits of an H3 Cell Index describe the following index components: + +- the cell resolution (4 bits) +- the base cell number (7 bits) +- the child cell digit for each resolution from 1 to 15 (3*15 = 45 bits) + +These are the bits we'll be focused on when iterating through child cells. +To help describe the iteration logic, we'll use diagrams displaying the +(decimal) values for each component like: + + child digit for resolution 2 + / +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | ... | +|-----|-------------|---|---|---|---|---|---|-----| +| 9 | 17 | 5 | 3 | 0 | 6 | 2 | 1 | ... | + + +### Iteration through children of a hexagon (but not a pentagon) + +Iteration through the children of a *hexagon* (but not a pentagon) +simply involves iterating through all the children values (0--6) +for each child digit (up to the child's resolution). + +For example, suppose a resolution 3 hexagon index has the following +components: + parent resolution + / +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | ... | +|-----|-------------|---|---|---|---|---|---|-----| +| 3 | 17 | 3 | 5 | 1 | 7 | 7 | 7 | ... | + +The iteration through all children of resolution 6 would look like: + + + parent res child res + / / +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... | +|-----|-------------|---|---|---|---|---|---|---|---|-----| +| 6 | 17 | 3 | 5 | 1 | 0 | 0 | 0 | 7 | 7 | ... | +| 6 | 17 | 3 | 5 | 1 | 0 | 0 | 1 | 7 | 7 | ... | +| ... | | | | | | | | | | | +| 6 | 17 | 3 | 5 | 1 | 0 | 0 | 6 | 7 | 7 | ... | +| 6 | 17 | 3 | 5 | 1 | 0 | 1 | 0 | 7 | 7 | ... | +| 6 | 17 | 3 | 5 | 1 | 0 | 1 | 1 | 7 | 7 | ... | +| ... | | | | | | | | | | | +| 6 | 17 | 3 | 5 | 1 | 6 | 6 | 6 | 7 | 7 | ... | + + +### Step sequence on a *pentagon* cell + +Pentagon cells have a base cell number (e.g., 97) corresponding to a +resolution 0 pentagon, and have all zeros from digit 1 to the digit +corresponding to the cell's resolution. +(We'll drop the ellipses from now on, knowing that digits should contain +7's beyond the cell resolution.) + + parent res child res + / / +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 0 | 0 | + +Iteration through children of a *pentagon* is almost the same +as *hexagon* iteration, except that we skip the *first* 1 value +that appears in the "skip digit". This corresponds to the fact +that a pentagon only has 6 children, which are denoted with +the numbers {0,2,3,4,5,6}. + +The skip digit starts at the child resolution position. +When iterating through children more than one resolution below +the parent, we move the skip digit to the left +(up to the next coarser resolution) each time we skip the 1 value +in that digit. + +Iteration would start like: + + parent res child res + / / +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 0 | 0 | + \ + skip digit + +Noticing we skip the 1 value and move the skip digit, +the next iterate would be: + + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 0 | 2 | + \ + skip digit + +Iteration continues normally until we get to: + + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 0 | 6 | + \ + skip digit + +which is followed by (skipping the 1): + + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 2 | 0 | + \ + skip digit + +For the next iterate, we won't skip the `1` in the previous digit +because it is no longer the skip digit: + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 2 | 1 | + \ + skip digit + +Iteration continues normally until we're right before the next skip +digit: + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 0 | 6 | 6 | + \ + skip digit + +Which is followed by + +| res | base cell # | 1 | 2 | 3 | 4 | 5 | 6 | +|-----|-------------|---|---|---|---|---|---| +| 6 | 97 | 0 | 0 | 0 | 2 | 0 | 0 | + \ + skip digit + +and so on. + + */ + +/** + * Initialize a IterCellsChildren struct representing the sequence giving + * the children of cell `h` at resolution `childRes`. + * + * At any point in the iteration, starting once + * the struct is initialized, IterCellsChildren.h gives the current child. + * + * Also, IterCellsChildren.h == H3_NULL when all the children have been iterated + * through, or if the input to `iterInitParent` was invalid. + */ +IterCellsChildren iterInitParent(H3Index h, int childRes) { + IterCellsChildren it; + _iterInitParent(h, childRes, &it); + return it; +} + +/** + * Internal function - initialize a parent iterator in-place + */ +void _iterInitParent(H3Index h, int childRes, IterCellsChildren *iter) { + iter->_parentRes = H3_GET_RESOLUTION(h); + + if (childRes < iter->_parentRes || childRes > MAX_H3_RES || h == H3_NULL) { + *iter = _null_iter(); + return; + } + + iter->h = _zeroIndexDigits(h, iter->_parentRes + 1, childRes); + H3_SET_RESOLUTION(iter->h, childRes); + + if (H3_EXPORT(isPentagon)(iter->h)) { + // The skip digit skips `1` for pentagons. + // The "_skipDigit" moves to the left as we count up from the + // child resolution to the parent resolution. + iter->_skipDigit = childRes; + } else { + // if not a pentagon, we can ignore "skip digit" logic + iter->_skipDigit = -1; + } +} + +/** + * Step a IterCellsChildren to the next child cell. + * When the iteration is over, IterCellsChildren.h will be H3_NULL. + * Handles iterating through hexagon and pentagon cells. + */ +void iterStepChild(IterCellsChildren *it) { + // once h == H3_NULL, the iterator returns an infinite sequence of H3_NULL + if (it->h == H3_NULL) return; + + int childRes = H3_GET_RESOLUTION(it->h); + + _incrementResDigit(it, childRes); + + for (int i = childRes; i >= it->_parentRes; i--) { + if (i == it->_parentRes) { + // if we're modifying the parent resolution digit, then we're done + *it = _null_iter(); + return; + } + + // PENTAGON_SKIPPED_DIGIT == 1 + if (i == it->_skipDigit && + _getResDigit(it, i) == PENTAGON_SKIPPED_DIGIT) { + // Then we are iterating through the children of a pentagon cell. + // All children of a pentagon have the property that the first + // nonzero digit between the parent and child resolutions is + // not 1. + // I.e., we never see a sequence like 00001. + // Thus, we skip the `1` in this digit. + _incrementResDigit(it, i); + it->_skipDigit -= 1; + return; + } + + // INVALID_DIGIT == 7 + if (_getResDigit(it, i) == INVALID_DIGIT) { + _incrementResDigit( + it, i); // zeros out it[i] and increments it[i-1] by 1 + } else { + break; + } + } +} + +// create iterator for children of base cell at given resolution +IterCellsChildren iterInitBaseCellNum(int baseCellNum, int childRes) { + if (baseCellNum < 0 || baseCellNum >= NUM_BASE_CELLS || childRes < 0 || + childRes > MAX_H3_RES) { + return _null_iter(); + } + + H3Index baseCell; + setH3Index(&baseCell, 0, baseCellNum, 0); + + return iterInitParent(baseCell, childRes); +} + +// create iterator for all cells at given resolution +IterCellsResolution iterInitRes(int res) { + IterCellsChildren itC = iterInitBaseCellNum(0, res); + + IterCellsResolution itR = { + .h = itC.h, ._baseCellNum = 0, ._res = res, ._itC = itC}; + + return itR; +} + +void iterStepRes(IterCellsResolution *itR) { + // reached the end of over iterator; emits H3_NULL from now on + if (itR->h == H3_NULL) return; + + // step child iterator + iterStepChild(&(itR->_itC)); + + // If the child iterator is exhausted and there are still + // base cells remaining, we initialize the next base cell child iterator + if ((itR->_itC.h == H3_NULL) && (itR->_baseCellNum + 1 < NUM_BASE_CELLS)) { + itR->_baseCellNum += 1; + itR->_itC = iterInitBaseCellNum(itR->_baseCellNum, itR->_res); + } + + // This overall iterator reflects the next cell in the child iterator. + // Note: This sets itR->h = H3_NULL if the base cells were + // exhausted in the check above. + itR->h = itR->_itC.h; +} diff --git a/src/h3lib/lib/latLng.c b/src/h3lib/lib/latLng.c new file mode 100644 index 000000000..f90d9ee2b --- /dev/null +++ b/src/h3lib/lib/latLng.c @@ -0,0 +1,508 @@ +/* + * Copyright 2016-2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file latLng.c + * @brief Functions for working with lat/lng coordinates. + */ + +#include "latLng.h" + +#include +#include + +#include "constants.h" +#include "h3Assert.h" +#include "h3api.h" +#include "mathExtensions.h" + +/** + * Normalizes radians to a value between 0.0 and two PI. + * + * @param rads The input radians value. + * @return The normalized radians value. + */ +double _posAngleRads(double rads) { + double tmp = ((rads < 0.0) ? rads + M_2PI : rads); + if (rads >= M_2PI) tmp -= M_2PI; + return tmp; +} + +/** + * Determines if the components of two spherical coordinates are within some + * threshold distance of each other. + * + * @param p1 The first spherical coordinates. + * @param p2 The second spherical coordinates. + * @param threshold The threshold distance. + * @return Whether or not the two coordinates are within the threshold distance + * of each other. + */ +bool geoAlmostEqualThreshold(const LatLng *p1, const LatLng *p2, + double threshold) { + return fabs(p1->lat - p2->lat) < threshold && + fabs(p1->lng - p2->lng) < threshold; +} + +/** + * Determines if the components of two spherical coordinates are within our + * standard epsilon distance of each other. + * + * @param p1 The first spherical coordinates. + * @param p2 The second spherical coordinates. + * @return Whether or not the two coordinates are within the epsilon distance + * of each other. + */ +bool geoAlmostEqual(const LatLng *p1, const LatLng *p2) { + return geoAlmostEqualThreshold(p1, p2, EPSILON_RAD); +} + +/** + * Set the components of spherical coordinates in decimal degrees. + * + * @param p The spherical coordinates. + * @param latDegs The desired latitude in decimal degrees. + * @param lngDegs The desired longitude in decimal degrees. + */ +void setGeoDegs(LatLng *p, double latDegs, double lngDegs) { + _setGeoRads(p, H3_EXPORT(degsToRads)(latDegs), + H3_EXPORT(degsToRads)(lngDegs)); +} + +/** + * Set the components of spherical coordinates in radians. + * + * @param p The spherical coordinates. + * @param latRads The desired latitude in decimal radians. + * @param lngRads The desired longitude in decimal radians. + */ +void _setGeoRads(LatLng *p, double latRads, double lngRads) { + p->lat = latRads; + p->lng = lngRads; +} + +/** + * Convert from decimal degrees to radians. + * + * @param degrees The decimal degrees. + * @return The corresponding radians. + */ +double H3_EXPORT(degsToRads)(double degrees) { return degrees * M_PI_180; } + +/** + * Convert from radians to decimal degrees. + * + * @param radians The radians. + * @return The corresponding decimal degrees. + */ +double H3_EXPORT(radsToDegs)(double radians) { return radians * M_180_PI; } + +/** + * constrainLat makes sure latitudes are in the proper bounds + * + * @param lat The original lat value + * @return The corrected lat value + */ +double constrainLat(double lat) { + while (lat > M_PI_2) { + lat = lat - M_PI; + } + return lat; +} + +/** + * constrainLng makes sure longitudes are in the proper bounds + * + * @param lng The origin lng value + * @return The corrected lng value + */ +double constrainLng(double lng) { + while (lng > M_PI) { + lng = lng - (2 * M_PI); + } + while (lng < -M_PI) { + lng = lng + (2 * M_PI); + } + return lng; +} + +/** + * Normalize an input longitude according to the specified normalization + * @param lng Input longitude + * @param normalization Longitude normalization strategy + * @return Normalized longitude + */ +double normalizeLng(const double lng, + const LongitudeNormalization normalization) { + switch (normalization) { + case NORMALIZE_EAST: + return lng < 0 ? lng + (double)M_2PI : lng; + case NORMALIZE_WEST: + return lng > 0 ? lng - (double)M_2PI : lng; + default: + return lng; + } +} + +/** + * The great circle distance in radians between two spherical coordinates. + * + * This function uses the Haversine formula. + * For math details, see: + * https://en.wikipedia.org/wiki/Haversine_formula + * https://www.movable-type.co.uk/scripts/latlong.html + * + * @param a the first lat/lng pair (in radians) + * @param b the second lat/lng pair (in radians) + * + * @return the great circle distance in radians between a and b + */ +double H3_EXPORT(greatCircleDistanceRads)(const LatLng *a, const LatLng *b) { + double sinLat = sin((b->lat - a->lat) * 0.5); + double sinLng = sin((b->lng - a->lng) * 0.5); + + double A = sinLat * sinLat + cos(a->lat) * cos(b->lat) * sinLng * sinLng; + + return 2 * atan2(sqrt(A), sqrt(1 - A)); +} + +/** + * The great circle distance in kilometers between two spherical coordinates. + * + * @param a the first lat/lng pair (in radians) + * @param b the second lat/lng pair (in radians) + * + * @return the great circle distance in kilometers between a and b + */ +double H3_EXPORT(greatCircleDistanceKm)(const LatLng *a, const LatLng *b) { + return H3_EXPORT(greatCircleDistanceRads)(a, b) * EARTH_RADIUS_KM; +} + +/** + * The great circle distance in meters between two spherical coordinates. + * + * @param a the first lat/lng pair (in radians) + * @param b the second lat/lng pair (in radians) + * + * @return the great circle distance in meters between a and b + */ +double H3_EXPORT(greatCircleDistanceM)(const LatLng *a, const LatLng *b) { + return H3_EXPORT(greatCircleDistanceKm)(a, b) * 1000; +} + +/** + * Determines the azimuth to p2 from p1 in radians. + * + * @param p1 The first spherical coordinates. + * @param p2 The second spherical coordinates. + * @return The azimuth in radians from p1 to p2. + */ +double _geoAzimuthRads(const LatLng *p1, const LatLng *p2) { + return atan2(cos(p2->lat) * sin(p2->lng - p1->lng), + cos(p1->lat) * sin(p2->lat) - + sin(p1->lat) * cos(p2->lat) * cos(p2->lng - p1->lng)); +} + +/** + * Computes the point on the sphere a specified azimuth and distance from + * another point. + * + * @param p1 The first spherical coordinates. + * @param az The desired azimuth from p1. + * @param distance The desired distance from p1, must be non-negative. + * @param p2 The spherical coordinates at the desired azimuth and distance from + * p1. + */ +void _geoAzDistanceRads(const LatLng *p1, double az, double distance, + LatLng *p2) { + if (distance < EPSILON) { + *p2 = *p1; + return; + } + + double sinlat, sinlng, coslng; + + az = _posAngleRads(az); + + // check for due north/south azimuth + if (az < EPSILON || fabs(az - M_PI) < EPSILON) { + if (az < EPSILON) // due north + p2->lat = p1->lat + distance; + else // due south + p2->lat = p1->lat - distance; + + if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole + { + p2->lat = M_PI_2; + p2->lng = 0.0; + } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole + { + p2->lat = -M_PI_2; + p2->lng = 0.0; + } else + p2->lng = constrainLng(p1->lng); + } else // not due north or south + { + sinlat = sin(p1->lat) * cos(distance) + + cos(p1->lat) * sin(distance) * cos(az); + if (sinlat > 1.0) sinlat = 1.0; + if (sinlat < -1.0) sinlat = -1.0; + p2->lat = asin(sinlat); + if (fabs(p2->lat - M_PI_2) < EPSILON) // north pole + { + p2->lat = M_PI_2; + p2->lng = 0.0; + } else if (fabs(p2->lat + M_PI_2) < EPSILON) // south pole + { + p2->lat = -M_PI_2; + p2->lng = 0.0; + } else { + double invcosp2lat = 1.0 / cos(p2->lat); + sinlng = sin(az) * sin(distance) * invcosp2lat; + coslng = (cos(distance) - sin(p1->lat) * sin(p2->lat)) / + cos(p1->lat) * invcosp2lat; + if (sinlng > 1.0) sinlng = 1.0; + if (sinlng < -1.0) sinlng = -1.0; + if (coslng > 1.0) coslng = 1.0; + if (coslng < -1.0) coslng = -1.0; + p2->lng = constrainLng(p1->lng + atan2(sinlng, coslng)); + } + } +} + +/* + * The following functions provide meta information about the H3 hexagons at + * each zoom level. Since there are only 16 total levels, these are current + * handled with hardwired static values, but it may be worthwhile to put these + * static values into another file that can be autogenerated by source code in + * the future. + */ + +H3Error H3_EXPORT(getHexagonAreaAvgKm2)(int res, double *out) { + static const double areas[] = { + 4.357449416078383e+06, 6.097884417941332e+05, 8.680178039899720e+04, + 1.239343465508816e+04, 1.770347654491307e+03, 2.529038581819449e+02, + 3.612906216441245e+01, 5.161293359717191e+00, 7.373275975944177e-01, + 1.053325134272067e-01, 1.504750190766435e-02, 2.149643129451879e-03, + 3.070918756316060e-04, 4.387026794728296e-05, 6.267181135324313e-06, + 8.953115907605790e-07}; + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + *out = areas[res]; + return E_SUCCESS; +} + +H3Error H3_EXPORT(getHexagonAreaAvgM2)(int res, double *out) { + static const double areas[] = { + 4.357449416078390e+12, 6.097884417941339e+11, 8.680178039899731e+10, + 1.239343465508818e+10, 1.770347654491309e+09, 2.529038581819452e+08, + 3.612906216441250e+07, 5.161293359717198e+06, 7.373275975944188e+05, + 1.053325134272069e+05, 1.504750190766437e+04, 2.149643129451882e+03, + 3.070918756316063e+02, 4.387026794728301e+01, 6.267181135324322e+00, + 8.953115907605802e-01}; + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + *out = areas[res]; + return E_SUCCESS; +} + +H3Error H3_EXPORT(getHexagonEdgeLengthAvgKm)(int res, double *out) { + static const double lens[] = { + 1281.256011, 483.0568391, 182.5129565, 68.97922179, + 26.07175968, 9.854090990, 3.724532667, 1.406475763, + 0.531414010, 0.200786148, 0.075863783, 0.028663897, + 0.010830188, 0.004092010, 0.001546100, 0.000584169}; + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + *out = lens[res]; + return E_SUCCESS; +} + +H3Error H3_EXPORT(getHexagonEdgeLengthAvgM)(int res, double *out) { + static const double lens[] = { + 1281256.011, 483056.8391, 182512.9565, 68979.22179, + 26071.75968, 9854.090990, 3724.532667, 1406.475763, + 531.4140101, 200.7861476, 75.86378287, 28.66389748, + 10.83018784, 4.092010473, 1.546099657, 0.584168630}; + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + *out = lens[res]; + return E_SUCCESS; +} + +H3Error H3_EXPORT(getNumCells)(int res, int64_t *out) { + if (res < 0 || res > MAX_H3_RES) { + return E_RES_DOMAIN; + } + *out = 2 + 120 * _ipow(7, res); + return E_SUCCESS; +} + +/** + * Surface area in radians^2 of spherical triangle on unit sphere. + * + * For the math, see: + * https://en.wikipedia.org/wiki/Spherical_trigonometry#Area_and_spherical_excess + * + * @param a length of triangle side A in radians + * @param b length of triangle side B in radians + * @param c length of triangle side C in radians + * + * @return area in radians^2 of triangle on unit sphere + */ +double triangleEdgeLengthsToArea(double a, double b, double c) { + double s = (a + b + c) * 0.5; + + a = (s - a) * 0.5; + b = (s - b) * 0.5; + c = (s - c) * 0.5; + s = s * 0.5; + + return 4 * atan(sqrt(tan(s) * tan(a) * tan(b) * tan(c))); +} + +/** + * Compute area in radians^2 of a spherical triangle, given its vertices. + * + * @param a vertex lat/lng in radians + * @param b vertex lat/lng in radians + * @param c vertex lat/lng in radians + * + * @return area of triangle on unit sphere, in radians^2 + */ +double triangleArea(const LatLng *a, const LatLng *b, const LatLng *c) { + return triangleEdgeLengthsToArea(H3_EXPORT(greatCircleDistanceRads)(a, b), + H3_EXPORT(greatCircleDistanceRads)(b, c), + H3_EXPORT(greatCircleDistanceRads)(c, a)); +} + +/** + * Area of H3 cell in radians^2. + * + * The area is calculated by breaking the cell into spherical triangles and + * summing up their areas. Note that some H3 cells (hexagons and pentagons) + * are irregular, and have more than 6 or 5 sides. + * + * todo: optimize the computation by re-using the edges shared between triangles + * + * @param cell H3 cell + * @param out cell area in radians^2 + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(cellAreaRads2)(H3Index cell, double *out) { + LatLng c; + CellBoundary cb; + H3Error err = H3_EXPORT(cellToLatLng)(cell, &c); + if (err) { + return err; + } + err = H3_EXPORT(cellToBoundary)(cell, &cb); + if (NEVER(err)) { + // Uncoverable because cellToLatLng will have returned an error already + return err; + } + + double area = 0.0; + for (int i = 0; i < cb.numVerts; i++) { + int j = (i + 1) % cb.numVerts; + area += triangleArea(&cb.verts[i], &cb.verts[j], &c); + } + + *out = area; + return E_SUCCESS; +} + +/** + * Area of H3 cell in kilometers^2. + * + * @param cell H3 cell + * @param out cell area in kilometers^2 + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(cellAreaKm2)(H3Index cell, double *out) { + H3Error err = H3_EXPORT(cellAreaRads2)(cell, out); + if (!err) { + *out = *out * EARTH_RADIUS_KM * EARTH_RADIUS_KM; + } + return err; +} + +/** + * Area of H3 cell in meters^2. + * + * @param cell H3 cell + * @param out cell area in meters^2 + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(cellAreaM2)(H3Index cell, double *out) { + H3Error err = H3_EXPORT(cellAreaKm2)(cell, out); + if (!err) { + *out = *out * 1000 * 1000; + } + return err; +} + +/** + * Length of a directed edge in radians. + * + * @param edge H3 directed edge + * @param length length in radians + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(edgeLengthRads)(H3Index edge, double *length) { + CellBoundary cb; + + H3Error err = H3_EXPORT(directedEdgeToBoundary)(edge, &cb); + if (err) { + return err; + } + + *length = 0.0; + for (int i = 0; i < cb.numVerts - 1; i++) { + *length += + H3_EXPORT(greatCircleDistanceRads)(&cb.verts[i], &cb.verts[i + 1]); + } + + return E_SUCCESS; +} + +/** + * Length of a directed edge in kilometers. + * + * @param edge H3 directed edge + * @param length length in kilometers + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(edgeLengthKm)(H3Index edge, double *length) { + H3Error err = H3_EXPORT(edgeLengthRads)(edge, length); + *length = *length * EARTH_RADIUS_KM; + return err; +} + +/** + * Length of a directed edge in meters. + * + * @param edge H3 directed edge + * @param length length in meters + * @return E_SUCCESS on success, or an error code otherwise + */ +H3Error H3_EXPORT(edgeLengthM)(H3Index edge, double *length) { + H3Error err = H3_EXPORT(edgeLengthKm)(edge, length); + *length = *length * 1000; + return err; +} diff --git a/src/h3lib/lib/linkedGeo.c b/src/h3lib/lib/linkedGeo.c index 4fe24b1fc..85308e8a4 100644 --- a/src/h3lib/lib/linkedGeo.c +++ b/src/h3lib/lib/linkedGeo.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,19 +18,22 @@ */ #include "linkedGeo.h" + #include #include -#include "geoCoord.h" + +#include "alloc.h" #include "h3api.h" +#include "latLng.h" /** * Add a linked polygon to the current polygon * @param polygon Polygon to add link to * @return Pointer to new polygon */ -LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) { +LinkedGeoPolygon *addNewLinkedPolygon(LinkedGeoPolygon *polygon) { assert(polygon->next == NULL); - LinkedGeoPolygon* next = calloc(1, sizeof(*next)); + LinkedGeoPolygon *next = H3_MEMORY(calloc)(1, sizeof(*next)); assert(next != NULL); polygon->next = next; return next; @@ -41,8 +44,8 @@ LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) { * @param polygon Polygon to add loop to * @return Pointer to loop */ -LinkedGeoLoop* addNewLinkedLoop(LinkedGeoPolygon* polygon) { - LinkedGeoLoop* loop = calloc(1, sizeof(*loop)); +LinkedGeoLoop *addNewLinkedLoop(LinkedGeoPolygon *polygon) { + LinkedGeoLoop *loop = H3_MEMORY(calloc)(1, sizeof(*loop)); assert(loop != NULL); return addLinkedLoop(polygon, loop); } @@ -52,8 +55,8 @@ LinkedGeoLoop* addNewLinkedLoop(LinkedGeoPolygon* polygon) { * @param polygon Polygon to add loop to * @return Pointer to loop */ -LinkedGeoLoop* addLinkedLoop(LinkedGeoPolygon* polygon, LinkedGeoLoop* loop) { - LinkedGeoLoop* last = polygon->last; +LinkedGeoLoop *addLinkedLoop(LinkedGeoPolygon *polygon, LinkedGeoLoop *loop) { + LinkedGeoLoop *last = polygon->last; if (last == NULL) { assert(polygon->first == NULL); polygon->first = loop; @@ -70,11 +73,11 @@ LinkedGeoLoop* addLinkedLoop(LinkedGeoPolygon* polygon, LinkedGeoLoop* loop) { * @param vertex Coordinate to add * @return Pointer to the coordinate */ -LinkedGeoCoord* addLinkedCoord(LinkedGeoLoop* loop, const GeoCoord* vertex) { - LinkedGeoCoord* coord = malloc(sizeof(*coord)); +LinkedLatLng *addLinkedCoord(LinkedGeoLoop *loop, const LatLng *vertex) { + LinkedLatLng *coord = H3_MEMORY(malloc)(sizeof(*coord)); assert(coord != NULL); - *coord = (LinkedGeoCoord){.vertex = *vertex, .next = NULL}; - LinkedGeoCoord* last = loop->last; + *coord = (LinkedLatLng){.vertex = *vertex, .next = NULL}; + LinkedLatLng *last = loop->last; if (last == NULL) { assert(loop->first == NULL); loop->first = coord; @@ -90,12 +93,12 @@ LinkedGeoCoord* addLinkedCoord(LinkedGeoLoop* loop, const GeoCoord* vertex) { * responsible for freeing memory allocated to input loop struct. * @param loop Loop to free */ -void destroyLinkedGeoLoop(LinkedGeoLoop* loop) { - LinkedGeoCoord* nextCoord; - for (LinkedGeoCoord* currentCoord = loop->first; currentCoord != NULL; +void destroyLinkedGeoLoop(LinkedGeoLoop *loop) { + LinkedLatLng *nextCoord; + for (LinkedLatLng *currentCoord = loop->first; currentCoord != NULL; currentCoord = nextCoord) { nextCoord = currentCoord->next; - free(currentCoord); + H3_MEMORY(free)(currentCoord); } } @@ -104,25 +107,25 @@ void destroyLinkedGeoLoop(LinkedGeoLoop* loop) { * responsible for freeing memory allocated to input polygon struct. * @param polygon Pointer to the first polygon in the structure */ -void H3_EXPORT(destroyLinkedPolygon)(LinkedGeoPolygon* polygon) { +void H3_EXPORT(destroyLinkedMultiPolygon)(LinkedGeoPolygon *polygon) { // flag to skip the input polygon bool skip = true; - LinkedGeoPolygon* nextPolygon; - LinkedGeoLoop* nextLoop; - for (LinkedGeoPolygon* currentPolygon = polygon; currentPolygon != NULL; + LinkedGeoPolygon *nextPolygon; + LinkedGeoLoop *nextLoop; + for (LinkedGeoPolygon *currentPolygon = polygon; currentPolygon != NULL; currentPolygon = nextPolygon) { - for (LinkedGeoLoop* currentLoop = currentPolygon->first; + for (LinkedGeoLoop *currentLoop = currentPolygon->first; currentLoop != NULL; currentLoop = nextLoop) { destroyLinkedGeoLoop(currentLoop); nextLoop = currentLoop->next; - free(currentLoop); + H3_MEMORY(free)(currentLoop); } nextPolygon = currentPolygon->next; if (skip) { // do not free the input polygon skip = false; } else { - free(currentPolygon); + H3_MEMORY(free)(currentPolygon); } } } @@ -132,7 +135,7 @@ void H3_EXPORT(destroyLinkedPolygon)(LinkedGeoPolygon* polygon) { * @param polygon Starting polygon * @return Count */ -int countLinkedPolygons(LinkedGeoPolygon* polygon) { +int countLinkedPolygons(LinkedGeoPolygon *polygon) { int count = 0; while (polygon != NULL) { count++; @@ -146,8 +149,8 @@ int countLinkedPolygons(LinkedGeoPolygon* polygon) { * @param polygon Polygon to count loops for * @return Count */ -int countLinkedLoops(LinkedGeoPolygon* polygon) { - LinkedGeoLoop* loop = polygon->first; +int countLinkedLoops(LinkedGeoPolygon *polygon) { + LinkedGeoLoop *loop = polygon->first; int count = 0; while (loop != NULL) { count++; @@ -161,8 +164,8 @@ int countLinkedLoops(LinkedGeoPolygon* polygon) { * @param loop Loop to count coordinates for * @return Count */ -int countLinkedCoords(LinkedGeoLoop* loop) { - LinkedGeoCoord* coord = loop->first; +int countLinkedCoords(LinkedGeoLoop *loop) { + LinkedLatLng *coord = loop->first; int count = 0; while (coord != NULL) { count++; @@ -179,9 +182,9 @@ int countLinkedCoords(LinkedGeoLoop* loop) { * @param polygonCount Number of polygons in the test array * @return Number of polygons containing the loop */ -static int countContainers(const LinkedGeoLoop* loop, - const LinkedGeoPolygon** polygons, - const BBox** bboxes, const int polygonCount) { +static int countContainers(const LinkedGeoLoop *loop, + const LinkedGeoPolygon **polygons, + const BBox **bboxes, const int polygonCount) { int containerCount = 0; for (int i = 0; i < polygonCount; i++) { if (loop != polygons[i]->first && @@ -200,11 +203,11 @@ static int countContainers(const LinkedGeoLoop* loop, * @param polygonCount Number of polygons in the list * @return Deepest container, or null if list is empty */ -static const LinkedGeoPolygon* findDeepestContainer( - const LinkedGeoPolygon** polygons, const BBox** bboxes, +static const LinkedGeoPolygon *findDeepestContainer( + const LinkedGeoPolygon **polygons, const BBox **bboxes, const int polygonCount) { // Set the initial return value to the first candidate - const LinkedGeoPolygon* parent = polygonCount > 0 ? polygons[0] : NULL; + const LinkedGeoPolygon *parent = polygonCount > 0 ? polygons[0] : NULL; // If we have multiple polygons, they must be nested inside each other. // Find the innermost polygon by taking the one with the most containers @@ -233,18 +236,19 @@ static const LinkedGeoPolygon* findDeepestContainer( * @param polygonCount Number of polygons to check * @return Pointer to parent polygon, or null if not found */ -static const LinkedGeoPolygon* findPolygonForHole( - const LinkedGeoLoop* loop, const LinkedGeoPolygon* polygon, - const BBox* bboxes, const int polygonCount) { +static const LinkedGeoPolygon *findPolygonForHole( + const LinkedGeoLoop *loop, const LinkedGeoPolygon *polygon, + const BBox *bboxes, const int polygonCount) { // Early exit with no polygons if (polygonCount == 0) { return NULL; } // Initialize arrays for candidate loops and their bounding boxes - const LinkedGeoPolygon** candidates = - malloc(polygonCount * sizeof(LinkedGeoPolygon*)); + const LinkedGeoPolygon **candidates = + H3_MEMORY(malloc)(polygonCount * sizeof(LinkedGeoPolygon *)); assert(candidates != NULL); - const BBox** candidateBBoxes = malloc(polygonCount * sizeof(BBox*)); + const BBox **candidateBBoxes = + H3_MEMORY(malloc)(polygonCount * sizeof(BBox *)); assert(candidateBBoxes != NULL); // Find all polygons that contain the loop @@ -263,12 +267,12 @@ static const LinkedGeoPolygon* findPolygonForHole( } // The most deeply nested container is the immediate parent - const LinkedGeoPolygon* parent = + const LinkedGeoPolygon *parent = findDeepestContainer(candidates, candidateBBoxes, candidateCount); // Free allocated memory - free(candidates); - free(candidateBBoxes); + H3_MEMORY(free)(candidates); + H3_MEMORY(free)(candidateBBoxes); return parent; } @@ -286,37 +290,38 @@ static const LinkedGeoPolygon* findPolygonForHole( * @param root Root polygon including all loops * @return 0 on success, or an error code > 0 for invalid input */ -int normalizeMultiPolygon(LinkedGeoPolygon* root) { +H3Error normalizeMultiPolygon(LinkedGeoPolygon *root) { // We assume that the input is a single polygon with loops; // if it has multiple polygons, don't touch it if (root->next) { - return NORMALIZATION_ERR_MULTIPLE_POLYGONS; + return E_FAILED; } // Count loops, exiting early if there's only one int loopCount = countLinkedLoops(root); if (loopCount <= 1) { - return NORMALIZATION_SUCCESS; + return E_SUCCESS; } - int resultCode = NORMALIZATION_SUCCESS; - LinkedGeoPolygon* polygon = NULL; - LinkedGeoLoop* next; + H3Error resultCode = E_SUCCESS; + LinkedGeoPolygon *polygon = NULL; + LinkedGeoLoop *next; int innerCount = 0; int outerCount = 0; // Create an array to hold all of the inner loops. Note that // this array will never be full, as there will always be fewer // inner loops than outer loops. - LinkedGeoLoop** innerLoops = malloc(loopCount * sizeof(LinkedGeoLoop*)); + LinkedGeoLoop **innerLoops = + H3_MEMORY(malloc)(loopCount * sizeof(LinkedGeoLoop *)); assert(innerLoops != NULL); // Create an array to hold the bounding boxes for the outer loops - BBox* bboxes = malloc(loopCount * sizeof(BBox)); + BBox *bboxes = H3_MEMORY(malloc)(loopCount * sizeof(BBox)); assert(bboxes != NULL); // Get the first loop and unlink it from root - LinkedGeoLoop* loop = root->first; + LinkedGeoLoop *loop = root->first; *root = (LinkedGeoPolygon){0}; // Iterate over all loops, moving inner loops into an array and @@ -339,24 +344,24 @@ int normalizeMultiPolygon(LinkedGeoPolygon* root) { // Find polygon for each inner loop and assign the hole to it for (int i = 0; i < innerCount; i++) { - polygon = (LinkedGeoPolygon*)findPolygonForHole(innerLoops[i], root, - bboxes, outerCount); + polygon = (LinkedGeoPolygon *)findPolygonForHole(innerLoops[i], root, + bboxes, outerCount); if (polygon) { addLinkedLoop(polygon, innerLoops[i]); } else { // If we can't find a polygon (possible with invalid input), then // we need to release the memory for the hole, because the loop has // been unlinked from the root and the caller will no longer have - // a way to destroy it with destroyLinkedPolygon. + // a way to destroy it with destroyLinkedMultiPolygon. destroyLinkedGeoLoop(innerLoops[i]); - free(innerLoops[i]); - resultCode = NORMALIZATION_ERR_UNASSIGNED_HOLES; + H3_MEMORY(free)(innerLoops[i]); + resultCode = E_FAILED; } } // Free allocated memory - free(innerLoops); - free(bboxes); + H3_MEMORY(free)(innerLoops); + H3_MEMORY(free)(bboxes); return resultCode; } diff --git a/src/h3lib/lib/localij.c b/src/h3lib/lib/localij.c index 38392d053..0f96adfa1 100644 --- a/src/h3lib/lib/localij.c +++ b/src/h3lib/lib/localij.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2020 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,16 +19,17 @@ * These functions try to provide a useful coordinate space in the vicinity of * an origin index. */ -#include +#include #include #include #include #include + #include "baseCells.h" #include "faceijk.h" +#include "h3Assert.h" #include "h3Index.h" #include "mathExtensions.h" -#include "stackAlloc.h" /** * Origin leading digit -> index leading digit -> rotations 60 cw @@ -87,24 +88,28 @@ const int PENTAGON_ROTATIONS_REVERSE_POLAR[7][7] = { {0, 1, 1, 0, 1, 1, 1}, // 6 }; -// Simply prohibit many pentagon distortion cases rather than handling them. -const bool FAILED_DIRECTIONS_II[7][7] = { - {false, false, false, false, false, false, false}, // 0 - {false, false, false, false, false, false, false}, // 1 - {false, false, false, false, true, false, false}, // 2 - {false, false, false, false, false, false, true}, // 3 - {false, false, false, true, false, false, false}, // 4 - {false, false, true, false, false, false, false}, // 5 - {false, false, false, false, false, true, false}, // 6 -}; -const bool FAILED_DIRECTIONS_III[7][7] = { +/** + * Prohibited directions when unfolding a pentagon. + * + * Indexes by two directions, both relative to the pentagon base cell. The first + * is the direction of the origin index and the second is the direction of the + * index to unfold. Direction refers to the direction from base cell to base + * cell if the indexes are on different base cells, or the leading digit if + * within the pentagon base cell. + * + * This previously included a Class II/Class III check but these were removed + * due to failure cases. It's possible this could be restricted to a narrower + * set of a failure cases. Currently, the logic is any unfolding across more + * than one icosahedron face is not permitted. + */ +const bool FAILED_DIRECTIONS[7][7] = { {false, false, false, false, false, false, false}, // 0 {false, false, false, false, false, false, false}, // 1 - {false, false, false, false, false, true, false}, // 2 - {false, false, false, false, true, false, false}, // 3 - {false, false, true, false, false, false, false}, // 4 - {false, false, false, false, false, false, true}, // 5 - {false, false, false, true, false, false, false}, // 6 + {false, false, false, false, true, true, false}, // 2 + {false, false, false, false, true, false, true}, // 3 + {false, false, true, true, false, false, false}, // 4 + {false, false, true, false, false, false, true}, // 5 + {false, false, false, true, false, true, false}, // 6 }; /** @@ -124,24 +129,33 @@ const bool FAILED_DIRECTIONS_III[7][7] = { * @param out ijk+ coordinates of the index will be placed here on success * @return 0 on success, or another value on failure. */ -int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { +H3Error cellToLocalIjk(H3Index origin, H3Index h3, CoordIJK *out) { int res = H3_GET_RESOLUTION(origin); if (res != H3_GET_RESOLUTION(h3)) { - return 1; + return E_RES_MISMATCH; } int originBaseCell = H3_GET_BASE_CELL(origin); int baseCell = H3_GET_BASE_CELL(h3); + if (NEVER(originBaseCell < 0) || originBaseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + return E_CELL_INVALID; + } + if (NEVER(baseCell < 0) || baseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + return E_CELL_INVALID; + } + // Direction from origin base cell to index base cell - Direction dir = 0; - Direction revDir = 0; + Direction dir = CENTER_DIGIT; + Direction revDir = CENTER_DIGIT; if (originBaseCell != baseCell) { dir = _getBaseCellDirection(originBaseCell, baseCell); if (dir == INVALID_DIGIT) { // Base cells are not neighbors, can't unfold. - return 2; + return E_FAILED; } revDir = _getBaseCellDirection(baseCell, originBaseCell); assert(revDir != INVALID_DIGIT); @@ -183,16 +197,14 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { if (originOnPent) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); - // TODO: This previously included the Class III-based checks - // as in the index-on-pentagon case below, but these were - // removed due to some failure cases. It is possible that we - // could restrict this error to a narrower set of cases. - // https://github.com/uber/h3/issues/163 - if (FAILED_DIRECTIONS_III[originLeadingDigit][dir] || - FAILED_DIRECTIONS_II[originLeadingDigit][dir]) { - // TODO this part of the pentagon might not be unfolded - // correctly. - return 3; + if (originLeadingDigit == INVALID_DIGIT) { + return E_CELL_INVALID; + } + if (FAILED_DIRECTIONS[originLeadingDigit][dir]) { + // TODO: We may be unfolding the pentagon incorrectly in this + // case; return an error code until this is guaranteed to be + // correct. + return E_FAILED; } directionRotations = PENTAGON_ROTATIONS[originLeadingDigit][dir]; @@ -200,20 +212,23 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { } else if (indexOnPent) { int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); - if ((isResClassIII(res) && - FAILED_DIRECTIONS_III[indexLeadingDigit][revDir]) || - (!isResClassIII(res) && - FAILED_DIRECTIONS_II[indexLeadingDigit][revDir])) { - // TODO this part of the pentagon might not be unfolded - // correctly. - return 4; + if (indexLeadingDigit == INVALID_DIGIT) { + return E_CELL_INVALID; + } + if (FAILED_DIRECTIONS[indexLeadingDigit][revDir]) { + // TODO: We may be unfolding the pentagon incorrectly in this + // case; return an error code until this is guaranteed to be + // correct. + return E_FAILED; } pentagonRotations = PENTAGON_ROTATIONS[revDir][indexLeadingDigit]; } - assert(pentagonRotations >= 0); - assert(directionRotations >= 0); + if (pentagonRotations < 0 || directionRotations < 0) { + // This occurs when an invalid K axis digit is present + return E_CELL_INVALID; + } for (int i = 0; i < pentagonRotations; i++) { _ijkRotate60cw(&indexFijk.coord); @@ -223,7 +238,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { _neighbor(&offset, dir); // Scale offset based on resolution for (int r = res - 1; r >= 0; r--) { - if (isResClassIII(r + 1)) { + if (isResolutionClassIII(r + 1)) { // rotate ccw _downAp7(&offset); } else { @@ -248,11 +263,14 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { int originLeadingDigit = _h3LeadingNonZeroDigit(origin); int indexLeadingDigit = _h3LeadingNonZeroDigit(h3); - if (FAILED_DIRECTIONS_III[originLeadingDigit][indexLeadingDigit] || - FAILED_DIRECTIONS_II[originLeadingDigit][indexLeadingDigit]) { - // TODO this part of the pentagon might not be unfolded - // correctly. - return 5; + if (originLeadingDigit == INVALID_DIGIT || + indexLeadingDigit == INVALID_DIGIT) { + return E_CELL_INVALID; + } + if (FAILED_DIRECTIONS[originLeadingDigit][indexLeadingDigit]) { + // TODO: We may be unfolding the pentagon incorrectly in this case; + // return an error code until this is guaranteed to be correct. + return E_FAILED; } int withinPentagonRotations = @@ -264,7 +282,7 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { } *out = indexFijk.coord; - return 0; + return E_SUCCESS; } /** @@ -281,32 +299,36 @@ int h3ToLocalIjk(H3Index origin, H3Index h3, CoordIJK* out) { * @param out The index will be placed here on success * @return 0 on success, or another value on failure. */ -int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { +H3Error localIjkToCell(H3Index origin, const CoordIJK *ijk, H3Index *out) { int res = H3_GET_RESOLUTION(origin); int originBaseCell = H3_GET_BASE_CELL(origin); + if (NEVER(originBaseCell < 0) || originBaseCell >= NUM_BASE_CELLS) { + // Base cells less than zero can not be represented in an index + return E_CELL_INVALID; + } int originOnPent = _isBaseCellPentagon(originBaseCell); // This logic is very similar to faceIjkToH3 // initialize the index *out = H3_INIT; - H3_SET_MODE(*out, H3_HEXAGON_MODE); + H3_SET_MODE(*out, H3_CELL_MODE); H3_SET_RESOLUTION(*out, res); // check for res 0/base cell if (res == 0) { - if (ijk->i > 1 || ijk->i > 1 || ijk->i > 1) { - // out of range input - return 1; + const Direction dir = _unitIjkToDigit(ijk); + if (dir == INVALID_DIGIT) { + // out of range input - not a unit vector or zero vector + return E_FAILED; } - const Direction dir = _unitIjkToDigit(ijk); const int newBaseCell = _getBaseCellNeighbor(originBaseCell, dir); if (newBaseCell == INVALID_BASE_CELL) { // Moving in an invalid direction off a pentagon. - return 1; + return E_FAILED; } H3_SET_BASE_CELL(*out, newBaseCell); - return 0; + return E_SUCCESS; } // we need to find the correct base cell offset (if any) for this H3 index; @@ -320,14 +342,20 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { for (int r = res - 1; r >= 0; r--) { CoordIJK lastIJK = ijkCopy; CoordIJK lastCenter; - if (isResClassIII(r + 1)) { + if (isResolutionClassIII(r + 1)) { // rotate ccw - _upAp7(&ijkCopy); + H3Error upAp7Error = _upAp7Checked(&ijkCopy); + if (upAp7Error) { + return upAp7Error; + } lastCenter = ijkCopy; _downAp7(&lastCenter); } else { // rotate cw - _upAp7r(&ijkCopy); + H3Error upAp7rError = _upAp7rChecked(&ijkCopy); + if (upAp7rError) { + return upAp7rError; + } lastCenter = ijkCopy; _downAp7r(&lastCenter); } @@ -344,7 +372,7 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { if (ijkCopy.i > 1 || ijkCopy.j > 1 || ijkCopy.k > 1) { // out of range input - return 2; + return E_FAILED; } // lookup the correct base cell @@ -362,6 +390,9 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { int pentagonRotations = 0; if (originOnPent) { const Direction originLeadingDigit = _h3LeadingNonZeroDigit(origin); + if (originLeadingDigit == INVALID_DIGIT) { + return E_CELL_INVALID; + } pentagonRotations = PENTAGON_ROTATIONS_REVERSE[originLeadingDigit][dir]; for (int i = 0; i < pentagonRotations; i++) { @@ -371,7 +402,7 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { // deleted direction. If it still happens, it means we're moving // into a deleted subsequence, so there is no index here. if (dir == K_AXES_DIGIT) { - return 3; + return E_PENTAGON; } baseCell = _getBaseCellNeighbor(originBaseCell, dir); @@ -404,6 +435,11 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { } const Direction indexLeadingDigit = _h3LeadingNonZeroDigit(*out); + // This case should be unreachable because this function is building + // *out, and should never generate an invalid digit, above. + if (NEVER(indexLeadingDigit == INVALID_DIGIT)) { + return E_CELL_INVALID; + } if (_isBaseCellPolarPentagon(baseCell)) { pentagonRotations = PENTAGON_ROTATIONS_REVERSE_POLAR[revDir][indexLeadingDigit]; @@ -412,13 +448,20 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { PENTAGON_ROTATIONS_REVERSE_NONPOLAR[revDir] [indexLeadingDigit]; } + // For this to occur, revDir would need to be 1. Since revDir is + // from the index base cell (which is a pentagon) towards the + // origin, this should never be the case. + if (NEVER(pentagonRotations < 0)) { + return E_CELL_INVALID; + } - assert(pentagonRotations >= 0); for (int i = 0; i < pentagonRotations; i++) { *out = _h3RotatePent60ccw(*out); } } else { - assert(pentagonRotations >= 0); + if (pentagonRotations < 0) { + return E_CELL_INVALID; + } for (int i = 0; i < pentagonRotations; i++) { *out = _h3Rotate60ccw(*out); } @@ -432,9 +475,16 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { const int originLeadingDigit = _h3LeadingNonZeroDigit(origin); const int indexLeadingDigit = _h3LeadingNonZeroDigit(*out); + if (originLeadingDigit == INVALID_DIGIT || + indexLeadingDigit == INVALID_DIGIT) { + return E_CELL_INVALID; + } const int withinPentagonRotations = PENTAGON_ROTATIONS_REVERSE[originLeadingDigit][indexLeadingDigit]; - assert(withinPentagonRotations >= 0); + if (withinPentagonRotations < 0) { + // This occurs when an invalid K axis digit is present + return E_CELL_INVALID; + } for (int i = 0; i < withinPentagonRotations; i++) { *out = _h3Rotate60ccw(*out); @@ -442,16 +492,16 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { } if (indexOnPent) { - // TODO: There are cases in h3ToLocalIjk which are failed but not + // TODO: There are cases in cellToLocalIjk which are failed but not // accounted for here - instead just fail if the recovered index is // invalid. if (_h3LeadingNonZeroDigit(*out) == K_AXES_DIGIT) { - return 4; + return E_PENTAGON; } } H3_SET_BASE_CELL(*out, baseCell); - return 0; + return E_SUCCESS; } /** @@ -466,29 +516,29 @@ int localIjkToH3(H3Index origin, const CoordIJK* ijk, H3Index* out) { * Failure may occur if the index is too far away from the origin * or if the index is on the other side of a pentagon. * - * This function is experimental, and its output is not guaranteed + * This function's output is not guaranteed * to be compatible across different versions of H3. * * @param origin An anchoring index for the ij coordinate system. * @param index Index to find the coordinates of + * @param mode Mode, must be 0 * @param out ij coordinates of the index will be placed here on success * @return 0 on success, or another value on failure. */ -int H3_EXPORT(experimentalH3ToLocalIj)(H3Index origin, H3Index h3, - CoordIJ* out) { - // This function is currently experimental. Once ready to be part of the - // non-experimental API, this function (with the experimental prefix) will - // be marked as deprecated and to be removed in the next major version. It - // will be replaced with a non-prefixed function name. +H3Error H3_EXPORT(cellToLocalIj)(H3Index origin, H3Index index, uint32_t mode, + CoordIJ *out) { + if (mode != 0) { + return E_OPTION_INVALID; + } CoordIJK ijk; - int failed = h3ToLocalIjk(origin, h3, &ijk); + H3Error failed = cellToLocalIjk(origin, index, &ijk); if (failed) { return failed; } ijkToIj(&ijk, out); - return 0; + return E_SUCCESS; } /** @@ -500,24 +550,27 @@ int H3_EXPORT(experimentalH3ToLocalIj)(H3Index origin, H3Index h3, * Failure may occur if the index is too far away from the origin * or if the index is on the other side of a pentagon. * - * This function is experimental, and its output is not guaranteed + * This function's output is not guaranteed * to be compatible across different versions of H3. * * @param origin An anchoring index for the ij coordinate system. - * @param out ij coordinates to index. - * @param index Index will be placed here on success. + * @param ij ij coordinates to index. + * @param mode Mode, must be 0 + * @param out Index will be placed here on success. * @return 0 on success, or another value on failure. */ -int H3_EXPORT(experimentalLocalIjToH3)(H3Index origin, const CoordIJ* ij, - H3Index* out) { - // This function is currently experimental. Once ready to be part of the - // non-experimental API, this function (with the experimental prefix) will - // be marked as deprecated and to be removed in the next major version. It - // will be replaced with a non-prefixed function name. +H3Error H3_EXPORT(localIjToCell)(H3Index origin, const CoordIJ *ij, + uint32_t mode, H3Index *out) { + if (mode != 0) { + return E_OPTION_INVALID; + } CoordIJK ijk; - ijToIjk(ij, &ijk); + H3Error ijToIjkError = ijToIjk(ij, &ijk); + if (ijToIjkError) { + return ijToIjkError; + } - return localIjkToH3(origin, &ijk, out); + return localIjkToCell(origin, &ijk, out); } /** @@ -529,21 +582,23 @@ int H3_EXPORT(experimentalLocalIjToH3)(H3Index origin, const CoordIJ* ij, * * @param origin Index to find the distance from. * @param index Index to find the distance to. - * @return The distance, or a negative number if the library could not - * compute the distance. + * @param out The distance in cells + * @returns E_SUCCESS on success, or another value if the library cannot compute + * the distance. */ -int H3_EXPORT(h3Distance)(H3Index origin, H3Index h3) { +H3Error H3_EXPORT(gridDistance)(H3Index origin, H3Index index, int64_t *out) { CoordIJK originIjk, h3Ijk; - if (h3ToLocalIjk(origin, origin, &originIjk)) { - // Currently there are no tests that would cause getting the coordinates - // for an index the same as the origin to fail. - return -1; // LCOV_EXCL_LINE + H3Error originError = cellToLocalIjk(origin, origin, &originIjk); + if (originError) { + return originError; } - if (h3ToLocalIjk(origin, h3, &h3Ijk)) { - return -1; + H3Error destError = cellToLocalIjk(origin, index, &h3Ijk); + if (destError) { + return destError; } - return ijkDistance(&originIjk, &h3Ijk); + *out = ijkDistance(&originIjk, &h3Ijk); + return E_SUCCESS; } /** @@ -553,12 +608,18 @@ int H3_EXPORT(h3Distance)(H3Index origin, H3Index h3) { * * @param start Start index of the line * @param end End index of the line - * @return Size of the line, or a negative number if the line cannot - * be computed. + * @param size Size of the line + * @returns 0 on success, or another value on error */ -int H3_EXPORT(h3LineSize)(H3Index start, H3Index end) { - int distance = H3_EXPORT(h3Distance)(start, end); - return distance >= 0 ? distance + 1 : distance; +H3Error H3_EXPORT(gridPathCellsSize)(H3Index start, H3Index end, + int64_t *size) { + int64_t distance; + H3Error distanceError = H3_EXPORT(gridDistance)(start, end, &distance); + if (distanceError) { + return distanceError; + } + *size = distance + 1; + return E_SUCCESS; } /** @@ -569,10 +630,10 @@ int H3_EXPORT(h3LineSize)(H3Index start, H3Index end) { * @param k Floating-point K coord * @param ijk IJK coord struct, modified in place */ -static void cubeRound(double i, double j, double k, CoordIJK* ijk) { - int ri = round(i); - int rj = round(j); - int rk = round(k); +static void cubeRound(double i, double j, double k, CoordIJK *ijk) { + int ri = (int)round(i); + int rj = (int)round(j); + int rk = (int)round(k); double iDiff = fabs((double)ri - i); double jDiff = fabs((double)rj - j); @@ -603,21 +664,22 @@ static void cubeRound(double i, double j, double k, CoordIJK* ijk) { * * - The specific output of this function should not be considered stable * across library versions. The only guarantees the library provides are - * that the line length will be `h3Distance(start, end) + 1` and that + * that the line length will be `gridDistance(start, end) + 1` and that * every index in the line will be a neighbor of the preceding index. * - Lines are drawn in grid space, and may not correspond exactly to either * Cartesian lines or great arcs. * * @param start Start index of the line * @param end End index of the line - * @param out Output array, which must be of size h3LineSize(start, end) + * @param out Output array, which must be of size gridPathCellsSize(start, end) * @return 0 on success, or another value on failure. */ -int H3_EXPORT(h3Line)(H3Index start, H3Index end, H3Index* out) { - int distance = H3_EXPORT(h3Distance)(start, end); +H3Error H3_EXPORT(gridPathCells)(H3Index start, H3Index end, H3Index *out) { + int64_t distance; + H3Error distanceError = H3_EXPORT(gridDistance)(start, end, &distance); // Early exit if we can't calculate the line - if (distance < 0) { - return distance; + if (distanceError) { + return distanceError; } // Get IJK coords for the start and end. We've already confirmed @@ -626,29 +688,40 @@ int H3_EXPORT(h3Line)(H3Index start, H3Index end, H3Index* out) { CoordIJK endIjk = {0}; // Convert H3 addresses to IJK coords - h3ToLocalIjk(start, start, &startIjk); - h3ToLocalIjk(start, end, &endIjk); + H3Error startError = cellToLocalIjk(start, start, &startIjk); + if (NEVER(startError)) { + // Unreachable because this was called as part of gridDistance + return startError; + } + H3Error endError = cellToLocalIjk(start, end, &endIjk); + if (NEVER(endError)) { + // Unreachable because this was called as part of gridDistance + return endError; + } // Convert IJK to cube coordinates suitable for linear interpolation ijkToCube(&startIjk); ijkToCube(&endIjk); - double iStep = - distance ? (double)(endIjk.i - startIjk.i) / (double)distance : 0; - double jStep = - distance ? (double)(endIjk.j - startIjk.j) / (double)distance : 0; - double kStep = - distance ? (double)(endIjk.k - startIjk.k) / (double)distance : 0; + double invDistance = distance ? 1.0 / (double)distance : 0; + double iStep = (double)(endIjk.i - startIjk.i) * invDistance; + double jStep = (double)(endIjk.j - startIjk.j) * invDistance; + double kStep = (double)(endIjk.k - startIjk.k) * invDistance; CoordIJK currentIjk = {startIjk.i, startIjk.j, startIjk.k}; - for (int n = 0; n <= distance; n++) { + for (int64_t n = 0; n <= distance; n++) { cubeRound((double)startIjk.i + iStep * n, (double)startIjk.j + jStep * n, (double)startIjk.k + kStep * n, ¤tIjk); // Convert cube -> ijk -> h3 index cubeToIjk(¤tIjk); - localIjkToH3(start, ¤tIjk, &out[n]); + H3Error currentError = localIjkToCell(start, ¤tIjk, &out[n]); + if (currentError) { + // The cells between `start` and `end` may fall in pentagon + // distortion. + return currentError; + } } - return 0; + return E_SUCCESS; } diff --git a/src/h3lib/lib/mathExtensions.c b/src/h3lib/lib/mathExtensions.c index 52c2f59a3..4a6907054 100644 --- a/src/h3lib/lib/mathExtensions.c +++ b/src/h3lib/lib/mathExtensions.c @@ -22,13 +22,13 @@ /** * _ipow does integer exponentiation efficiently. Taken from StackOverflow. * - * @param base the integer base - * @param exp the integer exponent + * @param base the integer base (can be positive or negative) + * @param exp the integer exponent (should be nonnegative) * * @return the exponentiated value */ -int _ipow(int base, int exp) { - int result = 1; +int64_t _ipow(int64_t base, int64_t exp) { + int64_t result = 1; while (exp) { if (exp & 1) result *= base; exp >>= 1; diff --git a/src/h3lib/lib/polyfill.c b/src/h3lib/lib/polyfill.c new file mode 100644 index 000000000..40e67ecdc --- /dev/null +++ b/src/h3lib/lib/polyfill.c @@ -0,0 +1,781 @@ +/* + * Copyright 2023 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file polyfill.c + * @brief Functions relating to the cell-to-polygon algorithm + */ + +#include "polyfill.h" + +#include +#include + +#include "alloc.h" +#include "baseCells.h" +#include "coordijk.h" +#include "h3Assert.h" +#include "h3Index.h" +#include "polygon.h" + +// Factor by which to scale the cell bounding box to include all cells. +// This was determined empirically by finding the smallest factor that +// passed exhaustive tests. +#define CELL_SCALE_FACTOR 1.1 + +// Factor by which to scale the cell bounding box to include all children. +// This was determined empirically by finding the smallest factor that +// passed exhaustive tests. +#define CHILD_SCALE_FACTOR 1.4 + +/** + * Max cell edge length, in radians, for each resolution. This was computed + * by taking the max exact edge length for cells at the center of each base + * cell at that resolution. + */ +static double MAX_EDGE_LENGTH_RADS[MAX_H3_RES + 1] = { + 0.21577206265130, 0.08308767068495, 0.03148970436439, 0.01190662871439, + 0.00450053330908, 0.00170105523619, 0.00064293917678, 0.00024300820659, + 0.00009184847087, 0.00003471545901, 0.00001312121017, 0.00000495935129, + 0.00000187445860, 0.00000070847876, 0.00000026777980, 0.00000010121125}; + +/** All cells that contain the north pole, by res */ +static H3Index NORTH_POLE_CELLS[MAX_H3_RES + 1] = { + 0x8001fffffffffff, 0x81033ffffffffff, 0x820327fffffffff, 0x830326fffffffff, + 0x8403263ffffffff, 0x85032623fffffff, 0x860326237ffffff, 0x870326233ffffff, + 0x880326233bfffff, 0x890326233abffff, 0x8a0326233ab7fff, 0x8b0326233ab0fff, + 0x8c0326233ab03ff, 0x8d0326233ab03bf, 0x8e0326233ab039f, 0x8f0326233ab0399}; + +/** All cells that contain the south pole, by res */ +static H3Index SOUTH_POLE_CELLS[MAX_H3_RES + 1] = { + 0x80f3fffffffffff, 0x81f2bffffffffff, 0x82f297fffffffff, 0x83f293fffffffff, + 0x84f2939ffffffff, 0x85f29383fffffff, 0x86f29380fffffff, 0x87f29380effffff, + 0x88f29380e1fffff, 0x89f29380e0fffff, 0x8af29380e0d7fff, 0x8bf29380e0d0fff, + 0x8cf29380e0d0dff, 0x8df29380e0d0cff, 0x8ef29380e0d0cc7, 0x8ff29380e0d0cc4}; + +/** Pre-calculated bounding boxes for all res 0 cells */ +static BBox RES0_BBOXES[NUM_BASE_CELLS] = { + {1.52480158339146, 1.20305471830087, -0.60664883654036, 0.00568297271999}, + {1.52480158339146, 1.17872424267511, -0.60664883654036, 2.54046980298264}, + {1.52480158339146, 1.09069387298096, -2.85286053297673, 1.64310689027893}, + {1.41845302535151, 1.01285145697208, 0.00568297271999, -1.16770379632602}, + {1.27950477868453, 0.97226652536306, 0.55556064983494, -0.18229924845326}, + {1.32929586572429, 0.91898920750071, 2.05622344943192, 1.08813154278274}, + {1.32899086063916, 0.94271815376360, -2.29875289606378, 3.01700008041993}, + {1.26020983864103, 0.84291228415618, -0.89971867664861, -1.75967359310997}, + {1.21114673854945, 0.86170600921069, 1.19129757609455, 0.43777608996454}, + {1.21075831414294, 0.83795331049498, -1.72022875779891, -2.43793861727138}, + {1.15546530929588, 0.78982455384253, 2.53659412229266, 1.85709133451243}, + {1.15528445067052, 0.76641428724335, -3.06738507202411, 2.53646110244042}, + {1.10121643537669, 0.71330093663066, 0.09640581900154, -0.52154514518248}, + {1.07042472765165, 0.67603948819406, -0.47984202840088, -1.10306159603090}, + {1.03270228748960, 0.72356358827215, -2.24990138725146, -2.74510220919157}, + {1.01929924623886, 0.65491232835426, 0.63035574240731, 0.03537030096470}, + {1.01786037568858, 0.58827636737638, 1.53192721817065, 0.93672682511233}, + {0.98081434136020, 0.61076063532947, -2.67100636598529, 3.06516463008733}, + {0.98106023192774, 0.58679836571570, 2.02829766214461, 1.51334374970280}, + {0.96374551790056, 0.55186491737474, -1.42976721313659, -1.96852202530104}, + {0.87536136210723, 0.50008952762292, -1.92435613571430, -2.41641343219793}, + {0.88611243445554, 0.52742963716774, -0.95781946324194, -1.47628966305930}, + {0.86881343251986, 0.50770567021439, 1.03236795495839, 0.50347284027426}, + {0.89235638181782, 0.48781264892508, 2.76430302119150, 2.29989716697031}, + {0.82570569254601, 0.52173101741059, 2.30921681461428, 1.93198541828980}, + {0.80599330438546, 0.40150819579319, -3.06417559403240, 2.70079300784409}, + {0.81612079704781, 0.38396800633226, -0.21614378891839, -0.70420149722178}, + {0.75822779851431, 0.39943555383751, -2.34059978084699, -2.82127373822444}, + {0.78861390967531, 0.38742018303868, 0.23115687731652, -0.22599491086066}, + {0.71515840341957, 0.33012478438475, -0.64847976163163, -1.08249728121219}, + {0.70359051048414, 0.29148673180722, 1.71441081857246, 1.28443348381696}, + {0.69190629544818, 0.28808313184381, 0.64863909244647, 0.16372369282557}, + {0.64863235654749, 0.26290420067147, 2.10318098268379, 1.69556122548344}, + {0.65722892279906, 0.28222653310929, 1.30918693285466, 0.87594416271685}, + {0.64750997738584, 0.24149865709850, -1.30272192474556, -1.68708570163242}, + {0.62380174028378, 0.25522080363509, -2.72428423026826, 3.10401473237630}, + {0.64228460410023, 0.21206753429148, -1.67639240992071, -2.11772366767341}, + {0.59919175361146, 0.21620460836570, 2.48592868387690, 2.07350353893591}, + {0.55637406851384, 0.25276557437230, -0.99885388505694, -1.32642489358939}, + {0.55648013300665, 0.15187401321019, 2.87032088421324, 2.44642320475367}, + {0.54603687970450, 0.15589091511369, -2.06789866067060, -2.49091419631961}, + {0.51206347752697, 0.15522020377124, 0.95446767315996, 0.54443262110414}, + {0.49767951537101, 0.10944898890579, -0.04335162263358, -0.42900268178569}, + {0.46538045483671, 0.06029968637720, -0.41240613713421, -0.80603623808166}, + {0.44686891066946, 0.06926857458503, 0.32053284794952, -0.07005748900849}, + {0.43208958202064, 0.07796440938140, -3.06232453079660, 2.80602499990282}, + {0.43103892586713, 0.02927431919853, -2.41589238618422, -2.85735809951951}, + {0.38073727558986, -0.00297016159959, -0.77039553861218, -1.14788248745028}, + {0.39113816687141, -0.01518764903038, 1.49130246958290, 1.14714731736311}, + {0.33421063142418, 0.02526613430348, 1.15141032578749, 0.85000706261644}, + {0.38915669778582, -0.04371359825454, 1.88046353933242, 1.48230231380717}, + {0.33787520825987, -0.04835090128296, -1.12274014380603, -1.49454408844749}, + {0.33601418932337, -0.06675068178541, 2.23792354204464, 1.85723423013211}, + {0.31838318078049, -0.05821955623722, 0.66058854060373, 0.25452572938783}, + {0.33630761471457, -0.07589541031521, -1.47957331741818, -1.85981735718264}, + {0.28924817322870, -0.09150638064667, -1.83561930288569, -2.21855897384292}, + {0.26678632252475, -0.10058088990867, -2.76808651991421, 3.12792953247061}, + {0.29285254112587, -0.13483165093783, 2.61406468380434, 2.20466422911705}, + {0.20150342788824, -0.10279852729762, 0.06881896344365, -0.23925229432978}, + {0.21283813275258, -0.18626835417891, 2.93800440256577, 2.57470747655623}, + {0.19587614179884, -0.17237030304155, -2.16941795427335, -2.55405165906601}, + {0.17237030304155, -0.19587614179884, 0.97217469931645, 0.58754099452378}, + {0.18626835417891, -0.21283813275258, -0.20358825102402, -0.56688517703356}, + {0.10279852729762, -0.20150342788824, -3.07277369014614, 2.90234035926002}, + {0.13483165093783, -0.29285254112587, -0.52752796978545, -0.93692842447275}, + {0.10058088990867, -0.26678632252475, 0.37350613367558, -0.01366312111919}, + {0.09150638064667, -0.28924817322870, 1.30597335070410, 0.92303367974687}, + {0.07589541031521, -0.33630761471457, 1.66201933617161, 1.28177529640715}, + {0.05821955623722, -0.31838318078049, -2.48100411298606, -2.88706692420196}, + {0.06675068178541, -0.33601418932337, -0.90366911154516, -1.28435842345769}, + {0.04835090128296, -0.33787520825987, 2.01885250978376, 1.64704856514230}, + {0.04371359825454, -0.38915669778582, -1.26112911425737, -1.65929033978262}, + {-0.02526613430348, -0.33421063142418, -1.99018232780231, + -2.29158559097336}, + {0.01518764903038, -0.39113816687140, -1.65029018400690, -1.99444533622668}, + {0.00297016159959, -0.38073727558986, 2.37119711497761, 1.99371016613951}, + {-0.02927431919853, -0.43103892586713, 0.72570026740558, 0.28423455407029}, + {-0.07796440938140, -0.43208958202064, 0.07926812279319, -0.33556765368697}, + {-0.06926857458503, -0.44686891066946, -2.82105980564027, 3.07153516458131}, + {-0.06029968637720, -0.46538045483671, 2.72918651645558, 2.33555641550814}, + {-0.10944898890579, -0.49767951537101, 3.09824103095621, 2.71258997180410}, + {-0.15522020377124, -0.51206347752697, -2.18712498042983, + -2.59716003248565}, + {-0.15589091511369, -0.54603687970450, 1.07369399291919, 0.65067845727018}, + {-0.15187401321019, -0.55648013300665, -0.27127176937655, + -0.69516944883612}, + {-0.25276557437230, -0.55637406851385, 2.14273876853285, 1.81516776000041}, + {-0.21620460836570, -0.59919175361146, -0.65566396971290, + -1.06808911465388}, + {-0.21206753429148, -0.64228460410023, 1.46520024366909, 1.02386898591638}, + {-0.25522080363509, -0.62380174028378, 0.41730842332153, -0.03757792121350}, + {-0.24149865709850, -0.64750997738584, 1.83887072884423, 1.45450695195737}, + {-0.28222653310929, -0.65722892279906, -1.83240572073513, + -2.26564849087294}, + {-0.26290420067147, -0.64863235654749, -1.03841167090601, + -1.44603142810635}, + {-0.28808313184381, -0.69190629544818, -2.49295356114332, + -2.97786896076422}, + {-0.29148673180722, -0.70359051048414, -1.42718183501734, + -1.85715916977284}, + {-0.33012478438475, -0.71515840341957, 2.49311289195816, 2.05909537237761}, + {-0.38742018303868, -0.78861390967531, -2.91043577627328, 2.91559774272914}, + {-0.39943555383751, -0.75822779851431, 0.80099287274280, 0.32031891536535}, + {-0.38396800633226, -0.81612079704781, 2.92544886467140, 2.43739115636801}, + {-0.40150819579319, -0.80599330438546, 0.07741705955739, -0.44079964574570}, + {-0.52173101741059, -0.82570569254601, -0.83237583897551, + -1.20960723529999}, + {-0.48781264892508, -0.89235638181782, -0.37728963239830, + -0.84169548661948}, + {-0.50770567021439, -0.86881343251986, -2.10922469863141, + -2.63811981331554}, + {-0.52742963716774, -0.88611243445554, 2.18377319034785, 1.66530299053050}, + {-0.50008952762292, -0.87536136210723, 1.21723651787549, 0.72517922139186}, + {-0.55186491737474, -0.96374551790056, 1.71182544045320, 1.17307062828876}, + {-0.58679836571570, -0.98106023192774, -1.11329499144518, + -1.62824890388699}, + {-0.61076063532947, -0.98081434136020, 0.47058628760450, -0.07642802350246}, + {-0.58827636737638, -1.01786037568858, -1.60966543541914, + -2.20486582847747}, + {-0.65491232835426, -1.01929924623886, -2.51123691118248, + -3.10622235262510}, + {-0.72356358827215, -1.03270228748960, 0.89169126633833, 0.39649044439822}, + {-0.67603948819406, -1.07042472765165, 2.66175062518892, 2.03853105755889}, + {-0.71330093663066, -1.10121643537669, -3.04518683458825, 2.62004750840731}, + {-0.76641428724335, -1.15528445067052, 0.07420758156568, -0.60513155114938}, + {-0.78982455384253, -1.15546530929588, -0.60499853129713, + -1.28450131907736}, + {-0.83795331049498, -1.21075831414294, 1.42136389579088, 0.70365403631841}, + {-0.86170600921069, -1.21114673854945, -1.95029507749525, + -2.70381656362525}, + {-0.84291228415618, -1.26020983864103, 2.24187397694118, 1.38191906047983}, + {-0.94271815376360, -1.32899086063916, 0.84283975752601, -0.12459257316986}, + {-0.91898920750071, -1.32929586572429, -1.08536920415787, + -2.05346111080706}, + {-0.97226652536306, -1.27950477868453, -2.58603200375485, 2.95929340513654}, + {-1.01285145697208, -1.41845302535151, -3.13590968086981, 1.97388885726377}, + {-1.09069387298096, -1.52480158339146, 0.28873212061306, -1.49848576331087}, + {-1.17872424267511, -1.52480158339146, 2.53494381704943, -0.60112285060716}, + {-1.20305471830087, -1.52480158339146, -0.60112285060716, + 2.53494381704943}}; + +static BBox VALID_RANGE_BBOX = {M_PI_2, -M_PI_2, M_PI, -M_PI}; + +/** + * For a given cell, return its bounding box. If coverChildren is true, the bbox + * will be guaranteed to contain its children at any finer resolution. Note that + * no guarantee is provided as to the level of accuracy, and the bounding box + * may have a significant margin of error. + * @param cell Cell to calculate bbox for + * @param out BBox to hold output + * @param coverChildren Whether the bounding box should cover all children + */ +H3Error cellToBBox(H3Index cell, BBox *out, bool coverChildren) { + // Adjust the BBox to handle poles, if needed + int res = H3_GET_RESOLUTION(cell); + + if (res == 0) { + int baseCell = H3_GET_BASE_CELL(cell); + if (NEVER(baseCell < 0) || baseCell >= NUM_BASE_CELLS) { + return E_CELL_INVALID; + } + *out = RES0_BBOXES[baseCell]; + } else { + LatLng center; + H3Error centerErr = H3_EXPORT(cellToLatLng)(cell, ¢er); + if (centerErr != E_SUCCESS) { + return centerErr; + } + double lngRatio = 1 / cos(center.lat); + out->north = center.lat + MAX_EDGE_LENGTH_RADS[res]; + out->south = center.lat - MAX_EDGE_LENGTH_RADS[res]; + out->east = center.lng + MAX_EDGE_LENGTH_RADS[res] * lngRatio; + out->west = center.lng - MAX_EDGE_LENGTH_RADS[res] * lngRatio; + } + + // Buffer the bounding box to cover children. Call this even if no buffering + // is required in order to normalize the bbox to lat/lng bounds + scaleBBox(out, coverChildren ? CHILD_SCALE_FACTOR : CELL_SCALE_FACTOR); + + // Cell that contains the north pole + if (cell == NORTH_POLE_CELLS[res]) { + out->north = M_PI_2; + } + + // Cell that contains the south pole + if (cell == SOUTH_POLE_CELLS[res]) { + out->south = -M_PI_2; + } + + // If we contain a pole, expand the longitude to include the full domain, + // effectively making the bbox a circle around the pole. + if (out->north == M_PI_2 || out->south == -M_PI_2) { + out->east = M_PI; + out->west = -M_PI; + } + + return E_SUCCESS; +} + +/** + * Get a base cell by number, or H3_NULL if out of bounds + */ +H3Index baseCellNumToCell(int baseCellNum) { + if (baseCellNum < 0 || baseCellNum >= NUM_BASE_CELLS) { + return H3_NULL; + } + H3Index baseCell; + setH3Index(&baseCell, 0, baseCellNum, 0); + return baseCell; +} + +static void iterErrorPolygonCompact(IterCellsPolygonCompact *iter, + H3Error error) { + iterDestroyPolygonCompact(iter); + iter->error = error; +} + +/** + * Given a cell, find the next cell in the sequence of all cells + * to check in the iteration. + */ +static H3Index nextCell(H3Index cell) { + int res = H3_GET_RESOLUTION(cell); + while (true) { + // If this is a base cell, set to next base cell (or H3_NULL if done) + if (res == 0) { + return baseCellNumToCell(H3_GET_BASE_CELL(cell) + 1); + } + + // Faster cellToParent when we know the resolution is valid + // and we're only moving up one level + H3Index parent = cell; + H3_SET_RESOLUTION(parent, res - 1); + H3_SET_INDEX_DIGIT(parent, res, H3_DIGIT_MASK); + + // If not the last sibling of parent, return next sibling + Direction digit = H3_GET_INDEX_DIGIT(cell, res); + if (digit < INVALID_DIGIT - 1) { + H3_SET_INDEX_DIGIT(cell, res, + digit + ((H3_EXPORT(isPentagon)(parent) && + digit == CENTER_DIGIT) + ? 2 // Skip missing pentagon child + : 1)); + return cell; + } + // Move up to the parent for the next loop iteration + res--; + cell = parent; + } +} + +/** + * Internal function - initialize the iterator without stepping to the first + * value + */ +static IterCellsPolygonCompact _iterInitPolygonCompact( + const GeoPolygon *polygon, int res, uint32_t flags) { + IterCellsPolygonCompact iter = {// Initialize output properties. The first + // valid cell will be set in iterStep + .cell = baseCellNumToCell(0), + .error = E_SUCCESS, + // Save input arguments + ._polygon = polygon, + ._res = res, + ._flags = flags, + ._bboxes = NULL, + ._started = false}; + + if (res < 0 || res > MAX_H3_RES) { + iterErrorPolygonCompact(&iter, E_RES_DOMAIN); + return iter; + } + + H3Error flagErr = validatePolygonFlags(flags); + if (flagErr) { + iterErrorPolygonCompact(&iter, flagErr); + return iter; + } + + // Initialize bounding boxes for polygon and any holes. Memory allocated + // here must be released through iterDestroyPolygonCompact + iter._bboxes = H3_MEMORY(calloc)((polygon->numHoles + 1), sizeof(BBox)); + if (!iter._bboxes) { + iterErrorPolygonCompact(&iter, E_MEMORY_ALLOC); + return iter; + } + bboxesFromGeoPolygon(polygon, iter._bboxes); + + return iter; +} + +/** + * Initialize a IterCellsPolygonCompact struct representing the sequence of + * compact cells within the target polygon. The test for including edge cells is + * defined by the polyfill mode passed in the `flags` argument. + * + * Initialization of this object may fail, in which case the `error` property + * will be set and all iteration will return H3_NULL. It is the responsibility + * of the caller to check the error property after initialization. + * + * At any point in the iteration, starting once the struct is initialized, the + * output value can be accessed through the `cell` property. + * + * Note that initializing the iterator allocates memory. If an iterator is + * exhausted or returns an error that memory is released; otherwise it must be + * released manually with iterDestroyPolygonCompact. + * + * @param polygon Polygon to fill with compact cells + * @param res Finest resolution for output cells + * @param flags Bit mask of option flags + * @return Initialized iterator, with the first value available + */ +IterCellsPolygonCompact iterInitPolygonCompact(const GeoPolygon *polygon, + int res, uint32_t flags) { + IterCellsPolygonCompact iter = _iterInitPolygonCompact(polygon, res, flags); + + // Start the iterator by taking the first step. + // This is necessary to have a valid value after initialization. + iterStepPolygonCompact(&iter); + + return iter; +} + +/** + * Increment the polyfill iterator, running the polygon to cells algorithm. + * + * Briefly, the algorithm checks every cell in the global grid hierarchically, + * starting with the base cells. Cells coarser than the target resolution are + * checked for complete child inclusion using a bounding box guaranteed to + * contain all children. + * - If the bounding box is contained by the polygon, output is set to the cell + * - If the bounding box intersects, recurse into the first child + * - Otherwise, continue with the next cell in sequence + * + * For cells at the target resolution, a finer-grained check is used according + * to the inclusion criteria set in flags. + * + * @param iter Iterator to increment + */ +void iterStepPolygonCompact(IterCellsPolygonCompact *iter) { + H3Index cell = iter->cell; + + // once the cell is H3_NULL, the iterator returns an infinite sequence of + // H3_NULL + if (cell == H3_NULL) return; + + // For the first step, we need to evaluate the current cell; after that, we + // should start with the next cell. + if (iter->_started) { + cell = nextCell(cell); + } else { + iter->_started = true; + } + + // Short-circuit iteration for 0-vert polygon + if (iter->_polygon->geoloop.numVerts == 0) { + iterDestroyPolygonCompact(iter); + return; + } + + ContainmentMode mode = FLAG_GET_CONTAINMENT_MODE(iter->_flags); + + while (cell) { + int cellRes = H3_GET_RESOLUTION(cell); + + // Target res: Do a fine-grained check + if (cellRes == iter->_res) { + if (mode == CONTAINMENT_CENTER || mode == CONTAINMENT_OVERLAPPING || + mode == CONTAINMENT_OVERLAPPING_BBOX) { + // Check if the cell center is inside the polygon + LatLng center; + H3Error centerErr = H3_EXPORT(cellToLatLng)(cell, ¢er); + if (centerErr != E_SUCCESS) { + iterErrorPolygonCompact(iter, centerErr); + return; + } + if (pointInsidePolygon(iter->_polygon, iter->_bboxes, + ¢er)) { + // Set to next output + iter->cell = cell; + return; + } + } + if (mode == CONTAINMENT_OVERLAPPING || + mode == CONTAINMENT_OVERLAPPING_BBOX) { + // For overlapping, we need to do a quick check to determine + // whether the polygon is wholly contained by the cell. We + // check the first polygon vertex, which if it is contained + // could also mean we simply intersect. + + // Deferencing verts[0] is safe because we check numVerts above + LatLng firstVertex = iter->_polygon->geoloop.verts[0]; + + // We have to check whether the point is in the expected range + // first, because out-of-bounds values will yield false + // positives with latLngToCell + if (bboxContains(&VALID_RANGE_BBOX, &firstVertex)) { + H3Index polygonCell; + H3Error polygonCellErr = H3_EXPORT(latLngToCell)( + &(iter->_polygon->geoloop.verts[0]), cellRes, + &polygonCell); + if (NEVER(polygonCellErr != E_SUCCESS)) { + // This should be unreachable with the bbox check + iterErrorPolygonCompact(iter, polygonCellErr); + return; + } + if (polygonCell == cell) { + // Set to next output + iter->cell = cell; + return; + } + } + } + if (mode == CONTAINMENT_FULL || mode == CONTAINMENT_OVERLAPPING || + mode == CONTAINMENT_OVERLAPPING_BBOX) { + CellBoundary boundary; + H3Error boundaryErr = + H3_EXPORT(cellToBoundary)(cell, &boundary); + if (boundaryErr != E_SUCCESS) { + iterErrorPolygonCompact(iter, boundaryErr); + return; + } + BBox bbox; + H3Error bboxErr = cellToBBox(cell, &bbox, false); + if (NEVER(bboxErr != E_SUCCESS)) { + // Should be unreachable - invalid cells would be caught in + // the previous boundaryErr + iterErrorPolygonCompact(iter, bboxErr); + return; + } + // Check if the cell is fully contained by the polygon + if ((mode == CONTAINMENT_FULL || + mode == CONTAINMENT_OVERLAPPING_BBOX) && + cellBoundaryInsidePolygon(iter->_polygon, iter->_bboxes, + &boundary, &bbox)) { + // Set to next output + iter->cell = cell; + return; + } + // For overlap, we've already checked for center point inclusion + // above; if that failed, we only need to check for line + // intersection + else if ((mode == CONTAINMENT_OVERLAPPING || + mode == CONTAINMENT_OVERLAPPING_BBOX) && + cellBoundaryCrossesPolygon( + iter->_polygon, iter->_bboxes, &boundary, &bbox)) { + // Set to next output + iter->cell = cell; + return; + } + } + if (mode == CONTAINMENT_OVERLAPPING_BBOX) { + // Get a bounding box containing all the cell's children, so + // this can work for the max size calculation + BBox bbox; + H3Error bboxErr = cellToBBox(cell, &bbox, true); + if (bboxErr) { + iterErrorPolygonCompact(iter, bboxErr); + return; + } + if (bboxOverlapsBBox(&iter->_bboxes[0], &bbox)) { + CellBoundary bboxBoundary = bboxToCellBoundary(&bbox); + if ( + // cell bbox contains the polygon + bboxContainsBBox(&bbox, &iter->_bboxes[0]) || + // polygon contains cell bbox + pointInsidePolygon(iter->_polygon, iter->_bboxes, + &bboxBoundary.verts[0]) || + // polygon crosses cell bbox + cellBoundaryCrossesPolygon(iter->_polygon, + iter->_bboxes, &bboxBoundary, + &bbox)) { + iter->cell = cell; + return; + } + } + } + } + + // Coarser cell: Check the bounding box + if (cellRes < iter->_res) { + // Get a bounding box for all of the cell's children + BBox bbox; + H3Error bboxErr = cellToBBox(cell, &bbox, true); + if (bboxErr) { + iterErrorPolygonCompact(iter, bboxErr); + return; + } + if (bboxOverlapsBBox(&iter->_bboxes[0], &bbox)) { + // Quick check for possible containment + if (bboxContainsBBox(&iter->_bboxes[0], &bbox)) { + CellBoundary bboxBoundary = bboxToCellBoundary(&bbox); + // Do a fine-grained, more expensive check on the polygon + if (cellBoundaryInsidePolygon(iter->_polygon, iter->_bboxes, + &bboxBoundary, &bbox)) { + // Bounding box is fully contained, so all children are + // included. Set to next output. + iter->cell = cell; + return; + } + } + // Otherwise, the intersecting bbox means we need to test all + // children, starting with the first child + H3Index child; + H3Error childErr = + H3_EXPORT(cellToCenterChild)(cell, cellRes + 1, &child); + if (childErr) { + iterErrorPolygonCompact(iter, childErr); + return; + } + // Restart the loop with the child cell + cell = child; + continue; + } + } + + // Find the next cell in the sequence of all cells and continue + cell = nextCell(cell); + } + // If we make it out of the loop, we're done + iterDestroyPolygonCompact(iter); +} + +/** + * Destroy an iterator, releasing any allocated memory. Iterators destroyed in + * this manner are safe to use but will always return H3_NULL. + * @param iter Iterator to destroy + */ +void iterDestroyPolygonCompact(IterCellsPolygonCompact *iter) { + if (iter->_bboxes) { + H3_MEMORY(free)(iter->_bboxes); + } + iter->cell = H3_NULL; + iter->error = E_SUCCESS; + iter->_polygon = NULL; + iter->_res = -1; + iter->_flags = 0; + iter->_bboxes = NULL; +} + +/** + * Initialize a IterCellsPolygon struct representing the sequence of + * cells within the target polygon. The test for including edge cells is defined + * by the polyfill mode passed in the `flags` argument. + * + * Initialization of this object may fail, in which case the `error` property + * will be set and all iteration will return H3_NULL. It is the responsibility + * of the caller to check the error property after initialization. + * + * At any point in the iteration, starting once the struct is initialized, the + * output value can be accessed through the `cell` property. + * + * Note that initializing the iterator allocates memory. If an iterator is + * exhausted or returns an error that memory is released; otherwise it must be + * released manually with iterDestroyPolygon. + * + * @param polygon Polygon to fill with cells + * @param res Resolution for output cells + * @param flags Bit mask of option flags + * @return Initialized iterator, with the first value available + */ +IterCellsPolygon iterInitPolygon(const GeoPolygon *polygon, int res, + uint32_t flags) { + // Create the sub-iterator for compact cells + IterCellsPolygonCompact cellIter = + iterInitPolygonCompact(polygon, res, flags); + // Create the sub-iterator for children + IterCellsChildren childIter = iterInitParent(cellIter.cell, res); + + IterCellsPolygon iter = {.cell = childIter.h, + .error = cellIter.error, + ._cellIter = cellIter, + ._childIter = childIter}; + return iter; +} + +/** + * Increment the polyfill iterator, outputting the latest cell at the + * desired resolution. + * + * @param iter Iterator to increment + */ +void iterStepPolygon(IterCellsPolygon *iter) { + if (iter->cell == H3_NULL) return; + + // See if there are more children to output + iterStepChild(&(iter->_childIter)); + if (iter->_childIter.h) { + iter->cell = iter->_childIter.h; + return; + } + + // Otherwise, increment the polyfill iterator + iterStepPolygonCompact(&(iter->_cellIter)); + if (iter->_cellIter.cell) { + _iterInitParent(iter->_cellIter.cell, iter->_cellIter._res, + &(iter->_childIter)); + iter->cell = iter->_childIter.h; + return; + } + + // All done, set to null and report errors if any + iter->cell = H3_NULL; + iter->error = iter->_cellIter.error; +} + +/** + * Destroy an iterator, releasing any allocated memory. Iterators destroyed in + * this manner are safe to use but will always return H3_NULL. + * @param iter Iterator to destroy + */ +void iterDestroyPolygon(IterCellsPolygon *iter) { + iterDestroyPolygonCompact(&(iter->_cellIter)); + // null out the child iterator by passing H3_NULL + _iterInitParent(H3_NULL, 0, &(iter->_childIter)); + iter->cell = H3_NULL; + iter->error = E_SUCCESS; +} + +/** + * polygonToCells takes a given GeoJSON-like data structure and preallocated, + * zeroed memory, and fills it with the hexagons that are contained by + * the GeoJSON-like data structure. Polygons are considered in Cartesian space. + * + * @param polygon The geoloop and holes defining the relevant area + * @param res The Hexagon resolution (0-15) + * @param flags Algorithm flags such as containment mode + * @param size Maximum number of indexes to write to `out`. + * @param out The slab of zeroed memory to write to. Must be at least of size + * `size`. + */ +H3Error H3_EXPORT(polygonToCellsExperimental)(const GeoPolygon *polygon, + int res, uint32_t flags, + int64_t size, H3Index *out) { + IterCellsPolygon iter = iterInitPolygon(polygon, res, flags); + int64_t i = 0; + for (; iter.cell; iterStepPolygon(&iter)) { + if (i >= size) { + iterDestroyPolygon(&iter); + return E_MEMORY_BOUNDS; + } + out[i++] = iter.cell; + } + return iter.error; +} + +static int MAX_SIZE_CELL_THRESHOLD = 10; + +static double getAverageCellArea(int res) { + double hexAreaKm2; + H3_EXPORT(getHexagonAreaAvgKm2)(res, &hexAreaKm2); + return hexAreaKm2; +} + +/** + * maxPolygonToCellsSize returns the number of cells to allocate space for + * when performing a polygonToCells on the given GeoJSON-like data structure. + * @param polygon A GeoJSON-like data structure indicating the poly to fill + * @param res Hexagon resolution (0-15) + * @param flags Bit mask of option flags + * @param out number of cells to allocate for + * @return 0 (E_SUCCESS) on success. + */ +H3Error H3_EXPORT(maxPolygonToCellsSizeExperimental)(const GeoPolygon *polygon, + int res, uint32_t flags, + int64_t *out) { + // Special case: 0-vertex polygon + if (polygon->geoloop.numVerts == 0) { + *out = 0; + return E_SUCCESS; + } + + // Initialize the iterator without stepping, so we can adjust the res and + // flags (after they are validated by the initialization) before we start + IterCellsPolygonCompact iter = _iterInitPolygonCompact(polygon, res, flags); + + if (iter.error) { + return iter.error; + } + + // Ignore the requested flags and use the faster overlapping-bbox mode + iter._flags = CONTAINMENT_OVERLAPPING_BBOX; + + // Get a (very) rough area of the polygon bounding box + BBox *polygonBBox = &iter._bboxes[0]; + double polygonBBoxAreaKm2 = + bboxHeightRads(polygonBBox) * bboxWidthRads(polygonBBox) / + cos(fmin(fabs(polygonBBox->north), fabs(polygonBBox->south))) * + EARTH_RADIUS_KM * EARTH_RADIUS_KM; + + // Determine the res for the size estimate, based on a (very) rough estimate + // of the number of cells at various resolutions that would fit in the + // polygon. All we need here is a general order of magnitude. + while (iter._res > 0 && + polygonBBoxAreaKm2 / getAverageCellArea(iter._res - 1) > + MAX_SIZE_CELL_THRESHOLD) { + iter._res--; + } + + // Now run the polyfill, counting the output in the target res. + // We have to take the first step outside the loop, to get the first + // valid output cell + iterStepPolygonCompact(&iter); + + *out = 0; + int64_t childrenSize; + for (; iter.cell; iterStepPolygonCompact(&iter)) { + H3_EXPORT(cellToChildrenSize)(iter.cell, res, &childrenSize); + *out += childrenSize; + } + + return iter.error; +} diff --git a/src/h3lib/lib/polygon.c b/src/h3lib/lib/polygon.c index ad462d5fa..18f5b858c 100644 --- a/src/h3lib/lib/polygon.c +++ b/src/h3lib/lib/polygon.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,22 +14,23 @@ * limitations under the License. */ /** @file polygon.c - * @brief Polygon (Geofence) algorithms + * @brief Polygon (GeoLoop) algorithms */ #include "polygon.h" -#include + #include #include #include + #include "bbox.h" #include "constants.h" -#include "geoCoord.h" #include "h3api.h" +#include "latLng.h" #include "linkedGeo.h" -// Define macros used in polygon algos for Geofence -#define TYPE Geofence +// Define macros used in polygon algos for GeoLoop +#define TYPE GeoLoop #define INIT_ITERATION INIT_ITERATION_GEOFENCE #define ITERATE ITERATE_GEOFENCE #define IS_EMPTY IS_EMPTY_GEOFENCE @@ -41,15 +42,29 @@ #undef ITERATE #undef IS_EMPTY +/** + * Whether the flags for the polyfill operation are valid + * TODO: Move to polyfill.c when the old algo is removed + * @param flags Flags to validate + * @return Whether the flags are valid + */ +H3Error validatePolygonFlags(uint32_t flags) { + if (flags & (~FLAG_CONTAINMENT_MODE_MASK) || + FLAG_GET_CONTAINMENT_MODE(flags) >= CONTAINMENT_INVALID) { + return E_OPTION_INVALID; + } + return E_SUCCESS; +} + /** * Create a bounding box from a GeoPolygon * @param polygon Input GeoPolygon * @param bboxes Output bboxes, one for the outer loop and one for each hole */ -void bboxesFromGeoPolygon(const GeoPolygon* polygon, BBox* bboxes) { - bboxFromGeofence(&polygon->geofence, &bboxes[0]); +void bboxesFromGeoPolygon(const GeoPolygon *polygon, BBox *bboxes) { + bboxFromGeoLoop(&polygon->geoloop, &bboxes[0]); for (int i = 0; i < polygon->numHoles; i++) { - bboxFromGeofence(&polygon->holes[i], &bboxes[i + 1]); + bboxFromGeoLoop(&polygon->holes[i], &bboxes[i + 1]); } } @@ -57,24 +72,24 @@ void bboxesFromGeoPolygon(const GeoPolygon* polygon, BBox* bboxes) { * pointInsidePolygon takes a given GeoPolygon data structure and * checks if it contains a given geo coordinate. * - * @param geoPolygon The geofence and holes defining the relevant area - * @param bboxes The bboxes for the main geofence and each of its holes + * @param geoPolygon The geoloop and holes defining the relevant area + * @param bboxes The bboxes for the main geoloop and each of its holes * @param coord The coordinate to check * @return Whether the point is contained */ -bool pointInsidePolygon(const GeoPolygon* geoPolygon, const BBox* bboxes, - const GeoCoord* coord) { - // Start with contains state of primary geofence +bool pointInsidePolygon(const GeoPolygon *geoPolygon, const BBox *bboxes, + const LatLng *coord) { + // Start with contains state of primary geoloop bool contains = - pointInsideGeofence(&(geoPolygon->geofence), &bboxes[0], coord); + pointInsideGeoLoop(&(geoPolygon->geoloop), &bboxes[0], coord); - // If the point is contained in the primary geofence, but there are holes in - // the geofence iterate through all holes and return false if the point is + // If the point is contained in the primary geoloop, but there are holes in + // the geoloop iterate through all holes and return false if the point is // contained in any hole if (contains && geoPolygon->numHoles > 0) { for (int i = 0; i < geoPolygon->numHoles; i++) { - if (pointInsideGeofence(&(geoPolygon->holes[i]), &bboxes[i + 1], - coord)) { + if (pointInsideGeoLoop(&(geoPolygon->holes[i]), &bboxes[i + 1], + coord)) { return false; } } @@ -82,3 +97,164 @@ bool pointInsidePolygon(const GeoPolygon* geoPolygon, const BBox* bboxes, return contains; } + +/** + * Whether a cell boundary is completely contained by a polygon. + * @param geoPolygon The polygon to test + * @param bboxes The bboxes for the main geoloop and each of its holes + * @param boundary The cell boundary to test + * @return Whether the cell boundary is contained + */ +bool cellBoundaryInsidePolygon(const GeoPolygon *geoPolygon, const BBox *bboxes, + const CellBoundary *boundary, + const BBox *boundaryBBox) { + // First test a single point. Note that this fails fast if point is outside + // bounding box. + if (!pointInsidePolygon(geoPolygon, &bboxes[0], &boundary->verts[0])) { + return false; + } + + // If a point is contained, check for any line intersections + if (cellBoundaryCrossesGeoLoop(&(geoPolygon->geoloop), &bboxes[0], boundary, + boundaryBBox)) { + return false; + } + + // Convert boundary to geoloop for point-inside check + const GeoLoop boundaryLoop = {.numVerts = boundary->numVerts, + // Without this cast, the compiler complains + // that using const LatLng[] here discards + // qualifiers. But this should be safe in + // context, all downstream usage expects const + .verts = (LatLng *)boundary->verts}; + + // Check for line intersections with, or containment of, any hole + for (int i = 0; i < geoPolygon->numHoles; i++) { + // If the hole has no verts, it is not possible to intersect with it. + if (geoPolygon->holes[i].numVerts > 0 && + (pointInsideGeoLoop(&boundaryLoop, boundaryBBox, + &geoPolygon->holes[i].verts[0]) || + cellBoundaryCrossesGeoLoop(&(geoPolygon->holes[i]), &bboxes[i + 1], + boundary, boundaryBBox))) { + return false; + } + } + return true; +} + +/** + * Whether any part of a cell boundary crosses a polygon. Crossing in this case + * means whether any line segments intersect; it does not include containment. + * @param geoPolygon The polygon to test + * @param bboxes The bboxes for the main geoloop and each of its holes + * @param boundary The cell boundary to test + * @return Whether the cell boundary is contained + */ +bool cellBoundaryCrossesPolygon(const GeoPolygon *geoPolygon, + const BBox *bboxes, + const CellBoundary *boundary, + const BBox *boundaryBBox) { + // Check for line intersections with outer loop + if (cellBoundaryCrossesGeoLoop(&(geoPolygon->geoloop), &bboxes[0], boundary, + boundaryBBox)) { + return true; + } + // Check for line intersections with any hole + for (int i = 0; i < geoPolygon->numHoles; i++) { + if (cellBoundaryCrossesGeoLoop(&(geoPolygon->holes[i]), &bboxes[i + 1], + boundary, boundaryBBox)) { + return true; + } + } + return false; +} + +/** + * Whether a cell boundary crosses a geo loop. Crossing in this case means + * whether any line segments intersect; it does not include containment. + * @param geoloop Geo loop to test + * @param boundary Cell boundary to test + * @return Whether any line segments in the boundary intersect any line + * segments in the geo loop + */ +bool cellBoundaryCrossesGeoLoop(const GeoLoop *geoloop, const BBox *loopBBox, + const CellBoundary *boundary, + const BBox *boundaryBBox) { + if (!bboxOverlapsBBox(loopBBox, boundaryBBox)) { + return false; + } + LongitudeNormalization loopNormalization; + LongitudeNormalization boundaryNormalization; + bboxNormalization(loopBBox, boundaryBBox, &loopNormalization, + &boundaryNormalization); + + CellBoundary normalBoundary = *boundary; + for (int i = 0; i < boundary->numVerts; i++) { + normalBoundary.verts[i].lng = + normalizeLng(normalBoundary.verts[i].lng, boundaryNormalization); + } + + BBox normalBoundaryBBox = { + .north = boundaryBBox->north, + .south = boundaryBBox->south, + .east = normalizeLng(boundaryBBox->east, boundaryNormalization), + .west = normalizeLng(boundaryBBox->west, boundaryNormalization)}; + + LatLng loop1; + LatLng loop2; + for (int i = 0; i < geoloop->numVerts; i++) { + loop1 = geoloop->verts[i]; + loop1.lng = normalizeLng(loop1.lng, loopNormalization); + loop2 = geoloop->verts[(i + 1) % geoloop->numVerts]; + loop2.lng = normalizeLng(loop2.lng, loopNormalization); + + // Quick check if the line segment overlaps our bbox + if ((loop1.lat >= normalBoundaryBBox.north && + loop2.lat >= normalBoundaryBBox.north) || + (loop1.lat <= normalBoundaryBBox.south && + loop2.lat <= normalBoundaryBBox.south) || + (loop1.lng <= normalBoundaryBBox.west && + loop2.lng <= normalBoundaryBBox.west) || + (loop1.lng >= normalBoundaryBBox.east && + loop2.lng >= normalBoundaryBBox.east)) { + continue; + } + + for (int j = 0; j < normalBoundary.numVerts; j++) { + if (lineCrossesLine( + &loop1, &loop2, &normalBoundary.verts[j], + &normalBoundary.verts[(j + 1) % normalBoundary.numVerts])) { + return true; + } + } + } + return false; +} + +/** + * Whether two lines intersect. This is a purely Cartesian implementation + * and does not consider anti-meridian wrapping, poles, etc. Based on + * http://www.jeffreythompson.org/collision-detection/line-line.php + * @param a1 Start of line A + * @param a2 End of line A + * @param b1 Start of line B + * @param b2 End of line B + * @return Whether the lines intersect + */ +bool lineCrossesLine(const LatLng *a1, const LatLng *a2, const LatLng *b1, + const LatLng *b2) { + double denom = ((b2->lng - b1->lng) * (a2->lat - a1->lat) - + (b2->lat - b1->lat) * (a2->lng - a1->lng)); + if (!denom) return false; + + double test; + test = ((b2->lat - b1->lat) * (a1->lng - b1->lng) - + (b2->lng - b1->lng) * (a1->lat - b1->lat)) / + denom; + if (test < 0 || test > 1) return false; + + test = ((a2->lat - a1->lat) * (a1->lng - b1->lng) - + (a2->lng - a1->lng) * (a1->lat - b1->lat)) / + denom; + return (test >= 0 && test <= 1); +} diff --git a/src/h3lib/lib/vec2d.c b/src/h3lib/lib/vec2d.c index 063271741..2b4a121bf 100644 --- a/src/h3lib/lib/vec2d.c +++ b/src/h3lib/lib/vec2d.c @@ -18,6 +18,8 @@ */ #include "vec2d.h" + +#include #include #include @@ -26,7 +28,7 @@ * @param v The 2D cartesian vector. * @return The magnitude of the vector. */ -double _v2dMag(const Vec2d* v) { return sqrt(v->x * v->x + v->y * v->y); } +double _v2dMag(const Vec2d *v) { return sqrt(v->x * v->x + v->y * v->y); } /** * Finds the intersection between two lines. Assumes that the lines intersect @@ -37,15 +39,15 @@ double _v2dMag(const Vec2d* v) { return sqrt(v->x * v->x + v->y * v->y); } * @param p3 The second endpoint of the second line. * @param inter The intersection point. */ -void _v2dIntersect(const Vec2d* p0, const Vec2d* p1, const Vec2d* p2, - const Vec2d* p3, Vec2d* inter) { +void _v2dIntersect(const Vec2d *p0, const Vec2d *p1, const Vec2d *p2, + const Vec2d *p3, Vec2d *inter) { Vec2d s1, s2; s1.x = p1->x - p0->x; s1.y = p1->y - p0->y; s2.x = p3->x - p2->x; s2.y = p3->y - p2->y; - float t; + double t; t = (s2.x * (p0->y - p2->y) - s2.y * (p0->x - p2->x)) / (-s2.x * s1.y + s1.x * s2.y); @@ -54,12 +56,12 @@ void _v2dIntersect(const Vec2d* p0, const Vec2d* p1, const Vec2d* p2, } /** - * Whether two 2D vectors are equal. Does not consider possible false - * negatives due to floating-point errors. + * Whether two 2D vectors are almost equal, within some threshold * @param v1 First vector to compare * @param v2 Second vector to compare - * @return Whether the vectors are equal + * @return Whether the vectors are almost equal */ -bool _v2dEquals(const Vec2d* v1, const Vec2d* v2) { - return v1->x == v2->x && v1->y == v2->y; +bool _v2dAlmostEquals(const Vec2d *v1, const Vec2d *v2) { + return fabs(v1->x - v2->x) < FLT_EPSILON && + fabs(v1->y - v2->y) < FLT_EPSILON; } diff --git a/src/h3lib/lib/vec3d.c b/src/h3lib/lib/vec3d.c index 405591b00..0b95f1327 100644 --- a/src/h3lib/lib/vec3d.c +++ b/src/h3lib/lib/vec3d.c @@ -1,5 +1,5 @@ /* - * Copyright 2018 Uber Technologies, Inc. + * Copyright 2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ */ #include "vec3d.h" + #include /** @@ -35,7 +36,7 @@ double _square(double x) { return x * x; } * @param v2 The second 3D coordinate. * @return The square of the distance between the given points. */ -double _pointSquareDist(const Vec3d* v1, const Vec3d* v2) { +double _pointSquareDist(const Vec3d *v1, const Vec3d *v2) { return _square(v1->x - v2->x) + _square(v1->y - v2->y) + _square(v1->z - v2->z); } @@ -46,10 +47,10 @@ double _pointSquareDist(const Vec3d* v1, const Vec3d* v2) { * @param geo The latitude and longitude of the point. * @param v The 3D coordinate of the point. */ -void _geoToVec3d(const GeoCoord* geo, Vec3d* v) { +void _geoToVec3d(const LatLng *geo, Vec3d *v) { double r = cos(geo->lat); v->z = sin(geo->lat); - v->x = cos(geo->lon) * r; - v->y = sin(geo->lon) * r; + v->x = cos(geo->lng) * r; + v->y = sin(geo->lng) * r; } diff --git a/src/h3lib/lib/vertex.c b/src/h3lib/lib/vertex.c new file mode 100644 index 000000000..9038389e0 --- /dev/null +++ b/src/h3lib/lib/vertex.c @@ -0,0 +1,374 @@ +/* + * Copyright 2020-2021 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** @file vertex.h + * @brief Functions for working with cell vertexes. + */ + +#include "vertex.h" + +#include +#include + +#include "algos.h" +#include "baseCells.h" +#include "faceijk.h" +#include "h3Assert.h" +#include "h3Index.h" +#include "latLng.h" + +#define DIRECTION_INDEX_OFFSET 2 + +/** @brief Table of direction-to-face mapping for each pentagon + * + * Note that faces are in directional order, starting at J_AXES_DIGIT. + * This table is generated by the generatePentagonDirectionFaces script. + */ +static const PentagonDirectionFaces pentagonDirectionFaces[NUM_PENTAGONS] = { + {4, {4, 0, 2, 1, 3}}, {14, {6, 11, 2, 7, 1}}, + {24, {5, 10, 1, 6, 0}}, {38, {7, 12, 3, 8, 2}}, + {49, {9, 14, 0, 5, 4}}, {58, {8, 13, 4, 9, 3}}, + {63, {11, 6, 15, 10, 16}}, {72, {12, 7, 16, 11, 17}}, + {83, {10, 5, 19, 14, 15}}, {97, {13, 8, 17, 12, 18}}, + {107, {14, 9, 18, 13, 19}}, {117, {15, 19, 17, 18, 16}}, +}; + +/** + * Get the number of CCW rotations of the cell's vertex numbers + * compared to the directional layout of its neighbors. + * @param out Number of CCW rotations for the cell + */ +static H3Error vertexRotations(H3Index cell, int *out) { + // Get the face and other info for the origin + FaceIJK fijk; + H3Error err = _h3ToFaceIjk(cell, &fijk); + if (err) { + return err; + } + int baseCell = H3_EXPORT(getBaseCellNumber)(cell); + int cellLeadingDigit = _h3LeadingNonZeroDigit(cell); + + // get the base cell face + FaceIJK baseFijk; + _baseCellToFaceIjk(baseCell, &baseFijk); + + int ccwRot60 = _baseCellToCCWrot60(baseCell, fijk.face); + + if (_isBaseCellPentagon(baseCell)) { + // Find the appropriate direction-to-face mapping + PentagonDirectionFaces dirFaces; + // We never hit the end condition + int p = 0; + for (; p < NUM_PENTAGONS; p++) { + if (pentagonDirectionFaces[p].baseCell == baseCell) { + dirFaces = pentagonDirectionFaces[p]; + break; + } + } + if (p == NUM_PENTAGONS) { + return E_FAILED; + } + + // additional CCW rotation for polar neighbors or IK neighbors + if (fijk.face != baseFijk.face && + (_isBaseCellPolarPentagon(baseCell) || + fijk.face == + dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET])) { + ccwRot60 = (ccwRot60 + 1) % 6; + } + + // Check whether the cell crosses a deleted pentagon subsequence + if (cellLeadingDigit == JK_AXES_DIGIT && + fijk.face == + dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) { + // Crosses from JK to IK: Rotate CW + ccwRot60 = (ccwRot60 + 5) % 6; + } else if (cellLeadingDigit == IK_AXES_DIGIT && + fijk.face == + dirFaces.faces[JK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) { + // Crosses from IK to JK: Rotate CCW + ccwRot60 = (ccwRot60 + 1) % 6; + } + } + *out = ccwRot60; + return E_SUCCESS; +} + +/** @brief Hexagon direction to vertex number relationships (same face). + * Note that we don't use direction 0 (center). + */ +static const int directionToVertexNumHex[NUM_DIGITS] = { + INVALID_DIGIT, 3, 1, 2, 5, 4, 0}; + +/** @brief Pentagon direction to vertex number relationships (same face). + * Note that we don't use directions 0 (center) or 1 (deleted K axis). + */ +static const int directionToVertexNumPent[NUM_DIGITS] = { + INVALID_DIGIT, INVALID_DIGIT, 1, 2, 4, 3, 0}; + +/** + * Get the first vertex number for a given direction. The neighbor in this + * direction is located between this vertex number and the next number in + * sequence. + * @returns The number for the first topological vertex, or INVALID_VERTEX_NUM + * if the direction is not valid for this cell + */ +int vertexNumForDirection(const H3Index origin, const Direction direction) { + int isPent = H3_EXPORT(isPentagon)(origin); + // Check for invalid directions + if (direction == CENTER_DIGIT || direction >= INVALID_DIGIT || + (isPent && direction == K_AXES_DIGIT)) + return INVALID_VERTEX_NUM; + + // Determine the vertex rotations for this cell + int rotations; + H3Error err = vertexRotations(origin, &rotations); + if (err) { + return INVALID_VERTEX_NUM; + } + + // Find the appropriate vertex, rotating CCW if necessary + if (isPent) { + return (directionToVertexNumPent[direction] + NUM_PENT_VERTS - + rotations) % + NUM_PENT_VERTS; + } else { + return (directionToVertexNumHex[direction] + NUM_HEX_VERTS - + rotations) % + NUM_HEX_VERTS; + } +} + +/** @brief Vertex number to hexagon direction relationships (same face). + */ +static const Direction vertexNumToDirectionHex[NUM_HEX_VERTS] = { + IJ_AXES_DIGIT, J_AXES_DIGIT, JK_AXES_DIGIT, + K_AXES_DIGIT, IK_AXES_DIGIT, I_AXES_DIGIT}; + +/** @brief Vertex number to pentagon direction relationships (same face). + */ +static const Direction vertexNumToDirectionPent[NUM_PENT_VERTS] = { + IJ_AXES_DIGIT, J_AXES_DIGIT, JK_AXES_DIGIT, IK_AXES_DIGIT, I_AXES_DIGIT}; + +/** + * Get the direction for a given vertex number. This returns the direction for + * the neighbor between the given vertex number and the next number in sequence. + * @returns The direction for this vertex, or INVALID_DIGIT if the vertex + * number is invalid. + */ +Direction directionForVertexNum(const H3Index origin, const int vertexNum) { + int isPent = H3_EXPORT(isPentagon)(origin); + // Check for invalid vertexes + if (vertexNum < 0 || + vertexNum > (isPent ? NUM_PENT_VERTS : NUM_HEX_VERTS) - 1) + return INVALID_DIGIT; + + // Determine the vertex rotations for this cell + int rotations; + H3Error err = vertexRotations(origin, &rotations); + if (err) { + return INVALID_DIGIT; + } + + // Find the appropriate direction, rotating CW if necessary + return isPent ? vertexNumToDirectionPent[(vertexNum + rotations) % + NUM_PENT_VERTS] + : vertexNumToDirectionHex[(vertexNum + rotations) % + NUM_HEX_VERTS]; +} + +/** @brief Directions in CCW order */ +static const Direction DIRECTIONS[NUM_HEX_VERTS] = { + J_AXES_DIGIT, JK_AXES_DIGIT, K_AXES_DIGIT, + IK_AXES_DIGIT, I_AXES_DIGIT, IJ_AXES_DIGIT}; + +/** @brief Reverse direction from neighbor in each direction, + * given as an index into DIRECTIONS to facilitate rotation + */ +static const int revNeighborDirectionsHex[NUM_DIGITS] = { + INVALID_DIGIT, 5, 3, 4, 1, 0, 2}; + +/** + * Get a single vertex for a given cell, as an H3 index, or + * H3_NULL if the vertex is invalid + * @param cell Cell to get the vertex for + * @param vertexNum Number (index) of the vertex to calculate + * @param out Output: The vertex index + */ +H3Error H3_EXPORT(cellToVertex)(H3Index cell, int vertexNum, H3Index *out) { + int cellIsPentagon = H3_EXPORT(isPentagon)(cell); + int cellNumVerts = cellIsPentagon ? NUM_PENT_VERTS : NUM_HEX_VERTS; + int res = H3_GET_RESOLUTION(cell); + + // Check for invalid vertexes + if (vertexNum < 0 || vertexNum > cellNumVerts - 1) return E_DOMAIN; + + // Default the owner and vertex number to the input cell + H3Index owner = cell; + int ownerVertexNum = vertexNum; + + // Determine the owner, looking at the three cells that share the vertex. + // By convention, the owner is the cell with the lowest numerical index. + + // If the cell is the center child of its parent, it will always have + // the lowest index of any neighbor, so we can skip determining the owner + if (res == 0 || H3_GET_INDEX_DIGIT(cell, res) != CENTER_DIGIT) { + // Get the left neighbor of the vertex, with its rotations + Direction left = directionForVertexNum(cell, vertexNum); + if (left == INVALID_DIGIT) return E_FAILED; + int lRotations = 0; + H3Index leftNeighbor; + H3Error leftNeighborError = + h3NeighborRotations(cell, left, &lRotations, &leftNeighbor); + if (leftNeighborError) return leftNeighborError; + // Set to owner if lowest index + if (leftNeighbor < owner) owner = leftNeighbor; + + // As above, skip the right neighbor if the left is known lowest + if (res == 0 || H3_GET_INDEX_DIGIT(leftNeighbor, res) != CENTER_DIGIT) { + // Get the right neighbor of the vertex, with its rotations + // Note that vertex - 1 is the right side, as vertex numbers are CCW + Direction right = directionForVertexNum( + cell, (vertexNum - 1 + cellNumVerts) % cellNumVerts); + // This case should be unreachable; invalid verts fail earlier + if (NEVER(right == INVALID_DIGIT)) return E_FAILED; + int rRotations = 0; + H3Index rightNeighbor; + H3Error rightNeighborError = + h3NeighborRotations(cell, right, &rRotations, &rightNeighbor); + if (rightNeighborError) return rightNeighborError; + // Set to owner if lowest index + if (rightNeighbor < owner) { + owner = rightNeighbor; + Direction dir = + H3_EXPORT(isPentagon)(owner) + ? directionForNeighbor(owner, cell) + : DIRECTIONS[(revNeighborDirectionsHex[right] + + rRotations) % + NUM_HEX_VERTS]; + ownerVertexNum = vertexNumForDirection(owner, dir); + } + } + + // Determine the vertex number for the left neighbor + if (owner == leftNeighbor) { + int ownerIsPentagon = H3_EXPORT(isPentagon)(owner); + Direction dir = + ownerIsPentagon + ? directionForNeighbor(owner, cell) + : DIRECTIONS[(revNeighborDirectionsHex[left] + lRotations) % + NUM_HEX_VERTS]; + + // For the left neighbor, we need the second vertex of the + // edge, which may involve looping around the vertex nums + ownerVertexNum = vertexNumForDirection(owner, dir) + 1; + if (ownerVertexNum == NUM_HEX_VERTS || + (ownerIsPentagon && ownerVertexNum == NUM_PENT_VERTS)) { + ownerVertexNum = 0; + } + } + } + + // Create the vertex index + H3Index vertex = owner; + H3_SET_MODE(vertex, H3_VERTEX_MODE); + H3_SET_RESERVED_BITS(vertex, ownerVertexNum); + *out = vertex; + + return E_SUCCESS; +} + +/** + * Get all vertexes for the given cell + * @param cell Cell to get the vertexes for + * @param vertexes Array to hold vertex output. Must have length >= 6. + */ +H3Error H3_EXPORT(cellToVertexes)(H3Index cell, H3Index *vertexes) { + // Get all vertexes. If the cell is a pentagon, will fill the final slot + // with H3_NULL. + bool isPent = H3_EXPORT(isPentagon)(cell); + for (int i = 0; i < NUM_HEX_VERTS; i++) { + if (i == 5 && isPent) { + vertexes[i] = H3_NULL; + } else { + H3Error cellError = H3_EXPORT(cellToVertex)(cell, i, &vertexes[i]); + if (cellError) { + return cellError; + } + } + } + return E_SUCCESS; +} + +/** + * Get the geocoordinates of an H3 vertex + * @param vertex H3 index describing a vertex + * @param coord Output geo coordinate + */ +H3Error H3_EXPORT(vertexToLatLng)(H3Index vertex, LatLng *coord) { + // Get the vertex number and owner from the vertex + int vertexNum = H3_GET_RESERVED_BITS(vertex); + H3Index owner = vertex; + H3_SET_MODE(owner, H3_CELL_MODE); + H3_SET_RESERVED_BITS(owner, 0); + + // Get the single vertex from the boundary + CellBoundary gb; + FaceIJK fijk; + H3Error fijkError = _h3ToFaceIjk(owner, &fijk); + if (fijkError) { + return fijkError; + } + int res = H3_GET_RESOLUTION(owner); + + if (H3_EXPORT(isPentagon)(owner)) { + _faceIjkPentToCellBoundary(&fijk, res, vertexNum, 1, &gb); + } else { + _faceIjkToCellBoundary(&fijk, res, vertexNum, 1, &gb); + } + + // Copy from boundary to output coord + *coord = gb.verts[0]; + return E_SUCCESS; +} + +/** + * Whether the input is a valid H3 vertex + * @param vertex H3 index possibly describing a vertex + * @return Whether the input is valid + */ +int H3_EXPORT(isValidVertex)(H3Index vertex) { + if (H3_GET_MODE(vertex) != H3_VERTEX_MODE) { + return 0; + } + + int vertexNum = H3_GET_RESERVED_BITS(vertex); + H3Index owner = vertex; + H3_SET_MODE(owner, H3_CELL_MODE); + H3_SET_RESERVED_BITS(owner, 0); + + if (!H3_EXPORT(isValidCell)(owner)) { + return 0; + } + + // The easiest way to ensure that the owner + vertex number is valid, + // and that the vertex is canonical, is to recreate and compare. + H3Index canonical; + if (H3_EXPORT(cellToVertex)(owner, vertexNum, &canonical)) { + return 0; + } + + return vertex == canonical ? 1 : 0; +} diff --git a/src/h3lib/lib/vertexGraph.c b/src/h3lib/lib/vertexGraph.c index 2aaae6f38..fd7c5299d 100644 --- a/src/h3lib/lib/vertexGraph.c +++ b/src/h3lib/lib/vertexGraph.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 Uber Technologies, Inc. + * Copyright 2017-2018, 2020-2021 Uber Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,15 @@ */ #include "vertexGraph.h" + #include #include #include #include #include -#include "geoCoord.h" + +#include "alloc.h" +#include "latLng.h" /** * Initialize a new VertexGraph @@ -31,9 +34,9 @@ * @param numBuckets Number of buckets to include in the graph * @param res Resolution of the hexagons whose vertices we're storing */ -void initVertexGraph(VertexGraph* graph, int numBuckets, int res) { +void initVertexGraph(VertexGraph *graph, int numBuckets, int res) { if (numBuckets > 0) { - graph->buckets = calloc(numBuckets, sizeof(VertexNode*)); + graph->buckets = H3_MEMORY(calloc)(numBuckets, sizeof(VertexNode *)); assert(graph->buckets != NULL); } else { graph->buckets = NULL; @@ -48,34 +51,34 @@ void initVertexGraph(VertexGraph* graph, int numBuckets, int res) { * responsible for freeing memory allocated to the VertexGraph struct itself. * @param graph Graph to destroy */ -void destroyVertexGraph(VertexGraph* graph) { - VertexNode* node; +void destroyVertexGraph(VertexGraph *graph) { + VertexNode *node; while ((node = firstVertexNode(graph)) != NULL) { removeVertexNode(graph, node); } - free(graph->buckets); + H3_MEMORY(free)(graph->buckets); } /** - * Get an integer hash for a lat/lon point, at a precision determined + * Get an integer hash for a lat/lng point, at a precision determined * by the current hexagon resolution. * TODO: Light testing suggests this might not be sufficient at resolutions * finer than 10. Design a better hash function if performance and collisions * seem to be an issue here. - * @param vertex Lat/lon vertex to hash + * @param vertex Lat/lng vertex to hash * @param res Resolution of the hexagon the vertex belongs to * @param numBuckets Number of buckets in the graph * @return Integer hash */ -uint32_t _hashVertex(const GeoCoord* vertex, int res, int numBuckets) { - // Simple hash: Take the sum of the lat and lon with a precision level +uint32_t _hashVertex(const LatLng *vertex, int res, int numBuckets) { + // Simple hash: Take the sum of the lat and lng with a precision level // determined by the resolution, converted to int, modulo bucket count. - return (uint32_t)fmod(fabs((vertex->lat + vertex->lon) * pow(10, 15 - res)), + return (uint32_t)fmod(fabs((vertex->lat + vertex->lng) * pow(10, 15 - res)), numBuckets); } -void _initVertexNode(VertexNode* node, const GeoCoord* fromVtx, - const GeoCoord* toVtx) { +void _initVertexNode(VertexNode *node, const LatLng *fromVtx, + const LatLng *toVtx) { node->from = *fromVtx; node->to = *toVtx; node->next = NULL; @@ -88,16 +91,16 @@ void _initVertexNode(VertexNode* node, const GeoCoord* fromVtx, * @param toVtx End vertex * @return Pointer to the new node */ -VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, - const GeoCoord* toVtx) { +VertexNode *addVertexNode(VertexGraph *graph, const LatLng *fromVtx, + const LatLng *toVtx) { // Make the new node - VertexNode* node = malloc(sizeof(VertexNode)); + VertexNode *node = H3_MEMORY(malloc)(sizeof(VertexNode)); assert(node != NULL); _initVertexNode(node, fromVtx, toVtx); // Determine location uint32_t index = _hashVertex(fromVtx, graph->res, graph->numBuckets); // Check whether there's an existing node in that spot - VertexNode* currentNode = graph->buckets[index]; + VertexNode *currentNode = graph->buckets[index]; if (currentNode == NULL) { // Set bucket to the new node graph->buckets[index] = node; @@ -108,7 +111,7 @@ VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, if (geoAlmostEqual(¤tNode->from, fromVtx) && geoAlmostEqual(¤tNode->to, toVtx)) { // already exists, bail - free(node); + H3_MEMORY(free)(node); return currentNode; } if (currentNode->next != NULL) { @@ -129,10 +132,10 @@ VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx, * @param node Node to remove * @return 0 on success, 1 on failure (node not found) */ -int removeVertexNode(VertexGraph* graph, VertexNode* node) { +int removeVertexNode(VertexGraph *graph, VertexNode *node) { // Determine location uint32_t index = _hashVertex(&node->from, graph->res, graph->numBuckets); - VertexNode* currentNode = graph->buckets[index]; + VertexNode *currentNode = graph->buckets[index]; int found = 0; if (currentNode != NULL) { if (currentNode == node) { @@ -150,7 +153,7 @@ int removeVertexNode(VertexGraph* graph, VertexNode* node) { } } if (found) { - free(node); + H3_MEMORY(free)(node); graph->size--; return 0; } @@ -165,12 +168,12 @@ int removeVertexNode(VertexGraph* graph, VertexNode* node) { * @param toVtx End vertex, or NULL if we don't care * @return Pointer to the vertex node, if found */ -VertexNode* findNodeForEdge(const VertexGraph* graph, const GeoCoord* fromVtx, - const GeoCoord* toVtx) { +VertexNode *findNodeForEdge(const VertexGraph *graph, const LatLng *fromVtx, + const LatLng *toVtx) { // Determine location uint32_t index = _hashVertex(fromVtx, graph->res, graph->numBuckets); // Check whether there's an existing node in that spot - VertexNode* node = graph->buckets[index]; + VertexNode *node = graph->buckets[index]; if (node != NULL) { // Look through the list and see if we find the edge do { @@ -191,8 +194,7 @@ VertexNode* findNodeForEdge(const VertexGraph* graph, const GeoCoord* fromVtx, * @param fromVtx Start vertex * @return Pointer to the vertex node, if found */ -VertexNode* findNodeForVertex(const VertexGraph* graph, - const GeoCoord* fromVtx) { +VertexNode *findNodeForVertex(const VertexGraph *graph, const LatLng *fromVtx) { return findNodeForEdge(graph, fromVtx, NULL); } @@ -201,8 +203,8 @@ VertexNode* findNodeForVertex(const VertexGraph* graph, * @param graph Graph to iterate * @return Vertex node, or NULL if at the end */ -VertexNode* firstVertexNode(const VertexGraph* graph) { - VertexNode* node = NULL; +VertexNode *firstVertexNode(const VertexGraph *graph) { + VertexNode *node = NULL; int currentIndex = 0; while (node == NULL) { if (currentIndex < graph->numBuckets) { diff --git a/tests/cli/areNeighborCells.txt b/tests/cli/areNeighborCells.txt new file mode 100644 index 000000000..413836fbc --- /dev/null +++ b/tests/cli/areNeighborCells.txt @@ -0,0 +1,9 @@ +add_h3_cli_test(testCliAreNeighborCells + "areNeighborCells -o 85283473fffffff -d 85283477fffffff" "true") +add_h3_cli_test( + testCliAreNotNeighborCells + "areNeighborCells -o 85283473fffffff -d 85283472fffffff" "false") +add_h3_cli_test( + testCliAreNeighborNotCells + "areNeighborCells -o 85283473fffffff -d 852834727fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellAreaKm2.txt b/tests/cli/cellAreaKm2.txt new file mode 100644 index 000000000..2eec33caa --- /dev/null +++ b/tests/cli/cellAreaKm2.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliCellAreaKm2 "cellAreaKm2 -c 85283473fffffff" + "265.0925581283") +add_h3_cli_test(testCliNotCellAreaKm2 "cellAreaKm2 -c 115283473fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellAreaM2.txt b/tests/cli/cellAreaM2.txt new file mode 100644 index 000000000..aff859f3a --- /dev/null +++ b/tests/cli/cellAreaM2.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliCellAreaM2 "cellAreaM2 -c 85283473fffffff | xargs printf '%.3f'" + "265092558.128") +add_h3_cli_test(testCliNotCellAreaM2 "cellAreaM2 -c 115283473fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellAreaRads2.txt b/tests/cli/cellAreaRads2.txt new file mode 100644 index 000000000..7077a4a90 --- /dev/null +++ b/tests/cli/cellAreaRads2.txt @@ -0,0 +1,5 @@ +add_h3_cli_test(testCliCellAreaRads2 "cellAreaRads2 -c 85283473fffffff" + "0.0000065310") +add_h3_cli_test( + testCliNotCellAreaRads2 "cellAreaRads2 -c 115283473fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellToBoundary.txt b/tests/cli/cellToBoundary.txt new file mode 100644 index 000000000..9b4c93ebd --- /dev/null +++ b/tests/cli/cellToBoundary.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliCellToBoundary + "cellToBoundary -c 8928342e20fffff -f wkt" + "POLYGON((-122.4990471431 37.4997389893, -122.4979805011 37.5014245698, -122.4992373065 37.5029321860, -122.5015607527 37.5027541980, -122.5026273256 37.5010686174, -122.5013705214 37.4995610248, -122.4990471431 37.4997389893))" +) diff --git a/tests/cli/cellToCenterChild.txt b/tests/cli/cellToCenterChild.txt new file mode 100644 index 000000000..27dfcd627 --- /dev/null +++ b/tests/cli/cellToCenterChild.txt @@ -0,0 +1,4 @@ +add_h3_cli_test( + testCliCellToCenterChild + "cellToCenterChild -c 85283473fffffff --resolution 7 -f newline" + "872834700ffffff") diff --git a/tests/cli/cellToChildPos.txt b/tests/cli/cellToChildPos.txt new file mode 100644 index 000000000..a3eaabddc --- /dev/null +++ b/tests/cli/cellToChildPos.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliCellToChildPos "cellToChildPos -c 85283473fffffff -r 3" + "25") diff --git a/tests/cli/cellToChildren.txt b/tests/cli/cellToChildren.txt new file mode 100644 index 000000000..aa88b417c --- /dev/null +++ b/tests/cli/cellToChildren.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliCellToChildren + "cellToChildren -c 85283473fffffff -r 6" + "[ \"862834707ffffff\", \"86283470fffffff\", \"862834717ffffff\", \"86283471fffffff\", \"862834727ffffff\", \"86283472fffffff\", \"862834737ffffff\" ]" +) diff --git a/tests/cli/cellToChildrenSize.txt b/tests/cli/cellToChildrenSize.txt new file mode 100644 index 000000000..7bd93c1b6 --- /dev/null +++ b/tests/cli/cellToChildrenSize.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliCellToChildrenSize + "cellToChildrenSize -c 85283473fffffff -r 6" "7") diff --git a/tests/cli/cellToLatLng.txt b/tests/cli/cellToLatLng.txt new file mode 100644 index 000000000..7bb1bc2ad --- /dev/null +++ b/tests/cli/cellToLatLng.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliCellToLatLng "cellToLatLng -c 8928342e20fffff -f wkt" + "POINT(-122.5003039349 37.5012466151)") +add_h3_cli_test(testCliInvalidCellToLatLng "cellToLatLng -c asdf 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellToLocalIj.txt b/tests/cli/cellToLocalIj.txt new file mode 100644 index 000000000..419de4993 --- /dev/null +++ b/tests/cli/cellToLocalIj.txt @@ -0,0 +1,3 @@ +add_h3_cli_test( + testCliCellToLocalIj "cellToLocalIj -o 85283473fffffff -c 8528342bfffffff" + "[25, 13]") diff --git a/tests/cli/cellToParent.txt b/tests/cli/cellToParent.txt new file mode 100644 index 000000000..e4ded544a --- /dev/null +++ b/tests/cli/cellToParent.txt @@ -0,0 +1,4 @@ +add_h3_cli_test( + testCliCellToParent + "cellToParent -c 8928342e20fffff --resolution 3 -f newline" + "832834fffffffff") diff --git a/tests/cli/cellToVertex.txt b/tests/cli/cellToVertex.txt new file mode 100644 index 000000000..3ae62eb20 --- /dev/null +++ b/tests/cli/cellToVertex.txt @@ -0,0 +1,6 @@ +add_h3_cli_test( + testCliCellToVertex "cellToVertex -c 85283473fffffff -v 0 -f newline" + "22528340bfffffff") +add_h3_cli_test( + testCliNotCellToVertex "cellToVertex -c 115283473fffffff -v 0 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellToVertexes.txt b/tests/cli/cellToVertexes.txt new file mode 100644 index 000000000..ca764f03a --- /dev/null +++ b/tests/cli/cellToVertexes.txt @@ -0,0 +1,8 @@ +add_h3_cli_test( + testCliCellToVertexes + "cellToVertexes -c 85283473fffffff" + "[ \"22528340bfffffff\", \"235283447fffffff\", \"205283463fffffff\", \"255283463fffffff\", \"22528340ffffffff\", \"23528340bfffffff\" ]" +) +add_h3_cli_test( + testCliNotCellToVertexes "cellToVertexes -c 115283473fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/cellsToDirectedEdge.txt b/tests/cli/cellsToDirectedEdge.txt new file mode 100644 index 000000000..0b019f63a --- /dev/null +++ b/tests/cli/cellsToDirectedEdge.txt @@ -0,0 +1,8 @@ +add_h3_cli_test( + testCliCellsToDirectedEdge + "cellsToDirectedEdge -o 85283473fffffff -d 85283477fffffff -f newline" + "115283473fffffff") +add_h3_cli_test( + testCliCellsNotToDirectedEdge + "cellsToDirectedEdge -o 85283473fffffff -d 85283472fffffff 2>&1" + "Error 11: Cell arguments were not neighbors") diff --git a/tests/cli/cellsToMultiPolygon.txt b/tests/cli/cellsToMultiPolygon.txt new file mode 100644 index 000000000..d4cb4cb60 --- /dev/null +++ b/tests/cli/cellsToMultiPolygon.txt @@ -0,0 +1,70 @@ +add_h3_cli_test( + testCliCellsToMultiPolygonFile1 + "cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonFile2 + "cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonFile3 + "cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt" + "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonFile4 + "cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt" + "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonFile5 + "cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt" + "[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonStdin1 + "cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonStdin2 + "cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonStdin3 + "cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt" + "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonStdin4 + "cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt" + "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonStdin5 + "cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt" + "[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonArg1 + "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt\\\\`\"" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonArg2 + "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt\\\\`\"" + "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonArg3 + "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt\\\\`\"" + "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]" +) +add_h3_cli_test( + testCliCellsToMultiPolygonArg4 + "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt\\\\`\"" + "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]" +) diff --git a/tests/cli/childPosToCell.txt b/tests/cli/childPosToCell.txt new file mode 100644 index 000000000..037412b20 --- /dev/null +++ b/tests/cli/childPosToCell.txt @@ -0,0 +1,3 @@ +add_h3_cli_test( + testCliChildPosToCell + "childPosToCell -c 85283473fffffff -r 7 -p 42 -f newline" "872834730ffffff") diff --git a/tests/cli/compactCells.txt b/tests/cli/compactCells.txt new file mode 100644 index 000000000..8bc8b0bb4 --- /dev/null +++ b/tests/cli/compactCells.txt @@ -0,0 +1,45 @@ +add_h3_cli_test( + testCliCompactCellsFile1 + "compactCells -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsFile2 + "compactCells -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsFile3 + "compactCells -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsStdin1 + "compactCells -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsStdin2 + "compactCells -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsStdin3 + "compactCells -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsArg1 + "compactCells -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test1.txt\\\\`\" -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsArg2 + "compactCells -c \\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test2.txt\\\\` -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) +add_h3_cli_test( + testCliCompactCellsArg3 + "compactCells -c \\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/compact_test3.txt\\\\` -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff," +) diff --git a/tests/cli/degsToRads.txt b/tests/cli/degsToRads.txt new file mode 100644 index 000000000..a59b5299e --- /dev/null +++ b/tests/cli/degsToRads.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliDegsToRads "degsToRads -d 180" "3.1415926536") diff --git a/tests/cli/describeH3Error.txt b/tests/cli/describeH3Error.txt new file mode 100644 index 000000000..aabc12e6d --- /dev/null +++ b/tests/cli/describeH3Error.txt @@ -0,0 +1,7 @@ +add_h3_cli_test(testCliDescribeH3Error0 "describeH3Error -e 0" "Success") +add_h3_cli_test(testCliDescribeH3Error10 "describeH3Error -e 10" + "Duplicate input") +add_h3_cli_test(testCliDescribeH3Error13 "describeH3Error -e 13" + "Memory allocation failed") +add_h3_cli_test(testCliDescribeH3Error100 "describeH3Error -e 100" + "Invalid error code") diff --git a/tests/cli/directedEdgeToBoundary.txt b/tests/cli/directedEdgeToBoundary.txt new file mode 100644 index 000000000..c2b108a7f --- /dev/null +++ b/tests/cli/directedEdgeToBoundary.txt @@ -0,0 +1,8 @@ +add_h3_cli_test( + testCliDirectedEdgeToBoundary + "directedEdgeToBoundary -c 115283473fffffff -f wkt" + "LINESTRING (-122.0377349643 37.4201286777, -122.0904289290 37.3375560844)") +add_h3_cli_test( + testCliNotDirectedEdgeToBoundary + "directedEdgeToBoundary -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/directedEdgeToCells.txt b/tests/cli/directedEdgeToCells.txt new file mode 100644 index 000000000..a8f7da218 --- /dev/null +++ b/tests/cli/directedEdgeToCells.txt @@ -0,0 +1,6 @@ +add_h3_cli_test( + testCliDirectedEdgeToCells "directedEdgeToCells -c 115283473fffffff" + "[\"85283473fffffff\", \"85283477fffffff\"]") +add_h3_cli_test( + testCliNotDirectedEdgeToCells "directedEdgeToCells -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/edgeLengthKm.txt b/tests/cli/edgeLengthKm.txt new file mode 100644 index 000000000..b521059ad --- /dev/null +++ b/tests/cli/edgeLengthKm.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliEdgeLengthKm "edgeLengthKm -c 115283473fffffff" + "10.2947360862") +add_h3_cli_test(testCliNotEdgeLengthKm "edgeLengthKm -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/edgeLengthM.txt b/tests/cli/edgeLengthM.txt new file mode 100644 index 000000000..bcddc41be --- /dev/null +++ b/tests/cli/edgeLengthM.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliEdgeLengthM "edgeLengthM -c 115283473fffffff" + "10294.7360861995") +add_h3_cli_test(testCliNotEdgeLengthM "edgeLengthM -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/edgeLengthRads.txt b/tests/cli/edgeLengthRads.txt new file mode 100644 index 000000000..be6d14c6c --- /dev/null +++ b/tests/cli/edgeLengthRads.txt @@ -0,0 +1,5 @@ +add_h3_cli_test(testCliEdgeLengthRads "edgeLengthRads -c 115283473fffffff" + "0.0016158726") +add_h3_cli_test( + testCliNotEdgeLengthRads "edgeLengthRads -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/getBaseCellNumber.txt b/tests/cli/getBaseCellNumber.txt new file mode 100644 index 000000000..4c5b2267f --- /dev/null +++ b/tests/cli/getBaseCellNumber.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliGetBaseCellNumber "getBaseCellNumber -c 85283473fffffff" + "20") diff --git a/tests/cli/getDirectedEdgeDestination.txt b/tests/cli/getDirectedEdgeDestination.txt new file mode 100644 index 000000000..d4b7f5d8b --- /dev/null +++ b/tests/cli/getDirectedEdgeDestination.txt @@ -0,0 +1,8 @@ +add_h3_cli_test( + testCliGetDirectedEdgeDestination + "getDirectedEdgeDestination -c 115283473fffffff -f newline" + "85283477fffffff") +add_h3_cli_test( + testCliDoNotGetDirectedEdgeDestination + "getDirectedEdgeDestination -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/getDirectedEdgeOrigin.txt b/tests/cli/getDirectedEdgeOrigin.txt new file mode 100644 index 000000000..b4168c0b2 --- /dev/null +++ b/tests/cli/getDirectedEdgeOrigin.txt @@ -0,0 +1,7 @@ +add_h3_cli_test( + testCliGetDirectedEdgeOrigin + "getDirectedEdgeOrigin -c 115283473fffffff -f newline" "85283473fffffff") +add_h3_cli_test( + testCliDoNotGetDirectedEdgeOrigin + "getDirectedEdgeOrigin -c 85283473fffffff 2>&1" + "Error 6: Directed edge argument was not valid") diff --git a/tests/cli/getHexagonAreaAvgKm2.txt b/tests/cli/getHexagonAreaAvgKm2.txt new file mode 100644 index 000000000..9d5d8667b --- /dev/null +++ b/tests/cli/getHexagonAreaAvgKm2.txt @@ -0,0 +1,5 @@ +add_h3_cli_test(testCliGetHexagonAreaAvgKm2 "getHexagonAreaAvgKm2 -r 0" + "4357449.4160783831") +add_h3_cli_test( + testCliDontGetHexagonAreaAvgKm2 "getHexagonAreaAvgKm2 -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getHexagonAreaAvgM2.txt b/tests/cli/getHexagonAreaAvgM2.txt new file mode 100644 index 000000000..2a32b00c9 --- /dev/null +++ b/tests/cli/getHexagonAreaAvgM2.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliGetHexagonAreaAvgM2 "getHexagonAreaAvgM2 -r 0" + "4357449416078.3901367188") +add_h3_cli_test(testCliDontGetHexagonAreaAvgM2 "getHexagonAreaAvgM2 -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getHexagonEdgeLengthAvgKm.txt b/tests/cli/getHexagonEdgeLengthAvgKm.txt new file mode 100644 index 000000000..2a6f0eb90 --- /dev/null +++ b/tests/cli/getHexagonEdgeLengthAvgKm.txt @@ -0,0 +1,5 @@ +add_h3_cli_test(testCliGetHexagonEdgeLengthAvgKm + "getHexagonEdgeLengthAvgKm -r 0" "1281.2560110000") +add_h3_cli_test( + testCliDontGetHexagonEdgeLengthAvgKm "getHexagonEdgeLengthAvgKm -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getHexagonEdgeLengthAvgM.txt b/tests/cli/getHexagonEdgeLengthAvgM.txt new file mode 100644 index 000000000..2d734e701 --- /dev/null +++ b/tests/cli/getHexagonEdgeLengthAvgM.txt @@ -0,0 +1,5 @@ +add_h3_cli_test(testCliGetHexagonEdgeLengthAvgM "getHexagonEdgeLengthAvgM -r 0" + "1281256.0109999999") +add_h3_cli_test( + testCliDontGetHexagonEdgeLengthAvgM "getHexagonEdgeLengthAvgM -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getIcosahedronFaces.txt b/tests/cli/getIcosahedronFaces.txt new file mode 100644 index 000000000..5e458b86f --- /dev/null +++ b/tests/cli/getIcosahedronFaces.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliGetIcosahedronFaces + "getIcosahedronFaces -c 81743ffffffffff" "[3, 8, 13, 9, 4]") diff --git a/tests/cli/getNumCells.txt b/tests/cli/getNumCells.txt new file mode 100644 index 000000000..b9d998ed6 --- /dev/null +++ b/tests/cli/getNumCells.txt @@ -0,0 +1,3 @@ +add_h3_cli_test(testCliGetNumCells "getNumCells -r 0" "122") +add_h3_cli_test(testCliDontGetNumCells "getNumCells -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getPentagons.txt b/tests/cli/getPentagons.txt new file mode 100644 index 000000000..e30d18bdb --- /dev/null +++ b/tests/cli/getPentagons.txt @@ -0,0 +1,7 @@ +add_h3_cli_test( + testCliGetPentagons + "getPentagons -r 0" + "[ \"8009fffffffffff\", \"801dfffffffffff\", \"8031fffffffffff\", \"804dfffffffffff\", \"8063fffffffffff\", \"8075fffffffffff\", \"807ffffffffffff\", \"8091fffffffffff\", \"80a7fffffffffff\", \"80c3fffffffffff\", \"80d7fffffffffff\", \"80ebfffffffffff\" ]" +) +add_h3_cli_test(testCliDontGetPentagons "getPentagons -r 20 2>&1" + "Error 4: Resolution argument was outside of acceptable range") diff --git a/tests/cli/getRes0Cells.txt b/tests/cli/getRes0Cells.txt new file mode 100644 index 000000000..4c0649244 --- /dev/null +++ b/tests/cli/getRes0Cells.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliGetRes0Cells + "getRes0Cells" + "[ \"8001fffffffffff\", \"8003fffffffffff\", \"8005fffffffffff\", \"8007fffffffffff\", \"8009fffffffffff\", \"800bfffffffffff\", \"800dfffffffffff\", \"800ffffffffffff\", \"8011fffffffffff\", \"8013fffffffffff\", \"8015fffffffffff\", \"8017fffffffffff\", \"8019fffffffffff\", \"801bfffffffffff\", \"801dfffffffffff\", \"801ffffffffffff\", \"8021fffffffffff\", \"8023fffffffffff\", \"8025fffffffffff\", \"8027fffffffffff\", \"8029fffffffffff\", \"802bfffffffffff\", \"802dfffffffffff\", \"802ffffffffffff\", \"8031fffffffffff\", \"8033fffffffffff\", \"8035fffffffffff\", \"8037fffffffffff\", \"8039fffffffffff\", \"803bfffffffffff\", \"803dfffffffffff\", \"803ffffffffffff\", \"8041fffffffffff\", \"8043fffffffffff\", \"8045fffffffffff\", \"8047fffffffffff\", \"8049fffffffffff\", \"804bfffffffffff\", \"804dfffffffffff\", \"804ffffffffffff\", \"8051fffffffffff\", \"8053fffffffffff\", \"8055fffffffffff\", \"8057fffffffffff\", \"8059fffffffffff\", \"805bfffffffffff\", \"805dfffffffffff\", \"805ffffffffffff\", \"8061fffffffffff\", \"8063fffffffffff\", \"8065fffffffffff\", \"8067fffffffffff\", \"8069fffffffffff\", \"806bfffffffffff\", \"806dfffffffffff\", \"806ffffffffffff\", \"8071fffffffffff\", \"8073fffffffffff\", \"8075fffffffffff\", \"8077fffffffffff\", \"8079fffffffffff\", \"807bfffffffffff\", \"807dfffffffffff\", \"807ffffffffffff\", \"8081fffffffffff\", \"8083fffffffffff\", \"8085fffffffffff\", \"8087fffffffffff\", \"8089fffffffffff\", \"808bfffffffffff\", \"808dfffffffffff\", \"808ffffffffffff\", \"8091fffffffffff\", \"8093fffffffffff\", \"8095fffffffffff\", \"8097fffffffffff\", \"8099fffffffffff\", \"809bfffffffffff\", \"809dfffffffffff\", \"809ffffffffffff\", \"80a1fffffffffff\", \"80a3fffffffffff\", \"80a5fffffffffff\", \"80a7fffffffffff\", \"80a9fffffffffff\", \"80abfffffffffff\", \"80adfffffffffff\", \"80affffffffffff\", \"80b1fffffffffff\", \"80b3fffffffffff\", \"80b5fffffffffff\", \"80b7fffffffffff\", \"80b9fffffffffff\", \"80bbfffffffffff\", \"80bdfffffffffff\", \"80bffffffffffff\", \"80c1fffffffffff\", \"80c3fffffffffff\", \"80c5fffffffffff\", \"80c7fffffffffff\", \"80c9fffffffffff\", \"80cbfffffffffff\", \"80cdfffffffffff\", \"80cffffffffffff\", \"80d1fffffffffff\", \"80d3fffffffffff\", \"80d5fffffffffff\", \"80d7fffffffffff\", \"80d9fffffffffff\", \"80dbfffffffffff\", \"80ddfffffffffff\", \"80dffffffffffff\", \"80e1fffffffffff\", \"80e3fffffffffff\", \"80e5fffffffffff\", \"80e7fffffffffff\", \"80e9fffffffffff\", \"80ebfffffffffff\", \"80edfffffffffff\", \"80effffffffffff\", \"80f1fffffffffff\", \"80f3fffffffffff\" ]" +) diff --git a/tests/cli/getResolution.txt b/tests/cli/getResolution.txt new file mode 100644 index 000000000..120d16353 --- /dev/null +++ b/tests/cli/getResolution.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliGetResolution "getResolution -c 85283473fffffff" "5") diff --git a/tests/cli/greatCircleDistanceKm.txt b/tests/cli/greatCircleDistanceKm.txt new file mode 100644 index 000000000..de55a27ff --- /dev/null +++ b/tests/cli/greatCircleDistanceKm.txt @@ -0,0 +1,14 @@ +add_h3_cli_test(testCliGreatCircleDistanceKmArg + "greatCircleDistanceKm -c '[[0, 1], [1, 2]]'" "157.2495585118") +add_h3_cli_test( + testCliGreatCircleDistanceKmFile + "greatCircleDistanceKm -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "157.2495585118") +add_h3_cli_test( + testCliGreatCircleDistanceKmStdin + "greatCircleDistanceKm -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "157.2495585118") +add_h3_cli_test( + testCliGreatCircleDistanceKmBadArg + "greatCircleDistanceKm -c '[[0, 1]]' 2>&1" + "Only two pairs of coordinates should be provided.") diff --git a/tests/cli/greatCircleDistanceM.txt b/tests/cli/greatCircleDistanceM.txt new file mode 100644 index 000000000..ab44e516e --- /dev/null +++ b/tests/cli/greatCircleDistanceM.txt @@ -0,0 +1,14 @@ +add_h3_cli_test( + testCliGreatCircleDistanceMArg "greatCircleDistanceM -c '[[0, 1], [1, 2]]'" + "157249.5585117787") +add_h3_cli_test( + testCliGreatCircleDistanceMFile + "greatCircleDistanceM -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "157249.5585117787") +add_h3_cli_test( + testCliGreatCircleDistanceMStdin + "greatCircleDistanceM -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "157249.5585117787") +add_h3_cli_test( + testCliGreatCircleDistanceMBadArg "greatCircleDistanceM -c '[[0, 1]]' 2>&1" + "Only two pairs of coordinates should be provided.") diff --git a/tests/cli/greatCircleDistanceRads.txt b/tests/cli/greatCircleDistanceRads.txt new file mode 100644 index 000000000..3f6cee57e --- /dev/null +++ b/tests/cli/greatCircleDistanceRads.txt @@ -0,0 +1,14 @@ +add_h3_cli_test(testCliGreatCircleDistanceRadsArg + "greatCircleDistanceRads -c '[[0, 1], [1, 2]]'" "0.0246820564") +add_h3_cli_test( + testCliGreatCircleDistanceRadsFile + "greatCircleDistanceRads -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "0.0246820564") +add_h3_cli_test( + testCliGreatCircleDistanceRadsStdin + "greatCircleDistanceRads -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/great_circle_distance.txt" + "0.0246820564") +add_h3_cli_test( + testCliGreatCircleDistanceRadsBadArg + "greatCircleDistanceRads -c '[[0, 1]]' 2>&1" + "Only two pairs of coordinates should be provided.") diff --git a/tests/cli/gridDisk.txt b/tests/cli/gridDisk.txt new file mode 100644 index 000000000..f826ebda3 --- /dev/null +++ b/tests/cli/gridDisk.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliGridDisk + "gridDisk -c 85283473fffffff -k 1" + "[ \"85283473fffffff\", \"85283447fffffff\", \"8528347bfffffff\", \"85283463fffffff\", \"85283477fffffff\", \"8528340ffffffff\", \"8528340bfffffff\" ]" +) diff --git a/tests/cli/gridDiskDistances.txt b/tests/cli/gridDiskDistances.txt new file mode 100644 index 000000000..c3e0c9cf3 --- /dev/null +++ b/tests/cli/gridDiskDistances.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliGridDiskDistances + "gridDiskDistances -c 85283473fffffff -k 1" + "[[\"85283473fffffff\"], [\"85283447fffffff\", \"8528347bfffffff\", \"85283463fffffff\", \"85283477fffffff\", \"8528340ffffffff\", \"8528340bfffffff\"]]" +) diff --git a/tests/cli/gridDistance.txt b/tests/cli/gridDistance.txt new file mode 100644 index 000000000..e3d7375b7 --- /dev/null +++ b/tests/cli/gridDistance.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliGridDistance + "gridDistance -o 85283473fffffff -d 8528342bfffffff" "2") diff --git a/tests/cli/gridPathCells.txt b/tests/cli/gridPathCells.txt new file mode 100644 index 000000000..12f848efd --- /dev/null +++ b/tests/cli/gridPathCells.txt @@ -0,0 +1,3 @@ +add_h3_cli_test( + testCliGridPathCells "gridPathCells -o 85283473fffffff -d 8528342bfffffff" + "[ \"85283473fffffff\", \"85283477fffffff\", \"8528342bfffffff\" ]") diff --git a/tests/cli/gridRing.txt b/tests/cli/gridRing.txt new file mode 100644 index 000000000..2ef49e4d1 --- /dev/null +++ b/tests/cli/gridRing.txt @@ -0,0 +1,5 @@ +add_h3_cli_test( + testCliGridRing + "gridRing -c 85283473fffffff -k 1" + "[ \"8528340bfffffff\", \"85283447fffffff\", \"8528347bfffffff\", \"85283463fffffff\", \"85283477fffffff\", \"8528340ffffffff\" ]" +) diff --git a/tests/cli/intToString.txt b/tests/cli/intToString.txt new file mode 100644 index 000000000..95f2e5098 --- /dev/null +++ b/tests/cli/intToString.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliIntToString "intToString -c 599686042433355775" + "85283473fffffff") diff --git a/tests/cli/isPentagon.txt b/tests/cli/isPentagon.txt new file mode 100644 index 000000000..9e86d888e --- /dev/null +++ b/tests/cli/isPentagon.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliIsPentagon "isPentagon -c 85283473fffffff" "false") diff --git a/tests/cli/isResClassIII.txt b/tests/cli/isResClassIII.txt new file mode 100644 index 000000000..ec31d3110 --- /dev/null +++ b/tests/cli/isResClassIII.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliIsResClassIII "isResClassIII -c 85283473fffffff" "true") diff --git a/tests/cli/isValidCell.txt b/tests/cli/isValidCell.txt new file mode 100644 index 000000000..5de8b85fd --- /dev/null +++ b/tests/cli/isValidCell.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliIsValidCell "isValidCell -c 85283473fffffff" "true") +add_h3_cli_test(testCliIsNotValidCell "isValidCell -c 85283473ffff" "false") diff --git a/tests/cli/isValidDirectedEdge.txt b/tests/cli/isValidDirectedEdge.txt new file mode 100644 index 000000000..ee44fdaaf --- /dev/null +++ b/tests/cli/isValidDirectedEdge.txt @@ -0,0 +1,4 @@ +add_h3_cli_test(testCliIsValidDirectedEdge + "isValidDirectedEdge -c 115283473fffffff" "true") +add_h3_cli_test(testCliIsNotValidDirectedEdge + "isValidDirectedEdge -c 85283473fffffff" "false") diff --git a/tests/cli/isValidVertex.txt b/tests/cli/isValidVertex.txt new file mode 100644 index 000000000..ecf62f5b7 --- /dev/null +++ b/tests/cli/isValidVertex.txt @@ -0,0 +1,3 @@ +add_h3_cli_test(testCliIsValidVertex "isValidVertex -c 22528340bfffffff" "true") +add_h3_cli_test(testCliIsNotValidVertex "isValidVertex -c 85283473fffffff" + "false") diff --git a/tests/cli/latLngToCell.txt b/tests/cli/latLngToCell.txt new file mode 100644 index 000000000..8da866d12 --- /dev/null +++ b/tests/cli/latLngToCell.txt @@ -0,0 +1,3 @@ +add_h3_cli_test( + testCliLatLngToCell "latLngToCell --lat 20 --lng 123 -r 2 -f newline" + "824b9ffffffffff") diff --git a/tests/cli/localIjToCell.txt b/tests/cli/localIjToCell.txt new file mode 100644 index 000000000..81079816d --- /dev/null +++ b/tests/cli/localIjToCell.txt @@ -0,0 +1,3 @@ +add_h3_cli_test( + testCliLocalIjToCell + "localIjToCell -o 85283473fffffff -i 25 -j 13 -f newline" "8528342bfffffff") diff --git a/tests/cli/maxPolygonToCellsSize.txt b/tests/cli/maxPolygonToCellsSize.txt new file mode 100644 index 000000000..e7d95ee8a --- /dev/null +++ b/tests/cli/maxPolygonToCellsSize.txt @@ -0,0 +1,32 @@ +add_h3_cli_test( + testCliMaxPolygonToCellsSizeFile1 + "maxPolygonToCellsSize -r 7 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt" + "100") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeFile2 + "maxPolygonToCellsSize -r 7 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt" + "23") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeFile3 + "maxPolygonToCellsSize -r 4 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt" + "3484") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeStdin1 + "maxPolygonToCellsSize -r 7 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt" + "100") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeStdin2 + "maxPolygonToCellsSize -r 7 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt" + "23") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeStdin3 + "maxPolygonToCellsSize -r 4 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt" + "3484") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeArg1 + "maxPolygonToCellsSize -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt\\\\`\"" + "100") +add_h3_cli_test( + testCliMaxPolygonToCellsSizeArg2 + "maxPolygonToCellsSize -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt\\\\`\"" + "23") diff --git a/tests/cli/originToDirectedEdges.txt b/tests/cli/originToDirectedEdges.txt new file mode 100644 index 000000000..8e7af91c9 --- /dev/null +++ b/tests/cli/originToDirectedEdges.txt @@ -0,0 +1,9 @@ +add_h3_cli_test( + testCliOriginToDirectedEdges + "originToDirectedEdges -c 85283473fffffff" + "[\"115283473fffffff\", \"125283473fffffff\", \"135283473fffffff\", \"145283473fffffff\", \"155283473fffffff\", \"165283473fffffff\"]" +) +add_h3_cli_test( + testCliNotOriginToDirectedEdges + "originToDirectedEdges -c 115283473fffffff 2>&1" + "Error 5: Cell argument was not valid") diff --git a/tests/cli/pentagonCount.txt b/tests/cli/pentagonCount.txt new file mode 100644 index 000000000..bc79f391a --- /dev/null +++ b/tests/cli/pentagonCount.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliPentagonCount "pentagonCount" "12") diff --git a/tests/cli/polygonToCells.txt b/tests/cli/polygonToCells.txt new file mode 100644 index 000000000..d6e02416e --- /dev/null +++ b/tests/cli/polygonToCells.txt @@ -0,0 +1,35 @@ +add_h3_cli_test( + testCliPolygonToCellsFile1 + "polygonToCells -r 7 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff," +) +add_h3_cli_test( + testCliPolygonToCellsFile2 + "polygonToCells -r 7 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "872830828ffffff,87283082effffff,") +add_h3_cli_test( + testCliPolygonToCellsFile3 + "polygonToCells -r 4 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "84f05a3ffffffff,84e720bffffffff,84e7257ffffffff,84e725bffffffff,") +add_h3_cli_test( + testCliPolygonToCellsStdin1 + "polygonToCells -r 7 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff," +) +add_h3_cli_test( + testCliPolygonToCellsStdin2 + "polygonToCells -r 7 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "872830828ffffff,87283082effffff,") +add_h3_cli_test( + testCliPolygonToCellsStdin3 + "polygonToCells -r 4 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "84f05a3ffffffff,84e720bffffffff,84e7257ffffffff,84e725bffffffff,") +add_h3_cli_test( + testCliPolygonToCellsArg1 + "polygonToCells -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt\\\\`\" -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff," +) +add_h3_cli_test( + testCliPolygonToCellsArg2 + "polygonToCells -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt\\\\`\" -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "872830828ffffff,87283082effffff,") diff --git a/tests/cli/radsToDegs.txt b/tests/cli/radsToDegs.txt new file mode 100644 index 000000000..d864100e6 --- /dev/null +++ b/tests/cli/radsToDegs.txt @@ -0,0 +1 @@ +add_h3_cli_test(testCliRadsToDegs "radsToDegs -r 3.1415926536" "180.0000000006") diff --git a/tests/cli/stringToInt.txt b/tests/cli/stringToInt.txt new file mode 100644 index 000000000..63277829f --- /dev/null +++ b/tests/cli/stringToInt.txt @@ -0,0 +1,2 @@ +add_h3_cli_test(testCliStringToInt "stringToInt -c 85283473fffffff" + "599686042433355775") diff --git a/tests/cli/uncompactCells.txt b/tests/cli/uncompactCells.txt new file mode 100644 index 000000000..c6c32a432 --- /dev/null +++ b/tests/cli/uncompactCells.txt @@ -0,0 +1,45 @@ +add_h3_cli_test( + testCliUncompactCellsFile1 + "uncompactCells -r 5 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsFile2 + "uncompactCells -r 5 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsFile3 + "uncompactCells -r 5 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsStdin1 + "uncompactCells -r 5 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test1.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsStdin2 + "uncompactCells -r 5 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test2.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsStdin3 + "uncompactCells -r 5 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test3.txt -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsArg1 + "uncompactCells -r 5 -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test1.txt\\\\`\" -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsArg2 + "uncompactCells -r 5 -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test2.txt\\\\`\" -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) +add_h3_cli_test( + testCliUncompactCellsArg3 + "uncompactCells -r 5 -c \\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/uncompact_test3.txt\\\\` -f newline | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" + "85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,85283463fffffff,85283467fffffff,8528346bfffffff,8528346ffffffff,85283473fffffff,85283477fffffff,8528347bfffffff," +) diff --git a/tests/cli/vertexToLatLng.txt b/tests/cli/vertexToLatLng.txt new file mode 100644 index 000000000..72e1bba22 --- /dev/null +++ b/tests/cli/vertexToLatLng.txt @@ -0,0 +1,6 @@ +add_h3_cli_test( + testCliVertexToLatLng "vertexToLatLng -c 22528340bfffffff -f wkt" + "POINT(-121.9150803271 37.2713558667)") +add_h3_cli_test( + testCliNotVertexToLatLng "vertexToLatLng -c 85283473fffffff 2>&1" + "Error 8: Vertex argument was not valid") diff --git a/tests/inputfiles/compact_test1.txt b/tests/inputfiles/compact_test1.txt new file mode 100644 index 000000000..b7c763104 --- /dev/null +++ b/tests/inputfiles/compact_test1.txt @@ -0,0 +1,19 @@ +"85283473fffffff", +"85283447fffffff", +"8528347bfffffff", +"85283463fffffff", +"85283477fffffff", +"8528340ffffffff", +"8528340bfffffff", +"85283457fffffff", +"85283443fffffff", +"8528344ffffffff", +"852836b7fffffff", +"8528346bfffffff", +"8528346ffffffff", +"85283467fffffff", +"8528342bfffffff", +"8528343bfffffff", +"85283407fffffff", +"85283403fffffff", +"8528341bfffffff" diff --git a/tests/inputfiles/compact_test2.txt b/tests/inputfiles/compact_test2.txt new file mode 100644 index 000000000..6200da6f9 --- /dev/null +++ b/tests/inputfiles/compact_test2.txt @@ -0,0 +1 @@ +"85283473fffffff","85283447fffffff","8528347bfffffff","85283463fffffff","85283477fffffff","8528340ffffffff","8528340bfffffff","85283457fffffff","85283443fffffff","8528344ffffffff","852836b7fffffff","8528346bfffffff","8528346ffffffff","85283467fffffff","8528342bfffffff","8528343bfffffff","85283407fffffff","85283403fffffff","8528341bfffffff" diff --git a/tests/inputfiles/compact_test3.txt b/tests/inputfiles/compact_test3.txt new file mode 100644 index 000000000..376a93988 --- /dev/null +++ b/tests/inputfiles/compact_test3.txt @@ -0,0 +1 @@ +85283473fffffff,85283447fffffff,8528347bfffffff,85283463fffffff,85283477fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528346bfffffff,8528346ffffffff,85283467fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff diff --git a/tests/inputfiles/great_circle_distance.txt b/tests/inputfiles/great_circle_distance.txt new file mode 100644 index 000000000..0b812a23d --- /dev/null +++ b/tests/inputfiles/great_circle_distance.txt @@ -0,0 +1 @@ +[[0, 1], [1, 2]] diff --git a/tests/inputfiles/multipolygon_test1.txt b/tests/inputfiles/multipolygon_test1.txt new file mode 100644 index 000000000..e1fd89ca0 --- /dev/null +++ b/tests/inputfiles/multipolygon_test1.txt @@ -0,0 +1 @@ +872830828ffffff,87283082effffff diff --git a/tests/inputfiles/multipolygon_test2.txt b/tests/inputfiles/multipolygon_test2.txt new file mode 100644 index 000000000..88796cfc8 --- /dev/null +++ b/tests/inputfiles/multipolygon_test2.txt @@ -0,0 +1 @@ +872830828ffffff,87283082effffff,872831828ffffff diff --git a/tests/inputfiles/multipolygon_test3.txt b/tests/inputfiles/multipolygon_test3.txt new file mode 100644 index 000000000..b95aff5d9 --- /dev/null +++ b/tests/inputfiles/multipolygon_test3.txt @@ -0,0 +1,8 @@ +[ + "8528340bfffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff" +] diff --git a/tests/inputfiles/multipolygon_test4.txt b/tests/inputfiles/multipolygon_test4.txt new file mode 100644 index 000000000..5419066a5 --- /dev/null +++ b/tests/inputfiles/multipolygon_test4.txt @@ -0,0 +1,9 @@ +[ + "8528340bfffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff", + "8528840ffffffff" +] diff --git a/tests/inputfiles/multipolygon_test5.txt b/tests/inputfiles/multipolygon_test5.txt new file mode 100644 index 000000000..90e826f73 --- /dev/null +++ b/tests/inputfiles/multipolygon_test5.txt @@ -0,0 +1,129 @@ +[ + "85283473fffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff", + "8528340bfffffff", + "85283457fffffff", + "85283443fffffff", + "8528344ffffffff", + "852836b7fffffff", + "8528346bfffffff", + "8528346ffffffff", + "85283467fffffff", + "8528342bfffffff", + "8528343bfffffff", + "85283407fffffff", + "85283403fffffff", + "8528341bfffffff", + "852834cffffffff", + "85283453fffffff", + "8528345bfffffff", + "8528344bfffffff", + "852836b3fffffff", + "852836a3fffffff", + "852836a7fffffff", + "852830d3fffffff", + "852830d7fffffff", + "8528309bfffffff", + "85283093fffffff", + "8528342ffffffff", + "85283423fffffff", + "85283433fffffff", + "852834abfffffff", + "85283417fffffff", + "85283413fffffff", + "852834c7fffffff", + "852834c3fffffff", + "852834cbfffffff", + "8529a927fffffff", + "8529a92ffffffff", + "85283697fffffff", + "85283687fffffff", + "852836bbfffffff", + "852836abfffffff", + "852836affffffff", + "852830dbfffffff", + "852830c3fffffff", + "852830c7fffffff", + "8528308bfffffff", + "85283083fffffff", + "85283097fffffff", + "8528355bfffffff", + "85283427fffffff", + "85283437fffffff", + "852834affffffff", + "852834a3fffffff", + "852834bbfffffff", + "8528348ffffffff", + "8528348bfffffff", + "852834d7fffffff", + "852834d3fffffff", + "852834dbfffffff", + "8529a937fffffff", + "8529a923fffffff", + "8529a92bfffffff", + "85283693fffffff", + "85283683fffffff", + "8528368ffffffff", + "85283617fffffff", + "85283607fffffff", + "85283633fffffff", + "85283637fffffff", + "852830cbfffffff", + "852830cffffffff", + "8528301bfffffff", + "85283013fffffff", + "8528308ffffffff", + "85283087fffffff", + "8528354bfffffff", + "85283543fffffff", + "85283553fffffff", + "852835cbfffffff", + "852835dbfffffff", + "852834a7fffffff", + "852834b7fffffff", + "852834b3fffffff", + "85283487fffffff", + "85283483fffffff", + "8528349bfffffff", + "85291a6ffffffff", + "85291a6bfffffff", + "8529a9a7fffffff", + "8529a9affffffff", + "8529a933fffffff", + "8529a93bfffffff", + "8529a977fffffff", + "8529a967fffffff", + "8528369bfffffff", + "8528368bfffffff", + "85283613fffffff", + "85283603fffffff", + "8528360ffffffff", + "8528363bfffffff", + "85283623fffffff", + "85283627fffffff", + "85283053fffffff", + "85283057fffffff", + "8528300bfffffff", + "85283003fffffff", + "85283017fffffff", + "852830bbfffffff", + "852830b3fffffff", + "8528354ffffffff", + "85283547fffffff", + "85283557fffffff", + "852835cffffffff", + "852835c3fffffff", + "852835d3fffffff", + "85291b6bfffffff", + "85291b7bfffffff", + "85291b4ffffffff", + "85291b4bfffffff", + "85283497fffffff", + "85283493fffffff", + "85291a67fffffff", + "85291a63fffffff" +] \ No newline at end of file diff --git a/tests/inputfiles/polygon_test1.txt b/tests/inputfiles/polygon_test1.txt new file mode 100644 index 000000000..b501b0dbd --- /dev/null +++ b/tests/inputfiles/polygon_test1.txt @@ -0,0 +1 @@ +[[37.813318999983238, -122.4089866999972145],[37.7198061999978478, -122.3544736999993603],[37.8151571999998453, -122.4798767000009008]] diff --git a/tests/inputfiles/polygon_test2.txt b/tests/inputfiles/polygon_test2.txt new file mode 100644 index 000000000..0f6931856 --- /dev/null +++ b/tests/inputfiles/polygon_test2.txt @@ -0,0 +1 @@ +[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]] diff --git a/tests/inputfiles/polygon_test3.txt b/tests/inputfiles/polygon_test3.txt new file mode 100644 index 000000000..103c7b2b7 --- /dev/null +++ b/tests/inputfiles/polygon_test3.txt @@ -0,0 +1 @@ +[[[-72.10216675837141,42.02881055787289],[-72.10206675833835,42.02880455787487],[-72.09981175759619,42.02873155793174],[-72.09512675605,42.028505558035576],[-72.09498875600451,42.028499558038746],[-72.09040575449204,42.028279558140476],[-72.08966675424904,42.02825955815985],[-72.08940975416454,42.02825255816659],[-72.08915275407996,42.028244558173135],[-72.08914575407765,42.02824455817335],[-72.08913375407373,42.02824455817373],[-72.08603775305552,42.02815855825446],[-72.08583475298875,42.0281525582597],[-72.08477175263789,42.02810055828309],[-72.08453575256036,42.02809555828955],[-72.08176675165087,42.02803955836576],[-72.07342674889455,42.027570558537484],[-72.07204974844211,42.02754055857496],[-72.07183974837311,42.02753555858058],[-72.06698974677964,42.02743055871266],[-72.06349674563202,42.02735555880787],[-72.06246374529377,42.02735355883991],[-72.05975074440549,42.02734955892428],[-72.05944874430675,42.02735155893413],[-72.05313274224213,42.02740255914211],[-72.05287174215681,42.0274045591507],[-72.05283874214605,42.027405559151916],[-72.0479477405442,42.02739155930264],[-72.04677874016136,42.02738855933873],[-72.04655274008736,42.02738855934582],[-72.04632774001365,42.027387559352675],[-72.04486973953615,42.027383559397634],[-72.04477473950504,42.02738355940062],[-72.04247973875344,42.027377559471425],[-72.0408677382237,42.02734155951504],[-72.03954773778995,42.02731255955082],[-72.03481973623647,42.02721155967959],[-72.03464673617962,42.02720755968425],[-72.03464473617896,42.02720755968431],[-72.03276473556124,42.02716755973553],[-72.02980273458864,42.027115559818355],[-72.02965673454067,42.027112559822356],[-72.02951073449277,42.02711055982654],[-72.02808873402581,42.02708555986628],[-72.02802673400548,42.02708455986803],[-72.02374473259947,42.02701055998793],[-72.02261873223101,42.027013560023775],[-72.01325872916954,42.0270645603267],[-72.01044672824587,42.02701056040436],[-72.0103447282123,42.027007560406965],[-72.01011472813485,42.026969560406854],[-72.01003672810933,42.02696956040929],[-72.00598072677884,42.026924560527576],[-72.00596872677492,42.02692456052796],[-72.00142872529025,42.026955560675994],[-71.99951872466563,42.02696856073825],[-71.99833472427979,42.027000560781445],[-71.99310272256314,42.026936560932796],[-71.9921617222546,42.026928560960684],[-71.98893572119688,42.02690256105657],[-71.98768072078539,42.02689256109388],[-71.98764872077486,42.02689156109469],[-71.98682872050509,42.026868561115904],[-71.97878271785758,42.02663756132297],[-71.97862271780491,42.026632561327006],[-71.97647571710034,42.02660456138872],[-71.97596071693133,42.02659756140347],[-71.97509071664582,42.02658656142853],[-71.97422171636062,42.02657456145339],[-71.97399471628616,42.02657256146008],[-71.97376871621199,42.02656956146657],[-71.97226271571775,42.02654956150976],[-71.97135171541878,42.026537561535925],[-71.97123071537877,42.02653056153836],[-71.96743671412446,42.02631756161588],[-71.96739671411126,42.026315561616734],[-71.96672071388906,42.02630056163498],[-71.963021712674,42.026232561737416],[-71.96134371212213,42.026189561781536],[-71.95982971162417,42.026150561821304],[-71.95876571127418,42.02612256184914],[-71.95866971124264,42.02612056185174],[-71.95857171121042,42.02611856185442],[-71.95844671116933,42.02611556185774],[-71.95832171112824,42.02611256186107],[-71.95794971100597,42.02610456187114],[-71.95646671051888,42.02607856191244],[-71.95621871043745,42.026074561919415],[-71.9560937103964,42.02607256192292],[-71.95538871016521,42.02606656194378],[-71.95524971011963,42.02606556194793],[-71.95445970986056,42.02605856197124],[-71.95441570984615,42.02605856197261],[-71.95428470980313,42.026056561976326],[-71.9521997091126,42.025918562014844],[-71.95207870907272,42.02591356201765],[-71.94655170725838,42.02583456217492],[-71.94649170723861,42.025832562176426],[-71.94453270659254,42.02575156222195],[-71.94442370655656,42.025746562224384],[-71.94413670646192,42.02573456223103],[-71.93991770507233,42.0255925623353],[-71.93930270487037,42.02558256235256],[-71.93790070441005,42.025561562392255],[-71.93789470440811,42.02556156239245],[-71.93692570408804,42.025512562413226],[-71.92885670143522,42.02532856262941],[-71.92571870040358,42.02525756271357],[-71.92094369883367,42.0251485628414],[-71.92078169878037,42.02514456284566],[-71.91911069823074,42.02510156288947],[-71.91697069752674,42.02504556294535],[-71.91311569625859,42.0249455630462],[-71.90318069299035,42.02468856330612],[-71.90286069288507,42.02468056331454],[-71.90101269227816,42.0246505633663],[-71.90076569219686,42.024643563372635],[-71.89554769048004,42.024504563508295],[-71.89135668910112,42.024392563617155],[-71.89078068891155,42.02437656363199],[-71.89033368876571,42.024386563647816],[-71.89020468872361,42.02438956365242],[-71.89015668870795,42.024390563654094],[-71.89007668868186,42.02439256365698],[-71.88994868863992,42.02439256366097],[-71.8898276886003,42.02439256366473],[-71.88970668856066,42.02439256366849],[-71.88946868848271,42.0243925636759],[-71.88802368801154,42.02443056372817],[-71.88797968799722,42.02443156372972],[-71.88440768682035,42.02430856381717],[-71.88409468671938,42.024336563832286],[-71.88380468662575,42.024360563845924],[-71.88330668646023,42.02431756385313],[-71.88306868638111,42.02429656385649],[-71.88283568630557,42.02431056386643],[-71.88264868624528,42.02432756387553],[-71.88217368608947,42.02432356388953],[-71.87959368524322,42.02430256396571],[-71.87738268451801,42.024284564031014],[-71.87727468448291,42.02428956403532],[-71.87443968355174,42.02424356411461],[-71.8729726830778,42.02436156418294],[-71.8714096825588,42.02423556420727],[-71.87118068248276,42.024217564210915],[-71.86598068077409,42.024121564354054],[-71.86591768075347,42.02412156435601],[-71.86191967944387,42.02412156448024],[-71.86090667911203,42.02412156451171],[-71.86039867894564,42.02412156452748],[-71.85932367859351,42.024121564560886],[-71.85499067717213,42.024085564688555],[-71.853852676799,42.024079564722726],[-71.85335467663559,42.02407456473724],[-71.8525536763728,42.02406756476077],[-71.85077267578849,42.02405156481299],[-71.8507026757655,42.02405056481497],[-71.8498216754765,42.02404356484097],[-71.84572667413322,42.02401056496176],[-71.84571767413026,42.02401056496204],[-71.84561767409745,42.02400956496494],[-71.84559567409026,42.024009564965645],[-71.84430167366524,42.02398956500195],[-71.84413867361167,42.02398656500643],[-71.84397567355816,42.023984565011105],[-71.84284567318704,42.0239675650429],[-71.84256767309576,42.023963565050764],[-71.8416476727937,42.023951565077006],[-71.84164667279337,42.02395156507704],[-71.8403156723569,42.02394356511682],[-71.83928167201789,42.02393856514795],[-71.83925067200772,42.0239385651489],[-71.83786767155422,42.02393056519028],[-71.83761467147129,42.023929565197946],[-71.83760367146768,42.02392956519828],[-71.83746767142314,42.0239295652025],[-71.83575067086151,42.023945565258856],[-71.8357236708527,42.023945565259694],[-71.83535567073122,42.02392956526804],[-71.83458767047782,42.0238965652855],[-71.8345226704564,42.023894565287144],[-71.8334166700918,42.023853565313566],[-71.83340467008784,42.02385356531394],[-71.83332267006088,42.023851565316086],[-71.83230766972736,42.023833565344106],[-71.83229966972473,42.02383356534435],[-71.83223466970345,42.02383356534637],[-71.8308596692539,42.023849565392105],[-71.83063766918048,42.02383756539669],[-71.83056366915602,42.023833565398206],[-71.83055666915374,42.02383356539841],[-71.82848966847487,42.023803565456774],[-71.82732266809157,42.023785565489504],[-71.82721966805774,42.02378356549231],[-71.8238676669561,42.02372156558432],[-71.82324366675519,42.023784565615806],[-71.82121466608885,42.023755565673135],[-71.80865166196268,42.02357156602709],[-71.80466666065384,42.02351356613937],[-71.80258665997152,42.023498566200914],[-71.80255965996268,42.02349856620176],[-71.80254565995814,42.02349956620238],[-71.80064965934129,42.023577566276145],[-71.80028165913242,42.021992565982245],[-71.8002806591315,42.021981565980155],[-71.80028165913177,42.02198056597992],[-71.79989865864611,42.01551356474602],[-71.79989365864134,42.01545756473539],[-71.7998926586408,42.01545356473464],[-71.7998026585635,42.014594564571944],[-71.7997586585254,42.014169564491446],[-71.79956265835696,42.01229756413683],[-71.799242658017,42.00807356333288],[-71.79919565778751,42.00422656259301],[-71.7991936577828,42.00415356257901],[-71.79919265777723,42.004059562560926],[-71.7991086575297,42.00010556180152],[-71.7989966572586,41.99589156099279],[-71.79881565682193,41.989105559690266],[-71.7987636565853,41.98515555893034],[-71.7987636565839,41.985130558925505],[-71.79876365658217,41.98509955891954],[-71.7987366564565,41.98299755851508],[-71.79869265629337,41.98032155800044],[-71.79864665609247,41.97697755735703],[-71.7986466560893,41.97692055734605],[-71.7986466560868,41.976875557337365],[-71.79857965578893,41.971908556381514],[-71.79854965569727,41.97043555609834],[-71.79854865569517,41.970403556092194],[-71.79854565568704,41.970274556067395],[-71.79841065527879,41.96371955480715],[-71.79837965522617,41.96295455466052],[-71.7983596551914,41.96244655456316],[-71.79834265516169,41.96201155447976],[-71.79832965513928,41.96168455441707],[-71.79832865513791,41.96166555441344],[-71.79832865513708,41.96165055441055],[-71.79831365510972,41.96124655433306],[-71.79831265510806,41.96122255432848],[-71.79830565509512,41.961030554291646],[-71.79830365509167,41.96098055428206],[-71.79830265506959,41.96058855420646],[-71.79830265506754,41.96055155419932],[-71.79829965496687,41.95875555385292],[-71.79829965496654,41.95874955385174],[-71.79829865490397,41.957628553635494],[-71.79825165482742,41.95652655342432],[-71.79822265478074,41.95585655329595],[-71.79820065474624,41.9553645532017],[-71.79818865466012,41.953883552916295],[-71.79816865465295,41.953872552914795],[-71.79809965462758,41.953822552907276],[-71.79806865461279,41.953738552892034],[-71.79805865448384,41.95147355245527],[-71.79805565434063,41.94891055196075],[-71.79812665436144,41.948866551950076],[-71.79808965424935,41.94706455160345],[-71.79807565421659,41.94655655150583],[-71.79807465421406,41.946516551498156],[-71.79803865412299,41.94508755122346],[-71.79803865412228,41.94507455122094],[-71.798015653929,41.94172555057525],[-71.79801465392573,41.941672550565045],[-71.79801465392369,41.94163555055791],[-71.79801465391954,41.94156055054344],[-71.79800565388621,41.94101255043793],[-71.79793665360478,41.936344549538966],[-71.79793565360247,41.93630854953205],[-71.79793565360086,41.93627954952645],[-71.79792665356392,41.93566654940838],[-71.79792465355534,41.93552354938083],[-71.79792265354803,41.935403549357744],[-71.79791065347315,41.934123549111],[-71.79791065342333,41.93322454893745],[-71.79791065341871,41.93314154892142],[-71.79789765338586,41.93262554882221],[-71.79789465337086,41.932372548773444],[-71.79789365336232,41.932224548744884],[-71.79789365336188,41.93221654874335],[-71.797892653358,41.93215254873103],[-71.79789165334763,41.931971548696104],[-71.79788665331263,41.93136954858003],[-71.79788365329226,41.93101954851256],[-71.79777465312036,41.92856154804132],[-71.79773265305336,41.92760054785706],[-71.7977266530433,41.92745454782906],[-71.7977256530412,41.92742254782292],[-71.7975476527593,41.92338654704905],[-71.79746265258547,41.92075054654259],[-71.79735565236783,41.91745354590914],[-71.79730065232047,41.91692354580848],[-71.79729965231881,41.916899545803865],[-71.7972686522817,41.916412545710756],[-71.79726565227661,41.91633854569657],[-71.79726265227104,41.91625554568063],[-71.79726165226988,41.91624054567775],[-71.79711265200993,41.91242654494565],[-71.79710565199728,41.91223954490974],[-71.7971056519959,41.912214544904906],[-71.79702465185427,41.9101355445058],[-71.79690065163491,41.906905543885635],[-71.79682865147568,41.90445454341431],[-71.79675665131428,41.90196354293525],[-71.79671165121441,41.90042454263926],[-71.79669865118275,41.89992954254401],[-71.7966956511763,41.89983054252498],[-71.79668365114775,41.899385542439354],[-71.79657365099104,41.897203542021096],[-71.7965666509857,41.897148542010676],[-71.79655565097801,41.89707454199671],[-71.79656365097514,41.89697554197733],[-71.79652265086887,41.89529654165414],[-71.79652065086621,41.89526054164725],[-71.79643465064271,41.8917285409673],[-71.79619165025476,41.88615053989664],[-71.79595664987274,41.8806305388368],[-71.79586364968017,41.87769653827241],[-71.79574464949808,41.875105537775106],[-71.79542864903678,41.868626536531984],[-71.79540864900669,41.868200536450225],[-71.7954046490008,41.868117536434305],[-71.79535664893082,41.86713453624568],[-71.79535364892695,41.86708253623571],[-71.7953236488835,41.866473536118875],[-71.79531664887323,41.866328536091025],[-71.79528964883407,41.86577953598568],[-71.79528764883214,41.865756535981305],[-71.79528664882987,41.86572153597455],[-71.7949666484082,41.85998053487401],[-71.79494164837259,41.85948353477864],[-71.79493364836219,41.859342534751626],[-71.79491464833565,41.858974534681025],[-71.79491164833159,41.85891853467029],[-71.79490664832414,41.85881353465013],[-71.7946806480076,41.85441753380669],[-71.79452464773689,41.850436533041304],[-71.79448064766015,41.849306532824016],[-71.79447764765548,41.84923953281114],[-71.79447464765052,41.84916753279732],[-71.79447164764564,41.849096532783655],[-71.79446364763163,41.848890532744036],[-71.7942376472351,41.843041531619214],[-71.79422964722106,41.84283453157939],[-71.79417964713923,41.84164753135125],[-71.79417764713455,41.84157453133717],[-71.79417364712498,41.84142453130826],[-71.7941216470907,41.84111153124928],[-71.79411564708117,41.84097453122297],[-71.79412164706488,41.840643531158726],[-71.79413464703457,41.84001653103697],[-71.79411764702279,41.83990353101563],[-71.79407764697964,41.8393585309114],[-71.7937966465285,41.83284252965885],[-71.79379064651927,41.83271052963349],[-71.79368964637514,41.83069452924636],[-71.79361564626882,41.8292045289602],[-71.79353264615294,41.82759452865106],[-71.7934786460738,41.82647852843668],[-71.79344064601545,41.82564552827658],[-71.79334364583526,41.82295052775778],[-71.79331064576157,41.82180852753769],[-71.7933156457616,41.82177952753191],[-71.79330264574611,41.82157552749282],[-71.79329664573392,41.821389527456994],[-71.79328464572315,41.82126552743334],[-71.79326564568295,41.82064852731447],[-71.79316164545777,41.817177526645544],[-71.79316064545678,41.817165526643244],[-71.79314464540889,41.816390526493656],[-71.79314364540673,41.8163575264873],[-71.7931016453122,41.81489052620452],[-71.7930976453025,41.814737526175],[-71.79311464530413,41.81466652616073],[-71.79312764530536,41.81461152614967],[-71.7928946451145,41.81252952575363],[-71.79286764502095,41.810990525456404],[-71.79285564499875,41.81065852539247],[-71.79280064490608,41.80930152513134],[-71.7928046449027,41.80921652511475],[-71.79259364454794,41.804024524115555],[-71.792364644255,41.80006152335487],[-71.79236064425012,41.7999965233424],[-71.79213564393649,41.79563252250382],[-71.79212464392046,41.79540652246039],[-71.79207964388836,41.79509052240055],[-71.79207964388803,41.79508452239937],[-71.79207664388616,41.795068522396356],[-71.79207064387562,41.794912522366324],[-71.79205864385453,41.79460052230625],[-71.79200664376313,41.793247522045675],[-71.79191964359586,41.79072352155927],[-71.79191164358033,41.79048852151398],[-71.79193664354938,41.78977652137523],[-71.7919406435422,41.78962252134528],[-71.79192764352125,41.78931852128676],[-71.79192164350971,41.78914452125323],[-71.7915736429643,41.78129251974214],[-71.79147764282921,41.779405519379345],[-71.79137264268118,41.777336518981514],[-71.79137064267877,41.77730451897538],[-71.79125464248706,41.774505518436335],[-71.79106664218968,41.770210517609435],[-71.79106664218848,41.77018851760518],[-71.79064764115587,41.75387451445437],[-71.79063364112189,41.75333851435083],[-71.79055464091978,41.75012551373001],[-71.79032764072302,41.74789151330362],[-71.79032364071672,41.74780051328608],[-71.79031464070061,41.747560513239804],[-71.79019564048932,41.74441751263371],[-71.79015064041077,41.743253512409254],[-71.79013464038184,41.74282151232592],[-71.7901176403509,41.74235851223661],[-71.79007064033176,41.74228951222467],[-71.79008964026723,41.74099951197379],[-71.79009464024918,41.74064051190398],[-71.79007164021579,41.74016851181311],[-71.79005564018995,41.739792511740646],[-71.7900166401274,41.73888451156565],[-71.78990263991679,41.735722510955576],[-71.7898716398532,41.734747510767306],[-71.7898616398329,41.734436510707276],[-71.78976863964509,41.731564510152765],[-71.78972963940805,41.72747150935954],[-71.78971163939073,41.72726250931952],[-71.78970963935929,41.72670050921052],[-71.78970363924067,41.72457150879744],[-71.78967563918754,41.723768508642415],[-71.78959263902861,41.72136250817791],[-71.78956563897584,41.72056050802306],[-71.78956363897214,41.72050450801225],[-71.78955763896109,41.7203385079802],[-71.78953463891726,41.719675507852195],[-71.78952763890287,41.71945450780951],[-71.78947663880382,41.717950507519085],[-71.78932363850687,41.71344050664814],[-71.78927463841174,41.71199550636908],[-71.78927263840792,41.71193750635786],[-71.78924463835541,41.711145506204936],[-71.78916363819894,41.70877050574623],[-71.78913663814683,41.70797950559344],[-71.78912863813073,41.70773350554592],[-71.78912863813046,41.70772850554494],[-71.7890636381038,41.70762950552771],[-71.78907063810237,41.7075615055143],[-71.78907863810105,41.70748950550008],[-71.78911763810936,41.707408505483144],[-71.78906963801508,41.705972505205764],[-71.7890326379458,41.704927505003944],[-71.78892363773865,41.701792504398405],[-71.78888763766972,41.70074750419653],[-71.78880463751112,41.69834450373233],[-71.78871863733852,41.69570250322177],[-71.78871563733227,41.695606503203216],[-71.78871463732993,41.695569503196054],[-71.78869263728893,41.694951503076666],[-71.78868563727528,41.6947435030365],[-71.78866363723299,41.69410150291243],[-71.7885986371064,41.692175502540266],[-71.78857963706876,41.69160050242914],[-71.7885776370645,41.69153450241638],[-71.78857563706127,41.69148750240732],[-71.78854063699433,41.69047250221119],[-71.7884326367849,41.68728750159569],[-71.78839763671547,41.6862265013906],[-71.78838163668563,41.685776501303664],[-71.78834663661608,41.684713501098194],[-71.78833663659731,41.68442950104331],[-71.78832163656787,41.683980500956515],[-71.78822563638178,41.68114950040933],[-71.7879386358239,41.67265549876732],[-71.7878436356383,41.66982549822014],[-71.78784263563672,41.6698024982157],[-71.78781063558955,41.669130498086055],[-71.7877126354438,41.66704749768412],[-71.78768263539801,41.666388497556945],[-71.78768163539664,41.66636949755328],[-71.78768063539545,41.66635349755019],[-71.78764363533804,41.66552349738997],[-71.78753463516647,41.663033496909236],[-71.78749863510947,41.662204496749155],[-71.78744463502484,41.660977496512245],[-71.78743063500286,41.66065849645065],[-71.78728863477306,41.657298495801676],[-71.78723963469271,41.65611949557393],[-71.7872476346928,41.65607349556473],[-71.78730763458309,41.653703495102015],[-71.7874886342543,41.64659349371366],[-71.78754163415887,41.64452649330999],[-71.78754963414501,41.644224493251],[-71.78756163412083,41.643709493150446],[-71.78760163404975,41.64216649284907],[-71.78761463402596,41.6416524927487],[-71.78762163401332,41.641378492695175],[-71.78763863398288,41.64071849256627],[-71.78764263397534,41.64055649253462],[-71.7876496339627,41.640282492481106],[-71.78765163396035,41.640227492470345],[-71.78765163395941,41.64021049246703],[-71.78765663394944,41.63999749242545],[-71.78765863394621,41.63992649241158],[-71.78767163392892,41.63953149233433],[-71.78771263387782,41.638348492102935],[-71.7877266338609,41.63795449202585],[-71.78773163385327,41.637784491992626],[-71.78774863383106,41.637275491893064],[-71.78775563382413,41.637106491859974],[-71.78776063381699,41.63694549182851],[-71.78777763379632,41.636464491734394],[-71.78778363378954,41.636304491703086],[-71.78779563377333,41.635934491630735],[-71.78779863376904,41.63583849161197],[-71.78783463372571,41.63482749141416],[-71.78784363371561,41.63458849136739],[-71.7878466337095,41.634458491341995],[-71.7878646336786,41.633783491210124],[-71.78787363366264,41.63343749114253],[-71.78792263357985,41.631624490788255],[-71.78795663352288,41.63037549054419],[-71.78798463347643,41.629355490344835],[-71.78798663347338,41.62928749033154],[-71.78798863347038,41.629220490318446],[-71.78799063346682,41.629143490303406],[-71.78799363346367,41.62906749028853],[-71.78799763345712,41.628923490260384],[-71.7880366333926,41.62750548998325],[-71.78810863327243,41.62486848946786],[-71.78812763324206,41.62419748933671],[-71.78814463321304,41.62356248921259],[-71.78819563312601,41.62165948884066],[-71.78821363309734,41.621025488716704],[-71.7882166330961,41.62098448870863],[-71.78829163302515,41.61923248836534],[-71.78837663294719,41.617291487984915],[-71.78855463281825,41.61385648731081],[-71.7886476327511,41.612065486959295],[-71.78866663273567,41.611668486881435],[-71.78866963273448,41.611628486873556],[-71.78872363268954,41.61047948664821],[-71.7887426326742,41.61008348657053],[-71.78876163265808,41.609673486490124],[-71.78877663264593,41.609360486428734],[-71.78880363262269,41.60877148631322],[-71.78885363258186,41.60772148610727],[-71.78885663257994,41.607668486096856],[-71.78890263257624,41.60732448602848],[-71.78899463247107,41.60484048554201],[-71.78904463241604,41.60352948528519],[-71.78908463235646,41.60219448502401],[-71.78920663217835,41.59818948424037],[-71.78924763211916,41.59685548397931],[-71.7892916321061,41.596351483879815],[-71.78941763207015,41.59493448359998],[-71.78942463206732,41.59484048358146],[-71.7894626320523,41.59433648348213],[-71.78948063203404,41.5938924833951],[-71.78950163201472,41.593411483300784],[-71.78953663197997,41.59256248313435],[-71.78955563196207,41.592119483047476],[-71.78957563194267,41.591642482953965],[-71.78960263191678,41.59100448282886],[-71.78963563188442,41.59021148267338],[-71.7896566318654,41.589735482580025],[-71.78968863183532,41.58899048243393],[-71.7897066318201,41.58860248235781],[-71.78970863181873,41.58856548235053],[-71.78978863174648,41.586756481995685],[-71.7898216317168,41.58601248184974],[-71.78984563169423,41.5854534817401],[-71.78986763167534,41.58497348164593],[-71.78987963166402,41.584693481591025],[-71.78990563164031,41.58410148147488],[-71.78991963162737,41.58377948141174],[-71.78993763161122,41.58337448133228],[-71.7899446316052,41.58322148130225],[-71.78995263159818,41.583044481267535],[-71.78997563157694,41.58251548116376],[-71.7899846315703,41.582339481129196],[-71.78998663156813,41.582287481119],[-71.78999263156155,41.58213048108823],[-71.78999563155976,41.5820794810782],[-71.79000063155495,41.581960481054864],[-71.79004363151601,41.580986480863785],[-71.7901216314463,41.57923548052024],[-71.79018763138484,41.57770848022069],[-71.79021963135555,41.576977480077275],[-71.79022763134834,41.57679648004177],[-71.79023563134115,41.576616480006464],[-71.79027463130454,41.57570847982834],[-71.79030063128107,41.575120479712965],[-71.79036463122067,41.57362447941948],[-71.79039163119471,41.572984479293936],[-71.79039663119009,41.57286947927138],[-71.79042863115943,41.572113479123075],[-71.79043063115816,41.572077479116],[-71.79043063115724,41.57206047911268],[-71.79043163115483,41.57201047910291],[-71.79043263115429,41.57199447909976],[-71.79043263115287,41.57196847909469],[-71.79043463114934,41.57189147907963],[-71.79043663114865,41.5718664790747],[-71.79043763114755,41.5718404790696],[-71.79044263113985,41.57166847903592],[-71.79045263112637,41.571360478975606],[-71.7904606311136,41.57107747892021],[-71.79046763110517,41.570880478881605],[-71.79047263109585,41.570678478842076],[-71.79049063106895,41.570075478724014],[-71.7904956310625,41.56992647869482],[-71.7904986310607,41.56987547868478],[-71.79053763103454,41.56915947854405],[-71.79065663095675,41.567012478121974],[-71.79069663093097,41.56629747798138],[-71.79069163092679,41.56625047797239],[-71.79068263091878,41.566157477954526],[-71.79067763091471,41.56611247794591],[-71.79067263091058,41.56606647793711],[-71.79069363089721,41.56569447786397],[-71.79076063085851,41.56457947764459],[-71.79078363084588,41.56420847757157],[-71.79077763083703,41.564081477547],[-71.79079863082086,41.563657477463714],[-71.79081363081065,41.56337947740907],[-71.79088463078195,41.56242447722074],[-71.79093663077634,41.562008477138065],[-71.79095663077435,41.56185147710684],[-71.79097863076566,41.56155947704926],[-71.79097263075828,41.56145947702995],[-71.79098363070457,41.560404476823955],[-71.79102063054479,41.55723947620586],[-71.79103363049182,41.55618547599996],[-71.79104563047446,41.555793475923174],[-71.79108363042307,41.55461847569294],[-71.79109663040609,41.55422747561631],[-71.79110463039565,41.553987475569265],[-71.79111863037825,41.553582475489875],[-71.7911296303648,41.55326847542833],[-71.79113863035478,41.55302947538146],[-71.79114663034434,41.5527894753344],[-71.79117363031408,41.5520694751932],[-71.79118263030402,41.551830475146346],[-71.79118663029865,41.551707475122235],[-71.79119263029182,41.55154547509045],[-71.79119963028293,41.551339475050064],[-71.79120463027795,41.55121747502614],[-71.79122163025787,41.55074547493359],[-71.79127663019904,41.549330474655996],[-71.79129463017934,41.5488594745636],[-71.79131863015357,41.54824047444219],[-71.79139163007667,41.54638447407803],[-71.7914166300513,41.54576647395677],[-71.79142063004605,41.54564547393303],[-71.79143563003142,41.54528547386237],[-71.79144063002653,41.54516547383881],[-71.79158362987377,41.54148947311756],[-71.79165362980102,41.53972747277177],[-71.79193662954567,41.53331647151264],[-71.79205362942926,41.53046547095291],[-71.79220662928,41.526791470231466],[-71.79224862924454,41.52588447005322],[-71.79237362914283,41.523255469536444],[-71.7923756291386,41.52316546951884],[-71.7924056290993,41.522259469341144],[-71.79244562904466,41.521010469096204],[-71.79248562899106,41.51978046885496],[-71.79255062893911,41.51843046858955],[-71.79260662889443,41.517268468361074],[-71.79266762884676,41.51602146811588],[-71.79276162877261,41.51408646773536],[-71.79276662876737,41.51395946771042],[-71.79298962856598,41.50889846671583],[-71.79299462856149,41.50878546669361],[-71.7930466285236,41.507772466494295],[-71.7931506284483,41.505755466097405],[-71.79316062844924,41.50571246608871],[-71.79322262845513,41.50544746603508],[-71.79322462845327,41.50540146602603],[-71.79326662841316,41.504407465830724],[-71.79335862832689,41.50225946540858],[-71.79341662827579,41.500966465154384],[-71.79343962825655,41.50047246505725],[-71.79350262820614,41.49916146479937],[-71.79353362818124,41.4985144646721],[-71.79362862810727,41.496575464290615],[-71.79366062808276,41.495929464163495],[-71.7936986280524,41.4951394640081],[-71.79377562799237,41.493566463698585],[-71.79381462796209,41.49277146354216],[-71.79385362793211,41.491982463386904],[-71.7939636278468,41.48974246294612],[-71.79400762781137,41.488822462765114],[-71.79401862780263,41.48859446272025],[-71.79405262777671,41.48791046258564],[-71.79453862747204,41.479346460898114],[-71.79467962738376,41.476863460408794],[-71.79471762735965,41.47618846027576],[-71.79477862732078,41.47510146006155],[-71.79496362720494,41.47184245941922],[-71.79502562716647,41.47075645920514],[-71.79510362711828,41.46939445893665],[-71.79533762697379,41.46530845813111],[-71.79541562692562,41.4639464578626],[-71.7954616268979,41.46315545770661],[-71.79560062681502,41.460782457238636],[-71.79564762678767,41.45999245708281],[-71.79584062671415,41.45746645658325],[-71.79629662654195,41.451524455407906],[-71.79636362647545,41.44988845508607],[-71.79638862644985,41.44926345496312],[-71.79646862637308,41.44735845458829],[-71.79650362633845,41.44650545442046],[-71.7966096262349,41.44394645391693],[-71.79664562620063,41.44309445374926],[-71.79664962619552,41.44297545372587],[-71.79666462618124,41.44262045365599],[-71.79666962617651,41.442502453632784],[-71.79667062617575,41.44248245362882],[-71.79667162617399,41.442443453621166],[-71.79667862616682,41.442268453586756],[-71.79668162616466,41.44221045357531],[-71.79668462616095,41.44212345355822],[-71.79669562615065,41.44186645350763],[-71.79669962614733,41.4417804534907],[-71.79669962614598,41.44175545348582],[-71.7967026261429,41.441680453471065],[-71.79670362614192,41.44165645346633],[-71.79670862613672,41.44152945344135],[-71.79672462612159,41.44115245336715],[-71.79673062611674,41.44102645334233],[-71.79673062611616,41.44101545334017],[-71.79673162611469,41.44098245333369],[-71.79673262611446,41.44097245333172],[-71.7967376261093,41.44084645330691],[-71.79675262609402,41.44047245323334],[-71.79675862608923,41.44034745320872],[-71.79675962608717,41.44030345320008],[-71.79676562608232,41.44017745317526],[-71.79676562608216,41.44017445317467],[-71.79676762608057,41.440132453166406],[-71.79677862606883,41.439848453110514],[-71.79681362603425,41.438996452942874],[-71.79682562602291,41.438713452887164],[-71.79687262597788,41.43759545266712],[-71.79688062596469,41.437302452609586],[-71.79690262592815,41.43649245245052],[-71.7969106259128,41.436159452385155],[-71.79693862586814,41.43516245218933],[-71.79694862585349,41.4348304521241],[-71.79697162581432,41.433965451954265],[-71.79697962580323,41.43371145190435],[-71.79707662570867,41.43137245144394],[-71.7971126256738,41.43050845127389],[-71.79714762564092,41.42968745111225],[-71.79725362554282,41.42722745062787],[-71.79728662551281,41.42647145047899],[-71.79728762550967,41.42640745046644],[-71.79728762550843,41.426384450461946],[-71.79729662550183,41.42620745042704],[-71.79732662547941,41.425610450309364],[-71.79733762547228,41.4254114502701],[-71.79734962546237,41.42515545021966],[-71.79736062545366,41.42492745017472],[-71.79736162545271,41.42490345016999],[-71.79738062543818,41.424519450094316],[-71.79738662543319,41.424390450068906],[-71.79739862542336,41.42413545001865],[-71.79746262537175,41.4227914497538],[-71.79765562521729,41.41875944895915],[-71.79771662516974,41.417508448712546],[-71.7977206251661,41.41741644869442],[-71.79772362516317,41.417344448680254],[-71.79773862515093,41.417026448617584],[-71.79774262514825,41.41695244860299],[-71.79774462514706,41.41691844859626],[-71.79774762514394,41.416842448581306],[-71.79774562513752,41.41673544856042],[-71.79812062525691,41.41668244853861],[-71.79839162533302,41.41645544848591],[-71.79926862559324,41.415979448366],[-71.79951362566592,41.4158464483325],[-71.79985262577185,41.41576144830552],[-71.80023662589186,41.415665448275014],[-71.80073962604914,41.41554144823537],[-71.80143962627795,41.41555344821636],[-71.80169362636614,41.41565344822815],[-71.8017266263776,41.415666448229686],[-71.802065626504,41.415961448277045],[-71.80208362651796,41.416111448305834],[-71.80249762667232,41.41647144836363],[-71.80290762683201,41.41695444844559],[-71.80325362696426,41.41731544850565],[-71.80368462711127,41.417436448516156],[-71.80434862732129,41.41731744847259],[-71.80517762758208,41.41714244841303],[-71.80581062777424,41.41687944834223],[-71.80588162779577,41.41684944833419],[-71.80589562780006,41.416844448332775],[-71.80610862786739,41.41680544831865],[-71.8061856278918,41.41679244831375],[-71.80681262809019,41.41668144827288],[-71.80696062814144,41.416737448279314],[-71.80723762823742,41.41684244829138],[-71.807754628425,41.41719644834484],[-71.80805262853289,41.41739544837467],[-71.80857662871195,41.417548448388594],[-71.80908762889068,41.4177744484172],[-71.80921262893446,41.41783044842432],[-71.80979162914012,41.418144448468034],[-71.81050062939201,41.41852944852169],[-71.81073762947497,41.41863544853519],[-71.81145462972611,41.41895844857646],[-71.81215062996719,41.41922144860664],[-71.81290063022195,41.41941244862109],[-71.81379863051546,41.419427448596565],[-71.81400463058284,41.41943144859104],[-71.81486363086618,41.419493448576915],[-71.81488963087477,41.419495448576505],[-71.81495363089634,41.4195084485771],[-71.8152246309878,41.41956644858015],[-71.81527363100436,41.41957744858082],[-71.81531563101844,41.419584448580906],[-71.81612063128844,41.419725448583876],[-71.81641163138751,41.41980344859022],[-71.81690463155532,41.41993544860099],[-71.81808863193723,41.419860448550104],[-71.819389632348,41.4196144484622],[-71.81971663245038,41.41953644843695],[-71.82033063264265,41.41939044838962],[-71.82070663274841,41.419079448317284],[-71.82077363276724,41.41902344830428],[-71.82097463282369,41.41885544826527],[-71.82104263284288,41.41880044825243],[-71.8217656330492,41.41825644812391],[-71.82276763335484,41.41786844801737],[-71.82336963353272,41.41752844793244],[-71.823418633546,41.41747844792116],[-71.82373163363786,41.41729044787483],[-71.82387363367778,41.4171724478474],[-71.82398163370564,41.41703644781749],[-71.82414663374519,41.41677244776079],[-71.8242736337592,41.41626544765774],[-71.82430463374642,41.41584144757383],[-71.82438463375243,41.41546944749862],[-71.82457363380185,41.41524344744863],[-71.82492063390013,41.41496944738441],[-71.8253846340366,41.414695447316625],[-71.82593663421159,41.41460444728193],[-71.82612863427251,41.41457344726999],[-71.82721863462383,41.414500447222366],[-71.82790263483825,41.41434244717054],[-71.8292886352602,41.41379044702017],[-71.83062863566444,41.4131884468614],[-71.83141263589908,41.41280144676171],[-71.83184363603021,41.41262844671466],[-71.83341663650651,41.4119544465347],[-71.83410763671208,41.41159044644234],[-71.83456063686036,41.41160244643083],[-71.83465863689246,41.41160544642842],[-71.83498663701037,41.41180944645829],[-71.83523863710033,41.41195444647895],[-71.83567163725338,41.41217544650894],[-71.83579763729796,41.412240446517806],[-71.8363856374897,41.41224244650021],[-71.83688363765168,41.41223644648379],[-71.83789063799365,41.412491446502855],[-71.83925863843449,41.4123984464428],[-71.8393986384772,41.412344446427944],[-71.8396976385685,41.41223044639651],[-71.84038863875902,41.41158844624975],[-71.8404406387734,41.41154044623878],[-71.84054863880552,41.411483446224324],[-71.84106363895891,41.41121644615632],[-71.84123563901018,41.41112744613363],[-71.84163263912838,41.410920446081],[-71.84177163916974,41.41084744606246],[-71.84202963924665,41.41071444602855],[-71.84242663935196,41.41026844592914],[-71.84262763939029,41.40976544582458],[-71.84260763937557,41.409613445795465],[-71.84257663935288,41.40938044575082],[-71.8424996392954,41.408780445635784],[-71.84249663929376,41.40876844563352],[-71.84249063928992,41.40873344562687],[-71.84248863928867,41.40872244562477],[-71.84235263921033,41.40809244550567],[-71.84244663922725,41.407838445453095],[-71.84293563934996,41.40715944530528],[-71.84322963939339,41.40618944510649],[-71.84337663942559,41.40589844504506],[-71.84359163946549,41.405339444929105],[-71.84346063941386,41.40517444490082],[-71.84325663930933,41.40446944476911],[-71.84280063914302,41.404141444718896],[-71.84232763897194,41.403827444671926],[-71.8423266389715,41.403825444671575],[-71.84219663892087,41.40367244464562],[-71.84173963875051,41.40327544458191],[-71.84172663874486,41.40324944457723],[-71.84155363867796,41.403054444544345],[-71.84150663864241,41.40267944447241],[-71.84138063853487,41.40144744423518],[-71.84121963842652,41.40041244403756],[-71.84106863833705,41.3996664438962],[-71.84115063834068,41.39923844380995],[-71.84195663851732,41.397644443473325],[-71.84200463852541,41.39750444344446],[-71.8422446385703,41.39688744331636],[-71.84225763853587,41.39617044317565],[-71.84221163849979,41.39577944310053],[-71.84220963847804,41.39538844302405],[-71.84219863847352,41.39537144302107],[-71.8417226382786,41.39463344289119],[-71.84141463816906,41.39446344286734],[-71.84137263815413,41.39444044286413],[-71.84112463805914,41.39417744282023],[-71.8410426380281,41.39409744280709],[-71.84103463802505,41.394089442805765],[-71.84099163800798,41.394032442795925],[-71.84096863799941,41.39401244279272],[-71.8406086378615,41.39363044272896],[-71.83998763760862,41.392694442564746],[-71.83962363746208,41.3921764424745],[-71.83874963711719,41.391062442283186],[-71.83817063690374,41.39060344221105],[-71.8381186368846,41.390562442204605],[-71.83671663640489,41.390138442164485],[-71.83605763618034,41.389956442149014],[-71.83570863606143,41.3898604421409],[-71.83538463594564,41.38967144211382],[-71.8353486359328,41.38965044211079],[-71.83524063589421,41.38958744210177],[-71.83520463588133,41.38956644209877],[-71.83455763565019,41.38918944204475],[-71.83433263556608,41.38898944201248],[-71.83367563532045,41.38840444191805],[-71.83313063511284,41.38784744182569],[-71.83265563492124,41.38716444170649],[-71.832600634868,41.38650944157995],[-71.83259163485882,41.3863934415575],[-71.83266663486444,41.386044441486895],[-71.83287263490261,41.385507441375466],[-71.83288263490437,41.38547944136968],[-71.83291363491016,41.385399441353066],[-71.83292463491227,41.38537244134745],[-71.83295863491855,41.385283441328994],[-71.83295563491663,41.38526544132555],[-71.8329706349207,41.38525044132216],[-71.83316663495702,41.38473944121611],[-71.83339563498309,41.38383844103272],[-71.83344963497584,41.383377440940805],[-71.83346563497672,41.38329744092467],[-71.83348163497762,41.38321744090852],[-71.83349263497797,41.383157440896426],[-71.8335276349799,41.3829814408609],[-71.83353963498064,41.382922440849],[-71.8335506349811,41.382864440837295],[-71.83355363498153,41.382854440835246],[-71.8335456349701,41.38269044080338],[-71.83354363496629,41.38263244079208],[-71.83354063496188,41.38256844077966],[-71.8335316349486,41.382376440742334],[-71.83352963494454,41.38231344073005],[-71.83352763494169,41.38227244072208],[-71.83351763493735,41.38225244071848],[-71.83343163490021,41.382083440688035],[-71.83340363488807,41.38202744067792],[-71.83336063486954,41.38194344066278],[-71.83323563481557,41.381697440618446],[-71.83323263481441,41.38169444061795],[-71.83316863478996,41.381627440606785],[-71.8331036347651,41.381559440595446],[-71.83291063469123,41.381355440561414],[-71.83284663466677,41.38128844055025],[-71.83275163463041,41.38118844053358],[-71.83273663462468,41.3811724405309],[-71.8325286345391,41.38084244047264],[-71.83245663450938,41.38072644045214],[-71.83236963447361,41.38058844042776],[-71.83233963446136,41.38054244041969],[-71.83208263435634,41.38014744035021],[-71.8319526343073,41.38002344032989],[-71.83179663424843,41.37987444030549],[-71.83178363424351,41.37986144030334],[-71.83174463422884,41.379825440297495],[-71.83173163422397,41.379813440295536],[-71.83159163417113,41.37967944027356],[-71.83144363411529,41.37953844025049],[-71.83112963400211,41.37933644022055],[-71.83096763394373,41.37923244020513],[-71.83083163389473,41.379145440192254],[-71.8307326338525,41.37896044015905],[-71.83063763381185,41.37878044012671],[-71.830666633811,41.37858944008842],[-71.83079763384113,41.37835644003879],[-71.83109763392099,41.37802443996461],[-71.83129763397432,41.377804439915415],[-71.83135663399118,41.377760439905],[-71.83147063402379,41.377676439885064],[-71.83186263413143,41.37730343980005],[-71.83213463420734,41.37706743974552],[-71.83238863425883,41.376487439624185],[-71.83239763426086,41.37647043962058],[-71.8325896343043,41.376115439545195],[-71.83265663431229,41.375858439492816],[-71.8326746343058,41.37562943944743],[-71.83269963429714,41.375317439385576],[-71.83262363426385,41.37515943935694],[-71.83253163422377,41.374971439322955],[-71.83250863421249,41.374901439309944],[-71.83246863419272,41.37477643928669],[-71.83237463414638,41.374484439232376],[-71.83177963385296,41.37263643888867],[-71.83177563385097,41.37262343888624],[-71.83171263381976,41.372425438849405],[-71.83165263378991,41.37223443881382],[-71.83165363378284,41.37209643878677],[-71.83165663376198,41.37169143870736],[-71.83165763375095,41.371480438666005],[-71.8316606337404,41.371266438624],[-71.83166563374053,41.37123843861836],[-71.83168163374154,41.3711604386026],[-71.83184463375113,41.37035243843937],[-71.83195463377432,41.37011743838999],[-71.83199763378337,41.37002543837067],[-71.83206963379851,41.369871438338286],[-71.83249963391586,41.3694484382423],[-71.83254163392738,41.36940843823319],[-71.8327766339915,41.36917743818077],[-71.83317963410805,41.368903438114785],[-71.83386963430765,41.36843543800203],[-71.83433763444305,41.36811843792566],[-71.83437563445398,41.3680914379192],[-71.83501363463836,41.36765543781431],[-71.83573263484652,41.367171437697536],[-71.83653663507941,41.36663143756719],[-71.83697163520522,41.3663364374961],[-71.83703463522349,41.36629443748596],[-71.8375366353515,41.365634437341335],[-71.83763363537626,41.36550743731349],[-71.8376356353747,41.36546643730541],[-71.83766763535309,41.364871437187894],[-71.83767463534808,41.36473643716124],[-71.83768263534343,41.364601437134546],[-71.83768563534025,41.36452443711937],[-71.83769763533178,41.36429443707395],[-71.837701635329,41.36421843705895],[-71.8377116353224,41.3640354370228],[-71.8377226353158,41.36384643698544],[-71.83773163530978,41.36368043695265],[-71.83774163530259,41.36348643691434],[-71.83774463530165,41.3634504369072],[-71.83775163529604,41.363304436878394],[-71.83775263529505,41.363279436873455],[-71.83775463529417,41.36325143686791],[-71.83775663529237,41.363205436858856],[-71.8377586352917,41.36318143685408],[-71.83775963529004,41.3631444368468],[-71.83776663528647,41.36303543682524],[-71.83776863528517,41.36299943681813],[-71.83777763527905,41.362831436784944],[-71.83787363516615,41.36015343625741],[-71.83780763508267,41.359002436033954],[-71.83765463499675,41.35833243590738],[-71.83733263481574,41.356918435640196],[-71.83728663478986,41.35671643560203],[-71.83676863453472,41.35511143530342],[-71.83604463423886,41.35399643510709],[-71.83390163347521,41.352778434933924],[-71.83130363254952,41.35130343472427],[-71.83118663249033,41.35091143465103],[-71.83116063247729,41.35082643463517],[-71.8306096321994,41.3489974342936],[-71.83016963197738,41.34753443402035],[-71.82990263184253,41.346644433854095],[-71.82977963178057,41.346237433778114],[-71.8297676317708,41.346128433757116],[-71.82941863148481,41.34292443313984],[-71.8294046314734,41.3427964331152],[-71.82936563144155,41.342440433046605],[-71.8293846314467,41.34242143304232],[-71.82947963147298,41.34233443302235],[-71.82953663148864,41.34228043301003],[-71.82970963153633,41.34211943297319],[-71.82976763155237,41.34206643296103],[-71.8299396315998,41.341906432924425],[-71.83045563174208,41.341426432814586],[-71.8306276317895,41.341266432777964],[-71.83178163210759,41.34019143253204],[-71.83342763256147,41.338661432181894],[-71.83524563306267,41.33696943179471],[-71.83622763333342,41.33605643158575],[-71.83631363335707,41.335975431567256],[-71.83640063338112,41.33589543154892],[-71.83728063362369,41.3350764313615],[-71.83879763406952,41.33417843113914],[-71.84004463443598,41.33344043095638],[-71.84103563472718,41.33285343081104],[-71.84129263480278,41.33270243077358],[-71.84461163577815,41.330738430287184],[-71.84494063587886,41.330618430253594],[-71.84770963672658,41.32961242997179],[-71.84882963702073,41.32829942968016],[-71.85192363783331,41.32467242887452],[-71.85417763848243,41.323093428496044],[-71.85480763866383,41.32265142839013],[-71.85624863907894,41.32164442814865],[-71.85745863942742,41.320797427945585],[-71.85899563991337,41.32052642784548],[-71.8591756399702,41.3204934278335],[-71.8597156401409,41.32039742779818],[-71.85989664019817,41.32036642778656],[-71.86106764056831,41.320158427709984],[-71.86458264167959,41.31953842748096],[-71.86575464205016,41.319332427404724],[-71.86620064219109,41.3192524273754],[-71.86653864229797,41.3191934273535],[-71.86750264262932,41.319517427387545],[-71.86793264277713,41.319662427402825],[-71.86935364326558,41.320140427453104],[-71.87361864473162,41.321575427604],[-71.87451364503926,41.32187642763564],[-71.87501164521484,41.32212542766922],[-71.87643564571677,41.32283542776486],[-71.87828664636929,41.32376042788957],[-71.88070764722276,41.324969428052505],[-71.8821316477248,41.32568142814849],[-71.88392164835213,41.32650642825544],[-71.88929265023454,41.32898342857656],[-71.89108365086227,41.329809428683625],[-71.89118065089627,41.329854428689465],[-71.89147265099864,41.329989428706995],[-71.89157065103298,41.330034428712814],[-71.89200565118804,41.33028342874829],[-71.89206765119746,41.33008342870721],[-71.89283165132396,41.327814428239044],[-71.89310565138983,41.32738142814578],[-71.89365765152273,41.32651242795855],[-71.89432565168366,41.32546242773226],[-71.89880765276276,41.31840542621151],[-71.90030165312251,41.31605442570481],[-71.90129165331257,41.31359942519312],[-71.90165865338312,41.31269142500385],[-71.90558465435153,41.306941423756044],[-71.90707765471984,41.3047554232816],[-71.9071136547287,41.3047024232701],[-71.90722165475529,41.304543423235614],[-71.90725865476455,41.304491423224285],[-71.90966765558332,41.30513242327621],[-71.91689565803995,41.30705542343186],[-71.91930565885906,41.307696423483705],[-71.92337866024337,41.30877942357124],[-71.9294516623075,41.3103954237019],[-71.93567766426423,41.30909742325644],[-71.93980466556124,41.3082374229612],[-71.94767266803386,41.3065974223982],[-71.95674667088538,41.304707421749065],[-71.97127867545164,41.30167942070898],[-71.9736896762092,41.30117742053647],[-71.97641867706662,41.300608420341035],[-71.97914767792409,41.30004042014578],[-71.9865616802534,41.29849541961493],[-71.99948668431388,41.295802418689355],[-71.99951768432356,41.29579441868684],[-72.0077656868899,41.293620418006746],[-72.00868868717703,41.293376417930496],[-72.01601268945578,41.29144641732658],[-72.01739968988726,41.29108041721211],[-72.01921469045196,41.2906024170625],[-72.02142469111679,41.28960041679795],[-72.02273169151,41.289008416641614],[-72.02819669315397,41.28653041598733],[-72.04459269808584,41.279099414024714],[-72.05005869972982,41.27662241337038],[-72.0504786998561,41.27643141331996],[-72.05173970023532,41.27585941316889],[-72.05216070036198,41.27566941311865],[-72.05274370053728,41.27540441304869],[-72.05449370106358,41.27461141283918],[-72.05507770123926,41.27434741276939],[-72.057477701961,41.27325941248196],[-72.0646787041265,41.269995411619604],[-72.06707970484855,41.26890841133231],[-72.06877870535945,41.26813841112883],[-72.07001870573224,41.267575410980136],[-72.07047770587033,41.267368410925364],[-72.07612670756892,41.264808410248826],[-72.07883570838337,41.26357940992412],[-72.0817757092674,41.26224840957224],[-72.0817927092727,41.26224440957095],[-72.08184770928995,41.26223240956687],[-72.08186570929563,41.262229409565734],[-72.08205570935532,41.26219040955222],[-72.08262970953565,41.262073409511544],[-72.08282070959572,41.26203540949819],[-72.08414071001047,41.26176740940487],[-72.08546071042524,41.26149940931155],[-72.08736871102472,41.26111140917653],[-72.09551071358294,41.25945840860083],[-72.10101271531154,41.25834040821153],[-72.10556071674037,41.25741640788975],[-72.10628971696936,41.257267407837986],[-72.10847671765643,41.2568234076833],[-72.10920671788578,41.256675407631704],[-72.11567171991666,41.255360407173896],[-72.13506872600964,41.25141940580085],[-72.14153472804058,41.25010640534318],[-72.14373772873509,41.24970640519651],[-72.15034673081861,41.2485074047567],[-72.15255073151346,41.248108404610186],[-72.15901273355053,41.24693640418013],[-72.17840073966214,41.243424402890355],[-72.18486374169922,41.24225340246026],[-72.18508274176818,41.242212402445425],[-72.18574274197624,41.242093402401615],[-72.18596274204563,41.242054402387126],[-72.18605174207363,41.24203740238102],[-72.18632174215878,41.24198940236323],[-72.18641174218716,41.241973402357324],[-72.19320774432914,41.24074240190503],[-72.1953007449888,41.24036340176574],[-72.20418874778991,41.2387524011739],[-72.21229075034321,41.23728540063459],[-72.21359675075475,41.23704840054755],[-72.22039375289661,41.23581640009478],[-72.2260207546697,41.23479639971987],[-72.24290175998873,41.231738398595304],[-72.24852976176193,41.2307193982204],[-72.24873376182614,41.23068139820659],[-72.24934876201999,41.23057139816589],[-72.24955376208457,41.23053439815225],[-72.26593376723741,41.22742939703349],[-72.3150727826923,41.218116393675395],[-72.33145378784326,41.2150123925553],[-72.33145878784482,41.215011392554956],[-72.33147478784981,41.215007392553666],[-72.33148078785176,41.21500739255348],[-72.34448979194192,41.21254139166351],[-72.38351980421133,41.20514438899226],[-72.39652980830047,41.202679388101515],[-72.39769280866595,41.202458388021746],[-72.40118080976217,41.201797387782875],[-72.40234481012804,41.20157738770325],[-72.40551481112426,41.20097638748609],[-72.41502381411252,41.1991733868345],[-72.41819481510905,41.19857338661743],[-72.41889281532836,41.198440386569466],[-72.42098981598734,41.19804338642587],[-72.42168881620702,41.19791138637807],[-72.43124381920946,41.196100385723255],[-72.4599088282155,41.1906663837579],[-72.46946483121752,41.18885638310275],[-72.47085483165414,41.1885923830073],[-72.47502783296498,41.18780138272104],[-72.47641983340228,41.18753838262571],[-72.48671583663632,41.18558638191923],[-72.51760484633748,41.179732379799276],[-72.52790184957105,41.177782379092555],[-72.55156385699772,41.17324637745724],[-72.5518168570771,41.17319737743966],[-72.57522586442326,41.16871137582133],[-72.61135287575816,41.16178637332195],[-72.6235628795884,41.15944537247672],[-72.64747888708999,41.15486237082101],[-72.65618188981944,41.15319337021807],[-72.68229289800755,41.14818836840891],[-72.69099690073678,41.14652136780591],[-72.69174090097002,41.146378367754245],[-72.69397290166984,41.14595036759951],[-72.69471790190345,41.14580836754802],[-72.7029379044805,41.14423036697768],[-72.72759691221044,41.13949636526613],[-72.7358179147873,41.13791936469558],[-72.73853291563819,41.13739736450691],[-72.74667791819094,41.13583336394121],[-72.74939391904222,41.13531336375284],[-72.75851992190317,41.133578363122275],[-72.78589793048504,41.12837536123029],[-72.7950249333457,41.12664236059962],[-72.79664293385277,41.126334360487654],[-72.80149693537403,41.12541236015212],[-72.80311593588145,41.1251053600403],[-72.8033689359607,41.125056360022626],[-72.80362093603961,41.12500736000498],[-72.80805793742923,41.12414835969505],[-72.81572493983047,41.12266635915991],[-72.82288594207307,41.12128135865983],[-72.82782894362107,41.12032635831482],[-72.83145794475747,41.11962435806133],[-72.84234594816678,41.1175173573005],[-72.84597594930347,41.116816357047114],[-72.84663394950944,41.11668835700098],[-72.84860695012725,41.11630735686325],[-72.84926595033362,41.11618035681729],[-72.8514289510108,41.11576135666603],[-72.85791795304247,41.11450635621258],[-72.86008195372001,41.11408835606146],[-72.86060695388434,41.113986356024675],[-72.86218295437774,41.11368135591449],[-72.86270895454248,41.113580355877865],[-72.86290795460474,41.11354135586386],[-72.86350795479258,41.113425355821946],[-72.86370795485523,41.113387355808094],[-72.86748595603801,41.11265635554397],[-72.87882295958708,41.11046335475138],[-72.88260196077009,41.10973335448736],[-72.88339296101763,41.10957935443185],[-72.88576896176139,41.109119354265616],[-72.88656096200936,41.108967354210485],[-72.89130296349364,41.10804935387873],[-72.9055319679473,41.10529735288355],[-72.91027496943184,41.10438135255202],[-72.92408097375255,41.101711351586125],[-72.96549998671243,41.093700348686625],[-72.97930699103185,41.091031347719856],[-72.98335499229815,41.09024834743628],[-72.99549899609673,41.08789834658518],[-72.99954799736324,41.087116346301656],[-73.00454299891108,41.08589234590095],[-73.01952900355462,41.0822213446988],[-73.0245250051026,41.08099834429812],[-73.03000900680162,41.07965434385796],[-73.04646401189933,41.075623342537355],[-73.05194901359846,41.074280342097204],[-73.0652010177032,41.07103334103314],[-73.10495803001528,41.061293337839686],[-73.11821103411872,41.05804733677483],[-73.12405703592859,41.056614336304804],[-73.14159504135779,41.052317334894845],[-73.14744204316777,41.05088633442498],[-73.14979204389516,41.05031033423597],[-73.1568450460782,41.048582333668755],[-73.15919604680593,41.04800733347987],[-73.16232304777374,41.04724133322839],[-73.17170405067701,41.04494233247365],[-73.1748310516448,41.044177332222304],[-73.17536605181037,41.04404633217929],[-73.17697105230707,41.043653332050205],[-73.17750605247264,41.04352233200717],[-73.17765105251749,41.04348633199543],[-73.1780870526524,41.0433793319603],[-73.17823305269764,41.04334433194869],[-73.17928105302192,41.04308733186434],[-73.18242805399578,41.042316331611154],[-73.18347705432045,41.04206033152694],[-73.1910860566724,41.04015033090567],[-73.20203606005695,41.03740433001198],[-73.21391506372821,41.034423329041886],[-73.22059506579255,41.032747328496356],[-73.22106006593624,41.03263032845831],[-73.22152506607998,41.03251432842046],[-73.22304006654811,41.03213332829655],[-73.22758906795383,41.03099232792506],[-73.22910506842229,41.030612327801315],[-73.22964306859024,41.03050732776325],[-73.23125906909486,41.0301953276496],[-73.23179806926319,41.0300913276117],[-73.2330810696598,41.029772327507466],[-73.23693007084982,41.02881932719554],[-73.23821407124686,41.028502327091644],[-73.23884107144121,41.02835632704266],[-73.24072607202575,41.02792032689592],[-73.2413540722205,41.02777532684707],[-73.24259707260585,41.02748632675],[-73.24632907376301,41.02662232645931],[-73.2475730741487,41.02633432636239],[-73.24796907427142,41.02624132633128],[-73.24916107464102,41.02596532623843],[-73.24955807476415,41.02587432620767],[-73.2547250763801,41.024924325853505],[-73.26128907843294,41.023719325403896],[-73.27022608122773,41.02207732479138],[-73.27302008210144,41.02156432459994],[-73.27420708247264,41.02134632451859],[-73.27539308284348,41.021128324437264],[-73.27859508384131,41.020479324205844],[-73.28820408683582,41.01853632351216],[-73.29140708783392,41.01788832328085],[-73.29243808815515,41.01767932320631],[-73.2955330891196,41.0170533229828],[-73.29656508944123,41.0168453229084],[-73.29657108944305,41.01684332290783],[-73.29659108944927,41.016839322906385],[-73.29659808945148,41.01683832290596],[-73.31219009430966,41.0136833217795],[-73.35896810888178,41.00422231839886],[-73.37456111373818,41.00106831727125],[-73.37528311396035,41.00087531720981],[-73.3774501146273,41.000297317025634],[-73.37817311484983,41.00010531696435],[-73.37902011511416,40.99994331690491],[-73.38156111590726,40.99946131672739],[-73.382409116172,40.99930131666832],[-73.38268611625843,40.99924831664888],[-73.3835171165178,40.99909031659075],[-73.38379511660459,40.99903831657147],[-73.38495311696602,40.9988183164905],[-73.38843011805128,40.99815931624768],[-73.38958911841306,40.997940316166854],[-73.39805512104512,40.99615531554008],[-73.42345312894041,40.99080131365934],[-73.4319201315722,40.989017313032335],[-73.43247413174433,40.98889931299105],[-73.43413613226093,40.988549312868],[-73.43469113243349,40.98843331282707],[-73.43621813290802,40.98811031271373],[-73.44080213433278,40.98714531237437],[-73.44233013480768,40.98682331226121],[-73.4451561356859,40.98622631205155],[-73.45363413832067,40.98443931142336],[-73.45646113919923,40.98384431121403],[-73.46438114166034,40.98217431062693],[-73.48814114904296,40.97716630886555],[-73.49606215150386,40.9754973082783],[-73.49956615259214,40.97475330801735],[-73.50026015280787,40.97460930796634],[-73.51286615672633,40.97199530703977],[-73.51706815803243,40.97112430673092],[-73.51920715869717,40.97067930657339],[-73.52562716069257,40.96934830610143],[-73.52776716135772,40.96890530594422],[-73.53105216237813,40.968215305700944],[-73.54090716543944,40.966147304971365],[-73.54419316646015,40.96545830472821],[-73.54608916704902,40.96505930458759],[-73.55177916881641,40.96386630416648],[-73.55367616940562,40.963468304026],[-73.5551131698519,40.963166303919515],[-73.55942617119146,40.962261303600116],[-73.56086417163812,40.961960303493754],[-73.56114017172378,40.9619013034731],[-73.5619721719822,40.96172730341159],[-73.56224917206823,40.961669303391105],[-73.56385117256573,40.961332303272286],[-73.56866017405923,40.96032330291614],[-73.57026317455707,40.95998730279745],[-73.57369817562382,40.95926630254297],[-73.58400317882392,40.957104301779594],[-73.58743917989092,40.956384301525205],[-73.59007418070904,40.955830301329755],[-73.59067018089416,40.955706301285794],[-73.59797718316165,40.954149300739644],[-73.60061118397901,40.9535883005428],[-73.6015621842739,40.953382300471056],[-73.60251318456874,40.95317530039912],[-73.60306418473957,40.95305530035741],[-73.60833818637477,40.951909299958764],[-73.6104281870235,40.95146829980337],[-73.61288618778656,40.95095129962092],[-73.61289718779061,40.95096029962233],[-73.64621019999299,40.97643730353073],[-73.64802120065652,40.97782230374302],[-73.64983320132036,40.97920730395528],[-73.65636920371533,40.984209304721894],[-73.65638020371928,40.984216304722906],[-73.65641320373138,40.98424130472672],[-73.65642420373548,40.98425130472832],[-73.6567002038366,40.984462304760655],[-73.65677220386297,40.98451730476908],[-73.65691420391832,40.984683304796974],[-73.65739120410424,40.98524230489099],[-73.65761620419202,40.9855073049356],[-73.65938120488009,40.98757630528357],[-73.65967220499354,40.987917305340915],[-73.6595322049597,40.98811430538421],[-73.65947520494603,40.988196305402184],[-73.65929220490207,40.988458305459666],[-73.6589122048106,40.9889993055784],[-73.65887920480168,40.989029305585376],[-73.65877120477276,40.989132305609175],[-73.65863120473526,40.989265305639876],[-73.65780020452362,40.990246305859884],[-73.65722920437832,40.99092230601142],[-73.6579732046805,40.992005306199474],[-73.6590332050944,40.99325930641065],[-73.65904320509833,40.99327130641267],[-73.65910720512328,40.9933463064253],[-73.65963720534518,40.994233306581904],[-73.65964020534955,40.99429230659339],[-73.65965320536748,40.99453130663988],[-73.65958520537008,40.99495830672592],[-73.65951820537309,40.99538630681214],[-73.65950820537336,40.99544730682444],[-73.6594952053741,40.99553330684176],[-73.65938420539503,40.99652030703913],[-73.65931020540904,40.997179307170924],[-73.65941720546529,40.99755730724157],[-73.6597282056289,40.99865830744741],[-73.65973720563363,40.998690307453394],[-73.65994020574044,40.999409307587804],[-73.66005820580236,40.99982430766535],[-73.66013520584272,41.0000943077158],[-73.6602112058828,41.00036530776648],[-73.66024220589678,41.00043430777899],[-73.66026920590882,41.000492307789486],[-73.66017520588638,41.00062930781947],[-73.6601332058765,41.00069330783343],[-73.65969220578182,41.00152030801028],[-73.65855620555953,41.004026308539544],[-73.65808320544889,41.00475530869821],[-73.65802120543597,41.004878308724386],[-73.65796020542341,41.00500230875075],[-73.65791720541444,41.005087308768836],[-73.65787520540577,41.00517230878692],[-73.65778220538569,41.00534430882373],[-73.65769120536626,41.005517308860675],[-73.65721520526421,41.00641230905202],[-73.65684720519187,41.007218309222324],[-73.65606620503848,41.008931309584206],[-73.65527720494525,41.01173531016042],[-73.65524220494116,41.011860310186094],[-73.65525620496834,41.01225431026294],[-73.65532120499454,41.01234531027864],[-73.65541420503075,41.01245331029677],[-73.65565120512059,41.01268631033467],[-73.65611820529752,41.0131433104089],[-73.65620520533457,41.013299310436636],[-73.65629420537218,41.01345431046411],[-73.65690220563037,41.014533310655736],[-73.65737320581522,41.0151053107524],[-73.65787320601677,41.015805310873226],[-73.65814020612015,41.01610531092326],[-73.6586802063294,41.01671431102491],[-73.65877320636653,41.01683831104617],[-73.65899320645752,41.01718631110717],[-73.65907920649043,41.017276311122004],[-73.65944820663152,41.017659311184936],[-73.66045520700763,41.01855031132647],[-73.66173620748576,41.01967831150545],[-73.6618482075276,41.019777311521175],[-73.66267320783562,41.02050531163671],[-73.6627572078671,41.02058131164886],[-73.66351120816641,41.02155531181501],[-73.66352320817131,41.021573311818145],[-73.6636052082035,41.02167331183504],[-73.66385920830145,41.021951311881196],[-73.66407520838517,41.02219531192191],[-73.66418020842475,41.02229431193787],[-73.66467320862472,41.02300531206104],[-73.66519020882822,41.0236433121691],[-73.66524120884824,41.02370531217958],[-73.6652582088549,41.02372531218293],[-73.66560720899207,41.02415231225516],[-73.66654020935891,41.025296312448724],[-73.666716209428,41.02551031248487],[-73.66678320945434,41.02559231249873],[-73.66917321039313,41.02850531299107],[-73.66977321063852,41.029405313147734],[-73.67037821087183,41.03006731325758],[-73.67051221093978,41.030496313337274],[-73.67060721099011,41.0308383134012],[-73.67107521118126,41.031535313522404],[-73.67135121128901,41.03186031357703],[-73.6714122113129,41.03193331358932],[-73.6717682114519,41.03235231365971],[-73.6718332114773,41.03242931367265],[-73.67192721151409,41.03254131369151],[-73.67192821151447,41.032542313691685],[-73.67199921154118,41.032608313702276],[-73.67218821161482,41.03282831373918],[-73.67223821163567,41.03291031375359],[-73.67223921163605,41.03291131375374],[-73.67224121163687,41.03291431375428],[-73.67234821167716,41.03301431377035],[-73.67249921173594,41.033189313799674],[-73.67263221178865,41.03335931382862],[-73.6727192118237,41.03348031384946],[-73.67275721183854,41.033525313857034],[-73.67275821183887,41.033525313857005],[-73.67288921189042,41.03368631388423],[-73.67300421193599,41.03383331390927],[-73.67309821197126,41.03391931392302],[-73.67370821220989,41.0346453140452],[-73.67371221221147,41.03465031404607],[-73.6745182125282,41.03563431421235],[-73.67480521263894,41.03594931426464],[-73.67481021264085,41.03595431426543],[-73.6749232126853,41.03609331428896],[-73.67498821271084,41.0361723143023],[-73.67499121271203,41.03617631430298],[-73.67505921273923,41.03626731431858],[-73.67512421276435,41.03633931433055],[-73.67519221279066,41.03641531434319],[-73.67531221283708,41.03654931436551],[-73.67548821290441,41.03673231439557],[-73.67554721292696,41.03679331440558],[-73.675600212947,41.03684431441383],[-73.67565221296718,41.036903314423675],[-73.67574421300303,41.037010314441616],[-73.67591921307702,41.037314314495426],[-73.67600821311201,41.03742331451386],[-73.67611821315477,41.03754931453492],[-73.67618621318114,41.03762631454777],[-73.67625421320822,41.03771531456298],[-73.6763502132465,41.037842314584694],[-73.67637521325433,41.03783831458309],[-73.67638421325726,41.03783831458279],[-73.67641721327043,41.03788231459033],[-73.67658021333587,41.03810531462865],[-73.67705821352206,41.03866031472166],[-73.67744521367287,41.0391103147971],[-73.67746421368027,41.039132314800774],[-73.6775482137129,41.039228314816825],[-73.67776621379953,41.039511314865095],[-73.67778321380618,41.03953131486845],[-73.67787921384199,41.03961531488174],[-73.67788121384277,41.039617314882065],[-73.67805221390941,41.039816314915434],[-73.67853821409865,41.04037931500974],[-73.6785632141084,41.0404083150146],[-73.67856521410921,41.04041131501512],[-73.67856521410927,41.04041231501532],[-73.67877721419664,41.04074131507279],[-73.67890521424768,41.0409103151017],[-73.67927621439517,41.04139231518391],[-73.67951321448697,41.04165831522823],[-73.67975521458078,41.04193131527375],[-73.67977221458749,41.041952315277314],[-73.68184621537338,41.04397731560568],[-73.68247421561799,41.044705315727604],[-73.68294821580587,41.045311315830716],[-73.68296121581069,41.04532231583244],[-73.68571921690389,41.04884731643213],[-73.68676621731878,41.05018331665933],[-73.68683421734575,41.05027031667414],[-73.6869022173727,41.050357316688924],[-73.68695621739413,41.05042631670067],[-73.68701021741552,41.05049531671241],[-73.68717421748056,41.05070531674814],[-73.6879672177895,41.05162531690221],[-73.68953021840352,41.05352631722303],[-73.6898272185214,41.05390831728805],[-73.69071821887509,41.055055317483344],[-73.69101521899303,41.05543831754857],[-73.69125221908682,41.055738317599506],[-73.6914822191779,41.05603031764911],[-73.6918612193287,41.05652431773336],[-73.69195321936562,41.05664931775481],[-73.69218221945728,41.056957317807594],[-73.69226121948789,41.057046317822426],[-73.69227721949409,41.05706431782543],[-73.69234721952172,41.057151317840145],[-73.692505219582,41.05731231786646],[-73.69259021961439,41.057398317880505],[-73.6926692196445,41.05747831789355],[-73.69270821965985,41.057526317901676],[-73.69304121979079,41.057933317970395],[-73.6931532198348,41.058069317993336],[-73.69349121996763,41.058481318062896],[-73.69395322014738,41.05901231815163],[-73.69420722024822,41.05933931820731],[-73.69468222042798,41.0597983182815],[-73.6961742210137,41.061604318585964],[-73.6962532210448,41.06170131860234],[-73.6964162211089,41.061900318635935],[-73.70507422451537,41.07250332042622],[-73.70554522470223,41.07310632052872],[-73.70557522471411,41.073144320535164],[-73.70570622476615,41.07331332056393],[-73.70630522500373,41.074079320694096],[-73.71039422662584,41.07931132158322],[-73.71153722707928,41.080773321831614],[-73.71161422710985,41.08087232184844],[-73.71184722720221,41.08116932189889],[-73.71192522723318,41.08126932191589],[-73.71379722797467,41.08364332231867],[-73.71514922851237,41.08539532261687],[-73.71545122863218,41.08578132268244],[-73.71547922864333,41.085818322688745],[-73.71581122877501,41.08624232276075],[-73.71706422926952,41.08779932302403],[-73.71773822954563,41.08881132319982],[-73.71787622960133,41.08900432323301],[-73.71798922964602,41.089146323257054],[-73.71804722966893,41.08921832326923],[-73.71806122967442,41.089235323272106],[-73.7186762299174,41.090004323402255],[-73.71884022997911,41.090155323426366],[-73.71935523017285,41.09063132350247],[-73.71940123019014,41.09067332350917],[-73.72057723063246,41.091758323682555],[-73.72101923079869,41.09216532374756],[-73.72122523087668,41.09236432377969],[-73.72166723104382,41.09278732384784],[-73.72172723106652,41.09284532385718],[-73.72211023121135,41.093211323916115],[-73.72271123143848,41.09378432400836],[-73.72338323169363,41.09444532411543],[-73.72347223172966,41.09457132413717],[-73.72361723178838,41.09477732417266],[-73.72477823226134,41.0964733244661],[-73.72496123233594,41.096741324512486],[-73.72514323241002,41.0970063245583],[-73.72533523248822,41.097286324606735],[-73.72617323282954,41.0985093248183],[-73.72621323284581,41.09856732482832],[-73.72651623296758,41.09898132489929],[-73.72682223309064,41.09940032497114],[-73.7268462331003,41.0994333249768],[-73.72777623347412,41.10070432519468],[-73.71376622933265,41.107252326940895],[-73.71365022929794,41.10729932695393],[-73.71355122926848,41.10734232696564],[-73.71340422922505,41.107411326984],[-73.71296122909402,41.10761732703901],[-73.71227322888885,41.10790832711879],[-73.71222622887484,41.10792832712426],[-73.7060222270415,41.110842327900194],[-73.70590122700571,41.11089832791517],[-73.70587122699682,41.11091232791891],[-73.70581522698026,41.11093832792586],[-73.70567522693891,41.11100432794342],[-73.7055352268975,41.11106932796078],[-73.70362022632197,41.11180332816788],[-73.70354322629886,41.11183332817631],[-73.70344622627044,41.11188332818932],[-73.70330022622761,41.111957328208625],[-73.7031542261848,41.112031328227964],[-73.70284122609301,41.11219132826963],[-73.7027342260619,41.11225032828474],[-73.7007042254725,41.113385328574125],[-73.70000422526299,41.11366832865269],[-73.69605422408057,41.115264329095936],[-73.69595922405267,41.11531232910847],[-73.69500622377225,41.11578132923182],[-73.68947522214475,41.11850432994792],[-73.68607522113999,41.120104330373636],[-73.67902321905618,41.1234283312576],[-73.67677521839282,41.124504331542596],[-73.67641821828748,41.12467533158786],[-73.66993521636698,41.127651332384794],[-73.66980621632875,41.12771033240062],[-73.66968821629384,41.12776533241527],[-73.66802721580174,41.128527332619356],[-73.66780521573638,41.128636332648036],[-73.66721321556177,41.128921332723394],[-73.665932215184,41.1295393328867],[-73.6656482151003,41.1296773329231],[-73.66497421490165,41.130004333009396],[-73.66177021394871,41.131411333390716],[-73.66160821390054,41.13148233340996],[-73.66112221375589,41.13169433346752],[-73.66096121370809,41.13176633348694],[-73.6608742136822,41.131804333497264],[-73.66057421359693,41.13200433354633],[-73.65613721227852,41.133975334078755],[-73.6561232122743,41.13398033408019],[-73.65608521226301,41.133997334084775],[-73.65607321225947,41.134003334086344],[-73.65607221225913,41.13400333408639],[-73.65597121222856,41.13403833409657],[-73.65563421212624,41.134150334129636],[-73.6554742120777,41.134204334145494],[-73.65543721206693,41.13422433415064],[-73.65535421204278,41.13427033416239],[-73.6543742117573,41.134804334299275],[-73.65167421096079,41.136104334642916],[-73.65158221093347,41.13614533465399],[-73.64459720885907,41.13927133549659],[-73.64407520870431,41.13950933556041],[-73.63967320739835,41.14150433609627],[-73.63776620682975,41.142319336318764],[-73.63774920682465,41.1423263363207],[-73.63774820682438,41.14232733632093],[-73.63772720681848,41.142342336324546],[-73.63772420681768,41.14234533632524],[-73.63735420671522,41.14263933639497],[-73.63601520631745,41.14323733655623],[-73.63563720619868,41.14329433657988],[-73.63550220615868,41.143356336596476],[-73.63486020596663,41.14362033666936],[-73.63475020593344,41.14366033668081],[-73.63473720593069,41.14368533668613],[-73.63471620592398,41.14368633668702],[-73.63471620592402,41.14368733668722],[-73.63464920590296,41.14369733669139],[-73.63445720584507,41.14376833671163],[-73.63440520583164,41.1438263367247],[-73.63428620579403,41.14384033673136],[-73.63396720569929,41.143983336769885],[-73.6338592056669,41.14402633678186],[-73.63385820566657,41.14402633678189],[-73.63382820565758,41.14403833678526],[-73.6337012056193,41.14408533679864],[-73.63352820556835,41.14417033682099],[-73.63232920521537,41.14476133697623],[-73.63021120459153,41.145800337249476],[-73.62948720437613,41.146118337335615],[-73.62928220431571,41.14621833736195],[-73.62906120425014,41.14631833738883],[-73.62879720417176,41.14643733742083],[-73.6282692040148,41.14667133748405],[-73.62668620354431,41.147375337674085],[-73.62615920338779,41.147611337737665],[-73.62576420327034,41.14778633778496],[-73.62458220291913,41.148313337927114],[-73.6245722029162,41.14831833792842],[-73.62436220284599,41.14827733792733],[-73.62417520279052,41.14836233795015],[-73.6224902022905,41.14912533815508],[-73.62209020217185,41.14930733820391],[-73.61743520079045,41.15141533877005],[-73.61575020029045,41.152179338975166],[-73.61547320020809,41.152302339008365],[-73.61464419996166,41.15267033910775],[-73.61436819987969,41.152794339141124],[-73.61420719983207,41.1528703391613],[-73.61419719982908,41.1528743391624],[-73.61404619978441,41.152945339181294],[-73.61401219977436,41.152961339185545],[-73.61396019975896,41.15298533919195],[-73.61368419967728,41.153114339226306],[-73.6136201996584,41.153145339234484],[-73.61351319962655,41.153192339247205],[-73.61237519928846,41.15370133938436],[-73.60896219827445,41.15522833979576],[-73.60853319814707,41.155421339847685],[-73.60782519793678,41.15573933993328],[-73.60778719792543,41.15575533993764],[-73.60767619789249,41.1558053399511],[-73.60763919788153,41.15582233995564],[-73.60721619775582,41.15601134000659],[-73.60617919744779,41.15647634013179],[-73.60594819737908,41.156578340159356],[-73.60552619725375,41.156768340210455],[-73.6044591969367,41.157245340339],[-73.6012571959854,41.15867934072519],[-73.60019119566873,41.15915734085389],[-73.5998761955763,41.15931834089578],[-73.59977219554575,41.159371340909566],[-73.5985181951779,41.16001434107674],[-73.59833519512422,41.16010834110116],[-73.59815119507029,41.16020334112582],[-73.598099195055,41.160229341132606],[-73.5978951949951,41.1603333411597],[-73.59728419481591,41.16064734124128],[-73.5972461948048,41.16066734124644],[-73.59711119476853,41.16079434127574],[-73.59709919476472,41.16079534127631],[-73.59708919476257,41.160814341280386],[-73.59702319474479,41.16087534129447],[-73.5970021947392,41.160896341299285],[-73.5959671944293,41.16131834141598],[-73.59286319349997,41.16258634176645],[-73.59182919319048,41.163010341883506],[-73.59069419285352,41.1635233420213],[-73.58932219244622,41.16414434218804],[-73.58841119217564,41.164554342298295],[-73.58728819184225,41.1650623424347],[-73.58615419150563,41.16557634257264],[-73.58608719148573,41.165606342580716],[-73.58602019146586,41.165637342588994],[-73.58588019142428,41.16570034260594],[-73.58581319140438,41.16573034261401],[-73.58561319134503,41.16582134263841],[-73.5852421912349,41.16598934268352],[-73.58475119108905,41.16621034274293],[-73.5847121910775,41.16622834274774],[-73.58455019102945,41.16630234276756],[-73.58421019092852,41.16645634280891],[-73.58054318983979,41.168115343254335],[-73.57914118942358,41.16875034342476],[-73.57905718939858,41.168787343434786],[-73.5788051893237,41.1689003434652],[-73.57880018932227,41.16890334346595],[-73.57872218929909,41.168938343475354],[-73.57736018889514,41.169562343642326],[-73.57327718768427,41.17143434414309],[-73.57191618728069,41.172059344310206],[-73.57087618697227,41.17253634443778],[-73.57076518693928,41.17258634445122],[-73.5673131859155,41.17416934487462],[-73.56616318557451,41.17469834501598],[-73.56588118548976,41.17480834504681],[-73.56503618523593,41.17514034513958],[-73.56494318520804,41.1751773451499],[-73.56476018515386,41.17526334517274],[-73.5644791850706,41.17539334520743],[-73.56363718482122,41.175785345311844],[-73.56335718473836,41.17591734534688],[-73.56239518445344,41.1763653454662],[-73.55950918359879,41.177712345824766],[-73.55854818331423,41.17816134594423],[-73.55837118326178,41.17824334596611],[-73.55784218310511,41.17849034603184],[-73.55766618305304,41.17857334605387],[-73.55610818259164,41.179300346247366],[-73.55602818256794,41.179337346257235],[-73.55595518254631,41.179371346266294],[-73.55548918240828,41.179588346324095],[-73.55537518237456,41.17964234633841],[-73.55526018234046,41.179695346352574],[-73.5551601823109,41.17974234636505],[-73.55506018228128,41.17978934637754],[-73.55487518222641,41.17987434640026],[-73.55478418219948,41.17991734641168],[-73.55471218217814,41.17995034642049],[-73.5540101819703,41.18027934650796],[-73.55389118193504,41.18033434652264],[-73.5537731819001,41.180389346537275],[-73.55146918121784,41.18146634682379],[-73.54899918048383,41.18257634712223],[-73.54005117782496,41.18660334820444],[-73.54001317781331,41.18661434820785],[-73.53599717662114,41.18844334869774],[-73.53588517658807,41.18849734871199],[-73.52910817458185,41.19168234955786],[-73.52629017374768,41.19300834990991],[-73.52603017367001,41.19311834993995],[-73.52530417345298,41.193423350023494],[-73.52529417344998,41.1934273500246],[-73.52484117331467,41.193619350077064],[-73.52454317322783,41.193783350118935],[-73.52426117314575,41.1939403501589],[-73.52377117299697,41.19410635020749],[-73.52375117299079,41.19411135020912],[-73.5236761729685,41.19414535021824],[-73.52334317286967,41.19429735025894],[-73.5230831727928,41.19442135029173],[-73.52256417264117,41.194700350363355],[-73.52252417262943,41.19472135036878],[-73.52233817257522,41.194823350394856],[-73.52159817235511,41.195153350483714],[-73.52116517222638,41.195347350535904],[-73.52098117217157,41.19542835055779],[-73.51706917101717,41.19733335105896],[-73.51692817097552,41.197401351076905],[-73.51678717093394,41.197470351095035],[-73.51418017016464,41.198740351429116],[-73.51399417011156,41.19886235145907],[-73.5138641700722,41.19890835147234],[-73.51386417007225,41.19890935147254],[-73.51386317007191,41.198909351472565],[-73.51280416975699,41.19938335160009],[-73.51280416975706,41.19938435160028],[-73.51280316975678,41.19938535160052],[-73.51173116943535,41.19981935172063],[-73.51170516942855,41.199847351726966],[-73.51160916939989,41.199888351738146],[-73.51157716938954,41.1998883517392],[-73.5115771693896,41.199889351739394],[-73.51157616938927,41.19988935173942],[-73.51156916938709,41.19989035173984],[-73.51015016896426,41.20051135190795],[-73.51014916896395,41.20051135190797],[-73.51014816896368,41.20051235190819],[-73.50917516867378,41.20093835202349],[-73.50395916712523,41.203320352660725],[-73.49590216472097,41.20678935360389],[-73.49556616462066,41.20693335364308],[-73.49545316458695,41.206982353656386],[-73.49500316445268,41.207176353709094],[-73.49461416433662,41.20734435375473],[-73.49456016432043,41.207366353760804],[-73.49422516422057,41.20751235380036],[-73.49396316414234,41.20762435383087],[-73.49172916347558,41.208585354092186],[-73.48841316248604,41.21001435448055],[-73.48747516221414,41.210557354617514],[-73.48683816202933,41.210923354709976],[-73.48534416158256,41.21155135488185],[-73.48511016151319,41.21166035491084],[-73.48500316148136,41.21170835492374],[-73.48489916145053,41.21175635493655],[-73.48269616079737,41.21278035520911],[-73.48392616128396,41.21432035546947],[-73.48632816223433,41.21732935597815],[-73.48797816288713,41.21939535632736],[-73.48854116310896,41.220084356443394],[-73.49140816423885,41.223596357034864],[-73.49645316622755,41.22978135807645],[-73.49889116718879,41.23277135857988],[-73.50101316802532,41.23537135901756],[-73.5012341681125,41.23564335906337],[-73.50140116817832,41.2358473590977],[-73.50147416820717,41.235938359113064],[-73.50170016829624,41.236214359159476],[-73.50176516832188,41.23629435917296],[-73.50253316862471,41.237236359331526],[-73.50263716866569,41.23736335935291],[-73.50266016867508,41.23739735935878],[-73.50340416896883,41.238316359513654],[-73.50437516935207,41.2395133597153],[-73.50499016959485,41.24027235984318],[-73.5064921701878,41.242125360155356],[-73.50832317091063,41.24438436053589],[-73.50986317151863,41.246284360855896],[-73.5099631715581,41.246407360876624],[-73.51054917178958,41.24713236099879],[-73.51230917248483,41.249310361365765],[-73.51289617271672,41.25003636148808],[-73.51290617272072,41.25004936149028],[-73.51293817273336,41.250089361497025],[-73.51294917273773,41.2501033614994],[-73.51745717450608,41.25546336239653],[-73.51746517450924,41.25547336239823],[-73.51749717452208,41.255516362405565],[-73.51750717452613,41.25553036240796],[-73.51751017452733,41.255534362408646],[-73.52341917685321,41.26269236361005],[-73.52366317694872,41.26297836365778],[-73.5237461769814,41.26307936367474],[-73.5247641773776,41.26423436386644],[-73.52520917755074,41.26473836395005],[-73.52523117755983,41.26477236395596],[-73.52529817758544,41.26484036396703],[-73.52571317774958,41.26535636405396],[-73.52628417797565,41.26607036417437],[-73.5263171779886,41.266109364180885],[-73.52855517886601,41.268757364623454],[-73.536678182051,41.2783683662293],[-73.53670418206123,41.27839936623449],[-73.53688318213148,41.2786123662701],[-73.53838818272168,41.28039336656761],[-73.54059818358829,41.283007367004195],[-73.54071818363553,41.2831523670285],[-73.54355618475292,41.28658536760391],[-73.54811518654826,41.29210336852869],[-73.54884618683553,41.29297736867486],[-73.5488501868371,41.2929823686757],[-73.55096318766287,41.2954293690827],[-73.54988018766755,41.301530370307475],[-73.54986018768342,41.301914370382946],[-73.54968818783055,41.30539837106749],[-73.54960318790313,41.307117371405226],[-73.54948118842478,41.316754373286635],[-73.5492941885294,41.31958937384503],[-73.54908918878658,41.3251423749333],[-73.54897418881687,41.3263003751626],[-73.54897418881716,41.326305375163585],[-73.54861018891414,41.32999037589322],[-73.54824218899464,41.33341437657209],[-73.54823718899613,41.33346737658257],[-73.54814318902284,41.33444737677649],[-73.54805018904734,41.33538437696201],[-73.54790518906832,41.33654837719344],[-73.54712418918274,41.34284437844496],[-73.54709018918813,41.34312537850077],[-73.5469201892395,41.34494937886145],[-73.54628318943473,41.35182938022161],[-73.5462101894569,41.35261438037681],[-73.54597118951011,41.35485138082005],[-73.54596918951023,41.35486438082265],[-73.54565018958102,41.35784638141349],[-73.54529418968052,41.36152438214092],[-73.5452591896899,41.36187938221116],[-73.54515618971885,41.36294638242217],[-73.54512218972864,41.36330238249255],[-73.54504318973903,41.36391838261502],[-73.54480718977057,41.36576638298236],[-73.54472918978135,41.36638338310498],[-73.5445331898076,41.3679193834103],[-73.5439461898868,41.3725283843263],[-73.54375118991346,41.37406538463172],[-73.54374518991408,41.37410938464049],[-73.54372818991648,41.37424438466731],[-73.54372318991749,41.37428938467623],[-73.54366018992596,41.37478338477439],[-73.54362018993163,41.375102384837774],[-73.54347218995174,41.37626638506907],[-73.54342618995813,41.376630385141404],[-73.54341718996291,41.37676238516736],[-73.54326519005483,41.379177385642095],[-73.54281019033117,41.38642638706683],[-73.54265919042355,41.3888423875416],[-73.54265819042496,41.38887238754748],[-73.54262919043813,41.3892583876235],[-73.54262319044466,41.38940338765188],[-73.54262319044578,41.389422387655564],[-73.5426021904418,41.38947038766559],[-73.54257219044855,41.38975238772142],[-73.54256319047174,41.39019838780843],[-73.542587190483,41.3902583878193],[-73.54257319048976,41.39045138785728],[-73.5425611904971,41.390643387895025],[-73.54253719051009,41.390998387964835],[-73.54247019058218,41.392602388278895],[-73.54236319062134,41.39386438852781],[-73.54152019093,41.40380739048852],[-73.54147019094863,41.40440239060583],[-73.54134119095595,41.40524139077316],[-73.54132919095686,41.405323390789505],[-73.54114519095405,41.40629339098413],[-73.54112019095163,41.406390391003804],[-73.54110319095152,41.406482391022244],[-73.54046919104178,41.41153239202466],[-73.54044719104498,41.411708392059616],[-73.54042419104775,41.41188339209435],[-73.5404111910497,41.41198839211521],[-73.54008719109459,41.4145473926232],[-73.54007619109659,41.41464239264204],[-73.53994519111464,41.41567539284708],[-73.53975119114153,41.41720739315119],[-73.53888819126198,41.42403639450655],[-73.53838419132153,41.42783939526202],[-73.53840519132898,41.42785039526344],[-73.53812919136747,41.430033395696626],[-73.53806719137587,41.430519395793084],[-73.53788919139873,41.43189339606586],[-73.53774319143172,41.43326339633679],[-73.53773219143436,41.43336939635773],[-73.53767419144746,41.433913396465314],[-73.53763319145739,41.43430939654358],[-73.53751019148741,41.43550139677916],[-73.53747019149772,41.43589839685759],[-73.53726219154875,41.43791839725678],[-73.5370941915996,41.43971439761112],[-73.53702719162368,41.440495397765],[-73.53681419169186,41.442835398226435],[-73.53673419171163,41.443614398380355],[-73.5367331917113,41.44361439838039],[-73.53658519174041,41.444928398640435],[-73.53658419174008,41.44492839864047],[-73.53640719174996,41.446074398868845],[-73.53633519175983,41.446640398981124],[-73.53628819177868,41.44722139909548],[-73.53606519188101,41.45019839968084],[-73.53605619190577,41.45067039977279],[-73.5360471919214,41.45098639983441],[-73.53603719193927,41.451346399904644],[-73.53600119201354,41.452811400190235],[-73.53598719202408,41.45306840024058],[-73.53597719203357,41.453285400283036],[-73.53589319210947,41.45504340062708],[-73.53587219212737,41.4554644007095],[-73.53586319213436,41.45563340074261],[-73.53584319213998,41.45583940078324],[-73.53583719215206,41.45607840082985],[-73.53582319215931,41.45627940086933],[-73.53579919217238,41.45663440093903],[-73.53579119217697,41.45675740096317],[-73.53578419218177,41.4568774009867],[-73.53577019219425,41.45716740104344],[-73.5357321922159,41.45774640115709],[-73.5356071922839,41.45959540152012],[-73.53556919232656,41.46053240170324],[-73.53540919236511,41.462072402007436],[-73.53535519239162,41.46282240215479],[-73.53530519239298,41.463121402214476],[-73.535287192404,41.46340840227078],[-73.53527019240401,41.46350240228958],[-73.53527019243923,41.46410240240603],[-73.53526619243898,41.46412040240964],[-73.5352521924486,41.46436140245688],[-73.53522219244896,41.464533402491256],[-73.53521119244846,41.46458540250171],[-73.53517119245997,41.46500240258397],[-73.53512919247642,41.46551440268471],[-73.5350701924977,41.466202402820194],[-73.53507019249963,41.46623540282659],[-73.53507319253781,41.46686940294952],[-73.5350501925411,41.46705240298579],[-73.53497019255333,41.46770240311459],[-73.53497019255997,41.46781540313652],[-73.53497019257746,41.46811340319435],[-73.53497019259449,41.46840340325062],[-73.53490319260814,41.46900540336966],[-73.53487019261487,41.46930240342839],[-73.53485719262005,41.469462403459865],[-73.53480819264188,41.47010440358605],[-73.53475219265702,41.470671403697935],[-73.53467019267654,41.471456403852976],[-73.53461619270531,41.472244404007654],[-73.53457019272905,41.47290240413686],[-73.53453319274072,41.473305404216276],[-73.53436819280832,41.47536640462163],[-73.53432219281235,41.47568940468582],[-73.53429119281508,41.47590640472895],[-73.53420219282623,41.47658740486403],[-73.53412019283854,41.477249404995185],[-73.53406119285161,41.47779740510345],[-73.53404519285581,41.47795740513502],[-73.53397619289197,41.47895340533054],[-73.53396619289848,41.479119405363065],[-73.5339561929037,41.47926340539132],[-73.53395319291,41.4793874054155],[-73.53394819295163,41.48012340555844],[-73.5338581930188,41.48176340587957],[-73.53325119331076,41.490079407512695],[-73.53322319332473,41.49047140758964],[-73.53318619334453,41.491012407695806],[-73.53287719348978,41.4951864085155],[-73.5327361935572,41.49711040889327],[-73.53269319357554,41.49765940900115],[-73.53260719361106,41.498737409213035],[-73.53260419361153,41.49876240921799],[-73.53260319361276,41.49878840922305],[-73.53257019362769,41.499224409308695],[-73.53256319363054,41.499311409325806],[-73.53250519365633,41.50006940947468],[-73.53245219366559,41.500519409563694],[-73.5317781938909,41.50806341104866],[-73.53177819389096,41.50806441104884],[-73.53112919410799,41.51532741247823],[-73.53095919416506,41.51723341285329],[-73.5309051941831,41.517837412972135],[-73.53074319423726,41.51964941332869],[-73.53068919425532,41.520253413447534],[-73.53060919428226,41.52115141362422],[-73.53056919429595,41.52160441371333],[-73.53053519430748,41.521987413788686],[-73.5303671943626,41.52384841415491],[-73.53028719438959,41.524747414331756],[-73.53028419438974,41.524766414335545],[-73.53027919439165,41.52482641434734],[-73.5302781943925,41.524846414351245],[-73.53023519440629,41.52531741444394],[-73.53011019444898,41.52673041472188],[-73.53006819446318,41.52720241481473],[-73.52945519466839,41.53406041616378],[-73.52945019467018,41.5341184161752],[-73.52944519467198,41.534176416186604],[-73.52931419471558,41.53563741647398],[-73.52922919472451,41.53625641659672],[-73.52896219475049,41.53816641697559],[-73.52895119475087,41.53823341698892],[-73.52769319503419,41.54995941930181],[-73.52742519519346,41.55413442011916],[-73.52740619520063,41.55436042016355],[-73.52609819561357,41.56854942295393],[-73.52600219578176,41.571926423610726],[-73.5259951957914,41.57212842365006],[-73.52475219609249,41.58405442599923],[-73.52386619631491,41.5926834276981],[-73.52232519671108,41.607840430680795],[-73.52147919693309,41.616233432331704],[-73.5214591969382,41.61642943237024],[-73.52143619694203,41.61662043240793],[-73.52104219700126,41.619781433032124],[-73.52101919702267,41.620269433127234],[-73.52097219706495,41.62124143331668],[-73.52083319719242,41.62415743388495],[-73.52078819723368,41.62510143406892],[-73.52078619723476,41.625130434074585],[-73.52063419737313,41.62830143469252],[-73.52017919778885,41.63781543654617],[-73.52002819792774,41.64098743716406],[-73.5200251979293,41.641030437172475],[-73.52001919793513,41.64116143719797],[-73.5200181979374,41.641205437206516],[-73.51996319795967,41.64188243733914],[-73.51980119802768,41.6439174377377],[-73.51974719805031,41.644595437870464],[-73.51965319809369,41.6458424381145],[-73.51937519822536,41.64958643884698],[-73.51928319826946,41.650834439091106],[-73.51814619880763,41.66613344208351],[-73.51812219881386,41.66636944212987],[-73.5180981988206,41.66661444217797],[-73.51808119882202,41.66673144220111],[-73.5180721988226,41.66679044221282],[-73.51806519882395,41.66685144222483],[-73.51801219884999,41.66758044236734],[-73.51783119894242,41.67012844286532],[-73.51777119897338,41.67097844303141],[-73.51776819897454,41.67101444303846],[-73.51776219897917,41.67112544306009],[-73.51776019898072,41.67116244306732],[-73.51756419911203,41.67444744370798],[-73.51698019950751,41.684303445629816],[-73.51678619963967,41.68758944627042],[-73.51674019964997,41.68801444635396],[-73.51660619968233,41.68929144660485],[-73.51656219969334,41.68971744668853],[-73.51645219973575,41.69103244694593],[-73.51612619986427,41.69497744771798],[-73.5160591998904,41.69578344787572],[-73.51601819990739,41.696293447975485],[-73.51542920006797,41.702213449137204],[-73.51506820016665,41.705845449849846],[-73.51429020037924,41.713669451384774],[-73.51421120040563,41.71454445155615],[-73.51388920051491,41.71813945226014],[-73.51372320057064,41.71998245262104],[-73.51319120075053,41.72590945378152],[-73.51297220083497,41.72852345429275],[-73.51270820093792,41.73169345491264],[-73.51231820108944,41.73636645582637],[-73.51211520116863,41.73880345630282],[-73.51210020117438,41.738981456337626],[-73.51205920118767,41.739428456425145],[-73.5119372012279,41.740769456687644],[-73.51193120123054,41.740846456702684],[-73.51192220123377,41.74094945672284],[-73.51190820124515,41.74121745677495],[-73.51183920130262,41.74255845703568],[-73.51163320147552,41.74658445781834],[-73.51156520153336,41.74792645807919],[-73.51151420157531,41.7489084582701],[-73.5114542016269,41.75010145850196],[-73.51136420170212,41.7518544588427],[-73.51131420174447,41.75283745903375],[-73.5113032017478,41.752953459056464],[-73.51127320175871,41.75330045912431],[-73.51126320176245,41.753417459147194],[-73.51125020176752,41.75357345917767],[-73.51119920180524,41.75448445935489],[-73.51102120193839,41.757688459978056],[-73.51096220198293,41.75875746018593],[-73.51041720216483,41.76477746136364],[-73.50961620243254,41.77362846309489],[-73.50878120271084,41.78283846489597],[-73.50848220281134,41.786149465543325],[-73.50817820287399,41.78885346607395],[-73.50811620289387,41.78952346620498],[-73.5079312029537,41.79153246659786],[-73.50787020297396,41.792203466729035],[-73.50771320302523,41.79391646706395],[-73.50746220310798,41.796667467601765],[-73.50724120317899,41.79905846806927],[-73.50708920322823,41.800709468392036],[-73.50708420323038,41.80077246840432],[-73.50588220366278,41.81454347109385],[-73.50524620389183,41.82183047251666],[-73.50525020389476,41.82185847252191],[-73.50525820390588,41.82200047254895],[-73.5053162040405,41.823936472919314],[-73.50531320404023,41.82394847292173],[-73.50528820403834,41.824052472942554],[-73.50528120404168,41.82414647296088],[-73.50525720405045,41.824423473014946],[-73.50430820432226,41.8341214749114],[-73.50193820500213,41.858339479645316],[-73.5019542050153,41.85847247967034],[-73.50198520504053,41.85872547971792],[-73.50179320508406,41.86049348006402],[-73.50113720523433,41.86655848125113],[-73.50102120526145,41.86764048146287],[-73.50094520527877,41.86834148160006],[-73.50091820528435,41.86858048164688],[-73.50078220531357,41.86980548188673],[-73.50037320540106,41.873482482606676],[-73.50023820543069,41.87470848284667],[-73.50016120544666,41.8753924829806],[-73.49993320549575,41.877446483382705],[-73.49990520550193,41.877701483432624],[-73.499892205507,41.877856483462814],[-73.49986420551444,41.878132483516765],[-73.49978520553405,41.878887483664386],[-73.49955020559352,41.881152484107204],[-73.49947320561382,41.881908484254964],[-73.49944520561961,41.88215648430353],[-73.4993642056381,41.88290348444966],[-73.49933720564425,41.883152484498375],[-73.49918420567822,41.88454748477136],[-73.49872620578053,41.88873448559059],[-73.49857420581486,41.89013048586369],[-73.49857320581474,41.89013348586431],[-73.49857220581495,41.89014248586607],[-73.49857220581518,41.89014648586686],[-73.49851820582607,41.89062048595964],[-73.4983582058594,41.89204248623799],[-73.49830520587068,41.89251748633096],[-73.4982962058761,41.89265648635793],[-73.49732020639202,41.90653448905428],[-73.49731720639356,41.90657648906245],[-73.4970542065762,41.911040489927856],[-73.49705720657953,41.91107948993524],[-73.49705820658104,41.91109948993905],[-73.4970572065853,41.911175489953656],[-73.4967562069073,41.91816349130446],[-73.49667920699024,41.91995949165158],[-73.49660220707321,41.92175649199888],[-73.4966002070755,41.921805492008346],[-73.49659320707467,41.92182949201318],[-73.49653020708784,41.92238949212272],[-73.4965272070885,41.92241649212799],[-73.49600820724726,41.92786449319037],[-73.494592207681,41.94273049608853],[-73.49445120772414,41.9442094963768],[-73.49444820772545,41.9442474963842],[-73.49393820788171,41.949599497427286],[-73.49393120788297,41.94965849743882],[-73.49392920788274,41.94966549744023],[-73.49392720788342,41.94968749744451],[-73.49392620788358,41.94969549744607],[-73.49385020789263,41.95025649755616],[-73.49362620792115,41.95194049788647],[-73.4935512079306,41.95250249799671],[-73.49352820793322,41.95267049802968],[-73.49347020794133,41.9531184981175],[-73.49346220794209,41.9531744981285],[-73.49344020794511,41.95334349816163],[-73.49343320795224,41.95349949819177],[-73.49342720795885,41.95364149821919],[-73.4934162079699,41.95388449826613],[-73.49341220797369,41.953969498282554],[-73.49340520798087,41.95412649831289],[-73.49339920798555,41.95423649833416],[-73.49339620798891,41.95430849834806],[-73.49338820799728,41.95449049838322],[-73.4933842080006,41.9545674983981],[-73.49338120800324,41.95462749840972],[-73.49339320801009,41.9546764984187],[-73.4933832080119,41.95476049843513],[-73.49338220801206,41.954768498436714],[-73.49331420802643,41.95537449855514],[-73.49308020807659,41.95747149896487],[-73.49300220809337,41.958171499101645],[-73.49299820809382,41.95820049910734],[-73.49298920809632,41.95829049912489],[-73.49298920809662,41.958295499125846],[-73.4929882080978,41.95832049913068],[-73.49297620810667,41.95853249917171],[-73.49296420811078,41.95866549919758],[-73.4928742081439,41.95970149939915],[-73.49284520815529,41.96004749946642],[-73.49283520815825,41.96015049948651],[-73.49272220820045,41.96146149974153],[-73.49255820826234,41.963374500113595],[-73.49235620833707,41.965705500567054],[-73.4922422083792,41.96702050082282],[-73.4922362083822,41.96710250083873],[-73.49222720838434,41.96718650085514],[-73.49222420839311,41.967348500886274],[-73.49167620862929,41.97422550222219],[-73.49150320870373,41.976394502643494],[-73.49111520887179,41.981275503591434],[-73.49064120907627,41.98722350474649],[-73.49042220917087,41.98997350528047],[-73.48961620951971,42.00010050724648],[-73.48951820962743,42.00241350769256],[-73.48947220967838,42.003505507903135],[-73.4892242099509,42.0093555090312],[-73.48912721005908,42.01166950947733],[-73.48912321006327,42.01176050949489],[-73.48911921006753,42.01185250951261],[-73.48907821011295,42.012825509700214],[-73.48894521026098,42.01599251031073],[-73.48893221027504,42.01629551036916],[-73.4889082103021,42.01687251048038],[-73.48890121030132,42.01689751048539],[-73.48887321032568,42.017451510592345],[-73.48886021033667,42.017703510641],[-73.48882321037037,42.0184605107871],[-73.48881121038174,42.018713510835916],[-73.4887842104066,42.01927051094339],[-73.48870421048174,42.02094451126639],[-73.48868221050255,42.02140751135572],[-73.48868421050675,42.02146651136694],[-73.48868221050834,42.021503511374085],[-73.48866921051977,42.021762511424086],[-73.48863121055442,42.02254051157422],[-73.48862121056432,42.02275851161626],[-73.48861421056455,42.02279951162433],[-73.48854321062912,42.02425051190433],[-73.488333210824,42.02860551274454],[-73.48826321088899,42.03005751302466],[-73.48807321106399,42.03397451378029],[-73.48761721148665,42.04341651560137],[-73.48750421158974,42.04572851604726],[-73.48748921160374,42.046040516107425],[-73.48747321161973,42.04639051617488],[-73.48731521176532,42.04964651680277],[-73.48341921050313,42.049749516953426],[-73.48272521027832,42.04976851698038],[-73.47732720852335,42.04980951716964],[-73.47173020670819,42.04992751738027],[-73.46783520544503,42.05001051752698],[-73.4676552053866,42.05001351753359],[-73.46711820521249,42.05002551755393],[-73.46694020515477,42.050029517560674],[-73.465767204774,42.05004851760371],[-73.46225020363255,42.050109517733496],[-73.46107820325216,42.05012951777667],[-73.45842120238974,42.05017451787448],[-73.45045019980249,42.050310518168075],[-73.44779419894041,42.05035651826602],[-73.4459621983457,42.05038651833324],[-73.44046719656204,42.050480518535586],[-73.43863619596773,42.05051251860312],[-73.43826619584762,42.05051851861668],[-73.4371581954881,42.05053951865786],[-73.43678919536835,42.050546518671574],[-73.43678019536542,42.05054651867187],[-73.43675319535663,42.050546518672775],[-73.43674519535408,42.05054751867325],[-73.43511519482443,42.05056651873154],[-73.43281319407656,42.0505955188143],[-73.43022819323224,42.050553518892954],[-73.42860019270057,42.050528518942755],[-73.42859419269861,42.05052851894296],[-73.42857719269307,42.050528518943544],[-73.42857219269145,42.0505285189437],[-73.42638819197812,42.05049351901023],[-73.42622919192635,42.05049351901555],[-73.42616919190674,42.05049251901738],[-73.42605519186944,42.05048951902063],[-73.42262519074718,42.05040251911899],[-73.42248419070103,42.05039851912294],[-73.42072819012647,42.0503535191732],[-73.41504018826535,42.05020851933609],[-73.41314418764497,42.050160519390424],[-73.41153618711884,42.050119519436464],[-73.40671418554122,42.049999519575046],[-73.40510718501551,42.04996051962141],[-73.4008551836228,42.04982951973876],[-73.39166718061337,42.049547519992416],[-73.3881011794461,42.04945052009322],[-73.3838501780546,42.049335520213475],[-73.38213217749221,42.04928852026197],[-73.37697817580506,42.0491485204076],[-73.37526117524303,42.04910252045623],[-73.37517517521485,42.04909952045853],[-73.37502317516503,42.04909452046265],[-73.3749471751405,42.04909852046598],[-73.37491817513107,42.049098520466934],[-73.37483317510363,42.04910252047054],[-73.37456217501597,42.04911252048152],[-73.37293417448353,42.04907652052908],[-73.36723717262053,42.04895452069624],[-73.36533817199957,42.04891452075208],[-73.36139817071108,42.04882952086751],[-73.35637216906748,42.04872252101501],[-73.349583166843,42.048506521200515],[-73.34564516555274,42.04838252130833],[-73.34484616529161,42.04836852133234],[-73.34244916450837,42.04832852140474],[-73.34165016424731,42.04831552142894],[-73.34159716422998,42.04831452143053],[-73.34151916420451,42.04831352143294],[-73.34143916417833,42.048311521435224],[-73.3413871641614,42.04831152143694],[-73.3412831641274,42.048309521440046],[-73.34097316402611,42.048304521449445],[-73.3408701639925,42.04830352145268],[-73.3408281639787,42.048301521453716],[-73.34076516395811,42.048300521455616],[-73.34070216393752,42.04829952145753],[-73.34066016392386,42.04829952145893],[-73.34062516391239,42.048298521459905],[-73.3405751638961,42.04829852146158],[-73.34052316387911,42.04829752146313],[-73.34048916386801,42.04829752146426],[-73.34008316373553,42.048293521477056],[-73.33958316357149,42.048274521490114],[-73.33686816268123,42.04817752156221],[-73.33596416238481,42.04814552158626],[-73.32833815989056,42.04798052180924],[-73.32772915969144,42.04796852182725],[-73.32763015965897,42.0479645218298],[-73.3267451593692,42.04794052185474],[-73.32564815900979,42.04790652188483],[-73.32416615852433,42.04786252192587],[-73.31972015706796,42.047730522048944],[-73.31924715691302,42.047716522062046],[-73.31823915658283,42.04768652208992],[-73.31698815617307,42.047649522124566],[-73.31323615494401,42.04753852222847],[-73.31198615453455,42.04750152226307],[-73.31197015452928,42.04750052226342],[-73.31192515451455,42.047499522264715],[-73.31191015450966,42.04749952226521],[-73.31188915450277,42.04749852226573],[-73.31182715448244,42.047496522267416],[-73.31180715447591,42.0474965222681],[-73.31029015397924,42.04745552231081],[-73.30877415348286,42.04741452235351],[-73.30540115237794,42.04731452244683],[-73.30416515197301,42.04727752248096],[-73.29626614938556,42.04704652270001],[-73.29589414926365,42.0470345227101],[-73.29558914916264,42.04700752271511],[-73.29474614888366,42.046935522729406],[-73.29460914883806,42.046919522730924],[-73.29383114857913,42.046828522739425],[-73.29338714843267,42.046798522748475],[-73.28850114683722,42.046740522900144],[-73.2884721468277,42.046739522900914],[-73.288239146751,42.04672652290619],[-73.28820614674014,42.0467245229069],[-73.28812914671487,42.04672152290891],[-73.28785814662574,42.04670752291525],[-73.28754314652251,42.04669752292383],[-73.28731114644654,42.046691522930416],[-73.28715514639542,42.04668652293464],[-73.28699914634427,42.04668152293888],[-73.28659014621034,42.04667052295041],[-73.28618114607644,42.04665952296192],[-73.28615414606759,42.04665852296263],[-73.28607314604099,42.046655522964755],[-73.28604714603253,42.04665552296562],[-73.286021146024,42.04665452296628],[-73.28594414599874,42.04665152296828],[-73.28591914599059,42.046651522969114],[-73.28321114510356,42.04657352304438],[-73.27508614244216,42.046340523270295],[-73.2723791415555,42.04626352334567],[-73.27221914150313,42.04625952335022],[-73.27190714140086,42.046249523358696],[-73.27049414093793,42.0462075233977],[-73.2700231407836,42.046193523410686],[-73.26860514031897,42.04615052344965],[-73.26435313892584,42.04602352356681],[-73.26293613846158,42.045981523605924],[-73.26168013805004,42.04594352364043],[-73.25791413681608,42.04583052374408],[-73.25665913640489,42.04579352377875],[-73.25641913632674,42.045794523786924],[-73.25570013609286,42.045801523812166],[-73.2554611360151,42.045803523820496],[-73.25523713594163,42.04579552382642],[-73.25456513572121,42.045771523844174],[-73.25434213564806,42.045763523850056],[-73.25020213428836,42.04558652395385],[-73.24953313406868,42.045558523970726],[-73.24220813166923,42.04535152417459],[-73.23777913021473,42.04516552428618],[-73.23745413010806,42.0451525242945],[-73.23363712886065,42.04509452441022],[-73.23357612884072,42.045093524412046],[-73.23339512878157,42.04509052441749],[-73.233335128762,42.04509052441948],[-73.23325712873647,42.04508852442169],[-73.23302312865994,42.04508452442871],[-73.23294512863448,42.0450835244311],[-73.23256612850933,42.04505652443853],[-73.23143212813494,42.044975524460696],[-73.2313531281089,42.044970524462364],[-73.2310541280102,42.04494952446827],[-73.23080312792762,42.04493652447412],[-73.23005012767989,42.04489752449165],[-73.22979912759739,42.0448855244977],[-73.22933312744503,42.044877524511655],[-73.22863112721552,42.044865524532675],[-73.22682512662522,42.04483652458709],[-73.22513012607006,42.04479052463459],[-73.22396312568793,42.0447605246676],[-73.22026812447803,42.04466552477212],[-73.21951512423148,42.044646524793464],[-73.21098212143798,42.044438525036895],[-73.20918612084947,42.04438552508635],[-73.2054931196395,42.044279525188585],[-73.203573119011,42.04423452524368],[-73.20292611879923,42.044219525262264],[-73.19781611712568,42.04408552540611],[-73.19589811649756,42.04403552546015],[-73.19575211644975,42.04403152546424],[-73.195533116378,42.044025525470346],[-73.19531411630626,42.04401952547646],[-73.1951681162585,42.04401652548072],[-73.19511911624241,42.04401452548196],[-73.19504611621848,42.04401252548402],[-73.19497311619457,42.04401052548604],[-73.19492511617888,42.044009525487446],[-73.19482711614675,42.04400652549012],[-73.19468111609899,42.044003525494375],[-73.19453411605083,42.0439995254985],[-73.1944371160191,42.043997525501325],[-73.19416411592964,42.043989525508856],[-73.19375511579572,42.0439795255205],[-73.19334811566242,42.043968525531895],[-73.19307611557339,42.043962525539754],[-73.19288911551209,42.04395652554481],[-73.19114011493889,42.04390452559285],[-73.18533511303656,42.04373352575254],[-73.18340011240248,42.04367752580598],[-73.18116311166938,42.04361152586746],[-73.17780911057025,42.04351352595983],[-73.17445510947107,42.04341452605202],[-73.17221910873833,42.04334952611364],[-73.17175010858443,42.04333252612592],[-73.17034210812253,42.04328352616317],[-73.16987410796904,42.04326752617562],[-73.16928910777719,42.043248526191356],[-73.16901510768734,42.04323952619872],[-73.16644010684318,42.04315952626867],[-73.16558210656194,42.04313352629211],[-73.16325410579879,42.04306152635541],[-73.15864110428654,42.04291952648094],[-73.15627110351102,42.04287052655001],[-73.15394310274932,42.042823526618065],[-73.15019510152288,42.042746526727356],[-73.14817410086162,42.04270552678638],[-73.13895409783952,42.042431527038914],[-73.13594109685192,42.04234252712151],[-73.13572909678157,42.04232152712449],[-73.13520909661138,42.042310527139584],[-73.13512309658321,42.04230852714205],[-73.13486509649893,42.042305527150006],[-73.13477909647084,42.04230452715265],[-73.1339400961957,42.042277527175244],[-73.13259409575438,42.042235527211695],[-73.13142509537117,42.04220052724366],[-73.13058709509654,42.042176527266754],[-73.13036609502402,42.04216852727254],[-73.12970609480747,42.04214552728994],[-73.12948609473534,42.042138527295876],[-73.12903809458832,42.04212252730761],[-73.12836809436857,42.04210052732555],[-73.12769709414844,42.04207752734333],[-73.12725009400181,42.042062527355235],[-73.1257910935243,42.04203152739753],[-73.12455309311913,42.042005527433446],[-73.12141709208943,42.04188352751372],[-73.12022709169872,42.041837527544246],[-73.11996009161172,42.04183852755326],[-73.11973409153822,42.04184152756129],[-73.1177600908924,42.041804527619455],[-73.11675509056296,42.0417745276469],[-73.10714208741173,42.04148952790984],[-73.10393808636141,42.04139452799744],[-73.10320108611982,42.04137252801756],[-73.10209608575755,42.04133952804773],[-73.10099008539497,42.04130652807791],[-73.10025408515368,42.041284528098004],[-73.09634808387318,42.04116852820472],[-73.09551508360002,42.04114252822723],[-73.09345808292564,42.04108052828324],[-73.0870560808267,42.0408885284577],[-73.0812980789381,42.04070252861201],[-73.07656007738402,42.04054952873897],[-73.07644507734634,42.04054652874217],[-73.07440907667701,42.04045552879188],[-73.06795707455602,42.0401685289496],[-73.0676640744597,42.04015552895677],[-73.06580507385188,42.04012852901287],[-73.06383407320735,42.04009852907207],[-73.05940407175883,42.04003352920561],[-73.05792207127323,42.039994529246954],[-73.05595207062781,42.039944529302275],[-73.05579007057467,42.03993952930664],[-73.05530707041646,42.039927529320266],[-73.05514607036373,42.039923529324795],[-73.05333006976882,42.039878529376],[-73.05325506974384,42.03986952937674],[-73.05298906965527,42.03983852937956],[-73.05272406956712,42.03980952938273],[-73.05203806933872,42.039730529390205],[-73.05000806867407,42.03968652944863],[-73.04896306833203,42.039665529479024],[-73.04887006830158,42.03966352948169],[-73.04827806810776,42.03965052949871],[-73.04622606743594,42.03960652955784],[-73.04554206721203,42.039592529577675],[-73.04539806716484,42.03958852958166],[-73.04428806679994,42.0395395296088],[-73.04085606567591,42.039459529706484],[-73.03689106437727,42.03936652981917],[-73.03684406436193,42.03936652982071],[-73.03671306431903,42.03936352982445],[-73.0361430641323,42.03934952984053],[-73.03295806308905,42.039273529930774],[-73.03006406214115,42.03920553001298],[-73.02470706038983,42.0391355301758],[-73.02340505996418,42.03911853021537],[-73.02022105892325,42.03907753031223],[-73.01834505830897,42.03903653036605],[-73.01271905646666,42.03891353052746],[-73.01133405601314,42.038883530567254],[-73.01107905592986,42.038881530575246],[-73.01084405585308,42.038879530582584],[-73.01042405571587,42.03887553059563],[-73.00916505530462,42.03886553063511],[-73.00874605516776,42.03886253064831],[-73.0085530551047,42.03886053065426],[-73.00010505233902,42.038689530899106],[-72.99955005215634,42.03866153091196],[-72.99647905115309,42.03863553100788],[-72.99623705107405,42.038633531015435],[-72.98416604713042,42.0385305313921],[-72.98415604712716,42.03853053139243],[-72.98412804711802,42.038530531393334],[-72.98411904711509,42.03853053139365],[-72.97900804544523,42.038486531553],[-72.97779404504861,42.038476531590916],[-72.97759504498363,42.03847553159726],[-72.97740404492122,42.03847353160314],[-72.9747320440484,42.038453531687],[-72.96639304132424,42.03838953194834],[-72.96628304128829,42.03838853195174],[-72.94871603557247,42.03864653257719],[-72.9443220341428,42.038712532733825],[-72.94351303387573,42.03865953275019],[-72.94281803364329,42.038563532754566],[-72.94005403271949,42.03818953277342],[-72.93977603262866,42.03818753278215],[-72.93229503018452,42.038130533016265],[-72.93192003006197,42.03812753302796],[-72.92719602851811,42.03808453317442],[-72.92677202837955,42.03808053318753],[-72.9254190279375,42.03807053322991],[-72.92541802793717,42.03807053322994],[-72.92411102751014,42.0380605332708],[-72.92403902748663,42.03806053327317],[-72.92087102645155,42.03803653337228],[-72.91627902495124,42.038002533516035],[-72.90250302045013,42.03790053394714],[-72.89791201895001,42.037866534090746],[-72.89627001841345,42.03785353414192],[-72.89134401680379,42.03781653429587],[-72.89006501638589,42.03780753433593],[-72.8897030162676,42.037804534347195],[-72.88276601400084,42.037753534564104],[-72.88269901397891,42.0377525345661],[-72.8747710113863,42.03766053480744],[-72.87454501131359,42.03767853481827],[-72.87442901127585,42.037680534822435],[-72.8695640096897,42.037706534986285],[-72.86535700831725,42.03771553512536],[-72.8636200077505,42.03771753518245],[-72.86340900768145,42.03771453518876],[-72.86277800747499,42.03770553520763],[-72.86256800740628,42.03770253521392],[-72.86219600728487,42.03770253522606],[-72.86185000717194,42.037702535237344],[-72.86119400695576,42.03766653525186],[-72.86100900689479,42.03765653525599],[-72.85304900427148,42.03722353543269],[-72.84745300242723,42.03691953555694],[-72.84714300232505,42.03690253556378],[-72.84635300206652,42.036890535587254],[-72.84585200190253,42.03688253560206],[-72.84434900141068,42.03686053564686],[-72.84384900124708,42.03685353566182],[-72.84223800071987,42.036829535709764],[-72.83740699913888,42.036757535853454],[-72.83579699861197,42.03673353590133],[-72.83561599855271,42.036730535906656],[-72.83507299837503,42.03672253592283],[-72.83489199831583,42.036720535928346],[-72.83337599781967,42.03669753597335],[-72.82882799633133,42.036631536108914],[-72.82731299583554,42.03660953615405],[-72.82695299571768,42.036603536164634],[-72.82684199568139,42.03660253616806],[-72.82587299536509,42.03660253619964],[-72.8255129952476,42.03660253621136],[-72.82464799496526,42.03660253623954],[-72.82430399485287,42.036600536250376],[-72.82422699482773,42.036600536252884],[-72.8239759947458,42.03660053626107],[-72.81702899247435,42.03653453647469],[-72.8168929924299,42.036533536478935],[-72.81675799238577,42.036532536483136],[-72.81662299234158,42.036530536487156],[-72.81648899229779,42.03652953649134],[-72.81576099205981,42.03652353651388],[-72.81354199133426,42.03650253658211],[-72.81566799051467,42.01065553155384],[-72.81600699038412,42.006533530751625],[-72.8161539903276,42.00474753040403],[-72.81659499015811,41.999389529361125],[-72.81674199010163,41.99760352901344],[-72.81599098986126,41.99768352905324],[-72.8137379891403,41.99792652917319],[-72.81298798890036,41.99800852921335],[-72.8086069874935,41.998397529430534],[-72.80854198747264,41.998403529433794],[-72.79492398311515,41.999883530160744],[-72.79482998308505,41.99989353016573],[-72.79454898299517,41.99992453018082],[-72.79445598296546,41.99993553018595],[-72.79384098276874,42.00000353021899],[-72.79051198170464,42.00038553040054],[-72.78972998145474,42.000476530443414],[-72.78490397991224,42.001032530706986],[-72.7799209783195,42.001606530979075],[-72.77868297792375,42.00174853104656],[-72.77473997666343,42.00220353126199],[-72.77109897549812,42.00259853145607],[-72.77052297531044,42.00260353147573],[-72.77025797522394,42.00260353148434],[-72.77025697522362,42.00260353148437],[-72.77023897521774,42.002603531484944],[-72.76673897409874,42.00300353167539],[-72.76668397410343,42.00339153175167],[-72.76625497413889,42.00639853234292],[-72.7661399741484,42.0072045325014],[-72.76613997418792,42.00788153263135],[-72.76609797417431,42.007883532633116],[-72.76587497410755,42.00798653266012],[-72.76569097405583,42.008129532693545],[-72.765522974008,42.00824953272204],[-72.76523897392028,42.00833453274759],[-72.76473297376077,42.00843153278262],[-72.76468197374423,42.008433532784665],[-72.76350597336324,42.00848253283226],[-72.76303897321378,42.0085335328572],[-72.7625559730605,42.008608532887266],[-72.7622029729533,42.00874553292505],[-72.76177397282756,42.008990532986],[-72.76159697277812,42.0091335330192],[-72.76147397274866,42.00931653305833],[-72.76137497272866,42.00952753310204],[-72.76132097272502,42.00976753314987],[-72.7613669727471,42.00988853317161],[-72.76152797280562,42.00999053318595],[-72.7618189729073,42.01010553319858],[-72.76194897295674,42.0102255332174],[-72.76196097296179,42.01024453322066],[-72.76206397300462,42.01040253324765],[-72.76207897301688,42.01052853327137],[-72.76206397301833,42.010637533292766],[-72.7621399730541,42.0108255333264],[-72.7624159731749,42.011351533418406],[-72.76265697326986,42.01163053346414],[-72.76276797331357,42.01175853348511],[-72.76286797335054,42.011832533496055],[-72.76295497338516,42.01193953351379],[-72.76307397343248,42.01208453353775],[-72.76315097346725,42.01224953356692],[-72.76324297351765,42.012598533630914],[-72.7632199735175,42.012724533655856],[-72.7631119735036,42.013090533729624],[-72.76307997349602,42.01313953374007],[-72.76284897344198,42.013505533817835],[-72.76278997342816,42.013598533837595],[-72.76268997340152,42.01370153386059],[-72.76237497331405,42.01396453392131],[-72.76204497321434,42.014101533958325],[-72.76192997317848,42.01413053396763],[-72.76155497306534,42.01428953401032],[-72.76144397303509,42.014391534033514],[-72.76097897290839,42.01482153413112],[-72.76087897288876,42.01504453417719],[-72.7607949728837,42.01542753425343],[-72.76066397285162,42.015610534292804],[-72.76057997282781,42.01567253430744],[-72.75985997264557,42.0165765345043],[-72.75986697264898,42.01659553450776],[-72.75987397265213,42.0166105345104],[-72.75974297262367,42.016855534561685],[-72.75971997262683,42.017038534597546],[-72.75975797264661,42.0171645346205],[-72.75988097270047,42.0173995346616],[-72.76009597277633,42.01749653467324],[-72.76050997290413,42.01737053463562],[-72.76058497292702,42.017343534628004],[-72.76065497294847,42.01731953462112],[-72.76079197299154,42.01729153461132],[-72.76099897305977,42.0173025346067],[-72.76153597324644,42.01749753462669],[-72.76193397338903,42.01771453465542],[-72.76230997353582,42.01812653472229],[-72.76238597357197,42.01832053475703],[-72.7626009737009,42.01932653494314],[-72.76280797379322,42.0197505350178],[-72.76296097384684,42.019813535024916],[-72.76365097407951,42.01994053502688],[-72.76407997422417,42.020019535028126],[-72.76443997434401,42.02005953502411],[-72.76466297441384,42.02000853500708],[-72.76487797447767,42.019899534979174],[-72.7652919745964,42.01961853491181],[-72.76553897467917,42.01965553491088],[-72.76554097469106,42.019847534947665],[-72.76556997470408,42.019908534958425],[-72.76554397469938,42.01997353497175],[-72.76548297468787,42.02011753500137],[-72.76539097466217,42.02019153501856],[-72.76527597463733,42.02040853506395],[-72.76515297460283,42.02050553508655],[-72.76481597449983,42.020625535120516],[-72.76460897443756,42.02071653514472],[-72.76452397441918,42.02087653517818],[-72.7644469744234,42.0213795352772],[-72.76447797444257,42.021534535305946],[-72.76453097446453,42.02161453531957],[-72.76462297449892,42.0216885353308],[-72.7647609745463,42.02172853533398],[-72.7648609745798,42.02174353533361],[-72.76498397462113,42.021763535333456],[-72.76515997468292,42.02183753534195],[-72.7652519747203,42.02196353536315],[-72.76525897473194,42.02212353539362],[-72.76522097472922,42.02228953542671],[-72.76513597470884,42.02241553545365],[-72.76503697467915,42.02246053546551],[-72.7648529746154,42.0223975354594],[-72.76466897454436,42.02220953542929],[-72.764377974441,42.02206653541129],[-72.76408597434265,42.022014535410804],[-72.76394097429129,42.02194553540227],[-72.76387897426707,42.021877535391226],[-72.76377197421444,42.02157453533656],[-72.76374897419589,42.02138553530103],[-72.7636649741558,42.021168535262106],[-72.76354297411528,42.02115653526377],[-72.76340497407325,42.02120853527823],[-72.76285197391172,42.02153353535856],[-72.76233797376462,42.02188753544319],[-72.76230797375713,42.021927535451844],[-72.76182397362088,42.022299535538934],[-72.7616939735894,42.02248753557925],[-72.76167997358543,42.02249753558162],[-72.76155597355108,42.02260253560579],[-72.76131797348039,42.02272253563656],[-72.76127797346756,42.022726535638625],[-72.76109897341036,42.02274753564848],[-72.76098097337268,42.022761535654986],[-72.76073497329027,42.02272553565606],[-72.76062797325446,42.02271053565666],[-72.75995297301938,42.02245853563021],[-72.7597049729307,42.02232653561293],[-72.75958597288819,42.0222635356047],[-72.75940897282075,42.022098535578785],[-72.75920297272981,42.021692535507555],[-72.75917197270667,42.02146953546576],[-72.75917997269626,42.021246535422705],[-72.75911097266439,42.02108653539423],[-72.75893497260023,42.02097153537788],[-72.75872797252761,42.02088553536811],[-72.75851297245545,42.02085153536856],[-72.75805297230661,42.020874535387904],[-72.75791397226214,42.020889535395305],[-72.7576949721921,42.020914535407194],[-72.75750397213301,42.02097053542415],[-72.75737097209193,42.021010535436154],[-72.75707197200133,42.021130535468885],[-72.75687197194672,42.0213135355105],[-72.75684897194189,42.02135953552007],[-72.75672597191675,42.021616535573386],[-72.75658097187713,42.021748535603436],[-72.75642697183781,42.021936535644514],[-72.75638897183413,42.02208553567433],[-72.75641897185191,42.022222535699655],[-72.75660297193068,42.02254253575511],[-72.75667197196621,42.022765535795656],[-72.75664097196308,42.0228855358197],[-72.75656397194666,42.02303453585078],[-72.75655197194374,42.023051535854435],[-72.75620397186184,42.02359453596993],[-72.75614397184768,42.02368753598973],[-72.75597297180745,42.02395453604652],[-72.75596597180592,42.02396753604923],[-72.75591897179648,42.02406853607014],[-72.75588097178874,42.024148536086734],[-72.75582697178706,42.02442153614086],[-72.75578797178612,42.024623536180904],[-72.75570397176868,42.02479453621645],[-72.75537397168061,42.025131536291845],[-72.75519097162959,42.02528053632637],[-72.75506697159511,42.02538353635017],[-72.75489597154606,42.02549953637796],[-72.75479297151647,42.02556853639455],[-72.75471397149389,42.02562353640768],[-72.75452997143977,42.02572553643323],[-72.75449097143009,42.02577753644447],[-72.75446797142455,42.02581153645174],[-72.75442997141647,42.025885536467165],[-72.75431497139697,42.0261945365302],[-72.75420797137214,42.02636753656687],[-72.7539849713206,42.02673153664397],[-72.75396897132238,42.02685153666751],[-72.75389997130954,42.0270175367016],[-72.75377697128071,42.027211536742826],[-72.75356997122282,42.02737753678141],[-72.75326197113482,42.02759253683266],[-72.75293297104092,42.02782353688767],[-72.75284397101747,42.02791953690898],[-72.75269897097913,42.02807353694324],[-72.75253397093566,42.028251536982744],[-72.75232397088654,42.02858453705344],[-72.75226497087287,42.0286805370738],[-72.75221397086119,42.028765537091765],[-72.75212597084092,42.028910537122435],[-72.75202697081818,42.02907453715713],[-72.75191897080033,42.02937253721781],[-72.75186197079105,42.029532537250354],[-72.75178097077774,42.029757537296156],[-72.75176597077537,42.0298005373049],[-72.75185697083714,42.0303495374073],[-72.75192897086595,42.0304405374224],[-72.75195697087713,42.03047553742822],[-72.7520409709149,42.03065253745944],[-72.752277971008,42.03092153750336],[-72.75245497107313,42.03104753752181],[-72.75252997110195,42.03112153753355],[-72.7528379712202,42.03142453758171],[-72.7530229712892,42.03157153760391],[-72.75323597136855,42.031739537629235],[-72.75370297154039,42.03207153767777],[-72.75414797170035,42.03232253771149],[-72.75416797170735,42.032330537712355],[-72.75479497192782,42.032600537743804],[-72.75512097204243,42.032740537760084],[-72.75514697205146,42.03274953776097],[-72.75587997230559,42.033003537785895],[-72.75623897242819,42.03309553779189],[-72.75660997255494,42.033191537798274],[-72.7570839727168,42.03331353780628],[-72.75717597274918,42.03335353781096],[-72.75717597275188,42.03339953781978],[-72.7570759727247,42.03349353784108],[-72.75696097269365,42.0336045378661],[-72.75685297268579,42.034073537959586],[-72.75679197267253,42.03418753798344],[-72.75659197262125,42.03442753803599],[-72.7562239725198,42.0347475381093],[-72.75616197250324,42.03481053812342],[-72.75600897247163,42.035124538188626],[-72.7559399724615,42.03533653823154],[-72.75594797246913,42.035422538247786],[-72.75597797249594,42.03571353830263],[-72.75599497252959,42.036194538394376],[-72.75585097248305,42.03620253840056],[-72.75583897247918,42.03620353840116],[-72.75541897234328,42.03622453841882],[-72.75527497229675,42.03623253842503],[-72.75503997222071,42.03624453843496],[-72.7543349719927,42.036281538464955],[-72.75410097191705,42.03629453847505],[-72.75393897186468,42.03630353848203],[-72.7516059710977,42.036213538540515],[-72.7513409710106,42.036203538547205],[-72.74784396987128,42.03624553866878],[-72.74555996912724,42.03627453874847],[-72.74509396897544,42.03628053876476],[-72.74149896780413,42.036323538889675],[-72.724254962186,42.0365365394899],[-72.72217996150994,42.036562539562155],[-72.7218979614181,42.036566539572085],[-72.71916496052764,42.036600539667205],[-72.71893796045369,42.036603539675134],[-72.71591195946019,42.03651153975556],[-72.71589295945394,42.03651053975599],[-72.71563795937027,42.036503539762904],[-72.71552395933348,42.036511539768135],[-72.71436495896023,42.03660053982278],[-72.71433795895159,42.03660353982423],[-72.71413795890375,42.036903539888286],[-72.71339695866179,42.03690353991229],[-72.71231595830879,42.03690353994732],[-72.71190395817426,42.036903539960676],[-72.71100895788199,42.03690353998967],[-72.70887595718544,42.03690354005878],[-72.70398395558792,42.036903540217274],[-72.70247895509644,42.036903540266024],[-72.70034695440022,42.03690354033507],[-72.7002449543669,42.03690354033838],[-72.70003695429897,42.036903540345115],[-72.69994095426645,42.036883540344384],[-72.69984095423268,42.036864540344],[-72.69953695412984,42.03680354034211],[-72.69945295410241,42.03680354034485],[-72.69661795317688,42.03680854043761],[-72.69638895310216,42.03680954044521],[-72.69629195307013,42.03680354044721],[-72.68775595025323,42.03630154062723],[-72.6862409497531,42.036209540658604],[-72.68613694971879,42.03620354066082],[-72.68602094968038,42.036194540662855],[-72.68288294864129,42.035949540717375],[-72.68288194864097,42.03594954071741],[-72.67843494716847,42.0356035407949],[-72.67833194713425,42.035593540796306],[-72.67554794621006,42.03533654083705],[-72.67303494537578,42.035103540873614],[-72.67301594536944,42.035101540873846],[-72.66328894214115,42.03421754101872],[-72.66320494211325,42.0342095410199],[-72.6574839402213,42.033806541127475],[-72.65743594020543,42.03380354112844],[-72.64718593679899,42.032795541266154],[-72.64345693556004,42.032434541317286],[-72.64314893545794,42.032408541322255],[-72.64299093540562,42.03239654132505],[-72.6416509349626,42.03230454135066],[-72.64163393495699,42.03230354135102],[-72.63982493436029,42.032203541390246],[-72.63925493417186,42.03216454140116],[-72.63754493360669,42.03205054143449],[-72.63697593341863,42.03201254144556],[-72.63683393337173,42.03200354144842],[-72.63319993217456,42.03182854153213],[-72.62187492844366,42.03128354179297],[-72.61813492721154,42.03110354187906],[-72.6180999272001,42.0311035418802],[-72.6178629271227,42.03110354188784],[-72.61715192689043,42.031103541910774],[-72.6169479268238,42.03110354191735],[-72.61691492681302,42.03110354191842],[-72.61683392678655,42.03110354192103],[-72.61675292675997,42.03110154192325],[-72.61626792660104,42.03109254193716],[-72.61610692654833,42.03109054194198],[-72.61523292626195,42.03107554196727],[-72.61261092540298,42.03103254204358],[-72.61173792511697,42.03101854206905],[-72.61159092506877,42.03101554207319],[-72.61115292492529,42.03100854208598],[-72.6110069248775,42.0310065420903],[-72.6108339248208,42.03100354209531],[-72.61051892471663,42.03098154210125],[-72.60905592423286,42.03088054212902],[-72.60856892407185,42.0308475421384],[-72.60844092402952,42.03083854214078],[-72.6082509239667,42.03082554214443],[-72.60805992390348,42.030811542147894],[-72.60793392386188,42.030803542150416],[-72.60777492375685,42.02988854197987],[-72.6075389236002,42.02851654172405],[-72.60730192344315,42.027143541468085],[-72.60714492333881,42.026228541297456],[-72.60713592333303,42.02617954128836],[-72.60712392332488,42.026106541274714],[-72.60711092331634,42.02603254126092],[-72.6071029233109,42.025983541251776],[-72.60706892328837,42.02578654121504],[-72.60701892325505,42.025493541160394],[-72.60696692322095,42.02519854110542],[-72.60693392319887,42.02500354106905],[-72.60641692302998,42.02500354108572],[-72.60486692252368,42.025003541135675],[-72.60435092235512,42.0250035411523],[-72.60433392234957,42.02500354115284],[-72.60404592225538,42.02500154116175],[-72.60313292195679,42.024995541190016],[-72.60285492186593,42.024994541198794],[-72.60282892185742,42.02499454119963],[-72.60244792173279,42.02499154121132],[-72.60130592135934,42.02498454124678],[-72.60095192124365,42.024983541257996],[-72.60092592123516,42.02498354125883],[-72.60040692106584,42.024987541276325],[-72.59885192055853,42.02499854132854],[-72.5983339203896,42.025003541346194],[-72.59830792038105,42.02500254134685],[-72.59822892035507,42.02499954134881],[-72.59820392034685,42.02499854134942],[-72.59662191982665,42.02493954138906],[-72.59187891826706,42.02476354150806],[-72.59029791774724,42.024705541547824],[-72.59023291772588,42.02470354154956],[-72.59020891771804,42.02470354155032],[-72.58994391763146,42.02470354155885],[-72.58985591760273,42.0247035415617],[-72.58984991760076,42.0247035415619],[-72.58983491759587,42.02470354156237],[-72.58982991759423,42.02470354156253],[-72.58959491751746,42.0247035415701],[-72.5893109174247,42.024703541579235],[-72.58910291735675,42.02470354158595],[-72.58775591691672,42.02470354162933],[-72.5872379167475,42.02470354164601],[-72.58659191653645,42.02470354166681],[-72.58465591590401,42.024703541729146],[-72.5840109156933,42.024703541749915],[-72.58393291566782,42.02470354175242],[-72.58387391564855,42.02470354175432],[-72.5834639155146,42.02470354176752],[-72.58282391530553,42.02470354178813],[-72.58279091529477,42.02470354178918],[-72.58233291514513,42.02470354180394],[-72.58163291494542,42.025203541922465],[-72.581549914921,42.025250541934184],[-72.58085491471661,42.025641542031636],[-72.57951891432376,42.026394542219236],[-72.57612591332592,42.02830554269542],[-72.57590691326267,42.02844854272992],[-72.5750809130232,42.02897354285733],[-72.57426891278787,42.029490542982735],[-72.57417091275948,42.02955354299799],[-72.57323591248846,42.03014854314233],[-72.56812891085028,42.030672543407285],[-72.56177690881707,42.031400543751424],[-72.5613869086926,42.03145154377376],[-72.56135690868292,42.03145354377513],[-72.56099590856613,42.03147354379056],[-72.55995190822779,42.03152154383337],[-72.55943490806195,42.03157454386018],[-72.55323090607126,42.032203544180476],[-72.55301090600042,42.032221544190996],[-72.54124790221377,42.033205544758076],[-72.54105890215287,42.03322054476703],[-72.54087090209232,42.033235544775955],[-72.54087090209238,42.03323654477613],[-72.53930390158797,42.03336854485185],[-72.53665090073379,42.03358854497934],[-72.53594090050531,42.03364954501386],[-72.53157589910008,42.03401454522417],[-72.5308898988792,42.03407154525716],[-72.5288318982167,42.034244545356486],[-72.52814689799618,42.034302545389615],[-72.52813089799102,42.03430354539033],[-72.52743989776522,42.03430354541252],[-72.52532089707276,42.034303545480576],[-72.52461489684207,42.03430354550324],[-72.52370389654438,42.034303545532495],[-72.52097389565223,42.034303545620155],[-72.52023289541009,42.03430354564394],[-72.52006389535521,42.03430954565052],[-72.51947889516518,42.03432954567314],[-72.51772389459515,42.034389545741],[-72.51733089446752,42.0344035457563],[-72.51713989440476,42.03439754576128],[-72.51554989388227,42.03434754580272],[-72.51078189231548,42.03419854592712],[-72.50919289179339,42.03414954596871],[-72.49958888864884,42.034047546257206],[-72.49284388644213,42.03400754646582],[-72.49274588641005,42.034006546468774],[-72.49207088618904,42.03399954648907],[-72.49203888617859,42.0339995464901],[-72.48469488377513,42.03394354671474],[-72.47985688219177,42.033906546862674],[-72.46958987884166,42.03400354721018],[-72.46957787883774,42.034003547210574],[-72.46012187574905,42.03403954752026],[-72.45973387562256,42.03404554753383],[-72.45972887562094,42.034045547533985],[-72.45818587511808,42.034071547588375],[-72.45668087462248,42.034007547624256],[-72.45637687452309,42.03400754763398],[-72.45635387451551,42.034006547634526],[-72.45608887442803,42.03399154764013],[-72.45583887434603,42.03398654764716],[-72.4494478722499,42.03386354782805],[-72.4445998706606,42.033783547967765],[-72.44226386989423,42.03373554803326],[-72.44174286972392,42.03373554804993],[-72.44165386969485,42.03373554805277],[-72.44144786962744,42.033734548059165],[-72.43786486844887,42.03360754814934],[-72.43639286796679,42.033591548193336],[-72.43576886776373,42.03360754821636],[-72.43550486767725,42.03360454822423],[-72.43544886765896,42.03360454822602],[-72.4341468672326,42.033591548265164],[-72.43274386677321,42.0335785483075],[-72.42813186526303,42.03353454844647],[-72.41880986221035,42.03344354872686],[-72.41878786220317,42.03344354872756],[-72.41687386157585,42.03341554878333],[-72.41635086140435,42.0334065487983],[-72.415803861225,42.03339754881405],[-72.41553286113619,42.033393548821934],[-72.39743185520135,42.03309554934257],[-72.39307985377575,42.03304754947222],[-72.39303385376058,42.03304554947331],[-72.39203985343296,42.03299954949618],[-72.39192285339466,42.03299854949972],[-72.3895758526264,42.03298254957152],[-72.38925785252174,42.03297054957935],[-72.38925485252075,42.03297054957945],[-72.38599185144633,42.032838549658166],[-72.38595685143495,42.032839549659485],[-72.37452684769335,42.03276155000894],[-72.36774184547278,42.03272555021827],[-72.36771884546525,42.03272555021901],[-72.36707084525285,42.03271655023793],[-72.36699184522686,42.032713550239876],[-72.36573084481248,42.03267755027313],[-72.36559684476853,42.032675550277006],[-72.36557384476103,42.03267555027774],[-72.3550308413044,42.03251455058265],[-72.35367084085799,42.03248455062019],[-72.35356084082191,42.0324825506233],[-72.34840883913331,42.03241455077428],[-72.3389268360161,42.03212455102034],[-72.33888183600138,42.03212455102177],[-72.33885683599324,42.032125551022766],[-72.33725483546984,42.03213355107526],[-72.33371083431209,42.03215455119205],[-72.3248018313914,42.032027551451],[-72.32196083046003,42.03198755153364],[-72.32182183041463,42.031988551538255],[-72.32125783023065,42.03199655155772],[-72.32124983022803,42.03199655155798],[-72.32104383016085,42.03199955156511],[-72.31714882888224,42.03191555167277],[-72.31708582886162,42.03191555167477],[-72.30846382603858,42.03185755193764],[-72.30572482514177,42.0318395520212],[-72.29992882324406,42.03180255219819],[-72.2999218232417,42.03180155219821],[-72.29963882314904,42.03179955220683],[-72.29155982050544,42.031777552459126],[-72.2915438205002,42.03177755245964],[-72.28743481915565,42.031766552587946],[-72.28028281681527,42.031746552811065],[-72.27984581667228,42.03174555282474],[-72.27894381637714,42.03174355285297],[-72.27163481398537,42.03172455308117],[-72.27157781396673,42.031724553082974],[-72.27067581366964,42.03168855310466],[-72.27059981364461,42.031685553106485],[-72.26212981087292,42.03166455337101],[-72.24952380674763,42.03163455376473],[-72.24897180655927,42.03149755375587],[-72.24881380650535,42.03145855375339],[-72.24722780598563,42.03144255380055],[-72.24129280404074,42.03138255397699],[-72.24128680403878,42.03138255397718],[-72.24098180393894,42.03138155398664],[-72.23978580354706,42.03137055402241],[-72.23947680344583,42.03136755403161],[-72.23226880108459,42.03131055424883],[-72.22858279987715,42.03128255436014],[-72.22830779978707,42.03128055436846],[-72.22830679978676,42.03128055436849],[-72.22688679932158,42.03126955441131],[-72.22687579931792,42.031268554411454],[-72.22677979928645,42.0312675544143],[-72.2125787946323,42.03112255483565],[-72.21257079462968,42.0311225548359],[-72.21240179457433,42.03112155484106],[-72.21088979407914,42.03111255488714],[-72.20508179217697,42.03107755506403],[-72.20461179202303,42.031074555078305],[-72.19892079015887,42.031035555250675],[-72.19889579015067,42.03103555525146],[-72.19882779012838,42.03103455525343],[-72.19876579010808,42.03103455525539],[-72.19519278893765,42.03100955536348],[-72.18802278658809,42.03094555557767],[-72.18668678615033,42.030934555617755],[-72.18464878548265,42.03091955567921],[-72.17850378346964,42.03087755586515],[-72.17548978248225,42.03085655595626],[-72.1754357824645,42.030855555957785],[-72.17543378246386,42.03085555595784],[-72.17406478201558,42.0308495559999],[-72.17100378101291,42.03083055609285],[-72.17059878088027,42.03082855610524],[-72.16875678027459,42.03077655615337],[-72.16839678015623,42.0307665561628],[-72.16833378013554,42.0307655561646],[-72.16610177940339,42.030733556228874],[-72.16562377924664,42.0307275562428],[-72.16295777837216,42.03069055631978],[-72.15783077669091,42.03062755646938],[-72.15112777449363,42.03055955666765],[-72.1500807741505,42.03055055669893],[-72.15007177414756,42.03055055669921],[-72.14866477368643,42.03053855674125],[-72.14837477359187,42.03054455675155],[-72.14742477328203,42.030562556784965],[-72.14731177324522,42.03056555678909],[-72.14652077298744,42.03058455681768],[-72.14572877272941,42.03060455684649],[-72.14502877250143,42.0306235568722],[-72.14480077242715,42.03062955688055],[-72.14479877242648,42.03062955688061],[-72.14400877216694,42.03061155690205],[-72.143238771914,42.03059455692304],[-72.14319177189857,42.03059355692433],[-72.14310477187016,42.03059455692726],[-72.14229677160353,42.030555556945224],[-72.14197777149829,42.0305405569524],[-72.14010777088119,42.03044955699381],[-72.13681776979618,42.03030255706919],[-72.13681376979484,42.03030155706914],[-72.13621376959684,42.030272557082455],[-72.13621176959613,42.03027155708232],[-72.13571576943284,42.03025455709467],[-72.1356877694236,42.03025355709537],[-72.13507476922148,42.030226557109486],[-72.13503176920723,42.03022355711026],[-72.13111576791698,42.030069557203994],[-72.12617676628658,42.02982155731181],[-72.12612776627037,42.02981855731279],[-72.12452076574162,42.02976855735377],[-72.12446776572445,42.02977155735601],[-72.12400976557531,42.02978455737293],[-72.12258876510798,42.02974455740997],[-72.12237376503728,42.02973855741559],[-72.1198597642105,42.029667557481055],[-72.11861676380173,42.02963255751347],[-72.11856776378563,42.02963155751482],[-72.11184376156679,42.02930955766446],[-72.10949876079373,42.0292105577192],[-72.1063897597687,42.02907855779162],[-72.10369675887766,42.028907557843425],[-72.10360375884687,42.0289015578452],[-72.10339575877806,42.028888557849235],[-72.10309475867848,42.02886955785505],[-72.10277875857393,42.028849557861136],[-72.10274075856138,42.02884755786194],[-72.10246175846905,42.028829557867255],[-72.10216675837141,42.02881055787289]]] \ No newline at end of file diff --git a/tests/inputfiles/rand05cells.txt b/tests/inputfiles/rand05cells.txt index d50a998aa..b065a55ed 100644 --- a/tests/inputfiles/rand05cells.txt +++ b/tests/inputfiles/rand05cells.txt @@ -1,11322 +1,11924 @@ -850dab63fffffff -{ - 67.224749856 -168.523006585 - 67.140938355 -168.626914333 - 67.067252558 -168.494913285 - 67.077062918 -168.259695931 - 67.160561948 -168.154801171 - 67.234563187 -168.286102782 +85021ac7fffffff +{ + 76.003164048 -115.603602480 + 75.917380679 -115.731816282 + 75.850408909 -115.507336067 + 75.868805735 -115.154930413 + 75.954365536 -115.023629958 + 76.021753513 -115.247800854 +} +85d0408ffffffff +{ + -45.490192213 22.495073907 + -45.576243089 22.496021036 + -45.615063034 22.592074672 + -45.567828934 22.686922784 + -45.481879343 22.685716045 + -45.443062505 22.589920451 +} +85d56c83fffffff +{ + -54.198269512 -175.588965582 + -54.133713917 -175.659161794 + -54.146039592 -175.791773848 + -54.223001991 -175.854539301 + -54.287644523 -175.784333009 + -54.275237628 -175.651370679 +} +8524b54ffffffff +{ + 38.818582861 94.184963848 + 38.729497472 94.205574011 + 38.702682732 94.313191516 + 38.764812575 94.400389382 + 38.853886422 94.380092380 + 38.880842184 94.272284203 +} +853534cffffffff +{ + 46.438729529 -27.531420353 + 46.361681790 -27.609804977 + 46.277663241 -27.550532990 + 46.270620284 -27.413072870 + 46.347587653 -27.334562241 + 46.431678304 -27.393636969 +} +852271cffffffff +{ + 46.390760443 -175.442652314 + 46.480302517 -175.418132053 + 46.542985921 -175.518711653 + 46.516038236 -175.643857743 + 46.426417174 -175.668116883 + 46.363822659 -175.567491615 +} +852d619bfffffff +{ + 49.287982308 37.586279989 + 49.232861768 37.687499138 + 49.266552098 37.804545630 + 49.355521795 37.820570083 + 49.410742429 37.719115796 + 49.376893051 37.601872245 +} +859360d3fffffff +{ + -4.698948769 -96.767462544 + -4.773541680 -96.825580166 + -4.860737708 -96.792184724 + -4.873359081 -96.700598157 + -4.798717359 -96.642434286 + -4.711503119 -96.675903141 +} +8538766bfffffff +{ + 34.810558495 3.720514277 + 34.719138948 3.734175646 + 34.685562126 3.833854189 + 34.743416035 3.920065535 + 34.834921926 3.906557691 + 34.868487621 3.806684718 +} +85b954cbfffffff +{ + -35.802996327 129.258711553 + -35.711662235 129.260433274 + -35.665334595 129.170044610 + -35.710223803 129.077920644 + -35.801467098 129.075986334 + -35.847912056 129.166388357 +} +856d6357fffffff +{ + 12.064208104 -87.492423424 + 11.996297361 -87.548128428 + 11.919880071 -87.512499245 + 11.911408256 -87.421122771 + 11.979379289 -87.365414518 + 12.055761804 -87.401085872 +} +850ab29bfffffff +{ + 55.343070962 96.392303265 + 55.251628898 96.415701917 + 55.215210208 96.560260691 + 55.270084589 96.681741770 + 55.361496828 96.658936818 + 55.398064843 96.514056901 +} +8550a07bfffffff +{ + 21.867694656 -124.196051059 + 21.951168711 -124.152097598 + 22.030399913 -124.206307499 + 22.026068692 -124.304458606 + 21.942580884 -124.348279705 + 21.863437988 -124.294082245 +} +85944167fffffff +{ + -10.710551852 133.618806880 + -10.800002456 133.634771792 + -10.833160375 133.723984645 + -10.776882710 133.797262248 + -10.687401905 133.781311141 + -10.654228901 133.692068559 +} +857c46bbfffffff +{ + 2.483803970 -27.215812192 + 2.562716157 -27.170699833 + 2.644454600 -27.216068597 + 2.647338912 -27.306595676 + 2.568419709 -27.351774618 + 2.486623184 -27.306359990 +} +8502a283fffffff +{ + 75.968929583 -134.726700853 + 75.920065438 -135.046256763 + 75.829473757 -135.047351462 + 75.787813394 -134.733072134 + 75.836252731 -134.415713251 + 75.926774332 -134.410438065 +} +8508d2d7fffffff +{ + 62.966211669 25.548385460 + 62.933776798 25.691769352 + 62.984049681 25.825208560 + 63.066912609 25.815322633 + 63.099384840 25.671289630 + 63.048956527 25.537793212 +} +85ee1e8ffffffff +{ + -73.153897536 -26.706116145 + -73.072459808 -26.523264231 + -72.985669261 -26.674151697 + -72.979925135 -27.005990295 + -73.060926305 -27.190162432 + -73.148107792 -27.041197063 +} +85615017fffffff +{ + 5.551724091 74.930892568 + 5.638244258 74.903684897 + 5.658773982 74.820259000 + 5.592850807 74.764112414 + 5.506421535 74.791304452 + 5.485824576 74.874658785 +} +859f1ea3fffffff +{ + -19.171503914 172.195307354 + -19.089850858 172.157467293 + -19.074458252 172.065521339 + -19.140747227 172.011251535 + -19.222518714 172.049028705 + -19.237882753 172.141138823 +} +8536842bfffffff +{ + 29.780300366 -154.593194642 + 29.694719020 -154.626311396 + 29.629278182 -154.554578548 + 29.649414300 -154.449716886 + 29.735004587 -154.416523552 + 29.800449869 -154.488268294 +} +85d97013fffffff +{ + -57.888146473 134.356502413 + -57.841925037 134.206583903 + -57.888620693 134.061862062 + -57.981771070 134.066785363 + -58.028145631 134.217241095 + -57.981216171 134.362235566 +} +85d2800ffffffff +{ + -43.823687349 -97.165547979 + -43.751058220 -97.079306803 + -43.659974409 -97.123072174 + -43.641398818 -97.252807264 + -43.713888863 -97.339155087 + -43.805093493 -97.295662021 +} +85f0b267fffffff +{ + -70.628945089 91.675000155 + -70.542236046 91.558246778 + -70.530641364 91.274216302 + -70.605658554 91.104842899 + -70.692604033 91.220040433 + -70.704296460 91.506178192 +} +85c76d93fffffff +{ + -36.837178770 -150.507637743 + -36.745847227 -150.473613831 + -36.677835274 -150.555447200 + -36.701091432 -150.671330240 + -36.792410685 -150.705545749 + -36.860486172 -150.623686907 +} +85030d5bfffffff +{ + 84.946644918 -81.736698637 + 84.979095099 -82.675901631 + 84.922333751 -83.502385466 + 84.834510874 -83.381249983 + 84.803169049 -82.463797920 + 84.858562481 -81.645960248 +} +85878d33fffffff +{ + -6.555384225 88.482533035 + -6.469100211 88.456833297 + -6.444456822 88.367100279 + -6.506098530 88.303122927 + -6.592327461 88.328842597 + -6.616969802 88.418519792 +} +8581aeb3fffffff +{ + -10.222928579 -37.363840101 + -10.139840351 -37.313816120 + -10.056267381 -37.361669600 + -10.055773157 -37.459554983 + -10.138874181 -37.509610367 + -10.222456628 -37.461749109 +} +852aa00bfffffff +{ + 41.691122701 -77.777883389 + 41.641207492 -77.879139773 + 41.554220964 -77.868424793 + 41.517115593 -77.756847341 + 41.566849551 -77.655728220 + 41.653869802 -77.666049048 +} +85f2ee17fffffff +{ + -78.145735383 -107.839502958 + -78.179698626 -107.433376941 + -78.121293443 -107.081037382 + -78.029511402 -107.136599477 + -77.996043680 -107.538657153 + -78.053866493 -107.889203573 +} +852265bbfffffff +{ + 43.673355960 -179.214404981 + 43.766057230 -179.195352408 + 43.826297595 -179.297162488 + 43.793742664 -179.418024156 + 43.700975664 -179.436810918 + 43.640829179 -179.335002244 +} +850e0283fffffff +{ + 60.744851801 -78.990414952 + 60.687532533 -79.151522291 + 60.590633544 -79.130453781 + 60.550996565 -78.949291861 + 60.608072921 -78.788499338 + 60.705028471 -78.808552677 +} +85522407fffffff +{ + 23.061348815 43.446208780 + 22.971210894 43.426258225 + 22.912397200 43.496842279 + 22.943632171 43.587314705 + 23.033666323 43.607363756 + 23.092569278 43.536842101 +} +85914e67fffffff +{ + -6.994966924 -126.502462670 + -7.070200710 -126.534516686 + -7.126099109 -126.490395172 + -7.106810927 -126.414306928 + -7.031671601 -126.382279062 + -6.975726059 -126.426313233 +} +85a128a3fffffff +{ + -28.161525705 -136.456369909 + -28.070352581 -136.439650299 + -28.010590125 -136.516544157 + -28.041945879 -136.610270140 + -28.133170782 -136.627166573 + -28.192988235 -136.550160200 +} +85c58243fffffff +{ + -35.304623751 -44.820195343 + -35.371507175 -44.881820632 + -35.451801956 -44.851378628 + -35.465242127 -44.759094000 + -35.398260996 -44.697390335 + -35.317937504 -44.728049571 +} +85d8dbb7fffffff +{ + -40.011933738 128.116449033 + -39.921382006 128.119669064 + -39.872495970 128.025936858 + -39.914052219 127.928979605 + -40.004509360 127.925527882 + -40.053504919 128.019264820 +} +85642d5bfffffff +{ + 6.562085795 94.581461844 + 6.655883796 94.555983067 + 6.681007428 94.461382323 + 6.612323652 94.392307749 + 6.518549283 94.417825467 + 6.493435006 94.512378931 +} +8500ea23fffffff +{ + 87.097959417 61.323167101 + 87.117052233 63.086402077 + 87.205856266 63.692263561 + 87.277031156 62.450017332 + 87.256811859 60.589428277 + 87.166589764 60.071673609 +} +85d6d823fffffff +{ + -42.988066814 30.816864634 + -42.914596294 30.822011104 + -42.876050195 30.724660777 + -42.910969326 30.622114795 + -42.984442347 30.616875201 + -43.022993832 30.714274686 +} +85b508b7fffffff +{ + -34.658240675 -158.700013062 + -34.568203563 -158.658900366 + -34.493793440 -158.733684239 + -34.509356978 -158.849533411 + -34.599344849 -158.890788318 + -34.673818484 -158.816052214 +} +85e1286ffffffff +{ + -67.215145134 63.085044415 + -67.122737792 63.093046928 + -67.073300879 62.902094305 + -67.115990956 62.702678534 + -67.208295722 62.693204255 + -67.258013864 62.884615402 +} +858e65d3fffffff +{ + -10.788993265 -74.950209316 + -10.867943610 -75.005897828 + -10.955181839 -74.965024539 + -10.963425266 -74.868463528 + -10.884468830 -74.812832744 + -10.797275065 -74.853705101 +} +859bb067fffffff +{ + -18.734365671 -164.090563434 + -18.647029690 -164.051367674 + -18.572910010 -164.111600555 + -18.586045600 -164.210960761 + -18.673295183 -164.250235670 + -18.747495586 -164.190071477 +} +85f26913fffffff +{ + -70.034445198 -118.430089193 + -70.076334477 -118.220918079 + -70.032703981 -117.993075999 + -69.947457395 -117.975656411 + -69.905945765 -118.184107198 + -69.949304424 -118.410700260 +} +85f38093fffffff +{ + -80.387434159 173.219915079 + -80.468063162 173.092463371 + -80.521781801 173.479461844 + -80.494077865 173.993262053 + -80.413074013 174.113107243 + -80.360144345 173.726813495 +} +85a88dabfffffff +{ + -18.966789746 -45.702927993 + -18.889662532 -45.651152457 + -18.808779497 -45.698742341 + -18.805047899 -45.798078834 + -18.882185019 -45.849848004 + -18.963043831 -45.802287196 +} +850f4a33fffffff +{ + 56.904307536 -62.410888453 + 56.868161545 -62.573758262 + 56.772921754 -62.599234397 + 56.713929175 -62.462605246 + 56.749941634 -62.300370319 + 56.845079718 -62.274131064 +} +8548d1affffffff +{ + 33.719417842 -105.614333742 + 33.797313765 -105.549061633 + 33.883116048 -105.598979172 + 33.890991171 -105.714285730 + 33.813045930 -105.779511028 + 33.727274917 -105.729476921 +} +850ec5b7fffffff +{ + 53.063508501 -80.182115242 + 53.006052173 -80.310301967 + 52.910979436 -80.290504028 + 52.873301989 -80.143172729 + 52.930541758 -80.015163654 + 53.025675065 -80.034307456 +} +852e040bfffffff +{ + 38.874372702 144.712480991 + 38.963442370 144.688019727 + 38.989602089 144.582325756 + 38.926717232 144.501350516 + 38.837761342 144.525980030 + 38.811576509 144.631416970 +} +852f608ffffffff +{ + 29.280335709 142.745248234 + 29.367568164 142.722006660 + 29.396501680 142.629973671 + 29.338223261 142.561382719 + 29.251113005 142.584743753 + 29.222158986 142.676576580 +} +850750a7fffffff +{ + 66.603783394 -20.032003346 + 66.628465753 -20.223289915 + 66.567678595 -20.375368178 + 66.482449195 -20.335824493 + 66.457997732 -20.145457347 + 66.518545522 -19.993716502 +} +85a4d023fffffff +{ + -28.840771313 -30.900580184 + -28.920652520 -30.954054404 + -29.000016672 -30.906063065 + -28.999453521 -30.804428970 + -28.919449123 -30.750974712 + -28.840131160 -30.799134286 +} +85b14b23fffffff +{ + -23.197781087 -125.494251637 + -23.153271135 -125.412885360 + -23.073717473 -125.410846731 + -23.038710718 -125.489981259 + -23.083122767 -125.571211660 + -23.162639306 -125.573443311 } -850336b7fffffff +8503256bfffffff { - 87.452684269 165.593280537 - 87.359550988 165.574215267 - 87.309526683 167.313021856 - 87.350069207 169.124017308 - 87.442944975 169.270830190 - 87.495625751 167.479727964 + 88.559976988 -19.113927063 + 88.649756582 -19.393055044 + 88.687622009 -23.066618098 + 88.631558746 -26.153884849 + 88.543173318 -25.461779549 + 88.509175349 -22.083873960 } -85440d83fffffff -{ - 27.290356808 -87.943548713 - 27.358508433 -87.877441989 - 27.446643644 -87.907888802 - 27.466661990 -88.004604178 - 27.398449242 -88.070784423 - 27.310279335 -88.040175862 +8534695bfffffff +{ + 28.848497780 -14.339666765 + 28.776826583 -14.411800377 + 28.686928082 -14.378686823 + 28.668675895 -14.273632052 + 28.740239110 -14.201525672 + 28.830162372 -14.234446587 +} +8599b027fffffff +{ + -10.139210366 -16.556788529 + -10.214074350 -16.592138935 + -10.276612703 -16.538698784 + -10.264184263 -16.449852900 + -10.189231041 -16.414585904 + -10.126795471 -16.468081173 +} +852b5113fffffff +{ + 39.938936197 -62.907672730 + 39.903848780 -63.015891615 + 39.820160756 -63.032099332 + 39.771632584 -62.940429726 + 39.806607465 -62.832488919 + 39.890222795 -62.815940038 +} +85c08d97fffffff +{ + -40.541925878 -14.502346842 + -40.630950909 -14.550311129 + -40.707290681 -14.472065997 + -40.694519338 -14.345766919 + -40.605419469 -14.297988830 + -40.529165718 -14.376323034 +} +8515593bfffffff +{ + 61.322459027 132.081667375 + 61.243951414 132.185139516 + 61.245322475 132.380903025 + 61.325233396 132.474316986 + 61.404023484 132.371334991 + 61.402620054 132.174444512 +} +858e714ffffffff +{ + -13.002912996 -78.408418066 + -13.081802023 -78.466167007 + -13.169748799 -78.425355853 + -13.178776274 -78.326782392 + -13.099879646 -78.269076068 + -13.011963161 -78.309900433 +} +85642113fffffff +{ + 6.636531220 96.579835385 + 6.730476503 96.554900965 + 6.755994858 96.460359414 + 6.687549801 96.390794535 + 6.593619277 96.415773163 + 6.568118995 96.510272570 +} +85ee225bfffffff +{ + -77.449047982 -33.901683895 + -77.374510803 -33.614534095 + -77.283133112 -33.766873179 + -77.265891687 -34.201946272 + -77.339810681 -34.490048075 + -77.431587146 -34.342168542 +} +8504444ffffffff +{ + 76.216043693 174.646052433 + 76.120643484 174.580916665 + 76.059326412 174.888791623 + 76.092848723 175.262560235 + 76.188026806 175.332140548 + 76.249907592 175.023527672 +} +85c86c07fffffff +{ + -47.753685487 101.477303356 + -47.675725952 101.401119024 + -47.680094349 101.260101031 + -47.762437668 101.194744573 + -47.840585434 101.270703945 + -47.836201602 101.412246133 +} +85bd5c0bfffffff +{ + -38.032349820 27.634243867 + -37.952180164 27.640668742 + -37.907282791 27.546881885 + -37.942551515 27.446644027 + -38.022717066 27.440133584 + -38.067618097 27.533946517 +} +85bf5dbbfffffff +{ + -40.830649770 149.004374494 + -40.736186352 148.980459578 + -40.703841960 148.860428103 + -40.765888694 148.764113291 + -40.860365688 148.787758326 + -40.892782538 148.907988326 +} +85f0806ffffffff +{ + -71.550159017 81.797481234 + -71.459391049 81.719930292 + -71.432819464 81.437078632 + -71.496804805 81.229863204 + -71.587707590 81.305277372 + -71.614491451 81.590051821 +} +850491d3fffffff +{ + 64.596344248 139.185132984 + 64.510736348 139.279256487 + 64.501771883 139.500837303 + 64.578360965 139.629721871 + 64.664233376 139.536533294 + 64.673252470 139.313519002 } -85f2316bfffffff +85d20407fffffff { - -79.711695321 -151.293497958 - -79.789794500 -151.109751832 - -79.795547685 -150.617083383 - -79.722959330 -150.315530969 - -79.645329426 -150.504507380 - -79.639816407 -150.989876517 + -47.126100356 -109.169879970 + -47.062651649 -109.061276710 + -46.966902145 -109.087745605 + -46.934549577 -109.222402247 + -46.997851315 -109.330933523 + -47.093652327 -109.304880729 } -8503053bfffffff +853e95d7fffffff { - 87.193262176 -87.643209126 - 87.217674016 -89.422045136 - 87.151772494 -90.766298066 - 87.064058399 -90.328632829 - 87.041157987 -88.634615084 - 87.104515197 -87.295859814 + 20.472706767 16.057789077 + 20.377636449 16.059873912 + 20.330538583 16.149022871 + 20.378450389 16.236191682 + 20.473552546 16.234255330 + 20.520711175 16.145001625 } -85d70b6bfffffff -{ - -52.737660831 34.302840550 - -52.672246034 34.243637357 - -52.658761236 34.115197211 - -52.710692104 34.045447942 - -52.776293174 34.104362557 - -52.789777082 34.233316364 -} -850ee59bfffffff -{ - 55.849413129 -77.180248590 - 55.794648735 -77.322866004 - 55.698133645 -77.309330101 - 55.656347139 -77.153950517 - 55.710894719 -77.011617328 - 55.807445061 -77.024378917 -} -85eb885bfffffff -{ - -60.708267781 -172.204677510 - -60.653621606 -172.287469379 - -60.672515492 -172.434044774 - -60.746129391 -172.498250721 - -60.800854491 -172.415389185 - -60.781886622 -172.268390578 -} -85026c63fffffff -{ - 74.349730793 -69.591587887 - 74.308025604 -69.900127289 - 74.216256450 -69.911993324 - 74.166238123 -69.618496483 - 74.207609866 -69.311858528 - 74.299331291 -69.296819471 -} -857a9983fffffff -{ - 8.248426623 47.408304240 - 8.328150161 47.406305828 - 8.374963184 47.333799840 - 8.342085665 47.263209924 - 8.262310061 47.265159314 - 8.215463986 47.337747688 -} -85a49973fffffff -{ - -27.629363811 -35.406394527 - -27.705506270 -35.460807750 - -27.783731946 -35.419800987 - -27.785786283 -35.324205250 - -27.709519791 -35.269780389 - -27.631323111 -35.310962679 -} -850025cbfffffff -{ - 76.564038339 26.741506617 - 76.621343002 26.988866000 - 76.702464331 26.870988685 - 76.725911893 26.502220562 - 76.668058573 26.255282749 - 76.587307965 26.376665154 -} -85aef0d3fffffff -{ - -30.212393095 97.497190343 - -30.293792783 97.534060970 - -30.302752764 97.628315659 - -30.230394552 97.685543888 - -30.149091754 97.648654901 - -30.140050313 97.554555836 -} -8514d353fffffff -{ - 48.530664231 137.463434266 - 48.460408765 137.522381881 - 48.454378461 137.653389422 - 48.518581963 137.725950328 - 48.589017560 137.667302190 - 48.595069588 137.535792370 -} -857ad90bfffffff -{ - 9.475832414 40.070603466 - 9.392464197 40.055001172 - 9.344469283 40.121035770 - 9.379737246 40.202638681 - 9.463026063 40.218329580 - 9.511126362 40.152329107 -} -852eb6dbfffffff -{ - 46.818993012 153.234716850 - 46.909103936 153.217435715 - 46.940247244 153.094762353 - 46.881261862 152.989668122 - 46.791225530 153.007231126 - 46.760099847 153.129606985 -} -8545583bfffffff -{ - 25.737378535 -91.480924198 - 25.808859624 -91.415570325 - 25.897524394 -91.449316051 - 25.914725533 -91.548569424 - 25.843175687 -91.613975784 - 25.754493529 -91.580076421 -} -850a5a13fffffff -{ - 69.581399680 106.161179662 - 69.528481383 106.386739970 - 69.568998135 106.626070956 - 69.662780040 106.641056796 - 69.716045457 106.414540256 - 69.675180259 106.173992889 -} -857c11a3fffffff -{ - 0.150019728 -20.009061646 - 0.226796276 -19.968232565 - 0.305415021 -20.010896195 - 0.307321625 -20.094453972 - 0.230518909 -20.135365303 - 0.151835729 -20.092636655 -} -850db26bfffffff -{ - 67.902043046 174.795363458 - 67.808695982 174.753874989 - 67.750103987 174.946836333 - 67.784484492 175.181578833 - 67.877674729 175.224812529 - 67.936642439 175.031563428 -} -853f41bbfffffff -{ - 35.237359546 29.911013276 - 35.142352421 29.900015992 - 35.085998336 29.995362225 - 35.124581418 30.101733652 - 35.219547869 30.112917769 - 35.275972036 30.017543804 -} -855b952bfffffff -{ - 14.545797795 -178.034998301 - 14.629416367 -178.020544486 - 14.677868300 -178.091258912 - 14.642583505 -178.176433679 - 14.558898375 -178.190758840 - 14.510564507 -178.120038046 -} -850f820bfffffff -{ - 66.491786035 -92.305649979 - 66.420149715 -92.466523253 - 66.329148025 -92.394029044 - 66.309586467 -92.161838652 - 66.380936932 -92.000724226 - 66.472134279 -92.072035456 -} -85ef243bfffffff -{ - -85.223406144 -78.889480034 - -85.214588256 -77.771672094 - -85.127930208 -77.340353273 - -85.051240938 -78.001959428 - -85.059768744 -79.083467366 - -85.145268672 -79.538878804 -} -855ca9dbfffffff -{ - 8.980021785 -153.790937525 - 8.888160292 -153.821552856 - 8.815800489 -153.756122328 - 8.835257221 -153.660070619 - 8.927103289 -153.629393646 - 8.999508103 -153.694829894 -} -85078b6bfffffff -{ - 74.403169858 -37.189371968 - 74.409669985 -37.512434538 - 74.334260822 -37.680357296 - 74.252716136 -37.526230275 - 74.246313326 -37.206163334 - 74.321358437 -37.037246403 -} -858aaa9bfffffff -{ - -4.622251841 -57.986950183 - -4.543069900 -57.938493365 - -4.460044896 -57.980401464 - -4.456234761 -58.070696646 - -4.535376041 -58.119098781 - -4.618368107 -58.077260502 -} -85037643fffffff -{ - 84.842481107 -68.508651614 - 84.892642805 -69.313490961 - 84.854233627 -70.247547629 - 84.766699269 -70.356361951 - 84.717937733 -69.560669382 - 84.755330284 -68.646824954 -} -85e9aa6ffffffff -{ - -70.270813075 -93.524571327 - -70.280421002 -93.258923660 - -70.206497796 -93.091906142 - -70.123369720 -93.190110043 - -70.113931835 -93.453678081 - -70.187452845 -93.621111349 -} -85e2d6b7fffffff -{ - -56.018275904 -121.686906713 - -55.971223994 -121.543979974 - -55.877364124 -121.548703884 - -55.830588810 -121.695724511 - -55.877523148 -121.838284231 - -55.971349980 -121.834190142 -} -85074197fffffff -{ - 63.417173602 -17.822281144 - 63.441950114 -17.986020600 - 63.383175254 -18.122848037 - 63.299833711 -18.095606358 - 63.275281796 -17.932512143 - 63.333847426 -17.796015329 -} -85f336c3fffffff -{ - -74.158939168 178.340857989 - -74.239745097 178.280541902 - -74.280408616 178.415183621 - -74.294454018 178.495903142 - -74.261718300 178.784227088 - -74.187083091 178.828882575 - -74.159276069 178.668098454 - -74.139038913 178.600983403 -} -8539a1a7fffffff -{ - 35.426710010 -9.097923101 - 35.359902801 -9.177946695 - 35.268392680 -9.149042708 - 35.243700372 -9.040352649 - 35.310416342 -8.960407189 - 35.401915726 -8.989073468 -} -8521552bfffffff -{ - 52.454630606 70.944794285 - 52.369278056 71.018114779 - 52.364994082 71.176597005 - 52.446050318 71.262304780 - 52.531528742 71.189298666 - 52.535825102 71.030268849 -} -8502a9d3fffffff -{ - 75.441616986 -119.504372107 - 75.354298178 -119.604981383 - 75.291008139 -119.374980201 - 75.314644756 -119.044174155 - 75.401806319 -118.940488610 - 75.465490132 -119.170670195 -} -853663dbfffffff -{ - 33.073351674 -138.855306891 - 32.996815583 -138.894021170 - 32.926496028 -138.828873407 - 32.932725541 -138.725095639 - 33.009235979 -138.686370085 - 33.079542594 -138.751433385 -} -8525ab33fffffff -{ - 45.281538859 94.918330999 - 45.189767914 94.940071005 - 45.158866614 95.059662452 - 45.219590709 95.157744210 - 45.311339436 95.136397443 - 45.342386529 95.016575507 -} -85e3a5c7fffffff -{ - -68.568168350 -136.603883131 - -68.548463533 -136.392336151 - -68.468753180 -136.354188369 - -68.408864875 -136.526542972 - -68.428497382 -136.736930076 - -68.508090050 -136.776118433 -} -85f2926bfffffff -{ - -88.509146044 58.166191407 - -88.448938878 55.518340130 - -88.477001431 52.289931334 - -88.568072111 51.408344801 - -88.633133187 54.106081883 - -88.602042097 57.651866114 -} -85b4dd23fffffff -{ - -17.613493789 -159.230814197 - -17.525265952 -159.195314072 - -17.452858279 -159.258804909 - -17.468588124 -159.357757999 - -17.556746682 -159.393359481 - -17.629244723 -159.329906750 -} -8531868bfffffff -{ - 39.541737530 113.541806259 - 39.460524297 113.532047111 - 39.421414914 113.609490060 - 39.463367542 113.696691248 - 39.544470784 113.706681629 - 39.583731448 113.629239934 -} -8584eea7fffffff -{ - -8.234636099 70.059879963 - -8.322734491 70.077620165 - -8.351585976 70.166931842 - -8.292278520 70.238419278 - -8.204208150 70.220572706 - -8.175417112 70.131344969 -} -85ed8013fffffff -{ - -62.103768303 153.102637522 - -62.083887643 152.928706950 - -62.148631325 152.814825269 - -62.233469688 152.875169776 - -62.253347027 153.050050690 - -62.188389231 153.163633437 -} -85f2906ffffffff -{ - -89.561014025 104.311312753 - -89.562612592 92.242978691 - -89.635134246 84.352593518 - -89.722562839 90.522944647 - -89.718092729 109.472925507 - -89.629827337 113.386735974 -} -85e1a96bfffffff -{ - -60.297201951 69.298650716 - -60.204329635 69.286381072 - -60.164992121 69.124113435 - -60.218296965 68.973643439 - -60.311129189 68.984972094 - -60.350697281 69.147711760 -} -85014057fffffff -{ - 76.749566089 6.456911701 - 76.821288145 6.592380382 - 76.886932299 6.354687667 - 76.880292504 5.980491272 - 76.808212956 5.848117715 - 76.743129236 6.086815990 -} -85e64677fffffff -{ - -64.558271528 5.614615036 - -64.467856415 5.620488218 - -64.417139321 5.439106094 - -64.456559455 5.251196590 - -64.546993183 5.243951523 - -64.597989195 5.425987606 -} -855f2c47fffffff -{ - 2.252258339 -58.381493392 - 2.331751309 -58.333659517 - 2.411930830 -58.374943938 - 2.412600869 -58.463992928 - 2.333164680 -58.511771986 - 2.253001702 -58.470556951 -} -8500c8affffffff -{ - 88.042061785 105.251262960 - 87.993516361 107.518999522 - 88.034889148 109.973180373 - 88.127729666 110.297432732 - 88.179898713 107.936476679 - 88.135441328 105.342216511 -} -85ef1583fffffff -{ - -83.838561761 -32.231653249 - -83.763733908 -31.679540884 - -83.675455647 -32.007250876 - -83.661162871 -32.870584326 - -83.734782375 -33.427634984 - -83.823895774 -33.116772885 -} -85030e47fffffff -{ - 85.147193640 -100.460879813 - 85.151461233 -101.523457044 - 85.073852896 -102.123016997 - 84.993395762 -101.672929166 - 84.989454106 -100.644059200 - 85.065649970 -100.032280223 -} -856ca827fffffff -{ - 4.282300471 -99.442987889 - 4.210367387 -99.498761029 - 4.130026394 -99.467749116 - 4.121612053 -99.380889800 - 4.193611665 -99.325063226 - 4.273959025 -99.356149336 -} -85030677fffffff -{ - 86.963227756 -128.472341904 - 86.924515776 -130.031458942 - 86.830786528 -130.184985164 - 86.776316594 -128.864533233 - 86.813414553 -127.365382125 - 86.906541041 -127.127763000 -} -85c144abfffffff -{ - -27.953982650 -3.630743317 - -28.045542758 -3.660490228 - -28.115002446 -3.584967587 - -28.092793596 -3.479721750 - -28.001200753 -3.450164756 - -27.931849368 -3.525663437 -} -85272ccffffffff -{ - 52.226939777 -90.928229357 - 52.159703880 -91.034965140 - 52.068676355 -90.991147175 - 52.044740567 -90.841106497 - 52.111759604 -90.734299568 - 52.202931032 -90.777602936 -} -8571a307fffffff -{ - 8.694113708 -176.775079326 - 8.609705108 -176.792498765 - 8.547812388 -176.733200759 - 8.570293648 -176.656390490 - 8.654771368 -176.638884105 - 8.716698725 -176.698274952 -} -85ef80cbfffffff -{ - -78.642396790 1.114197641 - -78.546596496 1.164626752 - -78.489917184 0.778514491 - -78.528411113 0.339695641 - -78.624102669 0.282471678 - -78.681413778 0.670842531 -} -853d21b3fffffff -{ - 36.682850763 78.386126313 - 36.595895807 78.430952317 - 36.584235674 78.548636471 - 36.659468875 78.621785596 - 36.746511283 78.577199606 - 36.758233166 78.459223901 -} -859218b7fffffff -{ - -13.151892077 -105.946502887 - -13.219518506 -106.002625443 - -13.305209697 -105.973982874 - -13.323337667 -105.889127476 - -13.255684919 -105.832924649 - -13.169930525 -105.861657460 -} -858886bbfffffff -{ - -3.064953596 -147.134039149 - -3.149822301 -147.165474691 - -3.216939893 -147.105183775 - -3.199249862 -147.013483859 - -3.114433388 -146.982012454 - -3.047254679 -147.042276701 -} -85041e77fffffff -{ - 71.625093356 147.268302516 - 71.532313338 147.359205761 - 71.510498082 147.658249081 - 71.581264705 147.868863176 - 71.674291235 147.780268021 - 71.696305932 147.478737596 -} -8559496bfffffff -{ - 19.598888701 13.984351114 - 19.504676930 13.988140011 - 19.458857708 14.076704237 - 19.507195539 14.161592369 - 19.601449878 14.157946532 - 19.647323927 14.069269422 -} -85a33333fffffff -{ - -13.595100475 43.716471594 - -13.500658998 43.715697940 - -13.454023050 43.633790771 - -13.501835967 43.552567064 - -13.596344199 43.553276410 - -13.642972799 43.635273820 -} -85048dcffffffff -{ - 67.868826690 148.957677929 - 67.776446003 149.026351479 - 67.752468906 149.273555616 - 67.820682461 149.453748387 - 67.913253885 149.386729810 - 67.937422027 149.137856518 -} -85a51283fffffff -{ - -13.550357940 -31.717390004 - -13.468207417 -31.669055996 - -13.388177480 -31.716579871 - -13.390284319 -31.812469390 - -13.472467120 -31.860858078 - -13.552510793 -31.813302692 -} -85be5a23fffffff -{ - -31.894922713 143.242819107 - -31.799866689 143.228161078 - -31.763903618 143.125012790 - -31.822895168 143.036403197 - -31.917934533 143.050837251 - -31.953999157 143.154104944 -} -853a9d0ffffffff -{ - 23.444172454 -55.597308082 - 23.367762540 -55.623182892 - 23.300310411 -55.565692565 - 23.309156510 -55.482263986 - 23.385570439 -55.456222096 - 23.453134381 -55.513775794 -} -85e3168bfffffff -{ - -68.219109155 -139.616375271 - -68.203063234 -139.408670486 - -68.124348230 -139.362598757 - -68.061811277 -139.523302323 - -68.077811790 -139.729842528 - -68.156394317 -139.776839531 -} -857f4cbbfffffff -{ - -2.091105648 167.793705413 - -2.173169123 167.802247155 - -2.201123772 167.869208977 - -2.147107520 167.927574222 - -2.065136364 167.919070100 - -2.037089169 167.852163133 -} -8564865bfffffff -{ - 18.462603177 100.124959096 - 18.555032875 100.100257594 - 18.581932323 100.002917439 - 18.516384168 99.930313650 - 18.423941249 99.955071834 - 18.397059649 100.052377232 -} -85e0cecffffffff -{ - -51.523781171 54.185963270 - -51.441449157 54.210035749 - -51.395385871 54.113015880 - -51.431450953 53.991920115 - -51.513647640 53.967407160 - -51.559914756 54.064429520 -} -85250d1bfffffff -{ - 51.647047276 99.479197153 - 51.555427623 99.494328502 - 51.517269700 99.622303006 - 51.570575953 99.735368931 - 51.662142412 99.720733043 - 51.700456082 99.592535833 -} -85ea82abfffffff -{ - -62.695004068 176.828560252 - -62.633866805 176.750729762 - -62.641386449 176.579524513 - -62.710073414 176.485569792 - -62.771307858 176.563262654 - -62.763758078 176.735049487 -} -8588f24bfffffff -{ - -0.829810917 -151.746352835 - -0.916568359 -151.776567506 - -0.985528730 -151.714138829 - -0.967793288 -151.621500118 - -0.881071066 -151.591234376 - -0.812049014 -151.653658294 -} -85dd8b67fffffff -{ - -54.580936424 -8.264076834 - -54.662937537 -8.314451717 - -54.726716590 -8.209678256 - -54.708397042 -8.054499294 - -54.626343223 -8.004482700 - -54.562661498 -8.109285836 -} -85e79ad7fffffff -{ - -59.348515451 33.878483325 - -59.275346425 33.804682272 - -59.262284738 33.642256341 - -59.322396798 33.552812522 - -59.395800783 33.626140498 - -59.408857740 33.789388092 -} -85b3b003fffffff -{ - -20.212708602 -79.778037092 - -20.289626851 -79.837686530 - -20.375000090 -79.796157849 - -20.383441700 -79.694959830 - -20.306527589 -79.635347999 - -20.221167754 -79.676896412 -} -85e898b7fffffff -{ - -66.128181335 -67.868615342 - -66.098624332 -67.647297912 - -66.007560443 -67.595693755 - -65.946239774 -67.764003457 - -65.975631102 -67.983975908 - -66.066507934 -68.036978739 -} -85096077fffffff -{ - 71.882067964 3.543787297 - 71.948472022 3.626466588 - 72.006705038 3.449097973 - 71.998127027 3.188750841 - 71.931497857 3.107734834 - 71.873670859 3.285393287 -} -85c96463fffffff -{ - -49.247659821 116.870504195 - -49.181716912 116.766888122 - -49.204947547 116.628586782 - -49.294257304 116.593451871 - -49.360409691 116.697123333 - -49.337042484 116.835875229 -} -850d348bfffffff -{ - 75.977341713 -162.317739509 - 75.896305518 -162.521677097 - 75.813296336 -162.343982595 - 75.810908658 -161.964981417 - 75.891428730 -161.759299368 - 75.974851929 -161.934329224 -} -852312a7fffffff -{ - 39.899675447 -161.442991404 - 39.983386657 -161.407364478 - 40.051849080 -161.476555906 - 40.036539119 -161.581527692 - 39.952704317 -161.617047412 - 39.884303104 -161.547703006 -} -85a843cbfffffff -{ - -19.048063799 -56.217495118 - -18.975980821 -56.167381626 - -18.894850963 -56.211119342 - -18.885854248 -56.304902646 - -18.957934809 -56.354965175 - -19.039014518 -56.311295466 -} -85df822bfffffff -{ - -60.748985995 -41.829344984 - -60.686907173 -41.686638794 - -60.597781650 -41.727705921 - -60.570615999 -41.910491504 - -60.632393073 -42.053081510 - -60.721636850 -42.013004531 -} -85b7b37bfffffff -{ - -34.278237020 -84.304380650 - -34.206392428 -84.250377462 - -34.126690328 -84.301239876 - -34.118679928 -84.406022764 - -34.190427859 -84.460205484 - -34.270282950 -84.409426271 -} -85eb888bfffffff -{ - -61.012815042 -171.293259798 - -60.955824060 -171.220839342 - -60.893624146 -171.310232980 - -60.888352892 -171.471749848 - -60.945271877 -171.544281376 - -61.007534072 -171.455186065 -} -8507ac0bfffffff -{ - 74.925146534 -18.316875291 - 74.957167510 -18.605287449 - 74.901579893 -18.842968497 - 74.814299651 -18.791291108 - 74.782585629 -18.504900200 - 74.837846606 -18.268171161 -} -851f42a7fffffff -{ - 54.177022774 24.371015875 - 54.098378719 24.363809867 - 54.054983381 24.489379775 - 54.090168063 24.622275223 - 54.168802115 24.629797513 - 54.212261680 24.504108228 -} -858c206bfffffff -{ - -10.934094510 106.312696768 - -10.853797526 106.292392647 - -10.834673344 106.206350535 - -10.895906008 106.140625089 - -10.976204157 106.160986651 - -10.995268558 106.247016272 -} -8550c483fffffff -{ - 26.255842761 -131.154429445 - 26.339499359 -131.116705950 - 26.412618726 -131.173455468 - 26.402003912 -131.267876689 - 26.318369041 -131.305443716 - 26.245327198 -131.248746109 -} -85c32983fffffff -{ - -41.036122487 -65.960584114 - -40.960215302 -65.934488863 - -40.895766178 -66.003046858 - -40.907092029 -66.097784385 - -40.983007301 -66.124154671 - -41.047588819 -66.055512567 -} -85281113fffffff -{ - 41.194207657 -122.316622370 - 41.274701502 -122.262142563 - 41.345530544 -122.326029292 - 41.335814466 -122.444393812 - 41.255319818 -122.498695340 - 41.184542015 -122.434810970 -} -855e8e3bfffffff -{ - 17.006980708 -49.609654681 - 17.080312384 -49.560707044 - 17.151708655 -49.604855701 - 17.149800620 -49.697911390 - 17.076522605 -49.746837254 - 17.005098990 -49.702729320 -} -857faab7fffffff -{ - -5.008059965 178.017131933 - -4.938757180 178.057473445 - -4.880001687 178.021901596 - -4.890495207 177.946091739 - -4.959690461 177.905762948 - -5.018499635 177.941231200 -} -85137597fffffff -{ - 66.979435161 -108.602173888 - 66.895617095 -108.709627727 - 66.816885974 -108.585675096 - 66.821691641 -108.354743818 - 66.905318047 -108.246278430 - 66.984330771 -108.369749303 -} -850e0d4ffffffff -{ - 57.538126983 -74.433241844 - 57.486448704 -74.586742597 - 57.389351630 -74.580052458 - 57.343922460 -74.420719540 - 57.395388924 -74.267606432 - 57.492495754 -74.273438347 -} -85d40b77fffffff -{ - -45.553844673 -165.093642728 - -45.474171273 -165.041453715 - -45.401088864 -165.119221933 - -45.407634595 -165.249051691 - -45.487248914 -165.301367331 - -45.560376616 -165.223727154 -} -85b16113fffffff -{ - -28.105752663 -128.625408326 - -28.062114660 -128.537541958 - -27.978040904 -128.531350855 - -27.937666827 -128.612812591 - -27.981219611 -128.700506539 - -28.065231537 -128.706910992 -} -859b7673fffffff -{ - -20.769759801 -177.166207954 - -20.688771056 -177.120211546 - -20.612982743 -177.167593454 - -20.618143253 -177.260841375 - -20.699019896 -177.306845414 - -20.774848054 -177.259594099 -} -856ea443fffffff -{ - 4.696941174 -109.858201570 - 4.769173211 -109.808582913 - 4.846253188 -109.850865494 - 4.851023437 -109.942823083 - 4.778710554 -109.992391662 - 4.701708277 -109.950052909 -} -85d25427fffffff -{ - -40.863577548 -112.400568445 - -40.803403166 -112.300144579 - -40.707973627 -112.318690469 - -40.672688752 -112.437314151 - -40.732721780 -112.537639036 - -40.828180792 -112.519439520 -} -85e0826bfffffff -{ - -50.783973698 68.315820998 - -50.696457030 68.308718447 - -50.661987620 68.186415555 - -50.714833788 68.070957389 - -50.802309729 68.077515362 - -50.836980619 68.200076018 -} -8538d947fffffff -{ - 24.524665304 6.744841587 - 24.431132764 6.754829245 - 24.390771377 6.846137581 - 24.443925221 6.927609591 - 24.537537337 6.917758466 - 24.577916096 6.826298628 -} -85d6cb27fffffff -{ - -43.575263198 26.885730438 - -43.659109639 26.892278109 - -43.694647516 26.982545604 - -43.646352913 27.066017300 - -43.562621454 27.059256689 - -43.527069605 26.969236953 -} -85c50e17fffffff -{ - -33.390067210 -34.544255802 - -33.466985741 -34.602384571 - -33.548509338 -34.557048236 - -33.553092959 -34.453382507 - -33.476057018 -34.395246930 - -33.394554969 -34.440783595 -} -8537191bfffffff -{ - 37.985568516 -148.816334156 - 37.910153637 -148.853419957 - 37.848245333 -148.780353491 - 37.861750726 -148.670228035 - 37.937159694 -148.633083018 - 37.999069232 -148.706122458 -} -852fb40bfffffff -{ - 39.665714247 158.274845555 - 39.760996726 158.265179631 - 39.801034517 158.153866895 - 39.745746928 158.052435794 - 39.650521674 158.062356598 - 39.610526634 158.173453882 -} -85c955d3fffffff -{ - -45.486744105 113.685590376 - -45.419498987 113.594575239 - -45.437823323 113.465333193 - -45.523500991 113.426697926 - -45.590948810 113.517707622 - -45.572515983 113.647358882 -} -85d2dacffffffff -{ - -35.759961351 -101.206493659 - -35.693100131 -101.125703443 - -35.602696409 -101.158718625 - -35.579054928 -101.272285249 - -35.645769126 -101.353114439 - -35.736271705 -101.320338546 -} -8510d8dbfffffff -{ - 55.744172281 62.266379348 - 55.666705714 62.360090239 - 55.674433270 62.528262730 - 55.759675657 62.603336757 - 55.837296890 62.509807034 - 55.829520940 62.341020310 -} -85a0a843fffffff -{ - -14.860119111 -133.643815257 - -14.777272640 -133.631724678 - -14.718414995 -133.698801158 - -14.742328404 -133.778064825 - -14.825215399 -133.790288970 - -14.884148556 -133.723115854 -} -850318cffffffff -{ - 84.119988136 -120.134633625 - 84.093394209 -120.984142817 - 84.002896093 -121.203690994 - 83.939656474 -120.594326256 - 83.965716153 -119.765293305 - 84.055538734 -119.525448293 -} -85e5a937fffffff -{ - -59.445102479 112.131220333 - -59.372700646 112.004180097 - -59.392310535 111.818026948 - -59.484440979 111.758052696 - -59.557090482 111.885027310 - -59.537361431 112.072044508 -} -85b5720bfffffff -{ - -34.612089606 -160.314945284 - -34.522666892 -160.272467505 - -34.447339846 -160.345866305 - -34.461374260 -160.461681688 - -34.550741628 -160.504291438 - -34.626129981 -160.430954216 -} -850f4893fffffff -{ - 57.389825748 -59.636885662 - 57.357500113 -59.803518460 - 57.263143813 -59.836601803 - 57.201238158 -59.703800893 - 57.233451857 -59.537864317 - 57.327682709 -59.504034206 -} -85d6c673fffffff -{ - -45.155956477 33.292875831 - -45.085754339 33.296917531 - -45.051199074 33.197962575 - -45.086839779 33.094898789 - -45.157047662 33.090760551 - -45.191609186 33.189782631 -} -857ecba7fffffff -{ - 3.966131750 168.385993161 - 3.882715323 168.394436955 - 3.850349770 168.461215627 - 3.901318114 168.519494307 - 3.984632219 168.511088476 - 4.017080253 168.444366022 -} -85ca2a53fffffff -{ - -39.264765273 56.637765391 - -39.353974241 56.648079214 - -39.396201923 56.752820800 - -39.349159352 56.847201614 - -39.259904444 56.836698137 - -39.217737943 56.732003541 -} -8570ebc3fffffff -{ - -2.265951650 -166.018749379 - -2.348337595 -166.041910516 - -2.414694400 -165.980182908 - -2.398731091 -165.895235863 - -2.316332828 -165.871995689 - -2.249910114 -165.933781551 -} -85cfaa3bfffffff -{ - -48.239154336 -71.758586945 - -48.157534785 -71.716024610 - -48.087622309 -71.792432714 - -48.099183583 -71.911447873 - -48.180790234 -71.954378519 - -48.250848712 -71.877926232 -} -857d3117fffffff -{ - -10.260563979 -20.523217833 - -10.180649842 -20.481391998 - -10.104843340 -20.524972966 - -10.108914336 -20.610445823 - -10.188880123 -20.652355746 - -10.264723253 -20.608708778 -} -85a24337fffffff -{ - -20.217753257 58.774050218 - -20.311787743 58.784527865 - -20.348748367 58.875285064 - -20.291584230 58.955519645 - -20.197511396 58.944904333 - -20.160640956 58.854192107 -} -85a1ab17fffffff -{ - -21.174010101 -131.661015511 - -21.087550523 -131.650137890 - -21.030163743 -131.720648104 - -21.059178576 -131.802150770 - -21.145700038 -131.813174831 - -21.203144853 -131.742549732 -} -856f3287fffffff -{ - -3.790690405 -113.618674005 - -3.728050868 -113.574614535 - -3.660455791 -113.615903497 - -3.655578497 -113.701286278 - -3.718288958 -113.745287419 - -3.785805800 -113.703964251 -} -85a76907fffffff -{ - -26.452946732 103.908134125 - -26.529995592 103.944826888 - -26.536961089 104.027903257 - -26.466976313 104.074160672 - -26.390032251 104.037479508 - -26.382968234 103.954529202 -} -850f8d87fffffff -{ - 64.506867744 -82.467326842 - 64.445570987 -82.642182264 - 64.349926588 -82.606594902 - 64.315480605 -82.397404666 - 64.376502903 -82.222794958 - 64.472244838 -82.257127037 -} -8506907bfffffff -{ - 75.263942568 -63.033828547 - 75.232120798 -63.372751353 - 75.142202461 -63.421391979 - 75.084249471 -63.134461981 - 75.115790420 -62.798243370 - 75.205563142 -62.746262533 -} -8596108ffffffff -{ - -11.645284365 31.603377589 - -11.548084153 31.607486942 - -11.495875870 31.523681497 - -11.540839039 31.435726432 - -11.638048210 31.431547968 - -11.690285334 31.515393667 -} -85e8312bfffffff -{ - -65.763426975 -92.493623937 - -65.769655913 -92.278414766 - -65.696612476 -92.146346132 - -65.617677763 -92.229160518 - -65.611582826 -92.442995667 - -65.684289154 -92.575384760 -} -85344b03fffffff -{ - 25.712953112 -16.669205209 - 25.640266906 -16.737704718 - 25.552002425 -16.703082868 - 25.536383467 -16.600133510 - 25.608957212 -16.531641823 - 25.697262263 -16.566091417 -} -85561247fffffff -{ - 13.964030596 -38.902213084 - 14.038308035 -38.853517752 - 14.115427924 -38.899757501 - 14.118315124 -38.994693737 - 14.044072857 -39.043412110 - 13.966908214 -38.997171338 -} -85f1591bfffffff -{ - -81.756767653 36.789872444 - -81.674408268 36.474561192 - -81.671972505 35.843212971 - -81.751940307 35.514706401 - -81.835092054 35.823676574 - -81.837483444 36.467659007 -} -85a7ae77fffffff -{ - -25.321992906 117.911814045 - -25.242000265 117.923856727 - -25.200535486 117.862096951 - -25.238947140 117.788343101 - -25.318827467 117.776190698 - -25.360408431 117.837901666 -} -85c385a7fffffff -{ - -43.756355067 -55.310820963 - -43.718911927 -55.211908692 - -43.649315325 -55.210394837 - -43.617175323 -55.307416890 - -43.654461677 -55.406123657 - -43.724044480 -55.408013808 -} -850d904ffffffff -{ - 65.957558001 176.219122185 - 65.865745678 176.175585618 - 65.806638354 176.348828548 - 65.838992660 176.565777770 - 65.930641491 176.610751814 - 65.990100429 176.437343400 -} -85403143fffffff -{ - 26.398742458 111.501548677 - 26.484970552 111.481097180 - 26.517844181 111.388296756 - 26.464453520 111.315946519 - 26.378170643 111.336477493 - 26.345333173 111.429279268 -} -858300bbfffffff -{ - -12.202336034 12.456955935 - -12.109354968 12.467940763 - -12.053854474 12.394391701 - -12.091281400 12.309909098 - -12.184182756 12.298879818 - -12.239736913 12.372377507 -} -858a722bfffffff -{ - -4.705849654 -66.506407276 - -4.781305600 -66.555552479 - -4.865115059 -66.515896731 - -4.873393636 -66.427126370 - -4.797932674 -66.378065364 - -4.714198121 -66.417690427 -} -853445d3fffffff -{ - 30.405630485 -17.154141206 - 30.331874379 -17.226109492 - 30.241579828 -17.189018562 - 30.225003623 -17.080148724 - 30.298652938 -17.008185027 - 30.388985139 -17.045086272 -} -8582e213fffffff -{ - -0.168498330 7.823921203 - -0.082417355 7.835503596 - -0.035520123 7.770298357 - -0.074625175 7.693571195 - -0.160617926 7.681957793 - -0.207593847 7.747102488 -} -85d8e1b3fffffff -{ - -46.507737543 128.717118655 - -46.455001703 128.608960865 - -46.489209410 128.493167448 - -46.576338708 128.485295278 - -46.629238791 128.593682675 - -46.594844970 128.709712658 -} -852120b7fffffff -{ - 52.669028465 57.167331814 - 52.594604491 57.261772688 - 52.608483650 57.415536496 - 52.696868967 57.475358623 - 52.771447330 57.380975758 - 52.757485792 57.226711494 -} -85e1b253fffffff -{ - -57.382252644 82.356252010 - -57.290870502 82.308613368 - -57.268707430 82.139698467 - -57.337774016 82.017734262 - -57.429236868 82.064627145 - -57.451552896 82.234231763 -} -85c9736bfffffff -{ - -45.535238154 113.906216434 - -45.468160085 113.814815515 - -45.486744105 113.685590376 - -45.572515983 113.647358882 - -45.639796786 113.738757998 - -45.621102696 113.868391260 -} -85004bc3fffffff -{ - 85.014510416 -38.610418230 - 85.093449866 -39.027010373 - 85.102043790 -40.092513327 - 85.031362386 -40.708936213 - 84.953557970 -40.270646587 - 84.945292726 -39.236983728 -} -85d4c63bfffffff -{ - -41.552358394 -161.943357282 - -41.467601883 -161.896178818 - -41.393980310 -161.973644650 - -41.405063333 -162.098202165 - -41.489765770 -162.145521198 - -41.563439309 -162.068142633 -} -8515b547fffffff -{ - 50.440022738 113.380925356 - 50.386516652 113.483746631 - 50.407847700 113.609688450 - 50.482843724 113.633208030 - 50.536568815 113.530276684 - 50.515078451 113.403935170 -} -85536e9bfffffff -{ - 26.916187060 50.378959557 - 26.830193148 50.354079646 - 26.768480208 50.417471186 - 26.792693164 50.505643341 - 26.878568306 50.530593416 - 26.940349216 50.467301402 -} -855720c7fffffff -{ - 25.777181603 -33.679088832 - 25.697102375 -33.733566920 - 25.613590903 -33.682587607 - 25.610050956 -33.577206142 - 25.690047680 -33.522610810 - 25.773666883 -33.573513834 -} -8503301bfffffff -{ - 87.620988517 -178.363794562 - 87.531786476 -178.973716547 - 87.462336085 -177.492690447 - 87.479109659 -175.415307963 - 87.566505119 -174.691139642 - 87.638990680 -176.153339955 -} -85a1894bfffffff -{ - -18.739426364 -131.968599185 - -18.654363424 -131.957677694 - -18.596524240 -132.026674033 - -18.623683850 -132.106700642 - -18.708802460 -132.117762541 - -18.766705868 -132.048657376 -} -850f4a97fffffff -{ - 57.426797953 -61.644335026 - 57.391744013 -61.810097683 - 57.296644455 -61.837967784 - 57.236707314 -61.700853116 - 57.271632606 -61.535757218 - 57.366623204 -61.507110786 -} -8540e05bfffffff -{ - 30.172223699 105.162263118 - 30.255888132 105.138566417 - 30.284879592 105.039552158 - 30.230189014 104.964255039 - 30.146493672 104.988024560 - 30.117519757 105.087018469 -} -8541b493fffffff -{ - 25.919899561 120.908917674 - 25.841937363 120.926078557 - 25.823731354 121.013320382 - 25.883546441 121.083467614 - 25.961542516 121.066298902 - 25.979689686 120.978990723 -} -85ca856ffffffff -{ - -45.896370225 51.615473892 - -45.978398547 51.621430912 - -46.023901332 51.727235392 - -45.987322881 51.827070481 - -45.905242926 51.820905644 - -45.859792948 51.715113688 -} -85bae9a7fffffff -{ - -25.669124274 175.178083680 - -25.586082501 175.135590268 - -25.574752472 175.038846236 - -25.646518175 174.984411500 - -25.729685715 175.026851854 - -25.740961717 175.123780296 -} -857b959bfffffff -{ - -0.019706183 54.191260276 - 0.063753621 54.186932010 - 0.109263158 54.117172656 - 0.071316495 54.051645949 - -0.012230258 54.055932385 - -0.057743397 54.125787420 -} -8548757bfffffff -{ - 26.114821528 -114.558455903 - 26.198285723 -114.503606737 - 26.282646375 -114.556244206 - 26.283475564 -114.663779531 - 26.199971406 -114.718530188 - 26.115678007 -114.665844314 -} -85a4b64bfffffff -{ - -21.977360307 -38.722694734 - -21.900466229 -38.671468064 - -21.823812258 -38.720153387 - -21.824064934 -38.820067467 - -21.900984356 -38.871320486 - -21.977625750 -38.822633229 -} -8503260bfffffff -{ - 89.556994214 122.191964293 - 89.486014556 129.141378975 - 89.486607482 139.664535180 - 89.557956423 146.767953791 - 89.643742146 142.153644237 - 89.643401505 126.975075803 -} -852503a3fffffff -{ - 50.676706993 96.115559458 - 50.584478522 96.137254829 - 50.550001243 96.268243620 - 50.607603815 96.377803106 - 50.699801163 96.356592097 - 50.734427339 96.225337085 -} -850d0053fffffff -{ - 72.241706946 -157.816910642 - 72.165517908 -157.996241577 - 72.081822639 -157.878294414 - 72.074037308 -157.582962532 - 72.149789325 -157.402957461 - 72.233762805 -157.518943198 -} -855d909bfffffff -{ - 15.021288422 -162.119149805 - 14.929317792 -162.146351767 - 14.860527002 -162.079086497 - 14.883676349 -161.984569221 - 14.975675366 -161.957281508 - 15.044496697 -162.024596734 -} -853d28b7fffffff -{ - 36.474876271 81.035271947 - 36.387425612 81.075954165 - 36.373289063 81.191819802 - 36.446525314 81.267279212 - 36.534048644 81.226852037 - 36.548263207 81.110709895 -} -859398dbfffffff -{ - -7.829263513 -111.959783532 - -7.894883944 -112.011177990 - -7.975917865 -111.987193981 - -7.991398292 -111.911729143 - -7.925738821 -111.860247269 - -7.844637969 -111.884317655 -} -851a9837fffffff -{ - 42.236920512 -53.156943987 - 42.151432913 -53.193991409 - 42.085244197 -53.120812180 - 42.104457578 -53.010501098 - 42.189971043 -52.973180196 - 42.256245369 -53.046443639 -} -85b55073fffffff -{ - -32.131237635 -160.768081851 - -32.041222183 -160.726268200 - -31.965228935 -160.797496722 - -31.979186904 -160.910476998 - -32.069142458 -160.952413501 - -32.145199989 -160.881247233 -} -85381483fffffff -{ - 32.684693764 -3.610235840 - 32.622181819 -3.688375552 - 32.532215963 -3.667593294 - 32.504799048 -3.568894102 - 32.567228018 -3.490865804 - 32.657156757 -3.511425234 -} -85157407fffffff -{ - 62.097890331 116.811271867 - 62.033661194 116.955543739 - 62.056650955 117.145468735 - 62.144063766 117.192079565 - 62.208602828 117.047708684 - 62.185418411 116.856823141 -} -85bc18c3fffffff -{ - -31.353449037 32.448076350 - -31.265495728 32.452185815 - -31.219995445 32.360730505 - -31.262451925 32.265113061 - -31.350416893 32.260921198 - -31.395913817 32.352429166 -} -8593967bfffffff -{ - -5.505638452 -113.817963384 - -5.570606648 -113.867592822 - -5.649298269 -113.845125227 - -5.663085977 -113.772944753 - -5.598073124 -113.723227987 - -5.519317233 -113.745779040 -} -85540907fffffff -{ - 13.725501177 -11.123588212 - 13.661453085 -11.185518327 - 13.584205411 -11.160874723 - 13.570976828 -11.074443480 - 13.634911313 -11.012550409 - 13.712187857 -11.037051424 -} -850b1363fffffff -{ - 60.150792469 79.625657582 - 60.064714161 79.693786009 - 60.048419511 79.879352470 - 60.118129443 79.997506966 - 60.204303399 79.930004666 - 60.220672043 79.743719548 -} -853da353fffffff -{ - 27.146074701 76.594887560 - 27.067065046 76.635900236 - 27.058927735 76.738237055 - 27.129754859 76.799783815 - 27.208861041 76.758940497 - 27.217043665 76.656380669 -} -85e3b02bfffffff -{ - -69.544660307 -126.501994075 - -69.512516968 -126.284366709 - -69.430950643 -126.276152455 - -69.381578711 -126.484208961 - -69.413565097 -126.700838491 - -69.495079612 -126.710407192 -} -8556a903fffffff -{ - 11.388694690 -37.657868569 - 11.464882216 -37.609267981 - 11.544157371 -37.655694156 - 11.547291047 -37.750727178 - 11.471133953 -37.799356125 - 11.391812744 -37.752923822 -} -850454abfffffff -{ - 74.941954794 166.753614404 - 74.844997868 166.742905071 - 74.794041408 167.056276170 - 74.839559221 167.382049152 - 74.936452678 167.396784163 - 74.987894687 167.081724635 -} -857fa44ffffffff -{ - -7.693555272 179.563998608 - -7.621160489 179.605270373 - -7.558541849 179.566976282 - -7.568263595 179.487517970 - -7.640546819 179.446253684 - -7.703219764 179.484440117 -} -85f17563fffffff -{ - -87.370730409 58.052006632 - -87.310818509 56.528727970 - -87.340929053 54.693737166 - -87.432704717 54.288316650 - -87.495321409 55.833283033 - -87.463382423 57.764567387 -} -8532f697fffffff -{ - 40.201188517 169.583289215 - 40.297684855 169.587718670 - 40.348826218 169.479789338 - 40.303387056 169.367551812 - 40.206883523 169.363399788 - 40.155826159 169.471207794 -} -851770c7fffffff -{ - 62.932671406 164.921014014 - 62.840403641 164.921457325 - 62.795953679 165.100213266 - 62.843482869 165.279129244 - 62.935728638 165.279944729 - 62.980468178 165.100585625 -} -85cb6bd3fffffff -{ - -31.731923294 61.717902447 - -31.826198325 61.732048823 - -31.864407403 61.834518594 - -31.808276631 61.922768821 - -31.713973395 61.908455717 - -31.675829032 61.806059069 -} -85f1608bfffffff -{ - -87.979696516 3.612528700 - -87.886343365 3.770235046 - -87.835667269 1.701559625 - -87.875063765 -0.597606409 - -87.967740661 -0.953265861 - -88.021833785 1.185623860 -} -85dfad43fffffff -{ - -61.009142717 -51.749939613 - -60.958479528 -51.587204805 - -60.867697695 -51.596467330 - -60.827568454 -51.767375461 - -60.877962672 -51.929632315 - -60.968754252 -51.921459438 -} -85ba54d7fffffff +859404b7fffffff { - -30.531509489 175.567546269 - -30.447736421 175.522311982 - -30.438788805 175.420175110 - -30.513676466 175.363067000 - -30.597573241 175.408244605 - -30.606458584 175.510587347 + -10.179812191 124.017171242 + -10.267731219 124.033512003 + -10.302632558 124.118515515 + -10.249602452 124.187232329 + -10.161618401 124.170889321 + -10.126729453 124.085831686 } -85035c13fffffff +85786803fffffff { - 80.385558395 -72.417461713 - 80.342958394 -72.888910323 - 80.256727270 -72.882806803 - 80.213093768 -72.413033278 - 80.255123301 -71.945575204 - 80.341351741 -71.943901733 + -1.192449504 -125.718520747 + -1.270932588 -125.751308175 + -1.332554112 -125.706780703 + -1.315727735 -125.629558616 + -1.237344998 -125.596800509 + -1.175688362 -125.641235111 +} +85126493fffffff +{ + 60.197357550 -104.460371690 + 60.117180015 -104.557098502 + 60.033505597 -104.468544717 + 60.029774591 -104.283689769 + 60.109765764 -104.186435468 + 60.193674404 -104.274560187 +} +850482cffffffff +{ + 65.545936402 140.088038291 + 65.459259751 140.182671695 + 65.448907164 140.412636390 + 65.525163435 140.549500053 + 65.612105128 140.455914569 + 65.622525862 140.224410615 +} +85f12baffffffff +{ + -86.395219689 100.653380953 + -86.398396888 99.207096017 + -86.477232976 98.556359832 + -86.554496543 99.390651511 + -86.550923780 100.902956530 + -86.470493657 101.512998698 +} +85d73417fffffff +{ + -58.756580920 39.639256337 + -58.688563064 39.554260257 + -58.682569780 39.397943220 + -58.744649892 39.325863225 + -58.812914448 39.410554131 + -58.818851999 39.567632630 +} +85d22e97fffffff +{ + -46.907116274 -112.482281879 + -46.846895805 -112.370589413 + -46.750564986 -112.391071537 + -46.714425755 -112.522818443 + -46.774504967 -112.634387369 + -46.870864384 -112.614333335 +} +85c0c50ffffffff +{ + -42.111164644 -7.665175380 + -42.202280992 -7.705892427 + -42.273288072 -7.619101683 + -42.253086640 -7.491580122 + -42.161926209 -7.451109836 + -42.091011169 -7.537913835 +} +858543d3fffffff +{ + 1.073714178 66.744785835 + 0.996270524 66.759113771 + 0.971319108 66.840954392 + 1.023878446 66.908405322 + 1.101304025 66.893981024 + 1.126188446 66.812202100 +} +850fa5a3fffffff +{ + 69.461167493 -79.661399315 + 69.404173714 -79.881193012 + 69.309759341 -79.849267318 + 69.272257953 -79.599450908 + 69.328935497 -79.380207945 + 69.423429417 -79.410227106 +} +853a5d7bfffffff +{ + 24.135334922 -42.390547895 + 24.055455243 -42.433878631 + 23.977611869 -42.378668412 + 23.979526518 -42.280139853 + 24.059355148 -42.236654884 + 24.137320274 -42.291852446 +} +85615d77fffffff +{ + 4.971876010 71.876406309 + 5.056332946 71.849583314 + 5.076316396 71.769707026 + 5.011917368 71.716723943 + 4.927557121 71.743524788 + 4.907499259 71.823330928 +} +85611bbbfffffff +{ + 8.547895276 78.347055034 + 8.636471912 78.319408962 + 8.656621627 78.231840084 + 8.588255673 78.171989990 + 8.499758513 78.199628702 + 8.479547841 78.287124962 +} +8533ab5bfffffff +{ + 33.552092281 176.283827254 + 33.648529753 176.295587575 + 33.705064991 176.201579154 + 33.665058787 176.095852573 + 33.568573661 176.084314220 + 33.512142248 176.178280277 +} +85e05387fffffff +{ + -56.176308219 51.148971472 + -56.092482773 51.183509361 + -56.040178568 51.079999606 + -56.071488801 50.942015179 + -56.155147913 50.906952915 + -56.207663290 51.010397927 +} +85b98853fffffff +{ + -28.631365255 135.964305025 + -28.538995577 135.958498791 + -28.499964872 135.866850478 + -28.553182581 135.780949719 + -28.645497774 135.786556291 + -28.684649864 135.878263209 +} +8531352ffffffff +{ + 46.319261863 118.670800571 + 46.264565750 118.755718852 + 46.278332315 118.871958210 + 46.346905705 118.903645552 + 46.401804629 118.818717665 + 46.387927055 118.702111337 +} +85e86823fffffff +{ + -54.089256391 -91.647936800 + -54.012315209 -91.553676687 + -53.926790447 -91.616463801 + -53.918063740 -91.773200108 + -53.994879522 -91.867723137 + -54.080547376 -91.805248558 +} +85daa617fffffff +{ + -47.058652275 173.863512506 + -46.979075959 173.808418002 + -46.976218635 173.679362193 + -47.052989289 173.605075144 + -47.132665057 173.660061608 + -47.135470702 173.789443862 +} +858ad2dbfffffff +{ + 0.567945775 -58.316439703 + 0.647556771 -58.268464825 + 0.728639430 -58.309885001 + 0.730090331 -58.399210563 + 0.650532649 -58.447130555 + 0.569470779 -58.405779951 +} +85032a67fffffff +{ + 86.173541761 -79.861781859 + 86.209187295 -81.093418211 + 86.153976384 -82.212525311 + 86.064924843 -82.082402995 + 86.030796649 -80.886598936 + 86.084239788 -79.785500392 +} +85f2c6d3fffffff +{ + -81.442840346 -104.270020376 + -81.473151726 -103.689014028 + -81.410356842 -103.224571673 + -81.318089847 -103.343074876 + -81.288361474 -103.915207139 + -81.350324150 -104.377638080 +} +8579365bfffffff +{ + 9.963611413 -139.532689201 + 9.874541284 -139.567490798 + 9.800763188 -139.508296847 + 9.816027168 -139.414366928 + 9.905030547 -139.379553647 + 9.978836697 -139.438681828 +} +85251433fffffff +{ + 49.788887437 91.126146365 + 49.696375371 91.157531179 + 49.667450663 91.293367423 + 49.730905610 91.398145902 + 49.823420701 91.367226404 + 49.852478095 91.231062648 +} +85006a97fffffff +{ + 82.294881016 -20.341840207 + 82.378000520 -20.403629996 + 82.414374095 -21.021992753 + 82.366885110 -21.569855001 + 82.283976423 -21.495023836 + 82.248336821 -20.885322570 +} +85338c4ffffffff +{ + 34.674319312 176.830539024 + 34.770653104 176.843080957 + 34.827747575 176.748323489 + 34.788405179 176.641062218 + 34.692020928 176.628746526 + 34.635029388 176.723465642 +} +8550e52bfffffff +{ + 24.841211676 -133.071663406 + 24.760728549 -133.109245383 + 24.685946906 -133.051568671 + 24.691666046 -132.956410903 + 24.772099067 -132.918841706 + 24.846863072 -132.976417361 +} +8561624ffffffff +{ + 2.224827291 75.209084870 + 2.310943399 75.182146609 + 2.333095324 75.099326951 + 2.269190914 75.043515707 + 2.183167714 75.070439304 + 2.160956051 75.153188885 +} +856eee77fffffff +{ + 11.739656759 -118.020195285 + 11.817824679 -117.973958093 + 11.898071999 -118.022426021 + 11.900057261 -118.117152000 + 11.821834871 -118.163295884 + 11.741681642 -118.114807287 +} +85ecc4d7fffffff +{ + -70.452771629 131.580192295 + -70.407341673 131.345860578 + -70.454973949 131.107233083 + -70.548341031 131.102047443 + -70.594025817 131.337582746 + -70.546087345 131.577098734 +} +85ec5caffffffff +{ + -76.743756260 133.975866007 + -76.705316749 133.635731054 + -76.756044548 133.303571856 + -76.845636530 133.310039978 + -76.884425145 133.652908879 + -76.833270028 133.986567865 +} +851656bbfffffff +{ + 53.625388234 171.581714830 + 53.712360391 171.590220898 + 53.760742836 171.459848431 + 53.722062959 171.321120923 + 53.635074252 171.313027004 + 53.586781719 171.443248214 +} +85d9ac3bfffffff +{ + -52.598973338 145.131081838 + -52.511838614 145.108588332 + -52.476404571 144.969114140 + -52.528025325 144.851897988 + -52.615159829 144.873996068 + -52.650674029 145.013705987 +} +85e2e0affffffff +{ + -55.516988509 -131.160781803 + -55.481600559 -131.016399872 + -55.389821061 -131.001149165 + -55.333523836 -131.129731140 + -55.368849670 -131.273621012 + -55.460534563 -131.289419998 +} +85749003fffffff +{ + -1.478052813 -12.208960228 + -1.405319166 -12.173945520 + -1.332003654 -12.212262798 + -1.331356031 -12.285669436 + -1.404130681 -12.320771033 + -1.477511975 -12.282379106 +} +85028d43fffffff +{ + 73.032164099 -121.374773768 + 72.943882612 -121.452281197 + 72.881131180 -121.247785246 + 72.906323899 -120.965470690 + 72.994503240 -120.885598395 + 73.057593324 -121.090396929 +} +85361583fffffff +{ + 34.054240365 -149.842532931 + 33.973938038 -149.878452743 + 33.909100777 -149.806502603 + 33.924565087 -149.698651595 + 34.004863528 -149.662670616 + 34.069701600 -149.734601613 +} +85001d87fffffff +{ + 80.908603318 41.119491311 + 80.953876264 41.590073081 + 81.043786942 41.557145591 + 81.088265463 41.043596943 + 81.042216981 40.569023651 + 80.952472322 40.611970101 +} +85a75d03fffffff +{ + -24.787225740 107.479797520 + -24.861206608 107.516017560 + -24.867233565 107.592755585 + -24.799383521 107.633164547 + -24.725507606 107.596968597 + -24.719376862 107.520339506 +} +85d43273fffffff +{ + -49.717603789 -156.728407457 + -49.638047050 -156.681559398 + -49.573871535 -156.772402356 + -49.589191945 -156.910050513 + -49.668710079 -156.957116478 + -49.732946503 -156.866316975 +} +85a2c573fffffff +{ + -25.876706765 54.532642742 + -25.970315206 54.539999835 + -26.011336646 54.630571371 + -25.958659742 54.713761108 + -25.864989112 54.706257654 + -25.824057505 54.615710877 +} +85ed1d4bfffffff +{ + -67.180064133 160.908286162 + -67.173295624 160.702314444 + -67.245501849 160.592742335 + -67.324666789 160.689892466 + -67.331356597 160.897235272 + -67.258960350 161.006051010 +} +8502a093fffffff +{ + 77.069468403 -132.607681137 + 77.023565589 -132.961484154 + 76.932577582 -132.977535781 + 76.887604008 -132.644682553 + 76.933075166 -132.293763274 + 77.023948207 -132.272819646 +} +85eed8dbfffffff +{ + -64.573232630 -26.603835132 + -64.494651999 -26.482545238 + -64.410512565 -26.583201750 + -64.404674266 -26.804310264 + -64.482947101 -26.926191267 + -64.567365878 -26.826378928 +} +85ec0ba7fffffff +{ + -72.784188493 141.215781491 + -72.753412607 140.940626565 + -72.812444790 140.706937722 + -72.902603514 140.748129869 + -72.933561452 141.025383104 + -72.874177320 141.259336961 +} +8556a887fffffff +{ + 12.263939925 -38.358459545 + 12.339577795 -38.309757915 + 12.418145553 -38.356124381 + 12.421120527 -38.451195862 + 12.345515329 -38.499922903 + 12.266902478 -38.453553184 } -85eb83cffffffff +85e4ec2bfffffff +{ + -59.412920881 87.949875964 + -59.322786289 87.883077312 + -59.307580901 87.697791017 + -59.382398246 87.578430333 + -59.472666948 87.644474061 + -59.487984585 87.830636229 +} +85b3733bfffffff +{ + -22.137596905 -65.352880037 + -22.214928647 -65.403964780 + -22.291584673 -65.362188111 + -22.290873546 -65.269364913 + -22.213578157 -65.218377678 + -22.136957561 -65.260116030 +} +85741b4ffffffff +{ + -0.664960784 -5.649271314 + -0.727665421 -5.672839454 + -0.778746061 -5.618139509 + -0.767029218 -5.539875198 + -0.704277133 -5.516406062 + -0.653289255 -5.571102123 +} +851b820bfffffff +{ + 51.507958559 -57.609022868 + 51.477678041 -57.752068675 + 51.386329245 -57.784858299 + 51.325390666 -57.675125338 + 51.355584393 -57.532607816 + 51.446803203 -57.499296205 +} +85010133fffffff +{ + 73.517017132 25.362441094 + 73.572336001 25.554722511 + 73.649568894 25.453339884 + 73.671164685 25.157503692 + 73.615403567 24.965621060 + 73.538489805 25.069161735 +} +85e4dd67fffffff +{ + -54.329347899 85.877657195 + -54.240141570 85.824927636 + -54.223558962 85.666035428 + -54.296062215 85.559241229 + -54.385374686 85.611377289 + -54.402078116 85.770902735 +} +85da1d8bfffffff +{ + -51.627342584 166.167417284 + -51.546378192 166.116092972 + -51.536263860 165.972204909 + -51.607120755 165.879257853 + -51.688168074 165.930358946 + -51.698275637 166.074631241 +} +85e8e30bfffffff +{ + -60.635851939 -80.017964720 + -60.623211655 -79.836754721 + -60.543023709 -79.759996919 + -60.475723179 -79.863837159 + -60.488350358 -80.044061394 + -60.568291091 -80.121427592 +} +851525d7fffffff +{ + 59.871922166 106.962277905 + 59.820075022 107.111807880 + 59.854363162 107.272789545 + 59.940747283 107.284802995 + 59.992848498 107.134868956 + 59.958310762 106.973325036 +} +85b2922ffffffff +{ + -31.349194432 -83.054270520 + -31.417309571 -83.117406957 + -31.494428183 -83.074997070 + -31.503436453 -82.969414167 + -31.435330624 -82.906299583 + -31.358207247 -82.948745862 +} +8573085bfffffff +{ + 10.033737264 135.246648819 + 9.938665568 135.262924090 + 9.905307894 135.355009293 + 9.967032953 135.430845389 + 10.062116093 135.414587610 + 10.095462794 135.322476171 +} +8510aa4ffffffff +{ + 54.164231267 49.830208770 + 54.097846489 49.935731446 + 54.121170984 50.086421973 + 54.211001712 50.132035006 + 54.277533063 50.026424473 + 54.254086831 49.875287871 +} +857b1617fffffff +{ + -5.085096074 52.214180906 + -4.997273819 52.210392210 + -4.952053989 52.137232552 + -4.994663311 52.067762607 + -5.082576515 52.071503959 + -5.127789443 52.144762664 +} +85f0c56bfffffff +{ + -72.728437451 55.894620746 + -72.639411957 55.939455274 + -72.580585917 55.719969526 + -72.610447672 55.455493413 + -72.699284070 55.408459076 + -72.758448920 55.628091645 +} +85629347fffffff +{ + 2.692318786 54.183655439 + 2.773652291 54.179382728 + 2.819472862 54.110474834 + 2.783970884 54.045746370 + 2.702556565 54.049978262 + 2.656725030 54.118979496 +} +85ee6cd3fffffff +{ + -69.224207195 -61.688880040 + -69.185633957 -61.441751913 + -69.090928893 -61.409895658 + -69.034923108 -61.623122960 + -69.073234143 -61.868733068 + -69.167811753 -61.902629368 +} +85ba60abfffffff +{ + -31.881994789 170.491323405 + -31.794612552 170.448737734 + -31.781866831 170.341172878 + -31.856540081 170.275971759 + -31.944035613 170.318460008 + -31.956744581 170.426247201 +} +85265d33fffffff +{ + 35.900715773 -89.931263058 + 35.965710364 -89.859740529 + 36.052741648 -89.894905849 + 36.074809943 -90.001780428 + 36.009770151 -90.073376216 + 35.922707328 -90.038024316 +} +8502a163fffffff +{ + 76.069814849 -127.372952774 + 76.031266839 -127.713183172 + 75.942121065 -127.762356996 + 75.891725631 -127.475319453 + 75.929945776 -127.138107208 + 76.018886657 -127.084927305 +} +853983bbfffffff +{ + 31.514535513 -8.305063256 + 31.447651970 -8.381550447 + 31.357109191 -8.355009464 + 31.333460779 -8.252198036 + 31.400248117 -8.175787745 + 31.490779940 -8.202111837 +} +8526aedbfffffff +{ + 41.817845235 -104.770693659 + 41.889825953 -104.699691122 + 41.970635410 -104.752820575 + 41.979439023 -104.877094787 + 41.907414812 -104.948050456 + 41.826630523 -104.894779205 +} +85b75c2bfffffff +{ + -28.984539572 -100.933096455 + -28.922049319 -100.860621291 + -28.836642560 -100.890689741 + -28.813630354 -100.993041092 + -28.875976270 -101.065550326 + -28.961478624 -101.035674520 +} +85cd5b47fffffff +{ + -47.175245469 76.999922895 + -47.089766153 76.974836242 + -47.066099738 76.850770245 + -47.127752834 76.751449255 + -47.213263124 76.776073822 + -47.237089702 76.900481953 +} +854d4e1bfffffff +{ + 20.051232805 -62.321998573 + 20.121023402 -62.277131260 + 20.182316802 -62.315049082 + 20.173837838 -62.397761370 + 20.104116958 -62.442566918 + 20.042805376 -62.404721992 +} +85122a8ffffffff +{ + 59.611696151 -115.725674682 + 59.527296222 -115.787348707 + 59.454225557 -115.678416898 + 59.465314883 -115.507873751 + 59.549618284 -115.445474604 + 59.622929298 -115.554341384 +} +85f29ed7fffffff { - -59.177230419 -172.006849851 - -59.118172075 -171.936441817 - -59.053531524 -172.021486192 - -59.047896332 -172.176653758 - -59.106885881 -172.247154844 - -59.171579375 -172.162396283 + -89.229209733 -79.647023052 + -89.218393521 -72.858258706 + -89.130782289 -70.950212336 + -89.059766446 -74.887886207 + -89.068286998 -80.533957804 + -89.149824657 -83.247709656 +} +85c35d47fffffff +{ + -35.822505864 -62.111829367 + -35.891909614 -62.162779291 + -35.951981398 -62.119477642 + -35.942642629 -62.025279713 + -35.873281543 -61.974446254 + -35.813216584 -62.017694167 +} +85c494cbfffffff +{ + -40.759802649 -48.174954785 + -40.821141137 -48.241490765 + -40.902038286 -48.214156080 + -40.921648572 -48.120038554 + -40.860233433 -48.053391109 + -40.779284742 -48.080972605 +} +85162567fffffff +{ + 58.563726324 163.710573815 + 58.475103664 163.714587397 + 58.434415367 163.869501242 + 58.482100001 164.020877741 + 58.570716352 164.017786407 + 58.611655113 163.862396232 +} +85648377fffffff +{ + 18.854892573 97.392417510 + 18.946957800 97.366772745 + 18.972461330 97.268690285 + 18.905892683 97.196295814 + 18.813825166 97.221990454 + 18.788328527 97.320029809 +} +85f12693fffffff +{ + -83.188128618 151.473498654 + -83.257342934 151.032194808 + -83.333330038 151.357165220 + -83.339232156 152.134589384 + -83.268956941 152.569608893 + -83.193843445 152.233747207 +} +85bb9c67fffffff +{ + -35.604279734 -171.360093415 + -35.521404038 -171.309442584 + -35.441783489 -171.371842817 + -35.445006742 -171.484748280 + -35.527800235 -171.535453066 + -35.607452663 -171.473198811 +} +852d663bfffffff +{ + 47.778823060 36.698744799 + 47.695363110 36.678955402 + 47.637223124 36.781222198 + 47.662484783 36.903239223 + 47.745890557 36.923244006 + 47.804088969 36.821016795 +} +85384dd7fffffff +{ + 35.476678577 12.148695409 + 35.382164744 12.154846864 + 35.340829694 12.257718127 + 35.393984469 12.354600846 + 35.488548662 12.348637976 + 35.529907836 12.245603644 +} +8594c417fffffff +{ + -16.368127107 128.766379317 + -16.451597236 128.782509324 + -16.485008743 128.869419725 + -16.434959277 128.940242599 + -16.351445508 128.924118095 + -16.318024791 128.837165150 +} +85ac536ffffffff +{ + -20.640748009 4.897168000 + -20.726771917 4.879041493 + -20.788823897 4.951388589 + -20.764747358 5.041787750 + -20.678727262 5.059741392 + -20.616779750 4.987468804 +} +85bd547bfffffff +{ + -38.746926844 30.997975737 + -38.667548494 31.002911114 + -38.625864856 30.907967640 + -38.663559183 30.808040876 + -38.742941988 30.803016891 + -38.784626110 30.898008253 +} +85a0ecb7fffffff +{ + -14.466738653 -141.500857066 + -14.381217587 -141.481408393 + -14.317615154 -141.549494904 + -14.339442915 -141.637096044 + -14.424971208 -141.656683410 + -14.488664628 -141.588530998 +} +857c445bfffffff +{ + 2.085670928 -27.351098208 + 2.164854699 -27.305888291 + 2.246697582 -27.351323782 + 2.249413813 -27.442014765 + 2.170222266 -27.487290960 + 2.088322239 -27.441809987 +} +859a8957fffffff +{ + -7.507121732 -169.939487522 + -7.429722447 -169.901117925 + -7.364774790 -169.950473597 + -7.377147070 -170.038117883 + -7.454446701 -170.076525965 + -7.519473676 -170.027251453 +} +8500dd0ffffffff +{ + 85.644269945 105.322080034 + 85.595309164 106.361408686 + 85.639348783 107.463083197 + 85.733747862 107.551579634 + 85.784277516 106.491662943 + 85.738806379 105.363714143 +} +85a72c0bfffffff +{ + -30.829495420 112.279746913 + -30.773076805 112.214339696 + -30.784899949 112.118840483 + -30.853213228 112.088522469 + -30.909788709 112.153914549 + -30.897893883 112.249640141 +} +85026c0ffffffff +{ + 74.472096375 -68.657433479 + 74.431769093 -68.970232447 + 74.340184936 -68.987119890 + 74.288987458 -68.694416130 + 74.328987623 -68.383628950 + 74.420510286 -68.363538344 +} +85ab5b6ffffffff +{ + -20.852891927 76.876667056 + -20.947021274 76.901078071 + -20.974693273 77.000368653 + -20.908216502 77.075121340 + -20.814140984 77.050601760 + -20.786488339 76.951437867 +} +850fb283fffffff +{ + 69.553785054 -95.357255752 + 69.479692965 -95.528959876 + 69.391794162 -95.435289960 + 69.377747815 -95.171282826 + 69.451531681 -94.999067215 + 69.539669631 -95.091360976 +} +85e0a83bfffffff +{ + -54.200959307 63.700185637 + -54.112269287 63.703870123 + -54.071100516 63.578794770 + -54.118402417 63.449827061 + -54.207010586 63.445519557 + -54.248399098 63.570802266 +} +85ec5d3bfffffff +{ + -77.456914185 130.868797065 + -77.414743395 130.517848316 + -77.461441638 130.154857969 + -77.550739519 130.140664840 + -77.593318171 130.494239576 + -77.546188035 130.859378414 +} +85d6266bfffffff +{ + -52.172017077 37.001484903 + -52.109232183 36.938657179 + -52.098656931 36.813698858 + -52.150886024 36.751082328 + -52.213859679 36.813676203 + -52.224415404 36.939121703 +} +8500342ffffffff +{ + 76.032947212 39.640660366 + 76.076347936 39.935254418 + 76.161989231 39.903548708 + 76.204084473 39.573216932 + 76.160160115 39.277202727 + 76.074666860 39.312932911 +} +85105853fffffff +{ + 63.360150363 61.749401596 + 63.288549549 61.864386697 + 63.297856006 62.068674528 + 63.378813207 62.158879658 + 63.450592074 62.044147119 + 63.441235494 61.838953665 +} +85773373fffffff +{ + 6.383509189 151.739330398 + 6.289784482 151.752534850 + 6.254075496 151.838380228 + 6.312040579 151.910993169 + 6.405705099 151.897827333 + 6.441464755 151.812009912 +} +8501500bfffffff +{ + 77.253028037 17.801124645 + 77.318469209 18.012398315 + 77.394416111 17.829993989 + 77.404416728 17.433463509 + 77.338459264 17.224090476 + 77.263017794 17.409309944 +} +85ef1477fffffff +{ + -83.733607734 -21.479020142 + -83.649075922 -21.069553683 + -83.568773906 -21.527690519 + -83.571917354 -22.385872488 + -83.655437316 -22.807630309 + -83.736827195 -22.359294886 +} +858e7363fffffff +{ + -13.684828481 -79.226314626 + -13.763570603 -79.284525261 + -13.851584774 -79.243753452 + -13.860830303 -79.144754198 + -13.782080617 -79.086582369 + -13.694092985 -79.127370831 +} +85f2a2cffffffff +{ + -85.565655275 -170.183256330 + -85.654546265 -170.128649683 + -85.690853264 -169.053187928 + -85.636871103 -168.059491670 + -85.548154213 -168.156001157 + -85.513216312 -169.204549199 +} +85cea80ffffffff +{ + -41.496773502 -74.067607592 + -41.418873302 -74.025915821 + -41.346120227 -74.091566901 + -41.351114576 -74.198920672 + -41.428979643 -74.240891314 + -41.501885675 -74.175229749 +} +85e875a7fffffff +{ + -58.470592379 -93.400650002 + -58.395824052 -93.292252476 + -58.311707484 -93.358624463 + -58.302218328 -93.532974693 + -58.376845346 -93.641655799 + -58.461102741 -93.575705281 +} +85d14c3bfffffff +{ + -39.506087970 20.848242016 + -39.594040378 20.847033120 + -39.638585356 20.935641329 + -39.595159326 21.025246444 + -39.507306124 21.026229082 + -39.462779694 20.937832616 +} +85eadecbfffffff +{ + -68.971186563 175.299515184 + -68.983341271 175.098004840 + -69.060612322 175.039374021 + -69.125794295 175.183548382 + -69.113431940 175.386300129 + -69.036095983 175.443631803 +} +850075d3fffffff +{ + 80.850280834 7.955868996 + 80.926038077 8.171198376 + 80.996447398 7.828499329 + 80.990290222 7.267690588 + 80.913979387 7.058909581 + 80.844376664 7.404288491 +} +85ece94bfffffff +{ + -73.890352511 125.460982159 + -73.838745833 125.194097367 + -73.878462259 124.889876391 + -73.970100545 124.850703544 + -74.022067587 125.118754660 + -73.982034042 125.424816154 +} +85a5216ffffffff +{ + -10.966026724 -26.092703153 + -10.884274096 -26.047331035 + -10.805551867 -26.093224932 + -10.808553567 -26.184542347 + -10.890347474 -26.229986830 + -10.969098393 -26.184041624 +} +850049d7fffffff +{ + 83.837709257 -40.061170643 + 83.914527997 -40.413888805 + 83.920935254 -41.268368787 + 83.850304179 -41.749101306 + 83.774435166 -41.383091875 + 83.768243764 -40.549299711 +} +85270b43fffffff +{ + 47.338593411 -94.370169998 + 47.271913660 -94.458757536 + 47.185458882 -94.413331760 + 47.165529502 -94.279681084 + 47.232012573 -94.190978525 + 47.318621568 -94.236040489 +} +85a0d433fffffff +{ + -11.728438993 -136.413251351 + -11.647282540 -136.398968485 + -11.587371900 -136.464830983 + -11.608532553 -136.545059088 + -11.689711856 -136.559471641 + -11.749707767 -136.493526402 +} +85c10d3bfffffff +{ + -27.945126173 -8.484870168 + -28.036004986 -8.519976302 + -28.108430559 -8.447628211 + -28.089868817 -8.340157332 + -27.998931842 -8.305221722 + -27.926614672 -8.377586150 +} +856e203bfffffff +{ + 2.628915654 -117.099650293 + 2.698623073 -117.055840754 + 2.772556543 -117.100692617 + 2.776690820 -117.189376312 + 2.706917464 -117.233107998 + 2.633075731 -117.188233999 +} +85942983fffffff +{ + -8.826491252 127.195037989 + -8.916332405 127.211397751 + -8.950840391 127.298524199 + -8.895500502 127.369338227 + -8.805604293 127.352981437 + -8.771102990 127.265807581 +} +85a21263fffffff +{ + -23.628551833 47.077153546 + -23.538392571 47.074986862 + -23.499044207 46.991401536 + -23.549890099 46.909874881 + -23.640121402 46.911976211 + -23.679434806 46.995669620 +} +8576f293fffffff +{ + -5.094414951 159.599943531 + -5.180820097 159.610855359 + -5.209107619 159.687823993 + -5.151075392 159.753835822 + -5.064741052 159.742963978 + -5.036368114 159.666040321 +} +853ab6c7fffffff +{ + 27.942331044 -59.530564176 + 27.863968285 -59.552516427 + 27.799732393 -59.492096752 + 27.813762218 -59.409636891 + 27.892155959 -59.387504343 + 27.956489003 -59.448011930 +} +859a4247fffffff +{ + -10.489026048 -178.891860745 + -10.413695983 -178.849705314 + -10.347409379 -178.890818461 + -10.356398293 -178.973975932 + -10.431614337 -179.016130034 + -10.497955399 -178.975128130 +} +85d2c3affffffff +{ + -36.999702921 -105.144191343 + -36.934764516 -105.057022154 + -36.842370198 -105.085170009 + -36.814837179 -105.200212638 + -36.879626399 -105.287377262 + -36.972097650 -105.259504284 +} +85e9141bfffffff +{ + -69.885113692 -108.954203303 + -69.915660820 -108.721565029 + -69.859651076 -108.514023291 + -69.773445265 -108.539804794 + -69.743224569 -108.771140748 + -69.798884686 -108.977994767 +} +85f29623fffffff +{ + -88.617735469 115.609325987 + -88.643462047 111.929293804 + -88.730906106 110.962427584 + -88.794955811 114.115132062 + -88.765522122 118.194174604 + -88.676042758 118.698540891 +} +854856abfffffff +{ + 28.670292401 -111.715798358 + 28.752696168 -111.657444455 + 28.837862335 -111.709560789 + 28.840568632 -111.820100753 + 28.758120908 -111.878369639 + 28.673010845 -111.826183891 +} +8582a98ffffffff +{ + -0.464928883 10.778780181 + -0.377040676 10.789673061 + -0.329036212 10.721303719 + -0.368842490 10.642093515 + -0.456650198 10.631163635 + -0.504732142 10.699480882 +} +858d5123fffffff +{ + -13.917596213 103.269878360 + -13.839967021 103.248626666 + -13.821243169 103.161817563 + -13.880197216 103.096280465 + -13.957816055 103.117584088 + -13.976491278 103.204372946 +} +85b4ed83fffffff +{ + -22.368222345 -162.661370011 + -22.279055355 -162.621841194 + -22.203583514 -162.685320289 + -22.217200919 -162.788264197 + -22.306289451 -162.827885390 + -22.381839061 -162.764470576 +} +85420babfffffff +{ + 26.515693499 67.267487580 + 26.440249083 67.318870943 + 26.438849903 67.421102993 + 26.512905546 67.472179741 + 26.588479667 67.420900330 + 26.589868420 67.318439801 +} +850074affffffff +{ + 80.862991778 9.616320206 + 80.937815399 9.846844066 + 81.009828300 9.516969876 + 81.006219514 8.953244789 + 80.930808283 8.728888510 + 80.859591325 9.061985610 +} +8555086ffffffff +{ + 21.213258187 -10.387069163 + 21.145932289 -10.454563299 + 21.061238563 -10.428616413 + 21.043855467 -10.335344584 + 21.111068996 -10.267898756 + 21.195777854 -10.293676316 +} +85d112bbfffffff +{ + -40.863545598 4.747748879 + -40.956475145 4.724394716 + -41.016873380 4.816741292 + -40.984264983 4.932321933 + -40.891357948 4.955394392 + -40.831036642 4.863168057 +} +85d96a4bfffffff +{ + -57.106842676 126.688609576 + -57.050838413 126.548503659 + -57.088740021 126.392713365 + -57.182854815 126.376567870 + -57.239058089 126.517021832 + -57.200946992 126.673273586 +} +853cc34bfffffff +{ + 22.130689605 92.954287073 + 22.219996595 92.927113038 + 22.242337543 92.827892641 + 22.175384396 92.755902881 + 22.086088825 92.783114905 + 22.063734923 92.882278833 +} +8556487bfffffff +{ + 8.355718649 -26.287207180 + 8.430145619 -26.242980406 + 8.509875531 -26.287670930 + 8.515245665 -26.376636248 + 8.440824632 -26.420930949 + 8.361027490 -26.376192488 +} +85f3b13bfffffff +{ + -79.872796642 166.842147707 + -79.949814869 166.669071158 + -80.009591320 166.994457341 + -79.991608996 167.494034365 + -79.914102184 167.661212480 + -79.855063506 167.334775131 +} +851e43c3fffffff +{ + 47.640995035 29.994007124 + 47.555312212 29.981245266 + 47.502541412 30.091020516 + 47.535392480 30.213593609 + 47.621043310 30.226603202 + 47.673875221 30.116792241 +} +85bf95a3fffffff +{ + -30.943930116 164.988177388 + -30.853477082 164.950505678 + -30.835605438 164.841653702 + -30.908191515 164.770256563 + -30.998741785 164.807793608 + -31.016608775 164.916862852 +} +85241ad7fffffff +{ + 41.492082770 101.358577438 + 41.403359524 101.367802313 + 41.369357551 101.469937898 + 41.423921092 101.562977702 + 41.512585619 101.554079935 + 41.546745514 101.451815355 +} +850b5577fffffff +{ + 67.846226221 77.455857653 + 67.834221424 77.688907631 + 67.903026281 77.819922555 + 67.984150209 77.717212221 + 67.996153503 77.482469290 + 67.927034292 77.352137683 +} +8548e417fffffff +{ + 28.501429242 -109.234362948 + 28.582893377 -109.174251050 + 28.669153254 -109.224671348 + 28.673899617 -109.335288949 + 28.592385069 -109.395332613 + 28.506174587 -109.344827220 +} +858e20dbfffffff +{ + -6.524571646 -82.914482450 + -6.602644492 -82.972652839 + -6.691725483 -82.933518414 + -6.702706258 -82.836183046 + -6.624603317 -82.778031908 + -6.535549719 -82.817196739 +} +851ee9bbfffffff +{ + 44.160488312 28.716563419 + 44.071121322 28.705672310 + 44.017910401 28.811948017 + 44.054006120 28.929161215 + 44.143343755 28.940283597 + 44.196615178 28.833961719 +} +85b993abfffffff +{ + -26.541409221 140.094731077 + -26.448871662 140.084470800 + -26.413106684 139.990446197 + -26.469765282 139.906597458 + -26.562272761 139.916660978 + -26.598151862 140.010769994 +} +8506ae53fffffff +{ + 73.143279741 -45.554830312 + 73.136830484 -45.862814054 + 73.053978010 -45.985928382 + 72.977881795 -45.802645036 + 72.984315360 -45.497350594 + 73.066860589 -45.372666217 +} +85ca1cc3fffffff +{ + -41.796837200 54.808732463 + -41.883593854 54.817525430 + -41.927108662 54.922812700 + -41.883808226 55.019271638 + -41.797002376 55.010281723 + -41.753546053 54.905029897 +} +8559a5b7fffffff +{ + 17.790919926 -1.386120149 + 17.704625816 -1.371142394 + 17.668315979 -1.289819842 + 17.718301373 -1.223331623 + 17.804699448 -1.238219130 + 17.841008161 -1.319685275 +} +85ba2873fffffff +{ + -33.877022639 176.433440542 + -33.793927965 176.385796863 + -33.787298788 176.280165181 + -33.863833442 176.221956680 + -33.947049207 176.269545720 + -33.953609163 176.375398280 +} +85974e63fffffff +{ + -18.542777107 22.535572901 + -18.447057864 22.543426162 + -18.391895221 22.460095334 + -18.432421336 22.368916892 + -18.528106894 22.360998149 + -18.583300095 22.444323266 +} +850422b3fffffff +{ + 76.872225046 137.481291733 + 76.785245407 137.672339290 + 76.779031896 138.097009898 + 76.859729556 138.335907942 + 76.947194525 138.148083378 + 76.953477196 137.718093040 +} +850d814ffffffff +{ + 67.039560008 -174.239031959 + 66.951899731 -174.321492699 + 66.882886817 -174.170452446 + 66.901189413 -173.937324415 + 66.988582101 -173.853626432 + 67.057940252 -174.004286450 +} +8557a953fffffff +{ + 19.056187599 -38.184290952 + 18.980429975 -38.230070920 + 18.902563906 -38.179938609 + 18.900337300 -38.084063584 + 18.976020799 -38.038161097 + 19.054005098 -38.088255897 +} +853a4c9bfffffff +{ + 26.089179908 -40.096216163 + 26.008008026 -40.143394185 + 25.928069960 -40.088092379 + 25.929185153 -39.985642103 + 26.010299379 -39.938311960 + 26.090356149 -39.993583909 +} +8501323bfffffff +{ + 70.545410668 35.136355452 + 70.588639443 35.328475746 + 70.667067135 35.285874025 + 70.702101536 35.049294383 + 70.658484819 34.856789885 + 70.580222811 34.901244529 +} +85247683fffffff +{ + 46.657277555 106.300077792 + 46.568491660 106.301223714 + 46.527512005 106.404780993 + 46.575157570 106.507282262 + 46.663851788 106.506504410 + 46.704992282 106.402857554 +} +8525008ffffffff +{ + 51.509769831 94.525673403 + 51.417443235 94.551070812 + 51.384279610 94.686849625 + 51.443298488 94.797531245 + 51.535605149 94.772636675 + 51.568913157 94.636557371 +} +85034213fffffff +{ + 81.261848006 -68.812139719 + 81.224710926 -69.342094410 + 81.139584414 -69.367294255 + 81.091675054 -68.871744008 + 81.128235237 -68.347509518 + 81.213275787 -68.313126506 +} +859e6aaffffffff +{ + -20.444987962 157.147069682 + -20.356378568 157.120261558 + -20.332365180 157.022858962 + -20.396914404 156.952108137 + -20.485590398 156.978772499 + -20.509650662 157.076331680 +} +858e0ccffffffff +{ + -11.011586825 -82.232667372 + -11.090075890 -82.291443333 + -11.179244052 -82.251605300 + -11.189901380 -82.152962620 + -11.111393650 -82.094209909 + -11.022247280 -82.134076474 +} +85076167fffffff +{ + 63.137541330 -14.253247267 + 63.165714045 -14.407328958 + 63.111143173 -14.546665574 + 63.028586987 -14.531498378 + 63.000648068 -14.377937306 + 63.055032107 -14.239023091 } -851fb6affffffff +851fa0c3fffffff { - 48.497660484 1.925721659 - 48.449263238 1.828563490 - 48.362308334 1.845601013 - 48.323814534 1.959464161 - 48.372170510 2.056401960 - 48.459061423 2.039696867 + 50.537436996 4.984067180 + 50.457365392 4.999295466 + 50.432746787 5.120651211 + 50.488197687 5.227057963 + 50.568325094 5.212063320 + 50.592945921 5.090427842 } -852f9953fffffff -{ - 43.906552874 151.209592894 - 43.997477157 151.190605665 - 44.027917420 151.073677328 - 43.967426773 150.976018655 - 43.876588712 150.995251019 - 43.846154967 151.111897393 +850d85b7fffffff +{ + 68.718267186 -172.289799902 + 68.631067646 -172.386639605 + 68.559307966 -172.230723567 + 68.574390146 -171.978529537 + 68.661288297 -171.880346893 + 68.733406064 -172.035691714 +} +8503b687fffffff +{ + 79.410717315 -173.113995051 + 79.321413378 -173.300819959 + 79.246223008 -172.983853521 + 79.259656116 -172.482096574 + 79.348433062 -172.289772160 + 79.424305867 -172.604629208 +} +85c5730bfffffff +{ + -34.797760816 -30.463130155 + -34.877872544 -30.520425210 + -34.959820547 -30.468153832 + -34.961619036 -30.358394256 + -34.881391560 -30.301126069 + -34.799481425 -30.353590207 +} +85ca106bfffffff +{ + -42.414426447 52.563328931 + -42.500031395 52.569980170 + -42.545155745 52.673036354 + -42.504616909 52.769422724 + -42.418955989 52.762576773 + -42.373889780 52.659539284 +} +85c818d7fffffff +{ + -38.217671558 107.640302825 + -38.151142669 107.569815972 + -38.161237363 107.456467965 + -38.237917603 107.413276888 + -38.304625478 107.483686944 + -38.294473987 107.597365551 +} +85e148d7fffffff +{ + -63.995788998 46.702630378 + -63.911593716 46.760499724 + -63.850031356 46.639752329 + -63.872439114 46.461399508 + -63.956417049 46.402774805 + -64.018204717 46.523254605 +} +85e98193fffffff +{ + -71.119112193 -94.351525148 + -71.130293716 -94.074640742 + -71.056967446 -93.897014927 + -70.972878776 -93.995875207 + -70.961883875 -94.270511851 + -71.034792015 -94.448524289 +} +850f350ffffffff +{ + 70.473547234 -65.837709244 + 70.435666614 -66.096512045 + 70.341821580 -66.122620510 + 70.285945406 -65.892004142 + 70.323586620 -65.634688601 + 70.417342075 -65.606506258 +} +8589201bfffffff +{ + -17.952819815 -152.253748878 + -17.863436810 -152.223746277 + -17.793348293 -152.291508718 + -17.812548071 -152.389280677 + -17.901892662 -152.419412404 + -17.972075980 -152.351643231 +} +85dc405bfffffff +{ + -51.560628081 -27.117467184 + -51.634224455 -27.187814656 + -51.712756702 -27.115201364 + -51.717645512 -26.971955923 + -51.643954220 -26.901699121 + -51.565469088 -26.974596200 +} +85de0043fffffff +{ + -55.448234030 -52.208094013 + -55.400508452 -52.072543180 + -55.315128934 -52.078912184 + -55.277469650 -52.220082256 + -55.324964967 -52.355293764 + -55.410349213 -52.349674721 +} +859d156bfffffff +{ + -18.893950454 152.168204634 + -18.805881583 152.146534992 + -18.779572972 152.052007709 + -18.841262395 151.979016627 + -18.929373571 152.000531064 + -18.955753144 152.095191955 +} +857d4337fffffff +{ + -3.350070405 -28.307039940 + -3.268371426 -28.260981125 + -3.186139139 -28.307045534 + -3.185561592 -28.399211858 + -3.267280102 -28.445335155 + -3.349556638 -28.399227747 +} +859b747bfffffff +{ + -21.282716119 -178.003189103 + -21.202220291 -177.956751165 + -21.126202934 -178.003340703 + -21.130645503 -178.096234284 + -21.211029171 -178.142675346 + -21.287082350 -178.096219894 +} +8557a93bfffffff +{ + 18.734799627 -37.600547413 + 18.659342038 -37.646812480 + 18.581389519 -37.597180845 + 18.578777383 -37.501324790 + 18.654158506 -37.454940529 + 18.732228295 -37.504531259 +} +85060167fffffff +{ + 68.457380362 -32.328970354 + 68.467752504 -32.560956203 + 68.394111434 -32.698731838 + 68.310390808 -32.604792878 + 68.300165496 -32.374335926 + 68.373514548 -32.236295551 +} +8539532ffffffff +{ + 37.724356860 1.811516982 + 37.635193952 1.827247560 + 37.605183615 1.929010908 + 37.664357631 2.015254650 + 37.753609104 1.999677513 + 37.783598048 1.897702895 +} +85f3a1d7fffffff +{ + -78.151213568 177.892368461 + -78.230774628 177.824123016 + -78.277208649 178.155405502 + -78.243452148 178.553647284 + -78.163676387 178.616722676 + -78.117868384 178.286744892 +} +85e89457fffffff +{ + -70.436875439 -68.382059032 + -70.408341843 -68.110895675 + -70.315495780 -68.045702384 + -70.251405826 -68.249595864 + -70.279747758 -68.518730736 + -70.372370100 -68.585991428 +} +85c84b4bfffffff +{ + -43.861941665 96.174891982 + -43.783920831 96.114328283 + -43.782273640 95.985623354 + -43.858620410 95.917046289 + -43.936798285 95.977351762 + -43.938472418 96.106493588 +} +858fb103fffffff +{ + -3.005351618 -91.256334358 + -3.081437814 -91.314867304 + -3.169168609 -91.278986265 + -3.180809076 -91.184513703 + -3.104674648 -91.125959143 + -3.016948028 -91.161898641 +} +85834843fffffff +{ + -9.524259486 3.231273092 + -9.437282050 3.244290728 + -9.384481713 3.181814922 + -9.418599568 3.106398013 + -9.505471609 3.093356749 + -9.558331149 3.155755946 +} +85004ad7fffffff +{ + 85.173580117 -26.589093628 + 85.258414492 -26.806019015 + 85.286069347 -27.863816287 + 85.227951431 -28.675841924 + 85.143784814 -28.426911713 + 85.117048267 -27.397511728 +} +85d0dc77fffffff +{ + -54.247602022 17.229636075 + -54.330935409 17.222136387 + -54.368413828 17.336556744 + -54.322529957 17.458154418 + -54.239263028 17.465259930 + -54.201813339 17.351161563 +} +85b67407fffffff +{ + -26.950610973 -99.253827468 + -26.889143043 -99.185468523 + -26.806232627 -99.216553650 + -26.784689149 -99.315826525 + -26.846016406 -99.384231216 + -26.929027729 -99.353317650 +} +850e0c47fffffff +{ + 58.540762204 -75.308700746 + 58.487959342 -75.465394884 + 58.390752151 -75.456031686 + 58.346328568 -75.290881139 + 58.398911924 -75.134572479 + 58.496137721 -75.143028470 +} +8597ab73fffffff +{ + -14.227796000 34.527490774 + -14.130820918 34.530446835 + -14.079932745 34.445698950 + -14.126003518 34.357939866 + -14.223002855 34.354912990 + -14.273907240 34.439716017 +} +85f0256ffffffff +{ + -82.378526124 74.879695180 + -82.341645710 74.252328395 + -82.393677423 73.725039382 + -82.483536896 73.821650574 + -82.521027546 74.459363796 + -82.468039672 74.990037290 +} +852ec887fffffff +{ + 44.174275149 133.662814218 + 44.253212756 133.626381988 + 44.264696648 133.523249005 + 44.197320666 133.456824064 + 44.118504680 133.493350948 + 44.106943105 133.596208595 +} +855ab507fffffff +{ + 18.160772585 179.288895731 + 18.248789552 179.301555283 + 18.299599754 179.225266500 + 18.262274264 179.136328224 + 18.174198163 179.123817126 + 18.123506575 179.200095695 +} +854f75a7fffffff +{ + 11.302513191 151.119307654 + 11.209462508 151.132757979 + 11.172487418 151.219690193 + 11.228524565 151.293145499 + 11.321516077 151.279733885 + 11.358529645 151.192828222 +} +85ec6b7bfffffff +{ + -79.669859328 139.082327869 + -79.640396858 138.641830720 + -79.696831166 138.250104827 + -79.783275610 138.297613403 + -79.813111909 138.743294636 + -79.756126197 139.136251691 +} +859f428bfffffff +{ + -23.301762938 165.832174689 + -23.214277244 165.796961487 + -23.195730806 165.697401806 + -23.264671942 165.632872342 + -23.352260540 165.667977266 + -23.370805116 165.767720236 +} +850929b7fffffff +{ + 69.236459891 -1.860040312 + 69.280823279 -2.021786713 + 69.242983550 -2.215111441 + 69.160896967 -2.245546418 + 69.116816940 -2.084022041 + 69.154540743 -1.891837196 +} +85221083fffffff +{ + 46.360603298 -163.748392164 + 46.443168690 -163.711220691 + 46.512189564 -163.791836045 + 46.498585299 -163.909791323 + 46.415909831 -163.946809206 + 46.346948695 -163.866026032 +} +85580e03fffffff +{ + 13.295014663 8.017028625 + 13.206968059 8.025122656 + 13.164787071 8.107928533 + 13.210609661 8.182760636 + 13.298721449 8.174781354 + 13.340945541 8.091855103 +} +851fac67fffffff +{ + 50.540762704 9.231796068 + 50.459203598 9.242432223 + 50.429803985 9.365215436 + 50.481945055 9.477617514 + 50.563547861 9.467239009 + 50.592966046 9.344200426 +} +8582752bfffffff +{ + -5.923635670 4.184336942 + -5.836923609 4.196973210 + -5.786456934 4.134332030 + -5.822633884 4.059126875 + -5.909243403 4.046465721 + -5.959778479 4.109034532 +} +8522e423fffffff +{ + 49.509336573 -170.492043107 + 49.594055810 -170.460230937 + 49.659484601 -170.557630584 + 49.640115785 -170.686956815 + 49.555305521 -170.718526958 + 49.489955011 -170.621013626 +} +855f9b8bfffffff +{ + 11.237301885 -47.674988250 + 11.315114728 -47.625439687 + 11.392800524 -47.670551933 + 11.392698096 -47.765178562 + 11.314934338 -47.814712943 + 11.237223944 -47.769635003 +} +856ec343fffffff +{ + 13.681962296 -115.584273877 + 13.761506238 -115.535305753 + 13.843607187 -115.583538996 + 13.846076326 -115.680774970 + 13.766473616 -115.729657276 + 13.684460505 -115.681389636 +} +85dd316bfffffff +{ + -63.810414349 -10.954731919 + -63.723050655 -10.889410239 + -63.653052235 -11.031792484 + -63.670088241 -11.239393850 + -63.757278896 -11.305816269 + -63.827607248 -11.163541043 +} +85e52397fffffff +{ + -64.733128870 123.960858175 + -64.675263926 123.786142530 + -64.712113633 123.581750064 + -64.807052800 123.551213670 + -64.865168902 123.726381916 + -64.828093806 123.931635485 +} +85c0e0dbfffffff +{ + -39.338355320 -8.994020888 + -39.429941780 -9.034897535 + -39.502818796 -8.952373772 + -39.484015273 -8.828945912 + -39.392377076 -8.788290323 + -39.319594032 -8.870841048 +} +85c42ca7fffffff +{ + -38.064650126 -32.100933765 + -38.142599035 -32.161572572 + -38.225400674 -32.109572440 + -38.230227735 -31.996715887 + -38.152167952 -31.936091239 + -38.069392068 -31.988308581 +} +85ba15c7fffffff +{ + -34.098679467 -178.147653692 + -34.020163676 -178.094912616 + -33.939496714 -178.147584009 + -33.937336465 -178.252823588 + -34.015762077 -178.305567636 + -34.096438068 -178.253069411 +} +85c9996ffffffff +{ + -34.253293773 112.652356072 + -34.193698641 112.581806901 + -34.207073083 112.479563662 + -34.280123373 112.447611427 + -34.339887912 112.518146933 + -34.326432569 112.620648777 +} +859ccac3fffffff +{ + -7.817588168 137.982117022 + -7.909335346 137.997670562 + -7.942145974 138.087560801 + -7.883235103 138.161913677 + -7.791476026 138.146381178 + -7.758639649 138.056474698 +} +8560138bfffffff +{ + 13.805019832 75.860658555 + 13.891040981 75.832641899 + 13.907487987 75.745972816 + 13.837988604 75.687396069 + 13.752043031 75.715398537 + 13.735521270 75.801992030 +} +85238843fffffff +{ + 45.024521122 -160.235929224 + 45.105159809 -160.196501176 + 45.175120504 -160.268840668 + 45.164394076 -160.380794654 + 45.083639311 -160.420109726 + 45.013727078 -160.347584344 +} +85032693fffffff +{ + 89.047549991 77.242773054 + 89.039312915 82.698448074 + 89.111648232 86.433827665 + 89.199871220 84.499112421 + 89.210038268 77.949292632 + 89.129802211 74.557627301 } -85dee0a3fffffff -{ - -50.794395176 -51.173065344 - -50.748202934 -51.056611972 - -50.668400477 -51.064534520 - -50.634775392 -51.188346189 - -50.680758684 -51.304561898 - -50.760575527 -51.297203815 +8584c5b3fffffff +{ + -9.182753365 69.411411845 + -9.271684531 69.428828874 + -9.300997242 69.518578217 + -9.241316054 69.590827653 + -9.152409501 69.573301529 + -9.123159421 69.483634969 +} +851162dbfffffff +{ + 66.559190032 34.138143762 + 66.519715150 34.299916664 + 66.563714135 34.476301047 + 66.647355984 34.491288678 + 66.686940042 34.328838361 + 66.642772553 34.152078713 +} +859e1a83fffffff +{ + -13.647533326 165.575632746 + -13.567399434 165.544148318 + -13.548022701 165.454546007 + -13.608769291 165.396280275 + -13.688998432 165.427675992 + -13.708385755 165.517426375 +} +8506f1b7fffffff +{ + 67.246867610 -45.001638814 + 67.238638004 -45.234779925 + 67.153446534 -45.330160371 + 67.076740945 -45.193283105 + 67.084982502 -44.961689828 + 67.169917616 -44.865432987 +} +85094993fffffff +{ + 71.340547086 18.143950821 + 71.398739885 18.283870848 + 71.468841334 18.165561503 + 71.480410491 17.906086669 + 71.421866401 17.766958063 + 71.352104576 17.886502364 +} +85006693fffffff +{ + 80.113673678 0.793574372 + 80.191886677 0.931354025 + 80.254280118 0.566504967 + 80.237691461 0.063531336 + 80.159116417 -0.067482946 + 80.097488077 0.297649609 +} +850af333fffffff +{ + 63.134975882 104.959284562 + 63.084617101 105.131299821 + 63.123290874 105.309308835 + 63.212608100 105.315945250 + 63.263233783 105.143340409 + 63.224274402 104.964688546 +} +859c61a3fffffff +{ + -19.436402179 136.963834987 + -19.349886126 136.957586535 + -19.317063913 136.873960939 + -19.370637737 136.796530271 + -19.457117503 136.802615027 + -19.490059861 136.886294104 +} +850b2ea3fffffff +{ + 63.593547352 68.265473278 + 63.516892859 68.367861767 + 63.516851581 68.576080748 + 63.593468150 68.682857427 + 63.670286663 68.580934455 + 63.670324584 68.371765744 +} +850450abfffffff +{ + 73.899863618 168.755311430 + 73.803238725 168.733542745 + 73.749842437 169.020296104 + 73.792603484 169.330076789 + 73.889131945 169.355337932 + 73.942998274 169.067331781 +} +856b1953fffffff +{ + 11.161106711 23.631044335 + 11.072101991 23.627045524 + 11.024594044 23.707136931 + 11.065999982 23.791279480 + 11.154993944 23.795406279 + 11.202592852 23.715262572 +} +85ec7603fffffff +{ + -73.564272394 149.229305459 + -73.545291207 148.938713853 + -73.612147138 148.729729055 + -73.698325099 148.811801625 + -73.717390689 149.104978942 + -73.650193118 149.313483581 +} +85216e43fffffff +{ + 56.147210115 72.008900196 + 56.062775259 72.086303464 + 56.057110807 72.257901271 + 56.135860572 72.352734259 + 56.220421915 72.275720897 + 56.226107085 72.103482688 +} +8570b493fffffff +{ + 3.057555209 -177.715599874 + 2.977095428 -177.731973882 + 2.914958714 -177.674809549 + 2.933233018 -177.601181854 + 3.013750101 -177.584726116 + 3.075935615 -177.641979825 +} +851d16d3fffffff +{ + 56.952436360 -144.822914394 + 56.897612157 -144.936845730 + 56.826436456 -144.911078583 + 56.810029170 -144.772027434 + 56.864617823 -144.658232916 + 56.935848792 -144.683351768 +} +85388403fffffff +{ + 27.240576726 -4.163850366 + 27.176920332 -4.237021779 + 27.089285813 -4.216881812 + 27.065333646 -4.123766291 + 27.128895986 -4.050689570 + 27.216504419 -4.070633628 +} +85d334a7fffffff +{ + -57.552946946 -112.899422242 + -57.496193513 -112.759533616 + -57.403393714 -112.784212285 + -57.367316028 -112.948111653 + -57.423915868 -113.087797855 + -57.516746574 -113.063787859 +} +85da53d3fffffff +{ + -52.336580689 158.452879487 + -52.252394956 158.410780794 + -52.232876501 158.264167253 + -52.297512412 158.159290815 + -52.381757360 158.201076028 + -52.401307331 158.348051986 +} +850021c3fffffff +{ + 77.504219250 27.050394093 + 77.562162250 27.319443359 + 77.644332248 27.194225254 + 77.668168731 26.795795941 + 77.609635018 26.527186838 + 77.527857480 26.656533982 +} +85812caffffffff +{ + -14.378071824 -45.732463347 + -14.297996094 -45.681037158 + -14.214542134 -45.728299225 + -14.211182700 -45.826958819 + -14.291260701 -45.878378593 + -14.374695863 -45.831145334 +} +855ae627fffffff +{ + 17.886136099 169.972148918 + 17.975407275 169.975944908 + 18.022812850 169.892898782 + 17.980842244 169.806126353 + 17.891560324 169.802495313 + 17.844259604 169.885471716 +} +85eb0a7bfffffff +{ + -63.815924025 -162.162729596 + -63.823270409 -162.011343914 + -63.757344406 -161.928513007 + -63.684227100 -161.996988579 + -63.677002736 -162.147680706 + -63.742773871 -162.230588949 +} +85aae15bfffffff +{ + -27.794817071 77.314586887 + -27.888665937 77.340697269 + -27.915078973 77.445619271 + -27.847633354 77.524287709 + -27.753833944 77.498057860 + -27.727430623 77.393278812 +} +85ed98c3fffffff +{ + -61.585135492 147.536041473 + -61.557582363 147.363600647 + -61.618203098 147.235422931 + -61.706612516 147.279799203 + -61.734214443 147.453133602 + -61.673357876 147.581195291 +} +85e89137fffffff +{ + -67.839755438 -68.049795647 + -67.810524797 -67.810909202 + -67.718621750 -67.754595885 + -67.656148328 -67.935542092 + -67.685204191 -68.172858912 + -67.776907292 -68.230792946 +} +85badd0bfffffff +{ + -23.780338914 179.879821689 + -23.701176740 179.927855308 + -23.623942620 179.882826655 + -23.625848085 179.789909771 + -23.704900455 179.741884640 + -23.782157082 179.786767722 +} +8500f043fffffff +{ + 81.852183768 70.348559930 + 81.855799804 70.990479558 + 81.938561995 71.286588573 + 82.018398005 70.932941069 + 82.014612948 70.277994610 + 81.931162931 69.989893701 +} +85f2b25bfffffff +{ + -86.929610538 142.274106658 + -86.992177527 141.051361414 + -87.077366605 141.521597108 + -87.098621997 143.294409251 + -87.033495692 144.512078796 + -86.949715746 143.964494700 +} +85dd9c13fffffff +{ + -55.969839952 -2.468274508 + -56.052212050 -2.510495560 + -56.109318099 -2.397344768 + -56.083955106 -2.242046505 + -56.001553169 -2.200252535 + -55.944543846 -2.313329012 +} +85371c4ffffffff +{ + 38.947781118 -150.621368757 + 38.872956754 -150.657932508 + 38.813078598 -150.583762118 + 38.828022010 -150.473042522 + 38.902843672 -150.436410845 + 38.962724678 -150.510566477 +} +85ef9b77fffffff +{ + -74.073903326 -3.830996491 + -73.979423662 -3.765421030 + -73.915745211 -4.026462171 + -73.946060976 -4.353677524 + -74.040385925 -4.422606737 + -74.104552075 -4.160979605 } -85ef6603fffffff -{ - -77.891937681 -78.390289979 - -77.880558825 -77.943825474 - -77.792224364 -77.768393588 - -77.715759570 -78.035415694 - -77.727043872 -78.475979241 - -77.814886378 -78.655369890 -} -85185c73fffffff -{ - 45.648657375 -5.844673821 - 45.589940359 -5.937414634 - 45.500284479 -5.909208041 - 45.469374642 -5.788577163 - 45.528021588 -5.695973266 - 45.617648290 -5.723863168 -} -85cc703bfffffff -{ - -45.573773259 75.732947454 - -45.655765332 75.762466306 - -45.678201978 75.886498004 - -45.618632782 75.980818263 - -45.536670466 75.951123953 - -45.514247482 75.827284486 -} -858790cffffffff -{ - -3.189865003 94.053112982 - -3.100452543 94.028247982 - -3.076044752 93.936429412 - -3.141067430 93.869521727 - -3.230445401 93.894422081 - -3.254835237 93.986194871 -} -85aa2b5bfffffff -{ - -23.232983881 74.124287671 - -23.328041281 74.147226336 - -23.357335857 74.248312287 - -23.291543314 74.326337113 - -23.196524722 74.303276079 - -23.167259780 74.202312409 -} -8520c457fffffff -{ - 41.706742568 79.125001030 - 41.617365217 79.172474739 - 41.603915646 79.299866416 - 41.679775616 79.380123461 - 41.769234792 79.332938752 - 41.782752320 79.205207279 -} -853e30b3fffffff -{ - 29.748995470 19.894192872 - 29.651716462 19.892925525 - 29.602184311 19.989115004 - 29.649872733 20.086671332 - 29.747163318 20.088118176 - 29.796754036 19.991829183 -} -85b0e813fffffff -{ - -19.572012357 -116.658338265 - -19.524297369 -116.583642759 - -19.447754528 -116.591995139 - -19.418915810 -116.674859568 - -19.466511132 -116.749477176 - -19.543064659 -116.741308300 -} -85f2340ffffffff -{ - -79.038459819 -161.251343498 - -79.119571132 -161.158206813 - -79.139664444 -160.716683371 - -79.078211320 -160.373722820 - -78.997341681 -160.472706630 - -78.977679745 -160.908842055 -} -85722b0bfffffff -{ - 5.888391687 140.587630172 - 5.792291026 140.603103628 - 5.757491514 140.694402593 - 5.818777343 140.770236056 - 5.914867750 140.754788542 - 5.949682644 140.663481561 -} -85f39cabfffffff -{ - -82.540013213 171.920480043 - -82.622459868 171.738530621 - -82.679569163 172.234951333 - -82.653202955 172.912845267 - -82.570239174 173.082048529 - -82.514151272 172.586236129 -} -85e19163fffffff -{ - -55.874429147 76.566222387 - -55.782881598 76.536058162 - -55.754139603 76.381802042 - -55.816760245 76.257186626 - -55.908334477 76.286627922 - -55.937261886 76.441408459 -} -85f2938ffffffff +852c1dcffffffff +{ + 38.786159323 46.487651536 + 38.719667236 46.568081441 + 38.739413443 46.676434383 + 38.825784457 46.704575257 + 38.892416030 46.624061739 + 38.872536893 46.515490703 +} +85038903fffffff +{ + 79.368634649 -128.237552098 + 79.329156016 -128.683855009 + 79.237816023 -128.740289038 + 79.186181496 -128.357470585 + 79.225212955 -127.916259621 + 79.316321549 -127.852801841 +} +85ed5c93fffffff +{ + -73.833884651 163.256111305 + -73.834454900 162.970412138 + -73.910899722 162.828590381 + -73.987008166 162.974098796 + -73.986330748 163.262445074 + -73.909652476 163.402620229 +} +85096ed7fffffff +{ + 72.152021129 6.966350810 + 72.217443499 7.065680541 + 72.279203494 6.897296764 + 72.275132144 6.629012034 + 72.209442530 6.531243416 + 72.148090760 6.700187410 +} +8500c8bbfffffff +{ + 87.888288802 98.536963008 + 87.849210937 100.781323533 + 87.900451011 102.922785828 + 87.993929081 102.899544795 + 88.035914567 100.531493143 + 87.981374709 98.312447451 +} +852c5d4bfffffff +{ + 43.587254336 54.285639360 + 43.513326597 54.367684776 + 43.527879550 54.494414507 + 43.616459708 54.539430067 + 43.690538885 54.457385507 + 43.675886277 54.330323882 +} +8568d42ffffffff +{ + 0.190536642 120.023285454 + 0.099584500 120.039742856 + 0.067059687 120.122858275 + 0.125533913 120.189578911 + 0.216567116 120.173112938 + 0.249045031 120.089934846 +} +850960d7fffffff +{ + 71.992763331 1.637728947 + 72.042252885 1.463803461 + 72.009904327 1.237717428 + 71.928161255 1.187192882 + 71.878978194 1.361059264 + 71.911232373 1.585515915 +} +859769d7fffffff +{ + -22.112821183 20.811409224 + -22.019019614 20.820038133 + -21.963454008 20.736428992 + -22.001665334 20.644206126 + -22.095428423 20.635512305 + -22.151018737 20.719106186 +} +859e4ad3fffffff +{ + -17.737287042 156.691867192 + -17.650813264 156.666242170 + -17.627012400 156.571710057 + -17.689635275 156.502656831 + -17.776173357 156.528144596 + -17.800024357 156.622823052 +} +8532f0abfffffff +{ + 40.670389924 167.722942004 + 40.766758986 167.725032078 + 40.816049447 167.615251598 + 40.768892153 167.503522646 + 40.672526772 167.501714182 + 40.623314814 167.611353052 +} +85f16203fffffff +{ + -87.393620347 33.705415669 + -87.309660196 32.824814901 + -87.302626572 30.880147217 + -87.379130291 29.697076677 + -87.465237467 30.498616300 + -87.472714402 32.567297556 +} +853fa8d7fffffff +{ + 30.593170532 15.817350414 + 30.496480059 15.819861062 + 30.450313351 15.917753568 + 30.500793360 16.013262987 + 30.597517762 16.010930941 + 30.643728349 15.912910792 +} +85020173fffffff +{ + 78.575615643 -103.540637257 + 78.498013634 -103.780300412 + 78.422339358 -103.571681956 + 78.423808744 -103.126036067 + 78.500953699 -102.883464666 + 78.577086391 -103.089399030 +} +85088a47fffffff +{ + 60.908649784 23.079480410 + 60.877484210 23.213103571 + 60.928487215 23.331523394 + 61.010803735 23.316315217 + 61.041986815 23.182105942 + 60.990835703 23.063692376 +} +85b568dbfffffff +{ + -34.596019368 -167.339647764 + -34.510117319 -167.291915432 + -34.431614812 -167.358346228 + -34.438968657 -167.472392964 + -34.524794342 -167.520208188 + -34.603342553 -167.453894173 +} +8536436bfffffff +{ + 29.568039893 -139.176609813 + 29.487819487 -139.214602729 + 29.415531587 -139.150343697 + 29.423474922 -139.048171530 + 29.503664432 -139.010166317 + 29.575941538 -139.074345388 +} +851001b7fffffff +{ + 61.534681121 46.590318554 + 61.476726951 46.720495713 + 61.505957522 46.896326901 + 61.593276735 46.942556682 + 61.651382700 46.812164323 + 61.622017242 46.635756267 +} +850fa607fffffff +{ + 70.094340105 -86.067747386 + 70.029875607 -86.275392239 + 69.937633665 -86.215971165 + 69.909699782 -85.950749599 + 69.973828608 -85.743228499 + 70.066225919 -85.800798210 +} +8512d49bfffffff +{ + 52.231155016 -121.386059312 + 52.151526981 -121.421840295 + 52.085384187 -121.327253118 + 52.098667033 -121.196817378 + 52.178250367 -121.160531803 + 52.244595919 -121.255185724 +} +850b632ffffffff +{ + 69.922406758 69.747428326 + 69.922199462 70.002128909 + 69.997556864 70.114880474 + 70.073396004 69.971649849 + 70.073495873 69.714926677 + 69.997864516 69.603467162 +} +85f2e20bfffffff +{ + -80.470613182 -112.011185617 + -80.511475332 -111.524393946 + -80.458665127 -111.063839214 + -80.365668516 -111.094050976 + -80.325469277 -111.575596847 + -80.377610132 -112.032164644 +} +85539b0ffffffff +{ + 16.073183522 36.230849538 + 15.982765798 36.216911042 + 15.929602490 36.291147767 + 15.966753680 36.379305351 + 16.057097970 36.393357479 + 16.110364569 36.319138545 +} +850f9cd3fffffff +{ + 65.950462288 -92.953655359 + 65.878176466 -93.109305664 + 65.787351793 -93.036180869 + 65.768614320 -92.808513107 + 65.840620999 -92.652598897 + 65.931643817 -92.724610714 +} +85370643fffffff +{ + 40.930190263 -151.192486201 + 40.857747422 -151.229229176 + 40.800269088 -151.153998745 + 40.815228757 -151.042036137 + 40.887668850 -151.005221116 + 40.945152076 -151.080440531 +} +851e2e4bfffffff +{ + 50.208136141 19.272855905 + 50.124410663 19.271984858 + 50.083682013 19.393233666 + 50.126630143 19.515517414 + 50.210364661 19.516672250 + 50.251142191 19.395259504 +} +8507664bfffffff +{ + 65.580579571 -11.789079193 + 65.613140543 -11.952733197 + 65.561961339 -12.108956824 + 65.478403178 -12.100938694 + 65.446095222 -11.937823155 + 65.497093057 -11.782187085 +} +85c6d383fffffff +{ + -33.689461707 -126.743874862 + -33.643422543 -126.648012672 + -33.553648706 -126.643877347 + -33.509974678 -126.735341631 + -33.555922805 -126.831008378 + -33.645635816 -126.835406093 +} +857add53fffffff +{ + 8.450577271 40.988659151 + 8.532606984 40.988944729 + 8.579626729 40.913197495 + 8.544659493 40.837097093 + 8.462596099 40.836755748 + 8.415533542 40.912570600 +} +851e2147fffffff +{ + 51.198876267 18.789236339 + 51.116364854 18.788923566 + 51.076815047 18.912064893 + 51.119727661 19.035692771 + 51.202249374 19.036296984 + 51.241848358 18.912981815 +} +850063a3fffffff +{ + 81.639676144 -10.846949264 + 81.722358361 -10.803665092 + 81.771552225 -11.320763447 + 81.737224466 -11.877043258 + 81.654448943 -11.909192071 + 81.606086587 -11.396226787 +} +858e9c2bfffffff +{ + -14.980668638 -92.806903461 + -15.055019604 -92.867543556 + -15.144194255 -92.831028665 + -15.159040208 -92.733805809 + -15.084668055 -92.673134758 + -14.995471165 -92.709717393 +} +850328d3fffffff +{ + 86.965641888 -54.801147217 + 87.032812481 -55.914255134 + 87.014006160 -57.662277944 + 86.928914775 -58.212385795 + 86.864194619 -57.086740563 + 86.882148498 -55.420955610 +} +856a40abfffffff +{ + 7.154284344 34.279972807 + 7.239343629 34.282772351 + 7.286558721 34.205167827 + 7.248766971 34.124718472 + 7.163695266 34.121859548 + 7.116427638 34.199509360 +} +8528c66bfffffff +{ + 47.306195983 -123.686342883 + 47.382300729 -123.629786854 + 47.445811641 -123.698586240 + 47.433171368 -123.823926489 + 47.357064275 -123.880270951 + 47.293599751 -123.811487122 +} +8505200bfffffff +{ + 79.430062670 97.532860221 + 79.390545685 97.998226259 + 79.445658836 98.416086999 + 79.540980418 98.370964327 + 79.581005756 97.900130549 + 79.525195856 97.479914872 +} +85a3a3cbfffffff +{ + -18.597724665 41.149216201 + -18.503049962 41.149470297 + -18.456918931 41.064628262 + -18.505473104 40.979446660 + -18.600202333 40.979122639 + -18.646322919 41.064050185 +} +85e1aebbfffffff +{ + -60.885371562 73.614590549 + -60.792048073 73.588744889 + -60.757472562 73.414915866 + -60.816005425 73.266311191 + -60.909330914 73.291172466 + -60.944122198 73.465623640 +} +850b6c2ffffffff +{ + 71.484610211 66.481191934 + 71.489759516 66.755433589 + 71.568131178 66.862830850 + 71.641611954 66.694276643 + 71.636302492 66.417715741 + 71.557673236 66.312040862 +} +85a2d13bfffffff +{ + -28.761974381 53.166771434 + -28.854869662 53.173129347 + -28.897563703 53.264322894 + -28.847276567 53.349140721 + -28.754312886 53.342631557 + -28.711704678 53.251455892 +} +8534d8bbfffffff +{ + 23.657128035 -27.789470035 + 23.579875117 -27.848497346 + 23.494897883 -27.803462135 + 23.487082351 -27.699510376 + 23.564233812 -27.640409147 + 23.649302235 -27.685333263 +} +85158c23fffffff +{ + 52.279395634 120.555299219 + 52.217652420 120.653411597 + 52.231955765 120.793382632 + 52.308122658 120.835782979 + 52.370106942 120.737697662 + 52.355682898 120.597183616 +} +85ef3437fffffff +{ + -86.475604316 -43.690769251 + -86.414764910 -42.528850720 + -86.322814505 -42.826442495 + -86.290935978 -44.223946401 + -86.349683603 -45.373863791 + -86.442360154 -45.139266272 +} +85d68367fffffff +{ + -44.015770266 40.455930129 + -44.094543301 40.451289548 + -44.146377862 40.536649737 + -44.119395023 40.626714336 + -44.040538889 40.631203245 + -43.988748658 40.545779490 +} +851145cbfffffff +{ + 67.446905288 38.358605881 + 67.403352186 38.523528646 + 67.443130183 38.717087703 + 67.526626477 38.746282663 + 67.570320645 38.580756397 + 67.530376843 38.386638697 +} +850513dbfffffff +{ + 74.841101972 115.085518586 + 74.776607333 115.358458632 + 74.806055361 115.705605042 + 74.900334098 115.782947327 + 74.965344326 115.509451641 + 74.935557781 115.159153331 +} +8504add3fffffff +{ + 70.805011255 143.991803534 + 70.714090832 144.094290492 + 70.697459602 144.384107203 + 70.771605205 144.573821946 + 70.862804507 144.473278538 + 70.879580256 144.181063872 +} +852d12cbfffffff +{ + 37.012189277 34.666252660 + 36.919440303 34.650629879 + 36.860079161 34.743029334 + 36.893398165 34.851038559 + 36.986086336 34.866837725 + 37.045516408 34.774451542 +} +850345cbfffffff +{ + 81.175209558 -56.389660706 + 81.156027249 -56.947676894 + 81.073800934 -57.081180057 + 81.011102561 -56.664359607 + 81.029943057 -56.114407961 + 81.111819864 -55.973287559 +} +85e44c33fffffff +{ + -64.970234049 81.351633730 + -64.877607118 81.294406108 + -64.851753966 81.080517336 + -64.918346852 80.922767408 + -65.011064451 80.978762476 + -65.037099241 81.193743443 +} +8510314ffffffff +{ + 59.038163664 42.025886218 + 58.983465555 42.150964170 + 59.017296980 42.307174090 + 59.105975321 42.338715710 + 59.160799907 42.213349717 + 59.126819308 42.056729755 +} +8507330bfffffff +{ + 73.330982405 -7.586189293 + 73.373639438 -7.811193483 + 73.330270692 -8.046774674 + 73.244451792 -8.055837963 + 73.202126203 -7.831654702 + 73.245289321 -7.597583785 +} +8564aa37fffffff +{ + 16.256446315 96.481070987 + 16.349533584 96.455359599 + 16.374854794 96.357973910 + 16.307082617 96.286344721 + 16.213999354 96.312102732 + 16.188684205 96.409443428 +} +85f38977fffffff +{ + -81.883219417 -160.284527205 + -81.967019465 -160.145980894 + -81.987154715 -159.535680212 + -81.922938906 -159.074423784 + -81.839504895 -159.223743032 + -81.819914047 -159.823651264 +} +854a9c57fffffff +{ + 14.796947202 127.440641771 + 14.706075913 127.457555797 + 14.677347744 127.547799043 + 14.739534929 127.621178262 + 14.830444163 127.604267863 + 14.859128323 127.513974545 +} +85135a7bfffffff +{ + 59.837667510 -111.005600647 + 59.754567890 -111.081999399 + 59.676777169 -110.980831665 + 59.681842753 -110.803476672 + 59.764805657 -110.726417791 + 59.842839996 -110.827371142 +} +853e5977fffffff +{ + 24.103665670 33.865428903 + 24.008764599 33.852295700 + 23.951912265 33.934530501 + 23.989869165 34.029893850 + 24.084705047 34.043166805 + 24.141649301 33.960936832 +} +853e56d7fffffff +{ + 26.232227451 27.747074994 + 26.135408276 27.738866951 + 26.080817210 27.827905340 + 26.122963141 27.925190906 + 26.219749294 27.933560662 + 26.274422654 27.844483245 +} +85b454a7fffffff +{ + -25.490864137 -162.682163313 + -25.401129058 -162.641483914 + -25.324718494 -162.706768150 + -25.337970778 -162.812663904 + -25.427630735 -162.853440933 + -25.504113558 -162.788224879 +} +850e4a43fffffff +{ + 50.647886941 -71.175154584 + 50.601061118 -71.306888227 + 50.506660578 -71.308812549 + 50.459105299 -71.179600987 + 50.505754423 -71.048196592 + 50.600135070 -71.045674657 +} +85434887fffffff +{ + 34.877642687 65.667564667 + 34.797112012 65.727765617 + 34.797838555 65.843527989 + 34.879119799 65.899381587 + 34.959790237 65.839298986 + 34.959039622 65.723243834 +} +8516e007fffffff +{ + 51.564305847 169.568905002 + 51.653481968 169.574117438 + 51.700761592 169.446560183 + 51.658781282 169.313960227 + 51.569598353 169.309135097 + 51.522402298 169.436522511 +} +85b5aec7fffffff +{ + -32.557447559 -149.609972351 + -32.464700540 -149.578302775 + -32.395723810 -149.657054665 + -32.419424724 -149.767507193 + -32.512161506 -149.799355572 + -32.581207710 -149.720572856 +} +85c01407fffffff +{ + -34.597214767 -14.431078032 + -34.687399428 -14.475506319 + -34.764179132 -14.402838419 + -34.750681425 -14.285665696 + -34.660417072 -14.241398173 + -34.583730063 -14.314142140 +} +85b30a6ffffffff +{ + -22.423990816 -69.642915391 + -22.501421584 -69.697352975 + -22.580554069 -69.654970476 + -22.582225770 -69.558173115 + -22.504822201 -69.503819806 + -22.425719753 -69.546179450 +} +85a0a397fffffff +{ + -16.011652753 -131.996184473 + -15.928660315 -131.985517903 + -15.870829719 -132.052750683 + -15.895922011 -132.130753224 + -15.978963741 -132.141553126 + -16.036863972 -132.074217112 +} +8500c6b3fffffff +{ + 84.143548592 71.679992069 + 84.145817661 72.575470186 + 84.228158623 73.012586645 + 84.309242570 72.540102488 + 84.306829832 71.619011467 + 84.223479228 71.196491450 +} +85b590abfffffff +{ + -29.412380741 -145.053973616 + -29.319342230 -145.027892037 + -29.252936360 -145.105650880 + -29.279498660 -145.209554431 + -29.372547574 -145.235815154 + -29.439023889 -145.157993326 +} +8569a497fffffff +{ + 10.132846607 107.762289215 + 10.226011818 107.741219857 + 10.254303139 107.650283606 + 10.189371133 107.580426633 + 10.096167094 107.601563545 + 10.067933842 107.692489934 +} +8503506ffffffff +{ + 81.536876868 -83.206358611 + 81.481155966 -83.678443716 + 81.397770354 -83.572600670 + 81.369847410 -83.003826294 + 81.424833923 -82.533330196 + 81.508472278 -82.629960891 +} +85e62d4bfffffff +{ + -67.170832505 16.929834960 + -67.081072060 16.890344354 + -67.045485900 16.671758490 + -67.099462770 16.491370790 + -67.189384508 16.529303851 + -67.225169078 16.749186284 +} +85c2c103fffffff +{ + -32.850940142 -58.292573874 + -32.795281152 -58.241991020 + -32.725641778 -58.285668407 + -32.711705304 -58.379851488 + -32.767378780 -58.430373424 + -32.836974250 -58.386773292 +} +8523aca7fffffff +{ + 40.965396155 -161.681311744 + 41.048964399 -161.645325272 + 41.117716663 -161.716009717 + 41.102840613 -161.822837385 + 41.019150614 -161.858711239 + 40.950458451 -161.787870521 +} +85675a7bfffffff +{ + 8.662518159 -70.420774560 + 8.595955796 -70.470566521 + 8.516430853 -70.432138400 + 8.503543463 -70.343934442 + 8.570146052 -70.294209218 + 8.649595832 -70.332621112 +} +85bfa563fffffff +{ + -35.522810803 165.067518757 + -35.432379852 165.027657985 + -35.415658965 164.912717661 + -35.489377039 164.837396112 + -35.579901619 164.877107213 + -35.596614536 164.992289999 +} +8502461bfffffff +{ + 75.456909679 -84.413540095 + 75.396343968 -84.695899316 + 75.307281904 -84.625725627 + 75.278609285 -84.276531456 + 75.338733646 -83.994603207 + 75.427969989 -84.061423550 +} +85052533fffffff +{ + 80.782450214 93.609611844 + 80.749211283 94.155165597 + 80.809454683 94.608217276 + 80.903742816 94.517474619 + 80.937478309 93.963790895 + 80.876422853 93.509044189 +} +852f8d87fffffff +{ + 40.074203859 149.152677792 + 40.165606203 149.132412762 + 40.195795628 149.022395271 + 40.134585694 148.932902687 + 40.043281598 148.953374379 + 40.013089114 149.063132419 +} +8564e287fffffff +{ + 13.578298430 92.010105562 + 13.671453383 91.983445083 + 13.695173004 91.887028717 + 13.625747901 91.817328670 + 13.532618756 91.844022352 + 13.508888859 91.940383002 +} +8516633bfffffff +{ + 56.553735631 177.775514742 + 56.470283857 177.740612006 + 56.416581408 177.859848719 + 56.446064426 178.014031180 + 56.529379991 178.049630185 + 56.583349193 177.930352100 +} +8521167bfffffff +{ + 45.919560306 58.438821054 + 45.842136752 58.520192121 + 45.852788390 58.655835397 + 45.940938638 58.710499135 + 46.018514021 58.629191541 + 46.007787175 58.493155845 +} +85101e2ffffffff +{ + 58.013206929 49.226533907 + 57.949788694 49.342664050 + 57.974957607 49.506795557 + 58.063668072 49.555320676 + 58.127236914 49.439071448 + 58.101944351 49.274415074 +} +85cda677fffffff +{ + -42.094408759 95.700977223 + -42.017776734 95.643527166 + -42.015831079 95.519794618 + -42.090488160 95.453109633 + -42.167271504 95.510315399 + -42.169246523 95.634451382 +} +85054d2ffffffff +{ + 82.019097595 -172.794755106 + 81.930545945 -173.044362011 + 81.854825293 -172.630016386 + 81.866766820 -171.969746753 + 81.954630324 -171.710728339 + 82.031243739 -172.121217897 +} +8565928bfffffff { - -89.921669732 33.715499682 - -89.833847437 19.354357128 - -89.789179576 -5.218760432 - -89.798933506 -31.488852671 - -89.858736589 -55.603769920 - -89.949985838 -57.757362933 + 15.201596627 106.766643040 + 15.294587490 106.744800409 + 15.323913496 106.651708870 + 15.260202131 106.580473338 + 15.167172139 106.602384308 + 15.137892595 106.695462538 +} +85355167fffffff +{ + 36.238500603 -19.277260542 + 36.163571918 -19.352965548 + 36.072818371 -19.310570298 + 36.056950681 -19.192676692 + 36.131780913 -19.116956037 + 36.222577188 -19.159144219 +} +85a3694bfffffff +{ + -11.298882311 55.835685626 + -11.386959983 55.843218125 + -11.419846318 55.925110405 + -11.364552309 55.999444713 + -11.276434296 55.991794807 + -11.243650541 55.909928027 +} +85c72557fffffff +{ + -47.086721540 -147.303083887 + -47.001921775 -147.268644959 + -46.943548180 -147.362251662 + -46.969919417 -147.490365968 + -47.054717075 -147.525061616 + -47.113145735 -147.431386561 +} +85f37687fffffff +{ + -72.740016501 -155.059224435 + -72.811778247 -154.972157240 + -72.819941187 -154.694165075 + -72.756137407 -154.505534470 + -72.684605411 -154.594541257 + -72.676646334 -154.870250932 +} +85f0c62bfffffff +{ + -72.250668740 60.303468906 + -72.159973980 60.326730375 + -72.105775306 60.095843699 + -72.141937407 59.841189706 + -72.232493605 59.815664659 + -72.287027553 60.047051175 +} +8544751bfffffff +{ + 27.599993653 -90.796141717 + 27.670317585 -90.729739375 + 27.759021271 -90.763300044 + 27.777423925 -90.863422809 + 27.707036158 -90.929883341 + 27.618309639 -90.896163051 +} +85e11577fffffff +{ + -64.404457336 72.118698571 + -64.310729490 72.094787937 + -64.272884859 71.902029292 + -64.328531315 71.732448578 + -64.422249958 71.755106914 + -64.460332168 71.948599052 +} +850ab513fffffff +{ + 57.157706870 94.474754191 + 57.066801292 94.503715964 + 57.032000414 94.657964813 + 57.087961055 94.783639764 + 57.178852763 94.755326668 + 57.213798066 94.600689537 +} +85424ebbfffffff +{ + 30.170593237 72.783690517 + 30.089897396 72.831499345 + 30.084239429 72.939519714 + 30.159253822 72.999983634 + 30.240063678 72.952334601 + 30.245745176 72.844061370 +} +852e948ffffffff +{ + 48.235517337 150.468800446 + 48.323429765 150.447597690 + 48.350520769 150.323052074 + 48.289694524 150.220034330 + 48.201865354 150.241510378 + 48.174779047 150.365731468 +} +85ef618bfffffff +{ + -75.778029910 -80.492499994 + -75.769452697 -80.111538449 + -75.682679206 -79.949105448 + -75.604935027 -80.164976813 + -75.613478576 -80.541602769 + -75.699799501 -80.706660058 +} +850ae3c3fffffff +{ + 65.484195749 102.613597884 + 65.436450814 102.806570162 + 65.479349715 102.997220545 + 65.570311634 102.995567705 + 65.618326903 102.801781883 + 65.575108824 102.610463005 +} +851c3143fffffff +{ + 51.476364418 -144.432656109 + 51.426173384 -144.527390228 + 51.362957203 -144.506965258 + 51.349883060 -144.392250921 + 51.399878774 -144.297616509 + 51.463143575 -144.317596205 +} +85eeb4c7fffffff +{ + -73.669425870 0.016184788 + -73.574334716 0.057887056 + -73.515533345 -0.209527715 + -73.551368735 -0.519649887 + -73.646375708 -0.564660277 + -73.705633803 -0.296247975 +} +8558318bfffffff +{ + 15.285171183 4.347728843 + 15.197214041 4.358611838 + 15.156981076 4.441491235 + 15.204679202 4.513619982 + 15.292718668 4.502844430 + 15.332977732 4.419832544 +} +851ace4bfffffff +{ + 40.782228179 -42.976910549 + 40.696812415 -43.029071521 + 40.620509284 -42.961155257 + 40.629520987 -42.841090660 + 40.714911473 -42.788695551 + 40.791315620 -42.856598710 +} +859ab44bfffffff +{ + -12.347417113 -164.322617087 + -12.264040239 -164.285433420 + -12.194295194 -164.342169867 + -12.207839398 -164.436027655 + -12.291127481 -164.473280945 + -12.360960162 -164.416607038 +} +85726377fffffff +{ + 7.585991558 145.939672624 + 7.490720788 145.954210088 + 7.455084666 146.043893087 + 7.514688374 146.119028493 + 7.609922937 146.104524315 + 7.645590051 146.014851397 +} +851b264bfffffff +{ + 61.012283807 -47.737455957 + 60.997574614 -47.924544500 + 60.909407975 -47.993961479 + 60.836163989 -47.876933238 + 60.850866378 -47.690830512 + 60.938819431 -47.620773738 +} +850e08b3fffffff +{ + 57.531685662 -74.746942893 + 57.479624529 -74.899974391 + 57.382540245 -74.892426822 + 57.337503686 -74.732704888 + 57.389351630 -74.580052458 + 57.486448704 -74.586742597 } -85cf6133fffffff -{ - -50.864610515 -91.733739749 - -50.787585717 -91.645516891 - -50.700709328 -91.704038760 - -50.690715680 -91.850510780 - -50.767617762 -91.938961826 - -50.854636184 -91.880713980 -} -859e6d4bfffffff -{ - -21.864259177 157.214188964 - -21.774647830 157.186901566 - -21.750488101 157.087977996 - -21.815894005 157.016180373 - -21.905572151 157.043319776 - -21.929777689 157.142405042 -} -854fa06ffffffff -{ - 18.368922234 160.905628813 - 18.457845487 160.900599779 - 18.501042910 160.814085854 - 18.455239523 160.732720655 - 18.366354403 160.737910225 - 18.323234402 160.824304548 -} -85d87057fffffff -{ - -50.630224515 128.212900947 - -50.576166174 128.093751991 - -50.612472662 127.964975107 - -50.703033491 127.955048713 - -50.757266397 128.074469871 - -50.720763486 128.203545296 -} -859eac57fffffff -{ - -12.551928793 167.566733517 - -12.473663497 167.534308428 - -12.455061599 167.446520565 - -12.514721948 167.391013231 - -12.593086441 167.423361225 - -12.611691394 167.511293863 -} -85560927fffffff -{ - 11.801406039 -31.318565689 - 11.875076344 -31.272115582 - 11.953898823 -31.317877182 - 11.959110506 -31.410119771 - 11.885460693 -31.456622106 - 11.806578679 -31.410829734 -} -85350c63fffffff -{ - 40.855183653 -22.538927492 - 40.779091690 -22.616473222 - 40.690115877 -22.567408841 - 40.677177059 -22.441008590 - 40.753178087 -22.363408956 - 40.842208785 -22.412262920 -} -85ed0c4ffffffff -{ - -68.456241337 165.335983957 - -68.455998751 165.123144953 - -68.530775737 165.025068986 - -68.605955936 165.140831930 - -68.606075057 165.355133432 - -68.531137836 165.452203152 -} -85e8f13bfffffff -{ - -61.752789183 -77.792660090 - -61.737215802 -77.603563791 - -61.654608106 -77.529914542 - -61.587816122 -77.644626973 - -61.603351764 -77.832658801 - -61.685716938 -77.907038716 -} -8570456ffffffff -{ - 2.651818783 -162.302169465 - 2.564170246 -162.327913030 - 2.495255391 -162.264037090 - 2.513930048 -162.174371623 - 2.601587692 -162.148550366 - 2.670561641 -162.212472194 -} -85880287fffffff -{ - -7.077158997 -153.260837718 - -7.158042366 -153.289701477 - -7.222715149 -153.228555559 - -7.206571507 -153.138543213 - -7.125722109 -153.109626841 - -7.060982321 -153.170775320 -} -85eeb3d7fffffff -{ - -71.653282323 -2.627645006 - -71.559232731 -2.576812643 - -71.497045997 -2.807589924 - -71.528485259 -3.089763795 - -71.622420706 -3.143166372 - -71.685032814 -2.911832311 -} -8500e043fffffff -{ - 83.689858869 51.542189335 - 83.722678447 52.301507907 - 83.814115640 52.414748821 - 83.872968054 51.747803034 - 83.839268139 50.973295401 - 83.747610195 50.881059432 -} -85858487fffffff -{ - -5.093480806 55.765378511 - -5.175637629 55.772499040 - -5.204177372 55.850396090 - -5.150460825 55.921149828 - -5.068274779 55.913922948 - -5.039834402 55.836048704 -} -85ba4b97fffffff -{ - -26.045335334 170.177437424 - -25.958928284 170.137869744 - -25.944070764 170.037201620 - -26.015649203 169.975907201 - -26.102172096 170.015387824 - -26.117000684 170.116250252 -} -85eb616ffffffff -{ - -69.477647981 -154.003828073 - -69.544734368 -153.928041197 - -69.549962972 -153.698516679 - -69.487945739 -153.546355524 - -69.421062393 -153.623421408 - -69.415992506 -153.851376292 -} -85dbaaabfffffff -{ - -50.888513784 177.438481979 - -50.814872653 177.376905774 - -50.817919794 177.243190533 - -50.894670058 177.170697113 - -50.968407525 177.232196807 - -50.965298348 177.366267200 -} -85f29e2ffffffff -{ - -88.318885669 -62.910671077 - -88.284522746 -59.991125491 - -88.192394148 -59.708511900 - -88.135635591 -62.076943959 - -88.167039647 -64.794857829 - -88.257986517 -65.338676582 -} -85008e67fffffff -{ - 78.864307625 81.959321918 - 78.848628952 82.429841402 - 78.920979017 82.730122961 - 79.009650297 82.558195514 - 79.025470429 82.080848289 - 78.952475990 81.782319721 -} -85d97573fffffff -{ - -58.446643516 133.190485031 - -58.399022286 133.038835166 - -58.444791405 132.889217045 - -58.538415156 132.890932164 - -58.586199491 133.043113594 - -58.540196416 133.193047731 -} -85444b2bfffffff -{ - 34.808238061 -93.040891949 - 34.876619755 -92.970291534 - 34.964207263 -93.008521988 - 34.983431549 -93.117529476 - 34.914998975 -93.188180505 - 34.827393060 -93.149773632 -} -85bf5ec7fffffff -{ - -39.273881383 151.487509297 - -39.179307559 151.460968870 - -39.149433728 151.341883750 - -39.214070922 151.249130764 - -39.308672413 151.275420465 - -39.338609197 151.394714200 -} -852f7043fffffff -{ - 32.138259539 144.784323224 - 32.227548525 144.761981066 - 32.257097912 144.665120376 - 32.197374402 144.590817838 - 32.108202687 144.613301690 - 32.078637206 144.709946721 -} -850f2187fffffff -{ - 68.320078723 -58.714697891 - 68.291884336 -58.957362703 - 68.199118844 -59.008540206 - 68.134707567 -58.818602797 - 68.162754030 -58.577431363 - 68.255358836 -58.524709680 -} -85d90153fffffff -{ - -56.425127230 141.623678006 - -56.388022675 141.477321574 - -56.440542676 141.354474711 - -56.530395822 141.377921491 - -56.567593976 141.524874429 - -56.514845048 141.647782705 -} -85a1865bfffffff -{ - -20.629627914 -127.396061358 - -20.545951244 -127.389337775 - -20.491939992 -127.457453358 - -20.521558328 -127.532414851 - -20.605310350 -127.539271671 - -20.659368730 -127.471033671 -} -85056ab3fffffff -{ - 84.245654504 175.240583863 - 84.152273434 175.079182002 - 84.089748301 175.788428793 - 84.119325514 176.662491853 - 84.212199277 176.847910616 - 84.276018359 176.135527194 -} -8534ccbbfffffff -{ - 25.084423326 -24.304851677 - 25.007860814 -24.367805756 - 24.921108726 -24.325346580 - 24.910842410 -24.220068284 - 24.987297930 -24.157063642 - 25.074126700 -24.199387527 -} -85531ecffffffff -{ - 23.688250173 39.475125286 - 23.595788023 39.457777498 - 23.537370900 39.533698383 - 23.571324031 39.626926472 - 23.663696336 39.644391753 - 23.722205396 39.568511660 -} -85ef9b3bfffffff -{ - -74.198959371 -4.229438174 - -74.104552075 -4.160979605 - -74.040385925 -4.422606737 - -74.070136572 -4.753251315 - -74.164380882 -4.825099416 - -74.229039789 -4.562926931 -} -8560f4affffffff -{ - 14.772458052 72.739498347 - 14.855981634 72.711674252 - 14.870407707 72.628128826 - 14.801394674 72.572482914 - 14.717949604 72.600285242 - 14.703439068 72.683755322 -} -856621b7fffffff -{ - 10.904287897 -72.251666155 - 10.839288383 -72.302217250 - 10.761271915 -72.263992281 - 10.748325038 -72.175226122 - 10.813369210 -72.124734973 - 10.891315618 -72.162949930 -} -85378e17fffffff -{ - 35.034146001 -154.831001517 - 34.953627256 -154.864887296 - 34.892719122 -154.791194592 - 34.912327820 -154.683601821 - 34.992855412 -154.649634453 - 35.053765517 -154.723341267 -} -85500c4ffffffff -{ - 21.440614492 -132.078453305 - 21.358563104 -132.115433720 - 21.283404876 -132.059585694 - 21.290311643 -131.966858082 - 21.372303117 -131.929893633 - 21.447447744 -131.985640707 -} -850e5027fffffff -{ - 53.915563776 -74.077042746 - 53.864731674 -74.216663159 - 53.768663598 -74.211516296 - 53.723421305 -74.067454868 - 53.774054756 -73.928161003 - 53.870128626 -73.932601873 -} -85f29023fffffff -{ - -89.484767088 164.956667778 - -89.568422845 160.323445399 - -89.639332556 168.599231793 - -89.607747265 -177.905111958 - -89.516068792 -176.934508937 - -89.461842117 174.865211364 +8554a697fffffff +{ + 17.609911815 -20.035893713 + 17.539256920 -20.096770772 + 17.457269761 -20.061684927 + 17.445873849 -19.965854853 + 17.516413205 -19.904962530 + 17.598463921 -19.939915315 +} +856f8253fffffff +{ + 1.385602194 -108.134571676 + 1.454544190 -108.085244179 + 1.528338674 -108.125480770 + 1.533118546 -108.215105405 + 1.464093253 -108.264393113 + 1.390371404 -108.224096139 +} +8506d9d3fffffff +{ + 64.077868931 -53.597011688 + 64.055777727 -53.805087758 + 63.964196251 -53.864728187 + 63.894894078 -53.717277087 + 63.916912395 -53.510368038 + 64.008305348 -53.449747400 +} +85ab33a3fffffff +{ + -18.239907493 63.841164291 + -18.334221299 63.855526656 + -18.368393716 63.948843670 + -18.308174805 64.027728981 + -18.213850457 64.013233718 + -18.179755458 63.919985985 +} +85460237fffffff +{ + 24.450356441 -169.517625555 + 24.362295807 -169.541335939 + 24.303159998 -169.473401236 + 24.332083842 -169.381668541 + 24.420206682 -169.357855760 + 24.479343494 -169.425878036 +} +850d047bfffffff +{ + 72.949232891 -157.060837574 + 72.873656593 -157.250790788 + 72.789157106 -157.131828023 + 72.779953782 -156.825074976 + 72.855076121 -156.634467341 + 72.939854712 -156.751250322 +} +85da353bfffffff +{ + -53.317950856 172.573060811 + -53.242867179 172.513199823 + -53.241330674 172.368936929 + -53.314912999 172.284130714 + -53.390089219 172.343840648 + -53.391590568 172.488508830 +} +8504f1d7fffffff +{ + 69.763935480 156.139628478 + 69.668629444 156.181486952 + 69.633678894 156.440372349 + 69.693744857 156.659037532 + 69.789156065 156.619373828 + 69.824397693 156.358845012 +} +858e0ec3fffffff +{ + -11.316795199 -83.316655490 + -11.395084337 -83.375785854 + -11.484399590 -83.336180659 + -11.495408166 -83.237412050 + -11.417099394 -83.178299452 + -11.327801706 -83.217937542 +} +8582081bfffffff +{ + -3.699328913 7.420645131 + -3.611434218 7.432498145 + -3.561784397 7.366725207 + -3.599955845 7.289162702 + -3.687757081 7.277278549 + -3.737480316 7.342987963 +} +85259e0ffffffff +{ + 40.520937740 91.232283961 + 40.430582571 91.258569872 + 40.405397824 91.373022615 + 40.470436781 91.461421172 + 40.560797677 91.435466154 + 40.586114114 91.320781413 +} +852468c7fffffff +{ + 47.295335964 113.831555761 + 47.210478421 113.819690640 + 47.164595047 113.909442393 + 47.203417946 114.011054484 + 47.288150581 114.023231569 + 47.334185294 113.933485155 +} +85e99c43fffffff +{ + -72.567603201 -85.943797364 + -72.566645845 -85.634779334 + -72.484825613 -85.476944614 + -72.404384147 -85.626845513 + -72.405409880 -85.932988358 + -72.486809020 -86.092087659 +} +85e8cd6bfffffff +{ + -57.065994275 -76.164572824 + -56.983047237 -76.101189842 + -56.912368806 -76.190365403 + -56.924483241 -76.342901595 + -57.007388160 -76.406809920 + -57.078220981 -76.317658044 +} +85f24233fffffff +{ + -74.343620716 -116.565889504 + -74.386664492 -116.288401491 + -74.340068538 -115.998171196 + -74.250796430 -115.987347494 + -74.208212804 -116.263420072 + -74.254443437 -116.551734694 +} +85a54dbbfffffff +{ + -16.973873807 -17.820321062 + -17.055227857 -17.859412908 + -17.124658138 -17.802981218 + -17.112631398 -17.707385972 + -17.031177847 -17.668384391 + -16.961850524 -17.724887526 +} +85e31e47fffffff +{ + -65.429486678 -138.316667730 + -65.409768624 -138.128092885 + -65.327793081 -138.089569978 + -65.265660993 -138.238827711 + -65.285338048 -138.426457885 + -65.367187874 -138.465771966 +} +857c0807fffffff +{ + 1.489769438 -23.348118848 + 1.567532004 -23.305177641 + 1.647831850 -23.349241652 + 1.650431882 -23.436304136 + 1.572652513 -23.479321552 + 1.492289886 -23.435200343 +} +850356a3fffffff +{ + 82.692523536 -81.945152781 + 82.723492731 -82.587630911 + 82.667720066 -83.154820427 + 82.581936536 -83.075499285 + 82.551746627 -82.443262954 + 82.606570819 -81.880179901 +} +854866a3fffffff +{ + 25.114201385 -116.482911576 + 25.198029844 -116.430176760 + 25.281551493 -116.483322452 + 25.281171704 -116.589238535 + 25.197307736 -116.641866031 + 25.113859041 -116.588685032 +} +85a2de13fffffff +{ + -29.447568089 53.480315534 + -29.540466375 53.486983455 + -29.583231337 53.579102041 + -29.533013886 53.664532803 + -29.440048667 53.657711217 + -29.397367765 53.565612606 +} +85406d2bfffffff +{ + 22.109053337 98.212396847 + 22.199300511 98.186743529 + 22.224855714 98.087756288 + 22.160157058 98.014464037 + 22.069901974 98.040170509 + 22.044353395 98.139116198 +} +85f3954bfffffff +{ + -81.469325392 157.967979056 + -81.542290628 157.676782331 + -81.611623695 157.992803294 + -81.607193018 158.604851390 + -81.533471869 158.889988897 + -81.464936606 158.569266683 } -8565110bfffffff -{ - 6.409963203 102.739052652 - 6.503547294 102.716192447 - 6.530023741 102.623388243 - 6.462871779 102.553468935 - 6.369275257 102.576387164 - 6.342843068 102.669166761 -} -8500948ffffffff -{ - 74.233157604 77.006854143 - 74.223714871 77.338747646 - 74.297884193 77.523788667 - 74.381920826 77.375526496 - 74.391363352 77.040185810 - 74.316769250 76.856577856 -} -852ac03bfffffff -{ - 33.752078399 -74.826827512 - 33.709790688 -74.915200165 - 33.632231620 -74.910809124 - 33.596949113 -74.818331997 - 33.639085971 -74.730085335 - 33.716655922 -74.734189748 -} -85ef0e4ffffffff -{ - -80.862019209 -45.460579405 - -80.801801169 -44.988092832 - -80.706514338 -45.083446491 - -80.671202159 -45.641134149 - -80.730601006 -46.111131487 - -80.826124288 -46.025983652 -} -85da6343fffffff -{ - -56.653968572 157.443617628 - -56.573992511 157.399604319 - -56.554624892 157.241268511 - -56.615191953 157.126531183 - -56.695226313 157.170166936 - -56.714635490 157.328918581 -} -85629e93fffffff -{ - 3.345347050 55.070570823 - 3.425515098 55.066046124 - 3.471094854 54.998184734 - 3.436517808 54.934755193 - 3.356268948 54.939240869 - 3.310677941 55.007195167 -} -8500a583fffffff -{ - 76.563372296 56.587269645 - 76.585252323 56.950722774 - 76.671322637 57.034473464 - 76.735694167 56.750603456 - 76.713441914 56.383402323 - 76.627193057 56.303840873 -} -85f30c47fffffff -{ - -74.663087814 -159.632684027 - -74.738627439 -159.558892367 - -74.754035734 -159.249257920 - -74.693610332 -159.016138349 - -74.618263073 -159.092698317 - -74.603147073 -159.399623711 -} -85ca5043fffffff -{ - -41.972750698 62.187383919 - -42.060425065 62.203418716 - -42.097767098 62.316675161 - -42.047384925 62.413804452 - -41.959690124 62.397567772 - -41.922397804 62.284403613 -} -855f1b4ffffffff -{ - 7.902449219 -54.226274672 - 7.981618682 -54.177521944 - 8.059765252 -54.220503042 - 8.058747983 -54.312179752 - 7.979636903 -54.360892257 - 7.901484745 -54.317968376 -} -85a3961bfffffff -{ - -22.601124667 37.816900328 - -22.507170424 37.818564287 - -22.460757993 37.731197541 - -22.508307682 37.642092096 - -22.602299822 37.640353176 - -22.648704450 37.727794686 -} -853e0e73fffffff -{ - 26.832648261 24.868974428 - 26.735411680 24.863270561 - 26.682421437 24.954647904 - 26.726591932 25.051789443 - 26.823811657 25.057661215 - 26.876877869 24.966223609 -} -853c4cd3fffffff -{ - 31.393955266 96.496610882 - 31.475548881 96.469543539 - 31.497833346 96.367004471 - 31.438527990 96.291582735 - 31.356929320 96.318701797 - 31.334640995 96.421191015 -} -853211bbfffffff -{ - 36.378428825 170.675505954 - 36.475681317 170.681037539 - 36.528170174 170.578972435 - 36.483315835 170.471475535 - 36.386049238 170.466194650 - 36.333650910 170.568159879 -} -85f2c597fffffff -{ - -78.948855797 -106.538626511 - -78.981379745 -106.097606949 - -78.921315037 -105.725853386 - -78.829365166 -105.796855355 - -78.797347623 -106.232950313 - -78.856778060 -106.602941891 -} -85031223fffffff -{ - 84.048991738 -145.557838596 - 83.986840102 -146.222211980 - 83.894127368 -146.052641508 - 83.863182556 -145.240655688 - 83.924156115 -144.580508007 - 84.017238277 -144.727914643 +8538c263fffffff +{ + 26.154965332 4.377329001 + 26.062270019 4.389348801 + 26.024253833 4.481075425 + 26.078928838 4.560944218 + 26.171713624 4.549056149 + 26.209733977 4.457167359 +} +85329d6bfffffff +{ + 44.181186053 173.842960808 + 44.275467166 173.853276745 + 44.329768607 173.742920104 + 44.289698989 173.622332713 + 44.195387534 173.612317613 + 44.141175846 173.722588840 +} +85378963fffffff +{ + 33.943222112 -152.503953011 + 33.862052300 -152.538735751 + 33.798684548 -152.465969580 + 33.816484746 -152.358421942 + 33.897657457 -152.323567262 + 33.961027128 -152.396331973 +} +85a15073fffffff +{ + -23.194629355 -138.809971614 + -23.104213901 -138.791639230 + -23.041511087 -138.865271763 + -23.069152216 -138.957328105 + -23.159602175 -138.975822986 + -23.222376599 -138.902099060 +} +85ee5677fffffff +{ + -69.951704813 -40.874989793 + -69.885325606 -40.669147367 + -69.791336781 -40.733880321 + -69.763550966 -41.002375448 + -69.829518492 -41.208044191 + -69.923682162 -41.145399555 +} +8528de07fffffff +{ + 49.446367809 -123.102335036 + 49.520300063 -123.043528867 + 49.581817352 -123.113951099 + 49.569355536 -123.243169256 + 49.495415064 -123.301755833 + 49.433944573 -123.231344283 +} +85035cd3fffffff +{ + 80.772706182 -72.921013064 + 80.729643035 -73.408647065 + 80.643841926 -73.397867116 + 80.601089581 -72.907844149 + 80.643553100 -72.424388196 + 80.729363133 -72.426776626 +} +85073513fffffff +{ + 72.257999070 -2.594354275 + 72.304356312 -2.787363389 + 72.266781666 -3.014014331 + 72.182993001 -3.046104344 + 72.136953696 -2.853457031 + 72.174386018 -2.628352607 +} +858f75b3fffffff +{ + -3.272900054 -76.584147516 + -3.349914786 -76.639388666 + -3.437230297 -76.599563562 + -3.447478211 -76.504491789 + -3.370436526 -76.449298877 + -3.283173882 -76.489129362 +} +853e746ffffffff +{ + 29.387568918 28.601830240 + 29.290843406 28.592610607 + 29.235345980 28.683672752 + 29.276495992 28.783989482 + 29.373184691 28.793378824 + 29.428760309 28.702281857 +} +8517a2d7fffffff +{ + 55.741084103 146.722760051 + 55.658378765 146.772460453 + 55.639962667 146.931698368 + 55.704138787 147.041940751 + 55.786997048 146.992878299 + 55.805526654 146.832933509 +} +85cd4c33fffffff +{ + -51.468506361 75.773978358 + -51.379554510 75.749045228 + -51.352176535 75.612905649 + -51.413573250 75.501298002 + -51.502544608 75.525657726 + -51.530100165 75.662199068 +} +85724447fffffff +{ + 6.450198096 145.185194364 + 6.354664305 145.199860256 + 6.319286326 145.289752030 + 6.379411602 145.364970307 + 6.474913285 145.350336695 + 6.510321854 145.260452474 +} +8576eeabfffffff +{ + -2.807209615 163.674538482 + -2.892134780 163.684305440 + -2.920830576 163.756669234 + -2.864690937 163.819214805 + -2.779850356 163.809487401 + -2.751064837 163.737174882 +} +85ef33cffffffff +{ + -84.786893458 -29.019038615 + -84.709238214 -28.415661299 + -84.623577658 -28.851434741 + -84.614474395 -29.870369477 + -84.690749788 -30.483865917 + -84.777501703 -30.068930498 +} +85005537fffffff +{ + 84.140797720 6.211054907 + 84.220877785 6.529799316 + 84.291717820 5.959430472 + 84.281192659 5.064720169 + 84.200300510 4.763780835 + 84.130737525 5.339357410 +} +8506d5c3fffffff +{ + 67.759487779 -50.990665981 + 67.742598802 -51.230343768 + 67.653513798 -51.307886544 + 67.581541177 -51.146949010 + 67.598371798 -50.908852954 + 67.687232967 -50.830119723 +} +85015da3fffffff +{ + 78.536497914 1.621954502 + 78.612497918 1.745518129 + 78.674636397 1.439150352 + 78.660113618 1.008793233 + 78.583786557 0.890060395 + 78.522306527 1.196814146 +} +85928bd3fffffff +{ + -16.052511734 -110.854913863 + -16.114920828 -110.908569262 + -16.198050461 -110.883091420 + -16.218849899 -110.803866102 + -16.156426584 -110.750119455 + -16.073218033 -110.775689376 +} +85866d93fffffff +{ + -13.037111258 74.942138008 + -13.128495046 74.963886947 + -13.156972715 75.057404723 + -13.094029235 75.129066408 + -13.002694428 75.107215175 + -12.974254041 75.013804405 +} +856c64b7fffffff +{ + 6.918134365 -87.350395692 + 6.846139360 -87.407021339 + 6.764506039 -87.370746031 + 6.754899293 -87.277801814 + 6.826952699 -87.221173463 + 6.908554408 -87.257491910 +} +850326c7fffffff +{ + 89.297059128 101.931998149 + 89.250958051 108.185273563 + 89.288096157 114.984602139 + 89.378674762 116.694367437 + 89.435524008 109.743422813 + 89.389706931 101.705855779 } -85032103fffffff -{ - 88.151693613 -38.821705944 - 88.233225290 -40.008615171 - 88.239085233 -43.029915119 - 88.162774364 -44.606286531 - 88.084500496 -43.268655322 - 88.079243550 -40.491507961 -} -85120a33fffffff -{ - 56.388271995 -116.260496799 - 56.305685990 -116.314946303 - 56.233335120 -116.215366404 - 56.243343166 -116.061375084 - 56.325842149 -116.006323852 - 56.398420476 -116.105863971 -} -853a0587fffffff -{ - 31.084328321 -48.904095742 - 31.000743043 -48.942072427 - 30.926960983 -48.879758757 - 30.936651502 -48.779433525 - 31.020227814 -48.741257029 - 31.094122690 -48.803605357 -} -855f8dd3fffffff -{ - 8.871664846 -51.416194619 - 8.950773158 -51.366908598 - 9.029212574 -51.410970889 - 9.028556893 -51.504271250 - 8.949502814 -51.553527727 - 8.871050214 -51.509513502 -} -85bc629bfffffff -{ - -35.759762228 24.637779405 - -35.677115253 24.645416524 - -35.628544427 24.553962736 - -35.662615180 24.454865285 - -35.745249073 24.447148086 - -35.793825390 24.538608349 -} -85f174b3fffffff -{ - -88.161895758 84.433256661 - -88.138855529 81.673516094 - -88.202438840 79.664396722 - -88.293028847 80.415447546 - -88.317801892 83.413659290 - -88.250133223 85.410210981 -} -85d62aaffffffff -{ - -49.449403004 34.107577170 - -49.526391914 34.124062156 - -49.549946855 34.217034530 - -49.496561493 34.293229834 - -49.419691280 34.276554334 - -49.396087753 34.183873530 -} -85165a27fffffff -{ - 50.998245264 177.391089762 - 51.086736062 177.407644485 - 51.142207115 177.289269815 - 51.109094420 177.154392454 - 51.020559077 177.138191821 - 50.965180765 177.256513996 -} -85c90347fffffff -{ - -41.650120402 118.233091525 - -41.589067510 118.144466475 - -41.610560647 118.029235657 - -41.693234741 118.002324202 - -41.754475260 118.091007177 - -41.732853764 118.206544168 -} -85b160a7fffffff -{ - -28.609201388 -128.492709044 - -28.565359784 -128.404147507 - -28.480721709 -128.398077110 - -28.439987203 -128.480350813 - -28.483743199 -128.568737760 - -28.568319153 -128.575025412 -} -85982db7fffffff -{ - -12.040009977 -3.457467902 - -12.118216397 -3.482233334 - -12.179811471 -3.418862064 - -12.163086765 -3.330742973 - -12.084836440 -3.306111313 - -12.023354607 -3.369464829 -} -852da9a3fffffff -{ - 38.253297814 38.693826693 - 38.162914114 38.674424092 - 38.101269319 38.763243415 - 38.129943904 38.871417370 - 38.220252948 38.890981359 - 38.281962140 38.802210321 -} -85bf6a1bfffffff -{ - -43.551134544 149.375417788 - -43.457852742 149.350117042 - -43.425974846 149.225364127 - -43.487309757 149.125695575 - -43.580607121 149.150707156 - -43.612554186 149.275676768 -} -85690d83fffffff -{ - 14.576053838 115.346573915 - 14.666402446 115.328809160 - 14.697731034 115.243506302 - 14.638640174 115.175956049 - 14.548219961 115.193795929 - 14.516962199 115.279110950 -} -85eb5c8ffffffff -{ - -68.440821129 -162.966333047 - -68.508412488 -162.928942564 - -68.524353777 -162.723416631 - -68.472470787 -162.556427436 - -68.404977504 -162.595160956 - -68.389268169 -162.799544124 -} -850034d7fffffff -{ - 75.139053624 39.677493607 - 75.181671365 39.953354567 - 75.266462262 39.923801315 - 75.308497822 39.614855712 - 75.265386597 39.337746457 - 75.180735675 39.370824970 -} -85926573fffffff -{ - -12.989352967 -96.908318803 - -13.062449730 -96.967926246 - -13.151236625 -96.933733286 - -13.166960880 -96.839855155 - -13.093836210 -96.780198407 - -13.005015218 -96.814468998 -} -85119433fffffff -{ - 51.600521205 35.703011121 - 51.548620327 35.809684821 - 51.585265424 35.929071676 - 51.673971710 35.941972465 - 51.725962329 35.835018690 - 51.689156699 35.715444372 -} -85696843fffffff -{ - 17.115406842 121.084613329 - 17.028968670 121.101538225 - 17.004785552 121.187691927 - 17.067105443 121.256984866 - 17.153597051 121.240052642 - 17.177715374 121.153834746 -} -85036417fffffff -{ - 82.246997044 -36.293745371 - 82.324363465 -36.531140590 - 82.336691137 -37.196734607 - 82.271351865 -37.612373813 - 82.194650386 -37.365439996 - 82.182619143 -36.712251126 -} -8598ae8bfffffff -{ - -17.074838208 -11.938107850 - -17.157844613 -11.972404344 - -17.226069999 -11.910751589 - -17.211176436 -11.814766651 - -17.128091390 -11.780590014 - -17.059978482 -11.842278212 -} -85e3a387fffffff -{ - -67.892454646 -133.122742110 - -67.867709785 -132.916223917 - -67.785985507 -132.888932052 - -67.729103246 -133.067079722 - -67.753752720 -133.272553846 - -67.835379313 -133.300921181 -} -85ef1b77fffffff -{ - -78.932345143 -32.970049895 - -78.857015850 -32.651840672 - -78.766456978 -32.831314723 - -78.750759208 -33.323525952 - -78.825397275 -33.643178425 - -78.916421841 -33.469241152 -} -85ecdac3fffffff -{ - -67.928359375 119.315135990 - -67.865956728 119.127017819 - -67.896829499 118.887049238 - -67.990313855 118.833892245 - -68.053015533 119.022322313 - -68.021932812 119.263601599 -} -85daab93fffffff -{ - -47.542460244 167.391211456 - -47.458763782 167.341824692 - -47.448570373 167.207527764 - -47.522091535 167.122279912 - -47.605876262 167.171483963 - -47.616051606 167.306119345 -} -85031c17fffffff -{ - 85.238954011 -118.436089975 - 85.215152967 -119.493786317 - 85.125037191 -119.791780430 - 85.059594772 -119.062421992 - 85.082805865 -118.036751153 - 85.172034193 -117.709017411 -} -8590921bfffffff -{ - -8.034737031 -113.160607475 - -8.099412255 -113.211167835 - -8.179689865 -113.188027716 - -8.195361791 -113.114241691 - -8.130648989 -113.063592833 - -8.050301841 -113.086818511 -} -8527a13bfffffff -{ - 49.774636286 -103.392508733 - 49.701059310 -103.467422873 - 49.619109492 -103.402785794 - 49.610538851 -103.263493164 - 49.683950117 -103.188297397 - 49.766097800 -103.252674429 -} -85ecc5bbfffffff -{ - -71.849946110 128.991501702 - -71.801786287 128.745099217 - -71.846228341 128.481897469 - -71.939139945 128.463879127 - -71.987595928 128.711483270 - -71.942842575 128.975904282 -} -85f10baffffffff -{ - -83.935132392 80.259226692 - -83.906320618 79.442092392 - -83.965366294 78.826974020 - -84.054430607 79.027500784 - -84.083832756 79.863763256 - -84.023568587 80.480112010 -} -85071e0bfffffff -{ - 73.093098087 -17.398740210 - 73.125112996 -17.653865179 - 73.069702387 -17.868614148 - 72.982567172 -17.827408118 - 72.950844240 -17.573834243 - 73.005965927 -17.359918730 -} -85b86a77fffffff -{ - -30.622211046 120.197761999 - -30.537714714 120.208597182 - -30.491791112 120.138459353 - -30.530248578 120.057530904 - -30.614628290 120.046556113 - -30.660667143 120.116649134 -} -852d994ffffffff -{ - 32.844362699 42.004359926 - 32.753407002 41.983454721 - 32.690782984 42.063126346 - 32.719044283 42.163637136 - 32.809906969 42.184669531 - 32.872601403 42.105064231 -} -858c752ffffffff -{ - -12.019988414 99.783167772 - -11.939312472 99.760589135 - -11.918476521 99.671953917 - -11.978356970 99.605927029 - -12.059014110 99.628551907 - -12.079809676 99.717157513 -} -859cc217fffffff -{ - -8.393670769 140.523401613 - -8.484813297 140.538579882 - -8.516859025 140.628091079 - -8.457796833 140.702431869 - -8.366652618 140.687278433 - -8.334572209 140.597759315 -} -85de36abfffffff -{ - -58.817367421 -51.014396118 - -58.766672104 -50.864773664 - -58.677848207 -50.875543177 - -58.639701737 -51.035001681 - -58.690139867 -51.184235351 - -58.778980911 -51.174399783 -} -85a7416ffffffff -{ - -25.731351828 106.746306899 - -25.805875624 106.782860291 - -25.811622268 106.861365372 - -25.742948734 106.903203175 - -25.668528884 106.866671810 - -25.662678697 106.788280518 -} -8577826ffffffff -{ - -2.068140452 150.834045980 - -2.160523873 150.847310299 - -2.192872600 150.932812006 - -2.132899715 151.005024621 - -2.040564235 150.991797351 - -2.008153652 150.906320386 -} -85e2442bfffffff -{ - -53.363128411 -140.108348871 - -53.337783893 -139.973160942 - -53.249711420 -139.942095802 - -53.187121333 -140.045830442 - -53.212465781 -140.180521007 - -53.300400284 -140.211973112 -} -85169a87fffffff -{ - 44.955777666 158.499047891 - 45.048832452 158.488944968 - 45.086946719 158.369247320 - 45.031963943 158.259900424 - 44.938961696 158.270299078 - 44.900889511 158.389749213 -} -85f2eb37fffffff -{ - -76.485000039 -100.034878193 - -76.506952634 -99.657572052 - -76.439000189 -99.381598608 - -76.349653767 -99.483062291 - -76.328035285 -99.856398563 - -76.395431646 -100.132216168 -} -85eaed63fffffff -{ - -70.499122136 -169.293911657 - -70.570091510 -169.278986828 - -70.595031609 -169.059593340 - -70.548690741 -168.856271378 - -70.477751101 -168.872973645 - -70.453121278 -169.091222603 -} -85a89b23fffffff -{ - -16.518501089 -41.465618212 - -16.438487435 -41.414326333 - -16.356905321 -41.462437927 - -16.355348338 -41.561831234 - -16.435376252 -41.613136479 - -16.516946885 -41.565035203 -} -85d46d0bfffffff -{ - -46.286950165 -176.870768338 - -46.216236274 -176.810524846 - -46.138841499 -176.873160632 - -46.132152532 -176.995816919 - -46.202798758 -177.056076192 - -46.280201581 -176.993663850 -} -85c86a37fffffff -{ - -46.283189842 99.529420380 - -46.205016016 99.459244303 - -46.207054532 99.322892266 - -46.287266026 99.256226421 - -46.365617107 99.326162512 - -46.363579438 99.463005705 -} -852cedc7fffffff -{ - 41.146225641 53.334135208 - 41.073169614 53.413534565 - 41.087762548 53.534100161 - 41.175515212 53.575563420 - 41.248722331 53.496152946 - 41.234025504 53.375289790 -} -85d0ed87fffffff -{ - -49.021282419 21.210608821 - -49.106524611 21.209740504 - -49.144019810 21.312284366 - -49.096265561 21.415410225 - -49.011115452 21.415977201 - -48.973627415 21.313719265 -} -8580b0c3fffffff -{ - -3.317774110 -32.520332261 - -3.235042010 -32.472370575 - -3.151364985 -32.519342421 - -3.150384297 -32.614303575 - -3.233126135 -32.662315439 - -3.316838929 -32.615316094 -} -85dd411bfffffff -{ - -58.495419822 -30.272878190 - -58.423805976 -30.166469611 - -58.341477128 -30.237314715 - -58.330550785 -30.413937299 - -58.401891364 -30.520615801 - -58.484431310 -30.450404884 -} -85e20b0bfffffff -{ - -56.565768895 -133.463033867 - -56.533922904 -133.315126091 - -56.443561210 -133.294737450 - -56.385151857 -133.421707116 - -56.416949268 -133.569075189 - -56.507204353 -133.590012104 -} -85b956c7fffffff -{ - -34.981833309 129.636770053 - -34.890382823 129.638037003 - -34.844673196 129.548019863 - -34.890295456 129.456719486 - -34.981656909 129.455242649 - -35.027485212 129.545275865 -} -8590d87bfffffff -{ - -2.362551295 -121.095490090 - -2.299728669 -121.056600679 - -2.231697193 -121.100755730 - -2.226578848 -121.183804170 - -2.289459952 -121.222610402 - -2.357400976 -121.178451495 -} -85399ad7fffffff -{ - 28.392389507 -8.625892985 - 28.325072888 -8.699547447 - 28.235792339 -8.673570845 - 28.213833271 -8.574140891 - 28.281048139 -8.500555677 - 28.370323693 -8.526331032 -} -85ee2dcbfffffff -{ - -75.248684677 -49.818247230 - -75.193411684 -49.505276160 - -75.096506116 -49.536699182 - -75.054806660 -49.876936189 - -75.109584820 -50.188324316 - -75.206554276 -50.161064860 -} -855e51b3fffffff -{ - 15.604894545 -60.282394612 - 15.678508676 -60.236270793 - 15.746293537 -60.275682200 - 15.740476565 -60.361146932 - 15.666933071 -60.407212907 - 15.599135964 -60.367872058 -} -85b13577fffffff -{ - -35.861756486 -121.432377514 - -35.810567626 -121.334403676 - -35.717914575 -121.337960495 - -35.676480376 -121.439193858 - -35.727555495 -121.536996875 - -35.820178332 -121.533737293 -} -854f6ddbfffffff -{ - 9.941395304 147.179419143 - 9.846859902 147.193745091 - 9.810710072 147.283081993 - 9.869065336 147.358078675 - 9.963558038 147.343787638 - 9.999738224 147.254464961 -} -85dc158bfffffff -{ - -55.273097204 -13.128195653 - -55.352213245 -13.186505738 - -55.419505764 -13.086323661 - -55.407587141 -12.927713806 - -55.328399804 -12.869715645 - -55.261202278 -12.970014280 -} -85be26abfffffff -{ - -37.139739594 157.106570532 - -37.046118498 157.074186122 - -37.021750888 156.956371039 - -37.090968247 156.870711846 - -37.184647549 156.902885468 - -37.209051400 157.020929482 -} -8570ca03fffffff -{ - -4.887056405 -166.915865755 - -4.966461599 -166.938251780 - -5.031495942 -166.877504087 - -5.017193368 -166.794310381 - -4.937778686 -166.771846389 - -4.872675984 -166.832654031 -} -85208177fffffff -{ - 38.185654976 72.561968296 - 38.100047014 72.616427098 - 38.094029066 72.738801215 - 38.173596049 72.807040675 - 38.259319950 72.752784966 - 38.265360983 72.630086000 -} -85342baffffffff -{ - 33.399447016 -21.765551368 - 33.322556460 -21.836866258 - 33.232535898 -21.793011976 - 33.219348511 -21.678021945 - 33.296138577 -21.606669362 - 33.386216437 -21.650344091 -} -85cae55bfffffff -{ - -43.008225878 59.926054362 - -43.094772752 59.940033936 - -43.133963174 60.052431013 - -43.086554386 60.150771755 - -42.999979411 60.136585192 - -42.960841201 60.024264852 -} -85172e6ffffffff -{ - 62.909676944 156.967680705 - 62.817817648 156.996029807 - 62.783629191 157.188175973 - 62.841064248 157.352860879 - 62.932996145 157.325740659 - 62.967421301 157.132704705 -} -85ef924ffffffff -{ - -75.201338082 12.762295500 - -75.106573510 12.727042660 - -75.065616794 12.396420672 - -75.119063387 12.098326586 - -75.213973524 12.129622720 - -75.255294203 12.462979212 -} -85ec4117fffffff -{ - -78.165966461 140.129045010 - -78.136972009 139.739767595 - -78.194830100 139.400976670 - -78.282167169 139.450686888 - -78.311465159 139.844091713 - -78.253119764 140.183635378 -} -85b4cc63fffffff -{ - -18.916931004 -160.698795683 - -18.828407453 -160.661817520 - -18.754950783 -160.724948604 - -18.769931135 -160.825009769 - -18.858380566 -160.862084646 - -18.931923804 -160.799001892 -} -85efb4c7fffffff -{ - -80.638476128 19.501985734 - -80.545350437 19.380829115 - -80.515674560 18.842383085 - -80.578703814 18.416954390 - -80.672200243 18.529117886 - -80.702302086 19.075774547 -} -857a8557fffffff -{ - 5.225200917 48.632099805 - 5.307511989 48.629654652 - 5.354681729 48.556990078 - 5.319566316 48.486684127 - 5.237193053 48.489080603 - 5.189997349 48.561831758 -} -8501a9d7fffffff -{ - 74.244270417 41.899086372 - 74.283581666 42.165820094 - 74.367936827 42.150719905 - 74.412885749 41.865725323 - 74.373117651 41.597656181 - 74.288859667 41.615914298 -} -8500c63bfffffff -{ - 84.135784176 77.062233737 - 84.129487846 77.958383276 - 84.207481809 78.470796301 - 84.292908017 78.077194901 - 84.299308473 77.155483449 - 84.220175883 76.653406811 -} -8522e56ffffffff -{ - 50.140063579 -171.608558041 - 50.224885388 -171.577749388 - 50.289466832 -171.678119814 - 50.269145457 -171.809401739 - 50.184236633 -171.839952060 - 50.119736096 -171.739479528 -} -85550c6ffffffff -{ - 22.281353371 -10.092611752 - 22.213885368 -10.160989094 - 22.128359819 -10.135069582 - 22.110290112 -10.040946349 - 22.177646892 -9.972620319 - 22.263184465 -9.998366077 -} -857d4803fffffff -{ - -2.433628442 -29.835090351 - -2.351742878 -29.788346921 - -2.268862911 -29.834738306 - -2.267825172 -29.927910763 - -2.349724597 -29.974713662 - -2.432647911 -29.928284746 -} -8598b537fffffff -{ - -16.402726006 -14.692855393 - -16.484502845 -14.729244989 - -16.552867509 -14.670308352 - -16.539346560 -14.574929753 - -16.457480892 -14.538645391 - -16.389224961 -14.597634141 -} -857b752ffffffff -{ - -8.364083852 43.434809449 - -8.270328736 43.434161256 - -8.222155879 43.353896274 - -8.267732273 43.274193968 - -8.361551492 43.274780304 - -8.409730257 43.355130848 -} -85e15b27fffffff -{ - -61.108815829 49.976181232 - -61.023321958 50.019808657 - -60.966066529 49.901745006 - -60.994079409 49.740175631 - -61.079383601 49.695854853 - -61.136864795 49.813794265 -} -85ec6c03fffffff -{ - -79.220370470 151.898285602 - -79.208624732 151.464383429 - -79.278057595 151.169149923 - -79.359722256 151.309367656 - -79.371584407 151.749179591 - -79.301664072 152.042813056 -} -85c5097bfffffff -{ - -34.974370137 -32.913850973 - -35.052432584 -32.972483251 - -35.134563326 -32.923747855 - -35.138605310 -32.816176383 - -35.060427238 -32.757550359 - -34.978322902 -32.806489210 -} -850491c3fffffff +85b5a213fffffff +{ + -33.116961294 -147.145090833 + -33.024169496 -147.115812809 + -32.957257584 -147.195898800 + -32.983071246 -147.305314352 + -33.075865435 -147.334780459 + -33.142843675 -147.254643131 +} +85c0e2d7fffffff +{ + -40.051147870 -9.780094932 + -40.142280860 -9.822305728 + -40.215553357 -9.739731026 + -40.197600003 -9.614908772 + -40.106411958 -9.572917888 + -40.033232220 -9.655528831 +} +85021917fffffff +{ + 76.147854911 -106.768123469 + 76.066811715 -106.950350301 + 75.991699893 -106.760719072 + 75.997226180 -106.390307278 + 76.077927818 -106.205690444 + 76.153445210 -106.393847829 +} +85c305b3fffffff +{ + -43.071262369 -64.257841998 + -42.994307811 -64.233924740 + -42.931659070 -64.305707683 + -42.945839473 -64.401512863 + -43.022815203 -64.425724273 + -43.085589537 -64.353836489 +} +851625b7fffffff +{ + 59.372045185 163.989103324 + 59.282676247 163.992368999 + 59.241208954 164.151146549 + 59.288853980 164.307153299 + 59.378213320 164.304861989 + 59.419938003 164.145589513 +} +858f1b7bfffffff +{ + -5.889573873 -84.760761365 + -5.967332601 -84.819253599 + -6.056426075 -84.780692601 + -6.067738786 -84.683601944 + -5.989945816 -84.625119714 + -5.900874406 -84.663717993 +} +851d9b3bfffffff +{ + 50.240442187 -151.957693389 + 50.310720006 -151.908412147 + 50.382278323 -151.969752310 + 50.383549620 -152.080639458 + 50.313168727 -152.129878875 + 50.241619671 -152.068273500 +} +853c2663fffffff +{ + 30.212394579 83.338699176 + 30.129478665 83.372365818 + 30.115472570 83.476041509 + 30.184296946 83.546266361 + 30.267275424 83.512819198 + 30.281367126 83.408927363 +} +85d4b21bfffffff +{ + -44.908146530 -148.169522256 + -44.821557149 -148.134985959 + -44.760606129 -148.225715101 + -44.786188847 -148.351036481 + -44.872774691 -148.385812638 + -44.933781479 -148.295027873 +} +8550f3cbfffffff +{ + 26.679339828 -128.578478466 + 26.763577427 -128.537629493 + 26.838639658 -128.594575986 + 26.829386059 -128.692332676 + 26.745161001 -128.733027522 + 26.670176943 -128.676119959 +} +8580c687fffffff +{ + 2.673851425 -41.109546071 + 2.755927084 -41.059665986 + 2.839892625 -41.106533032 + 2.841809061 -41.203272032 + 2.759756875 -41.253166348 + 2.675764782 -41.206307572 +} +85f29dcbfffffff +{ + -87.592013295 -99.836201860 + -87.616711171 -97.705233333 + -87.548282396 -96.236314696 + -87.458154356 -96.891532193 + -87.434864469 -98.900076355 + -87.500361097 -100.371431369 +} +8546721bfffffff +{ + 24.476891534 -164.770509375 + 24.387712532 -164.797264601 + 24.325139236 -164.727688528 + 24.351738283 -164.631289673 + 24.440962582 -164.604436709 + 24.503542574 -164.674080263 +} +8512e12bfffffff +{ + 53.523929994 -114.169238289 + 53.443828490 -114.224795244 + 53.369920487 -114.135844275 + 53.375893892 -113.991413585 + 53.455894807 -113.935363726 + 53.530023208 -114.024235985 +} +850b252bfffffff +{ + 62.477114547 65.215056253 + 62.401856267 65.320493419 + 62.406141737 65.521366216 + 62.485711274 65.617681503 + 62.561137405 65.512590770 + 62.556826056 65.310835160 +} +8558754ffffffff +{ + 15.795669630 11.548268290 + 15.704447735 11.553851563 + 15.660257456 11.639306817 + 15.707237262 11.719293638 + 15.798511373 11.713839368 + 15.842753559 11.628269178 +} +8540ca73fffffff +{ + 33.889329457 100.228827465 + 33.968627183 100.202785059 + 33.993193341 100.100040411 + 33.938457282 100.023376702 + 33.859145588 100.049482560 + 33.834583856 100.152188800 +} +85ad2017fffffff +{ + -35.430320416 14.407030325 + -35.521091241 14.397862318 + -35.574246518 14.483943909 + -35.536578137 14.579026276 + -35.445878796 14.587964416 + -35.392776253 14.502049950 +} +8596b4c7fffffff +{ + -8.652140772 37.295859515 + -8.556341444 37.297637139 + -8.505923361 37.215155705 + -8.551283348 37.130832262 + -8.647119248 37.128987757 + -8.697558659 37.211533593 +} +85e6ce37fffffff +{ + -57.549356078 7.405374186 + -57.465895662 7.404792726 + -57.419482560 7.262831096 + -57.456313990 7.121020069 + -57.539806080 7.120791386 + -57.586435706 7.263184020 +} +85d88d4bfffffff +{ + -43.118877048 136.295907111 + -43.026125036 136.288481426 + -42.981908300 136.177915792 + -43.030340791 136.074687830 + -43.123037486 136.081824245 + -43.167357160 136.192477771 +} +85b38d43fffffff +{ + -24.521505801 -75.342667023 + -24.597345975 -75.401099373 + -24.677818186 -75.358396773 + -24.682433548 -75.257260973 + -24.606610954 -75.198889858 + -24.526155444 -75.241593144 +} +85a04b8bfffffff +{ + -14.767275397 -146.910039085 + -14.680393325 -146.885536329 + -14.613919830 -146.953197752 + -14.634231930 -147.045400029 + -14.721097008 -147.070037212 + -14.787667091 -147.002337808 +} +85270857fffffff +{ + 48.463295385 -93.829398508 + 48.396159869 -93.921394217 + 48.308667226 -93.875778968 + 48.288156108 -93.738557755 + 48.355090816 -93.646450335 + 48.442737296 -93.691674583 +} +85cb4b93fffffff +{ + -34.305447014 63.206787086 + -34.398708462 63.222604256 + -34.435886061 63.328617323 + -34.379745210 63.418726941 + -34.286463116 63.402736201 + -34.249342408 63.296809340 +} +85c2e84ffffffff +{ + -33.444761957 -59.920195582 + -33.515878654 -59.968556493 + -33.577221789 -59.926335348 + -33.567438451 -59.835812195 + -33.496371623 -59.787569130 + -33.435038293 -59.829731301 +} +85e67127fffffff +{ + -65.658782947 5.928502264 + -65.567557924 5.933432318 + -65.517045572 5.743050107 + -65.557472170 5.547007443 + -65.648720015 5.540574543 + -65.699519562 5.731686987 +} +8516e927fffffff +{ + 50.138203292 176.346335675 + 50.227717563 176.361187787 + 50.282541990 176.243222375 + 50.247760084 176.110470641 + 50.158205593 176.095968086 + 50.103473018 176.213867306 +} +8570184bfffffff +{ + 1.746568039 -171.029359770 + 1.663076151 -171.049896680 + 1.597522071 -170.989072799 + 1.615402586 -170.907635973 + 1.698931228 -170.887014841 + 1.764542664 -170.947914741 +} +85005e1bfffffff +{ + 86.020363182 9.633031703 + 86.100091217 10.182535980 + 86.175439015 9.394322535 + 86.169211143 8.037723668 + 86.088120089 7.523780271 + 86.014607925 8.329480384 +} +854471a7fffffff +{ + 28.931219503 -91.306723703 + 29.001403304 -91.239575238 + 29.090161942 -91.274059610 + 29.108758952 -91.375855054 + 29.038513862 -91.443059973 + 28.949733117 -91.408413139 +} +8572a2d7fffffff +{ + -1.089591918 133.121052684 + -1.184517504 133.137279693 + -1.218639451 133.227615450 + -1.157834752 133.301756198 + -1.062879166 133.285542520 + -1.028758223 133.195174692 +} +85ae28a7fffffff +{ + -22.474989316 96.440091752 + -22.558892442 96.474274812 + -22.573247593 96.563475212 + -22.503771756 96.618354246 + -22.419978651 96.584150262 + -22.405551418 96.495087989 +} +8505047bfffffff +{ + 78.301743940 107.789256383 + 78.247276482 108.174528925 + 78.288168828 108.598045001 + 78.384060976 108.640318188 + 78.439131029 108.252517693 + 78.397701702 107.824959627 +} +8503442ffffffff +{ + 81.258901965 -58.366009976 + 81.236829391 -58.925624607 + 81.153957089 -59.043185316 + 81.093466832 -58.609288134 + 81.115152069 -58.057582751 + 81.197710515 -57.931935505 +} +85ae583bfffffff +{ + -24.935582664 103.511234846 + -25.013295458 103.547389060 + -25.021581856 103.629856058 + -24.952251810 103.676044728 + -24.874646935 103.639900223 + -24.866264259 103.557557213 +} +85925407fffffff +{ + -14.791409710 -101.890171593 + -14.860873108 -101.948522945 + -14.948198548 -101.917073994 + -14.966113989 -101.827186081 + -14.896627520 -101.768765530 + -14.809248693 -101.800302030 +} +85862977fffffff +{ + -9.757720727 81.471933006 + -9.845268602 81.496994627 + -9.871198560 81.587366609 + -9.809568456 81.652561011 + -9.722096677 81.627423342 + -9.696178866 81.537167155 +} +8568a8bbfffffff +{ + 3.038941585 116.546000591 + 2.951479656 116.562514582 + 2.921030788 116.642604055 + 2.979834330 116.706484554 + 3.069113702 116.690194934 + 3.099500393 116.610038258 + 3.070078762 116.578130034 +} +85e405d3fffffff +{ + -61.557104403 104.386807780 + -61.477457533 104.269203750 + -61.485978365 104.065906378 + -61.574194439 103.979134231 + -61.654086245 104.096369371 + -61.645516830 104.300749657 +} +85a99ca3fffffff +{ + -26.590593904 -41.828762295 + -26.518797526 -41.776612668 + -26.445470095 -41.825443984 + -26.443959212 -41.926412770 + -26.515777131 -41.978574448 + -26.589084386 -41.929755449 +} +851ad287fffffff +{ + 41.302702658 -48.248058275 + 41.216865982 -48.292442549 + 41.145473450 -48.221550924 + 41.159821447 -48.106235724 + 41.245659095 -48.061592817 + 41.317147879 -48.132523399 +} +85c12bcbfffffff +{ + -26.424289128 -9.483659514 + -26.514299449 -9.519206446 + -26.586803343 -9.448845303 + -26.569187357 -9.342913057 + -26.479112773 -9.307526171 + -26.406718347 -9.377911173 +} +850330d3fffffff { - 64.501771883 139.500837303 - 64.416009527 139.593545521 - 64.406574759 139.814204336 - 64.482844251 139.943568800 - 64.568867809 139.851800677 - 64.578360965 139.629721871 + 87.572894193 171.438289224 + 87.480430742 171.205065568 + 87.422802641 172.903848040 + 87.454766772 174.868648321 + 87.546367183 175.235423606 + 87.606955614 173.506543433 } -8507948ffffffff -{ - 79.979929289 -26.719358659 - 80.003635268 -27.182112855 - 79.941966375 -27.495287320 - 79.857129315 -27.345580083 - 79.833712978 -26.888660800 - 79.894847041 -26.575657984 -} -8515991bfffffff -{ - 49.825268805 122.116038932 - 49.764336304 122.204857738 - 49.775929610 122.336060534 - 49.848556049 122.378926872 - 49.909714201 122.290160208 - 49.898019968 122.158473925 -} -858a1bc7fffffff -{ - -4.220734357 -61.564788924 - -4.143235545 -61.517846555 - -4.061751409 -61.557682001 - -4.057806081 -61.644382573 - -4.135258997 -61.691260194 - -4.216703125 -61.651502052 -} -85ac5b0ffffffff -{ - -19.453032906 2.251098721 - -19.538502154 2.230321420 - -19.601797096 2.301192080 - -19.579512911 2.392782721 - -19.494032509 2.413392836 - -19.430847304 2.342579599 -} -8500de6ffffffff -{ - 83.491864823 108.312344067 - 83.438116323 108.992003875 - 83.478391728 109.750860453 - 83.573306452 109.843357329 - 83.628145989 109.156226923 - 83.586965283 108.383984344 -} -85eef37bfffffff -{ - -67.900957781 -24.775777813 - -67.819343128 -24.642962095 - -67.735119729 -24.765655419 - -67.732184594 -25.020156434 - -67.813465862 -25.153862923 - -67.898015585 -25.032187287 -} -8580992ffffffff -{ - 3.362311770 -35.037888819 - 3.443204666 -34.989473575 - 3.526591398 -35.036311046 - 3.529128023 -35.131580940 - 3.448246406 -35.180035868 - 3.364816874 -35.133181346 -} -857b3563fffffff -{ - -8.274338461 51.335282358 - -8.184708345 51.331738429 - -8.140074441 51.256793233 - -8.185084572 51.185290987 - -8.274806512 51.188784665 - -8.319426492 51.263830905 -} -8507504ffffffff -{ - 67.446406201 -20.987475988 - 67.470563249 -21.188013185 - 67.408884385 -21.344030492 - 67.323299614 -21.299193703 - 67.299372738 -21.099683277 - 67.360801254 -20.943985442 -} -85f1a823fffffff -{ - -79.344102079 102.483777961 - -79.271205041 102.210001100 - -79.275694135 101.715140590 - -79.353143625 101.487610585 - -79.426593106 101.758724940 - -79.422039983 102.260092860 -} -850da48bfffffff -{ - 72.139085887 -175.685149015 - 72.048582113 -175.784373812 - 71.978040699 -175.583680869 - 71.997569508 -175.284246689 - 72.087762792 -175.182871477 - 72.158738700 -175.383065827 -} -85974a4ffffffff -{ - -17.514686141 22.356941681 - -17.418710335 22.364827985 - -17.363492043 22.281956821 - -17.404216544 22.191205890 - -17.500157201 22.183254920 - -17.555408576 22.266119483 -} -853373b3fffffff -{ - 27.154184196 166.818046658 - 27.249905811 166.818843365 - 27.298737924 166.725179749 - 27.251757947 166.630827875 - 27.156044780 166.630234212 - 27.107302985 166.723789392 -} -857d9d93fffffff -{ - -3.034905357 -15.472893155 - -2.959261620 -15.435198656 - -2.883960241 -15.475628250 - -2.884242028 -15.553824948 - -2.959927754 -15.591606547 - -3.035289721 -15.551104368 -} -85b8c9c7fffffff -{ - -23.112825762 122.935026004 - -23.030569853 122.942496530 - -22.991576877 122.874447124 - -23.034714627 122.798951471 - -23.116873310 122.791352294 - -23.155991492 122.859377244 -} -85a70e4ffffffff -{ - -27.889151300 113.702016216 - -27.836660071 113.639167973 - -27.848281676 113.549978673 - -27.912465752 113.523443326 - -27.965102036 113.586289424 - -27.953409032 113.675673295 -} -85cb93cffffffff -{ - -42.216452451 43.557808025 - -42.298416362 43.555977331 - -42.348798674 43.644978498 - -42.317164172 43.735854048 - -42.235118413 43.737523950 - -42.184788960 43.648479323 -} -854460cbfffffff -{ - 27.760180551 -92.645164362 - 27.831871014 -92.578764747 - 27.920798586 -92.614295432 - 27.938050705 -92.716382616 - 27.866295198 -92.782829433 - 27.777352685 -92.747142024 -} -85007683fffffff -{ - 80.900050231 17.141923303 - 80.969795594 17.438885152 - 81.048314357 17.171936977 - 81.056374442 16.602353500 - 80.985912980 16.309516116 - 80.908108034 16.582027579 -} -851a48b3fffffff -{ - 44.939310714 -30.950073001 - 44.859436028 -31.022647494 - 44.776479629 -30.960846347 - 44.773315562 -30.826622943 - 44.853118465 -30.753889042 - 44.936157208 -30.815537223 -} -85a98d97fffffff -{ - -26.833735030 -45.923308329 - -26.763846124 -45.870883531 - -26.689541912 -45.919019194 - -26.685153856 -46.019549028 - -26.755059239 -46.071966245 - -26.829336200 -46.023861364 -} -8506cdbbfffffff -{ - 62.263933748 -46.328515749 - 62.251703218 -46.522981600 - 62.164579966 -46.599011676 - 62.089912155 -46.481229633 - 62.102148587 -46.287836088 - 62.189046844 -46.211156306 -} -85255d7bfffffff -{ - 49.614547046 107.785899459 - 49.525838904 107.784319353 - 49.481927693 107.891372711 - 49.526565238 108.000085606 - 49.615172184 108.002069231 - 49.659242944 107.894936906 -} -85f28237fffffff -{ - -87.727839235 -129.153478616 - -87.792824308 -127.501710336 - -87.763724456 -125.266389154 - -87.671387003 -124.821053388 - -87.609515935 -126.462714286 - -87.636952402 -128.564553334 -} -85d04877fffffff -{ - -46.674431071 26.031476706 - -46.758038134 26.037243208 - -46.792166862 26.132844822 - -46.742702124 26.222405727 - -46.659204875 26.216396620 - -46.625062515 26.121068791 -} -8500108bfffffff -{ - 77.803297655 50.776702430 - 77.833951943 51.160810267 - 77.921918725 51.209370531 - 77.979309888 50.868411449 - 77.948164509 50.480522030 - 77.860122791 50.437389118 -} -85694107fffffff -{ - 15.399149655 120.769402071 - 15.311670031 120.786268880 - 15.286587028 120.871926280 - 15.349049162 120.940781187 - 15.436586721 120.923906586 - 15.461604247 120.838184809 -} -85e4d94bfffffff -{ - -53.366406127 85.466424905 - -53.277562058 85.416019068 - -53.260768739 85.261453443 - -53.332697567 85.156698229 - -53.421643123 85.206535256 - -53.438558712 85.361697840 -} -8512ec9bfffffff -{ - 53.883128531 -112.914722869 - 53.803025856 -112.974055916 - 53.727800517 -112.886069359 - 53.732455888 -112.738856386 - 53.812448162 -112.679033961 - 53.887895749 -112.766912284 -} -85e01a0bfffffff -{ - -55.161676035 61.451437577 - -55.073190255 61.460826263 - -55.029333568 61.337013815 - -55.073739010 61.203645421 - -55.162124337 61.193620720 - -55.206205049 61.317599667 -} -85f2a297fffffff -{ - -84.995734089 -166.866266194 - -85.083818667 -166.757109967 - -85.115066736 -165.784663054 - -85.057102066 -164.945379471 - -84.969329873 -165.086406283 - -84.939188435 -166.035126159 -} -858c8c8bfffffff -{ - -2.476002288 105.555410187 - -2.387447967 105.534241650 - -2.364007167 105.445369717 - -2.429181745 105.377681722 - -2.517747422 105.398909833 - -2.541127236 105.487766428 -} -8543344ffffffff -{ - 28.721041577 50.877373879 - 28.653862048 50.943699305 - 28.664656844 51.040110690 - 28.742731344 51.070381246 - 28.810056023 51.004028344 - 28.799160876 50.907432115 -} -85f2ac0ffffffff -{ - -83.649284467 -140.703866827 - -83.723689237 -140.261649016 - -83.714065954 -139.441870922 - -83.630114345 -139.084944903 - -83.556736080 -139.534910627 - -83.566285240 -140.334387392 -} -85cf2617fffffff -{ - -56.147364928 -77.456925637 - -56.064626676 -77.391733428 - -55.992152073 -77.477521790 - -56.002260119 -77.628454881 - -56.084948934 -77.694138797 - -56.157579337 -77.608399249 -} -857070c7fffffff -{ - 4.470402006 -165.699683614 - 4.382682314 -165.723701742 - 4.314602533 -165.660094432 - 4.334187907 -165.572408473 - 4.421932793 -165.548306985 - 4.490067176 -165.611974763 -} -854b5e13fffffff -{ - 28.273334139 132.874029252 - 28.193622090 132.890997385 - 28.168299797 132.985282921 - 28.222716522 133.062636027 - 28.302433564 133.045681978 - 28.327728963 132.951360658 -} -859da687fffffff -{ - -16.195849586 155.636099177 - -16.110637990 155.611842330 - -16.086683072 155.519046324 - -16.147884522 155.450368990 - -16.233155332 155.474489461 - -16.257165581 155.567423832 -} -852f2693fffffff -{ - 30.395463620 152.608061821 - 30.488743374 152.593525919 - 30.526003787 152.495002796 - 30.469958549 152.411210351 - 30.376766502 152.425925868 - 30.339531905 152.524254479 -} -85ee0637fffffff -{ - -75.452249492 -32.482723647 - -75.376133498 -32.241055979 - -75.285402718 -32.381479372 - -75.270416837 -32.760391775 - -75.345998326 -33.002987566 - -75.437098795 -32.865772515 -} -8582ec03fffffff -{ - -0.791114925 5.203498117 - -0.706249479 5.215657279 - -0.659678048 5.153233439 - -0.697894128 5.078717456 - -0.782664476 5.066532453 - -0.829313823 5.128889203 -} -85f06477fffffff -{ - -80.693203009 29.971930872 - -80.605694997 29.751912061 - -80.592271873 29.193370133 - -80.666212027 28.845257355 - -80.754323728 29.058393431 - -80.767893846 29.626633293 -} -85ae327bfffffff -{ - -27.057524102 91.533987715 - -27.144397927 91.567880748 - -27.159784837 91.665443135 - -27.088354957 91.728955149 - -27.001577161 91.695014058 - -26.986133232 91.597608776 -} -85cb2b3bfffffff -{ - -32.648036911 53.443238917 - -32.740030156 53.450065560 - -32.783679211 53.544790735 - -32.735257703 53.632668422 - -32.643198826 53.625679217 - -32.599627017 53.530974965 -} -850465abfffffff -{ - 79.475163313 -176.325773962 - 79.383952299 -176.487397186 - 79.311949116 -176.145791401 - 79.330450612 -175.643768797 - 79.421189350 -175.475959359 - 79.493901740 -175.816288053 -} -85c02207fffffff -{ - -32.373667136 -11.125478842 - -32.464991427 -11.165324006 - -32.539740822 -11.091401677 - -32.523065232 -10.977591366 - -32.431673714 -10.937920145 - -32.357024931 -11.011884888 -} -85ef29cffffffff -{ - -80.906220332 -69.855501208 - -80.881902335 -69.275259300 - -80.789088775 -69.125869927 - -80.721038254 -69.547615411 - -80.744976525 -70.118505686 - -80.837340021 -70.276908441 -} -85d21a67fffffff -{ - -42.883785290 -104.022403046 - -42.816198391 -103.927771516 - -42.722172602 -103.960564608 - -42.695649267 -104.087664295 - -42.763087503 -104.182305960 - -42.857197554 -104.149838457 -} -85052e1bfffffff -{ - 80.485601078 106.287152741 - 80.433725535 106.766379833 - 80.477035855 107.278612969 - 80.572885071 107.317282649 - 80.625479936 106.833807224 - 80.581499258 106.315896135 -} -85cb31b7fffffff -{ - -32.139947772 48.616418468 - -32.230070333 48.618988655 - -32.275978920 48.706871032 - -32.231684335 48.792191804 - -32.141477381 48.789472822 - -32.095649364 48.701581994 -} -85ef5ed7fffffff -{ - -75.291577831 -55.754164550 - -75.244649506 -55.421437880 - -75.147626937 -55.415046703 - -75.097580399 -55.737179299 - -75.144070386 -56.067556789 - -75.241042221 -56.078147633 -} -85446a2bfffffff -{ - 31.492974435 -93.701418421 - 31.563828687 -93.632974597 - 31.652412468 -93.670776557 - 31.670156028 -93.777187082 - 31.599244031 -93.845674130 - 31.510646284 -93.807707621 -} -85d75027fffffff -{ - -51.425627153 30.816084985 - -51.504110302 30.828988581 - -51.529335293 30.928909649 - -51.476112997 31.015603909 - -51.397741309 31.002460451 - -51.372480437 30.902862014 -} -85df9d47fffffff -{ - -59.234828530 -42.003323377 - -59.173754236 -41.867601530 - -59.085862712 -41.906017895 - -59.058933019 -42.079264819 - -59.119717902 -42.214876325 - -59.207721249 -42.177353282 -} -85654897fffffff -{ - 1.609687054 91.173273548 - 1.701562061 91.147394246 - 1.726231030 91.054588265 - 1.659024255 90.987715264 - 1.567192096 91.013623125 - 1.542523823 91.106375541 -} -851941b3fffffff -{ - 52.894141883 1.906481003 - 52.849453534 1.801634979 - 52.765144146 1.820063319 - 52.725578877 1.942950435 - 52.770225386 2.047540046 - 52.854478838 2.029498811 -} -85c38d87fffffff -{ - -41.928120050 -55.826547318 - -41.892406471 -55.732119203 - -41.825694429 -55.729731322 - -41.794710983 -55.821432043 - -41.830278328 -55.915669479 - -41.896975045 -55.918396797 -} -85f35e3bfffffff -{ - -74.432707165 -138.336205744 - -74.497315795 -138.151245634 - -74.482135545 -137.830223508 - -74.402389233 -137.697327082 - -74.338219188 -137.883303768 - -74.353357344 -138.201180437 -} -85ec0893fffffff +8562a817fffffff +{ + 6.926888445 57.135085210 + 6.851473707 57.140115769 + 6.836464513 57.161676010 + 6.823447750 57.209455120 + 6.870880334 57.273746573 + 6.937762198 57.266316913 + 6.957207619 57.194683955 +} +85eb82c3fffffff +{ + -58.250071900 -171.885544471 + -58.189670442 -171.816443386 + -58.124080670 -171.900218291 + -58.118842259 -172.052820534 + -58.179176124 -172.122013203 + -58.244815957 -172.038512972 +} +85f2b4b7fffffff +{ + -85.073070782 172.038515972 + -85.158069967 171.759424167 + -85.217193905 172.530405232 + -85.189747323 173.579046814 + -85.103987055 173.827599843 + -85.046416358 173.058523763 +} +859b0c03fffffff +{ + -20.896751696 -175.322826779 + -20.814493322 -175.277332833 + -20.738436478 -175.326971516 + -20.744592159 -175.421979075 + -20.826740292 -175.467490921 + -20.902842918 -175.417977524 +} +85291177fffffff +{ + 34.002761664 -121.912880943 + 34.086562801 -121.861601349 + 34.163223321 -121.921094254 + 34.156020340 -122.031867924 + 34.072215353 -122.082994063 + 33.995617162 -122.023500270 +} +850f6e2bfffffff +{ + 59.244971444 -56.476400740 + 59.217375980 -56.653547932 + 59.124126164 -56.696996625 + 59.058625075 -56.564075752 + 59.086132512 -56.387749488 + 59.179228670 -56.343525617 +} +85b7223bfffffff +{ + -38.038712927 -95.973792139 + -37.967786476 -95.897312609 + -37.878733837 -95.938538769 + -37.860482828 -96.056031898 + -37.931271846 -96.132612128 + -38.020449251 -96.091599173 +} +85ded85bfffffff +{ + -47.056769508 -44.199129144 + -47.118352523 -44.272552412 + -47.200599485 -44.235129250 + -47.221301456 -44.123972907 + -47.159642624 -44.050443308 + -47.077357737 -44.088176187 +} +8547043bfffffff +{ + 33.511769058 -171.584920127 + 33.603267715 -171.560537799 + 33.666285993 -171.639850118 + 33.637705607 -171.743609325 + 33.546101389 -171.767830410 + 33.483183077 -171.688453897 +} +851e5e13fffffff +{ + 45.912003335 28.590746146 + 45.824258877 28.579753947 + 45.771910331 28.688438336 + 45.807246230 28.808164686 + 45.894962918 28.819398657 + 45.947371635 28.710664728 +} +85628bcffffffff +{ + 4.029634571 58.088513790 + 3.958222442 58.096691552 + 3.936298045 58.170986834 + 3.985865840 58.237076316 + 4.057283791 58.228805231 + 4.079128229 58.154537992 +} +85acde37fffffff +{ + -15.314005765 8.422031361 + -15.223422594 8.434257178 + -15.166744347 8.363932263 + -15.200603932 8.281448684 + -15.291096731 8.269186134 + -15.347820315 8.339443806 +} +8502e353fffffff +{ + 73.405868993 -105.230145286 + 73.324865324 -105.392013463 + 73.246467372 -105.237349652 + 73.248729088 -104.921995061 + 73.329434109 -104.758525664 + 73.408176288 -104.911995027 +} +859e9b97fffffff +{ + -7.471719072 165.803510163 + -7.398569126 165.773976986 + -7.379488133 165.690416813 + -7.433541580 165.636260939 + -7.506776725 165.665717818 + -7.525873249 165.749407050 +} +85b4d213fffffff +{ + -18.455868784 -154.451602379 + -18.366359407 -154.419600470 + -18.295174017 -154.486571222 + -18.313404557 -154.585536492 + -18.402865852 -154.617661162 + -18.474144769 -154.550698009 +} +853b0343fffffff +{ + 36.499007515 -51.738351531 + 36.413882416 -51.774730880 + 36.343729718 -51.707343722 + 36.358602907 -51.603515317 + 36.443741578 -51.566903168 + 36.513993599 -51.634352019 +} +85006977fffffff +{ + 81.871607947 -32.897096428 + 81.950278836 -33.088262991 + 81.967806449 -33.714775261 + 81.906276220 -34.139257651 + 81.828157353 -33.938552251 + 81.811011709 -33.322783762 +} +852ec64ffffffff +{ + 45.472657222 138.458961226 + 45.554856704 138.425817071 + 45.570289485 138.315062822 + 45.503579893 138.237757712 + 45.421496783 138.271046569 + 45.406006901 138.381496398 +} +8538567bfffffff +{ + 32.117575971 4.665609589 + 32.024936045 4.678116369 + 31.989105622 4.775521081 + 32.045919226 4.860600399 + 32.138644731 4.848243058 + 32.174471109 4.750656729 +} +855b4ed7fffffff +{ + 8.735573077 167.219293305 + 8.814310834 167.220297595 + 8.855449276 167.144015753 + 8.817756154 167.066799910 + 8.739020404 167.065930950 + 8.697975628 167.142142506 +} +85301aabfffffff +{ + 36.632400195 123.168639168 + 36.567595531 123.186218979 + 36.555022709 123.277098955 + 36.607287209 123.350463651 + 36.672103008 123.332879690 + 36.684643230 123.241935109 +} +8504dd4bfffffff +{ + 66.292857682 164.491557816 + 66.198400546 164.493789354 + 66.152999714 164.699232854 + 66.201737720 164.903255899 + 66.296176532 164.902674907 + 66.341896903 164.696420437 +} +853c5e83fffffff +{ + 28.318094913 94.660542933 + 28.402544265 94.633238017 + 28.424327625 94.531773423 + 28.361670427 94.457668063 + 28.277221962 94.485017997 + 28.255429742 94.586428412 +} +85a11e6bfffffff +{ + -23.183883817 -132.396110324 + -23.095999967 -132.384282022 + -23.038352420 -132.456456238 + -23.068533397 -132.540575969 + -23.156479946 -132.552558205 + -23.214182890 -132.480266726 +} +8598ad53fffffff +{ + -17.050221306 -10.315711604 + -17.133485753 -10.348537411 + -17.201204844 -10.285677428 + -17.185545335 -10.189966507 + -17.102208847 -10.157267482 + -17.034603829 -10.220152361 +} +850326bbfffffff +{ + 89.447797687 65.491327004 + 89.455239662 75.004326175 + 89.534078134 80.837121167 + 89.617826601 75.512550586 + 89.607957108 62.054780890 + 89.517414919 58.739949307 +} +85022923fffffff +{ + 78.632768909 -86.740836143 + 78.571157928 -87.082602957 + 78.485830494 -86.978595788 + 78.461857612 -86.537839688 + 78.522910581 -86.196287913 + 78.608491643 -86.295243846 +} +85dd609bfffffff +{ + -62.157933157 -31.532079840 + -62.084897990 -31.407585488 + -61.999078707 -31.484256760 + -61.986071237 -31.684568319 + -62.058800264 -31.809360823 + -62.144842535 -31.733548044 +} +850f212bfffffff +{ + 67.865342005 -60.301672228 + 67.834643907 -60.538631744 + 67.741088092 -60.582989256 + 67.678372768 -60.391925529 + 67.708909576 -60.156356730 + 67.802322101 -60.110465859 +} +856e4e07fffffff +{ + 10.496690686 -123.929692958 + 10.573034139 -123.889265236 + 10.650015243 -123.938767834 + 10.650550571 -124.028689189 + 10.574169007 -124.069006991 + 10.497290148 -124.019513502 +} +852cacc7fffffff +{ + 35.389788690 45.381674490 + 35.301745856 45.357714472 + 35.237468360 45.434723161 + 35.261174639 45.535599934 + 35.349118748 45.559674427 + 35.413455320 45.482757987 +} +857009dbfffffff +{ + 3.079369562 -167.539114175 + 2.993270057 -167.561907476 + 2.926077820 -167.499262005 + 2.944928495 -167.413756857 + 3.031056762 -167.390879617 + 3.098305658 -167.453591424 +} +85143513fffffff +{ + 55.468163979 121.566500117 + 55.402966083 121.672984760 + 55.417242011 121.828374654 + 55.496839464 121.877953734 + 55.562299774 121.771528924 + 55.547899811 121.615463334 +} +85b928a7fffffff +{ + -38.985199647 131.413290505 + -38.892990099 131.412438875 + -38.846437866 131.314816260 + -38.891983055 131.218011401 + -38.984111469 131.218621592 + -39.030775930 131.316277868 +} +85874923fffffff +{ + -14.736505536 77.803495712 + -14.828261938 77.827367959 + -14.855638591 77.922021463 + -14.791236408 77.992684894 + -14.699541414 77.968716956 + -14.672187132 77.874181108 +} +859f022ffffffff +{ + -20.452882638 172.622548484 + -20.370652231 172.583910196 + -20.355851456 172.490914043 + -20.423313918 172.436388100 + -20.505664557 172.474964188 + -20.520432455 172.568128683 +} +85ef4843fffffff +{ + -72.668847165 -65.661328328 + -72.636410223 -65.358916704 + -72.541848258 -65.299879955 + -72.479927339 -65.540476965 + -72.512108996 -65.840456951 + -72.606465105 -65.902260418 +} +85daeb6ffffffff +{ + -49.160753193 155.032663146 + -49.072465559 154.997239922 + -49.047865826 154.858807709 + -49.111509185 154.755494952 + -49.199841219 154.790608871 + -49.224485660 154.929345463 +} +85df0c13fffffff +{ + -59.943524020 -62.916660846 + -59.907553268 -62.746312750 + -59.819304321 -62.720468965 + -59.767134205 -62.864028534 + -59.802922981 -63.033636406 + -59.891063180 -63.060423271 +} +8516c3b7fffffff +{ + 48.098057453 171.472686538 + 48.190063830 171.480299576 + 48.240872519 171.361180985 + 48.199589333 171.234576567 + 48.107566246 171.227307336 + 48.056842834 171.346298545 +} +85eb00b7fffffff +{ + -62.400485615 -157.563628331 + -62.401939692 -157.411578408 + -62.331088254 -157.339169867 + -62.258943367 -157.418625979 + -62.257589966 -157.569974351 + -62.328280925 -157.642566157 +} +85254397fffffff +{ + 51.481162547 107.142452076 + 51.392021660 107.142063053 + 51.347472923 107.254859177 + 51.391905761 107.368140666 + 51.480948206 107.368972856 + 51.525656443 107.256080884 +} +858856affffffff +{ + -4.304949045 -157.965841930 + -4.387885677 -157.993012158 + -4.454570703 -157.930660164 + -4.438386513 -157.841113225 + -4.355466826 -157.813877612 + -4.288714312 -157.876254232 +} +8560c8dbfffffff +{ + 15.538183770 67.535503318 + 15.617319699 67.508457602 + 15.628827573 67.431251867 + 15.561295953 67.381163338 + 15.482241361 67.408177084 + 15.470637072 67.485311375 +} +858e7393fffffff +{ + -12.711211045 -78.826307259 + -12.790074443 -78.884179861 + -12.878208213 -78.843467455 + -12.887449014 -78.744867384 + -12.808576602 -78.687035303 + -12.720472421 -78.727762618 +} +85f0694bfffffff +{ + -76.419937056 21.969732620 + -76.328223094 21.869540663 + -76.301281898 21.492631285 + -76.365817152 21.211804690 + -76.457852305 21.307922760 + -76.485033237 21.688968587 +} +85491d57fffffff +{ + 18.505834175 -108.230839502 + 18.586402541 -108.174666960 + 18.672584221 -108.220598523 + 18.678135739 -108.322780813 + 18.597496976 -108.378901043 + 18.511377112 -108.332891538 +} +850b9587fffffff +{ + 55.426369480 85.725168171 + 55.335715245 85.772700503 + 55.311768208 85.932763264 + 55.378367837 86.045792599 + 55.469067506 85.998822619 + 55.493122412 85.838259824 +} +85919e6bfffffff +{ + -13.190953826 -115.638705148 + -13.251298961 -115.688259956 + -13.331116307 -115.666517741 + -13.350671969 -115.595134763 + -13.290307764 -115.545487177 + -13.210406941 -115.567315373 +} +85ee2593fffffff +{ + -78.306003124 -49.056108451 + -78.250058115 -48.667172185 + -78.153456539 -48.713183771 + -78.112693857 -49.141637228 + -78.168017596 -49.528249440 + -78.264720672 -49.488747368 +} +85aa8607fffffff +{ + -32.377432465 67.434505781 + -32.471620589 67.453743552 + -32.505470938 67.560620013 + -32.445086514 67.648150022 + -32.350898165 67.628750488 + -32.317094356 67.521982571 +} +85de9133fffffff +{ + -53.421548187 -36.413653370 + -53.359217019 -36.310942689 + -53.278965664 -36.356597107 + -53.260902716 -36.504410723 + -53.322982921 -36.607176113 + -53.403376687 -36.562074771 +} +85de762bfffffff +{ + -52.397728705 -57.317764586 + -52.357318847 -57.189051165 + -52.275951871 -57.182266347 + -52.235033967 -57.303583488 + -52.275257077 -57.431925867 + -52.356584335 -57.439321823 +} +85150b07fffffff +{ + 58.609603425 120.737019181 + 58.543071135 120.856798880 + 58.559519532 121.028409557 + 58.642642651 121.081056667 + 58.709460038 120.961324446 + 58.692868704 120.788895183 +} +85451903fffffff { - -72.019708465 146.108204462 - -71.995408666 145.841640570 - -72.059181293 145.636739368 - -72.147582183 145.698550653 - -72.171993873 145.967221603 - -72.107891902 146.171964075 + 21.064031657 -86.153977022 + 21.132500863 -86.091485529 + 21.218536119 -86.118541753 + 21.236134112 -86.208235602 + 21.167591223 -86.270801206 + 21.081524099 -86.243598908 +} +85f29ecbfffffff +{ + -89.309416455 -54.665524508 + -89.261020613 -48.322666160 + -89.169627657 -48.994160918 + -89.125733089 -54.614833188 + -89.165740641 -60.228954366 + -89.257047051 -60.942790258 +} +850db33bfffffff +{ + 68.074031859 178.658464526 + 67.982090641 178.600542680 + 67.919228991 178.782987481 + 67.947931274 179.023398295 + 68.039668193 179.082972969 + 68.102908100 178.900490512 +} +855e7313fffffff +{ + 13.694045993 -59.986784392 + 13.768963651 -59.940395574 + 13.838984940 -59.980095832 + 13.834097395 -60.066114553 + 13.759250324 -60.112445944 + 13.689220264 -60.072816108 +} +85d3300ffffffff +{ + -56.555905085 -111.029991865 + -56.496623701 -110.895667658 + -56.403536526 -110.923828786 + -56.369687362 -111.085687978 + -56.428813712 -111.219862220 + -56.521943879 -111.192328112 +} +85cd029bfffffff +{ + -47.270306729 92.033664506 + -47.187691120 91.976538427 + -47.180685342 91.839099840 + -47.256232728 91.758295973 + -47.338988350 91.815066477 + -47.346056740 91.952997669 +} +85033587fffffff +{ + 89.110562655 156.061639758 + 89.019610060 156.898041916 + 88.980240514 161.818904453 + 89.025921264 166.466005437 + 89.117837857 166.613243114 + 89.163803427 161.112222652 } -851e14affffffff +856a526bfffffff { - 47.908117044 14.662727894 - 47.822330724 14.667055632 - 47.785089275 14.785748885 - 47.833600896 14.900311324 - 47.919415421 14.896242848 - 47.956690285 14.777352493 + 3.929368836 31.111168623 + 4.018112622 31.115210600 + 4.066634227 31.036617552 + 4.026467744 30.953949157 + 3.937722281 30.949846453 + 3.889144886 31.028472857 } -85011983fffffff +8581a38ffffffff { - 75.077754504 30.728769433 - 75.129809393 30.967322032 - 75.211460866 30.884776239 - 75.240778507 30.560588778 - 75.188219464 30.321889028 - 75.106848630 30.407508266 + -10.807777357 -36.051401832 + -10.724789203 -36.001701204 + -10.641805435 -36.049546985 + -10.641798599 -36.147106973 + -10.724803842 -36.196844667 + -10.807798826 -36.148985447 } -85f1642bfffffff +8502d223fffffff { - -88.215835642 -7.401853255 - -88.125213549 -6.685587978 - -88.061470972 -8.697092811 - -88.084375451 -11.429250902 - -88.172795959 -12.360652217 - -88.240633679 -10.355506520 -} -850a42cffffffff -{ - 70.295099592 97.871387726 - 70.253691917 98.120996529 - 70.304986827 98.345474508 - 70.398089002 98.321034361 - 70.439774494 98.069866281 - 70.388078450 97.844701783 -} -853b82bbfffffff -{ - 32.316263157 -58.416286784 - 32.234644203 -58.441117380 - 32.169828829 -58.377037058 - 32.186540318 -58.288032639 - 32.268196049 -58.262997686 - 32.333103617 -58.327171462 -} -8559832bfffffff -{ - 12.720630869 -0.095434339 - 12.637114824 -0.081934894 - 12.599145743 -0.003536363 - 12.644677241 0.061492849 - 12.728285557 0.048080226 - 12.766270121 -0.030448578 -} -85031cc3fffffff -{ - 85.348303469 -123.984558642 - 85.316091187 -125.037327789 - 85.223774584 -125.236113351 - 85.164299397 -124.417209599 - 85.195648061 -123.394318231 - 85.287314497 -123.160925874 -} -8513a903fffffff -{ - 62.117956113 -126.656309369 - 62.031388250 -126.687422073 - 61.970712096 -126.552285471 - 61.996388872 -126.385745721 - 62.082956991 -126.353686490 - 62.143848674 -126.489112413 -} -85974893fffffff -{ - -19.461190511 21.490554460 - -19.366030298 21.498832298 - -19.310538534 21.415768275 - -19.350177302 21.324437671 - -19.445299741 21.316095355 - -19.500821257 21.399148051 -} -85238683fffffff -{ - 42.206020050 -156.931980958 - 42.285173638 -156.891847542 - 42.355018146 -156.954945508 - 42.345669007 -157.058364298 - 42.266393192 -157.098423608 - 42.196588802 -157.035138676 -} -85008b5bfffffff -{ - 79.653205707 87.323970397 - 79.629358504 87.823944884 - 79.696569036 88.186183079 - 79.788347696 88.048013965 - 79.812487326 87.540631096 - 79.744552267 87.178892818 + 69.733174655 -117.096996741 + 69.645778328 -117.181352520 + 69.576641044 -117.018363974 + 69.594594478 -116.771066410 + 69.681864221 -116.685115278 + 69.751307935 -116.848050169 } -850e9caffffffff +85f2916ffffffff { - 57.217359201 -94.937542297 - 57.144720061 -95.050179656 - 57.054366332 -94.990344310 - 57.036470577 -94.818459400 - 57.108886896 -94.705616360 - 57.199421584 -94.764861385 + -89.305016120 -90.532312149 + -89.311112682 -82.888992682 + -89.229209733 -79.647023052 + -89.149824657 -83.247709656 + -89.144364250 -89.452325664 + -89.217779659 -93.297808356 } -85d6c10bfffffff -{ - -45.245684688 30.550787864 - -45.175593812 30.556136108 - -45.138679874 30.457394416 - -45.171847712 30.353255663 - -45.241939761 30.347811669 - -45.278862890 30.446602148 -} -856943a7fffffff -{ - 14.685847891 120.664525715 - 14.597965845 120.681369481 - 14.572499707 120.766843258 - 14.634981197 120.835537615 - 14.722922948 120.818685908 - 14.748323536 120.733147725 -} -85298603fffffff -{ - 36.199401061 -114.762836652 - 36.280460994 -114.703211944 - 36.360482043 -114.760729530 - 36.359391597 -114.877928144 - 36.278305377 -114.937434288 - 36.198335882 -114.879860750 -} -8532d44ffffffff -{ - 43.249952961 168.468633741 - 43.345219046 168.471780714 - 43.394600060 168.358575686 - 43.348635731 168.242367538 - 43.253368963 168.239522356 - 43.204067006 168.352583496 -} -85280643fffffff -{ - 39.764835387 -122.931376321 - 39.846318430 -122.878390365 - 39.917938414 -122.941552296 - 39.908022355 -123.057693309 - 39.826541147 -123.110503142 - 39.754974125 -123.047348404 -} -856c31dbfffffff -{ - 9.474090477 -96.563421868 - 9.546826668 -96.506495878 - 9.627865122 -96.540656137 - 9.636135376 -96.631852041 - 9.563302938 -96.688794286 - 9.482296578 -96.654524509 -} -854f9c77fffffff -{ - 22.843293622 160.028897807 - 22.935598018 160.022732847 - 22.979144746 159.931734692 - 22.930316859 159.847037929 - 22.838058678 159.853378157 - 22.794582037 159.944239999 -} -85f2904ffffffff -{ - -89.146311485 109.258911931 - -89.160418129 103.107484582 - -89.243354141 100.473221860 - -89.318350727 104.956722686 - -89.300190749 112.442519925 - -89.211656166 113.944421753 +85f164d7fffffff +{ + -88.927053175 -27.455429340 + -88.849218812 -24.828465901 + -88.768172392 -26.936241900 + -88.759894221 -31.302855377 + -88.831443098 -34.135734390 + -88.917420036 -32.453056994 } -85b5358ffffffff +85dee0b7fffffff { - -39.181621852 -153.187682939 - -39.092007439 -153.149972886 - -39.023096641 -153.232390931 - -39.043738713 -153.352520266 - -39.133329556 -153.390419268 - -39.202301992 -153.308000342 + -50.806525493 -51.413974847 + -50.760575527 -51.297203815 + -50.680758684 -51.304561898 + -50.646878987 -51.428126170 + -50.692620910 -51.544655161 + -50.772450089 -51.537862115 +} +857a369bfffffff +{ + -1.575546086 49.344620985 + -1.487981321 49.341853879 + -1.440971726 49.267503862 + -1.481518005 49.195828037 + -1.569160534 49.198544548 + -1.616179041 49.272987535 +} +857110b7fffffff +{ + 11.311888429 -174.446549672 + 11.225092434 -174.465721881 + 11.162424237 -174.404213720 + 11.186522305 -174.323442380 + 11.273386302 -174.304179457 + 11.336084250 -174.365778593 +} +85baf623fffffff +{ + -28.500537552 -177.545747405 + -28.419746434 -177.496103844 + -28.340131498 -177.546635047 + -28.341286114 -177.646657404 + -28.421975941 -177.696307397 + -28.501612382 -177.645928845 +} +85e35477fffffff +{ + -60.345758410 -145.064617020 + -60.331102298 -144.907081019 + -60.249282231 -144.860202128 + -60.182268639 -144.970412665 + -60.196950253 -145.127238917 + -60.278619885 -145.174562292 +} +85a41007fffffff +{ + -21.154197636 -30.741784648 + -21.075687190 -30.693320768 + -21.001888719 -30.741202933 + -21.006600869 -30.837585233 + -21.085153106 -30.886108694 + -21.158951383 -30.838190398 +} +859fb46bfffffff +{ + -14.560838321 177.035444236 + -14.486013921 177.079766117 + -14.416809933 177.041949983 + -14.422395521 176.959937318 + -14.497103518 176.915634867 + -14.566342224 176.953325536 +} +85ee2d87fffffff +{ + -74.995164224 -52.492576278 + -74.943565989 -52.175981433 + -74.846490747 -52.190110496 + -74.800999074 -52.516781457 + -74.852133126 -52.831505889 + -74.949220094 -52.821431795 +} +85931303fffffff +{ + -4.287438699 -106.698663697 + -4.357289648 -106.752769958 + -4.440005731 -106.725446384 + -4.452917618 -106.643931114 + -4.383015299 -106.589747459 + -4.300252497 -106.617156445 +} +8533887bfffffff +{ + 35.764955043 176.043129841 + 35.861438513 176.054932900 + 35.918113552 175.958124144 + 35.878204259 175.849559190 + 35.781675088 175.837991168 + 35.725100760 175.934752848 +} +85b6e423fffffff +{ + -24.211043052 -94.701723551 + -24.278869140 -94.764002562 + -24.364127054 -94.727322915 + -24.381594897 -94.628286423 + -24.313766443 -94.565964903 + -24.228472534 -94.602722259 +} +85128447fffffff +{ + 54.836664381 -129.022117342 + 54.755539962 -129.040646539 + 54.697407886 -128.931616820 + 54.720221198 -128.803833359 + 54.801362152 -128.784713736 + 54.859673665 -128.893967661 +} +850c1423fffffff +{ + 64.690482447 -164.925895500 + 64.610927499 -165.030044438 + 64.536908920 -164.923755425 + 64.542181429 -164.714015488 + 64.621431708 -164.609224486 + 64.695714017 -164.714809767 +} +853cb693fffffff +{ + 21.059043293 79.612635098 + 21.143550837 79.583828014 + 21.157938889 79.491479683 + 21.087882437 79.428016707 + 21.003426328 79.456819495 + 20.988975205 79.549089668 +} +857ad19bfffffff +{ + 7.799014168 42.950695882 + 7.881118646 42.950265687 + 7.928345848 42.875114993 + 7.893507633 42.800321174 + 7.811362364 42.800696999 + 7.764096029 42.875921048 +} +8503436ffffffff +{ + 79.840989275 -68.798103311 + 79.803098593 -69.258945417 + 79.716436444 -69.281532164 + 79.667737839 -68.850242577 + 79.705131548 -68.393734455 + 79.791716359 -68.364196115 +} +855c1173fffffff +{ + 11.467604269 -152.955061932 + 11.375284385 -152.986340116 + 11.302484544 -152.920415050 + 11.321965729 -152.823210366 + 11.414270247 -152.791871870 + 11.487108996 -152.857798232 +} +85c69d93fffffff +{ + -38.621460049 -124.952603295 + -38.573564545 -124.849049558 + -38.480141459 -124.847318342 + -38.434668938 -124.948825466 + -38.482467833 -125.052162840 + -38.575835649 -125.054209267 +} +85e47513fffffff +{ + -65.242328040 94.401921172 + -65.155589000 94.299275874 + -65.148815317 94.069770843 + -65.228723826 93.941529494 + -65.315675463 94.043273837 + -65.322506245 94.274166453 +} +857e827bfffffff +{ + 3.092322296 179.169627444 + 3.014082453 179.155275744 + 2.953870136 179.210097560 + 2.971852355 179.279362629 + 3.050155509 179.293792114 + 3.110413160 179.238878712 +} +85191d43fffffff +{ + 57.661692233 -10.072400016 + 57.608906734 -10.184793187 + 57.528388941 -10.142182670 + 57.500643202 -9.987647607 + 57.553339186 -9.875393588 + 57.633870195 -9.917534892 +} +852b7137fffffff +{ + 40.944389689 -59.607529520 + 40.912403533 -59.719112455 + 40.828700859 -59.741432100 + 40.777079592 -59.652504323 + 40.808972243 -59.541234203 + 40.892579443 -59.518579581 +} +857f7117fffffff +{ + -5.258346029 169.374190884 + -5.189144194 169.343331223 + -5.170969615 169.263333424 + -5.221991440 169.214073485 + -5.291280808 169.244875421 + -5.309460820 169.324995185 +} +8509a2dbfffffff +{ + 59.388952263 0.631188361 + 59.349114857 0.511529063 + 59.270239679 0.535044328 + 59.231234262 0.677709818 + 59.271013999 0.797050924 + 59.349856582 0.774044606 +} +85997253fffffff +{ + -8.456857577 -5.370756163 + -8.530657300 -5.396303575 + -8.589745450 -5.336286559 + -8.574924549 -5.250728170 + -8.501073421 -5.225300078 + -8.442094495 -5.285310912 +} +85c44d4ffffffff +{ + -45.818209272 -24.436471926 + -45.898421343 -24.498432615 + -45.978500632 -24.427956801 + -45.978313583 -24.295306472 + -45.898005311 -24.233452638 + -45.817980314 -24.304141559 +} +859cdcd3fffffff +{ + -7.570315271 140.386602670 + -7.662067429 140.401819840 + -7.694411062 140.491461725 + -7.635035983 140.565894769 + -7.543282189 140.550702292 + -7.510905038 140.461052019 +} +857f21d3fffffff +{ + -9.893478263 172.662656169 + -9.820239230 172.628356355 + -9.803227923 172.545879094 + -9.859468757 172.497569408 + -9.932812371 172.531820508 + -9.949810538 172.614430192 +} +85a96537fffffff +{ + -29.293391009 -59.511034173 + -29.234126874 -59.461270983 + -29.160913950 -59.503966724 + -29.147017437 -59.596346457 + -29.176669021 -59.621197937 + -29.213520135 -59.644808630 + -29.279454964 -59.603429104 +} +85bf6a7bfffffff +{ + -43.145739507 149.150387111 + -43.052232091 149.125524970 + -43.020095196 149.001614787 + -43.081395604 148.902354614 + -43.174917337 148.926930046 + -43.207124520 149.051052662 +} +85159573fffffff +{ + 49.133236558 117.172584533 + 49.077243864 117.266703935 + 49.093894284 117.391479403 + 49.166668351 117.422550111 + 49.222879422 117.328393364 + 49.206097688 117.203202438 +} +85022457fffffff +{ + 83.106251924 -102.183046558 + 83.107244471 -102.927745237 + 83.029154775 -103.333459596 + 82.951065252 -103.001593957 + 82.950263060 -102.273677115 + 83.027362372 -101.861095021 +} +85afb2affffffff +{ + -28.947498489 83.516316917 + -29.038536834 83.546723696 + -29.059561097 83.651088815 + -28.989568021 83.724886621 + -28.898601727 83.694387230 + -28.877556421 83.590182382 +} +85046167fffffff +{ + 77.785452368 -176.065611661 + 77.694201751 -176.207209566 + 77.622206970 -175.913288881 + 77.640849805 -175.478721727 + 77.731681320 -175.332531059 + 77.804291196 -175.625454373 +} +853b6a47fffffff +{ + 34.582109345 -40.901848911 + 34.497361215 -40.952875543 + 34.417481219 -40.891300487 + 34.422239814 -40.778727735 + 34.506946589 -40.727511239 + 34.586936202 -40.789056958 +} +85ec5b23fffffff +{ + -76.598785995 123.502925619 + -76.546443127 123.192938632 + -76.583221699 122.826401591 + -76.672689702 122.767039639 + -76.725478110 123.078385525 + -76.688350339 123.447744212 +} +85d0258ffffffff +{ + -41.676613677 13.119952416 + -41.767718182 13.108174820 + -41.819140043 13.202113417 + -41.779409610 13.307639174 + -41.688371350 13.319139918 + -41.636997157 13.225391653 +} +853ce5affffffff +{ + 27.293375525 91.599974643 + 27.377998285 91.571990298 + 27.397823514 91.471204594 + 27.333044669 91.398465401 + 27.248432398 91.426484735 + 27.228588422 91.527208417 +} +85ad700bfffffff +{ + -32.498978952 8.513870567 + -32.591062224 8.497649326 + -32.650747900 8.581118581 + -32.618271462 8.680685797 + -32.526227593 8.696680984 + -32.466620629 8.613335029 +} +85ee4853fffffff +{ + -66.050680712 -52.802169464 + -65.999995946 -52.602210447 + -65.905677319 -52.609436747 + -65.862043959 -52.815010707 + -65.912421683 -53.014211449 + -66.006738593 -53.008596894 +} +85006957fffffff +{ + 81.848673992 -30.002106383 + 81.928573888 -30.162776445 + 81.950509760 -30.780254455 + 81.892078899 -31.226804148 + 81.812654849 -31.055993000 + 81.791179906 -30.448669063 +} +85f3a957fffffff +{ + -79.315910444 -168.458228725 + -79.398423246 -168.422218134 + -79.428708597 -167.991051543 + -79.375914001 -167.600429526 + -79.293483986 -167.643112837 + -79.263761096 -168.069764795 +} +85d1ac53fffffff +{ + -42.255206858 4.390801741 + -42.347789364 4.366489830 + -42.407853539 4.460513342 + -42.375258606 4.578727492 + -42.282696426 4.602747007 + -42.222708693 4.508844930 +} +85b75403fffffff +{ + -31.972322556 -99.255323732 + -31.906819171 -99.181550109 + -31.819626936 -99.215098570 + -31.797831707 -99.322221285 + -31.863191244 -99.396048147 + -31.950489767 -99.362699512 +} +85e25a6ffffffff +{ + -51.306344192 -132.899978846 + -51.270961051 -132.768471421 + -51.178552288 -132.751342299 + -51.121632668 -132.865280884 + -51.156968837 -132.996365823 + -51.249271394 -133.013933848 +} +85d741cbfffffff +{ + -51.049557054 27.159076986 + -51.130554802 27.166904138 + -51.159931308 27.269284386 + -51.108330011 27.363516798 + -51.027437553 27.355417318 + -50.998041051 27.253357208 +} +8544ad13fffffff +{ + 27.190188617 -81.648563393 + 27.252969297 -81.583889682 + 27.338992029 -81.607468911 + 27.362293536 -81.695880954 + 27.299462789 -81.760655193 + 27.213380647 -81.736916867 +} +85f2a37bfffffff +{ + -85.624682954 -152.016182376 + -85.708156585 -151.583906532 + -85.716722294 -150.385863919 + -85.641295934 -149.663338391 + -85.558948395 -150.125940767 + -85.550889311 -151.281725040 +} +85a1030bfffffff +{ + -25.268173397 -133.752528196 + -25.178806186 -133.739064772 + -25.120502934 -133.813169223 + -25.151512688 -133.900854491 + -25.240940246 -133.914481024 + -25.299297777 -133.840259144 +} +85789b53fffffff +{ + -8.590110345 -141.383283797 + -8.669178779 -141.415219723 + -8.729940048 -141.359292435 + -8.711693497 -141.271478513 + -8.632691541 -141.239526667 + -8.571869648 -141.295404548 +} +856aec97fffffff +{ + 4.032963269 31.681345728 + 4.121567136 31.685170497 + 4.170075565 31.606560497 + 4.130034893 31.524089953 + 4.041427021 31.520204370 + 3.992863733 31.598850135 +} +8500455bfffffff +{ + 82.984344008 -8.083476495 + 83.068237113 -7.996359341 + 83.121714982 -8.598797080 + 83.090260238 -9.283887235 + 83.006157556 -9.355145669 + 82.953708212 -8.757258192 +} +8500c323fffffff +{ + 85.825757324 91.969058249 + 85.796405366 93.170991607 + 85.858309987 94.153345742 + 85.951314314 93.940806445 + 85.981750151 92.697951910 + 85.918068255 91.709318483 +} +85ad1e8ffffffff +{ + -30.058147100 15.212730680 + -29.972057914 15.223733957 + -29.915707015 15.141343706 + -29.945433503 15.047997158 + -30.031475409 15.036935204 + -30.087838173 15.119278370 +} +85182247fffffff +{ + 54.683946259 -11.276006694 + 54.627047022 -11.381426386 + 54.543773211 -11.339137176 + 54.517386798 -11.191840705 + 54.574199621 -11.086526355 + 54.657485070 -11.128402573 +} +85e92a83fffffff +{ + -65.194815955 -110.130195811 + -65.139367110 -109.962216180 + -65.053528139 -110.000270410 + -65.023074694 -110.205318608 + -65.078330347 -110.373092896 + -65.164232075 -110.336026260 +} +85218b23fffffff +{ + 42.072068899 67.591900038 + 41.987952451 67.657033157 + 41.987374476 67.787541198 + 42.070925148 67.853287823 + 42.155176337 67.788328405 + 42.155742095 67.657447791 +} +85b5661bfffffff +{ + -36.885077587 -163.680153904 + -36.798240035 -163.633925160 + -36.721772713 -163.705863503 + -36.732090873 -163.823937459 + -36.818864748 -163.870280748 + -36.895384174 -163.798435959 +} +855b9d27fffffff +{ + 15.545207822 179.080452389 + 15.630753823 179.092566573 + 15.679525896 179.018263691 + 15.642634237 178.931857386 + 15.557032808 178.919883906 + 15.508378354 178.994175887 +} +85eb0337fffffff +{ + -62.924221769 -159.830057435 + -62.928487128 -159.679115653 + -62.859938679 -159.602031326 + -62.787283206 -159.675755700 + -62.783129590 -159.826005762 + -62.851519885 -159.903221249 +} +85201d33fffffff +{ + 44.875742493 74.613706268 + 44.787451736 74.671394299 + 44.778704569 74.807900777 + 44.858210382 74.887119388 + 44.946606953 74.829709438 + 44.955391992 74.692801839 +} +859fa1affffffff +{ + -17.349103455 174.164638796 + -17.269899857 174.126515554 + -17.255083507 174.037812179 + -17.319504713 173.987077931 + -17.398828392 174.025151781 + -17.413610727 174.114009498 +} +85ef8c3bfffffff +{ + -77.798803197 -13.421548398 + -77.707746874 -13.264245840 + -77.633359254 -13.553178434 + -77.649398543 -13.998424632 + -77.740054433 -14.160394081 + -77.815073697 -13.872497870 +} +85019d83fffffff +{ + 73.740253095 56.357059256 + 73.760809611 56.654267810 + 73.844537143 56.721117545 + 73.907850874 56.487955446 + 73.886975653 56.188253681 + 73.803107268 56.124218888 +} +857ef497fffffff +{ + 0.661343896 174.657674263 + 0.727960658 174.664515216 + 0.763215594 174.598686761 + 0.731764925 174.526044436 + 0.665127091 174.519311221 + 0.629960888 174.585112538 +} +854d53cffffffff +{ + 22.666666328 -63.883037931 + 22.733848902 -63.839150108 + 22.790813062 -63.875921288 + 22.780615759 -63.956506094 + 22.713500931 -64.000329632 + 22.656515709 -63.963632691 +} +85368383fffffff +{ + 28.412003317 -154.247556007 + 28.325357078 -154.280620208 + 28.258732838 -154.209415346 + 28.278749085 -154.105136538 + 28.365402784 -154.071997939 + 28.432032831 -154.143212382 +} +85cdad1bfffffff +{ + -44.131496753 90.726431636 + -44.051048874 90.675714534 + -44.043302853 90.548316739 + -44.115936230 90.471216379 + -44.196511602 90.521611935 + -44.204326278 90.649430370 +} +85ba690bfffffff +{ + -28.587690596 168.062858458 + -28.499308504 168.023695158 + -28.483490171 167.918934644 + -28.556074091 167.853130727 + -28.644565183 167.892187019 + -28.660363355 167.997154602 +} +85b01597fffffff +{ + -27.380728980 -115.585808225 + -27.327581702 -115.502438343 + -27.241484118 -115.513253035 + -27.208520727 -115.607206402 + -27.261536261 -115.690486017 + -27.347646727 -115.679902621 +} +85da730ffffffff +{ + -54.570926695 159.635677908 + -54.489538211 159.590228135 + -54.472249431 159.437639032 + -54.536320413 159.330101010 + -54.617773249 159.375224084 + -54.635090897 159.528212846 +} +8505594ffffffff +{ + 79.441320164 167.917953196 + 79.344817025 167.892534835 + 79.291731980 168.328439033 + 79.334473637 168.792814622 + 79.430866188 168.826223705 + 79.484633317 168.387283672 +} +85812d67fffffff +{ + -13.374311505 -46.298438685 + -13.293886039 -46.247090453 + -13.209961010 -46.294152631 + -13.206480199 -46.392532084 + -13.286904927 -46.443871336 + -13.370811203 -46.396840261 +} +8509651bfffffff +{ + 72.775656530 1.567524405 + 72.844006776 1.645920545 + 72.901137200 1.450963103 + 72.889486599 1.177438122 + 72.855195636 1.139130045 + 72.814126288 1.112755544 + 72.764222220 1.296117273 +} +85676a6bfffffff +{ + 10.942528785 -66.590278584 + 10.880141211 -66.637045044 + 10.803502470 -66.599345234 + 10.789331781 -66.514906357 + 10.851758698 -66.468215747 + 10.928317000 -66.505888083 +} +85de3593fffffff +{ + -58.510403184 -54.582116081 + -58.464150945 -54.429018016 + -58.375709860 -54.429001650 + -58.333540719 -54.581169567 + -58.379557350 -54.733788794 + -58.467978004 -54.734718810 +} +85f27693fffffff +{ + -75.851146509 -132.897904290 + -75.912634583 -132.664264706 + -75.889640146 -132.312174439 + -75.805306369 -132.197424963 + -75.744333141 -132.431585192 + -75.767180201 -132.779998458 +} +85d8b2cffffffff +{ + -42.995911211 145.449036111 + -42.902060292 145.429179280 + -42.866148602 145.308418716 + -42.924004496 145.207336233 + -43.017849360 145.226898664 + -43.053844565 145.347838158 +} +8576d363fffffff +{ + -8.278981963 161.732316823 + -8.334219228 161.739150822 + -8.359338404 161.748170058 + -8.379534761 161.833583624 + -8.324372906 161.891824756 + -8.274194998 161.873728461 + -8.246595191 161.870324355 + -8.221355548 161.796239105 +} +85e59e27fffffff +{ + -52.885009280 111.307022038 + -52.812586788 111.202308503 + -52.829974546 111.046319260 + -52.919886368 110.994434572 + -52.992531752 111.099083662 + -52.975042111 111.255683515 +} +85ab1267fffffff +{ + -22.043020933 63.708874745 + -22.138428667 63.723562027 + -22.173769164 63.819601419 + -22.113628340 63.900880633 + -22.018206211 63.886052234 + -21.982939199 63.790085679 +} +85031bb7fffffff +{ + 83.198345006 -111.225132955 + 83.185303006 -111.978596323 + 83.100115552 -112.282881944 + 83.028804306 -111.845624870 + 83.041704820 -111.109254110 + 83.126054839 -110.793302547 +} +8520206ffffffff +{ + 48.041016171 69.128430809 + 47.955793255 69.198522413 + 47.953726787 69.343828112 + 48.036884420 69.419502577 + 48.122237457 69.349648973 + 48.124302749 69.203881703 +} +85d021c3fffffff +{ + -42.779762697 13.179057915 + -42.870594735 13.167176924 + -42.921297063 13.262602715 + -42.881121085 13.369712556 + -42.790355066 13.381308018 + -42.739698881 13.286079057 +} +85e505c3fffffff +{ + -63.969054539 121.167637165 + -63.907511898 121.002264434 + -63.940452804 120.798564529 + -64.035139440 120.759328440 + -64.096939874 120.925013613 + -64.063795080 121.129624581 +} +85343037fffffff +{ + 36.718422735 -27.608086705 + 36.638223009 -27.676863946 + 36.550439597 -27.624719468 + 36.542777453 -27.503948767 + 36.622890657 -27.435073500 + 36.710752493 -27.487066438 +} +85555067fffffff +{ + 18.802522221 -8.896121767 + 18.737054646 -8.962125433 + 18.654847030 -8.938533355 + 18.638094988 -8.849099203 + 18.703450807 -8.783149732 + 18.785670286 -8.806580115 +} +8552a44ffffffff +{ + 16.608250551 37.716871300 + 16.518086215 37.701816138 + 16.464335991 37.774875740 + 16.500647346 37.862964361 + 16.590731645 37.878129150 + 16.644584681 37.805095855 +} +8508e423fffffff +{ + 66.685333708 16.618498253 + 66.738332504 16.721572782 + 66.801722378 16.625833328 + 66.811843303 16.426337075 + 66.758578486 16.323787156 + 66.695458760 16.420204061 +} +8561b337fffffff +{ + 13.791309525 84.058387955 + 13.881783508 84.030468591 + 13.901971134 83.937084841 + 13.831729320 83.871690927 + 13.741309895 83.899619305 + 13.721077701 83.992932702 +} +85095a27fffffff +{ + 67.800342529 15.428781813 + 67.855534883 15.534194757 + 67.919446587 15.428903839 + 67.927873563 15.217482414 + 67.872407259 15.112707738 + 67.808787866 15.218710474 +} +85eb30d7fffffff +{ + -59.233859850 -156.302230390 + -59.160439585 -156.237981896 + -59.106368302 -156.344126649 + -59.119913011 -156.504181351 + -59.187559972 -156.558441718 + -59.241714022 -156.452348680 + -59.234951231 -156.372134803 +} +851e0c73fffffff +{ + 48.557467965 21.523728962 + 48.471803527 21.520314856 + 48.427674890 21.637854917 + 48.469158974 21.758942249 + 48.554824395 21.762628076 + 48.599004928 21.644954879 +} +85af2e0bfffffff +{ + -18.290761199 88.952988020 + -18.379234515 88.983499189 + -18.400135074 89.076212542 + -18.332597357 89.138277148 + -18.244224235 89.107712470 + -18.223288653 89.015136496 +} +85d954c3fffffff +{ + -55.941953531 134.799010065 + -55.895976252 134.657070626 + -55.942021519 134.521208424 + -56.034271155 134.527052954 + -56.080393684 134.669479735 + -56.034120865 134.805573973 +} +850654c7fffffff +{ + 65.101158376 -34.101306072 + 65.107309428 -34.305756116 + 65.031046056 -34.421840026 + 64.948899748 -34.333755709 + 64.942873678 -34.130501822 + 65.018869335 -34.014140687 +} +85ef118bfffffff +{ + -82.626052104 -29.666404140 + -82.548261527 -29.228299662 + -82.461055033 -29.532164176 + -82.450867289 -30.263479694 + -82.527667322 -30.706483819 + -82.615641971 -30.413498468 +} +8505a47bfffffff +{ + 72.163620359 110.055859833 + 72.105457713 110.303741822 + 72.141596302 110.588174978 + 72.236249159 110.626639686 + 72.294832549 110.377860484 + 72.258340330 110.091508330 +} +8510b15bfffffff +{ + 51.655115048 45.565407513 + 51.592085398 45.668501918 + 51.619296919 45.805255708 + 51.709677488 45.839256204 + 51.772839989 45.736011623 + 51.745488799 45.598916252 +} +85739143fffffff +{ + 0.668383832 128.705428140 + 0.573928462 128.721965375 + 0.540249124 128.811030122 + 0.601045301 128.883602424 + 0.695549161 128.867070869 + 0.729208396 128.777961261 +} +853f32affffffff +{ + 35.451080043 14.467470728 + 35.355985204 14.471408199 + 35.312465543 14.574262409 + 35.364007844 14.673328294 + 35.459141779 14.669584978 + 35.502694445 14.566581502 +} +852e61dbfffffff +{ + 34.690266988 136.317487958 + 34.773416996 136.287556349 + 34.793850853 136.194908344 + 34.731193749 136.132409763 + 34.648175968 136.162432049 + 34.627683130 136.254862578 +} +85058177fffffff +{ + 71.282115163 124.675464941 + 71.206726919 124.864014226 + 71.220722681 125.159720074 + 71.310262028 125.269377491 + 71.386082570 125.081339456 + 71.371930506 124.783118770 +} +855f8eaffffffff +{ + 9.430029491 -50.134223573 + 9.508936028 -50.084781350 + 9.587361935 -50.129262087 + 9.586898145 -50.223141625 + 9.508043935 -50.272559444 + 9.429601214 -50.228122248 +} +8514aa7bfffffff +{ + 49.497046254 129.672298041 + 49.430573786 129.747679060 + 49.433516706 129.881352136 + 49.502974050 129.940164927 + 49.569660001 129.864971382 + 49.566674997 129.730776202 +} +852ce3abfffffff +{ + 38.904545887 51.887470005 + 38.833002254 51.964955613 + 38.848024144 52.079628898 + 38.934699342 52.117081048 + 39.006392851 52.039568681 + 38.991261094 51.924630486 +} +85ba3053fffffff +{ + -36.170525364 -177.824592516 + -36.092793894 -177.770779471 + -36.012143352 -177.825074283 + -36.009216778 -177.933002637 + -36.086862489 -177.986821137 + -36.167520489 -177.932706132 +} +856da08ffffffff +{ + 14.689673387 -100.289912104 + 14.766176239 -100.231630766 + 14.851496565 -100.270386710 + 14.860275789 -100.367531525 + 14.783684282 -100.425809387 + 14.698402272 -100.386946097 +} +8568b643fffffff +{ + -0.080614835 110.829825667 + 0.007820051 110.810759046 + 0.031802180 110.725049368 + -0.032728163 110.658407016 + -0.121198101 110.677540048 + -0.145102705 110.763249057 +} +85ab4bb7fffffff +{ + -17.307731633 78.748290598 + -17.400362934 78.773229494 + -17.427200870 78.869639797 + -17.361392756 78.940986348 + -17.268825977 78.915951395 + -17.242002735 78.819665762 +} +85718abbfffffff +{ + 4.844651197 -175.558884775 + 4.761566030 -175.576797855 + 4.698279644 -175.517710789 + 4.718031928 -175.440622759 + 4.801174088 -175.422624690 + 4.864507008 -175.481799651 +} +85f02867fffffff +{ + -80.532072022 59.457114733 + -80.474023334 59.023557966 + -80.505126379 58.524382838 + -80.594871841 58.452279999 + -80.653650370 58.888324382 + -80.621947509 59.394022572 +} +85f1b6c3fffffff +{ + -74.107772738 123.032373406 + -74.053201393 122.768417154 + -74.089513763 122.453832815 + -74.180695918 122.401114329 + -74.235647979 122.666020746 + -74.199035237 122.982702001 } -85ae9547fffffff -{ - -34.943748408 92.022845797 - -35.026799762 92.059425686 - -35.037533944 92.163667266 - -34.965276186 92.231148308 - -34.882305985 92.194516091 - -34.871512384 92.090454872 -} -85e0dbabfffffff -{ - -49.014080075 54.327304811 - -49.093365149 54.336344069 - -49.136141417 54.450045965 - -49.099582205 54.554671163 - -49.020260848 54.545400656 - -48.977534856 54.431736311 -} -8502958bfffffff -{ - 72.965533423 -136.907737482 - 72.913862371 -137.164067892 - 72.825197271 -137.153525306 - 72.788230936 -136.889468970 - 72.839527369 -136.634434542 - 72.928162760 -136.642159271 -} -85e2ebcffffffff -{ - -52.240381270 -129.871824692 - -52.201689378 -129.737631274 - -52.108273987 -129.725884531 - -52.053639072 -129.847844715 - -52.092264322 -129.981624576 - -52.185590871 -129.993857101 -} -85e00b17fffffff -{ - -57.123888387 55.321437212 - -57.037087885 55.346977947 - -56.986786353 55.230103528 - -57.023060373 55.087656151 - -57.109714305 55.061487205 - -57.160241067 55.178392413 -} -850976bbfffffff -{ - 68.929322310 0.471136430 - 68.975163001 0.319595575 - 68.940128501 0.128083342 - 68.859346019 0.089270779 - 68.813781217 0.240713268 - 68.848723506 0.431070519 -} -8501a61bfffffff -{ - 70.003585228 47.453412666 - 70.032946533 47.673028118 - 70.113368279 47.685940005 - 70.164424548 47.477331637 - 70.134727398 47.256587096 - 70.054311208 47.245581557 -} -85ed4567fffffff -{ - -74.632917247 169.517694855 - -74.642183518 169.227933646 - -74.721452324 169.113897752 - -74.791627551 169.291820442 - -74.782174472 169.584263786 - -74.702733922 169.696087115 -} -858f46abfffffff -{ - -5.817215054 -76.968807082 - -5.895213516 -77.024660653 - -5.983129470 -76.984563147 - -5.992999180 -76.888604955 - -5.914978959 -76.832798679 - -5.827110793 -76.872903158 -} -85e112d7fffffff -{ - -62.771369913 75.232157992 - -62.677797216 75.199310228 - -62.644469943 75.011265320 - -62.704501530 74.855312206 - -62.798094987 74.887049311 - -62.831636826 75.075851568 -} -85c49d57fffffff -{ - -44.137403825 -45.648173325 - -44.199473150 -45.718334489 - -44.281589583 -45.685147378 - -44.301680685 -45.581518963 - -44.239534318 -45.511250418 - -44.157373983 -45.544717541 -} -850f0e5bfffffff -{ - 65.983863997 -69.381769929 - 65.939602131 -69.591819072 - 65.843253937 -69.601006180 - 65.791209514 -69.401612868 - 65.835244410 -69.192452834 - 65.931549702 -69.181798181 -} -855a84b3fffffff -{ - 18.834175821 177.529651525 - 18.923257926 177.540775866 - 18.974023107 177.462305206 - 18.935588754 177.372732050 - 18.846455569 177.361763480 - 18.795807695 177.440212158 -} -85c7036bfffffff -{ - -44.666517522 -140.603036762 - -44.579424999 -140.577808225 - -44.525422053 -140.670104482 - -44.558470186 -140.787758016 - -44.645592215 -140.813241777 - -44.699636729 -140.720816893 -} -8522d567fffffff -{ - 53.839100200 -167.523285923 - 53.918219785 -167.485326408 - 53.984270504 -167.584656537 - 53.971130337 -167.722119122 - 53.891919402 -167.759832459 - 53.825939908 -167.660330326 -} -85d73177fffffff -{ - -57.022516925 38.143258863 - -56.955059586 38.066529751 - -56.946783377 37.919114587 - -57.006002973 37.847752373 - -57.073689148 37.924178937 - -57.081926757 38.072272309 -} -851790b3fffffff -{ - 52.302336818 147.689092208 - 52.223010134 147.731531387 - 52.204313128 147.874294870 - 52.264831516 147.975180750 - 52.344291258 147.933269639 - 52.363099902 147.789943177 -} -85d20ea7fffffff -{ - -43.933476018 -109.760862809 - -43.870600512 -109.657666286 - -43.774855316 -109.681667924 - -43.741938013 -109.808492521 - -43.804667747 -109.911616384 - -43.900460311 -109.887988780 -} -85f39a23fffffff -{ - -84.559258184 167.536328998 - -84.641569514 167.213036978 - -84.705177062 167.851988582 - -84.685066098 168.817609837 - -84.601880504 169.118398223 - -84.539668919 168.476505156 -} -85aac457fffffff -{ - -29.845362089 76.804728631 - -29.938799183 76.830922287 - -29.965200264 76.937678725 - -29.898153807 77.018095056 - -29.804761852 76.991775645 - -29.778371136 76.885165422 -} -8560928ffffffff -{ - 21.729487183 78.336391546 - 21.812755146 78.307521485 - 21.825982709 78.216087102 - 21.756009287 78.153602084 - 21.672793646 78.182464078 - 21.659499077 78.273819265 -} -85d56b27fffffff -{ - -51.505944254 -176.112626261 - -51.438405841 -176.179130048 - -51.448757901 -176.306045119 - -51.526733980 -176.366776906 - -51.594363025 -176.300270157 - -51.583925278 -176.173033994 -} -85a7409bfffffff -{ - -27.207570217 107.403606715 - -27.281106432 107.440672119 - -27.285350165 107.519310390 - -27.216163454 107.560768791 - -27.142727386 107.523728356 - -27.138377949 107.445204456 -} -85032843fffffff -{ - 86.679319827 -63.880949985 - 86.736243445 -65.071082556 - 86.703426680 -66.585906662 - 86.615087690 -66.852890625 - 86.560395769 -65.674989307 - 86.591855074 -64.216700167 -} -85f0edd3fffffff -{ - -74.686916774 47.970432547 - -74.616424388 47.749283248 - -74.628277732 47.421588653 - -74.710863734 47.311817193 - -74.781853346 47.532528620 - -74.769758186 47.863469409 -} -85f12a93fffffff -{ - -85.565449623 121.502359397 - -85.600320433 120.429820487 - -85.687250411 120.323302234 - -85.739563535 121.331540950 - -85.703306958 122.431538070 - -85.616152768 122.495581129 -} -85f29e4bfffffff -{ - -88.987397973 -35.802281255 - -88.917420036 -32.453056994 - -88.831443098 -34.135734390 - -88.811329786 -38.626890835 - -88.874356820 -42.014830200 - -88.964121572 -40.925350927 +852acd97fffffff +{ + 31.873595358 -72.371008290 + 31.834385211 -72.457847849 + 31.759498822 -72.457374051 + 31.723826170 -72.370326202 + 31.762898527 -72.283623236 + 31.837781076 -72.283831537 } -85e319cffffffff +851b51b7fffffff { - -63.598219547 -140.192344443 - -63.579646162 -140.015400536 - -63.497095086 -139.974661237 - -63.433251149 -140.110202468 - -63.451805486 -140.286294533 - -63.534222578 -140.327694555 + 53.598466932 -36.477782424 + 53.521030082 -36.552444309 + 53.448802611 -36.475442170 + 53.453920174 -36.323896060 + 53.531296924 -36.248952171 + 53.603616261 -36.325835362 } -859d5507fffffff +8584d987fffffff { - -21.006484878 143.801753547 - -20.916954039 143.788203702 - -20.885816076 143.696528520 - -20.944105303 143.618306568 - -21.033632607 143.631681399 - -21.064874366 143.723453253 + -12.789389864 71.162644716 + -12.881031876 71.181788666 + -12.910858069 71.274557628 + -12.848988363 71.348088440 + -12.757377460 71.328832836 + -12.727605059 71.236157955 } -85e09d0bfffffff +85056967fffffff { - -50.423402644 65.930737067 - -50.336803970 65.929096957 - -50.300455230 65.812042477 - -50.350500801 65.696417917 - -50.437041251 65.697535127 - -50.473594715 65.814799566 + 83.815512700 -168.579252448 + 83.730413127 -168.955731055 + 83.650858917 -168.476747615 + 83.655331808 -167.630335180 + 83.739451604 -167.241023593 + 83.820080304 -167.710573655 } -85042123fffffff +852d2a1bfffffff { - 78.037876553 144.906441158 - 77.946225180 145.061999978 - 77.927892061 145.519360245 - 78.000966975 145.827065560 - 78.093025145 145.676555867 - 78.111604117 145.213241653 + 43.167090735 34.481498784 + 43.078443500 34.464942852 + 43.020292103 34.564130554 + 43.050726251 34.679861047 + 43.139320543 34.696620253 + 43.197533751 34.597446010 } -85d2d247fffffff +85032e23fffffff { - -38.140995006 -99.323998241 - -38.071824985 -99.242600441 - -37.981072115 -99.279485851 - -37.959379762 -99.397526387 - -38.028405408 -99.478988022 - -38.119267679 -99.442345896 + 87.087505983 -63.641339193 + 87.144918276 -64.999501239 + 87.111996188 -66.732813194 + 87.023265778 -67.032566639 + 86.968394265 -65.690231227 + 86.999769542 -64.030570180 } -850cd1d7fffffff -{ - 56.663740941 -163.902660488 - 56.591268359 -163.982027094 - 56.525036406 -163.905903723 - 56.531074791 -163.750817580 - 56.603306955 -163.671122654 - 56.669741027 -163.746839887 -} -858bb527fffffff -{ - -14.614197280 -55.896713642 - -14.538536442 -55.846836648 - -14.455468831 -55.890439206 - -14.448107814 -55.983852696 - -14.523756430 -56.033680559 - -14.606778296 -55.990144165 -} -85f29893fffffff -{ - -87.918695667 -90.542702165 - -87.928470257 -87.999413028 - -87.850655776 -86.646625055 - -87.766284261 -87.766902018 - -87.757079932 -90.128658968 - -87.831710978 -91.542839290 -} -85f20e4bfffffff -{ - -79.501425645 -132.839636999 - -79.565900640 -132.520011423 - -79.543368071 -132.039422257 - -79.456573842 -131.885335268 - -79.392784383 -132.205881092 - -79.415106253 -132.679654591 -} -8500dc03fffffff -{ - 84.605835923 97.164596394 - 84.568329528 98.068868005 - 84.624016644 98.883526644 - 84.718521014 98.803137515 - 84.757045090 97.878002581 - 84.700026863 97.054325994 -} -85e50eb3fffffff -{ - -64.161942100 115.448093624 - -64.093773188 115.292778469 - -64.118715593 115.079568405 - -64.211986306 115.020582752 - -64.280428994 115.175959511 - -64.255326511 115.390263923 -} -8552c69bfffffff -{ - 12.850191006 44.649740248 - 12.766221294 44.630919321 - 12.715361377 44.693624311 - 12.748369687 44.775093922 - 12.832240775 44.793991522 - 12.883202181 44.731343000 -} -85e39d4ffffffff -{ - -65.601257434 -123.896554551 - -65.562838165 -123.709344193 - -65.476611244 -123.709391704 - -65.428840688 -123.895603205 - -65.467116698 -124.082131338 - -65.553305910 -124.083129297 -} -85ca1b33fffffff -{ - -43.722384410 57.398205136 - -43.807914567 57.409767352 - -43.849168294 57.520344779 - -43.804837621 57.619302335 - -43.719270935 57.607531259 - -43.678071331 57.497011518 -} -8503269bfffffff +858e660bfffffff { - 89.111648232 86.433827665 - 89.088816796 92.080237473 - 89.149824657 96.752290344 - 89.241870054 95.940113913 - 89.269757262 89.225352913 - 89.199871220 84.499112421 + -11.204635228 -76.896030683 + -11.283620326 -76.952777841 + -11.371454803 -76.912006436 + -11.380265987 -76.814480815 + -11.301272007 -76.757782873 + -11.213475737 -76.798561188 } -85f029a3fffffff -{ - -80.932460796 51.569634750 - -80.864835167 51.167105941 - -80.884773256 50.617478387 - -80.972784546 50.461542432 - -81.041218801 50.864001890 - -81.020827973 51.422552762 -} -8504d437fffffff -{ - 67.434907764 156.185271431 - 67.340518336 156.222651643 - 67.306041037 156.454997397 - 67.365687774 156.651281600 - 67.460172243 156.615668875 - 67.494916203 156.382000740 -} -856a4087fffffff -{ - 7.418624238 34.130429951 - 7.503409373 34.133282509 - 7.550479315 34.055759341 - 7.512816943 33.975339013 - 7.428020123 33.972427199 - 7.380897267 34.049994969 -} -855af363fffffff -{ - 20.970059391 171.247495206 - 21.061915749 171.252703057 - 21.111391665 171.167563161 - 21.068904018 171.077281544 - 20.977029547 171.072249092 - 20.927660685 171.157322799 -} -85808287fffffff -{ - -0.382594034 -34.070061173 - -0.300348574 -34.021718393 - -0.216344569 -34.068706168 - -0.214547683 -34.164058003 - -0.296792415 -34.212444692 - -0.380834770 -34.165435764 -} -85e59c87fffffff -{ - -54.123450458 112.984904619 - -54.052350476 112.873946675 - -54.072178866 112.714142989 - -54.163223988 112.664668003 - -54.234550917 112.775599331 - -54.214605414 112.936033925 -} -8578d273fffffff -{ - -8.999796610 -137.279400971 - -9.077601527 -137.311727984 - -9.136415677 -137.258664968 - -9.117482944 -137.173338401 - -9.039753232 -137.141008460 - -8.980881057 -137.194007911 -} -85db6ec3fffffff -{ - -61.586659539 166.671180533 - -61.517355243 166.607993618 - -61.511756782 166.433069370 - -61.575451049 166.320762992 - -61.644844292 166.383627386 - -61.650454390 166.559122357 -} -85aa738bfffffff -{ - -22.912272855 77.698812834 - -23.006409188 77.724174235 - -23.033341617 77.825019366 - -22.966124705 77.900369651 - -22.872044262 77.874899278 - -22.845124775 77.774187386 -} -85eceb4bfffffff -{ - -72.877606185 123.925140889 - -72.823422970 123.676318081 - -72.861025557 123.384674046 - -72.953100705 123.340095527 - -73.007633789 123.589828663 - -72.969740142 123.883234536 -} -8586ae0bfffffff -{ - -2.127937992 85.846781063 - -2.039077238 85.820376708 - -2.014462684 85.730522958 - -2.078693763 85.667135142 - -2.167490162 85.693552629 - -2.192119854 85.783344907 -} -853e3133fffffff -{ - 29.290254457 21.337790784 - 29.192882638 21.335198189 - 29.142239053 21.430440837 - 29.188904009 21.528364798 - 29.286279272 21.531135475 - 29.336986266 21.435804122 -} -85b23033fffffff -{ - -24.704566961 -72.489365797 - -24.780786513 -72.546156680 - -24.859653240 -72.503326754 - -24.862279203 -72.403717384 - -24.786083063 -72.347000763 - -24.707237573 -72.389819098 -} -853768abfffffff -{ - 38.693830562 -136.787265784 - 38.775396602 -136.752299473 - 38.835867296 -136.815387385 - 38.814733532 -136.913345464 - 38.733221156 -136.948112766 - 38.672788849 -136.885121065 -} -850226a7fffffff -{ - 82.561137408 -103.517135693 - 82.559890809 -104.206918148 - 82.480919195 -104.569285733 - 82.404100360 -104.248554866 - 82.405483267 -103.573227297 - 82.483550062 -103.204376882 -} -850972affffffff -{ - 68.929982513 3.412393380 - 68.977854720 3.270848085 - 68.946486665 3.078459950 - 68.867310501 3.028824745 - 68.819705711 3.170414686 - 68.851010048 3.361599555 -} -850f8aa3fffffff -{ - 63.754644865 -87.617298186 - 63.687614797 -87.775355921 - 63.593594410 -87.724225876 - 63.566458738 -87.516126418 - 63.633217179 -87.358075020 - 63.727382305 -87.408113115 -} -859cf1d7fffffff -{ - -10.167358158 142.413573176 - -10.256828828 142.428405664 - -10.287680612 142.517233419 - -10.229103514 142.591230348 - -10.139637239 142.576425191 - -10.108743590 142.487595719 -} -8508f243fffffff -{ - 63.260304149 21.498930210 - 63.232771852 21.642110070 - 63.285833595 21.765027930 - 63.366573202 21.744720492 - 63.394115864 21.600852620 - 63.340908376 21.477982058 -} -85156d03fffffff -{ - 66.810678094 125.749029671 - 66.735204424 125.898085872 - 66.746752949 126.137821612 - 66.833894941 126.230153239 - 66.909728215 126.081490801 - 66.898059305 125.840095404 -} -850056bbfffffff -{ - 83.626484915 25.290370939 - 83.691481107 25.815642055 - 83.777458951 25.539466376 - 83.797648372 24.721626272 - 83.731512054 24.199531880 - 83.646333476 24.491808088 -} -854ed28ffffffff -{ - 29.328558247 149.425396451 - 29.419957317 149.407967703 - 29.454689223 149.311838548 - 29.398010256 149.233335548 - 29.306712154 149.250923254 - 29.271992001 149.346855285 -} -852a4583fffffff -{ - 34.168016105 -64.314237842 - 34.133741239 -64.409620769 - 34.056794978 -64.421834875 - 34.014177180 -64.338939861 - 34.048340998 -64.243766927 - 34.125233431 -64.231279256 -} -8508ee6ffffffff -{ - 67.810761364 22.138190556 - 67.861783439 22.265330340 - 67.930318224 22.181833364 - 67.947576182 21.970208816 - 67.896243053 21.843420998 - 67.827963305 21.927900272 -} -85ef1653fffffff -{ - -83.354061747 -8.997851750 - -83.261914238 -8.773736118 - -83.194105634 -9.336225066 - -83.217315754 -10.122537679 - -83.308867272 -10.363486668 - -83.377814169 -9.801526161 -} -859ba967fffffff -{ - -17.224210178 -170.469472271 - -17.140354125 -170.427355639 - -17.066629607 -170.480666371 - -17.076693541 -170.575994953 - -17.160445035 -170.618154501 - -17.234237117 -170.564942779 -} -85d76e97fffffff -{ - -52.087227940 24.166907801 - -52.169273769 24.170499245 - -52.200986595 24.277065111 - -52.150659398 24.379710449 - -52.068709051 24.375807867 - -52.036990331 24.269570552 -} -855c308bfffffff -{ - 15.541858094 -153.670156046 - 15.449457049 -153.701657936 - 15.377084840 -153.634468324 - 15.397084073 -153.535771332 - 15.489478469 -153.504204782 - 15.561880330 -153.571399743 -} -850ac187fffffff -{ - 65.874939343 108.099357867 - 65.819949063 108.286081778 - 65.856195736 108.491872111 - 65.947723949 108.511889232 - 66.003027392 108.324576901 - 65.966488309 108.117834435 -} -85df5187fffffff -{ - -55.344021575 -63.207895837 - -55.309503981 -63.061718473 - -55.225981867 -63.038739203 - -55.177074244 -63.161246296 - -55.211432253 -63.306875316 - -55.294856967 -63.330544510 -} -85f16283fffffff -{ - -87.789930455 29.567725808 - -87.703331583 28.687950597 - -87.689629014 26.430733805 - -87.761536530 24.895677681 - -87.850296187 25.646585786 - -87.865042655 28.068877535 -} -851b352bfffffff -{ - 60.161012870 -48.055856932 - 60.145547162 -48.238028018 - 60.057182105 -48.304811209 - 59.984491710 -48.190041341 - 59.999948354 -48.008803435 - 60.088104331 -47.941405462 -} -850aaa47fffffff -{ - 60.011465518 99.408201693 - 59.922241955 99.426858201 - 59.881382743 99.583230939 - 59.929590540 99.721280569 - 60.018770510 99.703363470 - 60.059786676 99.546657441 -} -85d2762ffffffff -{ - -43.018391809 -113.364324872 - -42.958933862 -113.259308221 - -42.862849493 -113.276935609 - -42.826200357 -113.399204608 - -42.885519342 -113.504101912 - -42.981626165 -113.486849856 -} -85a299b3fffffff -{ - -29.292607430 47.783495720 - -29.382945883 47.785305983 - -29.428095926 47.869773308 - -29.382820054 47.952443032 - -29.292392645 47.950493999 - -29.247330035 47.866014141 -} -85f103bbfffffff -{ - -83.588362317 109.167397148 - -83.604198805 108.381507565 - -83.685685429 108.143566641 - -83.751958074 108.707750292 - -83.735548554 109.511720234 - -83.653448560 109.733168179 -} -85d31147fffffff -{ - -53.402571124 -108.487583232 - -53.339489140 -108.365562683 - -53.245398331 -108.396902602 - -53.214331224 -108.549736156 - -53.277260526 -108.671678545 - -53.371409301 -108.640866443 -} -85359463fffffff -{ - 39.057290695 -38.497514855 - 38.972735599 -38.554884078 - 38.892179634 -38.491362044 - 38.896077398 -38.370527079 - 38.980585457 -38.312960482 - 39.061242847 -38.376425709 -} -855ccd6bfffffff -{ - 3.574876535 -146.341341182 - 3.485690141 -146.373869719 - 3.414377218 -146.312264979 - 3.432199989 -146.218163612 - 3.521335123 -146.185599936 - 3.592698775 -146.247172627 -} -8503a2b7fffffff -{ - 81.975346633 -159.631513401 - 81.897317599 -160.010197891 - 81.811080145 -159.730141084 - 81.802212185 -159.080205609 - 81.879359543 -158.697509052 - 81.966253444 -158.968591717 -} -85733093fffffff -{ - 11.868004479 129.252850188 - 11.774948618 129.269627432 - 11.744199597 129.360353952 - 11.806541706 129.434347943 - 11.899632752 129.417577551 - 11.930346559 129.326806243 -} -85ef61a7fffffff -{ - -75.120230116 -80.682402666 - -75.111777003 -80.318214167 - -75.025209760 -80.161746970 - -74.947532847 -80.367062558 - -74.955959125 -80.727284797 - -75.042088759 -80.886128911 -} -85918893fffffff -{ - -13.218812891 -119.123162475 - -13.176914801 -119.054500001 - -13.109986126 -119.059440026 - -13.084951744 -119.132891955 - -13.126748452 -119.201478803 - -13.193680772 -119.196689354 -} -85a76a97fffffff -{ - -27.088234624 105.482326064 - -27.163652867 105.519327257 - -27.169162644 105.600681027 - -27.099356516 105.644911802 - -27.024040622 105.607928551 - -27.018428573 105.526696469 -} -850316dbfffffff -{ - 84.730159187 -164.682041315 - 84.648415573 -165.180990928 - 84.565730435 -164.679290513 - 84.563628843 -163.694504151 - 84.644139801 -163.181643668 - 84.727983429 -163.666867368 -} -85ee9177fffffff -{ - -68.787936666 -5.908963100 - -68.695875368 -5.850353925 - -68.630006923 -6.041338400 - -68.655814804 -6.291129897 - -68.747733487 -6.351588520 - -68.813988137 -6.160412584 -} -8555aa8ffffffff -{ - 21.472811514 -17.380748856 - 21.401237594 -17.445749928 - 21.315848886 -17.411949655 - 21.301985301 -17.313302626 - 21.373443451 -17.248303703 - 21.458880848 -17.281949430 -} -8517761bfffffff -{ - 62.752080428 162.600012928 - 62.659875960 162.608549129 - 62.618405072 162.790409486 - 62.668864365 162.964416616 - 62.761074484 162.957124566 - 62.802820619 162.774580799 -} -85d6104bfffffff -{ - -48.748927004 39.593749881 - -48.822879085 39.588031360 - -48.875049120 39.676991278 - -48.853232816 39.771746864 - -48.779210147 39.777299672 - -48.727074315 39.688262924 -} -85eb761bfffffff -{ - -65.405571071 -156.400363001 - -65.407981113 -156.230170969 - -65.338031194 -156.152133189 - -65.265835126 -156.244024134 - -65.263515001 -156.413339063 - -65.333301171 -156.491637322 -} -85cac1dbfffffff -{ - -46.140819537 61.892936123 - -46.224265232 61.909410952 - -46.260973536 62.027628474 - -46.214188821 62.129272491 - -46.130726567 62.112576543 - -46.094065451 61.994457624 -} -8504de93fffffff -{ - 66.213972067 160.793419286 - 66.119594825 160.810459974 - 66.079098815 161.022783513 - 66.132687165 161.219051802 - 66.227095003 161.203646448 - 66.267885122 160.990336094 -} -850d52a7fffffff -{ - 66.766792191 -149.910528520 - 66.700807367 -150.067887254 - 66.618613257 -150.009369251 - 66.602272176 -149.794834552 - 66.667911872 -149.637514297 - 66.750236877 -149.694685532 -} -85b99587fffffff -{ - -28.756159171 140.530888155 - -28.662495019 140.519864267 - -28.625932868 140.422979660 - -28.682923179 140.337027028 - -28.776557472 140.347843540 - -28.813231454 140.444820068 -} -85e414abfffffff -{ - -58.147508026 106.302598253 - -58.069577427 106.192243124 - -58.080787761 106.009497335 - -58.169992523 105.936242167 - -58.248157393 106.046355572 - -58.236882990 106.229968782 -} -85022c4ffffffff -{ - 80.592396915 -93.162857354 - 80.525122688 -93.527564159 - 80.444710616 -93.353071381 - 80.431156951 -92.819928757 - 80.497778364 -92.453732941 - 80.578603657 -92.622095264 -} -853fb373fffffff -{ - 27.802855461 11.031098866 - 27.707239189 11.037777036 - 27.664327114 11.133043343 - 27.717001777 11.221776657 - 27.812677433 11.215257691 - 27.855619136 11.119846065 -} -856ae073fffffff -{ - 3.347378286 29.381471410 - 3.436740050 29.386174375 - 3.485422253 29.307641746 - 3.444800972 29.224380178 - 3.355444670 29.219616837 - 3.306704096 29.298175419 -} -853b725bfffffff -{ - 36.004878355 -47.252929596 - 35.919448373 -47.295763735 - 35.845063924 -47.230036264 - 35.856003168 -47.121448690 - 35.941424016 -47.078392373 - 36.015914859 -47.144145508 -} -85b00937fffffff -{ - -22.667168819 -118.815955716 - -22.618653123 -118.736803005 - -22.538295993 -118.742896030 - -22.506456694 -118.827940945 - -22.554853451 -118.906994718 - -22.635208257 -118.901102528 -} -859b4957fffffff -{ - -15.982916841 177.470538466 - -15.907192256 177.515435899 - -15.836479148 177.476563074 - -15.841457673 177.392921258 - -15.917065889 177.348041938 - -15.987811845 177.386786197 -} -853fb36bfffffff -{ - 27.516011837 11.051097930 - 27.420401829 11.057740716 - 27.377404139 11.152751769 - 27.429986376 11.241264342 - 27.525655712 11.234779952 - 27.568683578 11.139624453 -} -859a434ffffffff -{ - -10.005498249 -179.630506631 - -9.930945837 -179.588423397 - -9.865412819 -179.628503677 - -9.874378957 -179.710555909 - -9.948817440 -179.752634680 - -10.014403623 -179.712665809 -} -856f2edbfffffff -{ - -3.174263033 -117.437565669 - -3.111563451 -117.396017951 - -3.043679138 -117.438923723 - -3.038579229 -117.523396115 - -3.101343849 -117.564871896 - -3.169143373 -117.521947358 -} -85506653fffffff -{ - 20.113123812 -136.937200402 - 20.027409666 -136.973824923 - 19.952084771 -136.914034481 - 19.962474995 -136.817702246 - 20.048134532 -136.781075347 - 20.123458467 -136.840782911 -} -85c3b687fffffff -{ - -47.005646984 -52.268598680 - -46.963092409 -52.163066621 - -46.888473493 -52.167834230 - -46.856402755 -52.277679669 - -46.898772516 -52.383005355 - -46.973397426 -52.378692065 -} -851191affffffff -{ - 52.498561955 38.188402299 - 52.444248614 38.296742906 - 52.479203295 38.423359065 - 52.568628763 38.441871209 - 52.623044238 38.333267852 - 52.587931858 38.206415124 -} -85b1352bfffffff -{ - -35.727555495 -121.536996875 - -35.676480376 -121.439193858 - -35.583932195 -121.442586870 - -35.542489700 -121.543487064 - -35.593451459 -121.641119128 - -35.685968851 -121.638021891 -} -85297203fffffff -{ - 34.159337364 -128.759390855 - 34.243395026 -128.715949705 - 34.314549192 -128.776828076 - 34.301585180 -128.881102162 - 34.217550223 -128.924366861 - 34.146456528 -128.863534111 -} -85ef0e77fffffff -{ - -80.617377795 -47.762811813 - -80.560144446 -47.288544766 - -80.464285995 -47.358975236 - -80.425488148 -47.893821437 - -80.481941979 -48.364951835 - -80.577966274 -48.304408872 -} -85014ad3fffffff -{ - 78.629240554 0.152375576 - 78.705881928 0.266156943 - 78.766485049 -0.051073032 - 78.749780520 -0.482209703 - 78.672838033 -0.590921540 - 78.612898108 -0.273604217 -} -855d73d7fffffff -{ - 19.828489098 -147.078646152 - 19.738361731 -147.113205336 - 19.664644131 -147.046983122 - 19.681038633 -146.946234100 - 19.771139877 -146.911631855 - 19.844872781 -146.977821524 -} -85f14257fffffff -{ - -84.429902389 48.108558512 - -84.358463595 47.494639662 - -84.374221857 46.584780670 - -84.461946000 46.263727978 - -84.534680039 46.873787404 - -84.518384052 47.809203988 -} -85489a0bfffffff -{ - 31.075921409 -96.919602290 - 31.149401564 -96.852057834 - 31.237984613 -96.892995533 - 31.253087381 -97.001631251 - 31.179547443 -97.069196043 - 31.090964581 -97.028105015 -} -850320dbfffffff -{ - 89.580321368 16.546660983 - 89.654567570 24.471028640 - 89.740561900 17.249948165 - 89.730608804 -2.712692205 - 89.641181002 -5.797779471 - 89.575388809 4.033882512 -} -859c2697fffffff -{ - -17.999590589 147.698738633 - -17.912290267 147.681682125 - -17.884281661 147.590261080 - -17.943484404 147.515785847 - -18.030804541 147.532681434 - -18.058902262 147.624213280 -} -856b814bfffffff -{ - 7.379655726 19.010891976 - 7.294761348 19.010523575 - 7.250306347 19.089486843 - 7.290664749 19.168889227 - 7.375569478 19.169377601 - 7.420105579 19.090343602 -} -85995283fffffff -{ - -10.619021452 -5.218254483 - -10.695577817 -5.244286106 - -10.756564740 -5.182722518 - -10.740883092 -5.095134513 - -10.664275592 -5.069228510 - -10.603400767 -5.130784740 -} -85564337fffffff -{ - 9.583360929 -27.496328424 - 9.657326120 -27.451534133 - 9.736796884 -27.496518608 - 9.742368323 -27.586341508 - 9.668413649 -27.631200242 - 9.588876982 -27.586171724 -} -8542241bfffffff -{ - 28.716598476 59.245949579 - 28.643610264 59.306684723 - 28.648483259 59.409464344 - 28.726403560 59.451734551 - 28.799538371 59.391042220 - 28.794606166 59.288036476 -} -8556d5b3fffffff -{ - 7.706426187 -36.277736366 - 7.785039573 -36.229242421 - 7.866674137 -36.275875577 - 7.869741166 -36.371014654 - 7.791150126 -36.419542890 - 7.709469701 -36.372897888 -} -85f12803fffffff -{ - -86.351380365 120.601805614 - -86.385207941 119.281695904 - -86.472741966 119.121839437 - -86.526836792 120.344981438 - -86.491362906 121.707984637 - -86.403484575 121.804387799 -} -85f2905bfffffff -{ - -88.883300628 113.189253921 - -88.904676354 108.563906452 - -88.990767264 107.054212572 - -89.059095677 110.814080790 - -89.033637367 116.117232814 - -88.944353525 116.927361626 -} -85032297fffffff -{ - 89.722562839 -89.477055353 - 89.731965207 -108.617786108 - 89.645413205 -115.431449782 - 89.569806586 -107.702328937 - 89.564727662 -95.631128441 - 89.632227615 -86.268978077 -} -85005403fffffff -{ - 83.363774028 18.983137259 - 83.434306767 19.417563405 - 83.515986547 19.069625152 - 83.526201638 18.275239410 - 83.454651913 17.847756864 - 83.373906399 18.207423317 -} -85561b03fffffff -{ - 11.316406106 -35.667941422 - 11.392076882 -35.619879104 - 11.471454218 -35.666233530 - 11.475211058 -35.760664567 - 11.399567118 -35.808763227 - 11.320139488 -35.762394634 -} -85f02853fffffff -{ - -80.885285901 63.141423842 - -80.832007766 62.670386026 - -80.868335453 62.167711568 - -80.958618195 62.130049983 - -81.012611774 62.604980972 - -80.975600307 63.113701970 -} -856adc57fffffff -{ - -1.329349903 29.466876648 - -1.236192175 29.471638595 - -1.185474196 29.391560893 - -1.227861094 29.306693863 - -1.321014480 29.301869124 - -1.371785398 29.381974186 -} -85cb5c77fffffff -{ - -35.436629951 59.618681817 - -35.528896342 59.631374119 - -35.568847806 59.735401461 - -35.516469536 59.826672516 - -35.424166332 59.813801938 - -35.384278105 59.709838569 -} -8515346ffffffff -{ - 56.211717054 108.200146105 - 56.160022681 108.330480874 - 56.190551338 108.474267119 - 56.272992514 108.488182770 - 56.324922822 108.357562280 - 56.294175409 108.213311367 -} -85cd4cc7fffffff -{ - -51.478389167 76.682720371 - -51.389428217 76.655603695 - -51.363037826 76.518181534 - -51.425435576 76.407459528 - -51.514423670 76.434004516 - -51.540987288 76.571843841 -} -85264197fffffff -{ - 37.836862990 -88.265575189 - 37.898910890 -88.192751294 - 37.984920495 -88.226653153 - 38.008920103 -88.333574916 - 37.946832979 -88.406485914 - 37.860785534 -88.372388174 -} -85ca112ffffffff -{ - -42.185428367 54.545349501 - -42.271783041 54.553920341 - -42.315472341 54.659310488 - -42.272748860 54.756096166 - -42.186344703 54.747327241 - -42.142713406 54.641970806 -} -852b0aabfffffff -{ - 43.453249581 -65.031215730 - 43.415010147 -65.147023634 - 43.327130192 -65.160498184 - 43.277552880 -65.058574643 - 43.315662574 -64.943071280 - 43.403479006 -64.929187322 -} -85ec46b3fffffff -{ - -76.321099829 144.324894696 - -76.296843916 143.981069236 - -76.359303118 143.706156047 - -76.446439187 143.775062350 - -76.470888719 144.122322481 - -76.408006845 144.397221299 -} -850306cffffffff +85262dcbfffffff { - 87.264113287 -137.655233208 - 87.212611358 -139.237310651 - 87.118525747 -139.105798877 - 87.075721223 -137.497913989 - 87.124952298 -135.962458185 - 87.219185862 -135.987845969 + 44.034507992 -92.514255413 + 43.971640077 -92.599611907 + 43.886778214 -92.560698216 + 43.864647684 -92.436760552 + 43.927322814 -92.351331996 + 44.012321104 -92.389912268 } -85c06a83fffffff +856604bbfffffff { - -36.064158229 1.275224755 - -36.157729881 1.248741712 - -36.223081902 1.334379297 - -36.194771068 1.446424230 - -36.101201059 1.472662772 - -36.035940096 1.387101090 + 10.198734336 -74.490124828 + 10.132155309 -74.542047878 + 10.053185569 -74.503744870 + 10.040860556 -74.413521108 + 10.107485909 -74.361650410 + 10.186389957 -74.399951005 } -8505288ffffffff +85f283abfffffff { - 81.749307705 109.588221699 - 81.693288020 110.119425602 - 81.731797687 110.726169251 - 81.827018181 110.810426019 - 81.883912524 110.275036146 - 81.844702764 109.659522990 + -86.946841037 -119.300157752 + -86.999763533 -117.882474716 + -86.956723074 -116.344026897 + -86.862618547 -116.278481682 + -86.811864471 -117.662850255 + -86.853106093 -119.146712531 +} +85f181cbfffffff +{ + -76.831054691 105.468913971 + -76.758832413 105.228186801 + -76.768329325 104.821866517 + -76.850150737 104.651972108 + -76.922842322 104.891343623 + -76.913242275 105.301997955 +} +85e50993fffffff +{ + -65.600123869 112.404491798 + -65.529018782 112.248076488 + -65.549629867 112.020071793 + -65.641482320 111.947192602 + -65.712874619 112.103520930 + -65.692126612 112.332820382 +} +851eb2bbfffffff +{ + 42.015138669 8.582313927 + 41.925590898 8.592488927 + 41.891220668 8.702400719 + 41.946391032 8.802345870 + 42.035997479 8.792375119 + 42.070375003 8.682254703 +} +85e64babfffffff +{ + -62.404718684 -4.163098695 + -62.316560607 -4.124225252 + -62.254561487 -4.273967491 + -62.280414217 -4.462770543 + -62.368478963 -4.502750268 + -62.430785114 -4.352823134 +} +85011cbbfffffff +{ + 73.619288548 32.083336962 + 73.668581524 32.304123378 + 73.749302581 32.236568394 + 73.780493508 31.945640183 + 73.730739509 31.724597886 + 73.650257093 31.794729078 +} +85ef7263fffffff +{ + -78.586037727 -59.931842136 + -78.545787343 -59.491455932 + -78.449445432 -59.450054318 + -78.393505006 -59.842302939 + -78.433262991 -60.278073630 + -78.529449141 -60.326190510 +} +85001953fffffff +{ + 81.650068018 49.323741563 + 81.684982393 49.883958154 + 81.775667204 49.941518977 + 81.831528898 49.426914798 + 81.795892933 48.858891182 + 81.705125071 48.813318711 +} +85315c2ffffffff +{ + 40.105611397 128.055691168 + 40.180714846 128.018068813 + 40.190104329 127.928462346 + 40.124484837 127.876693336 + 40.049506974 127.914355440 + 40.040023109 128.003747116 +} +85e45bc3fffffff +{ + -60.714500409 83.051273207 + -60.622478022 82.996514266 + -60.600160118 82.809010604 + -60.669709643 82.675411228 + -60.761825979 82.729268431 + -60.784299385 82.917629248 +} +85ef224bfffffff +{ + -85.108089139 -50.577011284 + -85.055906221 -49.654279443 + -84.961578670 -49.742283374 + -84.919231359 -50.717845278 + -84.970001761 -51.626289508 + -85.064507072 -51.573586674 +} +850763c7fffffff +{ + 64.157403913 -14.126229748 + 64.186532457 -14.286259579 + 64.132258584 -14.431362364 + 64.049047286 -14.415974975 + 64.020158382 -14.256504539 + 64.074241744 -14.111862387 +} +85a3b3a7fffffff +{ + -20.319662173 39.768134841 + -20.225152812 39.768964889 + -20.178933239 39.682995932 + -20.227232676 39.596115499 + -20.321789705 39.595213269 + -20.367999692 39.681263689 +} +85f15883fffffff +{ + -82.630483519 42.125083141 + -82.552908392 41.717596509 + -82.559040656 41.017035500 + -82.642973587 40.708692773 + -82.721497664 41.110898152 + -82.715136671 41.826948140 +} +857988d3fffffff +{ + 1.197828500 -139.917787878 + 1.111366681 -139.951300294 + 1.042341562 -139.893951678 + 1.059730040 -139.803150173 + 1.146118222 -139.769625553 + 1.215191559 -139.826914515 +} +8506b6abfffffff +{ + 77.381411904 -50.695464300 + 77.369067566 -51.099105009 + 77.286008107 -51.230107429 + 77.215624268 -50.960834714 + 77.227834223 -50.561667939 + 77.310561169 -50.427333414 +} +8581007bfffffff +{ + -12.501876154 -41.832930525 + -12.419972435 -41.781888394 + -12.336274094 -41.829681724 + -12.334485272 -41.928505522 + -12.416395742 -41.979559183 + -12.500088278 -41.931777666 +} +859f9c37fffffff +{ + -13.002489751 172.588784826 + -12.926082366 172.553281643 + -12.909535564 172.467769566 + -12.969414864 172.417618581 + -13.045933121 172.453069068 + -13.062461168 172.538723440 +} +8546cd37fffffff +{ + 16.959137801 -163.212357469 + 16.867458452 -163.239155932 + 16.799889270 -163.171517902 + 16.823974424 -163.077025305 + 16.915688879 -163.050137751 + 16.983283119 -163.117831804 +} +85b866d7fffffff +{ + -33.116549075 123.741908766 + -33.028791743 123.749552309 + -32.981846346 123.671010038 + -33.022541076 123.584850335 + -33.110188753 123.577036626 + -33.157251374 123.655552530 +} +85d69597fffffff +{ + -45.211042007 43.208862297 + -45.290307546 43.206644161 + -45.340991291 43.298178322 + -45.312363172 43.391979679 + -45.233022810 43.394027210 + -45.182385332 43.302444246 +} +855ad377fffffff +{ + 23.783886080 170.685420433 + 23.877766167 170.690210347 + 23.928113222 170.602033433 + 23.884475869 170.509140959 + 23.790580731 170.504538225 + 23.740337844 170.592640729 +} +859e1ac7fffffff +{ + -13.366131403 165.628754644 + -13.286298877 165.597331028 + -13.266943413 165.508023518 + -13.327409848 165.449992668 + -13.407337399 165.481328377 + -13.426703513 165.570783064 +} +85d3560ffffffff +{ + -48.721835172 -114.782044676 + -48.664257413 -114.664292430 + -48.567854031 -114.681214790 + -48.529015568 -114.815424569 + -48.586457300 -114.933007284 + -48.682873213 -114.916550059 +} +850f26d7fffffff +{ + 70.840839660 -61.682109941 + 70.809173967 -61.950756735 + 70.716596000 -61.995251077 + 70.655822033 -61.773141885 + 70.687286164 -61.506240325 + 70.779724601 -61.459709309 +} +85ef1557fffffff +{ + -83.475116292 -27.909900398 + -83.395939274 -27.437315838 + -83.310361865 -27.801332155 + -83.303048989 -28.625399928 + -83.381133612 -29.105335372 + -83.467620103 -28.754182265 +} +852650b7fffffff +{ + 38.405834155 -92.610019577 + 38.471247126 -92.536916179 + 38.557135843 -92.575989392 + 38.577631585 -92.688356262 + 38.512173812 -92.761517111 + 38.426265165 -92.722253850 +} +85bae637fffffff +{ + -29.128348895 179.185900661 + -29.050300458 179.236674160 + -28.970719196 179.190141341 + -28.969178508 179.092998071 + -29.047126514 179.042238153 + -29.126715569 179.088607718 +} +85e560c7fffffff +{ + -70.532476507 112.082513635 + -70.463000283 111.891839518 + -70.483228383 111.612002333 + -70.573086225 111.520888791 + -70.642905757 111.711403514 + -70.622523224 111.993200450 +} +850326b7fffffff +{ + 89.344992193 41.180259130 + 89.390816957 48.320182933 + 89.484518358 48.963805236 + 89.532227607 39.732320931 + 89.474451169 31.598055270 + 89.382712655 33.586913293 } -85c1aaaffffffff +854edb93fffffff { - -31.317465517 -17.018630181 - -31.406311763 -17.063822026 - -31.483818991 -16.996645578 - -31.472388549 -16.884184813 - -31.383449687 -16.839123477 - -31.306033856 -16.906391969 + 29.435007896 145.267549646 + 29.523985319 145.246355879 + 29.555047987 145.152370272 + 29.497142076 145.079780373 + 29.408280093 145.101109601 + 29.377208574 145.194893570 } -85f2939bfffffff +85f19cb7fffffff { - -89.718092729 109.472925507 - -89.722562839 90.522944647 - -89.790452443 76.048158603 - -89.881742454 84.142735302 - -89.867510404 126.833332400 - -89.776440832 126.320987469 + -75.476360260 102.603930077 + -75.400549539 102.396966920 + -75.405668428 102.023986394 + -75.486648519 101.854312268 + -75.562871813 102.059796331 + -75.557702028 102.436459589 } -85f291cbfffffff +85df08a7fffffff { - -89.374920706 -168.651351032 - -89.466540720 -167.935812057 - -89.495702293 -158.400350862 - -89.424670726 -151.863347481 - -89.338000908 -154.713537691 - -89.316113922 -162.240145666 + -58.642358438 -62.235885682 + -58.605764782 -62.073668967 + -58.518535347 -62.050933203 + -58.467997109 -62.189543426 + -58.504409338 -62.351097351 + -58.591540602 -62.374702490 } -85d0db3bfffffff -{ - -55.777863407 19.634654698 - -55.700179140 19.602404702 - -55.669205390 19.460134783 - -55.715797366 19.349545284 - -55.793612334 19.381183332 - -55.824705001 19.524024156 -} -8528b15bfffffff -{ - 42.789871944 -113.918629312 - 42.866292301 -113.854218290 - 42.941521588 -113.915038074 - 42.940285670 -114.040340311 - 42.863837964 -114.104623031 - 42.788653520 -114.043732268 -} -85e62b77fffffff -{ - -65.480084007 14.906699547 - -65.390844916 14.877525006 - -65.352465887 14.676556784 - -65.403119885 14.503708841 - -65.492489303 14.531501022 - -65.531075326 14.733526246 -} -85076a6bfffffff -{ - 62.956190386 -18.445779235 - 62.979956965 -18.608005926 - 62.920398502 -18.741712912 - 62.837284487 -18.712893019 - 62.813738015 -18.551308119 - 62.873086036 -18.417902350 -} -85adb477fffffff -{ - -28.565372416 22.847893205 - -28.475577934 22.855982103 - -28.422444619 22.768662735 - -28.459094004 22.673258849 - -28.548864056 22.665097874 - -28.602009239 22.752412790 -} -85e61aabfffffff -{ - -61.044630166 19.036531593 - -60.960884594 18.999423374 - -60.928433432 18.828133745 - -60.979586372 18.693133267 - -61.063483128 18.729338435 - -61.096076310 18.901449384 -} -8517ad57fffffff -{ - 57.226020842 153.488380472 - 57.139696571 153.521551457 - 57.112149085 153.682932089 - 57.170749947 153.811809277 - 57.257171194 153.779433261 - 57.284895195 153.617383541 -} -85d51813fffffff -{ - -53.321507956 -158.904981396 - -53.247088267 -158.853185385 - -53.184606901 -158.946777134 - -53.196480439 -159.092087405 - -53.270852381 -159.144105045 - -53.333398615 -159.050591520 -} -85c86acbfffffff -{ - -45.782249371 100.733585712 - -45.705152290 100.662051363 - -45.708623247 100.527202689 - -45.789200353 100.463409782 - -45.866478377 100.534727368 - -45.862998322 100.670055850 -} -8500d437fffffff -{ - 82.572334192 82.821051332 - 82.556431759 83.524374008 - 82.628892449 83.986636272 - 82.718220985 83.742377728 - 82.734396130 83.023780658 - 82.660965186 82.564926991 -} -850a44abfffffff -{ - 71.653760279 92.587426483 - 71.620163183 92.863477625 - 71.678233638 93.086201840 - 71.770334342 93.033194897 - 71.804160384 92.755036103 - 71.745655289 92.532000838 -} -85dee983fffffff -{ - -47.939292208 -52.876970118 - -47.896695005 -52.768005001 - -47.820782756 -52.771588309 - -47.787466270 -52.883657999 - -47.829876340 -52.992396819 - -47.905789607 -52.989292304 -} -855ca6cbfffffff -{ - 11.404651083 -158.541719033 - 11.312493044 -158.570415058 - 11.241492980 -158.503893704 - 11.262610628 -158.408645256 - 11.354776949 -158.379873440 - 11.425817395 -158.446425755 -} -850cc827fffffff -{ - 55.127145177 -156.936718674 - 55.061972915 -157.025244408 - 54.995056050 -156.970344227 - 54.993163356 -156.827388797 - 55.058095900 -156.738722907 - 55.125160563 -156.793150911 -} -850f565bfffffff -{ - 62.908000700 -68.375247976 - 62.864503577 -68.564934833 - 62.767597509 -68.576481703 - 62.714239487 -68.399517126 - 62.757536168 -68.210578378 - 62.854390509 -68.197857192 -} -85e62913fffffff -{ - -66.853404098 14.576985568 - -66.763050570 14.547311754 - -66.724158069 14.334311621 - -66.775398978 14.149808670 - -66.865884721 14.177916492 - -66.904998396 14.392096420 -} -8506c007fffffff -{ - 65.629491743 -47.960624279 - 65.616240057 -48.180533539 - 65.528468447 -48.261286189 - 65.454180128 -48.123027191 - 65.467414640 -47.904476962 - 65.554954437 -47.822832406 -} -8539737bfffffff -{ - 40.250401593 0.080332242 - 40.194474917 -0.005739002 - 40.104651297 0.011909573 - 40.070815059 0.115364796 - 40.126684393 0.201274947 - 40.216447198 0.183890935 -} -850d04b7fffffff -{ - 73.323798587 -153.997909750 - 73.251361369 -154.204545255 - 73.165276962 -154.099398453 - 73.151386452 -153.790072383 - 73.223358192 -153.583080417 - 73.309684560 -153.685754756 -} -8500d65bfffffff -{ - 80.766405104 88.998215442 - 80.740268607 89.554659516 - 80.805900066 89.973756772 - 80.898476335 89.836496851 - 80.924991346 89.271027271 - 80.858546515 88.851930313 -} -85531177fffffff -{ - 24.394668550 39.520917588 - 24.302072737 39.503421707 - 24.243288443 39.579791267 - 24.277009409 39.673615305 - 24.369515265 39.691230044 - 24.428390152 39.614902099 -} -85bfac83fffffff -{ - -35.917712601 163.184162436 - -35.826375684 163.145910854 - -35.807887272 163.029941076 - -35.880733098 162.951981560 - -35.972156253 162.990067973 - -35.990647403 163.106279533 -} -857182d3fffffff -{ - 6.614611743 -178.259636733 - 6.532238524 -178.275918503 - 6.470853899 -178.218217896 - 6.491803678 -178.144142665 - 6.574244674 -178.127777089 - 6.635668135 -178.185570576 -} -85f298c7fffffff -{ - -88.010932239 -78.767187636 - -88.001612950 -76.109732833 - -87.915231471 -75.176730320 - -87.840723581 -76.757034055 - -87.849210937 -79.218676467 - -87.932992868 -80.285976500 -} -85180e8bfffffff -{ - 51.253933015 -10.680275609 - 51.194580562 -10.779836274 - 51.108334338 -10.740996788 - 51.081438134 -10.602964554 - 51.140708954 -10.503505434 - 51.226957432 -10.541976562 -} -85f2834ffffffff -{ - -87.665096683 -115.070958791 - -87.712301583 -113.113432527 - -87.662621599 -111.198682229 - -87.568471320 -111.313276696 - -87.523857153 -113.192890837 - -87.570905722 -115.035596904 -} -85cd01affffffff -{ - -48.859914695 89.202568803 - -48.775061634 89.149330759 - -48.764276170 89.008311098 - -48.838257266 88.920019591 - -48.923234067 88.972840291 - -48.934106264 89.114371125 -} -85661d77fffffff -{ - 6.665261989 -75.095348414 - 6.595149034 -75.148185505 - 6.513190621 -75.109466717 - 6.501410151 -75.017911025 - 6.571566280 -74.965125187 - 6.653459712 -75.003843666 -} -85143183fffffff -{ - 55.299753654 123.076513145 - 55.233285752 123.179612180 - 55.245610756 123.335300195 - 55.324513936 123.388573630 - 55.391242628 123.285572884 - 55.378806986 123.129198462 -} -85b15c03fffffff -{ - -26.027493439 -123.718626722 - -25.980650757 -123.633920883 - -25.897253637 -123.634038197 - -25.860731627 -123.718646234 - -25.907468758 -123.803212968 - -25.990833267 -123.803310690 -} -85ea9127fffffff -{ - -62.585107586 174.530456342 - -62.522172016 174.455413769 - -62.526865836 174.282112806 - -62.594515904 174.183265267 - -62.657548927 174.258124081 - -62.652834382 174.432015893 -} -85387143fffffff -{ - 35.363197457 5.943169004 - 35.270909883 5.954990487 - 35.235480219 6.056276354 - 35.292340032 6.145930802 - 35.384705056 6.134274947 - 35.420132893 6.032798772 -} -85bed413fffffff -{ - -26.873829203 150.976568795 - -26.780371167 150.954196628 - -26.751268364 150.851585573 - -26.815549503 150.771193905 - -26.909039290 150.793377735 - -26.938216323 150.896141768 -} -85f1768bfffffff -{ - -86.783411810 94.003675944 - -86.776013507 92.382840093 - -86.849779730 91.483267853 - -86.933025234 92.235892628 - -86.940545812 93.940612878 - -86.864690930 94.806022952 +851d955bfffffff +{ + 54.018733687 -154.308349610 + 53.956949780 -154.397946153 + 53.890881229 -154.351478115 + 53.886471340 -154.215878987 + 53.948024016 -154.126206994 + 54.014217486 -154.172208211 } -85032573fffffff -{ - 88.417104398 -9.973152480 - 88.506685778 -9.671348707 - 88.558821984 -12.693735823 - 88.516671729 -15.873906452 - 88.426755717 -15.820873767 - 88.379074115 -12.946057050 -} -857804abfffffff -{ - 1.197220565 -134.560770643 - 1.112765263 -134.594674674 - 1.045195333 -134.541380628 - 1.062039189 -134.454260558 - 1.146407249 -134.420362253 - 1.214018663 -134.473578184 -} -85ef4447fffffff -{ - -76.461255567 -69.160360423 - -76.434842515 -68.768725143 - -76.341252991 -68.670669211 - -76.274384793 -68.960013413 - -76.300535652 -69.347395427 - -76.393814512 -69.449658146 -} -85f22dcffffffff -{ - -75.673550145 -140.006989685 - -75.740648727 -139.813873153 - -75.728204090 -139.462656795 - -75.648678578 -139.308361704 - -75.582041810 -139.502892487 - -75.594469091 -139.850330817 -} -85bc0057fffffff -{ - -33.827777489 32.803000197 - -33.742453120 32.807002687 - -33.698785686 32.714383285 - -33.740447064 32.617705345 - -33.825783188 32.613618316 - -33.869446276 32.706293757 -} -8597156bfffffff -{ - -19.022607874 34.993930084 - -18.926603461 34.996750747 - -18.877081314 34.910311855 - -18.923558266 34.820992672 - -19.019589073 34.818098351 - -19.069116612 34.904596877 -} -85ec6e23fffffff -{ - -78.889128435 146.942265931 - -78.870182318 146.521951648 - -78.935107817 146.202916367 - -79.019480382 146.304694516 - -79.038631444 146.730313790 - -78.973202821 147.048808952 -} -85255567fffffff -{ - 50.498397387 104.325782140 - 50.408173882 104.330871505 - 50.366344388 104.446867765 - 50.414578347 104.557910749 - 50.504718910 104.553267449 - 50.546708668 104.437135432 -} -854188b3fffffff -{ - 27.868048937 114.095144103 - 27.952401371 114.075889493 - 27.986669066 113.985177945 - 27.936547533 113.913711467 - 27.852134378 113.933048083 - 27.817903446 114.023769193 -} -85ed4167fffffff -{ - -75.240388617 166.575215857 - -75.246265863 166.268178713 - -75.324657669 166.132176763 - -75.397390134 166.305404816 - -75.391360298 166.615487028 - -75.312751367 166.749277222 -} -854e9543fffffff -{ - 28.655175997 157.565358111 - 28.749824984 157.556164359 - 28.791635116 157.458887210 - 28.738744091 157.370971908 - 28.644157634 157.380358107 - 28.602399552 157.477467345 -} -85e891c3fffffff -{ - -68.735807128 -67.712918254 - -68.706125876 -67.464173093 - -68.613662708 -67.406948725 - -68.551081945 -67.596689140 - -68.580577455 -67.843739984 - -68.672838405 -67.902737832 -} -850692cbfffffff -{ - 75.934473614 -66.656845994 - 75.897675908 -67.003562827 - 75.807556925 -67.033421062 - 75.754329180 -66.720350462 - 75.790788728 -66.376243802 - 75.880811759 -66.342606392 -} -850a851bfffffff -{ - 59.158504468 98.123971093 - 59.068705506 98.145378119 - 59.029407576 98.300799099 - 59.079754824 98.435161001 - 59.169517535 98.414465719 - 59.208969640 98.258696748 -} -85de5813fffffff -{ - -47.905786366 -55.640660432 - -47.865984341 -55.529251767 - -47.790342193 -55.526868029 - -47.754521996 -55.635418735 - -47.794149321 -55.746563750 - -47.869771129 -55.749421593 -} -856100dbfffffff -{ - 5.468127531 81.177462875 - 5.558018490 81.150098213 - 5.580247829 81.061055769 - 5.512632153 80.999447717 - 5.422816635 81.026812779 - 5.400541354 81.115785595 -} -851f2e0bfffffff -{ - 56.097099401 13.375778314 - 56.021640962 13.382274998 - 55.991662819 13.516389241 - 56.037097862 13.644271258 - 56.112580346 13.638100562 - 56.142603928 13.503721556 -} -8506ed13fffffff -{ - 63.305762438 -40.559169123 - 63.302131400 -40.757158095 - 63.219681012 -40.850886346 - 63.141111722 -40.747118397 - 63.144805624 -40.550258577 - 63.227006092 -40.456041917 -} -85074b6bfffffff -{ - 62.058657705 -24.609821644 - 62.074923355 -24.778558757 - 62.008255602 -24.899549395 - 61.925556180 -24.851706041 - 61.909477846 -24.683732975 - 61.975912146 -24.562841170 -} -858532abfffffff -{ - -0.124283954 56.498753612 - -0.200791816 56.506105117 - -0.225632285 56.581605506 - -0.173873823 56.649730541 - -0.097348632 56.642280227 - -0.072599127 56.566803703 -} -85ef3083fffffff -{ - -86.090105672 -37.276255931 - -86.021527118 -36.329273901 - -85.931854206 -36.735281154 - -85.909704162 -38.042977009 - -85.976359594 -38.992125986 - -86.067062243 -38.632526617 -} -85d6ce4ffffffff -{ - -44.280341560 30.118307724 - -44.208800026 30.123824874 - -44.170706131 30.025790124 - -44.204145899 29.922192957 - -44.275688199 29.916581523 - -44.313790058 30.014661505 -} -85ad2c9bfffffff -{ - -35.494621112 12.179364183 - -35.586233262 12.167313089 - -35.641564761 12.253845205 - -35.605223003 12.352272458 - -35.513671654 12.364086742 - -35.458401148 12.277710522 -} -85989a77fffffff -{ - -22.645928756 -15.282033519 - -22.732276986 -15.321518858 - -22.805368479 -15.258952524 - -22.792006539 -15.156836696 - -22.705566898 -15.117468720 - -22.632580570 -15.180098894 -} -859f6813fffffff -{ - -26.882778358 163.849399310 - -26.792785743 163.814404037 - -26.773279793 163.710198442 - -26.843761022 163.640791771 - -26.933848713 163.675657394 - -26.953360136 163.780059677 -} -85986d17fffffff -{ - -14.284790581 3.631931640 - -14.364622302 3.613746566 - -14.424670443 3.680910051 - -14.404778385 3.766200387 - -14.324935105 3.784235828 - -14.264995300 3.717130635 -} -850d131bfffffff -{ - 70.576693363 -166.283829246 - 70.493260496 -166.415221142 - 70.415704533 -166.269636918 - 70.421237989 -165.993773864 - 70.504300194 -165.861176921 - 70.582199559 -166.005635040 -} -850f5bdbfffffff -{ - 58.051646478 -67.156618791 - 58.009253675 -67.321066945 - 57.912609777 -67.334440708 - 57.858418370 -67.184229168 - 57.900639315 -67.020363139 - 57.997222928 -67.006127407 -} -85b14153fffffff -{ - -26.384133006 -125.750353347 - -26.338675348 -125.664895700 - -26.255454390 -125.662437831 - -26.217734883 -125.745225465 - -26.263094801 -125.830532094 - -26.346271793 -125.833201988 -} -85f35473fffffff -{ - -74.376535641 -148.864397193 - -74.447696000 -148.734005302 - -74.447850287 -148.417009290 - -74.376712594 -148.233490240 - -74.305887271 -148.365860556 - -74.305863861 -148.679790964 -} -857810dbfffffff -{ - -0.691059228 -137.832045529 - -0.775751593 -137.865519401 - -0.842787171 -137.810091555 - -0.825179570 -137.721256148 - -0.740566814 -137.687777300 - -0.673482065 -137.743138717 -} -85153383fffffff -{ - 56.272111787 110.446177460 - 56.217859514 110.573777754 - 56.245893631 110.721051442 - 56.328386611 110.741239845 - 56.382884805 110.613407167 - 56.354643495 110.465617689 -} -85486d3bfffffff -{ - 27.691674767 -120.662025327 - 27.776215030 -120.612198607 - 27.856679672 -120.668132894 - 27.852530034 -120.773903135 - 27.767973403 -120.823597520 - 27.687582739 -120.767654252 -} -85db15affffffff -{ - -54.966064016 179.901924448 - -54.898379973 179.833675143 - -54.906195901 179.692727467 - -54.981759057 179.619633476 - -55.049534969 179.687829934 - -55.041655786 179.829174105 -} -85490137fffffff -{ - 17.100724811 -110.138545896 - 17.181312164 -110.084196935 - 17.266533952 -110.130839712 - 17.271098584 -110.231898034 - 17.190442978 -110.286184899 - 17.105291000 -110.239475775 -} -85364a63fffffff -{ - 28.128340775 -137.703838667 - 28.047647200 -137.741757623 - 27.974358996 -137.679098253 - 27.981776703 -137.578605550 - 28.062434240 -137.540680791 - 28.135710138 -137.603254368 -} -85562eaffffffff -{ - 15.991134553 -32.304581180 - 15.918565588 -32.354859284 - 15.840474405 -32.309994498 - 15.834846835 -32.214920790 - 15.907321614 -32.164554981 - 15.985518165 -32.209350326 -} -853b6c0ffffffff -{ - 36.375982377 -39.452725809 - 36.291233095 -39.506889341 - 36.210611109 -39.444845629 - 36.214632482 -39.328682078 - 36.299336153 -39.274328275 - 36.380064130 -39.336327843 -} -85002aabfffffff -{ - 79.922477391 26.942959404 - 79.982774692 27.280113970 - 80.066972685 27.122248725 - 80.090393413 26.620669308 - 80.029365979 26.284248464 - 79.945651026 26.448607711 -} -850ad5d7fffffff -{ - 62.689157941 106.141457735 - 62.637412439 106.308739929 - 62.674394323 106.485965153 - 62.763396524 106.496572018 - 62.815412889 106.328762299 - 62.778155277 106.150872764 -} -8565566ffffffff -{ - 5.306065151 96.669868534 - 5.399713309 96.645060358 - 5.425152919 96.550907491 - 5.356924284 96.481604473 - 5.263292033 96.506456732 - 5.237872454 96.600568032 -} -85be0cc7fffffff -{ - -35.037361644 151.836804968 - -34.942243225 151.811212133 - -34.912762784 151.698044674 - -34.978336461 151.610280343 - -35.073486427 151.635648728 - -35.103031310 151.749006176 -} -8510a117fffffff -{ - 55.310166354 45.939917304 - 55.248626074 46.051465756 - 55.276843318 46.200411386 - 55.366738002 46.238216360 - 55.428414682 46.126498460 - 55.400059968 45.977144400 -} -85cad467fffffff -{ - -47.610448718 57.850854067 - -47.691934997 57.863410888 - -47.732016082 57.979510218 - -47.690560422 58.082985733 - -47.609046058 58.070200351 - -47.569015305 57.954168039 -} -851586d3fffffff -{ - 50.097955377 115.655918879 - 50.042544772 115.754794245 - 50.061291883 115.881752790 - 50.135593884 115.910256512 - 50.191226379 115.811313958 - 50.172334586 115.683934079 -} -85243333fffffff -{ - 44.781532427 98.869015577 - 44.690676298 98.883317525 - 44.656544619 98.995895497 - 44.713114134 99.094348727 - 44.803922844 99.080425340 - 44.838209678 98.967670175 -} -8503865bfffffff -{ - 79.131218837 -157.951714091 - 79.054404476 -158.243778671 - 78.967681986 -158.049707330 - 78.957318587 -157.568724562 - 79.033459104 -157.274847629 - 79.120634705 -157.463699499 -} -855d5acffffffff -{ - 14.938954496 -146.311804315 - 14.847736807 -146.345886206 - 14.773348093 -146.281370452 - 14.790151790 -146.182807987 - 14.881332939 -146.148687663 - 14.955746964 -146.213168078 -} -85cf0b43fffffff -{ - -49.472462568 -80.210608261 - -49.391041929 -80.148459438 - -49.313144187 -80.219723212 - -49.316509529 -80.353058117 - -49.397866595 -80.415553170 - -49.475922040 -80.344368054 -} -85ef4e63fffffff -{ - -73.322701322 -64.343016471 - -73.288332496 -64.030951898 - -73.193193787 -63.976969795 - -73.132613233 -64.231994536 - -73.166698164 -64.541522946 - -73.261645557 -64.598551496 -} -858f803bfffffff -{ - -5.121816994 -90.387894429 - -5.198423754 -90.446820008 - -5.287100174 -90.410339059 - -5.299166554 -90.314875867 - -5.222516958 -90.255932537 - -5.133843859 -90.292470025 -} -85965cd3fffffff -{ - -11.036138082 21.343649108 - -10.939951305 21.351693025 - -10.885427441 21.271590561 - -10.927041252 21.183455382 - -11.023185261 21.175351581 - -11.077758291 21.255442779 -} -855365a7fffffff -{ - 28.599019791 50.463276216 - 28.532223219 50.529682037 - 28.543227151 50.625511861 - 28.621129278 50.655117259 - 28.688070384 50.588680828 - 28.676964651 50.492669371 -} -8503aa57fffffff -{ - 81.106247419 -142.617510963 - 81.047247424 -143.082047899 - 80.954455941 -143.000117767 - 80.920507965 -142.463904465 - 80.978735486 -142.002303438 - 81.071676511 -142.073934639 -} -85cf12bbfffffff -{ - -51.429941602 -72.566946564 - -51.347189532 -72.519531714 - -51.277392036 -72.600749026 - -51.290200136 -72.729420350 - -51.372936338 -72.777255221 - -51.442880516 -72.695999452 -} -85025a57fffffff -{ - 71.865970009 -92.253555651 - 71.795416605 -92.457105614 - 71.707056820 -92.365589303 - 71.689017642 -92.072404718 - 71.759216897 -91.868475501 - 71.847808629 -91.958098259 -} -85f00277fffffff -{ - -78.041900103 74.108490654 - -77.953262515 74.046419926 - -77.915124642 73.651128560 - -77.965242670 73.314663645 - -78.053966245 73.371651730 - -78.092488972 73.770197828 -} -85df8177fffffff -{ - -60.247146124 -45.399166393 - -60.189265552 -45.251825514 - -60.099731670 -45.280961453 - -60.067998526 -45.456441859 - -60.125589273 -45.603543342 - -60.215202239 -45.575405470 -} -85beeba3fffffff -{ - -30.145711997 144.419818140 - -30.050992706 144.404088309 - -30.016418002 144.301999488 - -30.076463673 144.215517644 - -30.171174376 144.231032920 - -30.205848146 144.333244685 -} -85f1434bfffffff -{ - -83.787330942 40.581428452 - -83.708388282 40.117363326 - -83.712386074 39.285184513 - -83.795512547 38.895412949 - -83.875549828 39.350819784 - -83.871362927 40.205033425 -} -852aa32ffffffff -{ - 40.234890545 -78.125922187 - 40.185585925 -78.223716580 - 40.100188774 -78.212706513 - 40.064060432 -78.104271432 - 40.113186793 -78.006601704 - 40.198619442 -78.017242157 -} -85b04007fffffff -{ - -20.669159714 -121.595540175 - -20.623414390 -121.517882800 - -20.546128108 -121.520484147 - -20.514601302 -121.600556445 - -20.560237902 -121.678105748 - -20.637509856 -121.675690794 -} -85c10ecbfffffff -{ - -27.921338152 -11.495940369 - -28.011454066 -11.534163201 - -28.085464379 -11.464265557 - -28.069252893 -11.356103377 - -27.979064362 -11.318035422 - -27.905159859 -11.387974420 -} -85d48187fffffff -{ - -44.064609712 -154.700801399 - -43.978863664 -154.659316084 - -43.911787834 -154.745393651 - -43.930399272 -154.872941451 - -44.016116018 -154.914628798 - -44.083250725 -154.828566763 -} -85317607fffffff -{ - 44.134315175 125.445196257 - 44.076771779 125.516233151 - 44.083034630 125.629594197 - 44.146903056 125.672286453 - 44.204635398 125.601331808 - 44.198310193 125.487601869 -} -85aa6697fffffff -{ - -19.493550419 77.619452656 - -19.587184267 77.644093942 - -19.614507060 77.742287743 - -19.548178531 77.815713975 - -19.454602891 77.790969080 - -19.427297508 77.692901372 -} -85ef4a6bfffffff -{ - -72.421803010 -61.345266146 - -72.382841192 -61.054107481 - -72.287047124 -61.018585216 - -72.230350679 -61.271362777 - -72.269003241 -61.560431690 - -72.364659536 -61.598805665 -} -85ce4077fffffff -{ - -40.645747064 -87.291664386 - -40.569873527 -87.226212642 - -40.485671471 -87.279766190 - -40.477190607 -87.398634505 - -40.552958657 -87.464285028 - -40.637313123 -87.410869174 -} -8500c04bfffffff -{ - 84.601751649 80.285032409 - 84.590444935 81.255080384 - 84.665477736 81.860131033 - 84.753112381 81.486774377 - 84.764700166 80.487046373 - 84.688365388 79.890935972 -} -85ab8dbbfffffff -{ - -24.993388524 66.691572815 - -25.089229750 66.709064032 - -25.123407628 66.809200788 - -25.061685183 66.891754017 - -24.965843332 66.874118452 - -24.931724446 66.774073902 -} -85f10d83fffffff +85f29933fffffff { - -85.844793708 94.281119526 - -85.837863238 93.029849149 - -85.911539747 92.351158850 - -85.993735902 92.943329663 - -86.000720319 94.244038956 - -85.925451109 94.901869247 + -86.295931988 -79.372357217 + -86.287996063 -77.934437435 + -86.201916104 -77.379033740 + -86.125249691 -78.220981377 + -86.132823811 -79.599312477 + -86.217414930 -80.193619758 +} +85656a9bfffffff +{ + 0.181145658 93.031825198 + 0.272567622 93.006458522 + 0.297319157 92.913763865 + 0.230638402 92.846485082 + 0.139252835 92.871885135 + 0.114511578 92.964530703 +} +85458ccffffffff +{ + 21.466303867 -81.002854017 + 21.530516066 -80.941554400 + 21.614527732 -80.963311432 + 21.634379116 -81.046511182 + 21.570103013 -81.107903685 + 21.486039488 -81.086003550 +} +852636abfffffff +{ + 46.538293647 -100.648241395 + 46.468726338 -100.723104889 + 46.386715115 -100.667680615 + 46.374091222 -100.537655405 + 46.443485734 -100.462586989 + 46.525676941 -100.517747533 +} +85804c53fffffff +{ + 0.761780340 -50.545210018 + 0.843706466 -50.495212637 + 0.927240309 -50.540102481 + 0.928846241 -50.634943715 + 0.846960366 -50.684914391 + 0.763428328 -50.640070660 +} +85cc63bbfffffff +{ + -47.446369559 72.547872443 + -47.360970217 72.532284746 + -47.332781220 72.413377093 + -47.389812905 72.309774497 + -47.475208506 72.324891581 + -47.503576529 72.444082088 +} +85ca469bfffffff +{ + -39.330054565 63.279909937 + -39.420021177 63.296556485 + -39.456781935 63.407727103 + -39.403525729 63.502155845 + -39.313541005 63.485318721 + -39.276830477 63.374243345 +} +85959ebbfffffff +{ + -14.576539356 117.260867381 + -14.658059152 117.276773536 + -14.693974140 117.355463246 + -14.648353918 117.418309832 + -14.566757373 117.402391778 + -14.530857797 117.323638994 +} +858d8b2ffffffff +{ + -5.936981040 108.587675856 + -5.852299152 108.567983791 + -5.831127671 108.482082081 + -5.894708225 108.415879136 + -5.979406312 108.435633220 + -6.000507721 108.521528276 +} +85232693fffffff +{ + 34.413759442 -164.151150706 + 34.500365596 -164.120081930 + 34.565936647 -164.188783340 + 34.544820797 -164.288671255 + 34.458089122 -164.319627706 + 34.392598848 -164.250808947 +} +854c31dbfffffff +{ + 25.492398453 -67.096308755 + 25.460891095 -67.175128817 + 25.396229869 -67.181739119 + 25.363101803 -67.109727575 + 25.394507516 -67.031041732 + 25.459142754 -67.024233314 +} +850d81a3fffffff +{ + 67.507285065 -172.227925401 + 67.420686362 -172.319687279 + 67.349664506 -172.172526377 + 67.364900272 -171.934108885 + 67.451210082 -171.841149864 + 67.522573376 -171.987797445 +} +85158947fffffff +{ + 52.148423130 123.006067922 + 52.084620072 123.099723201 + 52.096002775 123.240910079 + 52.171289705 123.289004140 + 52.235332800 123.195427913 + 52.223848616 123.053677120 +} +85caec03fffffff +{ + -43.512590266 62.908548863 + -43.598816475 62.925554984 + -43.635191116 63.041264560 + -43.585292270 63.139867028 + -43.499050052 63.122653013 + -43.462722559 63.007044334 +} +854f52cbfffffff +{ + 16.557141218 151.901249546 + 16.466787665 151.914611536 + 16.428879130 152.001614638 + 16.481295801 152.075226443 + 16.571589101 152.061904352 + 16.609526017 151.974930527 +} +85e0ec27fffffff +{ + -54.806303704 51.815403985 + -54.722939754 51.847098359 + -54.672306305 51.746175590 + -54.704828360 51.613603299 + -54.788033985 51.581415146 + -54.838876045 51.682291736 +} +8544d9a3fffffff +{ + 35.898238660 -82.743484119 + 35.937225011 -82.696489509 + 35.953721902 -82.668264381 + 36.033516751 -82.685677571 + 36.063753737 -82.788001159 + 36.030642645 -82.844467454 + 36.011132862 -82.868001424 + 35.925409589 -82.840952964 +} +856598bbfffffff +{ + 14.370828048 102.960448430 + 14.464534956 102.937106720 + 14.492456953 102.842102224 + 14.426637624 102.770464688 + 14.332908511 102.793867773 + 14.305020878 102.888847108 +} +85f2a3a7fffffff +{ + -84.771159485 -149.063793053 + -84.852315982 -148.655584118 + -84.856103561 -147.654458951 + -84.778429158 -147.092133470 + -84.698303880 -147.519260936 + -84.694816369 -148.490392233 +} +85160947fffffff +{ + 54.062200129 170.130604721 + 54.148833062 170.136922709 + 54.195405504 170.004196432 + 54.155256767 169.865328573 + 54.068614186 169.859432145 + 54.022129731 169.991981862 +} +850336a7fffffff +{ + 87.442944975 169.270830190 + 87.350069207 169.124017308 + 87.295204843 170.786051737 + 87.330537310 172.633416025 + 87.422802641 172.903848040 + 87.480430742 171.205065568 } -850022b7fffffff -{ - 77.313279627 31.861476499 - 77.366303332 32.151171524 - 77.450610357 32.060986779 - 77.481589167 31.676628111 - 77.427973409 31.386530957 - 77.343973455 31.481169943 -} -85968607fffffff -{ - -6.400509727 34.592376137 - -6.304973644 34.595213259 - -6.253814536 34.513138708 - -6.298158751 34.428175022 - -6.393717212 34.425271484 - -6.444909160 34.507398051 -} -8503722ffffffff -{ - 83.288899673 -71.764180289 - 83.333906203 -72.401156232 - 83.291582324 -73.094381073 - 83.205117740 -73.140221083 - 83.161154398 -72.510308856 - 83.202624576 -71.827449096 -} -85755933fffffff -{ - -0.643356209 -1.065369920 - -0.563175533 -1.052251239 - -0.519180125 -1.106844379 - -0.555289844 -1.174480335 - -0.635366518 -1.187612456 - -0.679437423 -1.133095239 -} -850b492ffffffff -{ - 73.537955457 78.790435881 - 73.525576692 79.108126951 - 73.597902544 79.293963814 - 73.683029762 79.160995945 - 73.695437265 78.840162721 - 73.622688422 78.655459741 -} -85255c9bfffffff -{ - 50.400476679 106.024341918 - 50.310916553 106.026112451 - 50.267817235 106.138536913 - 50.314118000 106.249299974 - 50.403585785 106.247961260 - 50.446845338 106.135428077 -} -85114c23fffffff -{ - 68.812002590 44.267113726 - 68.763096152 44.435298418 - 68.796202794 44.653741744 - 68.878368125 44.704849123 - 68.927457267 44.536220300 - 68.894197692 44.316926582 -} -85caa433fffffff -{ - -42.682717803 49.539344472 - -42.767055862 49.543082995 - -42.814200990 49.642134423 - -42.776950860 49.737451227 - -42.692547692 49.733525755 - -42.645459680 49.634470595 -} -85382b2bfffffff -{ - 34.957811597 2.752933070 - 34.866951906 2.767424958 - 34.834386834 2.866733215 - 34.892697027 2.951746513 - 34.983646210 2.937403878 - 35.016195759 2.837898425 -} -856ad823fffffff -{ - -2.373522504 30.659137455 - -2.279706776 30.663460753 - -2.228706311 30.582852094 - -2.271472687 30.497887047 - -2.365289998 30.493499926 - -2.416339438 30.574141659 -} -85d59c9bfffffff -{ - -49.843900743 -149.350592824 - -49.762212557 -149.312298921 - -49.704421233 -149.408449951 - -49.728258742 -149.542944109 - -49.809933242 -149.581505088 - -49.867784054 -149.485305255 -} -85044383fffffff -{ - 74.818369476 178.925708045 - 74.724643493 178.840674298 - 74.658701637 179.102041542 - 74.685969552 179.448493132 - 74.779419464 179.536935822 - 74.845879503 179.275537833 -} -85a98643fffffff -{ - -28.459882099 -40.960341774 - -28.389718105 -40.908148842 - -28.318714436 -40.957224040 - -28.317893575 -41.058483949 - -28.388080089 -41.110693182 - -28.459064939 -41.061626366 -} -8526802bfffffff -{ - 40.079567595 -106.812685372 - 40.154240163 -106.744239787 - 40.235602561 -106.798217711 - 40.242261424 -106.920764321 - 40.167547201 -106.989146693 - 40.086215800 -106.935046083 -} -85f2c807fffffff -{ - -77.151075203 -92.008848838 - -77.161113421 -91.595821960 - -77.084395832 -91.347302979 - -76.998221730 -91.510493841 - -76.988383080 -91.918475327 - -77.064520576 -92.168271084 -} -85004617fffffff -{ - 83.226119302 1.733254703 - 83.307426319 1.950809864 - 83.372895087 1.414645967 - 83.355928139 0.659608020 - 83.274058754 0.456839305 - 83.209710327 0.994111169 -} -85170203fffffff -{ - 60.281225921 153.883384501 - 60.192022725 153.918918748 - 60.162868230 154.097384299 - 60.222722656 154.241126747 - 60.312026481 154.206575402 - 60.341375966 154.027296669 -} -85ef6b23fffffff -{ - -72.545810183 -73.213693660 - -72.525012853 -72.905449077 - -72.433972848 -72.807972024 - -72.364035812 -73.016424376 - -72.384693767 -73.321926610 - -72.475427070 -73.421703149 -} -85d5907bfffffff -{ - -49.500936933 -146.036351835 - -49.418333355 -146.002395704 - -49.363306033 -146.099546039 - -49.390827697 -146.230740423 - -49.473430893 -146.264974988 - -49.528512950 -146.167737050 -} -85108093fffffff -{ - 53.018709977 47.932945521 - 52.953759240 48.037417397 - 52.978896559 48.181771792 - 53.069114651 48.222051223 - 53.134206163 48.117461202 - 53.108938528 47.972709204 -} -851db44bfffffff -{ - 56.630078954 -153.363526116 - 56.566885107 -153.463105062 - 56.497110324 -153.414820322 - 56.490403119 -153.267523775 - 56.553346230 -153.167878035 - 56.623246885 -153.215593923 -} -8592a8c3fffffff -{ - -12.790594293 -109.360004145 - -12.856004577 -109.414045389 - -12.939887162 -109.387792372 - -12.958430765 -109.307407590 - -12.892995032 -109.253279307 - -12.809041140 -109.279622837 -} -8548c903fffffff -{ - 35.607195829 -111.086051538 - 35.687005863 -111.023572792 - 35.769441396 -111.078491871 - 35.772021986 -111.195972942 - 35.692175414 -111.258360455 - 35.609784799 -111.203358504 -} -85146a53fffffff -{ - 60.228353007 140.981564648 - 60.144465688 141.056363240 - 60.133109059 141.244164041 - 60.205572706 141.358184169 - 60.289680073 141.284108721 - 60.301104026 141.095286296 -} -85319a2ffffffff -{ - 35.809977991 115.850136300 - 35.885922342 115.831196181 - 35.921148203 115.739524499 - 35.880408543 115.666777170 - 35.804415186 115.685805243 - 35.769210450 115.777492704 -} -857d4067fffffff -{ - -4.252599154 -27.892528782 - -4.170804816 -27.846623424 - -4.088874999 -27.892630893 - -4.088696624 -27.984588334 - -4.170513615 -28.030559592 - -4.252486337 -27.984507608 -} -8504150ffffffff -{ - 73.240890778 140.814076509 - 73.151513443 140.947770116 - 73.139860231 141.281236948 - 73.217475386 141.484224318 - 73.307206381 141.352818430 - 73.318969395 141.016116575 -} -85872ad3fffffff -{ - -14.269099477 89.331388291 - -14.355948687 89.361092283 - -14.377925397 89.450629291 - -14.313082417 89.510333359 - -14.226335340 89.480580794 - -14.204329131 89.391172555 -} -85ca32a7fffffff -{ - -39.799868639 51.598610041 - -39.887252466 51.604168225 - -39.933018328 51.703142122 - -39.891337265 51.796547161 - -39.803889401 51.790807070 - -39.758186555 51.691843972 -} -85050d8ffffffff -{ - 81.220093372 124.854712610 - 81.145535123 125.247520421 - 81.160102661 125.867100856 - 81.249500255 126.104918841 - 81.324921808 125.714573789 - 81.310078659 125.083816319 -} -850600cbfffffff -{ - 70.202289624 -30.636182748 - 70.215903151 -30.884656062 - 70.144610704 -31.038566421 - 70.060013025 -30.944210200 - 70.046566796 -30.697475471 - 70.117551678 -30.543366103 -} -85b6743bfffffff +85519567fffffff +{ + 16.977184458 -121.170080909 + 17.058629785 -121.124837388 + 17.139316345 -121.176308128 + 17.138463877 -121.273027365 + 17.056983720 -121.318157673 + 16.976390803 -121.266682150 +} +850069c7fffffff +{ + 81.609174751 -29.539408190 + 81.688972296 -29.690517694 + 81.711556832 -30.287908514 + 81.653878106 -30.724638594 + 81.574530158 -30.563896958 + 81.552405640 -29.975964732 +} +85567613fffffff +{ + 14.028014553 -30.829545640 + 13.957499683 -30.880116864 + 13.880719283 -30.837234466 + 13.874353355 -30.743855095 + 13.944770382 -30.693207330 + 14.021651181 -30.736015231 +} +852849a7fffffff +{ + 44.041250411 -137.772260588 + 44.120139484 -137.736537835 + 44.174719356 -137.803257404 + 44.150383690 -137.905586426 + 44.071547318 -137.941086021 + 44.016993872 -137.874479815 +} +85f06c93fffffff +{ + -78.858763342 20.094085175 + -78.765887386 19.987218672 + -78.736661869 19.532141089 + -78.799976144 19.178070119 + -78.893188571 19.278644637 + -78.922753950 19.739626479 +} +850c029bfffffff +{ + 64.433852213 -161.182227875 + 64.357686283 -161.296016113 + 64.281840121 -161.203583090 + 64.281928256 -160.998175183 + 64.357779304 -160.883919848 + 64.433856780 -160.975534226 +} +851481cbfffffff +{ + 48.666298694 128.988980070 + 48.601201481 129.063767303 + 48.604777356 129.194062060 + 48.673496544 129.250063351 + 48.738803974 129.175443275 + 48.735181859 129.044653490 +} +85f12203fffffff +{ + -83.549924273 137.527811020 + -83.604767360 136.918922221 + -83.688005919 137.076346228 + -83.715929349 137.860833792 + -83.659894836 138.472115508 + -83.577139773 138.296696022 +} +85331647fffffff +{ + 29.317036145 178.085931534 + 29.412229398 178.099029015 + 29.468716159 178.011309388 + 29.429898702 177.910515312 + 29.334647244 177.897613023 + 29.278271323 177.985309413 +} +85040677fffffff +{ + 74.311266338 141.813706513 + 74.221185906 141.950733342 + 74.207911562 142.305571282 + 74.284583534 142.527004654 + 74.375025588 142.392677108 + 74.388435134 142.034192100 +} +8535b343fffffff +{ + 39.992822814 -37.610949362 + 39.908614737 -37.670249995 + 39.827751114 -37.606611820 + 39.830996364 -37.483739747 + 39.915154403 -37.424243208 + 39.996117280 -37.487814104 +} +85ce61dbfffffff +{ + -43.484477151 -89.607932149 + -43.408034213 -89.534933603 + -43.321745632 -89.588493759 + -43.311752266 -89.714872087 + -43.388081212 -89.788066861 + -43.474517544 -89.734687937 +} +85c48877fffffff +{ + -44.891052604 -43.173255292 + -44.955163687 -43.244028737 + -45.037804340 -43.206079178 + -45.056366976 -43.097066415 + -44.992173489 -43.026201959 + -44.909499869 -43.064441070 +} +850046a3fffffff +{ + 83.173599152 -0.471432572 + 83.255708556 -0.283603285 + 83.318632440 -0.836808404 + 83.298327499 -1.577765032 + 83.215732980 -1.750375378 + 83.153919299 -1.197432105 +} +850324b3fffffff +{ + 88.313307928 29.890732386 + 88.375797244 32.153165136 + 88.466911488 31.387216486 + 88.493209622 28.059131297 + 88.426181666 25.801915775 + 88.337548913 26.851661185 +} +85cf5993fffffff +{ + -46.056624624 -87.930345937 + -45.978567667 -87.857016491 + -45.893536814 -87.915243359 + -45.886411374 -88.046624596 + -45.964362703 -88.120188409 + -46.049545149 -88.062137586 +} +85390837fffffff +{ + 39.364674959 -2.472905205 + 39.305692212 -2.558077702 + 39.215113223 -2.537037995 + 39.183564951 -2.431088935 + 39.242480241 -2.346056945 + 39.333011139 -2.366833475 +} +85c021bbfffffff +{ + -31.727315618 -8.639457563 + -31.819248856 -8.676299642 + -31.892435924 -8.600848678 + -31.873586101 -8.488536065 + -31.781597131 -8.451879250 + -31.708513616 -8.527349421 +} +856d9257fffffff +{ + 10.924402201 -106.214374543 + 11.000995098 -106.160237772 + 11.083607972 -106.202284256 + 11.089563596 -106.298546252 + 11.012886197 -106.352647238 + 10.930337709 -106.310522213 +} +85b8d487fffffff +{ + -23.085679569 128.921767341 + -22.999719043 128.923575820 + -22.961847071 128.846667111 + -23.009806939 128.767941903 + -23.095689441 128.765978924 + -23.133690173 128.842895510 +} +85d904cbfffffff +{ + -57.278913374 144.919127035 + -57.246325092 144.768780443 + -57.302052285 144.650741521 + -57.390593436 144.683069582 + -57.423248738 144.834075501 + -57.367295599 144.952092293 +} +85370243fffffff +{ + 40.014001326 -150.924318639 + 39.940442938 -150.960979073 + 39.881836724 -150.886245099 + 39.896785077 -150.774863271 + 39.970340810 -150.738132737 + 40.028950899 -150.812853915 +} +85545613fffffff +{ + 12.970488311 -11.456443435 + 12.906776144 -11.517775612 + 12.830351572 -11.492991723 + 12.817607963 -11.407015386 + 12.881206755 -11.345717905 + 12.957662403 -11.370361952 +} +853ef017fffffff +{ + 22.206488909 24.063110006 + 22.110202338 24.058331648 + 22.058380411 24.146379951 + 22.102763752 24.239267345 + 22.199037458 24.244200833 + 22.250940813 24.156091845 +} +85a742bbfffffff +{ + -26.458456246 108.011018548 + -26.531585059 108.047804152 + -26.536041059 108.124974557 + -26.467474410 108.165248981 + -26.394446613 108.128490022 + -26.389884520 108.051429907 +} +8530d253fffffff +{ + 32.246206609 124.818358711 + 32.174410635 124.835800035 + 32.157596207 124.927069629 + 32.212617061 125.000957583 + 32.284428818 124.983515178 + 32.301204005 124.892185826 +} +85f12403fffffff +{ + -83.862927329 154.714997387 + -83.935606382 154.261697820 + -84.010037988 154.667392174 + -84.010738836 155.538275768 + -83.936936698 155.981466375 + -83.863557846 155.564250953 +} +851b080bfffffff +{ + 55.800492313 -42.346862330 + 55.791141406 -42.504184141 + 55.707805675 -42.574749516 + 55.634037180 -42.488340931 + 55.643431568 -42.331730941 + 55.726551049 -42.260819903 +} +85516123fffffff +{ + 13.343763823 -138.730244297 + 13.255103854 -138.765641167 + 13.180368553 -138.706192150 + 13.194274952 -138.611417166 + 13.282871269 -138.576011331 + 13.357624842 -138.635389302 +} +85076d13fffffff +{ + 61.439322608 -14.502438223 + 61.386186587 -14.621176037 + 61.310949893 -14.566245128 + 61.288803394 -14.393096953 + 61.341829658 -14.274429988 + 61.417111941 -14.328839244 +} +85ae3243fffffff +{ + -27.010657611 91.241013875 + -27.097739815 91.274774810 + -27.113375502 91.372546093 + -27.041984718 91.436398968 + -26.954998066 91.402588466 + -26.939306660 91.304974418 +} +8582968bfffffff +{ + 2.931733271 17.727844122 + 3.019793822 17.736615998 + 3.066907460 17.663303507 + 3.026035518 17.581244463 + 2.938027827 17.572424382 + 2.890839159 17.645711486 +} +8514cc83fffffff +{ + 52.818421548 141.072652601 + 52.741355162 141.131338451 + 52.730645989 141.279200359 + 52.796947024 141.369007034 + 52.874194596 141.310769866 + 52.884960132 141.162275537 +} +856524c7fffffff +{ + 0.357834347 104.373582978 + 0.448578195 104.351760255 + 0.473272998 104.261443289 + 0.407168104 104.192968137 + 0.316413245 104.214849636 + 0.291774224 104.305147583 +} +8522368bfffffff +{ + 43.262525239 -162.738066516 + 43.345998964 -162.701732593 + 43.415027377 -162.776787733 + 43.400522022 -162.888337340 + 43.316931490 -162.924540927 + 43.247963132 -162.849325782 +} +8597433bfffffff +{ + -18.915102513 23.563321194 + -18.819297329 23.570794216 + -18.764505488 23.486798223 + -18.805490512 23.395329376 + -18.901266992 23.387789295 + -18.956087228 23.471785061 +} +850083c3fffffff +{ + 77.169085266 78.375367189 + 77.158481177 78.784629995 + 77.233260311 79.022271776 + 77.319174371 78.848746001 + 77.329818086 78.434247749 + 77.254507468 78.198554270 +} +85cfa68bfffffff +{ + -51.575916576 -68.052646441 + -51.493424973 -68.015387802 + -51.428427540 -68.099783868 + -51.445788312 -68.221542508 + -51.528292274 -68.259230309 + -51.593423319 -68.174730763 +} +85e46c6bfffffff +{ + -67.064183464 85.175866193 + -66.973098435 85.099438093 + -66.952241598 84.862235726 + -67.022314566 84.700063081 + -67.113540431 84.775133116 + -67.134553226 85.013739352 +} +857175dbfffffff +{ + 13.036656880 -167.204471096 + 12.946177369 -167.228451595 + 12.879588204 -167.162993563 + 12.903446212 -167.073484084 + 12.993971900 -167.049412539 + 13.060593443 -167.114941471 +} +85046313fffffff +{ + 77.625699354 179.283491133 + 77.532095903 179.177011306 + 77.465104599 179.494095664 + 77.491096102 179.917658188 + 77.584366211 -179.970815956 + 77.651981039 179.712138348 +} +85ef6ab7fffffff +{ + -73.795262233 -74.382607408 + -73.776536461 -74.049909112 + -73.685917119 -73.938831484 + -73.614362417 -74.157860293 + -73.632956973 -74.487339543 + -73.723236346 -74.600988809 +} +85f1646bfffffff +{ + -88.400841693 5.568844155 + -88.307601984 5.658340130 + -88.259342764 3.038681174 + -88.300324556 0.201538185 + -88.392915698 -0.201746390 + -88.445391761 2.542241675 +} +85032a23fffffff +{ + 86.193152197 -75.114481274 + 86.235427678 -76.301267850 + 86.186616627 -77.493115163 + 86.097216225 -77.471739480 + 86.056644643 -76.313892501 + 86.103808464 -75.148539206 +} +8538e563fffffff +{ + 31.092306039 4.344702409 + 30.999649069 4.357343869 + 30.963634776 4.453595468 + 31.020281605 4.537384074 + 31.113026179 4.524887593 + 31.149036373 4.428457300 +} +851d5acffffffff +{ + 48.252825195 -139.333983271 + 48.328610842 -139.298634433 + 48.377316818 -139.368522746 + 48.350219062 -139.473625852 + 48.274483696 -139.508729134 + 48.225795756 -139.438974901 +} +85725e43fffffff +{ + 2.414355142 145.633086533 + 2.319085746 145.647581136 + 2.284535972 145.736764350 + 2.345216587 145.811443976 + 2.440454990 145.796981824 + 2.475043828 145.707807545 +} +85d00e2ffffffff +{ + -47.040972094 15.269224836 + -47.129573462 15.259700386 + -47.175129286 15.361097383 + -47.132049334 15.471780127 + -47.043519649 15.480988432 + -46.997998102 15.379829935 +} +85f35c8bfffffff +{ + -73.368121390 -140.478002021 + -73.433153285 -140.315750977 + -73.420880907 -140.016608305 + -73.343581545 -139.882481286 + -73.278945075 -140.045805231 + -73.291212718 -140.342199893 +} +85be247bfffffff +{ + -37.628319768 156.946158674 + -37.534736723 156.913758302 + -37.510259795 156.795254376 + -37.579329187 156.708920256 + -37.672969320 156.741106328 + -37.697483089 156.859841236 +} +8501a5c3fffffff +{ + 70.772707243 42.900353279 + 70.807953631 43.117842309 + 70.888724317 43.110095617 + 70.934181956 42.882802721 + 70.898562398 42.664381040 + 70.817859828 42.674184040 +} +8500ca43fffffff +{ + 86.172438853 112.934568746 + 86.113551093 114.010963536 + 86.145916476 115.336105994 + 86.238400297 115.630246154 + 86.299251231 114.543013196 + 86.265618061 113.171624645 +} +85698ec7fffffff +{ + 5.468715860 111.426296891 + 5.559691832 111.407171336 + 5.586493035 111.320482380 + 5.522242543 111.252918029 + 5.431219368 111.272112790 + 5.404493845 111.358802729 +} +85df740ffffffff +{ + -58.417218621 -67.478142806 + -58.387549646 -67.313382914 + -58.302330251 -67.275814021 + -58.246924615 -67.402218503 + -58.276458630 -67.566235358 + -58.361532747 -67.604588777 +} +85482c6ffffffff +{ + 23.356294489 -111.427784906 + 23.438762997 -111.371667875 + 23.524721202 -111.421423241 + 23.528146806 -111.527361360 + 23.445624329 -111.583402102 + 23.359730218 -111.533581289 +} +85deee2ffffffff +{ + -48.758985656 -50.789828550 + -48.713765257 -50.680472109 + -48.636670028 -50.688777365 + -48.604777356 -50.805937940 + -48.649798232 -50.915089161 + -48.726910866 -50.907285233 +} +85cd189bfffffff +{ + -45.997273602 89.390161249 + -45.914735203 89.339966497 + -45.904985241 89.207893637 + -45.977692722 89.125567785 + -46.060352571 89.175399147 + -46.070183698 89.307920809 +} +85e10eb3fffffff +{ + -65.282628387 64.334978008 + -65.189890236 64.338016550 + -65.142646710 64.157761034 + -65.187875700 63.974016289 + -65.280524821 63.969696713 + -65.328034764 64.150401566 +} +85f202a7fffffff +{ + -79.834339345 -140.898564346 + -79.905966437 -140.628272688 + -79.895867625 -140.123997185 + -79.814159455 -139.897855287 + -79.743169686 -140.171229829 + -79.753251399 -140.667742253 +} +85950627fffffff +{ + -5.651080179 119.028930949 + -5.739654493 119.045189197 + -5.773942149 119.126692728 + -5.719620224 119.192000877 + -5.630962257 119.175732785 + -5.596709874 119.094166338 +} +85a431cbfffffff +{ + -18.623205261 -29.299939520 + -18.543255634 -29.252342124 + -18.468007512 -29.299707792 + -18.472702813 -29.394712311 + -18.552696163 -29.442373867 + -18.627950470 -29.394966858 +} +85f1769bfffffff +{ + -86.868173590 96.474874024 + -86.864690930 94.806022952 + -86.940545812 93.940612878 + -87.021933723 94.784076407 + -87.025332737 96.542109925 + -86.947427471 97.364414248 +} +8550f683fffffff +{ + 24.880981192 -127.961400724 + 24.964931083 -127.920474727 + 25.040999397 -127.976525645 + 25.033035227 -128.073468247 + 24.949092134 -128.114245855 + 24.873106351 -128.058229405 +} +850e1217fffffff +{ + 60.987974389 -85.547946129 + 60.923240234 -85.696969979 + 60.828088267 -85.656292602 + 60.797550731 -85.467537030 + 60.862029994 -85.318594514 + 60.957301110 -85.358323784 +} +850ecb8bfffffff +{ + 49.335001984 -81.907001054 + 49.277210689 -82.021490951 + 49.184495619 -81.999681898 + 49.149499660 -81.863916738 + 49.207081485 -81.749541420 + 49.299868354 -81.770815971 +} +85a493cbfffffff +{ + -25.800959070 -38.637106154 + -25.727369979 -38.585583977 + -25.654424425 -38.634570246 + -25.655083112 -38.735081195 + -25.728698732 -38.786630441 + -25.801629128 -38.737641825 +} +8508da07fffffff +{ + 65.215724275 30.442015244 + 65.179408073 30.597070202 + 65.226530750 30.755273308 + 65.310134546 30.758644416 + 65.346528679 30.602901744 + 65.299240670 30.444477018 +} +85f12457fffffff +{ + -83.639587251 153.554921243 + -83.711067184 153.104654435 + -83.786109527 153.480668409 + -83.788685287 154.318660868 + -83.716101192 154.760295114 + -83.642047346 154.372897013 +} +85e41b77fffffff +{ + -57.372596530 96.372338354 + -57.287242315 96.287466853 + -57.284288842 96.108110327 + -57.366657543 96.012778429 + -57.452200548 96.097151524 + -57.455186162 96.277357805 +} +851a430ffffffff +{ + 45.694731813 -34.356386220 + 45.613431355 -34.425197574 + 45.533178049 -34.359276638 + 45.534136047 -34.224660930 + 45.615375855 -34.155650717 + 45.695718338 -34.221454338 +} +857c256bfffffff +{ + -3.684033370 -22.917805896 + -3.604214150 -22.874810347 + -3.524524489 -22.919031487 + -3.524602041 -23.006307418 + -3.604452910 -23.049381217 + -3.684194591 -23.005100902 +} +850d4657fffffff +{ + 67.833425804 -143.754488052 + 67.774167404 -143.934796268 + 67.690012124 -143.898793386 + 67.665054270 -143.684070589 + 67.723975353 -143.504155221 + 67.808190459 -143.538566566 +} +85eeeacffffffff +{ + -66.786851735 -35.059868840 + -66.714960768 -34.898966853 + -66.624642032 -34.977716833 + -66.605991782 -35.215995464 + -66.677519327 -35.377118270 + -66.768059810 -35.299748573 +} +85ca838ffffffff +{ + -46.865413157 51.480196708 + -46.946393972 51.486084416 + -46.991854489 51.592911352 + -46.956282529 51.693839036 + -46.875251946 51.687739106 + -46.829842982 51.580923875 +} +85ef060ffffffff +{ + -83.655140353 -40.012905861 + -83.588902515 -39.392051034 + -83.496562390 -39.605947987 + -83.469899299 -40.421758549 + -83.534937254 -41.041540172 + -83.627826516 -40.846823845 +} +85f0a9cbfffffff +{ + -74.480467182 74.508325467 + -74.389569594 74.457312295 + -74.352300502 74.144992135 + -74.405621216 73.881637675 + -74.496577767 73.929518069 + -74.534156609 74.243891292 +} +85a926a3fffffff +{ + -33.808611929 -50.551247257 + -33.749353410 -50.498512161 + -33.681691406 -50.545858715 + -33.673316488 -50.645889171 + -33.732588334 -50.698594517 + -33.800221768 -50.651299300 +} +85eec897fffffff +{ + -64.738979499 -35.471014719 + -64.668330429 -35.322053189 + -64.578859338 -35.392903231 + -64.559833656 -35.611543017 + -64.630142642 -35.760670401 + -64.719816748 -35.690997452 +} +85614323fffffff +{ + 4.044222030 72.465191885 + 4.128971697 72.438374022 + 4.149610541 72.358059559 + 4.085570814 72.304633064 + 4.000917786 72.331430097 + 3.980207892 72.411674519 +} +85922857fffffff +{ + -10.601098031 -102.553627731 + -10.671922049 -102.610917568 + -10.758810430 -102.580306753 + -10.774923797 -102.492320038 + -10.704065014 -102.434960712 + -10.617127650 -102.465657537 +} +8513222bfffffff +{ + 68.361534015 -124.408980960 + 68.272880952 -124.458049413 + 68.211313677 -124.289386855 + 68.238133470 -124.071296376 + 68.326751186 -124.020695400 + 68.388585366 -124.189714221 +} +85eacadbfffffff +{ + -71.179896040 179.592807498 + -71.198577945 179.376708366 + -71.277589599 179.330898996 + -71.337945645 179.502878820 + -71.319012331 179.720332988 + -71.239975341 179.764448102 +} +85d44ebbfffffff +{ + -44.000516905 -173.642672592 + -43.925156068 -173.585706817 + -43.847449779 -173.651163479 + -43.845085302 -173.773394261 + -43.920375464 -173.830404124 + -43.998100759 -173.765139586 +} +855616a7fffffff +{ + 15.139233872 -38.030372475 + 15.212149616 -37.981954625 + 15.288334097 -38.028123557 + 15.291649584 -38.122715024 + 15.218768490 -38.171159407 + 15.142537253 -38.124985920 +} +855066affffffff +{ + 20.178811573 -137.831830531 + 20.092646998 -137.868380921 + 20.017367144 -137.807860141 + 20.028251284 -137.710868040 + 20.114363372 -137.674311738 + 20.189643824 -137.734753297 +} +851e9cbbfffffff +{ + 40.457413222 13.180336455 + 40.365371345 13.185791513 + 40.325351613 13.294346338 + 40.377348676 13.397620794 + 40.469432039 13.392378632 + 40.509476987 13.283648950 +} +85994327fffffff +{ + -10.577284551 -1.136311609 + -10.653460678 -1.158447682 + -10.713093813 -1.095210795 + -10.696439991 -1.009867491 + -10.620228760 -0.987864974 + -10.560706329 -1.051072093 +} +85f389c7fffffff +{ + -81.600284328 -163.447604434 + -81.684591450 -163.347548257 + -81.709215000 -162.769677428 + -81.648921054 -162.300866736 + -81.564876678 -162.411464982 + -81.540856586 -162.980407714 +} +859f1953fffffff +{ + -19.282922460 170.624171965 + -19.200317138 170.587224556 + -19.184057881 170.494190214 + -19.250425139 170.437937099 + -19.333145565 170.474812365 + -19.349383601 170.568013150 +} +8500e8b7fffffff +{ + 86.888947316 30.929842470 + 86.949971252 32.152097366 + 87.040613645 31.756589405 + 87.069047788 30.055574757 + 87.005618255 28.829914390 + 86.916206349 29.306529294 +} +853d6bcffffffff +{ + 37.586270008 90.823223777 + 37.497542234 90.848913650 + 37.474179375 90.958320289 + 37.539416345 91.042250669 + 37.628155394 91.016860121 + 37.651646413 90.907239617 +} +85261da3fffffff +{ + 41.256991463 -97.225767795 + 41.323868965 -97.151588039 + 41.407371896 -97.196932844 + 41.423997807 -97.316641746 + 41.357074676 -97.390843372 + 41.273571329 -97.345314543 +} +8500eb53fffffff +{ + 87.415125450 59.765906092 + 87.436597997 61.734518710 + 87.526106659 62.369604098 + 87.595675398 60.924446899 + 87.572799384 58.835459583 + 87.481821754 58.316330953 +} +850ad163fffffff +{ + 62.455440663 110.264973479 + 62.398670245 110.423976943 + 62.430402959 110.606921691 + 62.519153983 110.631655449 + 62.576215787 110.472286547 + 62.544234300 110.288547857 +} +856aa5dbfffffff +{ + 5.023565130 21.618673074 + 5.110625206 21.626108715 + 5.157100125 21.550990473 + 5.116586073 21.468445196 + 5.029562246 21.460956756 + 4.983016146 21.536066341 +} +85e805cbfffffff +{ + -64.392500486 -92.481914710 + -64.319816853 -92.356646557 + -64.241284914 -92.436843619 + -64.235280899 -92.641754307 + -64.307802149 -92.767444342 + -64.386489701 -92.687805394 +} +85446adbfffffff +{ + 30.588333030 -93.221658962 + 30.659263876 -93.153691881 + 30.748002791 -93.190697617 + 30.765826252 -93.295833786 + 30.694836121 -93.363846617 + 30.606081879 -93.326677710 +} +85082c8ffffffff +{ + 67.176584681 9.679406853 + 67.233744633 9.762690831 + 67.292371127 9.644173482 + 67.293535736 9.441937158 + 67.236150931 9.359445942 + 67.177826043 9.478393389 +} +85f0564ffffffff +{ + -76.454867568 54.123911064 + -76.390841524 53.845032072 + -76.412359860 53.485847057 + -76.498266919 53.401892756 + -76.562837935 53.681171356 + -76.540954303 54.044025775 +} +85168067fffffff +{ + 48.012170618 158.390171358 + 48.103168449 158.379448122 + 48.139636612 158.254151415 + 48.085064039 158.139850414 + 47.994116696 158.150897054 + 47.957691248 158.275921658 +} +85f292b7fffffff { - -26.806232627 -99.216553650 - -26.744879401 -99.148386645 - -26.662123264 -99.179446306 - -26.640619396 -99.278502738 - -26.701832138 -99.346715590 - -26.784689149 -99.315826525 + -89.243354141 100.473221860 + -89.242766107 93.501382200 + -89.317896035 89.436202065 + -89.402640874 93.040941904 + -89.402414347 101.881335150 + -89.318350727 104.956722686 } -85bf9aaffffffff -{ - -28.516605640 161.828724864 - -28.425228633 161.794894084 - -28.404307403 161.688384967 - -28.474747675 161.615506382 - -28.566210744 161.649190335 - -28.587147538 161.755900048 -} -8588dba7fffffff -{ - 3.954504928 -155.971322077 - 3.864833282 -156.000372744 - 3.794070870 -155.935960983 - 3.812923970 -155.842481921 - 3.902582041 -155.813366125 - 3.973400649 -155.877794407 -} -85f1024ffffffff -{ - -82.216495486 114.052236974 - -82.157462840 113.597077843 - -82.179218793 112.952963856 - -82.260375456 112.753806939 - -82.320615122 113.247261241 - -82.298251928 113.882629826 - -82.270911701 113.926625335 -} -853b0363fffffff -{ - 36.232467186 -51.365009300 - 36.147349506 -51.401824633 - 36.076760814 -51.334744945 - 36.091189422 -51.230791212 - 36.176318490 -51.193745008 - 36.247007673 -51.260883197 -} -8501a6bbfffffff -{ - 70.174285351 46.396843437 - 70.205024637 46.615990434 - 70.285562669 46.624238527 - 70.335343030 46.411398495 - 70.304258842 46.191164027 - 70.223740602 46.184858095 -} -855c0b67fffffff -{ - 9.721916451 -148.218239028 - 9.630377738 -148.251027073 - 9.556887177 -148.187043651 - 9.574895862 -148.090296013 - 9.666397531 -148.057464299 - 9.739927596 -148.121423745 -} -85144267fffffff -{ - 57.627127354 139.866568859 - 57.546009815 139.938007959 - 57.536398987 140.110267520 - 57.607854548 140.211948250 - 57.689185277 140.141089191 - 57.698847453 139.967966463 -} -8503321bfffffff -{ - 86.499655343 -173.928435579 - 86.412155111 -174.457136589 - 86.337922561 -173.515929869 - 86.349189705 -172.061970639 - 86.435229590 -171.485402430 - 86.511480965 -172.408760586 -} -8532e5cffffffff -{ - 37.762750502 164.683294268 - 37.859723088 164.681583757 - 37.906684429 164.574385536 - 37.856602068 164.469055972 - 37.759651306 164.471025737 - 37.712760905 164.578065890 -} -85a0d1a7fffffff -{ - -10.667579084 -137.985401270 - -10.586874089 -137.969820437 - -10.526445952 -138.035322690 - -10.546633997 -138.116481465 - -10.627353551 -138.132190820 - -10.687870616 -138.066612891 -} -8506c80bfffffff -{ - 62.859567821 -49.535977835 - 62.842959296 -49.735361753 - 62.753660289 -49.804175895 - 62.681180304 -49.674391361 - 62.697761102 -49.476114706 - 62.786849386 -49.406519480 -} -8511580bfffffff -{ - 65.636682835 45.781486388 - 65.583115718 45.929952968 - 65.614057703 46.127783283 - 65.698707333 46.177865162 - 65.752441584 46.029095034 - 65.721358534 45.830545104 -} -85f29e1bfffffff -{ - -89.016395412 -64.135494633 - -88.982634800 -59.185119178 - -88.890882735 -58.792104079 - -88.834541322 -62.615048985 - -88.863554308 -67.004857161 - -88.953194482 -68.096918882 -} -8580166bfffffff -{ - -4.180953074 -37.577622828 - -4.097475753 -37.527964981 - -4.012672400 -37.575419413 - -4.011324392 -37.672538571 - -4.094801219 -37.722226386 - -4.179626549 -37.674765215 -} -852b7357fffffff -{ - 41.635788821 -61.515084755 - 41.601686433 -61.627832130 - 41.516601322 -61.647123879 - 41.465703209 -61.554027188 - 41.499699448 -61.441589427 - 41.584699694 -61.421939239 -} -853ec44bfffffff -{ - 21.537611837 26.013401887 - 21.441733371 26.006994137 - 21.389110325 26.093437855 - 21.432279348 26.186336711 - 21.528133925 26.192895662 - 21.580843489 26.106404629 -} -85ca32c7fffffff -{ - -39.908581164 50.745264328 - -39.995576228 50.750023753 - -40.041888161 50.847921336 - -40.001142143 50.941054823 - -39.914080323 50.936115469 - -39.867831199 50.838222694 -} -8541ac2bfffffff -{ - 25.033698104 115.778916594 - 25.119626109 115.760727618 - 25.154244394 115.672793122 - 25.102888770 115.603033313 - 25.016891412 115.621303069 - 24.982319014 115.709251865 -} -859424d3fffffff -{ - -7.694210874 122.153569159 - -7.783111968 122.169928816 - -7.817891528 122.253865934 - -7.763747358 122.321501289 - -7.674773271 122.305136435 - -7.640016334 122.221141366 -} -85d96aa3fffffff -{ - -57.726459101 125.212138177 - -57.668707171 125.071173949 - -57.705104232 124.910115339 - -57.799457436 124.889505594 - -57.857417890 125.030792333 - -57.820816031 125.192366889 -} -85936037fffffff -{ - -5.523710006 -96.189480952 - -5.598524410 -96.247873430 - -5.686208165 -96.214085753 - -5.699095513 -96.121832994 - -5.624234540 -96.063396419 - -5.536532830 -96.097256606 -} -850504d3fffffff -{ - 78.335416981 103.737527640 - 78.286604595 104.139711403 - 78.333236734 104.547832198 - 78.429263577 104.557034839 - 78.478631756 104.151475383 - 78.431412589 103.740089881 -} -85eec4cffffffff -{ - -68.250788106 -30.293101871 - -68.173752124 -30.137788961 - -68.085533777 -30.241130826 - -68.074067039 -30.498443113 - -68.150734131 -30.654326900 - -68.239236358 -30.552337099 -} -851bb4b3fffffff -{ - 55.438553075 -60.591181313 - 55.404701525 -60.748571777 - 55.310481346 -60.777581836 - 55.250226899 -60.649885276 - 55.283962485 -60.493106862 - 55.378068066 -60.463414381 -} -85af18c3fffffff -{ - -22.947545071 89.633557883 - -23.036161644 89.665532287 - -23.054844898 89.761295297 - -22.984956341 89.824935808 - -22.896437645 89.792907112 - -22.877709642 89.697291977 -} -8586700bfffffff -{ - -9.285795447 79.845088658 - -9.373456856 79.869169406 - -9.399911081 79.959637334 - -9.338684112 80.025912001 - -9.251092499 80.001749984 - -9.224658009 79.911394411 -} -85e5663bfffffff -{ - -69.877984074 112.958379382 - -69.809139529 112.770740523 - -69.830705340 112.500150036 - -69.921275292 112.415390161 - -69.990453831 112.602942655 - -69.968727510 112.875349540 -} -85a2b217fffffff -{ - -27.161239759 42.356310609 - -27.071475646 42.356061411 - -27.030909117 42.268395162 - -27.080131581 42.180881174 - -27.169946929 42.181056135 - -27.210488641 42.268819373 -} -85e89a4bfffffff -{ - -66.762518772 -62.376904509 - -66.724995622 -62.155221619 - -66.631642742 -62.123884758 - -66.575938238 -62.312611217 - -66.613230525 -62.533054994 - -66.706457063 -62.566007936 -} -85f29aabfffffff -{ - -87.785952071 -52.378328324 - -87.736676948 -50.344027239 - -87.643929167 -50.503445751 - -87.600141034 -52.535365500 - -87.646455243 -54.495029686 - -87.739403504 -54.497941911 -} -8550c18ffffffff -{ - 27.930970472 -132.372792992 - 28.014647874 -132.335964711 - 28.086101324 -132.393476028 - 28.073805157 -132.487756315 - 27.990157055 -132.524422554 - 27.918775765 -132.466970656 -} -850786b3fffffff -{ - 77.921150361 -23.823535311 - 77.947811809 -24.201200532 - 77.887780912 -24.475377449 - 77.801529044 -24.371310308 - 77.775163593 -23.997423194 - 77.834756362 -23.723846120 -} -851cb62bfffffff -{ - 49.089893955 -154.169148941 - 49.162935450 -154.122299275 - 49.234292580 -154.187039437 - 49.232588761 -154.298876555 - 49.159439692 -154.345663247 - 49.088102068 -154.280676352 -} -85cc0427fffffff -{ - -44.176328693 83.010267479 - -44.094063888 82.974729656 - -44.078085281 82.852743523 - -44.144251453 82.765933580 - -44.226592359 82.801090620 - -44.242691279 82.923439073 -} -8504084bfffffff -{ - 74.153854675 155.560933175 - 74.057786592 155.617551239 - 74.022976330 155.947650035 - 74.083885369 156.223822807 - 74.180095311 156.170736274 - 74.215256794 155.837934198 -} -8573749bfffffff -{ - 14.048515891 136.635972171 - 13.955055278 136.652181213 - 13.922041007 136.744880599 - 13.982498694 136.821392734 - 14.075961327 136.805203794 - 14.108964320 136.712482544 -} -85eb99cbfffffff -{ - -60.115584798 -174.972439509 - -60.057869214 -175.052412090 - -60.073652074 -175.201725557 - -60.147217988 -175.271509121 - -60.205018148 -175.191513555 - -60.189167690 -175.041756480 -} -8540e3a3fffffff -{ - 30.322114081 103.568251507 - 30.405637762 103.543867845 - 30.433502865 103.443909863 - 30.377830246 103.368361570 - 30.294280642 103.392814897 - 30.266429518 103.492746951 -} -859f999bfffffff -{ - -12.801772436 171.559440194 - -12.725039072 171.524560784 - -12.708042588 171.438589675 - -12.767793635 171.387355212 - -12.844635633 171.422176970 - -12.861617923 171.508291050 -} -85e8866bfffffff -{ - -68.705898336 -71.388671527 - -68.681737252 -71.137318828 - -68.591015911 -71.064717726 - -68.524698610 -71.241836736 - -68.548721866 -71.491390199 - -68.639199420 -71.565615755 -} -8523b42ffffffff -{ - 40.682279854 -155.848971388 - 40.608301656 -155.883417508 - 40.553769484 -155.807203420 - 40.573211125 -155.696520824 - 40.647195935 -155.661983966 - 40.701732553 -155.738220254 -} -85ef35b7fffffff -{ - -85.810548444 -57.851304052 - -85.768898579 -56.699478265 - -85.674804259 -56.650673303 - -85.622555394 -57.706092658 - -85.662791889 -58.828487595 - -85.756657414 -58.924643022 -} -8504a663fffffff -{ - 68.412189818 134.180143789 - 68.328629555 134.310295297 - 68.327411034 134.571683676 - 68.409760980 134.704924959 - 68.493662573 134.575781921 - 68.494872871 134.312378642 -} -8500752ffffffff -{ - 81.671357060 3.475763166 - 81.750248226 3.668566726 - 81.816641367 3.251855150 - 81.803231187 2.640758526 - 81.723838665 2.457119288 - 81.658352815 2.875293693 -} -85dc102bfffffff -{ - -53.978767875 -12.063469054 - -54.059739506 -12.118907467 - -54.127248022 -12.019708222 - -54.113691028 -11.864976065 - -54.032653160 -11.809847732 - -53.965238405 -11.909140444 -} -8506d197fffffff -{ - 66.687155895 -51.896370666 - 66.668504210 -52.125899074 - 66.578517763 -52.197220241 - 66.507394287 -52.040146188 - 66.525981840 -51.812058486 - 66.615756564 -51.739610186 -} -854cd21bfffffff -{ - 17.886753048 -71.369620574 - 17.830241036 -71.418434431 - 17.759559929 -71.381158906 - 17.745453464 -71.295081733 - 17.802011982 -71.246327698 - 17.872630469 -71.283590917 -} -8514f547fffffff -{ - 52.035098720 133.681871830 - 51.963207752 133.755090736 - 51.961667787 133.900019131 - 52.032029179 133.972344168 - 52.104135268 133.899422747 - 52.105664811 133.753877025 -} -85aca54ffffffff -{ - -22.794473131 15.735351751 - -22.702756967 15.745811179 - -22.645549888 15.665737479 - -22.680033031 15.575245716 - -22.771691798 15.564730399 - -22.828924871 15.644762641 -} -8564b66bfffffff -{ - 18.310796772 102.762351514 - 18.403256630 102.738639362 - 18.431388029 102.642349282 - 18.367031842 102.569797880 - 18.274547866 102.593572549 - 18.246444139 102.689836196 -} -85840523fffffff -{ - -4.041708101 64.650486266 - -4.125112420 64.663936797 - -4.152817771 64.748071605 - -4.097041171 64.818696975 - -4.013643972 64.805140094 - -3.986016140 64.721064145 -} -8550d317fffffff -{ - 29.665201994 -128.432424234 - 29.749734894 -128.390333582 - 29.823709757 -128.448764491 - 29.813080513 -128.549246055 - 29.728564313 -128.591174674 - 29.654660606 -128.532783931 -} -853085bbfffffff -{ - 34.748682494 120.264075706 - 34.824370185 120.247640144 - 34.861872633 120.161918702 - 34.823663144 120.092604638 - 34.747914942 120.109126452 - 34.710436714 120.194876061 -} -8500330ffffffff -{ - 77.434453853 44.254988009 - 77.473371970 44.603755825 - 77.561010757 44.602405817 - 77.609668911 44.247128458 - 77.570203413 43.895808331 - 77.482630730 43.902317494 -} -851f768bfffffff -{ - 55.828446231 17.881186264 - 55.752049938 17.881999448 - 55.716816647 18.014565045 - 55.757923191 18.146528905 - 55.834330002 18.146050640 - 55.869619948 18.013273479 -} -850469c3fffffff -{ - 76.528400241 -167.642302706 - 76.442829508 -167.823589394 - 76.363497410 -167.605481245 - 76.369240872 -167.208199065 - 76.454320372 -167.024219593 - 76.534147877 -167.240176082 -} -8555818bfffffff -{ - 21.163306031 -18.659372554 - 21.091219791 -18.723459770 - 21.006125998 -18.688420686 - 20.993063402 -18.589443190 - 21.065034107 -18.525349177 - 21.150182842 -18.560239214 -} -85baca7bfffffff -{ - -23.017586886 179.066974102 - -22.939094540 179.114800719 - -22.862468522 179.071139399 - -22.864313375 178.979796231 - -22.942694848 178.931982261 - -23.019342254 178.975498642 -} -85c9967bfffffff -{ - -32.067841337 117.650152482 - -32.013609896 117.578200694 - -32.029813505 117.483624774 - -32.100348174 117.460792963 - -32.154738109 117.532778382 - -32.138434668 117.627562259 -} -8570ad63fffffff -{ - 1.231397287 -172.298588195 - 1.148986329 -172.318286354 - 1.084067349 -172.258240827 - 1.101501860 -172.178418334 - 1.183951898 -172.158636415 - 1.248928407 -172.218760740 -} -85b9044ffffffff -{ - -37.235533288 135.666447283 - -37.141633318 135.660371452 - -37.098504183 135.558990125 - -37.149163008 135.463614968 - -37.243002225 135.469445335 - -37.286243498 135.570896214 -} -85a8b24ffffffff -{ - -22.130650975 -38.725237310 - -22.053879280 -38.673997813 - -21.977360307 -38.722694734 - -21.977625750 -38.822633229 - -22.054422870 -38.873899077 - -22.130929114 -38.825200233 -} -85e0030ffffffff -{ - -57.955148785 59.875901613 - -57.865772799 59.890300932 - -57.818488088 59.759465370 - -57.860345929 59.614075994 - -57.949604116 59.598946367 - -57.997122664 59.729935279 -} -85d4f17bfffffff -{ - -42.525146160 -161.175512611 - -42.440760569 -161.128484762 - -42.368139267 -161.207575511 - -42.379850651 -161.333612938 - -42.464185005 -161.380790562 - -42.536859270 -161.301781482 -} -85de1b7bfffffff -{ - -52.303711241 -47.971586565 - -52.253223043 -47.853892553 - -52.171645258 -47.870070774 - -52.140512331 -48.003333274 - -52.190771530 -48.120830618 - -52.272392147 -48.105262670 -} -85122d1bfffffff -{ - 60.740709333 -112.801549318 - 60.656592081 -112.874623666 - 60.580594380 -112.767009776 - 60.588466653 -112.586485643 - 60.672459421 -112.512678341 - 60.748704763 -112.620125160 -} -85f38ed3fffffff -{ - -81.660333010 -179.935314561 - -81.744522873 179.988218078 - -81.791386033 -179.513833074 - -81.753175825 -178.943034927 - -81.668752426 -178.877753229 - -81.622765135 -179.372042869 -} -85b6224bfffffff -{ - -30.625703566 -93.675859352 - -30.559110272 -93.610955208 - -30.475566599 -93.650147652 - -30.458488719 -93.754093429 - -30.524950296 -93.819096094 - -30.608621453 -93.780054921 -} -850a1243fffffff -{ - 60.566697453 93.744729033 - 60.477516257 93.778213526 - 60.442899108 93.947818809 - 60.497319665 94.084418011 - 60.586499058 94.051705563 - 60.621260129 93.881621246 -} -851311c3fffffff +855894dbfffffff +{ + 7.113061475 0.518997939 + 7.034567372 0.531440470 + 6.996224833 0.606167492 + 7.036347743 0.668568808 + 7.114919874 0.656206385 + 7.153291103 0.581362413 +} +8524496bfffffff +{ + 43.955893516 115.529335533 + 43.873482109 115.515704977 + 43.829611298 115.596103289 + 43.868003896 115.690110796 + 43.950290042 115.703997816 + 43.994308889 115.623621338 +} +8599864bfffffff +{ + -11.386899921 -16.391921228 + -11.463203316 -16.427644658 + -11.527059537 -16.373312564 + -11.514508247 -16.283201020 + -11.438114500 -16.247564121 + -11.374362368 -16.301952016 +} +85c4a08bfffffff +{ + -39.450758125 -43.153589515 + -39.517849490 -43.218819261 + -39.600027322 -43.183805263 + -39.615142201 -43.083315390 + -39.547957555 -43.018008450 + -39.465751410 -43.053268414 +} +85059d83fffffff +{ + 70.100569567 126.512617677 + 70.023494145 126.683460256 + 70.034436824 126.963393232 + 70.122577345 127.074745901 + 70.200058345 126.904502854 + 70.188992536 126.622295378 +} +85b8e68ffffffff +{ + -26.656065380 127.795562850 + -26.568404453 127.798606140 + -26.527406733 127.720016587 + -26.573942401 127.638382117 + -26.661514684 127.635175384 + -26.702640002 127.713766390 +} +858bb627fffffff +{ + -14.762462165 -53.917801437 + -14.685887696 -53.867362261 + -14.602597998 -53.911899047 + -14.595923590 -54.006815064 + -14.672488405 -54.057212509 + -14.755737290 -54.012735781 +} +85cf6817fffffff +{ + -49.290241717 -92.757839653 + -49.213914438 -92.670408156 + -49.125908634 -92.725621239 + -49.114091446 -92.867994688 + -49.190292779 -92.955625565 + -49.278437208 -92.900684811 +} +85f31567fffffff +{ + -76.237130348 -171.999267177 + -76.315929749 -171.994233419 + -76.348627180 -171.677206382 + -76.302048324 -171.367424147 + -76.223243812 -171.376373198 + -76.191020448 -171.691192331 +} +857f4193fffffff +{ + -3.235376269 168.294934851 + -3.316469146 168.303309229 + -3.343329822 168.369449159 + -3.289191670 168.427159836 + -3.208189224 168.418822614 + -3.181234522 168.352737578 +} +85e529affffffff +{ + -67.442906286 116.939852900 + -67.377500887 116.760736158 + -67.404907756 116.521751597 + -67.497905983 116.460539351 + -67.563611521 116.639819977 + -67.536017785 116.880153691 +} +85c0186bfffffff +{ + -38.270805600 -11.714187820 + -38.361673577 -11.757682061 + -38.436651616 -11.678809473 + -38.420668975 -11.556386999 + -38.329735972 -11.513089507 + -38.254850552 -11.592017231 +} +8505b187fffffff +{ + 70.475342123 114.457161766 + 70.411668873 114.671549876 + 70.440948591 114.940479320 + 70.534183878 114.996880674 + 70.598266778 114.782097910 + 70.568703194 114.511301373 +} +85ccc2abfffffff +{ + -37.292360108 75.359193655 + -37.382233204 75.386035960 + -37.408017919 75.500051128 + -37.343916637 75.587062861 + -37.254076041 75.560070525 + -37.228304130 75.446216215 +} +8503a843fffffff +{ + 82.007152956 -140.022789772 + 81.951659077 -140.556328384 + 81.858306914 -140.494496598 + 81.820351443 -139.912002623 + 81.875020760 -139.383192308 + 81.968461255 -139.432108229 +} +85e4c247fffffff +{ + -54.599035512 90.025127291 + -54.511217355 89.961637706 + -54.499991730 89.798299504 + -54.576496961 89.697763517 + -54.664453920 89.760709070 + -54.675767112 89.924736669 +} +8537a39bfffffff +{ + 38.238721888 -155.946533428 + 38.161666345 -155.980445311 + 38.104638717 -155.905288257 + 38.124664121 -155.796196888 + 38.201729102 -155.762196444 + 38.258759300 -155.837375752 +} +852dadb7fffffff +{ + 38.627921390 37.229730931 + 38.537094071 37.211524415 + 38.476297290 37.302542396 + 38.506262727 37.411730910 + 38.597021123 37.430107806 + 38.657883094 37.339126114 +} +850711affffffff +{ + 72.704220581 -13.979462483 + 72.739846877 -14.218276192 + 72.688342875 -14.435156978 + 72.601471045 -14.412193947 + 72.566149995 -14.174620922 + 72.617396837 -13.958771160 +} +853529bbfffffff +{ + 42.195618643 -18.954979794 + 42.122786173 -19.036949295 + 42.033099949 -18.991607800 + 42.016208217 -18.864539633 + 42.088948783 -18.782555658 + 42.178672874 -18.827653806 +} +85b5ac93fffffff +{ + -33.762138801 -150.860431298 + -33.669804616 -150.827100909 + -33.600293761 -150.906238956 + -33.623049043 -151.018728585 + -33.715367710 -151.052237580 + -33.784946710 -150.973078606 +} +858e6447fffffff +{ + -10.783258080 -75.973782064 + -10.862223963 -76.030003364 + -10.949820530 -75.989199885 + -10.958409566 -75.892171792 + -10.879435581 -75.836003740 + -10.791880671 -75.876810388 +} +85dc22cffffffff +{ + -57.532426412 -15.289908942 + -57.452216280 -15.225639730 + -57.381634381 -15.330382396 + -57.390990235 -15.499201174 + -57.471019059 -15.564096048 + -57.541873659 -15.459549118 +} +85168bc7fffffff +{ + 46.868718372 162.817764303 + 46.961444204 162.813251729 + 47.003507765 162.691085153 + 46.952784956 162.573653662 + 46.860088363 162.578494759 + 46.818085133 162.700439012 +} +854d15c7fffffff +{ + 29.487640259 -64.212710319 + 29.455676471 -64.299356853 + 29.385392582 -64.310604579 + 29.347118226 -64.235431242 + 29.378980848 -64.148958412 + 29.449218794 -64.137485399 +} +85f2cdc7fffffff +{ + -76.822239528 -96.731298375 + -76.839399604 -96.336842716 + -76.767683835 -96.069829412 + -76.679384287 -96.196836237 + -76.662508508 -96.586818247 + -76.733650232 -96.854235289 +} +85ccc6affffffff +{ + -38.135049166 76.148970234 + -38.224038356 76.176655641 + -38.248776043 76.291601516 + -38.184514928 76.378694877 + -38.095560588 76.350860656 + -38.070832417 76.236081601 +} +850db617fffffff +{ + 69.661728838 174.207747483 + 69.567438940 174.165338087 + 69.508705936 174.376867523 + 69.543862642 174.631195924 + 69.637993579 174.675684111 + 69.697128152 174.463771137 +} +8518da9bfffffff +{ + 42.953991526 -17.787602762 + 42.882469630 -17.871301901 + 42.792755316 -17.827061224 + 42.774530715 -17.699376570 + 42.845961349 -17.615676374 + 42.935707726 -17.659661382 +} +853b502ffffffff +{ + 33.367347805 -45.921192160 + 33.282601072 -45.964527442 + 33.206529281 -45.901428049 + 33.215092676 -45.794979594 + 33.299819965 -45.751439990 + 33.376003409 -45.814552866 +} +856cd38bfffffff +{ + -1.044631496 -99.768730918 + -1.117809341 -99.825351451 + -1.202031226 -99.793996867 + -1.213094964 -99.705944407 + -1.139859001 -99.649267455 + -1.055617471 -99.680699314 +} +85e0c9c7fffffff +{ + -51.461043385 51.027814209 + -51.380699246 51.058159757 + -51.332887991 50.968174677 + -51.365225439 50.847893991 + -51.445419915 50.817151514 + -51.493426725 50.907085638 +} +85ab0c47fffffff +{ + -18.105209413 68.257707163 + -18.199736185 68.275478177 + -18.231920407 68.371081530 + -18.169516629 68.448823922 + -18.075002591 68.430925786 + -18.042879494 68.335412274 +} +857296d7fffffff +{ + -5.397744400 131.514478450 + -5.490610242 131.530728444 + -5.524737202 131.620102257 + -5.465998906 131.693262424 + -5.373094467 131.677022849 + -5.338966867 131.587612620 +} +854e2e6ffffffff +{ + 18.923148878 150.889530241 + 18.834082579 150.903190659 + 18.796339573 150.991290129 + 18.847641740 151.065702675 + 18.936653209 151.052081676 + 18.974417382 150.964008678 +} +85b67027fffffff +{ + -25.422196707 -99.296716538 + -25.485978346 -99.358171733 + -25.570074570 -99.323938997 + -25.590439372 -99.228161321 + -25.526658602 -99.166641974 + -25.442512174 -99.200964365 +} +85812d8ffffffff +{ + -14.106622644 -46.465492367 + -14.026628471 -46.414092851 + -13.942987826 -46.461164171 + -13.939361654 -46.559603285 + -14.019356214 -46.610993039 + -14.102976559 -46.563953586 +} +8516635bfffffff +{ + 56.530105918 176.486556456 + 56.446182983 176.455105898 + 56.393648410 176.576934708 + 56.424770323 176.730292089 + 56.508567827 176.762455656 + 56.561369327 176.640550346 +} +8514a5abfffffff +{ + 51.300206936 124.980326134 + 51.235511514 125.068283067 + 51.244309187 125.207117631 + 51.317885476 125.258546161 + 51.382813959 125.170704252 + 51.373932836 125.031317348 +} +85f2110bfffffff +{ + -81.551074420 -142.242356054 + -81.625132841 -141.927464894 + -81.617524726 -141.315980522 + -81.535849568 -141.030923936 + -81.462538685 -141.350771475 + -81.470155910 -141.950859939 +} +85afb693fffffff +{ + -27.906577177 81.819689944 + -27.998694555 81.848807812 + -28.021458768 81.952910857 + -27.952117686 82.027741104 + -27.860067809 81.998523855 + -27.837291467 81.894575488 +} +85f28a0bfffffff +{ + -86.100335343 -91.979507384 + -86.112787742 -90.625084990 + -86.036785110 -89.839062871 + -85.950122693 -90.391681400 + -85.938138546 -91.693192525 + -86.012362838 -92.493623236 +} +85b18123fffffff +{ + -31.054366653 -112.624552414 + -30.997358997 -112.538404527 + -30.907766103 -112.553957600 + -30.875150689 -112.655404332 + -30.932018008 -112.741477624 + -31.021640870 -112.726178961 +} +85d5660bfffffff +{ + -55.382542153 -170.668239389 + -55.317525725 -170.603428128 + -55.249585526 -170.684964357 + -55.246616646 -170.831076899 + -55.311568186 -170.895986426 + -55.379553477 -170.814685962 +} +85f185cbfffffff +{ + -77.221949871 110.146250228 + -77.154643163 109.875951803 + -77.171402508 109.463037510 + -77.255649738 109.316097028 + -77.323456291 109.585712939 + -77.306514128 110.002983509 +} +85281a77fffffff +{ + 43.732879112 -122.480543649 + 43.811637793 -122.424780945 + 43.879903732 -122.490458052 + 43.869362172 -122.611894304 + 43.790601571 -122.667468043 + 43.722384410 -122.601794864 +} +85104e2bfffffff { - 65.191774267 -127.535315392 - 65.103916252 -127.566985554 - 65.044962571 -127.414346843 - 65.073640849 -127.229640807 - 65.161504920 -127.196780601 - 65.220685387 -127.349815115 -} -85ceda63fffffff -{ - -33.944705192 -76.852347704 - -34.013012525 -76.913653338 - -34.084560567 -76.869585993 - -34.087796912 -76.764204977 - -34.019505871 -76.702957077 - -33.947962220 -76.747032270 -} -85dd5c4ffffffff -{ - -57.300279785 -25.868692501 - -57.226314056 -25.777090075 - -57.147701082 -25.856456366 - -57.142821581 -26.026945805 - -57.216539691 -26.118919297 - -57.295384858 -26.040035167 -} -8523aa93fffffff -{ - 42.235178058 -160.311412732 - 42.317177732 -160.273677850 - 42.386562483 -160.343154963 - 42.373894635 -160.450537825 - 42.291773986 -160.488168253 - 42.222442197 -160.418520764 -} -85964427fffffff -{ - -13.592275037 20.614830815 - -13.496159526 20.623222735 - -13.440935975 20.542713681 - -13.481783715 20.453827795 - -13.577853896 20.445375801 - -13.633121728 20.525869699 -} -85062173fffffff -{ - 68.706802960 -24.497260550 - 68.727536276 -24.717320540 - 68.662255056 -24.875297747 - 68.576517825 -24.813047069 - 68.555998405 -24.594283688 - 68.621003148 -24.436478686 -} -8563712bfffffff -{ - 14.164043646 62.869445243 - 14.103600723 62.915669460 - 14.092882947 62.986030470 - 14.157928792 63.030681246 - 14.183183799 63.022077205 - 14.223560425 62.991284307 - 14.224068163 62.907199950 -} -85c18963fffffff -{ - -34.517471235 -16.048331780 - -34.606926238 -16.094338812 - -34.684533747 -16.023470600 - -34.672596788 -15.906504197 - -34.583055723 -15.860645546 - -34.505537640 -15.931604440 -} -85f3a097fffffff -{ - -77.827388217 174.581844710 - -77.905477315 174.492509582 - -77.955271967 174.798650363 - -77.926356635 175.193500711 - -77.847995221 175.278169282 - -77.798818534 174.972677335 -} -85ecdad7fffffff -{ - -68.084103920 119.453234800 - -68.021932812 119.263601599 - -68.053015533 119.022322313 - -68.146480362 118.969358412 - -68.208951763 119.159315701 - -68.177657013 119.401916952 -} -85f1062ffffffff -{ - -82.943875004 119.223547657 - -82.974274539 118.550000668 - -83.058136867 118.461023983 - -83.111825411 119.061299199 - -83.080611968 119.746189099 - -82.996534809 119.819373801 -} -85deac6ffffffff -{ - -54.423078015 -44.659340143 - -54.367766793 -44.538838983 - -54.284124528 -44.564774539 - -54.255717615 -44.710536421 - -54.310777840 -44.830892162 - -54.394495444 -44.805632449 -} -85f17617fffffff -{ - -86.753529907 89.166722941 - -86.738488204 87.576308386 - -86.807803262 86.577044312 - -86.894342978 87.185708416 - -86.909898661 88.855623664 - -86.838378823 89.834858096 -} -85b8dd03fffffff -{ - -22.027440594 125.338827046 - -21.944415432 125.344026790 - -21.906735469 125.273236657 - -21.951953283 125.197258512 - -22.034890428 125.191922643 - -22.072697822 125.262700883 -} -8500ccc7fffffff -{ - 87.090415208 74.934914796 - 87.087977788 76.737513958 - 87.167261421 77.747927465 - 87.251247736 76.911158802 - 87.253810889 75.001731845 - 87.172256299 74.039941614 -} -855ec317fffffff -{ - 19.471039948 -55.263597137 - 19.542216307 -55.215982733 - 19.608223995 -55.257741270 - 19.603078049 -55.347056172 - 19.531962580 -55.394628235 - 19.465932204 -55.352927827 -} -8506742bfffffff -{ - 64.836421216 -28.715001805 - 64.849474014 -28.909444998 - 64.778651469 -29.035907799 - 64.695036793 -28.967975437 - 64.682153054 -28.774585290 - 64.752715480 -28.648077980 -} -853f9b0bfffffff -{ - 24.049199787 14.977055399 - 23.953068967 14.980144748 - 23.906629801 15.072303268 - 23.956270386 15.161489720 - 24.052439884 15.158557140 - 24.098930231 15.066281260 -} -85154a27fffffff -{ - 62.602925690 132.604680043 - 62.523223847 132.711640860 - 62.523959082 132.916974019 - 62.604423271 133.016582099 - 62.684415559 132.910181009 - 62.683653110 132.703607050 -} -856480b7fffffff -{ - 17.271670125 98.190445131 - 17.364523485 98.165183476 - 17.390558460 98.067731004 - 17.323728177 97.995580630 - 17.230870642 98.020893747 - 17.204847507 98.118305889 -} -859f9dabfffffff -{ - -13.357226577 171.891338059 - -13.280129069 171.856059434 - -13.263356730 171.769752753 - -13.323698437 171.718580528 - -13.400906199 171.753802465 - -13.417661968 171.840253524 -} -85d09087fffffff -{ - -53.109357474 1.676778207 - -53.195246977 1.643469742 - -53.250661587 1.753558184 - -53.220102404 1.896824250 - -53.134208332 1.929729054 - -53.078877798 1.819771870 -} -8547aa1bfffffff -{ - 27.268770638 -175.476721291 - 27.360844436 -175.457603734 - 27.419292902 -175.536178367 - 27.385553943 -175.633898595 - 27.293390114 -175.652856806 - 27.235055206 -175.574254404 -} -8502240ffffffff -{ - 82.941127251 -100.096038978 - 82.945290144 -100.820668566 - 82.869183179 -101.239395878 - 82.789909093 -100.939178589 - 82.786006567 -100.230356372 - 82.861121171 -99.806171675 + 65.763744365 62.971313691 + 65.693286869 63.092647380 + 65.701027079 63.313497712 + 65.779265863 63.414073112 + 65.849912527 63.293079602 + 65.842131057 63.071166383 } -85032637fffffff +85f16253fffffff { - 89.740561900 17.249948165 - 89.811256725 32.170528315 - 89.900796050 20.229380089 - 89.872827683 -25.830927255 - 89.782701969 -21.291239366 - 89.730608804 -2.712692205 + -87.460487741 42.920284618 + -87.384129622 41.737685533 + -87.391291967 39.740001688 + -87.475269023 38.798869271 + -87.554291541 39.934332279 + -87.546650261 42.063532107 +} +85e28417fffffff +{ + -61.949047513 -120.508863777 + -61.903862503 -120.343726518 + -61.813961476 -120.352242290 + -61.769263307 -120.525041133 + -61.814306637 -120.689712215 + -61.904189294 -120.682050497 +} +8598ce7bfffffff +{ + -23.157585283 -4.460914219 + -23.246403660 -4.489992877 + -23.315027547 -4.418880694 + -23.294719362 -4.318705010 + -23.205859377 -4.289794379 + -23.137349063 -4.360891185 +} +85ee8ab3fffffff +{ + -68.333551996 -15.786280664 + -68.245756501 -15.686799991 + -68.169298710 -15.843853459 + -68.180259713 -16.099910029 + -68.267796223 -16.200803436 + -68.344631335 -16.044236855 +} +8590a92ffffffff +{ + -7.556694834 -119.690593471 + -7.500459989 -119.652279368 + -7.438082563 -119.694213212 + -7.432018162 -119.774470080 + -7.488311695 -119.812711394 + -7.550610976 -119.770768741 +} +859d424bfffffff +{ + -20.698458055 143.148705372 + -20.609280545 143.135886688 + -20.578010083 143.045056619 + -20.635811516 142.966953041 + -20.724982335 142.979597810 + -20.756358559 143.070520119 +} +85695823fffffff +{ + 12.408073115 121.016499450 + 12.318714382 121.033301318 + 12.291736989 121.118785279 + 12.354181558 121.187530710 + 12.443603478 121.170721509 + 12.470517671 121.085174150 +} +85f1744bfffffff +{ + -87.163898108 91.064264903 + -87.151772494 89.233701934 + -87.222903277 88.126989842 + -87.308622247 88.880002505 + -87.321181992 90.817474110 + -87.247566372 91.891050633 +} +85efa02bfffffff +{ + -81.330432323 -2.411239055 + -81.235558501 -2.307794886 + -81.174995871 -2.788032228 + -81.208459576 -3.374186258 + -81.303070071 -3.488796301 + -81.364487621 -3.006154185 +} +85972d5bfffffff +{ + -23.193983526 30.362931857 + -23.099515780 30.367769431 + -23.048764329 30.279941823 + -23.092471886 30.187238960 + -23.186944049 30.182325670 + -23.237704324 30.270190935 +} +8503248ffffffff +{ + 88.492401277 37.227281163 + 88.545814710 40.061987135 + 88.639134165 39.736595958 + 88.677791284 36.157826609 + 88.619405886 33.217538826 + 88.527600664 33.949135370 +} +853899cbfffffff +{ + 23.925323466 -1.698986121 + 23.836657595 -1.682891703 + 23.802606160 -1.596867247 + 23.857237483 -1.526775822 + 23.946012838 -1.542770118 + 23.980047377 -1.628956165 +} +85a691c3fffffff +{ + -16.723459749 115.916523455 + -16.802307290 115.932253111 + -16.838511502 116.009285032 + -16.795856374 116.070650961 + -16.716934025 116.054907861 + -16.680741609 115.977812236 +} +8500db37fffffff +{ + 84.741926192 125.157251384 + 84.668391628 125.799002310 + 84.682016976 126.820163468 + 84.769572889 127.229805473 + 84.844525214 126.595579368 + 84.830494374 125.543579116 +} +85caea83fffffff +{ + -44.930704812 63.084594953 + -45.015477965 63.102039746 + -45.051352687 63.219686156 + -45.002408150 63.319782228 + -44.917621228 63.302123250 + -44.881792477 63.184582287 +} +85019ddbfffffff +{ + 73.357932491 57.717834291 + 73.376396060 58.010598378 + 73.459476558 58.083273078 + 73.524253746 57.860566268 + 73.505494296 57.565340153 + 73.422255241 57.495294812 +} +85f3a90ffffffff +{ + -79.268929752 -166.830891630 + -79.351258056 -166.781600806 + -79.379296063 -166.346786556 + -79.324465576 -165.966048553 + -79.242257655 -166.021874293 + -79.214755307 -166.451927426 +} +8505206ffffffff +{ + 79.469497335 100.192191401 + 79.426062717 100.650374891 + 79.477706495 101.084245331 + 79.573459003 101.063039754 + 79.617452403 100.599910793 + 79.565128919 100.162949574 +} +85ce0b07fffffff +{ + -41.695074171 -81.293385030 + -41.617253298 -81.237764441 + -41.537771055 -81.298265170 + -41.535951098 -81.414316036 + -41.613697025 -81.470187770 + -41.693337988 -81.409758139 +} +85be71b7fffffff +{ + -37.219727460 146.328763376 + -37.124271260 146.309246177 + -37.089621890 146.196532133 + -37.150342985 146.103174538 + -37.245798209 146.122439837 + -37.280533474 146.235314797 +} +85d0931bfffffff +{ + -54.438369729 1.684047761 + -54.523027180 1.649943180 + -54.577293308 1.762709066 + -54.546815661 1.909442120 + -54.462151246 1.943123187 + -54.407971218 1.830495160 +} +854f118ffffffff +{ + 15.688132511 157.816750996 + 15.773665698 157.809031527 + 15.814538484 157.724940391 + 15.769810072 157.648693405 + 15.684327174 157.656557363 + 15.643522280 157.740523935 +} +853e4177fffffff +{ + 27.170864382 33.650841170 + 27.075461827 33.637506146 + 27.017694306 33.722323004 + 27.055243022 33.820471486 + 27.150582133 33.833955173 + 27.208436059 33.749141899 +} +8516580ffffffff +{ + 51.911514267 177.695523344 + 51.999073298 177.712772866 + 52.054450532 177.592953460 + 52.022175072 177.455933497 + 51.934570689 177.439047344 + 51.879286906 177.558817287 +} +859f1157fffffff +{ + -19.299469068 173.439806969 + -19.218463227 173.401215617 + -19.203809399 173.309992575 + -19.270195961 173.257198457 + -19.351322677 173.295733961 + -19.365941904 173.387119678 } -85efb5d3fffffff +85f293b3fffffff { - -80.933195630 14.167453957 - -80.838375796 14.096074304 - -80.800734128 13.556653438 - -80.857351215 13.081145205 - -80.952406347 13.142219889 - -80.990615992 13.689156056 + -89.780266586 -103.227958204 + -89.793429041 -78.463827775 + -89.707564517 -71.154607567 + -89.633062761 -81.228829101 + -89.624196871 -95.449071077 + -89.687406930 -106.498092600 } -85872c4ffffffff +85385a4bfffffff +{ + 30.495231904 8.391000109 + 30.400674035 8.400169937 + 30.360815619 8.497385182 + 30.415500749 8.585594550 + 30.510129682 8.576583944 + 30.550002503 8.479204563 +} +85023037fffffff +{ + 80.975600307 -116.886298030 + 80.953316223 -117.443858270 + 80.865740413 -117.621320768 + 80.800983447 -117.249250527 + 80.823017716 -116.700839828 + 80.910055165 -116.515444529 +} +85abae67fffffff +{ + -24.049793519 64.022209570 + -24.145480040 64.037391172 + -24.181107899 64.135185027 + -24.120979396 64.217720325 + -24.025278763 64.202393300 + -23.989720642 64.104676332 +} +85bd751bfffffff +{ + -41.521659560 30.222610357 + -41.446088181 30.227984728 + -41.405866163 30.131613163 + -41.441211544 30.029822806 + -41.516784699 30.024357299 + -41.557010794 30.120773253 +} +854993c3fffffff +{ + 20.744851256 -97.237741207 + 20.820901569 -97.175761699 + 20.908967394 -97.213665222 + 20.920967279 -97.313676893 + 20.844836219 -97.375671641 + 20.756786092 -97.337639664 +} +85ecf18ffffffff +{ + -69.742097242 132.743863426 + -69.697884927 132.515506577 + -69.746856118 132.287938055 + -69.840340809 132.287968365 + -69.884789295 132.517513327 + -69.835515680 132.745838021 +} +850d4c07fffffff +{ + 65.313292805 -138.297504712 + 65.261556278 -138.467801384 + 65.180080306 -138.455917873 + 65.150347897 -138.275017986 + 65.201807996 -138.105256455 + 65.283275976 -138.115858914 +} +85c193dbfffffff +{ + -33.065458675 -23.818282696 + -33.150571570 -23.870150912 + -33.230860887 -23.809828711 + -33.225969434 -23.697489907 + -33.140746448 -23.645702969 + -33.060525041 -23.706173120 +} +8597a257fffffff +{ + -15.460567316 38.961301519 + -15.364605493 38.962444817 + -15.316097800 38.878005791 + -15.363550121 38.792348500 + -15.459557628 38.791135389 + -15.508067192 38.875649411 +} +851e53cbfffffff +{ + 45.919248703 26.396083217 + 45.831154608 26.387452929 + 45.780805450 26.497972152 + 45.818492357 26.617195229 + 45.906567559 26.626073211 + 45.956974910 26.515480587 +} +857ae6abfffffff +{ + 3.618848974 43.048687603 + 3.705229727 43.048213342 + 3.753501146 42.971720203 + 3.715424736 42.895625016 + 3.628995504 42.896042976 + 3.580691096 42.972612461 +} +85547133fffffff +{ + 13.693599037 -8.191513611 + 13.631099349 -8.253935455 + 13.554585689 -8.232409842 + 13.540554692 -8.148606760 + 13.602943710 -8.086236639 + 13.679474258 -8.107617799 +} +853698b7fffffff +{ + 26.436477060 -154.413937697 + 26.348347429 -154.446622416 + 26.280528389 -154.376038063 + 26.300830705 -154.272758398 + 26.388967515 -154.240000067 + 26.456794882 -154.310594854 +} +857daab7fffffff +{ + -4.809467440 -17.473113747 + -4.731982937 -17.433802195 + -4.655834461 -17.475474076 + -4.657115910 -17.556527951 + -4.734644520 -17.595925820 + -4.810847583 -17.554183530 +} +856b3623fffffff +{ + 15.110312715 18.706052445 + 15.018120948 18.705905022 + 14.970664146 18.790501682 + 15.015323100 18.875328312 + 15.107530277 18.875613065 + 15.155063214 18.790933835 +} +85032367fffffff +{ + 88.062580313 -83.127889656 + 88.093630404 -85.658655864 + 88.031623113 -87.728905400 + 87.942286387 -87.235004927 + 87.913774740 -84.863816234 + 87.972191257 -82.832368450 +} +8548e64bfffffff +{ + 29.238011549 -107.184746584 + 29.318388869 -107.122889942 + 29.405228504 -107.172138607 + 29.411648999 -107.283342997 + 29.331218176 -107.345144991 + 29.244420386 -107.295797554 +} +85759a63fffffff +{ + 2.701740582 -11.651378714 + 2.771530771 -11.617051074 + 2.844928141 -11.654750474 + 2.848610381 -11.726851365 + 2.778791981 -11.761264557 + 2.705319509 -11.723491307 +} +85d96d8bfffffff +{ + -59.622355281 123.490537220 + -59.562727113 123.343645368 + -59.597651328 123.170386827 + -59.692405059 123.143395980 + -59.752257214 123.290596812 + -59.717131012 123.464480509 +} +8500c803fffffff +{ + 87.619719360 102.981614248 + 87.574361915 104.901089490 + 87.619910675 106.879391811 + 87.713409902 107.019822837 + 87.761598575 105.023712925 + 87.713345655 102.963599113 +} +85f3216ffffffff +{ + -72.839178666 -165.512754218 + -72.913305789 -165.476743970 + -72.935329528 -165.214301025 + -72.882900894 -164.989656781 + -72.808862136 -165.027993743 + -72.787161986 -165.288654252 +} +85097107fffffff +{ + 70.353918629 4.397092198 + 70.403821484 4.248305085 + 70.374243753 4.040953108 + 70.294821423 3.983803143 + 70.245196752 4.132695144 + 70.274716634 4.338637857 +} +8504a657fffffff +{ + 68.494730859 132.995885768 + 68.412114971 133.130974929 + 68.412749754 133.393190488 + 68.496025569 133.522333751 + 68.578991642 133.388186737 + 68.578331602 133.123943735 +} +8567209bfffffff +{ + 18.472955116 -73.026025409 + 18.416395981 -73.075698588 + 18.346277386 -73.038458477 + 18.332776866 -72.951552114 + 18.389383123 -72.901933310 + 18.459442783 -72.939166392 +} +859f717bfffffff +{ + -24.145534442 167.381871567 + -24.058376831 167.345138071 + -24.041040573 167.245231466 + -24.110873270 167.181871443 + -24.198138936 167.218504020 + -24.215463852 167.318597853 +} +85f29e43fffffff +{ + -89.023865406 -44.979466550 + -88.964121572 -40.925350927 + -88.874356820 -42.014830200 + -88.841804630 -46.468357067 + -88.894572684 -50.343031284 + -88.986382735 -49.974437737 +} +852d7347fffffff +{ + 45.163516115 39.127053210 + 45.078517150 39.105619192 + 45.017774237 39.201294940 + 45.041974280 39.318344113 + 45.126908084 39.339965008 + 45.187707102 39.244350261 +} +85d856bbfffffff +{ + -48.229480610 128.683605519 + -48.176330283 128.570944126 + -48.211631643 128.450243889 + -48.300274006 128.441947621 + -48.353591893 128.554857735 + -48.318099473 128.675815425 +} +855adb73fffffff +{ + 24.857151622 167.715127190 + 24.951737408 167.716849137 + 25.000665931 167.625977475 + 24.954913158 167.533480848 + 24.860330053 167.531951920 + 24.811496884 167.622726595 +} +85bc414bfffffff +{ + -33.032424996 22.426338714 + -32.947077297 22.434778059 + -32.895575459 22.345762642 + -32.929413655 22.248315027 + -33.014739618 22.239801034 + -33.066249211 22.328809225 +} +858e9963fffffff +{ + -16.805435749 -92.328078090 + -16.879238621 -92.389106732 + -16.968017005 -92.352153891 + -16.983015400 -92.254105213 + -16.909195910 -92.193047635 + -16.820394670 -92.230067540 +} +85032083fffffff +{ + 89.071612744 -1.325321155 + 89.159313862 0.134796489 + 89.223093143 -4.727229134 + 89.189975166 -10.919500933 + 89.099653505 -11.326185473 + 89.044375520 -6.661604933 +} +85ca6b0ffffffff +{ + -38.358270857 68.642165390 + -38.448749429 68.663560154 + -38.480758163 68.776999560 + -38.422251579 68.868915516 + -38.331777626 68.847343443 + -38.299805521 68.734032543 +} +852ea233fffffff +{ + 45.283193484 148.342497282 + 45.371939352 148.319732277 + 45.398363521 148.201652961 + 45.336049762 148.106642306 + 45.247398638 148.129640382 + 45.220966442 148.247416587 +} +85cab2d3fffffff +{ + -45.624236758 45.944724665 + -45.704428552 45.945078849 + -45.753656544 46.041752494 + -45.722643605 46.138102912 + -45.642384105 46.137563349 + -45.593205175 46.040858982 +} +85c4c9d3fffffff +{ + -49.599726784 -34.042025777 + -49.669131750 -34.115031873 + -49.750664349 -34.056959453 + -49.762779164 -33.925564421 + -49.693280989 -33.852553858 + -49.611761304 -33.910942188 +} +85f2d537fffffff +{ + -81.373715098 -95.542550058 + -81.390738867 -94.936083899 + -81.317855283 -94.539984111 + -81.228801800 -94.748766251 + -81.212139715 -95.344618813 + -81.284174043 -95.742184372 +} +85939007fffffff +{ + -6.002556805 -112.778112613 + -6.068141464 -112.828599323 + -6.147829033 -112.805347633 + -6.161995842 -112.731524555 + -6.096367256 -112.680950844 + -6.016615800 -112.704287224 +} +8500d0bbfffffff +{ + 82.665191076 88.498642616 + 82.640384517 89.198877484 + 82.706819088 89.722856990 + 82.799069500 89.546549693 + 82.824349733 88.831897961 + 82.756897996 88.308147929 +} +85f02c57fffffff +{ + -81.866968862 65.552253604 + -81.816898021 65.009554173 + -81.856946215 64.457657360 + -81.947855737 64.441705027 + -81.998691317 64.990253153 + -81.957843918 65.548915301 +} +85ad9b0ffffffff +{ + -22.431694625 18.482185493 + -22.338761725 18.491678211 + -22.282389886 18.409544744 + -22.318925282 18.317946081 + -22.411810592 18.308392293 + -22.468208160 18.390498153 +} +85e05243fffffff +{ + -55.716155415 53.703966099 + -55.631071194 53.732222474 + -55.580823137 53.624002904 + -55.615442812 53.487533407 + -55.700375367 53.458724848 + -55.750840132 53.566936618 +} +8518ad0ffffffff +{ + 50.744423682 -17.143658886 + 50.678496700 -17.238178913 + 50.593181024 -17.189469713 + 50.573759199 -17.046567013 + 50.639596180 -16.952055224 + 50.724944839 -17.000437204 +} +856e2013fffffff +{ + 2.264740896 -116.964485573 + 2.334064572 -116.920696581 + 2.407689161 -116.965372726 + 2.411898825 -117.053860640 + 2.342508786 -117.097572697 + 2.268975409 -117.052873931 +} +85ac418ffffffff +{ + -23.529432676 1.323188068 + -23.618352880 1.300387252 + -23.683576483 1.374303775 + -23.659771650 1.470964466 + -23.570840763 1.493583116 + -23.505725251 1.419723374 +} +85f164abfffffff { + -88.368524380 -21.089156620 + -88.285613636 -19.616525192 + -88.208700038 -21.295482090 + -88.210781453 -24.327114868 + -88.289875529 -25.956293481 + -88.370714866 -24.415823569 +} +85893147fffffff +{ + -16.169760277 -150.407239974 + -16.081537300 -150.379297427 + -16.012931926 -150.446756762 + -16.032452853 -150.542176798 + -16.120644191 -150.570249672 + -16.189346341 -150.502772342 +} +859dac03fffffff +{ + -16.551193375 152.200939854 + -16.465288703 152.179780499 + -16.439747488 152.087601651 + -16.500040543 152.016455164 + -16.585988272 152.037467063 + -16.611600014 152.129773062 +} +85142037fffffff +{ + 57.385256187 123.594375101 + 57.316775092 123.703619683 + 57.329075035 123.870577470 + 57.409968226 123.929080815 + 57.478724423 123.819964447 + 57.466311934 123.652214079 +} +85c5a3bbfffffff +{ + -33.326287842 -41.726594526 + -33.396649488 -41.786419934 + -33.476960177 -41.752053927 + -33.486920570 -41.657653893 + -33.416450590 -41.597771686 + -33.336128664 -41.632346158 +} +857c2053fffffff +{ + -3.681455749 -21.877482162 + -3.602101156 -21.835158050 + -3.522972457 -21.878932996 + -3.523145026 -21.965093829 + -3.602533232 -22.007498164 + -3.681715270 -21.963661503 +} +85c6d37bfffffff +{ + -33.272084589 -125.884019106 + -33.225295211 -125.788889303 + -33.135569519 -125.785980530 + -33.092688269 -125.877939280 + -33.139382320 -125.972881249 + -33.229052762 -125.976052134 +} +8561557bfffffff +{ + 5.050152629 74.704679311 + 5.136483692 74.677534878 + 5.157199054 74.594482128 + 5.091650349 74.538645178 + 5.005411128 74.565773509 + 4.984628803 74.648754967 +} +85b98603fffffff +{ + -29.378796270 140.045025598 + -29.284993771 140.034483152 + -29.247863625 139.937401301 + -29.304423477 139.850772184 + -29.398192832 139.861104676 + -29.435435618 139.958276237 +} +8566718ffffffff +{ + 6.406482663 -69.254420057 + 6.338208394 -69.303805649 + 6.257378446 -69.265187302 + 6.244900987 -69.177203504 + 6.313210612 -69.127889134 + 6.393962373 -69.166487242 +} +8500c98bfffffff +{ + 88.589916449 112.553446010 + 88.531701307 115.394785677 + 88.560197514 118.945992055 + 88.649805347 119.999718651 + 88.713476832 117.108498501 + 88.681826103 113.193028099 +} +85b951d3fffffff +{ + -35.096130146 127.387538984 + -35.005833216 127.391380616 + -34.959006368 127.304749203 + -35.002358877 127.214277307 + -35.092557701 127.210236146 + -35.139502179 127.296866169 +} +85049da7fffffff +{ + 65.791941506 146.568637921 + 65.701565834 146.640463955 + 65.681456133 146.868792312 + 65.751573185 147.026745922 + 65.842152756 146.956230496 + 65.862412113 146.726444908 +} +858e93a7fffffff +{ + -14.324303501 -94.339963429 + -14.398183732 -94.400304906 + -14.487305331 -94.364614247 + -14.502573594 -94.268510151 + -14.428669780 -94.208130521 + -14.339521312 -94.243893026 +} +8565601bfffffff +{ + -0.760037581 95.607246030 + -0.669011530 95.582595222 + -0.644330580 95.490083918 + -0.710697665 95.422266256 + -0.801697111 95.446956930 + -0.826356133 95.539425504 +} +850160a7fffffff +{ + 74.243053224 1.963998522 + 74.313320249 2.052786230 + 74.372215885 1.838567520 + 74.360369984 1.535311697 + 74.289863116 1.448899068 + 74.231440584 1.663353014 +} +851544dbfffffff +{ + 62.896276105 121.330927033 + 62.826833344 121.469262522 + 62.843872735 121.670133252 + 62.930509388 121.733793191 + 63.000273919 121.595549684 + 62.983079392 121.393550240 +} +8503608ffffffff +{ + 81.894862085 -42.487555034 + 81.967969442 -42.775171801 + 81.970628145 -43.415928297 + 81.900081965 -43.757154334 + 81.827735683 -43.462779903 + 81.825173322 -42.833789531 +} +854b7487fffffff +{ + 32.014777120 129.102005216 + 31.941068197 129.119338536 + 31.920738150 129.212967662 + 31.974147999 129.289311593 + 32.047866576 129.271985295 + 32.068165720 129.178307963 +} +85ee46a3fffffff +{ + -69.601567567 -51.320156900 + -69.548396759 -51.088814515 + -69.452461812 -51.104342347 + -69.409674140 -51.348997303 + -69.462483025 -51.579395922 + -69.558439866 -51.566084913 +} +858a8c2bfffffff +{ + -2.590401099 -58.040431176 + -2.510867259 -57.992135227 + -2.428409629 -58.033892583 + -2.425514004 -58.123876427 + -2.505002070 -58.172117845 + -2.587431518 -58.130430032 +} +8513292bfffffff +{ + 67.022790581 -113.816349977 + 66.936644203 -113.904101168 + 66.862984531 -113.766678750 + 66.875186886 -113.541710891 + 66.961190502 -113.452778223 + 67.035135080 -113.589989248 +} +85d4dd87fffffff +{ + -39.442355205 -163.816927661 + -39.357087865 -163.769309213 + -39.281441509 -163.843098535 + -39.291013100 -163.964406734 + -39.376219298 -164.012145090 + -39.451915083 -163.938455797 +} +85031b9bfffffff +{ + 83.413587134 -116.167444709 + 83.392937746 -116.936776672 + 83.304650008 -117.186845560 + 83.237737229 -116.682514111 + 83.258054811 -115.930570759 + 83.345610448 -115.665820443 +} +85488b97fffffff +{ + 31.107112083 -102.120559697 + 31.184077425 -102.054900166 + 31.271868270 -102.100744913 + 31.282672483 -102.212380125 + 31.205649590 -102.278021289 + 31.117880082 -102.232045901 +} +85275123fffffff +{ + 44.646613716 -89.902365263 + 44.585007529 -89.993278169 + 44.498433267 -89.958538443 + 44.473342521 -89.833254778 + 44.534750317 -89.742307942 + 44.621447042 -89.776677842 +} +85138863fffffff +{ + 59.135532864 -128.480726392 + 59.050937784 -128.503489320 + 58.992083082 -128.379413256 + 59.017629390 -128.232293493 + 59.102240937 -128.208758030 + 59.161290211 -128.333114284 +} +850ca403fffffff +{ + 64.092513867 -172.124648898 + 64.007961872 -172.204272174 + 63.939399123 -172.077406003 + 63.955085548 -171.871298133 + 64.039379068 -171.790784083 + 64.108244892 -171.917263490 +} +851f0dd7fffffff +{ + 54.988139877 16.715657045 + 54.910690973 16.717910610 + 54.876120810 16.849030953 + 54.918948023 16.978116997 + 54.996411742 16.976187232 + 55.031033626 16.844847463 +} +8504a0c7fffffff +{ + 69.320461643 135.419147994 + 69.235658022 135.550061264 + 69.232544507 135.822871575 + 69.314224283 135.966950554 + 69.399372287 135.837218342 + 69.402496223 135.562214187 +} +85126247fffffff +{ + 57.784660782 -107.149120375 + 57.704125607 -107.231666695 + 57.622856024 -107.143909161 + 57.621890371 -106.973899320 + 57.702265571 -106.890840450 + 57.783766577 -106.978301335 +} +8507366bfffffff +{ + 74.315771273 -3.566642337 + 74.362895757 -3.789499887 + 74.325023961 -4.045234647 + 74.240202226 -4.076170529 + 74.193426646 -3.853869655 + 74.231125126 -3.600069184 +} +85b9327bfffffff +{ + -36.067644422 138.844844012 + -35.972880977 138.834918499 + -35.932397175 138.731105691 + -35.986568383 138.637123391 + -36.081288233 138.646803946 + -36.121880614 138.750711728 +} +850561b7fffffff +{ + 86.331067278 165.427996233 + 86.237215368 165.418629345 + 86.187544026 166.652739707 + 86.229927946 167.923582776 + 86.323641044 167.995961396 + 86.375153585 166.734703999 +} +850fa083fffffff +{ + 69.701632077 -83.380067204 + 69.640172367 -83.592058525 + 69.546808696 -83.544536245 + 69.514779989 -83.286883788 + 69.575911524 -83.075199540 + 69.669398789 -83.120855201 +} +85c07583fffffff +{ + -34.066226070 -3.219030311 + -34.159455490 -3.250481801 + -34.228850457 -3.169106910 + -34.204916088 -3.056311802 + -34.111661639 -3.025080981 + -34.042366455 -3.106424304 +} +85215403fffffff +{ + 51.991579705 68.551076263 + 51.907635873 68.627774009 + 51.906523042 68.784734612 + 51.989358939 68.865534952 + 52.073437232 68.789105419 + 52.074545167 68.631605818 +} +85c5866ffffffff +{ + -34.754055152 -44.421322695 + -34.821479551 -44.482479580 + -34.901658889 -44.451647936 + -34.914439844 -44.359444792 + -34.846915668 -44.298212893 + -34.766710420 -44.329259044 +} +8588a043fffffff +{ + -5.182681275 -148.004995658 + -5.265715436 -148.035903341 + -5.331282755 -147.975794310 + -5.313879299 -147.884799662 + -5.230894881 -147.853853991 + -5.165264137 -147.913940834 +} +8506d80ffffffff +{ + 64.537809859 -54.861848331 + 64.514019226 -55.073108548 + 64.421849813 -55.129771610 + 64.353651090 -54.976229665 + 64.377354145 -54.766157189 + 64.469343005 -54.708443290 +} +85053313fffffff +{ + 76.600804410 105.111682596 + 76.549723290 105.458113895 + 76.594079610 105.818958321 + 76.690019532 105.836053543 + 76.741601586 105.487258448 + 76.696739185 105.123729635 +} +85f2510bfffffff +{ + -75.677481257 -114.929868893 + -75.719420254 -114.619216326 + -75.670520172 -114.305495965 + -75.580101884 -114.304545070 + -75.538649990 -114.613281267 + -75.587132088 -114.924886008 +} +85f12553fffffff +{ + -84.522846879 153.047235675 + -84.594658123 152.513591625 + -84.671004068 152.945619998 + -84.674402192 153.927752139 + -84.601296543 154.449971925 + -84.526090134 154.002006727 +} +85046ea7fffffff +{ + 77.230630728 -172.954993832 + 77.141247642 -173.111570087 + 77.066335676 -172.848554266 + 77.080237517 -172.430398738 + 77.169170962 -172.270028197 + 77.244653536 -172.531564159 +} +854554d3fffffff +{ + 21.248167866 -89.833589497 + 21.319363064 -89.770605246 + 21.406574729 -89.801479201 + 21.422608344 -89.895482303 + 21.351335620 -89.958523880 + 21.264106887 -89.927505130 +} +852eebabfffffff +{ + 42.689025501 134.138580527 + 42.768960726 134.103334218 + 42.781987181 134.001989914 + 42.715154122 133.936157296 + 42.635343045 133.971498164 + 42.622240933 134.072577544 +} +85633537fffffff +{ + 18.121448066 56.387865698 + 18.059171194 56.441418148 + 18.062205107 56.527330466 + 18.127570614 56.559845179 + 18.189975420 56.506305752 + 18.186886673 56.420238373 +} +85272a2ffffffff +{ + 50.047462302 -92.435611226 + 49.980277019 -92.533888709 + 49.891102122 -92.489297983 + 49.868963186 -92.346870185 + 49.935940412 -92.248499121 + 50.025264432 -92.292648076 +} +85dd6b33fffffff +{ + -57.912277251 -34.667511260 + -57.844861529 -34.552961828 + -57.760802855 -34.610477023 + -57.743985260 -34.781841526 + -57.811121578 -34.896517424 + -57.895354506 -34.839704956 +} +850763cffffffff +{ + 64.269804243 -14.301287192 + 64.298850437 -14.462448096 + 64.244384397 -14.608010629 + 64.161064945 -14.591952840 + 64.132258584 -14.431362364 + 64.186532457 -14.286259579 +} +85b65523fffffff +{ + -23.431616648 -98.788233671 + -23.497422807 -98.849417143 + -23.582791380 -98.815119371 + -23.602402774 -98.719550655 + -23.536593624 -98.658306062 + -23.451176084 -98.692691214 +} +8570423bfffffff +{ + 1.540685787 -163.711564502 + 1.454255739 -163.736416979 + 1.386033145 -163.673093138 + 1.404179855 -163.584865447 + 1.490622112 -163.559933943 + 1.558905523 -163.623309093 +} +85022ed7fffffff +{ + 80.744634618 -97.174239406 + 80.673098361 -97.519785982 + 80.646654583 -97.454384518 + 80.594657096 -97.316208283 + 80.587226154 -96.772847282 + 80.657602271 -96.429222967 + 80.736043294 -96.631528356 +} +85765b57fffffff +{ + -1.604840354 166.442789120 + -1.688216779 166.451745946 + -1.716981659 166.520613341 + -1.662461210 166.580469833 + -1.579176343 166.571551483 + -1.550320391 166.502738181 +} +8504e56ffffffff +{ + 72.163010896 162.395096244 + 72.066299939 162.409226550 + 72.021900692 162.687289580 + 72.073827358 162.952827504 + 72.170553160 162.941605171 + 72.215339580 162.661935277 +} +852314affffffff +{ + 38.232049894 -162.038285086 + 38.316639164 -162.003928339 + 38.384368643 -162.072564261 + 38.367442425 -162.175700061 + 38.282728030 -162.209949651 + 38.215065015 -162.141171027 +} +85f02983fffffff +{ + -81.174235962 53.799771960 + -81.109192670 53.370575328 + -81.132507913 52.812765004 + -81.221377483 52.675272345 + -81.287243788 53.105234765 + -81.263411507 53.672005980 +} +85f29453fffffff +{ + -87.925395193 139.097893211 + -87.984547966 137.164102376 + -88.072117744 137.703611732 + -88.098874236 140.371750237 + -88.035874942 142.316362551 + -87.950079134 141.589295735 +} +859c18b3fffffff +{ + -12.879894454 144.032746537 + -12.966577508 144.047233282 + -12.995640529 144.135165846 + -12.938067784 144.208608124 + -12.851392448 144.194150562 + -12.822282061 144.106221489 +} +85056eaffffffff +{ + 85.014818350 171.997689484 + 84.920979319 171.870827482 + 84.862558748 172.722839957 + 84.896534895 173.709872162 + 84.989946921 173.869851156 + 85.049831998 173.010000325 +} +85124bd7fffffff +{ + 52.630167366 -103.643656496 + 52.554349827 -103.723595286 + 52.471338859 -103.653653837 + 52.463938682 -103.504067260 + 52.539586334 -103.423798821 + 52.622804121 -103.493444801 +} +85a8b58ffffffff +{ + -23.637235243 -41.461184158 + -23.562499444 -41.409332682 + -23.486397509 -41.457970211 + -23.485050025 -41.558448845 + -23.559807139 -41.610314000 + -23.635890417 -41.561686998 +} +85d87387fffffff +{ + -50.118791893 126.904030690 + -50.063309691 126.787426281 + -50.097984476 126.658337673 + -50.188331486 126.645539483 + -50.243993562 126.762388050 + -50.209128334 126.891790825 +} +8546b263fffffff +{ + 19.381566700 -177.928422725 + 19.469737148 -177.913073319 + 19.522170359 -177.987596959 + 19.486313496 -178.077477951 + 19.398069764 -178.092684437 + 19.345756089 -178.018153039 +} +85872eb7fffffff +{ + -15.400622460 89.389438874 + -15.487920835 89.419433584 -15.509528113 89.509735255 - -15.596801358 89.539803713 - -15.618312835 89.630096799 - -15.552583688 89.690189986 - -15.465412992 89.660072785 -15.443868917 89.569910956 + -15.356672802 89.539867055 + -15.335033644 89.449696460 +} +856d912ffffffff +{ + 10.279190593 -103.672509571 + 10.354772850 -103.617430166 + 10.437041892 -103.657488570 + 10.443672206 -103.752714802 + 10.368000841 -103.807772555 + 10.285788319 -103.767625916 +} +8535b3d7fffffff +{ + 40.497437452 -37.252039417 + 40.413413653 -37.312229632 + 40.332490131 -37.248446293 + 40.335492255 -37.124544076 + 40.419464892 -37.064158029 + 40.500486616 -37.127869472 +} +853283c3fffffff +{ + 42.384299339 175.010181416 + 42.479269510 175.021732237 + 42.534951291 174.915210829 + 42.495570300 174.797206223 + 42.400562756 174.785938039 + 42.344973396 174.892391579 +} +85ba230ffffffff +{ + -35.173421825 178.429892527 + -35.092099581 178.380335141 + -35.087904938 178.274912326 + -35.165111710 178.218826108 + -35.246554629 178.268343312 + -35.250670027 178.373987288 +} +850aab17fffffff +{ + 61.234688570 99.835972007 + 61.191383264 100.002238306 + 61.234609232 100.157512791 + 61.321427852 100.146900394 + 61.364948535 99.979975737 + 61.321434453 99.824322741 +} +8552116ffffffff +{ + 16.895314934 42.136594999 + 16.807112646 42.118568168 + 16.752740047 42.186801586 + 16.786469419 42.273012572 + 16.874575225 42.291132610 + 16.929048159 42.222948635 +} +851d9e57fffffff +{ + 51.959177115 -153.841246720 + 52.029824387 -153.791644157 + 52.101189694 -153.859142030 + 52.101891069 -153.976518540 + 52.031142361 -154.026054956 + 51.959793762 -153.958281648 +} +85ed53c7fffffff +{ + -72.111950375 159.272134622 + -72.106060428 159.008938207 + -72.179794526 158.861681867 + -72.259667199 158.978731162 + -72.265499208 159.244164461 + -72.191516576 159.390299377 +} +853b73cffffffff +{ + 35.743568907 -45.722747726 + 35.658185720 -45.767675107 + 35.582411757 -45.702759999 + 35.591913131 -45.592904587 + 35.677279338 -45.547761056 + 35.753161252 -45.612688757 +} +8504ae03fffffff +{ + 69.131778825 141.956841358 + 69.042497512 142.059868839 + 69.029131897 142.328211568 + 69.104942639 142.495596076 + 69.194506239 142.394111798 + 69.207977442 142.123689130 +} +85df9c03fffffff +{ + -60.108899805 -41.110023338 + -60.046393533 -40.972008321 + -59.958002234 -41.014382489 + -59.931993010 -41.193837927 + -59.994201826 -41.331767676 + -60.082716671 -41.290329628 +} +852cdbb7fffffff +{ + 35.267602804 57.516387233 + 35.192332013 57.585151053 + 35.200725607 57.697807477 + 35.284466040 57.741968544 + 35.359888880 57.673238966 + 35.351419095 57.560313580 +} +8500d537fffffff +{ + 83.705225636 84.459035218 + 83.687060679 85.284648290 + 83.757922160 85.851086135 + 83.848102129 85.588817371 + 83.866669659 84.742329059 + 83.794646565 84.179314753 +} +85a02b1bfffffff +{ + -19.484656054 -139.079903535 + -19.396118772 -139.061926286 + -19.333142190 -139.133090503 + -19.358623567 -139.222316073 + -19.447188034 -139.240445106 + -19.510244044 -139.169196816 +} +852f70b7fffffff +{ + 31.336006983 144.189078967 + 31.424757196 144.166445802 + 31.454106413 144.070959719 + 31.394723015 143.998318472 + 31.306091750 144.021086728 + 31.276724936 144.116361466 +} +85eb4c5bfffffff +{ + -70.011362809 -161.172908625 + -70.080973288 -161.124571076 + -70.095690085 -160.897159435 + -70.040558449 -160.719525929 + -69.971075423 -160.769429603 + -69.956595498 -160.995405889 +} +85f05a13fffffff +{ + -73.954913575 43.102810824 + -73.879667467 42.912457692 + -73.884094649 42.593922030 + -73.963925256 42.462609885 + -74.039641073 42.652024874 + -74.035055647 42.973710225 +} +85cc6113fffffff +{ + -48.275730690 72.236575458 + -48.189616728 72.221355984 + -48.160577552 72.100489702 + -48.217470087 71.994553487 + -48.303577023 72.009283333 + -48.332798826 72.130439228 +} +8543584ffffffff +{ + 31.199516003 64.784552112 + 31.121620773 64.842366470 + 31.122648686 64.951513922 + 31.201599918 65.003106440 + 31.279635329 64.945389700 + 31.278579273 64.835982320 +} +8550960ffffffff +{ + 24.746711778 -119.311643813 + 24.830887683 -119.261690573 + 24.912872916 -119.315828648 + 24.910604009 -119.419937284 + 24.826401746 -119.469770227 + 24.744494710 -119.415615077 +} +85d8622bfffffff +{ + -51.150021884 124.579683607 + -51.091757088 124.462164343 + -51.124517381 124.326376093 + -51.215725729 124.307734741 + -51.274182925 124.425469110 + -51.241238935 124.561630123 +} +8500d9b3fffffff +{ + 85.991729824 116.069252268 + 85.928909266 117.052619976 + 85.956528505 118.340725694 + 86.047987049 118.690256457 + 86.112708941 117.702941193 + 86.084040672 116.369098931 +} +8580ea87fffffff +{ + 3.310571229 -44.143937317 + 3.392506402 -44.093808909 + 3.476037923 -44.140230614 + 3.477654205 -44.236759931 + 3.395750491 -44.286889208 + 3.312199045 -44.240488437 +} +8522c8a3fffffff +{ + 54.556713475 -174.811682453 + 54.638942260 -174.782711374 + 54.699681967 -174.896892060 + 54.678102651 -175.040114473 + 54.595801974 -175.068749030 + 54.535152347 -174.954498559 +} +85434d2bfffffff +{ + 35.530386560 66.351600335 + 35.449144080 66.411628125 + 35.449290511 66.528737219 + 35.530699051 66.586117711 + 35.612079622 66.526217702 + 35.611913525 66.408808793 +} +85bf2b4bfffffff +{ + -41.429833659 158.804990137 + -41.338096289 158.768793492 + -41.316167413 158.644115771 + -41.385950452 158.555371699 + -41.477751152 158.591344454 + -41.499705593 158.716285685 +} +8510e503fffffff +{ + 60.957239130 54.637996897 + 60.890339600 54.756690269 + 60.909182819 54.941273352 + 60.995020895 55.007868602 + 61.062089241 54.889188854 + 61.043150378 54.703898195 +} +8578a27bfffffff +{ + -3.149255882 -141.188408474 + -3.233180637 -141.221133819 + -3.299052363 -141.163999908 + -3.281055588 -141.074193097 + -3.197201103 -141.041451726 + -3.131273119 -141.098533070 +} +855fb533fffffff +{ + 5.010268880 -48.135755355 + 5.091412891 -48.085792119 + 5.173431407 -48.131180627 + 5.174319110 -48.226495809 + 5.093217969 -48.276442648 + 5.011186274 -48.231090831 +} +8566b31bfffffff +{ + 7.573106447 -84.012091742 + 7.501864429 -84.068061569 + 7.420394570 -84.030858095 + 7.410208182 -83.937652922 + 7.481505287 -83.881695732 + 7.562933663 -83.918930949 +} +85035daffffffff +{ + 79.046536788 -68.182693453 + 79.009094734 -68.614431555 + 78.921675043 -68.640209479 + 78.871778677 -68.240294454 + 78.908767082 -67.812432219 + 78.996101627 -67.780622400 +} +85068bb7fffffff +{ + 69.622753588 -54.068229241 + 69.601990359 -54.327389083 + 69.511953268 -54.399646340 + 69.442888965 -54.214293934 + 69.463547838 -53.956933486 + 69.553374669 -53.883134294 +} +8572401bfffffff +{ + 5.820670763 145.871723976 + 5.725234537 145.886239326 + 5.689911434 145.975733545 + 5.749990592 146.050702558 + 5.845392013 146.036220250 + 5.880749134 145.946735838 +} +85e1a043fffffff +{ + -60.901260412 78.143710325 + -60.808215485 78.103779643 + -60.779315788 77.922117471 + -60.843270961 77.779638255 + -60.936362767 77.818603305 + -60.965453152 78.001014895 +} +856743bbfffffff +{ + 10.734456763 -67.894028394 + 10.671200144 -67.941771766 + 10.594005236 -67.903856160 + 10.580145454 -67.818220864 + 10.643442360 -67.770550323 + 10.720558796 -67.808442159 +} +851b6583fffffff +{ + 57.974467326 -30.290944266 + 57.902037439 -30.388573278 + 57.849169372 -30.350196073 + 57.825175369 -30.324869766 + 57.823055486 -30.157762417 + 57.892873450 -30.066223133 + 57.940906424 -30.116734205 + 57.967372912 -30.135735011 +} +8503244ffffffff +{ + 89.203320821 47.487508621 + 89.240876040 53.602067640 + 89.333527954 54.840370004 + 89.390816957 48.320182933 + 89.344992193 41.180259130 + 89.251304257 41.632413742 } -85040e27fffffff -{ - 74.413598750 154.768306980 - 74.317711900 154.830611783 - 74.284068893 155.167858871 - 74.345969518 155.445651961 - 74.442014609 155.386964278 - 74.476003300 155.046853575 -} -858c8857fffffff -{ - -1.265099449 104.763909656 - -1.175477655 104.742347808 - -1.151438351 104.652691110 - -1.217078825 104.584614043 - -1.306710777 104.606234706 - -1.330692167 104.695873690 -} -8516ee77fffffff -{ - 50.264167045 172.168902854 - 50.354310425 172.177790765 - 50.404945537 172.055177102 - 50.365349638 171.923801933 - 50.275186387 171.915280452 - 50.224638674 172.037767489 -} -85721b17fffffff -{ - 0.878831796 139.770721069 - 0.783094251 139.786212712 - 0.748795110 139.877022084 - 0.810213041 139.952350406 - 0.905948208 139.936883120 - 0.940267887 139.846063092 -} -85b82273fffffff -{ - -31.660682681 131.262954698 - -31.569107654 131.262348958 - -31.526038664 131.173644540 - -31.574421783 131.085518845 - -31.665916662 131.085924887 - -31.709108658 131.174656159 -} -85c18927fffffff -{ - -34.444161436 -15.348057583 - -34.533943747 -15.393330355 - -34.611193212 -15.321765562 - -34.598569270 -15.204843328 - -34.508703492 -15.159723963 - -34.431545077 -15.231372953 -} -85a2662bfffffff -{ - -16.887355844 55.911829462 - -16.979130839 55.919760884 - -17.015401561 56.005414516 - -16.959797152 56.083108514 - -16.867973718 56.075048808 - -16.831803048 55.989423419 -} -85c14907fffffff -{ - -31.236971129 0.796137186 - -31.329806002 0.770574778 - -31.396254852 0.851153339 - -31.369769659 0.957230916 - -31.276929945 0.982576706 - -31.210580123 0.902061722 -} -858eaa97fffffff -{ - -12.801754755 -89.209827840 - -12.878239371 -89.270127046 - -12.967853757 -89.232295070 - -12.980989459 -89.134108464 - -12.904481271 -89.073796637 - -12.814860984 -89.111683896 -} -8578e503fffffff -{ - -3.659218218 -132.384242865 - -3.739826788 -132.417412608 - -3.802190054 -132.367069065 - -3.783992794 -132.283636135 - -3.703474525 -132.250478336 - -3.641063256 -132.300741431 -} -852c6633fffffff -{ - 46.189729197 47.180590520 - 46.123108691 47.272054390 - 46.146157213 47.396776444 - 46.235960102 47.430327022 - 46.302718926 47.338763282 - 46.279536310 47.213748416 -} -85e90ba7fffffff -{ - -63.978549803 -101.809650270 - -63.913580522 -101.663688632 - -63.829403781 -101.721427834 - -63.810083084 -101.924351249 - -63.874865682 -102.070415801 - -63.959155303 -102.013456914 -} -85107247fffffff -{ - 63.062935291 51.720678007 - 63.000727276 51.850747551 - 63.023758316 52.042812932 - 63.109108931 52.105550245 - 63.171489221 51.975402592 - 63.148346219 51.782593686 -} -851b4217fffffff -{ - 54.074426403 -35.564354085 - 53.997832722 -35.641136790 - 53.925387079 -35.564429060 - 53.929443720 -35.411072659 - 54.005973026 -35.334014383 - 54.078510107 -35.410587001 -} -85e182c3fffffff -{ - -57.407853504 76.941817853 - -57.315671774 76.909259007 - -57.286677521 76.747575497 - -57.349677959 76.617871443 - -57.441890729 76.649643010 - -57.471072557 76.811906981 -} -85e781abfffffff -{ - -62.902962888 34.284329727 - -62.826750336 34.198409484 - -62.814939643 34.011898216 - -62.879353511 33.910226358 - -62.955833763 33.995534525 - -62.967632433 34.183130759 -} -8550f283fffffff -{ - 26.000723950 -128.068085093 - 26.084911846 -128.026891851 - 26.160590383 -128.083481347 - 26.152001015 -128.181228531 - 26.067822446 -128.222270351 - 25.992223859 -128.165716568 -} -859d33b3fffffff -{ - -20.686906601 152.974741097 - -20.597440955 152.951849936 - -20.571045930 152.855175172 - -20.634049544 152.781249449 - -20.723561032 152.803981536 - -20.750023187 152.900798608 -} -85eeec13fffffff -{ - -68.186525094 -39.435810075 - -68.118884630 -39.250768273 - -68.026042534 -39.316351849 - -68.000658819 -39.565260774 - -68.067914202 -39.750253947 - -68.160937298 -39.686393684 -} -8516318ffffffff -{ - 56.323469924 160.366708959 - 56.237115525 160.379780623 - 56.201578207 160.528455534 - 56.252177251 160.664548334 - 56.338559474 160.652269025 - 56.374315472 160.503104028 -} -85d690a7fffffff -{ - -44.144430991 43.329787978 - -44.224699380 43.327707986 - -44.275309414 43.418301459 - -44.245602509 43.511022010 - -44.165256679 43.512935065 - -44.114695142 43.422294753 -} -85b04963fffffff -{ - -17.466460892 -122.374582936 - -17.423025200 -122.300457423 - -17.350352095 -122.302053574 - -17.321128288 -122.377607218 - -17.364461817 -122.451631215 - -17.437121151 -122.450203047 -} -85b724d3fffffff -{ - -40.342094558 -97.262244323 - -40.270741879 -97.180850717 - -40.180236070 -97.221948053 - -40.160963005 -97.344197106 - -40.232175706 -97.425684255 - -40.322801370 -97.384829516 -} -8548f5d7fffffff -{ - 29.197640462 -106.518850938 - 29.277702281 -106.456598689 - 29.364775290 -106.505325612 - 29.371746833 -106.616407749 - 29.291630204 -106.678610158 - 29.204596869 -106.629780578 -} -857bac13fffffff -{ - -3.222770226 51.280750274 - -3.135332545 51.277301991 - -3.089282806 51.203948712 - -3.130670387 51.133947150 - -3.218193933 51.137347263 - -3.264244038 51.210797169 -} -85af82cbfffffff -{ - -29.427385831 86.010847002 - -29.516967241 86.042797073 - -29.535716205 86.146339782 - -29.464916921 86.217767865 - -29.375414549 86.185737553 - -29.356632398 86.082359132 -} -85bb740bfffffff -{ - -40.659196259 173.489449916 - -40.575610499 173.439480690 - -40.569365655 173.321477150 - -40.646761608 173.253170989 - -40.730455498 173.303046902 - -40.736645280 173.421322826 -} -850019bbfffffff -{ - 81.979909678 45.052023545 - 82.020794974 45.612075185 - 82.111774807 45.621779053 - 82.161825575 45.058291134 - 82.120116893 44.491416233 - 82.029189910 44.494858327 -} -85442503fffffff -{ - 22.521834369 -87.822763368 - 22.591327589 -87.759269779 - 22.678453304 -87.788395159 - 22.696113725 -87.881163534 - 22.626548026 -87.944725546 - 22.539394459 -87.915450840 -} -85ef20dbfffffff -{ - -85.352940466 -69.896967408 - -85.329688808 -68.775864458 - -85.238304871 -68.499329069 - -85.170976179 -69.309992518 - -85.193461110 -70.396738387 - -85.284022750 -70.706519690 +850228cbfffffff +{ + 79.999632922 -93.891941116 + 79.931260237 -94.231756049 + 79.850618568 -94.061689577 + 79.837945130 -93.557095549 + 79.905706579 -93.215769621 + 79.986750539 -93.380485443 +} +85ac42c3fffffff +{ + -22.988281585 3.778191247 + -23.076451009 3.758303793 + -23.139884653 3.832400563 + -23.115044211 3.926313050 + -23.026876382 3.946018486 + -22.963547257 3.871993543 +} +85f24463fffffff +{ + -73.783869291 -121.381103018 + -73.832058522 -121.131117123 + -73.792206293 -120.841350845 + -73.704461256 -120.803733539 + -73.656735934 -121.052903668 + -73.696293672 -121.340514227 +} +85830147fffffff +{ + -11.555491905 11.736429933 + -11.462912386 11.747588407 + -11.407714087 11.674942786 + -11.445039835 11.591192419 + -11.537536877 11.579991242 + -11.592790661 11.652583050 +} +85136c17fffffff +{ + 65.338436304 -99.452125208 + 65.260599646 -99.584080522 + 65.173780503 -99.492722220 + 65.164559996 -99.270224891 + 65.242150778 -99.137722205 + 65.329207803 -99.228258384 +} +85b28557fffffff +{ + -29.694079084 -77.917394550 + -29.765722727 -77.978222052 + -29.842536450 -77.935004377 + -29.847700942 -77.830946525 + -29.776073077 -77.770169298 + -29.699264971 -77.813399467 +} +858d73affffffff +{ + -15.467171494 104.831199097 + -15.391964363 104.810635584 + -15.374668722 104.725062101 + -15.432630946 104.660068156 + -15.507830226 104.680685400 + -15.525075211 104.766242916 +} +85590a7bfffffff +{ + 18.357890450 4.041391690 + 18.268109270 4.052805764 + 18.228396442 4.137911535 + 18.278446231 4.211743776 + 18.368314558 4.200442299 + 18.408045991 4.115195826 +} +857250d7fffffff +{ + 3.716870700 143.660549068 + 3.621088625 143.675450227 + 3.586273682 143.765616160 + 3.647210772 143.840878458 + 3.742969795 143.826007407 + 3.777814840 143.735843895 +} +8596a257fffffff +{ + -8.286262474 34.957255626 + -8.190111637 34.959968254 + -8.138954540 34.877287691 + -8.183920353 34.791840093 + -8.280096162 34.789060073 + -8.331281262 34.871795049 +} +854a498ffffffff +{ + 25.332910170 142.839049978 + 25.248586764 142.854586032 + 25.215464295 142.947953301 + 25.266669985 143.025784808 + 25.350970515 143.010279672 + 25.384088304 142.916912047 +} +851454abfffffff +{ + 57.172387652 135.667094414 + 57.094310524 135.748143197 + 57.090411776 135.918331783 + 57.164582406 136.008319783 + 57.242895424 135.927732908 + 57.246801958 135.756693248 +} +853a8bc3fffffff +{ + 23.017379173 -53.957003143 + 22.940724939 -53.984895462 + 22.871966135 -53.927691522 + 22.879746575 -53.842539855 + 22.956397141 -53.814480949 + 23.025271065 -53.871740205 +} +855c750ffffffff +{ + 13.093603626 -144.616784921 + 13.002698176 -144.651060446 + 12.928208079 -144.587897585 + 12.944595831 -144.490502594 + 13.035455755 -144.456195614 + 13.109973480 -144.519314925 } -8500c48ffffffff +85d2d247fffffff { - 84.380677757 63.165582500 - 84.396384566 64.079120368 - 84.484089196 64.402013570 - 84.556859671 63.789969064 - 84.540614672 62.850655777 - 84.452148081 62.549613365 + -38.140995006 -99.323998241 + -38.071824985 -99.242600441 + -37.981072115 -99.279485851 + -37.959379762 -99.397526387 + -38.028405408 -99.478988022 + -38.119267679 -99.442345896 +} +854981bbfffffff +{ + 20.258173203 -102.217645839 + 20.336798359 -102.157551157 + 20.424546127 -102.199619418 + 20.433631650 -102.301891770 + 20.354928729 -102.361970454 + 20.267218101 -102.319793010 +} +855fa863fffffff +{ + 7.524124521 -51.600882207 + 7.603867396 -51.551532321 + 7.683268357 -51.595611593 + 7.682936675 -51.688991984 + 7.603246956 -51.738311485 + 7.523835792 -51.694281095 +} +857c8373fffffff +{ + 3.988365517 -15.368237220 + 4.059881855 -15.331030724 + 4.135742650 -15.370961862 + 4.140162844 -15.448170646 + 4.068625874 -15.485462407 + 3.992689296 -15.445460137 +} +852c1e13fffffff +{ + 37.241997999 46.001336773 + 37.176129384 46.079892606 + 37.195361352 46.184834804 + 37.280594723 46.211423604 + 37.346602030 46.132783916 + 37.327237069 46.027639062 +} +85587433fffffff +{ + 16.195183128 10.942915501 + 16.103871117 10.948990668 + 16.059969873 11.034664375 + 16.107331625 11.114380701 + 16.198699090 11.108434091 + 16.242649442 11.022642495 +} +856e96cbfffffff +{ + 7.838164365 -104.749657147 + 7.912387114 -104.696069012 + 7.992621105 -104.736148742 + 7.998570198 -104.829897658 + 7.924258530 -104.883459285 + 7.844086731 -104.843298684 +} +854c3097fffffff +{ + 25.979897156 -66.969108406 + 25.948151639 -67.048776116 + 25.882737296 -67.055621048 + 25.849095490 -66.983000250 + 25.880738382 -66.903470122 + 25.946125516 -66.896423314 +} +85750363fffffff +{ + 6.690976395 -3.856943873 + 6.615581215 -3.842171628 + 6.579130836 -3.770929487 + 6.618058559 -3.714344723 + 6.693539752 -3.729052713 + 6.730007218 -3.800409844 +} +8526b1affffffff +{ + 42.059730060 -107.564639368 + 42.133302494 -107.495361730 + 42.212683648 -107.551054654 + 42.218459666 -107.676147599 + 42.144847187 -107.745352668 + 42.065498764 -107.689537806 +} +85badbdbfffffff +{ + -22.570933683 -178.845984619 + -22.490878734 -178.798773421 + -22.414162786 -178.844885057 + -22.417471792 -178.938068596 + -22.497415627 -178.985278349 + -22.574161490 -178.939306199 +} +8500c5b3fffffff +{ + 85.697930432 57.984193519 + 85.721966591 59.151647460 + 85.812245794 59.470579392 + 85.879251840 58.580570719 + 85.854250837 57.372719162 + 85.763233584 57.096077468 +} +855bb463fffffff +{ + 11.944334482 -176.828755204 + 11.858764506 -176.846395086 + 11.797931348 -176.786261236 + 11.822643296 -176.708391852 + 11.908288868 -176.690662495 + 11.969146903 -176.750892016 +} +8500eb4bfffffff +{ + 87.470297494 65.765142887 + 87.482384046 67.818391229 + 87.568471320 68.686723304 + 87.644541560 67.405342379 + 87.631630151 65.214579346 + 87.543512998 64.448443758 } -8502942bfffffff +85eee143fffffff { - 72.366120307 -138.879249658 - 72.311931690 -139.121696764 - 72.223645982 -139.101279296 - 72.189546093 -138.841034712 - 72.243355108 -138.599637169 - 72.331641748 -138.617431960 + -68.851036057 -35.799494178 + -68.779261089 -35.620479695 + -68.687750936 -35.703766562 + -68.667784178 -35.964383686 + -68.739165648 -36.143609964 + -68.830906452 -36.062016244 } -850a9c23fffffff +851faa0bfffffff { - 57.784702391 103.020648422 - 57.695201473 103.029721018 - 57.651341551 103.169895497 - 57.696823379 103.301216327 - 57.786253235 103.292780209 - 57.830272647 103.152387220 + 49.012655238 8.959100750 + 48.929463304 8.969807467 + 48.899282042 9.089940204 + 48.952277913 9.199612355 + 49.035516737 9.189151205 + 49.065712942 9.068772002 } -85ef10c7fffffff +85e73167fffffff { - -83.149096645 -20.430009910 - -83.063571558 -20.067100198 - -82.983928629 -20.498875315 - -82.988797208 -21.286236412 - -83.073419416 -21.660063371 - -83.154077951 -21.235903309 + -69.297863917 40.525018031 + -69.222318411 40.387888064 + -69.221138659 40.141885047 + -69.295602214 40.031133117 + -69.371516284 40.167552477 + -69.372597809 40.415443813 } -85de35cffffffff +853fb293fffffff { - -58.359808700 -53.514285083 - -58.312310578 -53.363387921 - -58.223951760 -53.366543253 - -58.183099531 -53.519689492 - -58.230356715 -53.670140847 - -58.318706344 -53.667891815 + 28.571926239 9.494357858 + 28.476828795 9.502416513 + 28.435386336 9.598106686 + 28.489019397 9.685891975 + 28.584183534 9.677990312 + 28.625648004 9.582146204 } -859e4da7fffffff +854f9037fffffff { - -20.082372375 155.061049851 - -19.993652179 155.036296982 - -19.968537206 154.939649344 - -20.032085192 154.867606319 - -20.120861924 154.892208818 - -20.146034243 154.989004921 + 22.613283374 162.158361927 + 22.705877778 162.154355567 + 22.750779962 162.063883919 + 22.703009008 161.977543706 + 22.610448928 161.981728778 + 22.565625336 162.072075436 +} +8500b12bfffffff +{ + 75.736966368 71.842667385 + 75.735941133 72.208047034 + 75.814707033 72.382715012 + 75.894907140 72.189633842 + 75.895836852 71.820061321 + 75.816662522 71.647794231 +} +853e457bfffffff +{ + 28.130268714 32.845946450 + 28.034580182 32.833165954 + 27.976954078 32.919529797 + 28.014932295 33.018676591 + 28.110561681 33.031611169 + 28.168272089 32.945245052 +} +851e59affffffff +{ + 45.562099800 32.443683442 + 45.474949423 32.428706274 + 45.419182767 32.533124686 + 45.450505380 32.652528002 + 45.537612957 32.667730334 + 45.593440861 32.563304494 +} +8543093bfffffff +{ + 30.955819954 59.443370644 + 30.881277903 59.506051980 + 30.886660560 59.612525401 + 30.966645815 59.656559992 + 31.041336391 59.593926375 + 31.035893070 59.487210010 +} +855e9ba7fffffff +{ + 18.824902009 -48.012523626 + 18.896364849 -47.963566902 + 18.966330417 -48.008067579 + 18.964863790 -48.101490341 + 18.893451298 -48.150431833 + 18.823455106 -48.105965917 +} +85df500bfffffff +{ + -56.193826200 -61.484115808 + -56.156921082 -61.335235983 + -56.071992520 -61.316274114 + -56.024052968 -61.445445558 + -56.060781903 -61.593775264 + -56.145626012 -61.613482670 +} +85c7156ffffffff +{ + -46.565075348 -139.870099493 + -46.535806662 -139.752796420 + -46.446984567 -139.726189341 + -46.387568330 -139.816591067 + -46.416833726 -139.933520538 + -46.505518589 -139.960421118 +} +85d2cb7bfffffff +{ + -34.209761966 -105.757066999 + -34.146522208 -105.672977202 + -34.055586721 -105.699069394 + -34.027818138 -105.808996772 + -34.090909083 -105.893075910 + -34.181917253 -105.867238721 +} +859e69bbfffffff +{ + -21.880155368 155.935586018 + -21.790262517 155.909503955 + -21.765324406 155.810765325 + -21.830226919 155.737951470 + -21.920180311 155.763880408 + -21.945170754 155.862776557 +} +85739bcbfffffff +{ + -0.685119121 131.113924207 + -0.779829977 131.130308104 + -0.813867626 131.220147920 + -0.753185361 131.293641827 + -0.658435738 131.277267790 + -0.624407096 131.187389915 +} +854ee6abfffffff +{ + 23.623862533 149.039150739 + 23.712380374 149.022517059 + 23.748050630 148.932799839 + 23.695182707 148.859889432 + 23.606763051 148.876660282 + 23.571113089 148.966204602 +} +8532506bfffffff +{ + 37.261972152 162.060783084 + 37.358656300 162.055912518 + 37.403200457 161.948543990 + 37.350999022 161.846222926 + 37.254352095 161.851344726 + 37.209869216 161.958536501 +} +850cf393fffffff +{ + 58.794533615 -163.346984741 + 58.720599223 -163.433743918 + 58.651651591 -163.353292472 + 58.656427638 -163.186562834 + 58.730103816 -163.099438621 + 58.799262004 -163.179406224 +} +85eca3a7fffffff +{ + -64.942328455 141.154093750 + -64.907478930 140.960458864 + -64.964344028 140.796185376 + -65.056327446 140.825413053 + -65.091297415 141.020084883 + -65.034162900 141.184488993 +} +85e576c7fffffff +{ + -66.685767929 115.252318383 + -66.618148094 115.082361339 + -66.643034811 114.848123157 + -66.735708563 114.782521763 + -66.803623770 114.952541109 + -66.778569052 115.188104376 +} +85819297fffffff +{ + -8.133631692 -31.121149832 + -8.050690987 -31.073445088 + -7.968437502 -31.120488662 + -7.969097147 -31.215270424 + -8.052061709 -31.263031155 + -8.134342767 -31.215954256 +} +85e67587fffffff +{ + -67.210109797 8.532139805 + -67.118108056 8.526640299 + -67.070866994 8.318559591 + -67.115346441 8.115016796 + -67.207405632 8.118810174 + -67.254929170 8.327853381 +} +85b0e583fffffff +{ + -22.252032287 -117.194476632 + -22.202820350 -117.116480841 + -22.122795523 -117.124521204 + -22.091975909 -117.210358558 + -22.141065275 -117.288266555 + -22.221096637 -117.280425035 +} +85262d7bfffffff +{ + 43.485486398 -92.491071197 + 43.423094826 -92.575432529 + 43.338700139 -92.537031354 + 43.316561852 -92.414593612 + 43.378761997 -92.330162279 + 43.463291704 -92.368237824 +} +85eeed07fffffff +{ + -67.065881291 -41.726808954 + -67.001158091 -41.544323206 + -66.908006999 -41.597450269 + -66.879432616 -41.831447225 + -66.943788771 -42.013748101 + -67.037085266 -41.962241994 +} +85c6760ffffffff +{ + -36.371263133 -138.296072624 + -36.280087581 -138.275768998 + -36.222422569 -138.359649997 + -36.255889691 -138.463956634 + -36.347111645 -138.484471136 + -36.404820170 -138.400468162 +} +8503262bfffffff +{ + 89.937684450 -172.280549352 + 89.849268168 174.220594178 + 89.777325492 -166.737429823 + 89.759257469 -144.190238597 + 89.803886032 -123.073483968 + 89.893928397 -112.334903952 } -85030d8bfffffff +85ee1027fffffff +{ + -74.275165691 -24.241735599 + -74.191525154 -24.058988948 + -74.106607368 -24.233163742 + -74.104890588 -24.588179078 + -74.188087674 -24.772719277 + -74.273444921 -24.600476959 +} +852776affffffff +{ + 48.809494207 -89.534789503 + 48.745294383 -89.635480805 + 48.655475703 -89.597986221 + 48.629728535 -89.460251268 + 48.693718791 -89.359525895 + 48.783665532 -89.396568417 +} +858c4423fffffff +{ + -11.678273791 98.029000936 + -11.596942219 98.005857465 + -11.575404911 97.916733650 + -11.635234554 97.850787485 + -11.716542227 97.873973644 + -11.738044226 97.963063368 +} +85bf5d97fffffff +{ + -41.083645393 149.293833133 + -40.989303814 149.269464985 + -40.957252089 149.148842506 + -41.019471005 149.052386324 + -41.113827737 149.076483682 + -41.145950566 149.197308296 +} +858d858ffffffff +{ + -8.162669319 112.351043815 + -8.081741943 112.333149556 + -8.062907443 112.250977421 + -8.125078750 112.186696307 + -8.206029064 112.204654529 + -8.224785208 112.286829927 +} +85f2226ffffffff +{ + -78.598942470 -149.802381079 + -78.675167048 -149.626481356 + -78.678260757 -149.182865983 + -78.604939467 -148.921166402 + -78.529161553 -149.101066116 + -78.526256760 -149.538718024 +} +852a963bfffffff +{ + 40.785239326 -84.852677906 + 40.730259034 -84.943448406 + 40.645568620 -84.920226144 + 40.615775210 -84.806581841 + 40.670565996 -84.715850043 + 40.755339441 -84.738723333 +} +85069c23fffffff +{ + 72.778530186 -58.652561298 + 72.752152901 -58.951701417 + 72.661826099 -59.014745227 + 72.598059807 -58.780999769 + 72.624248738 -58.484127365 + 72.714391023 -58.418743422 +} +85d6a0abfffffff +{ + -47.912029537 41.515551109 + -47.987850364 41.511659540 + -48.039236767 41.603233205 + -48.014763304 41.698762124 + -47.938872275 41.702480516 + -47.887524850 41.610843463 +} +851ab0c7fffffff +{ + 46.782039038 -56.931533181 + 46.752448366 -57.059264794 + 46.664485555 -57.089859499 + 46.606237977 -56.993132111 + 46.635750121 -56.865825559 + 46.723588147 -56.834822238 +} +85ba8e47fffffff +{ + -27.996944326 -173.739994228 + -27.913307949 -173.691959742 + -27.833935564 -173.746990665 + -27.838163173 -173.849919592 + -27.921700666 -173.897984805 + -28.001109389 -173.843090644 +} +8503246bfffffff { - 84.995199176 -74.570099882 - 85.037608559 -75.460453270 - 84.990422654 -76.370499576 - 84.902082588 -76.374129589 - 84.860998704 -75.499646985 - 84.906951808 -74.605660118 -} -85f0a2c7fffffff -{ - -73.631368439 89.550453510 - -73.545022587 89.424914240 - -73.529825965 89.096751998 - -73.600839311 88.891361150 - -73.687438852 89.014642550 - -73.702772319 89.345589008 -} -856c4437fffffff -{ - 3.922356561 -88.883335387 - 3.848507037 -88.940613598 - 3.764628676 -88.904544366 - 3.754623349 -88.811147908 - 3.828530026 -88.753859802 - 3.912384832 -88.789977928 -} -850062dbfffffff -{ - 81.341901507 2.165702560 - 81.420991681 2.337914937 - 81.485743669 1.927854821 - 81.470526001 1.344616271 - 81.390986372 1.181117281 - 81.327108983 1.592043831 -} -850a5d43fffffff -{ - 71.178529370 103.619094894 - 71.129043327 103.869641603 - 71.173595052 104.122494114 - 71.268020839 104.126035456 - 71.317857738 103.874168664 - 71.272916147 103.620081042 -} -85cac0c7fffffff -{ - -46.184843876 60.797090110 - -46.268195272 60.812456907 - -46.305930859 60.929713191 - -46.260266344 61.031513019 - -46.176894557 61.015924358 - -46.139207541 60.898757686 -} -85202ebbfffffff -{ - 48.742339768 71.586971239 - 48.655714518 71.654031102 - 48.650550757 71.801204204 - 48.731995710 71.881787604 - 48.818741621 71.815007947 - 48.823921971 71.667363449 -} -85be6acffffffff -{ - -37.172845235 142.859715530 - -37.077519135 142.844573683 - -37.039889251 142.734990216 - -37.097488260 142.640416244 - -37.192793301 142.655303451 - -37.230520550 142.765019343 -} -85052827fffffff -{ - 81.943273638 114.485989548 - 81.880954202 114.996219636 - 81.912011476 115.639294684 - 82.005979020 115.782888607 - 82.069238379 115.270586017 - 82.037581911 114.616661195 -} -85dc71b7fffffff -{ - -53.437676540 -27.184682729 - -53.368217025 -27.100683319 - -53.292415172 -27.168026080 - -53.285869373 -27.318966935 - -53.355099016 -27.403229736 - -53.431104239 -27.336290276 -} -857a4437fffffff -{ - -0.631677094 37.845721548 - -0.540099853 37.847228392 - -0.490338463 37.767530926 - -0.532117998 37.686264276 - -0.623728874 37.684695062 - -0.673526658 37.764454886 -} -8568323bfffffff -{ - 6.891876029 114.410438365 - 6.982020213 114.392650683 - 7.009608323 114.308455595 - 6.946970114 114.242039056 - 6.856765657 114.259898034 - 6.829259652 114.344102273 -} -85b48a67fffffff -{ - -19.664968251 -151.999788906 - -19.574610428 -151.969551365 - -19.504073663 -152.038462641 - -19.523802297 -152.137620272 - -19.614124735 -152.167991720 - -19.684754017 -152.099071822 -} -85d48c57fffffff -{ - -43.303030951 -155.514200196 - -43.216934536 -155.472239000 - -43.148713931 -155.556951910 - -43.166531120 -155.683602527 - -43.252595280 -155.725757061 - -43.320874599 -155.641068090 -} -85910d93fffffff -{ - -12.823543568 -126.595744474 - -12.746674067 -126.590217712 - -12.692934129 -126.652812813 - -12.716002098 -126.721040258 - -12.792928950 -126.726678834 - -12.846730547 -126.663978076 -} -8503260ffffffff -{ - 89.709923472 115.779614303 - 89.643401505 126.975075803 - 89.643742146 142.153644237 - 89.710116334 153.656841448 - 89.798933506 148.511147329 - 89.799258488 121.429000141 -} -8596104bfffffff -{ - -10.934392693 32.062241278 - -10.837309690 32.066154119 - -10.785246994 31.982555870 - -10.830238081 31.895002547 - -10.927332226 31.891020891 - -10.979424223 31.974661362 -} -85553297fffffff -{ - 26.915602690 -13.834152070 - 26.844523335 -13.904932792 - 26.755551435 -13.873135676 - 26.737634218 -13.770743320 - 26.808603454 -13.699992481 - 26.897599901 -13.731603895 -} -850c614bfffffff -{ - 61.692037718 -143.429273717 - 61.635815584 -143.567789757 - 61.558426086 -143.541381634 - 61.537211725 -143.377390453 - 61.593164707 -143.239114708 - 61.670600485 -143.264588454 -} -85030bcbfffffff -{ - 83.812177450 -94.189546385 - 83.825708359 -95.006063883 - 83.755006613 -95.552630579 - 83.671954879 -95.285995617 - 83.658937861 -94.488884443 - 83.728467005 -93.939296829 -} -850b4157fffffff -{ - 70.233399532 74.758573085 - 70.226028721 75.020584449 - 70.298749242 75.157078197 - 70.379166913 75.030528306 - 70.386499072 74.766366490 - 70.313452311 74.630916576 -} -85028c27fffffff -{ - 73.218914778 -121.998317779 - 73.130530612 -122.073373158 - 73.068584209 -121.865068797 - 73.094684168 -121.581336664 - 73.182972788 -121.503850414 - 73.245258359 -121.712518747 -} -85ab7387fffffff -{ - -16.684233317 71.990312641 - -16.777969179 72.010625200 - -16.808165703 72.106378834 - -16.744579492 72.181716803 - -16.650876559 72.161287812 - -16.620726816 72.065637147 -} -85ec4837fffffff -{ - -79.579790421 130.601797444 - -79.538743508 130.185623900 - -79.584729635 129.752470653 - -79.672265170 129.732374860 - -79.713810348 130.152199103 - -79.667317428 130.588464451 -} -85655cd7fffffff -{ - 3.693053558 93.965407672 - 3.786061758 93.939993430 - 3.811037557 93.846231474 - 3.742994981 93.777931830 - 3.650016182 93.803382701 - 3.625050507 93.897096699 -} -85d13307fffffff -{ - -38.307271079 6.087358422 - -38.400435920 6.066599492 - -38.460635604 6.156155268 - -38.427593818 6.266346317 - -38.334458679 6.286841751 - -38.274335478 6.197409725 -} -85b34e9bfffffff -{ - -24.056582556 -62.711333315 - -24.132973346 -62.760497034 - -24.206187385 -62.719014288 - -24.202978638 -62.628414944 - -24.126632004 -62.579356177 - -24.053449985 -62.620791717 -} -85b6a4c7fffffff -{ - -29.627758938 -87.437130131 - -29.695211118 -87.500746341 - -29.775341916 -87.460032982 - -29.788035326 -87.355648474 - -29.720588628 -87.292028377 - -29.640443069 -87.332796502 -} -85a06a47fffffff -{ - -17.486644694 -145.832804172 - -17.397873391 -145.808703545 - -17.331058088 -145.878246847 - -17.352921609 -145.971937048 - -17.441684721 -145.996180469 - -17.508592615 -145.926591007 -} -85c2cd2ffffffff -{ - -31.424731466 -60.501437602 - -31.497257912 -60.549948256 - -31.561384003 -60.507900409 - -31.552969540 -60.417398262 - -31.480493250 -60.369002645 - -31.416381295 -60.410994063 -} -85c970c7fffffff -{ - -46.191833959 116.418538707 - -46.126698888 116.322599712 - -46.148281262 116.193439449 - -46.235126087 116.159823633 - -46.300463394 116.255803240 - -46.278753322 116.385358810 -} -85d352c7fffffff -{ - -48.085111244 -114.132609380 - -48.026735025 -114.016855954 - -47.930308043 -114.034768383 - -47.892239929 -114.167982083 - -47.950478572 -114.283580161 - -48.046922605 -114.266120223 -} -8581262bfffffff -{ - -15.855261077 -42.346839732 - -15.775075451 -42.295490497 - -15.692905283 -42.343453398 - -15.690933300 -42.442751482 - -15.771130383 -42.494109976 - -15.853287988 -42.446161280 -} -853ce027fffffff -{ - 26.029901404 91.544025486 - 26.115684822 91.516152511 - 26.135901922 91.415824430 - 26.070354576 91.343431076 - 25.984583042 91.371338551 - 25.964346909 91.471605022 -} -8578a3dbfffffff -{ - -2.837471058 -140.404686129 - -2.921448692 -140.437570416 - -2.987383719 -140.380863212 - -2.969396240 -140.291327392 - -2.885491112 -140.258429672 - -2.819500957 -140.315081082 -} -8500c90ffffffff -{ - 88.450889510 130.657442515 - 88.373649653 132.486021802 - 88.374562801 135.822606521 - 88.452705682 137.666484666 - 88.534224866 136.015504186 - 88.533319637 132.317971633 -} -851b7423fffffff -{ - 57.399004589 -36.647432302 - 57.397737781 -36.807530196 - 57.319011532 -36.892540354 - 57.241783421 -36.817685567 - 57.243142845 -36.658326242 - 57.321637995 -36.573085407 -} -85f10b77fffffff -{ - -83.488826368 81.334386141 - -83.461617577 80.570148450 - -83.521587297 80.009245110 - -83.609891247 80.212071556 - -83.637608211 80.993232001 - -83.576503591 81.554421631 -} -85e7288ffffffff -{ - -72.317682824 33.705148025 - -72.234791454 33.572511586 - -72.224651301 33.278895570 - -72.297405976 33.115237800 - -72.380681196 33.246297862 - -72.390818030 33.542608224 -} -85514027fffffff -{ - 15.963101911 -137.220820006 - 15.875674554 -137.256767402 - 15.800516490 -137.197817747 - 15.812776674 -137.102999386 - 15.900141370 -137.067048617 - 15.975308547 -137.125919439 -} -85a98887fffffff -{ - -26.224021040 -44.847952898 - -26.153029200 -44.795596997 - -26.078398212 -44.843918212 - -26.074784446 -44.944569517 - -26.145793793 -44.996922983 - -26.220399398 -44.948627736 -} -8548a6abfffffff -{ - 24.402052322 -100.639606095 - 24.479867758 -100.576872921 - 24.568573889 -100.618981943 - 24.579440443 -100.723947811 - 24.501553444 -100.786674567 - 24.412871511 -100.744442109 -} -8539a5b3fffffff -{ - 36.311679392 -10.409330235 - 36.243956850 -10.489835732 - 36.152301888 -10.458844122 - 36.128373599 -10.347587661 - 36.196003934 -10.267150741 - 36.287654633 -10.297901479 -} -8596964bfffffff -{ - -4.100640948 37.543218454 - -4.006781039 37.544865943 - -3.956502670 37.463956150 - -4.000053820 37.381335879 - -4.093948869 37.379624065 - -4.144257702 37.460596865 -} -856750d3fffffff -{ - 12.018698768 -71.085537836 - 11.955393450 -71.135193252 - 11.878600335 -71.097154657 - 11.865183973 -71.009474288 - 11.928533792 -70.959882104 - 12.005255493 -70.997906955 -} -85034a53fffffff -{ - 78.658870105 -68.715337144 - 78.620473338 -69.131928261 - 78.532611042 -69.153246764 - 78.483215116 -68.763661300 - 78.521166999 -68.350624132 - 78.608956026 -68.323629167 -} -85e12947fffffff -{ - -67.447052455 61.088946849 - -67.355225254 61.104576583 - -67.303583128 60.917699314 - -67.343484583 60.714827186 - -67.435188974 60.697736537 - -67.487115557 60.884976124 -} -8570ee27fffffff -{ - -1.419476094 -166.505672824 - -1.502436979 -166.528636895 - -1.568955051 -166.466834949 - -1.552576876 -166.382008509 - -1.469600379 -166.358964408 - -1.403017593 -166.420826733 -} -85f074c3fffffff -{ - -80.677356691 49.453181603 - -80.607366404 49.076278091 - -80.624054949 48.536198636 - -80.711120813 48.364324350 - -80.781900425 48.740447279 - -80.764820486 49.289312588 -} -8522f307fffffff -{ - 52.430743053 -167.157521160 - 52.510968780 -167.120102660 - 52.577658465 -167.216201547 - 52.564053159 -167.349887623 - 52.483733285 -167.387076592 - 52.417112798 -167.290809884 -} -852b98bbfffffff -{ - 44.470076654 -78.244476657 - 44.418164755 -78.351501107 - 44.328543225 -78.339185834 - 44.290794489 -78.220289202 - 44.342516885 -78.113412661 - 44.432177164 -78.125284529 -} -850d226bfffffff -{ - 73.911406306 -156.604991500 - 73.836129994 -156.808378330 - 73.750855903 -156.684736505 - 73.740568228 -156.360172384 - 73.815366455 -156.156102834 - 73.900929249 -156.277260306 -} -8534755bfffffff -{ - 32.602586422 -19.455236681 - 32.527204377 -19.527587341 - 32.436741321 -19.486795066 - 32.421613243 -19.373840623 - 32.496892006 -19.301473988 - 32.587402033 -19.342077403 -} -850eea8ffffffff -{ - 52.379139136 -79.630439544 - 52.322475327 -79.757253886 - 52.227609640 -79.739102036 - 52.189352093 -79.594770345 - 52.245802610 -79.468139853 - 52.340723505 -79.485656521 -} -85f13193fffffff -{ - -82.805170477 136.226053027 - -82.857910401 135.672986959 - -82.940669133 135.797885539 - -82.970308312 136.490522603 - -82.916509109 137.046205608 - -82.834139525 136.906748266 -} -859d5a1bfffffff -{ - -18.450120788 141.989494904 - -18.363142847 141.978177966 - -18.332659516 141.890542608 - -18.389046217 141.814142904 - -18.476014153 141.825294500 - -18.506605537 141.913011168 -} -85d00487fffffff -{ - -44.369627027 12.126904470 - -44.460270879 12.113210459 - -44.511092077 12.210996996 - -44.471220478 12.322278734 - -44.380636481 12.335670300 - -44.329864088 12.238082486 -} -85ee8c6bfffffff -{ - -69.355087393 -16.232715827 - -69.267104781 -16.126401324 - -69.189963131 -16.289608871 - -69.200413518 -16.558572361 - -69.288121123 -16.666418578 - -69.365653988 -16.503780467 -} -85f2918bfffffff -{ - -89.018632911 -150.927315327 - -89.103120493 -148.734805643 - -89.104985141 -142.909381139 - -89.021585338 -140.264279349 - -88.943093387 -142.950971577 - -88.941937532 -147.885299009 -} -85f231cbfffffff -{ - -79.422490907 -154.662115840 - -79.501846159 -154.510963304 - -79.512526555 -154.037626519 - -79.443538238 -153.722109184 - -79.364574552 -153.878740979 - -79.354204780 -154.345469767 -} -8598ed93fffffff -{ - -18.885422437 -1.956073089 - -18.970816541 -1.981212651 - -19.036190876 -1.912195339 - -19.016056430 -1.818068853 - -18.930629601 -1.793088303 - -18.865369812 -1.862075068 -} -859b0287fffffff -{ - -21.580693879 -172.534912007 - -21.496536413 -172.490176582 - -21.419977604 -172.543353390 - -21.427522778 -172.641149516 - -21.511574597 -172.685919220 - -21.588186839 -172.632858762 -} -85df8117fffffff -{ - -60.567227059 -45.967128969 - -60.509843418 -45.817027217 - -60.419940755 -45.844684847 - -60.387347358 -46.021419651 - -60.444440370 -46.171256207 - -60.534416632 -46.144624756 -} -85f006b3fffffff -{ - -79.568588317 77.910827966 - -79.481900729 77.810438331 - -79.448987674 77.347358408 - -79.502380946 76.979840137 - -79.589252161 77.073833180 - -79.622550306 77.541768153 -} -85f29e67fffffff -{ - -88.480656153 -54.533911335 - -88.434052448 -51.538773792 - -88.341691542 -51.698542627 - -88.295737750 -54.522009968 - -88.338266996 -57.344411214 - -88.430590075 -57.515234664 -} -852742a3fffffff -{ - 45.223158563 -88.026414667 - 45.162499577 -88.121554131 - 45.074686789 -88.089874790 - 45.047421212 -87.963452615 - 45.107878696 -87.868308528 - 45.195803014 -87.899590413 -} -85508653fffffff -{ - 23.839721210 -122.055419811 - 23.923863056 -122.008538076 - 24.004288647 -122.063134234 - 24.000489353 -122.164612255 - 23.916329567 -122.211364428 - 23.835986964 -122.156768359 -} -85a725b7fffffff -{ - -32.308937400 113.012474615 - -32.251453933 112.944331213 - -32.264374804 112.846286151 - -32.334857571 112.816147961 - -32.392503452 112.884282197 - -32.379503975 112.982564171 -} -8552324ffffffff -{ - 19.255103132 39.919056256 - 19.164471467 39.902100043 - 19.108597650 39.974471733 - 19.143256631 40.063759817 - 19.233797841 40.080822542 - 19.289770560 40.008490857 -} -85f26283fffffff -{ - -73.326889912 -127.503229798 - -73.381067144 -127.284316610 - -73.349951785 -126.993781482 - -73.264863614 -126.924557026 - -73.211141607 -127.143313295 - -73.242053956 -127.431462342 -} -857e1097fffffff -{ - -1.803539621 176.459374548 - -1.875570721 176.447070985 - -1.934109145 176.498389593 - -1.920669832 176.562099112 - -1.848586727 176.574472577 - -1.789994900 176.523066582 -} -85f2d083fffffff -{ - -82.603817240 -92.952131666 - -82.617138889 -92.238030956 - -82.541701789 -91.802608631 - -82.453919619 -92.077682802 - -82.440921762 -92.776886756 - -82.515387200 -93.215710394 -} -8562830ffffffff -{ - 4.320063885 56.110161606 - 4.398636658 56.105357203 - 4.443939472 56.038821312 - 4.410681726 55.976997885 - 4.332028999 55.981765450 - 4.286713968 56.048393337 -} -85472cd3fffffff -{ - 35.477707816 -169.193107200 - 35.567761851 -169.165877686 - 35.632461526 -169.243594435 - 35.607015219 -169.348627451 - 35.516848775 -169.375704173 - 35.452241026 -169.297901074 -} -852743cffffffff -{ - 44.696683662 -87.838977267 - 44.636542624 -87.933296842 - 44.549100716 -87.902340269 - 44.521690245 -87.777453191 - 44.581631069 -87.683132061 - 44.669182333 -87.713698774 -} -85f0cc0bfffffff -{ - -71.778976456 51.598235281 - -71.716491946 51.406129523 - -71.731958558 51.138507451 - -71.813131279 51.065406658 - -71.879003697 51.262019994 - -71.863281635 51.531733251 - -71.822604926 51.567319219 -} -8532994ffffffff -{ - 45.056200946 173.469855583 - 45.150036357 173.479804444 - 45.203778077 173.367709890 - 45.163595353 173.245758410 - 45.069731911 173.236119058 - 45.016079025 173.348121454 -} -8534ab2bfffffff -{ - 29.646695463 -30.932834490 - 29.565778871 -30.992756127 - 29.479816150 -30.941761730 - 29.474673130 -30.830949548 - 29.555503293 -30.770919354 - 29.641562906 -30.821809489 -} -85b6751bfffffff -{ - -26.427330832 -99.902368770 - -26.366566879 -99.833792923 - -26.283936229 -99.863903913 - -26.261972053 -99.962418459 - -26.322595060 -100.031034177 - -26.405323097 -100.001095826 -} -85ec8913fffffff -{ - -66.648257994 131.083827334 - -66.600369406 130.885423742 - -66.646725847 130.681684934 - -66.741240322 130.675686208 - -66.789349571 130.874937945 - -66.742722701 131.079339589 -} -8556b143fffffff -{ - 13.063931168 -43.063318057 - 13.139907944 -43.013955648 - 13.217147523 -43.059905023 - 13.218446182 -43.155200947 - 13.142511136 -43.204568832 - 13.065235709 -43.158635452 -} -85e1261bfffffff -{ - -68.577382761 74.256991250 - -68.484134506 74.220047760 - -68.447684300 73.987948942 - -68.504232768 73.791668669 - -68.597505750 73.826878205 - -68.634206648 74.060104194 -} -85777203fffffff -{ - 7.517560395 158.164032368 - 7.426863355 158.175558810 - 7.390828844 158.255567386 - 7.445428626 158.324005602 - 7.536042369 158.312520582 - 7.572139625 158.232555918 -} -85629287fffffff -{ - 3.360361799 53.414665286 - 3.441624723 53.410640562 - 3.487718938 53.341239918 - 3.452564134 53.275771538 - 3.371223523 53.279754373 - 3.325115388 53.349247534 -} -855c4d0ffffffff -{ - 9.161771570 -139.845273294 - 9.072657203 -139.879917137 - 8.999159088 -139.820700450 - 9.014744831 -139.726903808 - 9.103792261 -139.692247206 - 9.177320887 -139.751399865 -} -851f1daffffffff -{ - 53.118455962 14.369048407 - 53.038850404 14.374057880 - 53.005526699 14.501843098 - 53.051767780 14.624849783 - 53.131397387 14.620139838 - 53.164762045 14.492123449 -} -85ee66b7fffffff -{ - -71.617511598 -58.929592494 - -71.574951590 -58.655547743 - -71.478861189 -58.633795801 - -71.425425185 -58.883416126 - -71.467660360 -59.155709225 - -71.563654471 -59.180129323 -} -851d7153fffffff -{ - 51.029983593 -134.504858832 - 50.954227454 -134.509063816 - 50.902914707 -134.408511808 - 50.927215960 -134.303508505 - 51.003019122 -134.298851634 - 51.054474314 -134.399650047 -} -85033557fffffff -{ - 88.550099065 172.476995456 - 88.458482336 172.035819136 - 88.399362209 174.731997931 - 88.427158659 177.936883728 - 88.517035743 178.727533694 - 88.581081179 175.978307866 -} -85e82823fffffff -{ - -61.881915456 -93.531431962 - -61.808657933 -93.412521698 - -61.727130206 -93.484878459 - -61.718714091 -93.675640424 - -61.791817619 -93.794886370 - -61.873491147 -93.723037531 -} -85cd060ffffffff -{ - -47.537809666 92.622721022 - -47.455235073 92.564037370 - -47.448873451 92.425473555 - -47.525028365 92.345092799 - -47.607746991 92.403423705 - -47.614166825 92.542489399 -} -85092dbbfffffff -{ - 69.017885997 -4.433167993 - 69.059966711 -4.601544286 - 69.018833019 -4.791094468 - 68.935758310 -4.811216349 - 68.893961595 -4.643189863 - 68.934956274 -4.454689009 -} -8523a92ffffffff -{ - 42.913050657 -162.993492866 - 42.996875817 -162.957564199 - 43.065766472 -163.032696526 - 43.050770516 -163.143914633 - 42.966828302 -163.179711960 - 42.897999110 -163.104423052 -} -850115abfffffff -{ - 72.067078797 33.519132767 - 72.113418446 33.723962838 - 72.193009938 33.669601572 - 72.226062551 33.408237930 - 72.179301207 33.203080180 - 72.099910250 33.259606657 -} -85d10a6bfffffff -{ - -41.393085663 11.033229800 - -41.484849371 11.018575970 - -41.538614926 11.112323823 - -41.500560615 11.220550699 - -41.408852926 11.234924173 - -41.355143396 11.141351081 -} -858aa443fffffff -{ - -8.101950261 -56.755848364 - -8.023269459 -56.706717549 - -7.939431580 -56.749479557 - -7.934311982 -56.841305155 - -8.012962795 -56.890384789 - -8.096763194 -56.847690099 -} -850d23c3fffffff -{ - 74.014822191 -153.028165491 - 73.943331924 -153.247796767 - 73.856454241 -153.143520789 - 73.840827704 -152.822349171 - 73.911835230 -152.602443118 - 73.998950472 -152.703965751 -} -85f39507fffffff -{ - -81.343246078 162.406308525 - -81.419220073 162.159834195 - -81.484661073 162.508984871 - -81.473290175 163.107767513 - -81.396650954 163.347089478 - -81.332045503 162.994898061 -} -85f28607fffffff -{ - -87.345648383 -157.905118887 - -87.433096297 -157.379542221 - -87.450828138 -155.394454263 - -87.379786985 -154.048594575 - -87.293835415 -154.672123660 - -87.277377080 -156.547450942 + 89.319227930 27.832245800 + 89.382712655 33.586913293 + 89.474451169 31.598055270 + 89.495702293 21.599649138 + 89.420214214 16.232278879 + 89.336340113 20.107058094 +} +8526cbb7fffffff +{ + 32.217339872 -96.226725369 + 32.289749791 -96.158329313 + 32.378091077 -96.198978506 + 32.394026173 -96.308182881 + 32.321558755 -96.376604760 + 32.233213802 -96.335796673 +} +85ee5123fffffff +{ + -68.092074461 -45.914236356 + -68.032130148 -45.711765134 + -67.937448366 -45.749509144 + -67.902614466 -45.987860990 + -67.962189611 -46.189852270 + -68.056966486 -46.153975598 +} +85bf003bfffffff +{ + -40.063885609 161.362049076 + -39.972705993 161.323667826 + -39.953266794 161.201212465 + -40.024995465 161.116875291 + -40.116250337 161.155058878 + -40.135701367 161.277777825 +} +85b3b27bfffffff +{ + -20.984201493 -81.249093798 + -21.060371701 -81.309429512 + -21.145747176 -81.268092330 + -21.154944282 -81.166393090 + -21.078777091 -81.106087415 + -20.993409805 -81.147450771 +} +85d62e2bfffffff +{ + -50.171388101 34.086147217 + -50.248110384 34.102834313 + -50.271085455 34.197114484 + -50.217387060 34.274407279 + -50.140782279 34.257524166 + -50.117758409 34.163543740 +} +8551447bfffffff +{ + 14.837036966 -136.343579430 + 14.749796399 -136.379420960 + 14.674871258 -136.321457222 + 14.687176374 -136.227733241 + 14.774349977 -136.191891647 + 14.849285427 -136.249773962 +} +85c88833fffffff +{ + -34.056559126 104.973722201 + -33.992661968 104.912321176 + -33.999606191 104.807609142 + -34.070482960 104.764012884 + -34.134541498 104.825322766 + -34.127561801 104.930320604 +} +85e21a13fffffff +{ + -59.031179450 -128.176253202 + -58.993983587 -128.019418672 + -58.903148075 -128.009548999 + -58.849581942 -128.155828646 + -58.886689174 -128.312120792 + -58.977450788 -128.322674699 +} +85dc4d97fffffff +{ + -50.098185635 -32.685529300 + -50.168385476 -32.758323670 + -50.249433449 -32.697285695 + -50.260261709 -32.563139231 + -50.189967723 -32.490357630 + -50.108939712 -32.551709055 +} +85f3068ffffffff +{ + -74.806775308 -170.960948669 + -74.883740941 -170.950569164 + -74.914038564 -170.663579787 + -74.866948355 -170.388842461 + -74.789994299 -170.402365324 + -74.760116598 -170.687485503 +} +85b96c73fffffff +{ + -38.987001294 123.459696944 + -38.936335834 123.375126100 + -38.948769643 123.344075888 + -38.965221235 123.274846826 + -39.044877882 123.258872358 + -39.099868903 123.347048799 + -39.075034744 123.451088550 +} +858ef43bfffffff +{ + -14.512393597 -86.420912614 + -14.589380973 -86.481261916 + -14.678571907 -86.442200094 + -14.690774124 -86.342743111 + -14.613770174 -86.282395621 + -14.524580610 -86.321503150 +} +85ed4963fffffff +{ + -77.792155017 163.470494087 + -77.795553746 163.095225175 + -77.873036654 162.909364945 + -77.947432586 163.101611222 + -77.943923124 163.481460208 + -77.866129120 163.664447368 +} +850d12affffffff +{ + 70.949927160 -167.599226287 + 70.865321595 -167.727744741 + 70.788495695 -167.573483423 + 70.795914913 -167.291766351 + 70.880152728 -167.161897153 + 70.957339155 -167.315081937 +} +85f25203fffffff +{ + -77.452453327 -115.399180902 + -77.496104586 -115.045161372 + -77.447837260 -114.684414070 + -77.356391825 -114.680526187 + -77.313291465 -115.032104593 + -77.361089292 -115.390014906 +} +851f03cffffffff +{ + 53.706177293 12.304570210 + 53.627718778 12.312101938 + 53.597155174 12.441157300 + 53.645014360 12.562935718 + 53.723502811 12.555701640 + 53.754102314 12.426391185 +} +8550e407fffffff +{ + 24.045751296 -131.970944303 + 23.965433258 -132.008369502 + 23.890527698 -131.951948600 + 23.895958903 -131.858206106 + 23.976223528 -131.820797655 + 24.051110374 -131.877114823 +} +851425d3fffffff +{ + 58.059804683 121.511623798 + 57.992855257 121.627645248 + 58.008097958 121.796759698 + 58.090423478 121.850650647 + 58.157653915 121.734698849 + 58.142277353 121.564784046 +} +853f6b87fffffff +{ + 36.176021532 32.076334124 + 36.082003994 32.063204692 + 36.024252559 32.157472514 + 36.060448770 32.264879281 + 36.154416064 32.278192147 + 36.212237506 32.183915029 +} +859004bbfffffff +{ + -11.090092439 -122.454787652 + -11.017932090 -122.452775486 + -10.967339252 -122.511585452 + -10.988852604 -122.572510643 + -11.061073885 -122.574617743 + -11.111720932 -122.515704634 +} +8597020ffffffff +{ + -19.428280099 33.657764099 + -19.332244305 33.661150255 + -19.282123204 33.574501829 + -19.328030034 33.484413906 + -19.424085792 33.480953724 + -19.474214837 33.567655489 +} +85725d37fffffff +{ + 4.094223290 147.970030606 + 3.999322485 147.984068165 + 3.964339649 148.072221057 + 4.024213756 148.146319851 + 4.119071719 148.132317450 + 4.154098465 148.044181055 +} +857a5977fffffff +{ + 3.528497313 36.005537774 + 3.616994897 36.007721111 + 3.665798668 35.929069978 + 3.626151122 35.848182060 + 3.537631475 35.845937794 + 3.488781350 35.924642385 +} +85f28193fffffff +{ + -85.883788665 -133.600636698 + -85.953005498 -132.778578456 + -85.932131767 -131.524988352 + -85.842659002 -131.139840713 + -85.775158191 -131.968034628 + -85.795432501 -133.176285756 +} +8503336bfffffff +{ + 86.576457422 -150.620507788 + 86.508979500 -151.673344404 + 86.418116610 -151.244639121 + 86.393692651 -149.822262643 + 86.459104449 -148.770275790 + 86.550971644 -149.138342211 +} +855b8d23fffffff +{ + 13.900569474 176.769542646 + 13.984906271 176.779402366 + 14.031893612 176.704460449 + 13.994429429 176.619682918 + 13.910049511 176.609964689 + 13.863176773 176.684882391 +} +85a8d973fffffff +{ + -12.926103284 -49.226872934 + -12.846430966 -49.175735334 + -12.762244491 -49.221945346 + -12.757756202 -49.319250194 + -12.837421594 -49.370365730 + -12.921582201 -49.324198617 +} +85ec5eb3fffffff +{ + -75.816592299 132.924163523 + -75.776118359 132.606677509 + -75.825601517 132.290706746 + -75.915955425 132.290765399 + -75.956766278 132.610559305 + -75.906883936 132.927981579 +} +858293bbfffffff +{ + 3.921920254 15.896517267 + 4.008498044 15.905808025 + 4.054374806 15.834185191 + 4.013751053 15.753303928 + 3.927231333 15.743968335 + 3.881277243 15.815558773 +} +85c2f147fffffff +{ + -34.776538765 -56.090046317 + -34.721931581 -56.038501345 + -34.654579745 -56.083517747 + -34.641871203 -56.180007790 + -34.696492127 -56.231499415 + -34.763807852 -56.186554455 +} +85da09cbfffffff +{ + -53.129435794 162.777247876 + -53.048053772 162.728784667 + -53.034245403 162.580207268 + -53.101807064 162.479699007 + -53.183262894 162.527886129 + -53.197083360 162.676858563 +} +85043313fffffff +{ + 74.099767566 136.359872787 + 74.013520331 136.524377960 + 74.009075452 136.877253387 + 74.090843505 137.069272057 + 74.177511751 136.906858848 + 74.181991239 136.550309242 +} +85d8f02bfffffff +{ + -44.238617721 133.155820778 + -44.147234668 133.152561676 + -44.100347259 133.044793731 + -44.144739634 132.940227437 + -44.236053124 132.943199014 + -44.283043940 133.051024190 +} +85bf0263fffffff +{ + -38.593745343 161.765925115 + -38.502286856 161.727836647 + -38.482944236 161.607710287 + -38.555050299 161.525417912 + -38.646586947 161.563319024 + -38.665939449 161.683700365 +} +8517911bfffffff +{ + 52.076237257 149.215552277 + 52.160415111 149.191285445 + 52.183571212 149.059064490 + 52.122545988 148.951485401 + 52.038449772 148.976050892 + 52.015297010 149.107897555 +} +85c37463fffffff +{ + -39.819416106 -65.461261223 + -39.744717275 -65.436670927 + -39.680886667 -65.503759827 + -39.691623982 -65.595523066 + -39.766330693 -65.620374845 + -39.830292389 -65.553202049 +} +85b721c3fffffff +{ + -38.281454426 -98.058460141 + -38.211497091 -97.978646823 + -38.121281950 -98.017317146 + -38.100908483 -98.135567767 + -38.170723751 -98.215459602 + -38.261054466 -98.177022929 +} +850e340ffffffff +{ + 64.449667150 -78.120005956 + 64.393604346 -78.303834724 + 64.297026079 -78.282901332 + 64.256457572 -78.079441876 + 64.312257694 -77.896053645 + 64.408888119 -77.915682787 +} +853adbaffffffff +{ + 18.736706336 -48.994287727 + 18.808368819 -48.945406971 + 18.878063541 -48.989627545 + 18.876125072 -49.082690669 + 18.804514501 -49.131552222 + 18.734790510 -49.087369973 +} +85166b43fffffff +{ + 55.055768062 -178.470869784 + 55.138920672 -178.446882705 + 55.196352663 -178.568090910 + 55.170536247 -178.713297223 + 55.087324847 -178.736906752 + 55.029988455 -178.615688280 +} +853cf287fffffff +{ + 22.855356609 88.755896554 + 22.942855010 88.727766454 + 22.962264197 88.629284696 + 22.894204100 88.558999739 + 22.806730009 88.587154658 + 22.787291651 88.685569854 +} +85484a6ffffffff +{ + 32.174855022 -117.005853965 + 32.258163697 -116.950411417 + 32.339148503 -117.007037218 + 32.336763552 -117.119141812 + 32.253431823 -117.174460553 + 32.172508078 -117.117798823 +} +858c2e83fffffff +{ + -11.352453666 104.791137207 + -11.272166904 104.770268548 + -11.252739246 104.683466760 + -11.313653612 104.617550223 + -11.393936684 104.638474076 + -11.413309160 104.725259334 +} +858ca3b3fffffff +{ + -3.965614588 107.804048131 + -3.878923719 107.783898859 + -3.856545214 107.696889012 + -3.920926015 107.630037396 + -4.007633968 107.650248611 + -4.029944107 107.737249550 +} +85ec813bfffffff +{ + -64.765663317 135.435348952 + -64.722896458 135.246420359 + -64.773770196 135.067526232 + -64.867677799 135.077175784 + -64.910616792 135.266982126 + -64.859475270 135.446259437 +} +85c82c2ffffffff +{ + -43.183383246 110.024273225 + -43.114549276 109.942559145 + -43.128213731 109.817602932 + -43.210791408 109.773966135 + -43.279821157 109.855620598 + -43.266077247 109.980972340 +} +850304abfffffff +{ + 88.114891815 -103.771789581 + 88.113815128 -106.534719566 + 88.030997546 -107.843384207 + 87.952533524 -106.507539672 + 87.953804624 -103.963015343 + 88.033351382 -102.547741913 +} +857c6b93fffffff +{ + 3.327044568 -30.936159134 + 3.406833635 -30.889299445 + 3.489479393 -30.935552051 + 3.492388078 -31.028697407 + 3.412601494 -31.075611939 + 3.329903721 -31.029326383 +} +853f2e43fffffff +{ + 37.124662742 19.268579142 + 37.029663484 19.267838353 + 36.982327698 19.371556541 + 37.029943964 19.476135578 + 37.124957323 19.477083945 + 37.172340461 19.373245668 +} +85c8b003fffffff +{ + -32.367501991 111.497763727 + -32.309035851 111.431061325 + -32.320827756 111.332115428 + -32.391156499 111.299627548 + -32.449785153 111.366306356 + -32.437922387 111.465497050 +} +854e33abfffffff +{ + 20.269820096 154.214474666 + 20.358355790 154.202990032 + 20.397843357 154.114946272 + 20.348746236 154.038537187 + 20.260283254 154.050170122 + 20.220844589 154.138064013 +} +8507acc3fffffff +{ + 75.109515746 -17.062888736 + 75.143131535 -17.350563164 + 75.089104131 -17.594338293 + 75.001783558 -17.549347641 + 74.968485934 -17.263630035 + 75.022192480 -17.020950901 +} +85e5826bfffffff +{ + -53.676426698 113.809251872 + -53.606230274 113.698240148 + -53.627026853 113.540954861 + -53.718142282 113.494076988 + -53.788563934 113.605082980 + -53.767644557 113.762974119 +} +85a270bbfffffff +{ + -18.412158311 54.717566439 + -18.504200327 54.724637388 + -18.541638182 54.810064440 + -18.486933154 54.888397748 + -18.394835387 54.881196927 + -18.357498324 54.795792713 +} +8500f063fffffff +{ + 82.263998193 71.180297989 + 82.266451166 71.857493738 + 82.348766208 72.179248060 + 82.429374799 71.815455132 + 82.426776370 71.123723854 + 82.343716590 70.810523373 +} +85bc8bdbfffffff +{ + -25.677233048 34.154440423 + -25.584569345 34.157706988 + -25.537203352 34.068653019 + -25.582503800 33.976273558 + -25.675188143 33.972928793 + -25.722551485 34.062041690 +} +8500ce93fffffff +{ + 86.550211164 83.962339823 + 86.533424753 85.462415153 + 86.604203148 86.503472912 + 86.693873556 86.034839860 + 86.711442450 84.464378688 + 86.638530886 83.434979899 +} +851e5613fffffff +{ + 47.055677669 24.632401975 + 46.968540987 24.625594343 + 46.920446353 24.739002457 + 46.959432332 24.859313263 + 47.046557606 24.866379240 + 47.094708481 24.752876186 +} +8537b183fffffff +{ + 37.761016669 -158.041937198 + 37.683054288 -158.074632481 + 37.627054352 -157.999502661 + 37.649015467 -157.891641225 + 37.726992989 -157.858850811 + 37.782994315 -157.934016802 +} +85019597fffffff +{ + 71.037818028 55.748673489 + 71.057529893 55.999800500 + 71.138713011 56.053362277 + 71.200297028 55.853762787 + 71.180300682 55.600873554 + 71.099006197 55.549352811 +} +85b6ed67fffffff +{ + -20.842959757 -97.004360148 + -20.911855933 -97.065483479 + -20.998767358 -97.030461987 + -21.016825154 -96.934235144 + -20.947920265 -96.873059501 + -20.860966312 -96.908162910 +} +85e39637fffffff +{ + -68.824383266 -119.912397420 + -68.783302173 -119.706729923 + -68.700332233 -119.719370911 + -68.658444928 -119.936345070 + -68.699336547 -120.141309091 + -68.782304162 -120.130002347 +} +85f368dbfffffff +{ + -69.807387586 -141.724485904 + -69.869154039 -141.598297042 + -69.857881226 -141.356930814 + -69.784828663 -141.243557792 + -69.723379998 -141.370519242 + -69.734666109 -141.610089925 +} +85c0e413fffffff +{ + -38.347797162 -8.672273440 + -38.439699394 -8.712248894 + -38.512558901 -8.630487049 + -38.493420877 -8.508726436 + -38.401467870 -8.468968498 + -38.328703554 -8.550753193 +} +852031c7fffffff +{ + 46.111159229 68.018689648 + 46.026497280 68.087975182 + 46.025700474 68.228107071 + 46.109574875 68.299381939 + 46.194370352 68.230302661 + 46.195157889 68.089741182 +} +852b2ec3fffffff +{ + 46.530217255 -60.880526374 + 46.496030130 -61.006536588 + 46.406675625 -61.029284326 + 46.351606013 -60.926463384 + 46.385686361 -60.800843967 + 46.474942809 -60.777655414 +} +858f5a1bfffffff +{ + -9.672151655 -78.813381183 + -9.750947128 -78.870710674 + -9.839484482 -78.830374613 + -9.849191045 -78.732694327 + -9.770379578 -78.675404667 + -9.681877557 -78.715755310 +} +850962b3fffffff +{ + 71.543803384 3.151545332 + 71.593981509 2.987820587 + 71.563345574 2.766798774 + 71.482607574 2.711090496 + 71.432725684 2.874855923 + 71.463286104 3.094295496 +} +85c85db7fffffff +{ + -43.865698475 98.500284837 + -43.788831220 98.435576668 + -43.789792104 98.306458073 + -43.867611624 98.241608254 + -43.944646584 98.306087465 + -43.943694339 98.435646533 +} +85aa7217fffffff +{ + -23.272073059 76.763874940 + -23.366497852 76.788676735 + -23.394020250 76.889875408 + -23.327100719 76.966140835 + -23.232727248 76.941225859 + -23.205221914 76.840158436 +} +85f16093fffffff +{ + -88.094815276 -3.968368069 + -88.002968124 -3.451630126 + -87.943057870 -5.441882596 + -87.971287692 -7.977430505 + -88.061470972 -8.697092811 + -88.125213549 -6.685587978 } -855dac57fffffff -{ - 18.153679615 -156.742126119 - 18.061583529 -156.772549209 - 17.991081900 -156.704198305 - 18.012652153 -156.605401322 - 18.104757652 -156.574902846 - 18.175283536 -156.643276609 -} -85d9058bfffffff -{ - -57.737047847 142.555133360 - -57.701502309 142.402811552 - -57.755688906 142.277296266 - -57.845653023 142.304060176 - -57.881286185 142.457037440 - -57.826867265 142.582593710 -} -85649497fffffff -{ - 18.885411875 101.361738630 - 18.977654507 101.337451057 - 19.005140929 101.240400090 - 18.940362824 101.167667781 - 18.848101570 101.192015069 - 18.820636987 101.289035052 -} -85d816affffffff -{ - -48.414526874 139.697888487 - -48.324068963 139.684858900 - -48.282482399 139.560632354 - -48.331261398 139.449291771 - -48.421686529 139.461975322 - -48.463365638 139.586345473 -} -8500968bfffffff -{ - 73.399817087 80.186520709 - 73.385271823 80.501408837 - 73.456373974 80.692451811 - 73.542451110 80.567652511 - 73.557048323 80.249693565 - 73.485515903 80.059624133 -} -8508c0d7fffffff -{ - 66.230875682 22.917891781 - 66.204134425 23.077398875 - 66.257400636 23.218425048 - 66.337562716 23.199933211 - 66.364331926 23.039588542 - 66.310910821 22.898575713 -} -85000b6bfffffff -{ - 83.200863956 37.882968982 - 83.251632616 38.491666587 - 83.342399905 38.404168365 - 83.382082052 37.690031952 - 83.330250720 37.076061192 - 83.239811635 37.181402054 -} -85c2de83fffffff -{ - -32.222777217 -55.375086464 - -32.164409597 -55.323578477 - -32.094212983 -55.368726386 - -32.082423626 -55.465313916 - -32.140804796 -55.516771841 - -32.210961776 -55.471692412 -} -85e775b7fffffff -{ - -73.646670685 22.047198010 - -73.555763001 21.963592483 - -73.528357104 21.650469215 - -73.591665859 21.418113182 - -73.682853358 21.498923932 - -73.710453792 21.814901169 -} -8598ec07fffffff -{ - -19.169593530 -2.926574586 - -19.255280725 -2.952811818 - -19.321293422 -2.884006534 - -19.301503722 -2.788988192 - -19.215779272 -2.762908809 - -19.149881649 -2.831689747 -} -85e2a23bfffffff -{ - -62.618339435 -121.309047348 - -62.574589133 -121.140070551 - -62.485309704 -121.146700946 - -62.439803263 -121.321423339 - -62.483412721 -121.489895152 - -62.572668928 -121.484149284 -} -85f2851bfffffff -{ - -85.888028467 -143.121861603 - -85.965758846 -142.477852327 - -85.960068884 -141.193806813 - -85.876671856 -140.604283858 - -85.800474899 -141.270052194 - -85.806143998 -142.504848809 -} -857c0d57fffffff -{ - 0.869812992 -23.867895457 - 0.948153225 -23.824594783 - 1.028713022 -23.868905352 - 1.030993370 -23.956572606 - 0.952635552 -23.999948528 - 0.872014944 -23.955582020 -} -85d5231bfffffff -{ - -57.168245363 -160.699914279 - -57.099681486 -160.642722640 - -57.039857089 -160.740344131 - -57.048524181 -160.895042025 - -57.117031299 -160.952464608 - -57.176928155 -160.854959270 -} -85aa251bfffffff -{ - -20.481252317 70.629808441 - -20.576411174 70.649713520 - -20.607753782 70.747948089 - -20.543888836 70.826173821 - -20.448753265 70.806141885 - -20.417459257 70.708010938 -} -85ee93affffffff -{ - -68.311337611 -4.697701482 - -68.219216414 -4.645652080 - -68.154867042 -4.835684869 - -68.182264230 -5.078036859 - -68.274261910 -5.131884350 - -68.338987150 -4.941587204 -} -85247423fffffff -{ - 47.090269412 107.640302573 - 47.001991449 107.639061436 - 46.959818252 107.740943051 - 47.005763004 107.844139314 - 47.093942191 107.845744981 - 47.136275552 107.743790246 -} -85b88a47fffffff -{ - -21.300730162 131.908531052 - -21.214647780 131.907347919 - -21.178968760 131.828033418 - -21.229244875 131.749877048 - -21.315264746 131.750901887 - -21.351071112 131.830241283 -} -8551681bfffffff -{ - 14.569742232 -139.498096595 - 14.480912667 -139.533577771 - 14.405928578 -139.473261072 - 14.419757555 -139.377531549 - 14.508527785 -139.342038370 - 14.583528382 -139.402286568 -} -85329a57fffffff -{ - 45.585361496 176.011530539 - 45.678377087 176.024940331 - 45.734321814 175.914565499 - 45.697159220 175.790842265 - 45.604102562 175.777737892 - 45.548249376 175.888051019 -} -85139583fffffff -{ - 60.584036363 -136.325843233 - 60.500379851 -136.326141282 - 60.451110290 -136.189532114 - 60.485347112 -136.052143228 - 60.569086395 -136.051040681 - 60.618506549 -136.188131987 -} -856628dbfffffff -{ - 9.606924400 -72.363067241 - 9.540536716 -72.413902359 - 9.461368843 -72.375510143 - 9.448659318 -72.286292424 - 9.515090500 -72.235517396 - 9.594187727 -72.273899887 -} -851adc53fffffff -{ - 40.822004860 -45.327606845 - 40.736288571 -45.376230115 - 40.662023964 -45.307039947 - 40.673375759 -45.189215638 - 40.759078211 -45.140347064 - 40.833442802 -45.209547692 -} -854d1b3bfffffff -{ - 26.254944330 -65.790053557 - 26.223744630 -65.870609573 - 26.158093951 -65.879061001 - 26.123675735 -65.807157987 - 26.154776078 -65.726746869 - 26.220393808 -65.718093992 -} -8501517bfffffff -{ - 78.030820752 14.191528370 - 78.099659759 14.394501109 - 78.173443153 14.175824988 - 78.177813147 13.751503425 - 78.108465019 13.551304025 - 78.035255672 13.772606878 -} -8511a4affffffff -{ - 55.601088368 31.062923637 - 55.556883696 31.180243453 - 55.599540204 31.301174840 - 55.686561215 31.304924529 - 55.730829729 31.187216909 - 55.688013175 31.066147949 -} -852b4b97fffffff -{ - 36.404362589 -60.472730990 - 36.372627791 -60.573829487 - 36.293866806 -60.592752887 - 36.246920670 -60.510859239 - 36.278561132 -60.410014157 - 36.357241859 -60.390809689 -} -85209b17fffffff -{ - 34.953861616 74.413390065 - 34.869179277 74.462627332 - 34.861603282 74.578540115 - 34.938674454 74.645504424 - 35.023464553 74.596465639 - 35.031075796 74.480263476 -} -851a1d0ffffffff -{ - 47.937659964 -44.367420505 - 47.853912330 -44.422944064 - 47.783264643 -44.346781225 - 47.796272595 -44.215093194 - 47.880001746 -44.159273341 - 47.950741528 -44.235437222 -} -852c4dcbfffffff -{ - 46.877172279 54.518134436 - 46.803422141 54.605031018 - 46.818869091 54.739824699 - 46.908164779 54.788097380 - 46.982066169 54.701205460 - 46.966520421 54.566035409 -} -85ee214bfffffff -{ - -76.776848534 -42.603816931 - -76.712294193 -42.286555902 - -76.616977996 -42.372291600 - -76.585991892 -42.770484814 - -76.649955953 -43.087038524 - -76.745493235 -43.006130320 -} -85df3623fffffff -{ - -65.315600766 -59.349136150 - -65.273923224 -59.144567184 - -65.180700823 -59.126491741 - -65.129239303 -59.311507941 - -65.170668749 -59.515088736 - -65.263806736 -59.534639572 -} -85eb956bfffffff -{ - -57.637632637 -173.082452126 - -57.577246811 -173.013229984 - -57.510437461 -173.094143162 - -57.503969793 -173.243997984 - -57.564289021 -173.313293391 - -57.631142470 -173.232661580 -} -85e84b9bfffffff -{ - -53.780989860 -86.000230683 - -53.701008867 -85.918805467 - -53.619641589 -85.989602769 - -53.618100371 -86.141622403 - -53.697983261 -86.223395585 - -53.779505543 -86.152802668 -} -85dd2097fffffff -{ - -66.272729427 -16.095205784 - -66.186146777 -16.003208767 - -66.110032012 -16.145677696 - -66.120150669 -16.379728477 - -66.206490603 -16.472891511 - -66.282955103 -16.330844887 -} -85c0ded3fffffff -{ - -44.911589000 -11.592324839 - -44.999932100 -11.639725502 - -45.072813465 -11.553359514 - -45.057263606 -11.419527925 - -44.968859439 -11.372363537 - -44.896066100 -11.458793801 -} -856772dbfffffff -{ - 13.901759594 -71.060445702 - 13.840593037 -71.109765794 - 13.765630787 -71.071973470 - 13.751904446 -70.984874602 - 13.813116693 -70.935617005 - 13.888009609 -70.973395682 -} -8524661bfffffff -{ - 48.160587541 109.115535608 - 48.072785090 109.111611026 - 48.028930504 109.212801807 - 48.072719788 109.317973668 - 48.160415562 109.322266803 - 48.204428866 109.221019992 -} -852f2e2bfffffff -{ - 31.752196817 148.584736467 - 31.843732735 148.565980972 - 31.876940888 148.467382963 - 31.818609562 148.387751247 - 31.727178281 148.406670431 - 31.693973646 148.505057956 -} -85f36d37fffffff -{ - -68.406783380 -140.128409001 - -68.391532712 -139.919456728 - -68.313255039 -139.871644359 - -68.250362628 -140.031857379 - -68.265570990 -140.239623783 - -68.343713733 -140.288358681 -} -857d29a3fffffff -{ - -8.775726957 -25.419451991 - -8.694099568 -25.374610165 - -8.614698874 -25.420126138 - -8.616890146 -25.510537074 - -8.698556021 -25.555452568 - -8.777992134 -25.509883543 -} -852cdc0ffffffff -{ - 35.539594646 55.079481404 - 35.466118672 55.150533184 - 35.476797532 55.261851834 - 35.561042430 55.302376043 - 35.634670611 55.231333028 - 35.623901522 55.119756587 -} -852e8973fffffff -{ - 47.014011560 141.284092125 - 47.097383937 141.252896571 - 47.114796410 141.136647053 - 47.048879392 141.051918802 - 46.965616585 141.083294515 - 46.948161201 141.199218944 -} -85b4692ffffffff -{ - -25.158983246 -170.186635632 - -25.072971141 -170.141499368 - -24.994900408 -170.199123887 - -25.002788104 -170.301771947 - -25.088703173 -170.346959562 - -25.166827555 -170.289448050 -} -85cb9077fffffff -{ - -41.590579374 43.482353330 - -41.672977402 43.480468290 - -41.723327568 43.568722875 - -41.691225498 43.658906035 - -41.608743954 43.660632861 - -41.558447955 43.572334966 -} -854b24a3fffffff -{ - 32.194745095 123.183019362 - 32.123585980 123.200444712 - 32.108013427 123.290535419 - 32.163642718 123.363264149 - 32.234819782 123.345834747 - 32.250349672 123.255680594 -} -85f293a3fffffff +8505aa23fffffff { - -89.707564517 -71.154607567 - -89.675926908 -54.938385338 - -89.584407894 -54.825167400 - -89.529319524 -64.735229104 - -89.549476474 -75.981273593 - -89.633062761 -81.228829101 + 72.709646836 124.401205490 + 72.634421396 124.606186584 + 72.649070297 124.925642586 + 72.739113472 125.043032521 + 72.814802378 124.838622733 + 72.799983506 124.516234142 } -85e01407fffffff +85b51377fffffff { - -58.070024450 65.671794228 - -57.978657405 65.670484194 - -57.936725335 65.526312995 - -57.985930012 65.383137897 - -58.077225513 65.383649973 - -58.119388390 65.528134631 + -33.639159442 -151.965865043 + -33.546966760 -151.931465030 + -33.476619710 -152.009954030 + -33.498396783 -152.122854715 + -33.590568591 -152.157428492 + -33.660984293 -152.078928102 } -85b98ccffffffff +85d8d03bfffffff { - -29.700903300 136.576755091 - -29.607905843 136.570174288 - -29.568626219 136.476625975 - -29.622224581 136.389593748 - -29.715169692 136.395968435 - -29.754568911 136.489581397 + -41.479949055 132.449789610 + -41.387836432 132.447571887 + -41.341116843 132.344985185 + -41.386402069 132.244569933 + -41.478439531 132.246524632 + -41.525267047 132.349157394 } -85055957fffffff +850f64affffffff { - 79.730689178 167.997005904 - 79.634256839 167.970176029 - 79.581048298 168.417503757 - 79.623577231 168.894859669 - 79.719894444 168.930119769 - 79.773803799 168.479612801 + 62.032660338 -52.873250160 + 62.010954837 -53.067343486 + 61.919546048 -53.125058143 + 61.850029255 -52.989516414 + 61.871674959 -52.796445768 + 61.962896913 -52.737897756 +} +85d8a5affffffff +{ + -47.431611593 140.377781059 + -47.340412608 140.363960128 + -47.299472591 140.240753377 + -47.349639530 140.131220404 + -47.440808103 140.144704852 + -47.481840342 140.268058766 +} +85289203fffffff +{ + 45.393943647 -110.561669618 + 45.466357004 -110.492332002 + 45.541008955 -110.552476772 + 45.543207961 -110.682064961 + 45.470758562 -110.751296426 + 45.396146213 -110.691046355 +} +85616823fffffff +{ + 1.023768788 71.718344950 + 0.945934059 71.735901286 + 0.920742845 71.819404928 + 0.973439777 71.885274534 + 1.051239625 71.867628981 + 1.076377515 71.784202951 +} +85ec7023fffffff +{ + -74.985349997 147.473476748 + -74.964737065 147.157163511 + -75.030198588 146.920589731 + -75.116650349 147.000684717 + -75.137388526 147.320012439 + -75.071548558 147.556212976 +} +8516d5c3fffffff +{ + 47.912377714 166.797280220 + 48.004692301 166.798290181 + 48.050665395 166.676081925 + 48.004249664 166.553048770 + 47.911942990 166.552384156 + 47.866043910 166.674407380 +} +85852ecbfffffff +{ + 1.990908427 59.716640934 + 1.916154213 59.726084034 + 1.892476918 59.802988086 + 1.943635325 59.870413848 + 2.018393542 59.860873419 + 2.041989458 59.784004552 +} +8597b677fffffff +{ + -14.317498046 41.493859603 + -14.222228544 41.493970225 + -14.174674855 41.410797870 + -14.222393446 41.327431279 + -14.317720195 41.327253561 + -14.365271157 41.410509570 +} +85b8e31bfffffff +{ + -25.532541517 126.345159582 + -25.446402142 126.349603883 + -25.405911357 126.274221133 + -25.451432451 126.194401101 + -25.537479902 126.189804027 + -25.578098231 126.265179581 +} +851640affffffff +{ + 54.916229275 177.916741574 + 55.000651183 177.935272054 + 55.054809995 177.809179499 + 55.024449662 177.664607217 + 54.939983155 177.646479588 + 54.885921352 177.772520796 } -85aaae8bfffffff +85b41adbfffffff { - -29.767964624 69.266161846 - -29.862968427 69.286496127 - -29.895496611 69.391841082 - -29.832977940 69.476738119 - -29.737983994 69.456253097 - -29.705498757 69.351021625 + -24.717915182 -154.828778390 + -24.626023892 -154.794606065 + -24.553060051 -154.865208374 + -24.571903972 -154.969971962 + -24.663751991 -155.004279992 + -24.736799438 -154.933688979 } -8581b603fffffff +8533719bfffffff { - -11.679641166 -31.851588617 - -11.597007327 -31.803329293 - -11.515915145 -31.850748349 - -11.517439007 -31.946457667 - -11.600101748 -31.994770880 - -11.681211717 -31.947321009 + 26.152783003 166.716926658 + 26.248027671 166.717606331 + 26.296605844 166.624948372 + 26.249848149 166.531717454 + 26.154612371 166.531236267 + 26.106125241 166.623787526 } -85032697fffffff +85f164a3fffffff { - 89.124600079 68.571080410 - 89.129802211 74.557627301 - 89.210038268 77.949292632 - 89.292559680 74.729652805 - 89.286476830 67.379579908 - 89.198898009 64.794601407 -} -85d376c3fffffff -{ - -51.524058714 -118.030305507 - -51.470807503 -117.903080294 - -51.374907384 -117.914560530 - -51.332268012 -118.052742640 - -51.385392224 -118.179722845 - -51.481282466 -118.168766069 -} -854b9557fffffff -{ - 20.820187848 120.424428122 - 20.737204561 120.441422277 - 20.715819902 120.527506033 - 20.777483996 120.596661610 - 20.860513929 120.579658978 - 20.881833171 120.493509185 -} -85bd488bfffffff -{ - -39.013435287 24.225848299 - -38.934974905 24.233801273 - -38.888165220 24.140889725 - -38.919809764 24.040021126 - -38.998258004 24.031985723 - -39.045073937 24.124901272 -} -85c0ea5bfffffff -{ - -42.423855810 -6.974730813 - -42.515050416 -7.014728759 - -42.585380875 -6.926980181 - -42.564424714 -6.799228024 - -42.473189489 -6.759483313 - -42.402950917 -6.847237019 -} -85d0a81bfffffff -{ - -50.319789869 9.128911916 - -50.407863881 9.109061442 - -50.457628417 9.216382190 - -50.419259645 9.343343121 - -50.331223370 9.362821503 - -50.281517941 9.255711061 -} -85b4856bfffffff -{ - -23.002206172 -150.856837626 - -22.910347114 -150.826728134 - -22.839700767 -150.898230344 - -22.860826411 -150.999859401 - -22.952659464 -151.030114708 - -23.023392973 -150.958595338 -} -85512673fffffff -{ - 9.499139096 -129.164546849 - 9.415620639 -129.199435579 - 9.344196957 -129.149209216 - 9.356280120 -129.064191386 - 9.439708821 -129.029325862 - 9.511144072 -129.079454873 -} -853d745bfffffff -{ - 36.308335385 82.956753859 - 36.220667595 82.994372568 - 36.204797353 83.108660972 - 36.276505998 83.185594019 - 36.364235247 83.148239074 - 36.380194566 83.033686854 -} -850300bbfffffff -{ - 87.149840448 -104.594209027 - 87.147821232 -106.417838933 - 87.065420688 -107.297443336 - 86.987235160 -106.405670504 - 86.989375845 -104.679840280 - 87.069582423 -103.751526119 -} -85f02d4ffffffff -{ - -81.464226106 58.207312639 - -81.404547404 57.733657196 - -81.434329154 57.173429030 - -81.524414636 57.078474425 - -81.584914174 57.554697924 - -81.554500084 58.123370142 -} -8504a037fffffff -{ - 69.538269679 137.513699575 - 69.451832185 137.637454062 - 69.445427748 137.912889091 - 69.525419091 138.066786131 - 69.612186681 137.944373785 - 69.618633110 137.666710123 -} -855f4633fffffff -{ - 7.156696494 -61.441846201 - 7.234092090 -61.395629457 - 7.309382398 -61.434875201 - 7.307268090 -61.520263207 - 7.229941107 -61.566417639 - 7.154659866 -61.527246436 -} -8506eb03fffffff -{ - 63.074816247 -45.021768300 - 63.064777901 -45.221106272 - 62.978695029 -45.302734057 - 62.902884563 -45.185669752 - 62.912941206 -44.987464377 - 62.998789978 -44.905195095 -} -85f12b0bfffffff -{ - -85.910478252 103.834658217 - -85.918641959 102.568158200 - -85.999277326 102.065306276 - -86.073020024 102.863480109 - -86.064296997 104.179625387 - -85.982404756 104.646701578 -} -851fa503fffffff -{ - 51.435695517 6.234558971 - 51.356180257 6.248642953 - 51.330818265 6.372133002 - 51.384962655 6.481819388 - 51.464528792 6.467983141 - 51.489899797 6.344212339 -} -85824b2bfffffff -{ - -1.956604628 0.104724793 - -1.874740474 0.117779994 - -1.829029783 0.061323771 - -1.865109037 -0.008111889 - -1.946868345 -0.021182944 - -1.992653195 0.035197452 -} -852d808ffffffff -{ - 34.161517243 37.664346209 - 34.068764948 37.646616104 - 34.007776144 37.732922210 - 34.039467255 37.836922325 - 34.132143479 37.854805423 - 34.193204736 37.768535683 -} -85c10b57fffffff -{ - -29.692107139 -9.786382312 - -29.783272771 -9.823596245 - -29.856836977 -9.750818829 - -29.839130070 -9.640798828 - -29.747901310 -9.603755687 - -29.674442496 -9.676561402 -} -85e351cffffffff -{ - -59.111948831 -144.376930743 - -59.095589448 -144.224120043 - -59.012611959 -144.180084899 - -58.946142817 -144.288429307 - -58.962525176 -144.440576089 - -59.045353625 -144.485040497 -} -850554b7fffffff -{ - 81.626490379 140.381153027 - 81.538572865 140.647287945 - 81.527563684 141.300141469 - 81.604263177 141.699222766 - 81.692856939 141.441899227 - 81.704078090 140.776523906 -} -85411453fffffff -{ - 22.318442489 117.600864206 - 22.405251723 117.583799826 - 22.439863428 117.498834532 - 22.387610512 117.430914650 - 22.300723955 117.448058219 - 22.266167634 117.533042480 -} -8500c5c3fffffff -{ - 85.125903048 63.152813246 - 85.141852835 64.206824333 - 85.229698962 64.582675726 - 85.302497771 63.876036340 - 85.285938451 62.787555688 - 85.197204026 62.440881645 -} -8503188ffffffff -{ - 84.301371252 -116.372421586 - 84.280587510 -117.262159924 - 84.191838668 -117.545990659 - 84.124691547 -116.960197657 - 84.145075285 -116.093596898 - 84.232997183 -115.790034389 -} -8598b657fffffff -{ - -16.543649701 -17.435722343 - -16.624760451 -17.474339556 - -16.693750502 -17.417806632 - -16.681525977 -17.322587658 - -16.600317164 -17.284061914 - -16.531430923 -17.340663415 -} -859f5813fffffff -{ - -21.700750861 163.833892654 - -21.613336200 163.800866804 - -21.593315010 163.702484723 - -21.660697775 163.636953496 - -21.748207877 163.669863746 - -21.768239809 163.768421108 -} -85e548a3fffffff -{ - -69.676058232 95.693903005 - -69.591512949 95.566362729 - -69.586256100 95.291693619 - -69.665497862 95.142579727 - -69.750304267 95.268901923 - -69.755608045 95.545566436 -} -85123627fffffff -{ - 60.822559120 -124.978712506 - 60.736605371 -125.013709027 - 60.673799415 -124.886500329 - 60.696729797 -124.724076142 - 60.782668946 -124.688217030 - 60.845692863 -124.815643446 -} -85f24e47fffffff -{ - -72.950099166 -112.713479565 - -72.987448031 -112.447533907 - -72.935755497 -112.190934148 - -72.847091293 -112.201576423 - -72.810147065 -112.465994895 - -72.861464404 -112.721297059 -} -857ae35bfffffff -{ - 4.970773344 42.127988195 - 5.056183064 42.127855388 - 5.104254008 42.051398774 - 5.066951981 41.975002016 - 4.981499158 41.975078302 - 4.933391394 42.051607900 -} -8500d9dbfffffff -{ - 85.178836900 111.962472372 - 85.120846500 112.833485288 - 85.155205961 113.882123119 - 85.248594933 114.087482902 - 85.308127376 113.207973808 - 85.272704484 112.131222798 -} -85ed06b3fffffff -{ - -65.784803221 166.727102233 - -65.784523300 166.539640481 - -65.857920348 166.457654361 - -65.931732043 166.563954082 - -65.931882559 166.752545989 - -65.858351168 166.833703754 -} -85c3498ffffffff -{ - -33.508267153 -63.522635505 - -33.579505475 -63.574361766 - -33.643433013 -63.531138099 - -33.636111346 -63.436236208 - -33.564915330 -63.384621012 - -33.500998699 -63.427796539 -} -85511457fffffff -{ - 12.027319874 -126.446873036 - 12.104385435 -126.408457237 - 12.180660681 -126.458865236 - 12.179767392 -126.547667954 - 12.102674913 -126.585965769 - 12.026502554 -126.535578978 -} -85272047fffffff -{ - 53.484482385 -93.859478242 - 53.414296846 -93.963587124 - 53.324300354 -93.911854580 - 53.304323928 -93.756512238 - 53.374295531 -93.652259578 - 53.464457301 -93.703491214 -} -85cf4a27fffffff -{ - -45.538712219 -89.663573824 - -45.461550459 -89.587710213 - -45.375195898 -89.643227513 - -45.365855444 -89.774413406 - -45.442903701 -89.850487715 - -45.529405938 -89.795166391 -} -85ee580ffffffff -{ - -66.368455337 -46.122965891 - -66.309165550 -45.934761184 - -66.215267673 -45.968871925 - -66.180572143 -46.189582217 - -66.239515775 -46.377362832 - -66.333499924 -46.344860319 -} -85f04227fffffff -{ - -76.191799225 38.504134508 - -76.111572447 38.306458390 - -76.109967580 37.930617532 - -76.188676329 37.748047376 - -76.269415899 37.943760573 - -76.270933442 38.324041080 -} -85f14967fffffff -{ - -81.168930544 16.486106144 - -81.074777140 16.388786809 - -81.040666408 15.827510716 - -81.100186285 15.355108069 - -81.194645333 15.441856616 - -81.229285678 16.011645542 -} -8516f41bfffffff -{ - 50.623781293 164.530797659 - 50.713721266 164.528519863 - 50.755880623 164.399706946 - 50.708031003 164.273401944 - 50.618109678 164.276053159 - 50.576019090 164.404636100 -} -8503244bfffffff -{ - 89.178066530 58.523603972 - 89.198898009 64.794601407 - 89.286476830 67.379579908 - 89.359030513 62.518463904 - 89.333527954 54.840370004 - 89.240876040 53.602067640 + -88.289875529 -25.956293481 + -88.210781453 -24.327114868 + -88.129952318 -25.740547375 + -88.124791626 -28.636873859 + -88.199935410 -30.370691277 + -88.284154191 -29.119395886 +} +853e02cbfffffff +{ + 27.236648440 21.663687624 + 27.139269547 21.660849722 + 27.088332492 21.754149749 + 27.134706901 21.850370860 + 27.232087214 21.853380078 + 27.283091828 21.759996886 +} +8533190ffffffff +{ + 30.629861860 171.838703316 + 30.726623624 171.845167720 + 30.779572019 171.750688345 + 30.735658444 171.649821847 + 30.638874855 171.643574506 + 30.586026508 171.737976506 +} +85868ccffffffff +{ + -0.611412756 84.488447621 + -0.522135283 84.461786129 + -0.497792995 84.372238871 + -0.562705369 84.309417026 + -0.651914197 84.336087968 + -0.676279307 84.425571409 +} +85c6b0b3fffffff +{ + -43.144432896 -125.935531710 + -43.098063868 -125.823437472 + -43.003247890 -125.819954291 + -42.954865120 -125.928201571 + -43.001145048 -126.040034713 + -43.095896621 -126.043881396 +} +8559ab57fffffff +{ + 14.714421192 1.138407982 + 14.628608646 1.151381106 + 14.590165401 1.232066632 + 14.637519310 1.299913550 + 14.723424130 1.287035275 + 14.761882791 1.206215080 +} +85e99aa3fffffff +{ + -71.852783076 -81.425687842 + -71.844623545 -81.127276086 + -71.759263941 -80.995265531 + -71.682441321 -81.160111561 + -71.690596882 -81.455850305 + -71.775578874 -81.589400066 +} +85e41e27fffffff +{ + -57.716388128 99.627521373 + -57.633157066 99.533789208 + -57.634814122 99.352122582 + -57.719701545 99.263318251 + -57.803140350 99.356625315 + -57.801483980 99.539164821 +} +85ce3643fffffff +{ + -47.482004300 -73.740780911 + -47.400636635 -73.694679541 + -47.328541326 -73.768593609 + -47.337663154 -73.888627058 + -47.419005183 -73.935080742 + -47.491251211 -73.861149263 +} +852859d7fffffff +{ + 45.068155236 -133.660670380 + 45.146960320 -133.618749135 + 45.204301784 -133.686924611 + 45.182804105 -133.796929173 + 45.104036007 -133.838621033 + 45.046728551 -133.770537867 +} +8505a183fffffff +{ + 73.424312700 114.081179430 + 73.361004114 114.334641413 + 73.391643949 114.650304901 + 73.485918205 114.715056973 + 73.549698418 114.461010441 + 73.518730618 114.142785190 +} +8500ce2ffffffff +{ + 86.912418603 101.578611425 + 86.869006523 103.087129969 + 86.917482582 104.588661014 + 87.011464955 104.624946457 + 87.056961699 103.065759921 + 87.006325750 101.521189841 +} +850f456ffffffff +{ + 59.560015711 -59.309799874 + 59.528518100 -59.487569324 + 59.433991291 -59.523698621 + 59.371093640 -59.382903330 + 59.402476958 -59.205929913 + 59.496871736 -59.168957946 +} +85a4b5c7fffffff +{ + -21.567078040 -36.177727670 + -21.489359830 -36.127192458 + -21.413347188 -36.175812016 + -21.415060716 -36.274980246 + -21.492809140 -36.325553167 + -21.568813811 -36.276920297 +} +85c674bbfffffff +{ + -36.265498043 -140.126869429 + -36.173953683 -140.104493813 + -36.114527667 -140.188349083 + -36.146597733 -140.294689575 + -36.238179887 -140.317275920 + -36.297654282 -140.233311118 +} +856f840bfffffff +{ + 0.107860914 -109.416192499 + 0.175456076 -109.368068957 + 0.247801913 -109.408621213 + 0.252477753 -109.497351250 + 0.184802034 -109.545430119 + 0.112531044 -109.504823784 +} +85722843fffffff +{ + 6.620097605 139.610825140 + 6.524029416 139.626464235 + 6.489354024 139.718020955 + 6.550736319 139.793949885 + 6.646798340 139.778335291 + 6.681484297 139.686767200 +} +85eca9c3fffffff +{ + -67.191697955 138.565657507 + -67.154273577 138.355621699 + -67.209314515 138.168129882 + -67.302066375 138.190374987 + -67.339649276 138.401574998 + -67.284320949 138.589362401 +} +85a41ec3fffffff +{ + -22.187568148 -30.263988374 + -22.265343148 -30.312341048 + -22.313601403 -30.280416501 + -22.338459685 -30.265332752 + -22.334544520 -30.170780467 + -22.256011499 -30.121610377 + -22.206342762 -30.151861736 + -22.182207760 -30.167811473 +} +85d51e5bfffffff +{ + -53.439257044 -156.391940797 + -53.363901437 -156.342893830 + -53.303510208 -156.439058863 + -53.318407774 -156.584227779 + -53.393721862 -156.633520321 + -53.454180006 -156.537399065 +} +85f343dbfffffff +{ + -72.695545732 -141.453071071 + -72.760493224 -141.302089872 + -72.749477499 -141.015647840 + -72.673503715 -140.882726068 + -72.608928892 -141.034769161 + -72.619955244 -141.318686789 +} +85ce8237fffffff +{ + -40.148455956 -70.390390860 + -40.072117151 -70.356583129 + -40.003161174 -70.422479054 + -40.010398849 -70.522227872 + -40.086720570 -70.556305046 + -40.155821889 -70.490364252 +} +85d1305bfffffff +{ + -37.391121711 4.756201991 + -37.484491305 4.733904028 + -37.546295394 4.822119396 + -37.514648323 4.932523087 + -37.421300717 4.954563975 + -37.359578048 4.866458372 +} +853e91c7fffffff +{ + 19.335705841 16.782013235 + 19.241069612 16.783473021 + 19.193670054 16.871636492 + 19.240841946 16.958439168 + 19.335505650 16.957125729 + 19.382970106 16.868863219 +} +85c4d4dbfffffff +{ + -45.556098928 -41.425251660 + -45.621519653 -41.496450180 + -45.704353536 -41.454984560 + -45.721791633 -41.342024399 + -45.656285362 -41.270748001 + -45.573426641 -41.312509372 +} +85c63677fffffff +{ + -43.396503260 -134.917686185 + -43.360267957 -134.805339742 + -43.269079511 -134.787516015 + -43.214241316 -134.881731835 + -43.250439591 -134.993758726 + -43.341512971 -135.011888786 +} +85d95b83fffffff +{ + -53.079260774 127.679952738 + -53.024378543 127.553549611 + -53.061487629 127.415568265 + -53.153679967 127.403640529 + -53.208744841 127.530342169 + -53.171434266 127.668673177 +} +858a61bbfffffff +{ + -5.367274676 -71.493991115 + -5.444383481 -71.546743186 + -5.530486460 -71.506516280 + -5.539417256 -71.413551069 + -5.462295774 -71.360868218 + -5.376256160 -71.401081238 +} +8522e393fffffff +{ + 50.809133543 -170.863007651 + 50.892981992 -170.830944580 + 50.957881281 -170.931139888 + 50.938852819 -171.063513039 + 50.854916223 -171.095319500 + 50.790096138 -170.995010195 +} +8537aa03fffffff +{ + 36.605602921 -154.255483701 + 36.526965219 -154.289937743 + 36.467151526 -154.215730375 + 36.485973366 -154.107058338 + 36.564617607 -154.072523474 + 36.624433527 -154.146741282 +} +8506f483fffffff +{ + 69.490592292 -42.911747474 + 69.486435728 -43.167122573 + 69.403682950 -43.279105248 + 69.325369231 -43.136663166 + 69.329557082 -42.883155873 + 69.412027387 -42.770232160 +} +8531538ffffffff +{ + 40.923307215 126.112268515 + 40.996320885 126.073203381 + 41.003454973 125.985244173 + 40.937675471 125.936558805 + 40.864783798 125.975650291 + 40.857549726 126.063401081 +} +85a84167fffffff +{ + -18.755737285 -57.609437535 + -18.684225008 -57.559817099 + -18.603132159 -57.602815705 + -18.593604989 -57.695363018 + -18.665113276 -57.744927687 + -18.746152741 -57.702000902 +} +85e8c10ffffffff +{ + -59.150506449 -76.587996341 + -59.133027776 -76.416101509 + -59.051836751 -76.352259283 + -58.988341304 -76.459674951 + -59.005772059 -76.630694731 + -59.086745978 -76.695170972 +} +8505290bfffffff +{ + 82.316586948 116.915955126 + 82.251390421 117.431377152 + 82.278633251 118.114573160 + 82.371621466 118.294901474 + 82.437814571 117.778509954 + 82.410014517 117.082620674 } -8501adaffffffff -{ - 74.003215461 39.258652542 - 74.045338067 39.512051879 - 74.128883624 39.482292071 - 74.170170587 39.196130999 - 74.127586498 38.941709657 - 74.044178946 38.974466157 -} -858e8193fffffff -{ - -13.138915621 -90.453373771 - -13.214861734 -90.513764655 - -13.304423641 -90.476404534 - -13.318050437 -90.378593795 - -13.242080406 -90.318183941 - -13.152507528 -90.355603661 -} -85220d2ffffffff -{ - 47.100174525 -172.291119075 - 47.187674709 -172.262563457 - 47.252374450 -172.359282506 - 47.229490714 -172.484642587 - 47.141901361 -172.512957780 - 47.077284817 -172.416153948 -} -858c2eb7fffffff -{ - -11.476697343 104.332898236 - -11.396423100 104.311864715 - -11.376899453 104.224857571 - -11.437703920 104.158901754 - -11.517973024 104.179989741 - -11.537442879 104.266979143 -} -854ee343fffffff -{ - 24.823060616 147.641421035 - 24.911504701 147.623342379 - 24.945882142 147.533054294 - 24.891803968 147.461024460 - 24.803464386 147.479237043 - 24.769098446 147.569345783 -} -8545a113fffffff -{ - 18.404050812 -82.062311979 - 18.469651896 -82.002223627 - 18.552597108 -82.024507329 - 18.569982626 -82.107016582 - 18.504308241 -82.167190105 - 18.421321711 -82.144769214 -} -85062b47fffffff -{ - 67.065473950 -30.065749030 - 67.078096872 -30.280736638 - 67.006342230 -30.415943062 - 66.922243235 -30.336287724 - 66.909784476 -30.122598414 - 66.981261143 -29.987271084 -} -854f137bfffffff -{ - 17.258376567 158.328611170 - 17.345625683 158.321228641 - 17.387147580 158.235643540 - 17.341351552 158.157568212 - 17.254152275 158.165101681 - 17.212699067 158.250559656 -} -8573439bfffffff -{ - 11.723486854 141.275665565 - 11.628772333 141.291154489 - 11.593862182 141.383054474 - 11.653658562 141.459471233 - 11.748355961 141.444009718 - 11.783274165 141.352103973 -} -85df755bfffffff -{ - -57.881608298 -67.539522671 - -57.852092610 -67.377711764 - -57.767423152 -67.340643204 - -57.712412438 -67.464628199 - -57.741795522 -67.625721808 - -57.826321447 -67.663545827 -} -85e50863fffffff -{ - -64.230265881 112.406021758 - -64.158794360 112.257117812 - -64.179315184 112.040084615 - -64.271439708 111.970786942 - -64.343187471 112.119612668 - -64.322533882 112.337818552 -} -853d0003fffffff -{ - 33.272477169 79.012599495 - 33.187606799 79.054201957 - 33.176154635 79.165470340 - 33.249509046 79.235395179 - 33.334464428 79.194012111 - 33.345980516 79.082484331 -} -85926c3bfffffff -{ - -14.902505106 -95.898688362 - -14.975368988 -95.958876688 - -15.064186758 -95.923928638 - -15.080173900 -95.828715982 - -15.007287314 -95.768482199 - -14.918436315 -95.803506423 -} -85cc5a97fffffff -{ - -42.301786346 71.065617874 - -42.388448247 71.090076745 - -42.417053149 71.209001797 - -42.358968564 71.303313523 - -42.272321176 71.278670883 - -42.243743741 71.159900037 -} -85e4f02ffffffff -{ - -55.725184032 94.143102772 - -55.638957795 94.067389977 - -55.633099775 93.896772176 - -55.713416011 93.801104339 - -55.799812281 93.876315445 - -55.805722445 94.047698519 -} -85bc9c33fffffff -{ - -25.541927853 36.957325267 - -25.449585224 36.959381423 - -25.404072277 36.870678359 - -25.450911257 36.779846400 - -25.543286254 36.777712840 - -25.588789983 36.866488662 -} -85b38143fffffff -{ - -23.303153889 -77.356351599 - -23.379202955 -77.415564178 - -23.461554120 -77.373235136 - -23.467841729 -77.271683865 - -23.391805266 -77.212522180 - -23.309468618 -77.254860704 -} -85102bb3fffffff -{ - 63.241570752 47.359832330 - 63.184169849 47.495839306 - 63.212793277 47.682013370 - 63.298949702 47.732834988 - 63.356511610 47.596613423 - 63.327755635 47.409783408 -} -85c8d4c3fffffff -{ - -34.892633785 103.635242758 - -34.827144344 103.574536793 - -34.833046800 103.467788014 - -34.904466230 103.421447313 - -34.970116918 103.482045460 - -34.964186863 103.589092722 -} -85a56387fffffff -{ - -13.968113757 -20.116909217 - -14.045968489 -20.156332942 - -14.112763869 -20.103960914 - -14.101606424 -20.012086164 - -14.023648203 -19.972734972 - -13.956950923 -20.025185759 -} -85384547fffffff -{ - 35.656387356 8.846399365 - 35.563021913 8.855644113 - 35.524927785 8.958186734 - 35.580188760 9.051664607 - 35.673619411 9.042598353 - 35.711723976 8.939875521 -} -8537a567fffffff -{ - 39.043915886 -154.980881075 - 38.968042412 -155.015444646 - 38.911160284 -154.940087912 - 38.930148366 -154.830151642 - 39.006028272 -154.795502254 - 39.062913724 -154.870874763 -} -85050563fffffff -{ - 79.379762740 111.828477770 - 79.320136783 112.232387271 - 79.355191663 112.713926458 - 79.450386142 112.797287676 - 79.510712705 112.391400722 - 79.475138916 111.904096424 -} -85f295c7fffffff -{ - -88.269608378 178.097142659 - -88.359426638 177.590708895 - -88.412920282 -179.829210610 - -88.372107702 -176.832297720 - -88.281237832 -176.617382355 - -88.232033386 -179.102369411 -} -8520b3d7fffffff -{ - 36.834357978 67.765180344 - 36.751727480 67.824739123 - 36.750594064 67.944529134 - 36.832101405 68.005073504 - 36.914865993 67.945662654 - 36.915989135 67.825558833 -} -85c2d14bfffffff -{ - -32.757444332 -54.669880961 - -32.699310964 -54.618120013 - -32.629772420 -54.663651615 - -32.618404669 -54.760877984 - -32.676551549 -54.812591573 - -32.746052669 -54.767126272 -} -85754c23fffffff -{ - -0.045865198 1.175843817 - 0.035696792 1.188637472 - 0.080070772 1.131317799 - 0.042960498 1.061277709 - -0.038500873 1.048466413 - -0.082952549 1.105712785 -} -85ee30b7fffffff -{ - -77.740840925 -29.977323400 - -77.662341592 -29.707428315 - -77.573436050 -29.890772471 - -77.562556350 -30.339960028 - -77.640444740 -30.611650826 - -77.729822350 -30.432409887 -} -853118c7fffffff -{ - 42.664707048 119.732505141 - 42.586118264 119.713432180 - 42.542084819 119.783333300 - 42.576503730 119.872250580 - 42.654960202 119.891528207 - 42.699130063 119.821684346 -} -85eef017fffffff -{ - -69.465100956 -26.121988234 - -69.384005285 -25.973747180 - -69.298284862 -26.100323025 - -69.293324128 -26.373887180 - -69.374055873 -26.523065896 - -69.460112082 -26.397754746 -} -855a1937fffffff -{ - 16.798973389 170.597640577 - 16.887166994 170.601992861 - 16.934242644 170.520274242 - 16.893018339 170.434267626 - 16.804810747 170.430075999 - 16.757841298 170.511730287 -} -85f16d13fffffff -{ - -84.608913789 -11.923507786 - -84.518603315 -11.600985206 - -84.448095503 -12.254380253 - -84.466523732 -13.226883854 - -84.555974806 -13.572909514 - -84.627868669 -12.923421277 -} -85c48c8ffffffff -{ - -43.367843160 -42.676549331 - -43.433399071 -42.745602893 - -43.516151733 -42.707677663 - -43.533378531 -42.600422249 - -43.467736079 -42.531285745 - -43.384953468 -42.569487388 -} -85f32977fffffff -{ - -72.682815623 -156.707919326 - -72.755025924 -156.629178338 - -72.765402081 -156.354366294 - -72.703342761 -156.160506633 - -72.631340359 -156.241248425 - -72.621188163 -156.513860049 -} -85eb9dcffffffff -{ - -59.612706061 -173.460839641 - -59.555728995 -173.540807829 - -59.572869792 -173.685824334 - -59.647061027 -173.751288300 - -59.704119356 -173.671273421 - -59.686905056 -173.525840459 -} -85805c3bfffffff -{ - 1.632769592 -48.086290577 - 1.714942875 -48.036086580 - 1.798629726 -48.081704734 - 1.800149721 -48.177490165 - 1.718013334 -48.227677820 - 1.634320071 -48.182096517 -} -856111c3fffffff -{ - 7.636749397 81.510298748 - 7.726957799 81.482758974 - 7.748502585 81.392862317 - 7.679886958 81.330575851 - 7.589750533 81.358116968 - 7.568157755 81.447943313 -} -859f93cffffffff -{ - -11.550256473 174.273623901 - -11.476134586 174.237892594 - -11.459967275 174.154952850 - -11.517944164 174.107609607 - -11.592176649 174.143298211 - -11.608321600 174.226372947 -} -857742dbfffffff -{ - 6.963153731 160.315899467 - 6.873678004 160.326803187 - 6.838064351 160.404349397 - 6.891858748 160.470943985 - 6.981245294 160.460081694 - 7.016926611 160.382583386 -} -8500cd57fffffff -{ - 88.206996319 84.473697294 - 88.189021971 87.333960556 - 88.257206675 89.432942511 - 88.347461788 88.656277650 - 88.367235550 85.532264438 - 88.294835170 83.463175476 -} -854020dbfffffff -{ - 24.056073876 111.118106952 - 24.144097830 111.097638687 - 24.176566627 111.005257093 - 24.120970929 110.933343691 - 24.032891323 110.953889790 - 24.000463032 111.046271500 -} -85f0e833fffffff -{ - -73.488153179 48.533645482 - -73.418668101 48.326976297 - -73.430747627 48.024861013 - -73.512546780 47.926685582 - -73.582496103 48.133042637 - -73.570180641 48.437902696 -} -85cb55b3fffffff -{ - -33.882184260 57.484405748 - -33.974837635 57.494977346 - -34.016196156 57.595412894 - -33.964831491 57.685228845 - -33.872130750 57.674485141 - -33.830841946 57.574097614 -} -85efb487fffffff -{ - -80.984571076 17.869894905 - -80.890858120 17.760547500 - -80.858789407 17.206338591 - -80.919955179 16.753054723 - -81.014006780 16.852450225 - -81.046560200 17.415152407 -} -85851c13fffffff -{ - -1.241964299 59.443150091 - -1.320859228 59.452652165 - -1.346780226 59.531395857 - -1.293718834 59.600601460 - -1.214814491 59.590996876 - -1.188980843 59.512289195 -} -8500ec8ffffffff -{ - 85.625450772 31.885132979 - 85.684765089 32.760110776 - 85.775091759 32.497018766 - 85.805302131 31.317394813 - 85.744288608 30.438983569 - 85.654787826 30.742934295 -} -8538d05bfffffff -{ - 25.080518582 2.131660948 - 24.989214986 2.145246815 - 24.952614174 2.234840792 - 25.007320393 2.311011364 - 25.098721814 2.297545250 - 25.135319216 2.207788609 -} -85ef1c2bfffffff -{ - -81.126398841 -36.258605518 - -81.055081361 -35.838277196 - -80.963360407 -36.028924471 - -80.942457296 -36.630728971 - -81.012908010 -37.051981190 - -81.105123617 -36.870614662 -} -8501b08ffffffff -{ - 69.729706333 52.276187373 - 69.673258183 52.438681550 - 69.696143998 52.681092749 - 69.775593299 52.762199430 - 69.832259728 52.599612243 - 69.809257970 52.356007146 -} -8583b0c3fffffff -{ - -6.783565468 20.448567545 - -6.688637179 20.456785542 - -6.635493790 20.378600068 - -6.677219566 20.292211635 - -6.772100579 20.283937075 - -6.825303154 20.362107447 -} -8539910bfffffff -{ - 29.619773219 -10.034459690 - 29.551334250 -10.108828288 - 29.461301266 -10.080712141 - 29.439706332 -9.978432742 - 29.508043073 -9.904125256 - 29.598076844 -9.932035888 -} -85008617fffffff -{ - 76.041247349 74.043150064 - 76.036966098 74.418007398 - 76.114442457 74.610124236 - 76.196644733 74.425184651 - 76.200872571 74.045908642 - 76.122951745 73.856024940 -} -85d95c63fffffff -{ - -54.280838947 129.173180299 - -54.227728708 129.041394829 - -54.267071655 128.901417473 - -54.359734373 128.892885703 - -54.413022085 129.025018695 - -54.373469121 129.165335930 -} -854449affffffff -{ - 34.193458936 -94.687907753 - 34.263560712 -94.617960112 - 34.351343705 -94.657729526 - 34.369036255 -94.767616573 - 34.298881244 -94.837602417 - 34.211086982 -94.797663232 -} -8512e547fffffff -{ - 54.803904270 -115.137192655 - 54.722641508 -115.192194022 - 54.649400728 -115.098625613 - 54.657199430 -114.950116339 - 54.738367833 -114.894576011 - 54.811832224 -114.988082350 -} -85056193fffffff -{ - 86.438223370 156.122750466 - 86.345458401 156.348068076 - 86.309108653 157.726374970 - 86.364039822 158.925379713 - 86.457327667 158.765688193 - 86.495206386 157.340647593 -} -8500e977fffffff -{ - 88.003976711 27.595274969 - 88.069059241 29.418014068 - 88.158920771 28.645970682 - 88.181452526 25.852284344 - 88.112589924 24.051298029 - 88.025069063 25.011953304 -} -856932d3fffffff -{ - 13.053061773 108.371184360 - 13.146034622 108.350191142 - 13.175314133 108.258868477 - 13.111565367 108.188547260 - 13.018548283 108.209610047 - 12.989324158 108.300924538 -} -85c7a0abfffffff -{ - -48.349352669 -135.757982504 - -48.316062361 -135.634760985 - -48.224740501 -135.613800228 - -48.166829582 -135.715699066 - -48.200091411 -135.838531096 - -48.291292504 -135.859853006 -} -85b6748ffffffff -{ - -27.240169519 -99.328878898 - -27.178474338 -99.260133124 - -27.095257034 -99.291268850 - -27.073633865 -99.390977206 - -27.135188001 -99.459768515 - -27.218506265 -99.428806300 -} -85158517fffffff -{ - 51.926867190 117.008671913 - 51.868710751 117.111178854 - 51.886912064 117.246615879 - 51.963413683 117.280033590 - 52.021805674 117.177479399 - 52.003460077 117.041553711 -} -8517a86ffffffff -{ - 55.909084171 153.687890955 - 55.824052343 153.719141054 - 55.796764413 153.873633511 - 55.854336845 153.997485723 - 55.939460744 153.966967648 - 55.966920693 153.811863995 -} -85a90387fffffff -{ - -30.350158157 -50.259964480 - -30.286429780 -50.207525176 - -30.214859718 -50.254673320 - -30.207050833 -50.354211386 - -30.270793169 -50.406622637 - -30.342330432 -50.359524017 -} -85aac357fffffff -{ - -31.502087348 78.686078207 - -31.594243896 78.713991619 - -31.618606164 78.822079321 - -31.550811301 78.902096848 - -31.458705851 78.874062503 - -31.434344094 78.766131303 -} -85f29e8ffffffff -{ - -88.907065062 -81.160023585 - -88.900160075 -76.331414887 - -88.814255124 -74.679652370 - -88.739894145 -77.409429563 - -88.745606783 -81.625454488 - -88.826762929 -83.669540070 -} -85d26167fffffff -{ - -40.543489577 -118.861581801 - -40.489479612 -118.757060870 - -40.394123124 -118.765068436 - -40.352791968 -118.877247113 - -40.406679642 -118.981595176 - -40.502020514 -118.973937461 -} -8520054bfffffff -{ - 46.643837065 71.216901491 - 46.557245190 71.281973555 - 46.552542084 71.423534089 - 46.634417087 71.500457939 - 46.721130565 71.435640045 - 46.725847480 71.293643029 -} -850772cffffffff -{ - 67.813790919 -15.038681414 - 67.844829003 -15.227879758 - 67.790268517 -15.395911104 - 67.704888379 -15.374155110 - 67.674109496 -15.185760388 - 67.728452368 -15.018318799 -} -855ca173fffffff -{ - 10.264670889 -155.875413122 - 10.172536829 -155.905263294 - 10.100618273 -155.839187150 - 10.120791036 -155.743243835 - 10.212920335 -155.713325369 - 10.284881687 -155.779418390 -} -8530ce33fffffff -{ - 34.978015499 129.902168100 - 34.908275542 129.919558697 - 34.889112834 130.014059159 - 34.939714735 130.091215257 - 35.009460749 130.073833322 - 35.028598874 129.979286543 -} -85d35c6ffffffff -{ - -45.528989865 -117.343112119 - -45.473651845 -117.230145618 - -45.377112176 -117.241572626 - -45.335916261 -117.365550081 - -45.391127245 -117.478330826 - -45.487660898 -117.467319994 -} -850b949bfffffff -{ - 54.001456861 85.155185246 - 53.910435572 85.202460351 - 53.887443399 85.358140301 - 53.955368087 85.467020798 - 54.046436782 85.420269066 - 54.069533663 85.264112396 -} -852ec89bfffffff -{ - 44.285425177 134.003821714 - 44.364605665 133.967583979 - 44.376342562 133.863851402 - 44.308975370 133.796634874 - 44.229916260 133.832970726 - 44.218103012 133.936425472 -} -8575aedbfffffff -{ - 6.913533529 -8.184166901 - 6.855809220 -8.241921327 - 6.788103497 -8.222015490 - 6.778096436 -8.144478833 - 6.835717141 -8.086768711 - 6.903448387 -8.106550882 -} -85032007fffffff -{ - 89.069916904 -31.596059516 - 89.156176887 -33.363279042 - 89.170256753 -39.703447393 - 89.095349301 -43.197345295 - 89.014804602 -40.697677446 - 89.003150677 -35.329758153 -} -852a8917fffffff -{ - 36.332803936 -78.136472886 - 36.286201279 -78.226607797 - 36.205422337 -78.216452664 - 36.171212583 -78.116476504 - 36.217648155 -78.026447411 - 36.298460288 -78.036288475 -} -85d56b3bfffffff -{ - -51.727910840 -175.774258829 - -51.662149211 -175.709824803 - -51.588773779 -175.779149207 - -51.581140650 -175.912655496 - -51.646838713 -175.977119910 - -51.720233430 -175.908048243 -} -85d4258bfffffff -{ - -52.293281052 -163.799714348 - -52.220110158 -163.743742691 - -52.153183269 -163.830516959 - -52.159371754 -163.973125398 - -52.232485932 -164.029262863 - -52.299468384 -163.942626826 -} -85b44853fffffff -{ - -23.173935875 -167.414241919 - -23.086649959 -167.371407747 - -23.009779904 -167.430888463 - -23.020130374 -167.533109393 - -23.107323611 -167.576009781 - -23.184259048 -167.516623303 -} -852ede3bfffffff -{ - 47.429912008 136.250185920 - 47.509300572 136.213953944 - 47.513687725 136.086383726 - 47.449728381 136.018899435 - 47.427004380 136.038882021 - 47.374146557 136.063115469 - 47.362359360 136.174674133 -} -85ad0067fffffff -{ - -31.958195301 13.954927268 - -32.048281670 13.945601873 - -32.103038611 14.028041061 - -32.067647817 14.119654612 - -31.977627674 14.128768279 - -31.922931998 14.046480036 -} -85f0648bfffffff -{ - -81.342456969 29.454114784 - -81.254614527 29.222817368 - -81.240557946 28.623394652 - -81.314167917 28.244249506 - -81.402643100 28.467431034 - -81.416878429 29.078006590 -} -85c459a7fffffff -{ - -47.215727897 -27.176442213 - -47.292862884 -27.242060267 - -47.373502525 -27.174474401 - -47.376963908 -27.041022679 - -47.299731441 -26.975482615 - -47.219135120 -27.043315565 -} -85ef2cdbfffffff -{ - -83.091218081 -74.789705011 - -83.075339967 -74.018315260 - -82.985578200 -73.763267284 - -82.912407482 -74.265835229 - -82.927951724 -75.020109472 - -83.016994653 -75.288682753 -} -856cce9bfffffff -{ - -1.351554993 -95.979725005 - -1.426080911 -96.037410756 - -1.511843494 -96.003947869 - -1.523088737 -95.912728944 - -1.448507356 -95.855001077 - -1.362736247 -95.888534159 -} -85e8283bfffffff -{ - -62.036485704 -93.578397736 - -61.963339697 -93.458856744 - -61.881915456 -93.531431962 - -61.873491147 -93.723037531 - -61.946482292 -93.842915819 - -62.028052495 -93.770854140 -} -8598b0d7fffffff -{ - -16.544060074 -16.274993854 - -16.625529287 -16.312713696 - -16.694325789 -16.255097287 - -16.681547012 -16.159698972 - -16.599983476 -16.122076695 - -16.531293013 -16.179754908 -} -8500ee43fffffff -{ - 85.615550578 54.570892508 - 85.644686012 55.693197655 - 85.736093425 55.931772443 - 85.798920214 55.005740633 - 85.768670653 53.847926489 - 85.676735753 53.652241398 -} -85baaec7fffffff -{ - -31.288698226 -174.868364197 - -31.206578483 -174.818280460 - -31.126397917 -174.873700231 - -31.128310982 -174.979053027 - -31.210336477 -175.029161702 - -31.290543113 -174.973892939 -} -85e576dbfffffff -{ - -66.448385032 115.843303414 - -66.381351319 115.673517504 - -66.407085767 115.442180743 - -66.500025480 115.379351690 - -66.567351476 115.549230767 - -66.541444667 115.781850256 -} -858b366ffffffff -{ - -17.848226750 -60.319940829 - -17.777629598 -60.271463785 - -17.696663788 -60.312877783 - -17.686354433 -60.402690823 - -17.756943994 -60.451103815 - -17.837850524 -60.409767893 -} -85f341affffffff -{ - -71.192458527 -139.241066280 - -71.254233791 -139.094197707 - -71.239748256 -138.832764006 - -71.163507859 -138.720305625 - -71.102091540 -138.867914742 - -71.116556886 -139.127252699 -} -85a70e03fffffff -{ - -28.117191976 113.353610619 - -28.064264571 113.290771585 - -28.075760970 113.200976168 - -28.140255071 113.173822111 - -28.193328536 113.236656207 - -28.181761684 113.326649588 -} -85e95517fffffff -{ - -61.537288692 -102.281259539 - -61.471351072 -102.144228868 - -61.384723328 -102.196972837 - -61.363927936 -102.386062902 - -61.429690759 -102.523168780 - -61.516423446 -102.471111687 -} -85066293fffffff -{ - 63.028333765 -27.700473377 - 63.041536132 -27.880570427 - 62.971561772 -28.000642108 - 62.888633081 -27.940621587 - 62.875601899 -27.761421198 - 62.945328735 -27.641347377 -} -85f0f167fffffff -{ - -73.130603958 62.139746799 - -73.039737787 62.155051440 - -72.987311394 61.905949319 - -73.025405900 61.640822769 - -73.116154287 61.622965782 - -73.168927460 61.872782041 -} -8500e607fffffff -{ - 82.992135504 51.503281922 - 83.024684641 52.185600511 - 83.115812302 52.285676140 - 83.174593591 51.686584692 - 83.141245745 50.992038893 - 83.049926681 50.908910182 -} -85cc4227fffffff -{ - -44.356466235 71.664951702 - -44.440908234 71.690493217 - -44.468213536 71.812206047 - -44.411050907 71.908212348 - -44.326625784 71.882481296 - -44.299346291 71.760933203 -} -85f1aacffffffff -{ - -77.996841888 105.423113732 - -77.925481219 105.161394296 - -77.934765399 104.719150197 - -78.015519835 104.533526968 - -78.087392556 104.793624891 - -78.077997725 105.241009888 -} -8503352ffffffff -{ - 88.878751621 -157.913974806 - 88.803998742 -160.555616069 - 88.718068681 -158.751302210 - 88.702647290 -154.698922254 - 88.771522702 -151.941742638 - 88.861510034 -153.306833637 -} -85f15597fffffff -{ - -85.347849383 55.593420898 - -85.284975250 54.756705220 - -85.312083912 53.705238227 - -85.403026757 53.459277439 - -85.467438694 54.300567162 - -85.439347390 55.383767070 -} -85be22bbfffffff -{ - -36.428412081 156.211577167 - -36.334406086 156.180476415 - -36.309087897 156.063861129 - -36.377734402 155.978126168 - -36.471794593 156.009014859 - -36.497154201 156.125850957 -} -85e56b17fffffff -{ - -71.176094805 99.055037784 - -71.094727073 98.904880756 - -71.094604810 98.609567273 - -71.175845055 98.462109607 - -71.257517859 98.611091087 - -71.257645367 98.908718781 -} -854f1daffffffff -{ - 15.734779239 155.065959244 - 15.645112870 155.078484887 - 15.606638056 155.162627326 - 15.657793218 155.234206283 - 15.747388041 155.221722232 - 15.785899267 155.137617614 -} -85271683fffffff -{ - 51.957722740 -101.676118574 - 51.883370324 -101.759212629 - 51.799113790 -101.694044412 - 51.789011001 -101.546104260 - 51.863184449 -101.462725194 - 51.947639676 -101.527569553 -} -8520314bfffffff -{ - 45.519711053 68.221600075 - 45.434908638 68.289856919 - 45.433827442 68.428526599 - 45.517556472 68.499359008 - 45.602491660 68.431306810 - 45.603565039 68.292216512 -} -855f8ddbfffffff -{ - 8.951373774 -51.273522995 - 9.030454255 -51.224218392 - 9.108880048 -51.268328253 - 9.108239013 -51.361695263 - 9.029212574 -51.410970889 - 8.950773158 -51.366908598 -} -851b54affffffff -{ - 54.890788044 -38.156288725 - 54.886394503 -38.306430468 - 54.806903742 -38.382873220 - 54.732027673 -38.309409649 - 54.736497970 -38.159918579 - 54.815767762 -38.083242300 -} -85dd1bc7fffffff -{ - -59.101077967 -13.212310083 - -59.018498953 -13.150643856 - -58.948751579 -13.265684306 - -58.961296444 -13.442244350 - -59.043704199 -13.504648759 - -59.113738770 -13.389757842 -} -85595557fffffff -{ - 19.812763949 7.733135058 - 19.720498911 7.741940100 - 19.678585598 7.829687881 - 19.728906930 7.908766716 - 19.821245161 7.900089936 - 19.863188937 7.812205917 -} -8502dd13fffffff -{ - 69.528197674 -106.942752668 - 69.445351440 -107.069327270 - 69.366192057 -106.936312802 - 69.369578670 -106.677418671 - 69.452195774 -106.549666918 - 69.531655678 -106.681977084 -} -85de0503fffffff -{ - -55.385285543 -54.842912468 - -55.340641801 -54.704408792 - -55.255467465 -54.703650906 - -55.214956899 -54.840652435 - -55.259384604 -54.978760257 - -55.344538304 -54.980262276 -} -85172b6bfffffff -{ - 62.127558132 160.554428454 - 62.035886270 160.569745868 - 61.997295212 160.750885648 - 62.050119449 160.917430536 - 62.141820751 160.903295721 - 62.180669288 160.721432503 -} -85ef1c5bfffffff -{ - -81.666083581 -31.984949093 - -81.590324546 -31.574911911 - -81.501210990 -31.821498245 - -81.487220764 -32.468969238 - -81.562080170 -32.881903235 - -81.651825525 -32.644620320 -} -851eaa53fffffff -{ - 43.000035210 14.559591117 - 42.909620717 14.563771330 - 42.869539887 14.675471480 - 42.919843649 14.783166606 - 43.010291314 14.779215684 - 43.050402194 14.667340195 -} -858f1bcbfffffff -{ - -5.289212589 -84.836454086 - -5.366850738 -84.894855400 - -5.455803773 -84.856386424 - -5.467095863 -84.759478562 - -5.389422032 -84.701086839 - -5.300491822 -84.739593243 -} -85e85823fffffff -{ - -55.932938054 -83.525355637 - -55.852056517 -83.445692391 - -55.773898137 -83.523548743 - -55.776463338 -83.680896106 - -55.857257899 -83.760978932 - -55.935574349 -83.683296461 -} -85e4a013fffffff -{ - -54.447338863 106.040280896 - -54.369819286 105.941088815 - -54.380415520 105.775884892 - -54.468589542 105.709165813 - -54.546329357 105.808154576 - -54.535674715 105.974067893 -} -85ef2c83fffffff -{ - -82.638676613 -77.630430556 - -82.627287914 -76.901876874 - -82.539120899 -76.628553846 - -82.463087121 -77.072726143 - -82.474263692 -77.785754042 - -82.561682512 -78.069915707 -} -852b4647fffffff -{ - 40.570635268 -61.140393743 - 40.537157591 -61.250683429 - 40.453319664 -61.270190103 - 40.403044366 -61.179747497 - 40.436419312 -61.069756009 - 40.520172044 -61.049909404 -} -857ee033fffffff -{ - 0.447275653 171.846103238 - 0.367780043 171.853445794 - 0.339099464 171.914837467 - 0.389824602 171.968830409 - 0.469220014 171.961522691 - 0.497990434 171.900187216 -} -85f16373fffffff -{ - -86.450537335 20.964332111 - -86.359173023 20.615958562 - -86.332924379 19.226651183 - -86.396936866 18.130568036 - -86.489211346 18.418558082 - -86.516599325 19.864322894 -} -85b24543fffffff -{ - -29.701478410 -63.432732116 - -29.775301168 -63.483592975 - -29.843505023 -63.441046939 - -29.837867972 -63.347686923 - -29.764089791 -63.296933985 - -29.695904112 -63.339433046 -} -85054b33fffffff -{ - 80.452139035 -177.533333610 - 80.360461848 -177.699997512 - 80.289627061 -177.315386697 - 80.309688447 -176.765179644 - 80.400876170 -176.590780301 - 80.472495819 -176.974232865 -} -85228377fffffff -{ - 51.622912251 -159.775351472 - 51.698678657 -159.730893613 - 51.768762143 -159.810723080 - 51.763037314 -159.935246645 - 51.687167251 -159.979569032 - 51.617125682 -159.899504093 -} -856e2a43fffffff -{ - 5.052101205 -117.523036913 - 5.124329382 -117.478725825 - 5.200270187 -117.524585682 - 5.203888831 -117.614777782 - 5.131597072 -117.659006476 - 5.055750208 -117.613125627 -} -85d2aa07fffffff -{ - -43.449538195 -100.109810572 - -43.378948174 -100.019670884 - -43.286429746 -100.058824036 - -43.264394860 -100.187819356 - -43.334839984 -100.278024467 - -43.427464758 -100.239169615 -} -857a5abbfffffff -{ - 3.827683272 37.681908117 - 3.915533390 37.683449440 - 3.964190699 37.605189773 - 3.925041332 37.525329304 - 3.837162798 37.523727821 - 3.788461962 37.602046984 -} -85eb3557fffffff -{ - -59.800727140 -155.543090031 - -59.798021962 -155.399742472 - -59.724066926 -155.335758144 - -59.652978282 -155.414919279 - -59.655775525 -155.557645128 - -59.729569466 -155.621829854 -} -85ef34c3fffffff -{ - -87.206220147 -33.816053976 - -87.134265094 -32.589931957 - -87.047256893 -33.256857822 - -87.030498574 -35.071399200 - -87.099816243 -36.313361899 - -87.188490063 -35.728280221 -} -855aaa23fffffff -{ - 19.542996382 175.048619957 - 19.633210371 175.057462526 - 19.683560202 174.976303910 - 19.643581584 174.886341639 - 19.553328943 174.877663234 - 19.503093435 174.958782826 -} -854db20bfffffff -{ - 30.869239034 -72.451799212 - 30.830673870 -72.536827192 - 30.757236454 -72.536244881 - 30.722366997 -72.450889503 - 30.760797188 -72.365992038 - 30.834231565 -72.366319446 -} -85c49a97fffffff -{ - -44.398763259 -47.333755958 - -44.458929286 -47.404216756 - -44.540572865 -47.373829927 - -44.562101826 -47.272703443 - -44.501864331 -47.202123018 - -44.420169429 -47.232788623 -} -85f1938ffffffff -{ - -73.377278027 106.622363820 - -73.303793506 106.422846839 - -73.315424316 106.094601204 - -73.400640199 105.963082740 - -73.474507871 106.161833403 - -73.462775786 106.492885779 -} -854d1e77fffffff -{ - 27.661914470 -65.761783566 - 27.629897257 -65.844721536 - 27.562063636 -65.853456750 - 27.526282318 -65.779467533 - 27.558196610 -65.696683252 - 27.625994945 -65.687734637 -} -85e175c3fffffff -{ - -67.639291377 56.134793707 - -67.549332810 56.169017144 - -67.492772808 55.996284822 - -67.525889742 55.789219790 - -67.615679348 55.753640318 - -67.672521650 55.926477661 -} -85cb1bb3fffffff -{ - -36.886946358 51.793841366 - -36.976320742 51.799419990 - -37.021695811 51.895822233 - -36.977627393 51.986634484 - -36.888185210 51.980883715 - -36.842879170 51.884492951 -} -85e2ed17fffffff -{ - -52.688023121 -133.168779645 - -52.653663723 -133.033368643 - -52.561700683 -133.015231131 - -52.504203979 -133.132041096 - -52.538517405 -133.267001988 - -52.630373293 -133.285602121 -} -8500e3dbfffffff -{ - 84.178640638 55.260499077 - 84.206254463 56.106814092 - 84.297041688 56.291640053 - 84.360639826 55.606610728 - 84.332197695 54.740055740 - 84.241000797 54.579030135 -} -85e80253fffffff -{ - -65.445519981 -88.197251087 - -65.445565226 -87.981410744 - -65.368638820 -87.863293146 - -65.291992692 -87.960491465 - -65.292031458 -88.174929395 - -65.368632668 -88.293565385 -} -85283643fffffff -{ - 37.764993974 -120.382004293 - 37.847002773 -120.327202952 - 37.922171341 -120.388272989 - 37.915275725 -120.504157606 - 37.833259568 -120.558802106 - 37.758146354 -120.497719164 -} -859832c7fffffff -{ - -12.741861970 -10.871731488 - -12.820659021 -10.903527892 - -12.884975985 -10.843955536 - -12.870383924 -10.752560599 - -12.791513646 -10.720877432 - -12.727308582 -10.780475757 -} -859892c7fffffff -{ - -20.169313829 -17.897542307 - -20.253112616 -17.938092648 - -20.325181426 -17.879719173 - -20.313349960 -17.780717952 - -20.229450361 -17.740264009 - -20.157483028 -17.798714594 -} -85f31d67fffffff -{ - -76.585112938 -160.539822673 - -76.663232621 -160.460265244 - -76.680966721 -160.103608457 - -76.620232590 -159.830082468 - -76.542319025 -159.913398442 - -76.524931052 -160.266502672 -} -856aed0bfffffff -{ - 3.310296489 32.702089042 - 3.399493606 32.705537186 - 3.448366932 32.626636490 - 3.408095392 32.544247343 - 3.318889689 32.540737858 - 3.269964020 32.619678856 -} -857b0d17fffffff -{ - -6.872060773 46.015399658 - -6.779965735 46.013778921 - -6.732550892 45.935433602 - -6.777228156 45.858617998 - -6.869396390 45.860180827 - -6.916814194 45.938617221 -} -8552e8cbfffffff -{ - 13.853131379 47.744152920 - 13.770334726 47.723512316 - 13.718830629 47.782824243 - 13.750026385 47.862707952 - 13.832715639 47.883413889 - 13.884316513 47.824170948 -} -85034967fffffff -{ - 76.834613112 -61.323388741 - 76.806040474 -61.701989786 - 76.717920712 -61.765987663 - 76.658554619 -61.455404925 - 76.686835576 -61.080281248 - 76.774771956 -61.012281703 -} -85f29313fffffff -{ - -89.759257469 35.809761403 - -89.675095513 27.988711359 - -89.650961460 12.956460504 - -89.698238356 -1.443523397 - -89.789179576 -5.218760432 - -89.833847437 19.354357128 -} -85e38253fffffff -{ - -67.631707069 -124.309861804 - -67.595296657 -124.108880885 - -67.511253096 -124.107733914 - -67.463657176 -124.306369645 - -67.499912594 -124.506553674 - -67.583918235 -124.508897653 -} -850b8973fffffff -{ - 60.508331775 89.618719719 - 60.419512534 89.662714048 - 60.389938907 89.838720194 - 60.449056545 89.971297859 - 60.537904088 89.928057705 - 60.567606106 89.751484550 -} -8510ac1bfffffff -{ - 55.864424383 47.150285822 - 55.801883460 47.262348931 - 55.828901640 47.415133308 - 55.918593206 47.456293422 - 55.981275166 47.344080316 - 55.954124208 47.190856324 -} -85acee6bfffffff -{ - -19.152739260 6.539381632 - -19.236983366 6.523353730 - -19.297494060 6.594663070 - -19.273658322 6.681919737 - -19.189423618 6.697780863 - -19.129015108 6.626552138 -} -85149c3bfffffff -{ - 47.036183760 130.155706844 - 46.972102782 130.225176563 - 46.974122350 130.349936435 - 47.040257708 130.405680686 - 47.104536669 130.336381110 - 47.102482185 130.211166023 -} -85dd6d67fffffff -{ - -59.068614259 -36.517647871 - -59.002115961 -36.394340823 - -58.916238679 -36.448776226 - -58.896695771 -36.625725332 - -58.962903967 -36.749107127 - -59.048944694 -36.695467798 -} -85ee506bfffffff -{ - -69.017973416 -42.204334668 - -68.953336025 -42.003538232 - -68.859223127 -42.059518839 - -68.829595988 -42.314354211 - -68.893839359 -42.514894800 - -68.988102583 -42.460862279 -} -85716e0ffffffff -{ - 11.650215286 -163.359506711 - 11.558856958 -163.385628081 - 11.489950152 -163.319515097 - 11.512363182 -163.227226432 - 11.603750375 -163.201019639 - 11.672695724 -163.267186859 -} -8507452bfffffff -{ - 63.591913466 -17.408756770 - 63.617258095 -17.572692996 - 63.558992376 -17.710943950 - 63.475590389 -17.684912077 - 63.450472684 -17.521616724 - 63.508530647 -17.383713273 -} -857c7483fffffff -{ - -0.605723182 -26.125613935 - -0.525723670 -26.080897253 - -0.444181402 -26.126120492 - -0.442584499 -26.216110197 - -0.522601221 -26.260897024 - -0.604197657 -26.215624088 -} -8582ea0bfffffff -{ - 1.103625411 5.543705937 - 1.187432635 5.555696665 - 1.232429695 5.493407745 - 1.193699779 5.419193273 - 1.109983921 5.407176456 - 1.064906626 5.469400130 -} -85f16187fffffff -{ - -86.740347982 -9.561670555 - -86.649863731 -9.100581033 - -86.583009316 -10.202999210 - -86.604396692 -11.763285559 - -86.693584808 -12.289815034 - -86.762716740 -11.192598993 -} -85e30113fffffff -{ - -64.370762168 -145.883640918 - -64.359957007 -145.706407277 - -64.281416371 -145.651720543 - -64.213833260 -145.773719950 - -64.224659441 -145.950049738 - -64.303047619 -146.005280963 -} -85e77053fffffff -{ - -71.826404540 24.966067285 - -71.737796578 24.876904600 - -71.714429019 24.593276690 - -71.779539732 24.396418484 - -71.868440801 24.483491138 - -71.891939009 24.769524786 -} -859781dbfffffff -{ - -13.702357255 36.944772937 - -13.605796222 36.946731653 - -13.555877385 36.862451647 - -13.602508573 36.776147297 - -13.699105731 36.774118706 - -13.749035644 36.858464356 -} -85f301b3fffffff -{ - -74.278700604 -162.531110245 - -74.354354179 -162.475099253 - -74.373439907 -162.179226166 - -74.316549289 -161.941756169 - -74.241039255 -162.000506012 - -74.222274435 -162.293997712 -} -85353457fffffff +85db58a3fffffff { - 46.277663241 -27.550532990 - 46.200515412 -27.628711251 - 46.116404996 -27.569555802 - 46.109370184 -27.432417463 - 46.186437688 -27.354113555 - 46.270620284 -27.413072870 + -57.946334712 163.407950683 + -57.870631785 163.354007923 + -57.859416804 163.191459717 + -57.923887197 163.082379170 + -57.999667898 163.135999503 + -58.010900542 163.299024089 } -851d9627fffffff -{ - 53.596226500 -155.703112925 - 53.667074592 -155.653377407 - 53.732547729 -155.702679920 - 53.735224016 -155.838844192 - 53.714261970 -155.867650669 - 53.666952137 -155.900732976 - 53.596127995 -155.826602619 -} -85f00507fffffff -{ - -80.125547896 69.634788001 - -80.081165328 69.172273592 - -80.125466292 68.740463476 - -80.214854893 68.767729570 - -80.259801099 69.235195223 - -80.214789357 69.670429535 -} -854ccbd3fffffff -{ - 15.500219094 -66.287603474 - 15.443331676 -66.333403155 - 15.370965812 -66.296353293 - 15.355561986 -66.213531091 - 15.412492780 -66.167805513 - 15.484784056 -66.204827958 -} -856d4ccbfffffff -{ - 9.640357236 -86.987292637 - 9.570437783 -87.043388187 - 9.491341789 -87.007306879 - 9.482199976 -86.915088667 - 9.552178932 -86.858992101 - 9.631240157 -86.895114642 -} -85298883fffffff -{ - 38.484564572 -118.650885644 - 38.565731869 -118.593846920 - 38.641569025 -118.654617008 - 38.636185536 -118.772453168 - 38.555005137 -118.829342715 - 38.479221306 -118.768545639 -} -85404027fffffff -{ - 25.379834284 100.217757764 - 25.467814225 100.192515914 - 25.494149456 100.092942803 - 25.432494578 100.018647754 - 25.344498194 100.043949177 - 25.318173069 100.143486190 -} -85dbaa83fffffff -{ - -50.947511917 178.034278058 - -50.874411249 177.972185429 - -50.878159336 177.838995794 - -50.955072522 177.767546663 - -51.028269373 177.829570214 - -51.024456806 177.963112728 -} -85d389c7fffffff -{ - -48.739500303 -103.074768574 - -48.670625778 -102.970957112 - -48.576959644 -103.009061787 - -48.552077459 -103.150585643 - -48.620802898 -103.254425904 - -48.714559404 -103.216714447 -} -858e93cffffffff -{ - -14.023383753 -95.176635212 - -14.096970072 -95.236788812 - -14.186009244 -95.201559175 - -14.201491575 -95.106101898 - -14.127880569 -95.045906351 - -14.038811946 -95.081209919 -} -852fb66ffffffff -{ - 41.122498131 158.560935604 - 41.217388424 158.551434202 - 41.257194940 158.437962845 - 41.202067806 158.334215163 - 41.107232415 158.343982654 - 41.067469097 158.457232006 -} -853b7627fffffff -{ - 36.839561064 -46.198602146 - 36.753973244 -46.243459722 - 36.678911314 -46.177434023 - 36.689331468 -46.066533302 - 36.774906024 -46.021451882 - 36.850073792 -46.087494695 -} -85ef2157fffffff -{ - -83.847106064 -70.861175904 - -83.825091040 -70.006902732 - -83.733567797 -69.778321402 - -83.664720326 -70.384856456 - -83.686200087 -71.218828170 - -83.777052407 -71.466261589 -} -85055b9bfffffff +8502ab03fffffff { - 79.312347702 164.729936926 - 79.215611822 164.732718989 - 79.166931308 165.178986859 - 79.214350136 165.626240940 - 79.311057901 165.631356246 - 79.360380613 165.181323343 -} -85096d57fffffff -{ - 73.273287849 10.221993134 - 73.338667585 10.344263801 - 73.404515223 10.176035230 - 73.404554829 9.884590170 - 73.338852798 9.763925520 - 73.273432881 9.933085238 -} -85f291a7fffffff -{ - -88.625217494 -125.630792601 - -88.685740904 -122.679353252 - -88.648750717 -119.082447235 - -88.554959022 -118.762375003 - -88.499393242 -121.615550944 - -88.532927515 -124.900792735 -} -850342cffffffff -{ - 81.403442769 -70.340881536 - 81.364262656 -70.872877300 - 81.279196413 -70.884503638 - 81.233355123 -70.373674361 - 81.271926599 -69.847166527 - 81.356941847 -69.826013954 -} -85d19b93fffffff -{ - -48.229143560 2.166035274 - -48.318853783 2.136064005 - -48.377526023 2.237826041 - -48.346408459 2.369441923 - -48.256702826 2.399068575 - -48.198109982 2.297424269 -} -85032047fffffff -{ - 89.405989338 -50.794425412 - 89.476803191 -56.640749329 - 89.450436725 -66.270069839 - 89.359851639 -67.743940606 - 89.301347630 -61.792614731 - 89.322165805 -54.178496458 -} -850cc6c7fffffff -{ - 58.044424781 -162.159742503 - 57.972118545 -162.246843890 - 57.903476442 -162.171719694 - 57.906942151 -162.009974938 - 57.978993022 -161.922559331 - 58.047833358 -161.997200106 -} -8546db73fffffff -{ - 13.579984560 -167.060082292 - 13.489378767 -167.084207446 - 13.422864595 -167.018548120 - 13.446925226 -166.928692913 - 13.537577411 -166.904476414 - 13.604122614 -166.970206417 -} -85cd43a3fffffff -{ - -50.414285349 78.144349386 - -50.326135097 78.114536498 - -50.301912557 77.978858290 - -50.365677678 77.872575729 - -50.453867335 77.901851167 - -50.478252862 78.037947322 -} -8516340bfffffff -{ - 56.631173690 157.107388909 - 56.544789102 157.129781953 - 56.512989645 157.284104933 - 56.567375348 157.416606072 - 56.653820374 157.395006884 - 56.685819885 157.240111705 -} -853f2643fffffff -{ - 38.051002825 15.606048004 - 37.956955012 15.608965398 - 37.913400133 15.714547591 - 37.963858260 15.817362133 - 38.057938076 15.814652054 - 38.101527902 15.708920011 -} -85e14a1bfffffff -{ - -62.946641338 48.186224316 - -62.861713882 48.237800973 - -62.801871436 48.117182728 - -62.826729708 47.945185018 - -62.911451368 47.892867761 - -62.971520730 48.013285615 -} -851a056ffffffff -{ - 50.350296653 -43.453423527 - 50.267992178 -43.512705284 - 50.198511743 -43.434137228 - 50.211244399 -43.296297841 - 50.293523738 -43.236702016 - 50.363095659 -43.315258949 -} -855a3123fffffff -{ - 13.165541430 173.883569118 - 13.249531348 173.890760998 - 13.295304558 173.814264902 - 13.256977311 173.730617524 - 13.172958316 173.723570306 - 13.127295508 173.800025728 -} -851cc5d3fffffff -{ - 45.342140810 -141.307027228 - 45.279982861 -141.348167109 - 45.221578236 -141.276211901 - 45.225328624 -141.163199078 - 45.287471519 -141.122033289 - 45.345879107 -141.193905986 -} -85d2ed8ffffffff -{ - -38.321425227 -110.718236290 - -38.260287948 -110.623397766 - -38.166057406 -110.643771367 - -38.132922609 -110.758670307 - -38.193915181 -110.853437340 - -38.288187034 -110.833377247 -} -85f00347fffffff -{ - -78.082910079 70.424092677 - -77.993976228 70.387607173 - -77.950922966 70.005433263 - -77.996388204 69.657027536 - -78.085341100 69.688369685 - -78.128812951 70.073263265 -} -851eca63fffffff -{ - 39.750384977 26.602687705 - 39.657202615 26.594447253 - 39.604261710 26.697162096 - 39.644442393 26.808179244 - 39.737602514 26.816633839 - 39.790604340 26.713857282 -} -85130873fffffff -{ - 64.605410022 -118.124782617 - 64.518482130 -118.189377101 - 64.448629615 -118.055452296 - 64.465444319 -117.856919900 - 64.552284189 -117.791263663 - 64.622397971 -117.925198140 -} -851165cffffffff -{ - 68.380647676 32.492597345 - 68.344701846 32.666351753 - 68.390596829 32.850404606 - 68.472611239 32.861068422 - 68.508665724 32.686494338 - 68.462596565 32.502077576 -} -853b5ea7fffffff -{ - 32.262395038 -44.344615598 - 32.178029439 -44.389562940 - 32.100555075 -44.327958260 - 32.107332612 -44.221405307 - 32.191669495 -44.176264122 - 32.269257657 -44.237869418 -} -85045d17fffffff -{ - 73.379918439 -179.609506590 - 73.287057072 -179.695224076 - 73.219986578 -179.462305120 - 73.245303039 -179.143790573 - 73.337886752 -179.055312386 - 73.405433168 -179.288093187 -} -859f8247fffffff -{ - -13.245671734 173.867140185 - -13.169715090 173.830899962 - -13.153741113 173.746032785 - -13.213748070 173.697264954 - -13.289818092 173.733458702 - -13.305767732 173.818466956 + 74.277158366 -121.033908777 + 74.189158745 -121.119055798 + 74.126778384 -120.900419895 + 74.152036353 -120.596312680 + 74.239916087 -120.508447758 + 74.302659231 -120.727396995 } -85f2a9c7fffffff +85ef8867fffffff { - -83.266791315 -127.928131475 - -83.328734050 -127.372385894 - -83.299154943 -126.630827547 - -83.208170991 -126.460545329 - -83.147301654 -127.015268653 - -83.176352236 -127.741482296 -} -853b1163fffffff -{ - 35.910743313 -53.515196793 - 35.826111814 -53.548622095 - 35.757458406 -53.481485971 - 35.773339658 -53.380851111 - 35.857992437 -53.347195936 - 35.926742792 -53.414405334 -} -85ec7007fffffff -{ - -74.786862882 148.166764464 - -74.767112074 147.854211186 - -74.833190018 147.623953499 - -74.919388711 147.706671611 - -74.939252073 148.022188373 - -74.872803145 148.252006106 -} -850a6697fffffff -{ - 71.054579450 84.455092585 - 71.033011134 84.728842375 - 71.098839711 84.913103833 - 71.186640773 84.823226700 - 71.208315437 84.547213744 - 71.142081915 84.363352921 -} -856e0a33fffffff -{ - 7.750282651 -117.275265591 - 7.825157659 -117.229814109 - 7.903233588 -117.276556596 - 7.906340404 -117.368773844 - 7.831403602 -117.414140331 - 7.753421737 -117.367374740 -} -85e731cffffffff -{ - -69.368574973 42.391287369 - -69.294734673 42.247352617 - -69.296226587 42.001971874 - -69.371680750 41.898665980 - -69.445895722 42.042006191 - -69.444281304 42.289256052 -} -85dfae43fffffff -{ - -61.810102768 -48.024879570 - -61.754604422 -47.863924497 - -61.663406671 -47.885981625 - -61.627653574 -48.067855683 - -61.682858663 -48.228441422 - -61.774109238 -48.207523799 -} -8532eb8ffffffff -{ - 40.371067425 160.371381906 - 40.466671559 160.364206823 - 40.508651162 160.252082793 - 40.454974803 160.147338744 - 40.359416314 160.154781129 - 40.317488371 160.266700473 -} -856631a7fffffff -{ - 10.653628081 -75.132785630 - 10.587283800 -75.184962807 - 10.508659386 -75.146743290 - 10.496443281 -75.056346648 - 10.562834917 -75.004219273 - 10.641395308 -75.042438621 -} -854040abfffffff -{ - 25.185538444 100.640553956 - 25.273704002 100.615483116 - 25.300337168 100.516115045 - 25.238793109 100.441852602 - 25.150609621 100.466983978 - 25.123988062 100.566317372 -} -850d9147fffffff -{ - 65.868193001 179.207198116 - 65.777664187 179.152600629 - 65.715524163 179.316543459 - 65.743564634 179.535091035 - 65.833897921 179.591033120 - 65.896387043 179.427088024 -} -850221b7fffffff -{ - 81.460325218 -91.249580689 - 81.477247176 -91.828072621 - 81.411011403 -92.246234660 - 81.328719857 -92.086411075 - 81.312263211 -91.517469869 - 81.377638124 -91.098898580 -} -85515607fffffff -{ - 16.142525653 -132.979850110 - 16.057552303 -133.015985434 - 15.982723213 -132.960610580 - 15.992866904 -132.869193983 - 16.077769127 -132.833070788 - 16.152598778 -132.888351941 -} -855a9103fffffff -{ - 22.012358704 178.809638949 - 22.103623092 178.822393961 - 22.156865133 178.742310132 - 22.118725025 178.649485652 - 22.027400853 178.636893891 - 21.974276457 178.716963189 -} -85e62853fffffff -{ - -66.430659246 17.994560810 - -66.341838612 17.952291624 - -66.307748105 17.739859989 - -66.362297951 17.568456437 - -66.451287765 17.609294617 - -66.485559441 17.822971408 -} -8500eadbfffffff -{ - 86.082446098 60.516122343 - 86.102697524 61.815130362 - 86.191944533 62.229558089 - 86.261939998 61.297585779 - 86.240784952 59.946944215 - 86.150564392 59.581137636 -} -852984c3fffffff -{ - 35.300593277 -115.643763352 - 35.382387256 -115.585445937 - 35.462455453 -115.642975024 - 35.460675517 -115.758870235 - 35.378857215 -115.817065261 - 35.298843159 -115.759487819 -} -85f29907fffffff + -76.366593705 -13.832671015 + -76.275751544 -13.688735109 + -76.200712243 -13.946113425 + -76.215947314 -14.346563296 + -76.306423806 -14.494218629 + -76.382032647 -14.237739372 +} +854984affffffff +{ + 18.683521811 -101.470658176 + 18.761576390 -101.410991704 + 18.848850734 -101.451941777 + 18.858033871 -101.552668131 + 18.779897910 -101.612323618 + 18.692660250 -101.571263949 +} +85ed931bfffffff +{ + -59.691561026 148.259164460 + -59.664202364 148.097380471 + -59.724089923 147.979044409 + -59.811561044 148.022613086 + -59.838959517 148.185189009 + -59.778846842 148.303401906 +} +85a81b73fffffff +{ + -20.254630360 -48.418911265 + -20.179603659 -48.367138737 + -20.099220210 -48.414106432 + -20.093895091 -48.512806205 + -20.168929497 -48.564559818 + -20.249281321 -48.517632716 +} +85149e87fffffff +{ + 46.442365803 129.665998229 + 46.379293164 129.735123618 + 46.381746455 129.857680243 + 46.447310007 129.911549138 + 46.510578363 129.842581043 + 46.508087338 129.719585704 +} +857c846ffffffff +{ + 2.211488648 -15.335453465 + 2.284210874 -15.298169006 + 2.360109498 -15.338191668 + 2.363358521 -15.415570367 + 2.290610055 -15.452940576 + 2.214638767 -15.412846355 +} +85dba1a7fffffff +{ + -52.058102226 179.983449748 + -51.987641060 179.918716458 + -51.994117637 179.785256734 + -52.071125533 179.716175574 + -52.141680818 179.780862566 + -52.135134025 179.914677758 +} +8500d5affffffff +{ + 83.648974651 83.092405163 + 83.632955408 83.913543934 + 83.705225636 84.459035218 + 83.794646565 84.179314753 + 83.811008441 83.337326624 + 83.737599811 82.796242796 +} +852c1c6bfffffff +{ + 37.859596700 46.293454759 + 37.793375442 46.372710989 + 37.812740358 46.479124023 + 37.898458999 46.506490157 + 37.964819535 46.427151056 + 37.945321945 46.320528455 +} +85e4818bfffffff +{ + -53.006413965 100.928719450 + -52.925415995 100.843362137 + -52.929053047 100.683227179 + -53.013699252 100.607774674 + -53.094896226 100.692829697 + -53.091247948 100.853641569 +} +855d9573fffffff +{ + 15.067941459 -161.225750122 + 14.975822934 -161.253455396 + 14.906592802 -161.186063855 + 14.929450444 -161.090921321 + 15.021593675 -161.063131966 + 15.090854608 -161.130569131 +} +85005573fffffff +{ + 84.172620873 11.498061948 + 84.249527443 11.894039559 + 84.325548421 11.389832557 + 84.323437947 10.479559904 + 84.245548784 10.098300023 + 84.170748968 10.612156822 +} +851895dbfffffff +{ + 51.104474187 -27.146087977 + 51.030726772 -27.230814320 + 50.949989395 -27.167604297 + 50.942927150 -27.019899532 + 51.016591065 -26.935033177 + 51.097400670 -26.998010649 +} +85daad53fffffff +{ + -48.565326384 168.401277548 + -48.483069200 168.350048690 + -48.474484165 168.214119415 + -48.548178542 168.129070102 + -48.630525377 168.180121759 + -48.639088219 168.316400732 +} +85cb40a7fffffff +{ + -32.900906802 59.665291162 + -32.994427134 59.677738015 + -33.034185827 59.779451274 + -32.980356598 59.868656271 + -32.886798464 59.856039112 + -32.847107260 59.754387250 +} +8584c08bfffffff +{ + -10.437053167 68.641948342 + -10.527011470 68.658986072 + -10.556935749 68.749315973 + -10.496836501 68.822526627 + -10.406898470 68.805376386 + -10.377039310 68.715127911 +} +85eb4497fffffff +{ + -68.407173631 -155.355267079 + -68.473186192 -155.288940342 + -68.479663283 -155.073953363 + -68.419963701 -154.926662426 + -68.354130088 -154.994165398 + -68.347816390 -155.207788532 +} +85681e8bfffffff +{ + 5.062193960 116.925584138 + 4.972896616 116.941942430 + 4.943394093 117.022666594 + 5.003254091 117.087099681 + 5.092637559 117.070728317 + 5.122074895 116.989936891 +} +851625cffffffff +{ + 58.933294190 162.602371379 + 58.844296406 162.609809440 + 58.804713171 162.768459365 + 58.853881205 162.920191164 + 58.942884368 162.913699085 + 58.982714871 162.754528931 +} +8513700bfffffff +{ + 65.738899668 -111.791472422 + 65.653716354 -111.882304756 + 65.577616880 -111.756366593 + 65.586425578 -111.539877281 + 65.671454340 -111.448030285 + 65.747829391 -111.573682053 +} +85e5ae0bfffffff +{ + -57.323158204 115.977236593 + -57.254788416 115.850991233 + -57.279290784 115.679513019 + -57.372308633 115.633579976 + -57.440914380 115.759882306 + -57.416265839 115.932062532 +} +85e8936ffffffff +{ + -68.145603299 -63.331377821 + -68.109428145 -63.094263536 + -68.015650370 -63.056939323 + -67.958190867 -63.254918477 + -67.994133158 -63.490590511 + -68.087766596 -63.529721023 +} +855483d7fffffff +{ + 13.401883845 -21.153729432 + 13.334007730 -21.211240051 + 13.256327026 -21.176673403 + 13.246453228 -21.084713435 + 13.314216227 -21.027182212 + 13.391966061 -21.061631353 +} +85805143fffffff +{ + 0.856888245 -46.520006709 + 0.939403298 -46.469674661 + 1.023624187 -46.515756289 + 1.025338910 -46.612139327 + 0.942855887 -46.662461779 + 0.858626124 -46.616410925 +} +85e80a73fffffff +{ + -62.374347191 -85.302869625 + -62.296064344 -85.203714985 + -62.221021190 -85.292808669 + -62.224095771 -85.480764548 + -62.302263466 -85.580469956 + -62.377471832 -85.491671550 +} +851a435bfffffff +{ + 45.846688055 -35.163663745 + 45.765079908 -35.231494520 + 45.685495331 -35.164667380 + 45.687428549 -35.030117049 + 45.768978980 -34.962078580 + 45.848653939 -35.028797406 +} +85bab0d3fffffff +{ + -32.519859817 -170.085897177 + -32.434852842 -170.037506721 + -32.355393284 -170.099473936 + -32.360900198 -170.209702350 + -32.445821723 -170.258152660 + -32.525321770 -170.196315054 +} +856a9dc7fffffff +{ + -0.695778468 22.595176525 + -0.603653105 22.602452408 + -0.553396199 22.524993757 + -0.595199080 22.440263802 + -0.687288565 22.432931311 + -0.737611122 22.510385332 +} +8500a3affffffff +{ + 77.414768146 65.367918199 + 77.424257270 65.775407179 + 77.507758317 65.929030368 + 77.582131578 65.671227303 + 77.572407286 65.258624359 + 77.488546764 65.108979215 +} +85011a17fffffff +{ + 74.621186952 37.621752395 + 74.665662783 37.880087514 + 74.749405086 37.839542220 + 74.788504416 37.537444341 + 74.743544092 37.278181818 + 74.659971038 37.321936861 +} +85760dc7fffffff +{ + 1.398655633 161.276804380 + 1.310458800 161.287340056 + 1.278203533 161.363121063 + 1.334064419 161.428317728 + 1.422174682 161.417822699 + 1.454510620 161.342090361 +} +850dadb7fffffff +{ + 69.565990388 -164.218988635 + 69.484641960 -164.351598285 + 69.406352199 -164.221936740 + 69.409100281 -163.960793258 + 69.490081815 -163.827232925 + 69.568681945 -163.955755702 +} +852e0b07fffffff +{ + 40.417109663 139.164109984 + 40.501865064 139.133988096 + 40.521428903 139.030647308 + 40.456290550 138.957691991 + 40.371658687 138.987944146 + 40.352041662 139.091021806 +} +8545608ffffffff +{ + 19.917934113 -94.651593249 + 19.992429413 -94.589524797 + 20.079997428 -94.624779853 + 20.093064186 -94.722237257 + 20.018486219 -94.784336017 + 19.930924238 -94.748947220 +} +854ece1bfffffff +{ + 27.087998022 145.225431698 + 27.176086555 145.204798000 + 27.207917042 145.113477703 + 27.151663391 145.042981867 + 27.063689139 145.063743305 + 27.031854252 145.154873116 +} +85162323fffffff +{ + 56.988890044 164.070728473 + 56.901850733 164.073510532 + 56.861668655 164.219978741 + 56.908284758 164.364084763 + 56.995314732 164.362132789 + 57.035738611 164.215244678 +} +850d0d63fffffff +{ + 69.672079010 -149.657314475 + 69.605325200 -149.839138546 + 69.520460535 -149.772871429 + 69.502203734 -149.526563594 + 69.568570771 -149.344808881 + 69.653580216 -149.409285554 +} +85d68e47fffffff +{ + -44.192224048 39.795114399 + -44.121300081 39.796041506 + -44.091876070 39.698709067 + -44.133381750 39.600345043 + -44.204323383 39.599325403 + -44.233741758 39.696762370 +} +855ec64ffffffff +{ + 18.366519140 -53.827969754 + 18.438733411 -53.779890078 + 18.506764190 -53.822362496 + 18.502603835 -53.912860439 + 18.430449217 -53.960902555 + 18.362395336 -53.918484387 +} +8536b0d7fffffff +{ + 31.058899720 -157.582349328 + 30.974042543 -157.614162663 + 30.911504289 -157.541642588 + 30.933820407 -157.437278128 + 31.018696151 -157.405377474 + 31.081237264 -157.477928450 +} +850055d3fffffff +{ + 83.486143605 13.107718724 + 83.561319116 13.480259467 + 83.638344372 13.051019093 + 83.639124369 12.240220056 + 83.563031541 11.878434791 + 83.487074218 12.316379063 +} +85545abbfffffff +{ + 9.807791235 -10.209827268 + 9.746925220 -10.269269583 + 9.674735678 -10.246615111 + 9.663382468 -10.164649570 + 9.724139066 -10.105245503 + 9.796358165 -10.127768640 +} +859233cbfffffff +{ + -8.962540199 -107.017292765 + -9.031156167 -107.072054989 + -9.115580842 -107.044525228 + -9.131448036 -106.962145059 + -9.062793768 -106.907302343 + -8.978310622 -106.934920265 +} +8557992ffffffff +{ + 15.305226322 -41.301845270 + 15.378867066 -41.252839048 + 15.454411092 -41.298842696 + 15.456354882 -41.393843945 + 15.382754055 -41.442863081 + 15.307169523 -41.396868186 +} +8548169bfffffff +{ + 23.593232273 -103.756804173 + 23.672732187 -103.695827471 + 23.760908983 -103.740271238 + 23.769548007 -103.845799825 + 23.689978546 -103.906749362 + 23.601839651 -103.862197731 +} +85d82573fffffff +{ + -53.608322193 135.810669658 + -53.563354314 135.677128728 + -53.608885541 135.551742166 + -53.699605177 135.559714835 + -53.744706867 135.693698380 + -53.698954713 135.819265997 +} +851150cbfffffff +{ + 63.837013473 39.542204560 + 63.788923007 39.687372809 + 63.826773899 39.861180488 + 63.912872029 39.890289935 + 63.961091252 39.744678340 + 63.923083111 39.570400471 +} +85cd0dc7fffffff +{ + -49.471717624 86.881512269 + -49.385697101 86.832617367 + -49.371942514 86.691198192 + -49.444103586 86.598169412 + -49.530232007 86.646609650 + -49.544091738 86.788534557 +} +859eca9bfffffff +{ + -10.904094108 158.469181672 + -10.825031748 158.443923803 + -10.803392008 158.355995167 + -10.860771631 158.293194201 + -10.939901874 158.318339700 + -10.961584692 158.406398714 +} +851e22abfffffff +{ + 50.657406466 16.829811962 + 50.574412414 16.831790217 + 50.536625331 16.954603855 + 50.581789096 17.075630617 + 50.664800916 17.073936718 + 50.702631382 16.950931573 +} +8536a977fffffff +{ + 29.540208059 -150.086465397 + 29.455429975 -150.121495332 + 29.387310456 -150.051049832 + 29.403965931 -149.945590961 + 29.488738859 -149.910501550 + 29.556861520 -149.980930299 +} +85258b67fffffff +{ + 42.088955778 96.268837166 + 41.998536899 96.286985230 + 41.968127626 96.397983738 + 42.027988688 96.491024347 + 42.118379064 96.473224970 + 42.148937103 96.362036208 +} +85f12c93fffffff +{ + -86.286013467 147.007219405 + -86.353358945 146.088825721 + -86.435456342 146.593393834 + -86.448806667 148.063554540 + -86.379403903 148.968373160 + -86.298727567 148.418213550 +} +85061d27fffffff +{ + 68.276372279 -36.603763729 + 68.280730757 -36.839815330 + 68.202923069 -36.964948188 + 68.121046450 -36.854536921 + 68.116791495 -36.620087392 + 68.194310006 -36.494454314 +} +8515628bfffffff +{ + 63.612059711 119.352174610 + 63.544407743 119.499187482 + 63.564453479 119.703566893 + 63.652329253 119.762076218 + 63.720309235 119.615069286 + 63.700084689 119.409543127 +} +850994bbfffffff +{ + 57.460287932 4.142376935 + 57.422301118 4.028050793 + 57.342191772 4.044082585 + 57.300122833 4.173988849 + 57.338071663 4.287986318 + 57.418127221 4.272405889 +} +852cd573fffffff { - -86.458877258 -79.124686486 + 35.136468631 52.802887282 + 35.064977837 52.875114111 + 35.077463842 52.983745429 + 35.161542118 53.020389668 + 35.233183673 52.948148262 + 35.220596011 52.839276807 +} +85053593fffffff +{ + 77.645161911 95.324598057 + 77.608524616 95.729003236 + 77.665979074 96.075630861 + 77.760679972 96.019146412 + 77.797712121 95.610416988 + 77.739644851 95.262519278 +} +85f0d8d7fffffff +{ + -69.813810494 58.027948307 + -69.723286439 58.057961256 + -69.667572854 57.860987155 + -69.702079245 57.633747532 + -69.792445940 57.602023816 + -69.848464517 57.799245443 +} +858e8c17fffffff +{ + -14.356654369 -89.571886939 + -14.432587444 -89.632492465 + -14.521981250 -89.594623310 + -14.535451643 -89.496091415 + -14.459498311 -89.435471280 + -14.370094873 -89.473397508 +} +85f29903fffffff +{ + -86.621648035 -78.853339098 + -86.612870460 -77.279561624 + -86.526525930 -76.688684455 -86.450541949 -77.621862371 - -86.364337000 -77.049140799 - -86.287996063 -77.934437435 - -86.295931988 -79.372357217 - -86.380595345 -79.987994746 -} -85ee0267fffffff -{ - -74.088142998 -30.104457950 - -74.009717472 -29.894297469 - -73.920485299 -30.035856723 - -73.909305771 -30.385118296 - -73.987249490 -30.596351145 - -74.076853669 -30.457274146 -} -85f2806bfffffff -{ - -87.364069085 -134.154607676 - -87.434372684 -132.870747894 - -87.413594590 -130.894332525 - -87.323536144 -130.316013727 - -87.255904265 -131.614272774 - -87.275704868 -133.480407163 -} -8552e5d7fffffff -{ - 16.148790705 46.385869601 - 16.063564950 46.365489890 - 16.009830729 46.427913881 - 16.041225904 46.510650686 - 16.126344017 46.531104521 - 16.180174582 46.468747604 + -86.458877258 -79.124686486 + -86.543623926 -79.763129235 } -85275387fffffff +85bda04bfffffff { - 44.976872177 -91.201633617 - 44.914110373 -91.291054296 - 44.827836319 -91.253676478 - 44.804192870 -91.127239088 - 44.866757192 -91.037763571 - 44.953162258 -91.074779363 + -35.877256233 42.748442036 + -35.796032498 42.748008307 + -35.762266821 42.656564169 + -35.809749638 42.565446301 + -35.891011489 42.565799416 + -35.924752486 42.657351074 } -850335bbfffffff +855394dbfffffff { - 89.117837857 166.613243114 - 89.025921264 166.466005437 - 88.973133291 170.952796256 - 89.005178920 175.889254033 - 89.095313799 176.979893972 - 89.155829224 172.231379838 -} -85d50037fffffff -{ - -55.499581856 -160.514051755 - -55.428700914 -160.458650045 - -55.367229630 -160.553772010 - -55.376571313 -160.704189425 - -55.447398350 -160.759811488 - -55.508937679 -160.664796623 -} -85c318b7fffffff -{ - -42.288383465 -60.450126364 - -42.213586979 -60.433561531 - -42.155035936 -60.504730591 - -42.171170032 -60.592591627 - -42.246004036 -60.609428724 - -42.304666586 -60.538132543 -} -8510031bfffffff -{ - 59.835562328 46.980427416 - 59.775876213 47.104328796 - 59.804238087 47.272792900 - 59.892418745 47.317887778 - 59.952252917 47.193799665 - 59.923757995 47.024802391 -} -85b28183fffffff -{ - -30.382231333 -77.527804517 - -30.453449559 -77.588603833 - -30.529360983 -77.545221940 - -30.534048529 -77.441029793 - -30.462846730 -77.380283088 - -30.386940988 -77.423675736 -} -85062a17fffffff -{ - 67.856534544 -28.745303262 - 67.871343244 -28.965352778 - 67.801193425 -29.108252223 - 67.716517402 -29.031166661 - 67.701886209 -28.812465299 - 67.771754202 -28.669506451 -} -859b5903fffffff -{ - -15.307459005 179.905076943 - -15.230255687 179.949391440 - -15.159445859 179.907815400 - -15.165797185 179.822048601 - -15.242884122 179.777741197 - -15.313736018 179.819193356 -} -859b9353fffffff -{ - -15.177877744 -163.070907326 - -15.092134342 -163.033558125 - -15.020388925 -163.092783554 - -15.034299650 -163.189299547 - -15.119958443 -163.226728100 - -15.191791138 -163.167561537 -} -8573586ffffffff -{ - 8.788132819 142.179914132 - 8.692556230 142.195186481 - 8.657387793 142.286472582 - 8.717779879 142.362488879 - 8.813336776 142.347245025 - 8.848521341 142.255956319 -} -853d610ffffffff -{ - 38.815732320 88.013628650 - 38.726184861 88.044524271 - 38.704710399 88.159171312 - 38.772666720 88.243169994 - 38.862242333 88.212580667 - 38.883833682 88.097686001 -} -85f2cd57fffffff -{ - -76.871944342 -95.544026568 - -76.887321448 -95.145729565 - -76.814307496 -94.883739988 - -76.726494363 -95.019400946 - -76.711380883 -95.413096794 - -76.783819010 -95.675699090 -} -85f17367fffffff -{ - -85.403870784 59.439344873 - -85.345758928 58.544363442 - -85.378472034 57.506075871 - -85.470427100 57.334189410 - -85.530048593 58.239225848 - -85.496179574 59.306469834 -} -853f8313fffffff -{ - 27.358332282 14.213526547 - 27.261854173 14.217390113 - 27.216338827 14.312438689 - 27.267258795 14.403752417 - 27.363779888 14.400054117 - 27.409338140 14.304876726 -} -850b968bfffffff -{ - 53.239267630 86.812376580 - 53.147683219 86.855364154 - 53.122794164 87.006718171 - 53.189376562 87.115523732 - 53.280996192 87.073054047 - 53.305998492 86.921260012 -} -85eb12cffffffff -{ - -59.638913697 -163.559287211 - -59.575275994 -163.496229435 - -59.516180337 -163.594709948 - -59.520646199 -163.756076003 - -59.584218435 -163.819349067 - -59.643390317 -163.721041865 + 19.699038041 31.881787301 + 19.605094803 31.870712462 + 19.550842836 31.951503757 + 19.590436976 32.043378153 + 19.684325207 32.054587686 + 19.738674400 31.973788263 } 8500eb0bfffffff { @@ -11327,4785 +11929,2525 @@ 87.885681693 56.561053075 87.793869970 56.063109869 } -85f17067fffffff -{ - -86.425821817 66.434460075 - -86.376936956 65.185836954 - -86.419396562 63.921401099 - -86.512469571 63.869842993 - -86.563112509 65.150103507 - -86.518877920 66.450395320 -} -8524f62bfffffff -{ - 39.201153459 102.344257806 - 39.114122824 102.351517996 - 39.081074505 102.448020690 - 39.134899443 102.537371896 - 39.221869458 102.530409196 - 39.255075332 102.433797916 -} -85f2864ffffffff -{ - -87.840903290 -165.238388599 - -87.930947141 -164.904451632 - -87.960042421 -162.518587050 - -87.896709211 -160.616574431 - -87.807782724 -161.122125536 - -87.780961905 -163.363019992 -} -8594acaffffffff -{ - -15.106946495 123.318722984 - -15.190392713 123.334929738 - -15.225394616 123.418801753 - -15.176946355 123.486521584 - -15.093439081 123.470311526 - -15.058441093 123.386384884 -} -85a765affffffff -{ - -29.629207923 105.223420330 - -29.704051223 105.261315591 - -29.707850258 105.345035246 - -29.636908746 105.390730775 - -29.562162208 105.352853311 - -29.558260475 105.269262395 -} -85ce614ffffffff -{ - -42.834069909 -89.530860296 - -42.757871916 -89.458833811 - -42.671692944 -89.511873081 - -42.661564110 -89.636763500 - -42.737648142 -89.708982548 - -42.823974999 -89.656119441 -} -8512c59bfffffff -{ - 52.676633717 -115.696922523 - 52.596958932 -115.747397421 - 52.524802263 -115.658397061 - 52.532104512 -115.518964127 - 52.611690919 -115.468005079 - 52.684063769 -115.556961836 -} -85b94c33fffffff -{ - -36.503031994 122.745710489 - -36.415427638 122.754778335 - -36.365958392 122.674368586 - -36.403983610 122.584926528 - -36.491474325 122.575678749 - -36.541053479 122.656052662 -} -85ef9113fffffff -{ - -76.823187603 5.200641266 - -76.727228883 5.214961951 - -76.675751862 4.866242241 - -76.719728249 4.500837444 - -76.815685231 4.481372637 - -76.867671230 4.832453708 -} -85524b0ffffffff -{ - 15.507857319 53.111123779 - 15.427873019 53.087733418 - 15.375651375 53.140546064 - 15.403328881 53.216662999 - 15.483195396 53.240097795 - 15.535502128 53.187371373 -} -851cc5a7fffffff -{ - 44.929988709 -140.081239835 - 45.007818187 -140.048396520 - 45.059322130 -140.115191293 - 45.032976938 -140.214702817 - 44.955206276 -140.247321627 - 44.903721957 -140.180653435 -} -85be5cd7fffffff -{ - -34.218693226 144.519486260 - -34.123206043 144.502862971 - -34.087574874 144.395679126 - -34.147335837 144.304982630 - -34.242812573 144.321369831 - -34.278538948 144.428689722 -} -855332a7fffffff -{ - 27.214083034 37.895184561 - 27.120365960 37.878447925 - 27.060875958 37.958790789 - 27.095017020 38.055837282 - 27.188651540 38.072706402 - 27.248227608 37.992396767 -} -854d192ffffffff +85322673fffffff +{ + 31.819248856 171.323700358 + 31.916300506 171.329672062 + 31.969066447 171.233502977 + 31.924683101 171.131446066 + 31.827612859 171.125698254 + 31.774944393 171.221783373 +} +858fa647fffffff +{ + -1.538209364 -90.335440026 + -1.614139896 -90.393725936 + -1.701309417 -90.357619423 + -1.712538404 -90.263171720 + -1.636557686 -90.204868688 + -1.549398211 -90.241030358 +} +85b534cbfffffff +{ + -39.373730609 -151.046085429 + -39.283753845 -151.010549737 + -39.216616483 -151.094354372 + -39.239395030 -151.213716707 + -39.329357625 -151.249452334 + -39.396555946 -151.165626010 +} +8586d10ffffffff +{ + 0.147621602 79.337901029 + 0.235224303 79.310969137 + 0.258853991 79.224854382 + 0.194923490 79.165740062 + 0.107404698 79.192667505 + 0.083732514 79.278713809 +} +85c6d8d3fffffff +{ + -32.096981633 -127.580615213 + -32.051850618 -127.487085771 + -31.963642285 -127.481911727 + -31.920628059 -127.570020696 + -31.965671053 -127.663359866 + -32.053816124 -127.668780144 +} +85f04bb7fffffff +{ + -73.632764815 27.587939634 + -73.544997061 27.475062525 + -73.525974583 27.158154956 + -73.594617516 26.951080535 + -73.682734742 27.061569994 + -73.701860472 27.381540409 +} +8534847bfffffff +{ + 31.600951226 -34.898902612 + 31.518200608 -34.955678862 + 31.434114875 -34.900254782 + 31.432674671 -34.788131159 + 31.515354854 -34.731212704 + 31.599545712 -34.786559653 +} +85e6b527fffffff +{ + -58.905844130 28.755154431 + -58.829576695 28.695019221 + -58.809899382 28.534406367 + -58.866445830 28.433142290 + -58.942920739 28.492696873 + -58.962641894 28.654098658 +} +85dfb3c7fffffff +{ + -63.334128236 -40.728476297 + -63.269621797 -40.574120451 + -63.178918695 -40.623159819 + -63.152581651 -40.825381176 + -63.216761697 -40.979646219 + -63.307604389 -40.931784172 +} +85c84263fffffff +{ + -42.968732430 100.974935085 + -42.893975025 100.907308781 + -42.897713048 100.780584973 + -42.976219380 100.721064995 + -43.051152159 100.788503214 + -43.047403201 100.915650513 +} +85ba6007fffffff +{ + -31.819805059 170.663719515 + -31.732536585 170.621037873 + -31.719921512 170.513657698 + -31.794612552 170.448737734 + -31.881994789 170.491323405 + -31.894572203 170.598925411 +} +85ac2503fffffff +{ + -28.982582897 10.268342513 + -29.072816866 10.254926244 + -29.131507876 10.334890876 + -29.099885263 10.428148776 + -29.009695654 10.441359874 + -28.951084175 10.361518230 +} +85aa899bfffffff +{ + -32.046152570 73.187801805 + -32.139692890 73.211728083 + -32.168745970 73.320265668 + -32.104233982 73.404739506 + -32.010720823 73.380668437 + -31.981692392 73.272268108 +} +85570c4bfffffff +{ + 21.393942984 -33.165323218 + 21.316743479 -33.217763751 + 21.235094869 -33.169555753 + 21.230537383 -33.068979492 + 21.307648086 -33.016435386 + 21.389405102 -33.064570808 +} +8556c327fffffff +{ + 5.869376609 -34.302695581 + 5.948672858 -34.254695444 + 6.031048898 -34.301297395 + 6.034176858 -34.395919472 + 5.954895544 -34.443961864 + 5.872471320 -34.397340048 +} +85ef21cbfffffff { - 25.753590263 -64.977453622 - 25.680023903 -64.991731156 - 25.621038571 -64.934403443 - 25.635534662 -64.862700171 - 25.709144503 -64.848267771 - 25.768214862 -64.905693550 + -84.119502549 -71.629773741 + -84.098774722 -70.734230909 + -84.007699543 -70.484555531 + -83.938067914 -71.109850582 + -83.958265151 -71.982955292 + -84.048614033 -72.252844666 } -8550ee6bfffffff -{ - 27.097001796 -132.933090606 - 27.018377826 -132.971078348 - 26.944177008 -132.912909396 - 26.948621226 -132.816856280 - 27.027200475 -132.778882132 - 27.101380249 -132.836947366 -} -850300cbfffffff -{ - 87.143934362 -118.375110187 - 87.120324203 -120.137501650 - 87.029555425 -120.608173024 - 86.963764120 -119.400443195 - 86.986357829 -117.725097223 - 87.075717212 -117.173135019 -} -851240dbfffffff -{ - 56.092846512 -107.340574391 - 56.013136928 -107.418681294 - 55.932268609 -107.334748171 - 55.930884134 -107.172969985 - 56.010439347 -107.094394724 - 56.091533580 -107.178063738 -} -850346abfffffff -{ - 81.811707671 -63.626623735 - 81.782227895 -64.208125135 - 81.698483898 -64.283624001 - 81.644428200 -63.787594672 - 81.673383999 -63.213911226 - 81.756913458 -63.128496146 -} -85d8f0abfffffff -{ - -44.650646756 133.277698578 - -44.559406919 133.274253914 - -44.512533234 133.165650772 - -44.556796764 133.060432850 - -44.647968032 133.063585999 - -44.694944479 133.172248363 -} -85e37397fffffff -{ - -60.220737495 -148.241310491 - -60.209884350 -148.087269377 - -60.130245116 -148.034625645 - -60.061615952 -148.135649853 - -60.072516473 -148.288995908 - -60.151998775 -148.342010774 -} -854e9d53fffffff -{ - 29.278182911 154.341438507 - 29.371883743 154.328835079 - 29.410892642 154.231199488 - 29.356164619 154.146351322 - 29.262543031 154.159137513 - 29.223570128 154.256589341 -} -85bf9ec3fffffff -{ - -29.039291272 163.713791152 - -28.948584885 163.678049434 - -28.929278313 163.571232836 - -29.000673878 163.499951964 - -29.091473835 163.535556654 - -29.110784700 163.642579609 -} -85f3496bfffffff -{ - -70.769853025 -131.047233702 - -70.824838222 -130.872337334 - -70.798684716 -130.620165345 - -70.717676813 -130.544764421 - -70.663082425 -130.719806057 - -70.689105934 -130.970111875 -} -85217613fffffff -{ - 53.204679781 64.956062751 - 53.123808530 65.040612253 - 53.127594523 65.200816347 - 53.212282035 65.277030143 - 53.293299367 65.192695288 - 53.289483037 65.031930395 -} -854a6217fffffff -{ - 27.167461841 137.016668833 - 27.085605086 137.033161034 - 27.056841610 137.127759273 - 27.109952842 137.205886644 - 27.191804285 137.189416055 - 27.220549885 137.094796405 -} -85bee903fffffff -{ - -30.895009646 144.253334580 - -30.800092034 144.237662577 - -30.765163799 144.134826253 - -30.825054262 144.047538113 - -30.919961782 144.062991704 - -30.954989080 144.165951936 -} -8503226bfffffff -{ - 88.663330900 -126.657792609 - 88.626432589 -130.197033001 - 88.532653392 -130.518077443 - 88.477001431 -127.710068666 - 88.510504155 -124.473234955 - 88.602796983 -123.755162052 -} -851280d3fffffff -{ - 54.418944784 -128.752626040 - 54.338139474 -128.771612845 - 54.279743591 -128.664121813 - 54.301973713 -128.537429382 - 54.382792928 -128.517865934 - 54.441368516 -128.625571211 -} -8532cb5bfffffff -{ - 43.922842411 159.975849985 - 44.016838437 159.967804045 - 44.057049896 159.850039771 - 44.003216556 159.740550487 - 43.909266312 159.748889477 - 43.869103447 159.866424959 -} -859cd077fffffff -{ - -6.745605553 141.936074597 - -6.837729077 141.951060996 - -6.869986999 142.040459540 - -6.810159273 142.114874930 - -6.718041326 142.099915482 - -6.685745457 142.010513636 -} -85ed4a23fffffff -{ - -76.507464860 160.821529292 - -76.506455996 160.477524973 - -76.582252403 160.292817167 - -76.659368052 160.454186530 - -76.660307189 160.802031796 - -76.584200656 160.984639322 -} -85ee244ffffffff -{ - -78.647777553 -41.110151827 - -78.581626973 -40.750526991 - -78.487094698 -40.862170290 - -78.458419587 -41.327136636 - -78.523885298 -41.686168065 - -78.618706986 -41.580868172 -} -85e6519bfffffff -{ - -63.368823219 6.572584557 - -63.279473709 6.574800321 - -63.230249119 6.400434283 - -63.270113091 6.223223180 - -63.359491932 6.219763268 - -63.408978411 6.394758657 -} -852e2303fffffff -{ - 37.660697633 144.266994494 - 37.749688264 144.242508352 - 37.776053132 144.138841696 - 37.713453615 144.059910420 - 37.624579100 144.084556125 - 37.598187972 144.187973960 -} -85a8aa27fffffff +857f31abfffffff { - -20.254821350 -44.839649883 - -20.178375743 -44.787788109 - -20.098559859 -44.835655176 - -20.095212901 -44.935358726 - -20.171671477 -44.987218151 - -20.251464040 -44.939376527 + -9.483554391 174.820878929 + -9.411828104 174.785754829 + -9.395455243 174.705181260 + -9.450828552 174.659604262 + -9.522661433 174.694690219 + -9.539014365 174.775391486 } -8500e933fffffff -{ - 87.896709211 19.383425569 - 87.970044414 20.827432881 - 88.054846925 19.709415377 - 88.063357837 17.011147004 - 87.986729062 15.645530428 - 87.904907918 16.889200691 -} -85c98443fffffff -{ - -35.340459226 118.187458356 - -35.283818233 118.109987094 - -35.302122079 118.009186229 - -35.377178313 117.985622621 - -35.433988340 118.063137853 - -35.415572856 118.164173049 -} -8577b433fffffff -{ - 0.994490923 147.682661535 - 0.900018241 147.696700641 - 0.865993609 147.784638742 - 0.926393643 147.858522239 - 1.020827635 147.844517697 - 1.054900336 147.756595051 -} -8500de67fffffff -{ - 83.639812008 107.683969927 - 83.586965283 108.383984344 - 83.628145989 109.156226923 - 83.723099318 109.242013354 - 83.777052407 108.533738411 - 83.734930544 107.747857564 -} -85514c5bfffffff -{ - 16.565727793 -138.328787422 - 16.477910827 -138.364716885 - 16.402674698 -138.304754878 - 16.415245890 -138.208937974 - 16.503004145 -138.173000859 - 16.578249928 -138.232888152 -} -85341ec3fffffff -{ - 32.651249437 -28.860743020 - 32.570513932 -28.924982935 - 32.483171319 -28.874103532 - 32.476477122 -28.759111774 - 32.557124221 -28.694772345 - 32.644553903 -28.745523734 -} -85f28307fffffff -{ - -87.093696739 -118.002927469 - -87.144922328 -116.488069342 - -87.099919385 -114.893218534 - -87.005719867 -114.870113843 - -86.956723074 -116.344026897 - -86.999763533 -117.882474716 +85ba54d3fffffff +{ + -30.623964323 175.715039463 + -30.540293873 175.669669536 + -30.531509489 175.567546269 + -30.606458584 175.510587347 + -30.690252838 175.555901558 + -30.698974128 175.658230753 } -85676b0bfffffff -{ - 10.632686965 -65.590904311 - 10.570464519 -65.636969618 - 10.493897293 -65.599402199 - 10.479634859 -65.515799667 - 10.541895320 -65.469812534 - 10.618380244 -65.507349684 -} -85c880c3fffffff -{ - -33.055093148 108.884026467 - -32.994389708 108.819222963 - -33.004344373 108.717745660 - -33.075059999 108.680809528 - -33.135926913 108.745563171 - -33.125914591 108.847303281 -} -85ce0e6ffffffff -{ - -42.881086416 -79.663247651 - -42.802356341 -79.609563067 - -42.724229845 -79.672803602 - -42.724674938 -79.789675125 - -42.803340149 -79.843631417 - -42.881625280 -79.780445123 -} -8530a8c7fffffff -{ - 35.421958580 121.349457766 - 35.496496901 121.333581587 - 35.534473213 121.249090153 - 35.497888577 121.180443803 - 35.423289695 121.196406031 - 35.385335985 121.280928537 -} -85cf4653fffffff -{ - -49.644648229 -85.960624232 - -49.564936372 -85.886071420 - -49.482079059 -85.951012924 - -49.478778965 -86.090337409 - -49.558395212 -86.165183083 - -49.641407236 -86.100412564 -} -85d80143fffffff -{ - -49.832747178 134.304800984 - -49.785875828 134.184383453 - -49.827420781 134.068108734 - -49.916044458 134.072074939 - -49.963054212 134.192838600 - -49.921301528 134.309289546 -} -851882b3fffffff -{ - 50.237152314 -24.393361035 - 50.164780865 -24.480138295 - 50.081890612 -24.421415138 - 50.071309186 -24.276170695 - 50.143593517 -24.189296114 - 50.226546309 -24.247762423 -} -85210667fffffff -{ - 49.128789994 59.853609035 - 49.050739031 59.938336642 - 49.060456503 60.083414590 - 49.148290745 60.144216253 - 49.226493133 60.059584618 - 49.216709711 59.914054228 -} -850ef06bfffffff -{ - 55.463975126 -85.802496806 - 55.400047018 -85.929010167 - 55.305666114 -85.893754052 - 55.275101547 -85.732668505 - 55.338798558 -85.606207248 - 55.433290810 -85.640777891 -} -85d63217fffffff -{ - -50.940089536 39.988283538 - -50.868462891 40.037315645 - -50.816958666 39.973302967 - -50.836931895 39.860454104 - -50.908382336 39.811197757 - -50.960035665 39.875013514 -} -85e9b577fffffff -{ - -73.902402113 -100.056356095 - -73.923175774 -99.740604606 - -73.855527591 -99.509112805 - -73.767582389 -99.593474955 - -73.747100623 -99.906443480 - -73.814273982 -100.137818255 -} -856aa65bfffffff -{ - 3.771631849 19.927442865 - 3.859531149 19.935481077 - 3.906528906 19.860955186 - 3.865700197 19.778407080 - 3.777844681 19.770317749 - 3.730774021 19.844827586 -} -85f146b3fffffff -{ - -85.903081201 42.524087626 - -85.826175044 41.789628794 - -85.833368940 40.538372718 - -85.917806097 39.972559773 - -85.996383213 40.689599175 - -85.988842707 41.991163143 -} -8548f11bfffffff -{ - 30.698514346 -106.395757442 - 30.778070695 -106.332639493 - 30.864772790 -106.381888352 - 30.871881300 -106.494361495 - 30.792272404 -106.557429237 - 30.705607574 -106.508074362 -} -85f28d8ffffffff -{ - -84.134267511 -113.750765568 - -84.179065039 -112.970202518 - -84.128814260 -112.208867752 - -84.034835261 -112.239654429 - -83.991106551 -113.007446133 - -84.040304811 -113.757203940 -} -85b49093fffffff -{ - -22.089157941 -147.119505700 - -21.997687816 -147.093145377 - -21.929312072 -147.165326352 - -21.952319887 -147.263909702 - -22.043781667 -147.290422830 - -22.112244083 -147.218199948 -} -856f8573fffffff -{ - 0.789240536 -110.317271022 - 0.857548420 -110.269415909 - 0.930611308 -110.310672184 - 0.935289034 -110.399834686 - 0.866901728 -110.447640686 - 0.793916125 -110.406333461 -} -850fa4dbfffffff -{ - 70.971273163 -83.801991609 - 70.909681948 -84.025367662 - 70.817171842 -83.973145772 - 70.786117276 -83.699624635 - 70.847361549 -83.476560667 - 70.940006059 -83.526699011 -} -8588a283fffffff -{ - -5.029768639 -147.609749945 - -5.112932427 -147.640792624 - -5.178562532 -147.580801409 - -5.161091882 -147.489791437 - -5.077979054 -147.458711968 - -5.012285878 -147.518679138 -} -85f24b97fffffff -{ - -71.378273740 -109.719951992 - -71.410787687 -109.469530283 - -71.355428475 -109.242574767 - -71.267926453 -109.266902760 - -71.235766974 -109.515844152 - -71.290756724 -109.741934878 -} -85a71263fffffff -{ - -26.892390730 117.741482242 - -26.811588475 117.753914224 - -26.768637016 117.691172668 - -26.806373166 117.616050466 - -26.887059800 117.603505155 - -26.930125877 117.666195163 -} -85f054a7fffffff -{ - -77.589775314 46.886027186 - -77.517398541 46.617453094 - -77.528979649 46.208763636 - -77.613198820 46.063585829 - -77.686177320 46.331263124 - -77.674332801 46.745055076 -} -85c3a88bfffffff -{ - -43.475917084 -56.955146424 - -43.440166997 -56.855801987 - -43.371202527 -56.851179326 - -43.338012184 -56.945533907 - -43.373613723 -57.044659543 - -43.442553825 -57.049649264 -} -85bc646ffffffff -{ - -36.584267577 24.078724553 - -36.502716770 24.086632779 - -36.454249350 23.995043654 - -36.487327053 23.895543266 - -36.568863780 23.887555021 - -36.617336978 23.979147110 -} -854683dbfffffff -{ - 18.628028514 -174.696324377 - 18.714255168 -174.678345234 - 18.766738120 -174.748665904 - 18.732875596 -174.836993473 - 18.646563020 -174.854845015 - 18.594198828 -174.784496794 -} -85e96537fffffff -{ - -58.193933833 -110.197584827 - -58.134469639 -110.059075010 - -58.042597497 -110.090229859 - -58.010138801 -110.259224315 - -58.069442227 -110.397593113 - -58.161364717 -110.367109549 -} -85d20453fffffff -{ - -47.477117854 -108.436956495 - -47.412993650 -108.328507797 - -47.317438157 -108.356449154 - -47.285950138 -108.492422723 - -47.349926465 -108.600810489 - -47.445538430 -108.573286254 -} -8525aa3bfffffff -{ - 44.905522185 93.317325299 - 44.813670981 93.341871890 - 44.784459722 93.462836176 - 44.846959229 93.559500195 - 44.938799115 93.535341790 - 44.968151055 93.414130935 -} -8517ae03fffffff -{ - 56.150640582 151.247753340 - 56.065973994 151.285921692 - 56.041652770 151.443882162 - 56.101844797 151.564334782 - 56.186626583 151.526884003 - 56.211101656 151.368261382 -} -85037547fffffff -{ - 83.469695513 -54.792422143 - 83.534085138 -55.293370881 - 83.517186738 -56.084629879 - 83.436259806 -56.357283856 - 83.373003632 -55.853120807 - 83.389547260 -55.079265053 -} -85ecc307fffffff -{ - -70.600078048 123.370458226 - -70.543935194 123.149552561 - -70.580716170 122.888095529 - -70.673900546 122.846114211 - -70.730358656 123.067707571 - -70.693315767 123.330598096 -} -85a0c02ffffffff -{ - -11.606409090 -139.265967327 - -11.524266153 -139.249069896 - -11.462813927 -139.315300373 - -11.483414456 -139.398500359 - -11.565568802 -139.415529247 - -11.627111327 -139.349226718 -} -85f10017fffffff -{ - -83.702167272 118.422132530 - -83.731786237 117.659516688 - -83.816320574 117.546535053 - -83.871525169 118.215945094 - -83.841016992 118.993395948 - -83.756207052 119.086463279 -} -859b292ffffffff -{ - -21.655073085 -177.581534595 - -21.574215988 -177.535042118 - -21.497900216 -177.582312537 - -21.502405018 -177.675941708 - -21.583150603 -177.722439643 - -21.659502821 -177.675303149 -} -8504463bfffffff -{ - 75.512624305 173.849928483 - 75.416997199 173.792964223 - 75.356795277 174.089765086 - 75.391685810 174.444336459 - 75.487113710 174.505378762 - 75.547852976 174.207787726 -} -85e48d5bfffffff -{ - -53.537629114 97.547111100 - -53.454186633 97.467925554 - -53.453241749 97.305873203 - -53.535719625 97.222314325 - -53.619346479 97.301118100 - -53.620311139 97.463864658 -} -850ab353fffffff -{ - 55.991411473 97.867806233 - 55.900322571 97.888177653 - 55.862149562 98.032308608 - 55.914913124 98.156370512 - 56.005962779 98.136607743 - 56.044288454 97.992174360 -} -85975123fffffff -{ - -18.028576330 25.307580515 - -17.932212650 25.314348288 - -17.878010238 25.229882144 - -17.920143886 25.138639054 - -18.016486660 25.131802685 - -18.070716771 25.216277950 -} -85e914bbfffffff -{ - -69.509969797 -109.275453595 - -69.540667041 -109.048085031 - -69.485155571 -108.843836758 - -69.399289983 -108.867635955 - -69.368916321 -109.093770311 - -69.424086051 -109.297337249 -} -85e90a73fffffff -{ - -65.568637717 -101.455424402 - -65.504368049 -101.302855358 - -65.421959299 -101.364444878 - -65.403700503 -101.577753564 - -65.467773860 -101.730449798 - -65.550301945 -101.669713551 -} -85e5933bfffffff -{ - -51.905811512 113.124926985 - -51.835382231 113.019858382 - -51.854877134 112.868967451 - -51.944915706 112.822584998 - -52.015565143 112.927633180 - -51.995955516 113.079085630 -} -859e567bfffffff -{ - -15.791364223 161.685319449 - -15.707867676 161.656024676 - -15.686709153 161.563418422 - -15.749020279 161.499955809 - -15.832601148 161.529139069 - -15.853786625 161.621896682 -} -85f1750bfffffff -{ - -87.670927197 60.942408926 - -87.614579778 59.157351227 - -87.648556438 57.121510061 - -87.741059789 56.760327148 - -87.800398866 58.587948811 - -87.764139813 60.736994580 -} -852b5827fffffff -{ - 37.583097938 -63.258305037 - 37.548418763 -63.361124974 - 37.467371793 -63.375974959 - 37.421069996 -63.288315809 - 37.455637905 -63.185745214 - 37.536618632 -63.170584760 -} -856ec8cffffffff -{ - 14.615738738 -117.770783682 - 14.695904049 -117.723296788 - 14.777531260 -117.772756844 - 14.778901846 -117.869726954 - 14.698685975 -117.917117334 - 14.617150035 -117.867634321 -} -8548522ffffffff -{ - 30.342398288 -111.652629668 - 30.424438372 -111.593404038 - 30.509118577 -111.646214509 - 30.511705390 -111.758322740 - 30.429623769 -111.817461360 - 30.344996875 -111.764579085 -} -85f16257fffffff +8520c46ffffffff { - -87.391291967 39.740001688 - -87.312083395 38.678949285 - -87.314389291 36.728733848 - -87.396053901 35.718948511 - -87.477732039 36.722870379 - -87.475269023 38.798869271 + 41.459236444 79.854671464 + 41.369725866 79.900759162 + 41.355539725 80.027210968 + 41.430791748 80.107907219 + 41.520379979 80.062111619 + 41.534638689 79.935326979 } -85d16437fffffff -{ - -35.526264613 17.539105712 - -35.615640268 17.533896492 - -35.665622187 17.619170726 - -35.626188283 17.709473642 - -35.536897918 17.714464457 - -35.486956092 17.629370598 -} -859294cffffffff -{ - -11.775493593 -114.221910896 - -11.837739672 -114.272329886 - -11.918342652 -114.249659963 - -11.936778574 -114.176484289 - -11.874507575 -114.125973860 - -11.793825557 -114.148730563 -} -85684caffffffff -{ - 10.026041662 127.216703391 - 9.932903012 127.233506348 - 9.902226346 127.323008153 - 9.964728778 127.395756885 - 10.057913077 127.378957107 - 10.088549342 127.289405347 -} -85e8544bfffffff -{ - -60.067404018 -86.758715777 - -59.988994540 -86.661983935 - -59.910904242 -86.743148411 - -59.911064390 -86.920750609 - -59.989358898 -87.017939065 - -60.067608288 -86.937071107 -} -85557657fffffff -{ - 22.449880236 -8.116654452 - 22.383732149 -8.185553264 - 22.298451778 -8.161881052 - 22.279317365 -8.069485870 - 22.345357206 -8.000650495 - 22.430639569 -8.024146763 -} -85f16aa3fffffff -{ - -84.579246601 9.299666388 - -84.484387291 9.264019781 - -84.440687676 8.407743033 - -84.490740644 7.570585182 - -84.585706113 7.576981754 - -84.630532919 8.449853804 -} -85f15a5bfffffff -{ - -81.399132813 52.391557521 - -81.332430379 51.961081295 - -81.353766467 51.383863532 - -81.442292895 51.227453132 - -81.509844301 51.658168819 - -81.488014354 52.245152262 -} -85219963fffffff -{ - 39.895089503 66.078601913 - 39.812386679 66.143336045 - 39.813279113 66.268899574 - 39.896896975 66.330072863 - 39.979739080 66.265482707 - 39.978824002 66.139574514 -} -85075e37fffffff -{ - 65.353008598 -23.663286047 - 65.372606579 -23.852462503 - 65.307398794 -23.991015391 - 65.222841546 -23.940230268 - 65.203448645 -23.752003071 - 65.268408569 -23.613614353 -} -858cda97fffffff -{ - -0.471404422 98.962370535 - -0.380325186 98.938686188 - -0.355665167 98.846547258 - -0.422119775 98.778126867 - -0.513186569 98.801859147 - -0.537811262 98.893963979 -} -859b2b77fffffff -{ - -21.194512507 -176.314068514 - -21.112854993 -176.268134537 - -21.036692474 -176.316732151 - -21.042145583 -176.411134800 - -21.123692117 -176.457081194 - -21.199896450 -176.408612730 -} -859616c7fffffff -{ - -11.556967469 33.067515937 - -11.459894607 33.071032128 - -11.408174373 32.987180183 - -11.453501507 32.899764832 - -11.550590794 32.896179339 - -11.602336600 32.980078494 -} -85ad51b7fffffff -{ - -29.753477372 6.508598681 - -29.845080176 6.490446736 - -29.906931549 6.571037397 - -29.877090877 6.669677244 - -29.785513609 6.687616183 - -29.723751341 6.607128339 -} -85186c83fffffff -{ - 47.669585636 1.239762441 - 47.619800046 1.143803397 - 47.532266139 1.161688651 - 47.494579696 1.275206846 - 47.544320908 1.370956312 - 47.631792809 1.353397075 -} -852a8e2ffffffff -{ - 37.445109394 -79.849346037 - 37.396399758 -79.939794225 - 37.314446132 -79.926496746 - 37.281156429 -79.823075115 - 37.329692174 -79.732718443 - 37.411691237 -79.745691629 -} -85e74837fffffff -{ - -70.642577456 4.117244999 - -70.548316681 4.132342816 - -70.494910985 3.896223659 - -70.535402793 3.643975512 - -70.629658424 3.626481406 - -70.683429137 3.863630075 -} -850cf283fffffff -{ - 59.090984472 -165.116065699 - 59.015375062 -165.199594346 - 58.946996573 -165.113359768 - 58.954003447 -164.944045983 - 59.029357902 -164.860093896 - 59.097960342 -164.945876030 -} -852e6697fffffff -{ - 34.745272068 138.106674647 - 34.829899147 138.078014720 - 34.851934434 137.983468252 - 34.789394244 137.917804747 - 34.704897514 137.946568456 - 34.682810676 138.040892242 -} -85068c07fffffff -{ - 71.267265738 -50.489902075 - 71.252566346 -50.770414381 - 71.165381350 -50.862955894 - 71.093147168 -50.676596809 - 71.107775743 -50.398256489 - 71.194708754 -50.304114611 -} -85ea1107fffffff -{ - -64.413070798 -172.810795414 - -64.362259409 -172.901620400 - -64.381979103 -173.064321098 - -64.452572218 -173.136718785 - -64.503468638 -173.045821480 - -64.483686726 -172.882597693 -} -8510eb83fffffff -{ - 60.728798713 62.158314941 - 60.654695314 62.264418508 - 60.663171607 62.454438777 - 60.745798941 62.539137221 - 60.820069353 62.433262746 - 60.811545258 62.242458131 -} -85569937fffffff -{ - 7.918683173 -41.301969439 - 7.998138188 -41.252429118 - 8.079501917 -41.298934117 - 8.081444987 -41.394970627 - 8.002022841 -41.444524142 - 7.920624757 -41.398028090 -} -85ae8eb7fffffff -{ - -32.788496314 95.807360622 - -32.870018868 95.844617733 - -32.878728608 95.943044523 - -32.805990875 96.004046757 - -32.724558258 95.966761039 - -32.715773455 95.868501452 -} -85f01da7fffffff -{ - -77.565534935 64.947025955 - -77.514954624 64.597975139 - -77.551692001 64.239916089 - -77.639540518 64.228035125 - -77.690626584 64.579450846 - -77.653354718 64.940386357 -} -85d513bbfffffff -{ - -54.023213192 -155.957457882 - -53.948411734 -155.908478475 - -53.888964283 -156.005903193 - -53.904250098 -156.152269606 - -53.979010399 -156.201502877 - -54.038526150 -156.104116573 -} -85898987fffffff -{ - -8.210053355 -149.963387031 - -8.129084824 -149.937705569 - -8.065053278 -150.000733908 - -8.081889862 -150.089461856 - -8.162821577 -150.115257524 - -8.226953626 -150.052211163 -} -85ee2363fffffff -{ - -76.139955089 -39.170615361 - -76.071205877 -38.883373348 - -75.977106354 -38.987797540 - -75.951478486 -39.375324330 - -76.019656051 -39.662486141 - -76.114030620 -39.562227645 -} -852f28cbfffffff -{ - 31.428015542 148.286011614 - 31.519321957 148.267047680 - 31.552369571 148.168987827 - 31.494108193 148.090101485 - 31.402907515 148.109226074 - 31.369862437 148.207076662 -} -85040bcbfffffff -{ - 73.648657946 157.663034133 - 73.552201498 157.705832907 - 73.514326329 158.021125980 - 73.572542521 158.295972324 - 73.669100131 158.256555406 - 73.707342785 157.938902451 -} -85a0e683fffffff -{ - -15.425412853 -137.792275938 - -15.340291655 -137.776181477 - -15.278649101 -137.844587747 - -15.302044377 -137.929171858 - -15.387190765 -137.945406476 - -15.448916796 -137.876916840 -} -85d55d87fffffff -{ - -50.900692273 -171.788550854 - -50.831005051 -171.727295945 - -50.758499431 -171.801780145 - -50.755649291 -171.937304525 - -50.825272259 -171.998632731 - -50.897809605 -171.924363908 -} -853eb52bfffffff -{ - 22.910981536 16.093562930 - 22.814957639 16.095663125 - 22.767743101 16.186779706 - 22.816495545 16.275905267 - 22.912551785 16.273960251 - 22.959823355 16.182734433 -} -85f1a027fffffff -{ - -78.406217181 116.240877016 - -78.346459307 115.916138401 - -78.372357108 115.476242015 - -78.458307562 115.356465339 - -78.518614114 115.681579950 - -78.492418731 116.126126318 -} -8599832bfffffff -{ - -12.854935133 -14.514666541 - -12.933247688 -14.549525715 - -12.998356583 -14.492691783 - -12.985044994 -14.400951236 - -12.906646413 -14.366190213 - -12.841645404 -14.423071361 -} -85d536abfffffff -{ - -57.523213769 -154.568929585 - -57.452474488 -154.518792786 - -57.397917670 -154.623279023 - -57.414022715 -154.777881831 - -57.484718316 -154.828316785 - -57.539352677 -154.723851573 -} -858209c7fffffff -{ - -3.755117025 6.475977484 - -3.667783784 6.488038285 - -3.618348400 6.423312812 - -3.656172956 6.346592415 - -3.743410354 6.334502429 - -3.792919021 6.399161950 -} -851eb4bbfffffff -{ - 43.878633280 8.363768588 - 43.790655582 8.374390879 - 43.757677075 8.486706694 - 43.812669236 8.588619151 - 43.900703718 8.578209401 - 43.933689377 8.465674366 -} -85012e2bfffffff -{ - 72.506539211 22.146654279 - 72.563295139 22.313770753 - 72.637447787 22.204143842 - 72.654513738 21.925691943 - 72.597356641 21.759184997 - 72.523535273 21.870507950 -} -85c0198bfffffff -{ - -37.796441816 -10.126803256 - -37.887975968 -10.168215381 - -37.961960565 -10.088311288 - -37.944316094 -9.966956715 - -37.852723817 -9.925749863 - -37.778834040 -10.005691834 -} -85db9847fffffff -{ - -46.617015101 176.585589852 - -46.539253560 176.528738459 - -46.539217306 176.403078793 - -46.617007729 176.333958326 - -46.694871022 176.390733676 - -46.694842100 176.516706176 -} -856e84b3fffffff -{ - 7.034737166 -109.602263820 - 7.109016757 -109.551589559 - 7.188220862 -109.594492704 - 7.193068562 -109.688129680 - 7.118708339 -109.738753269 - 7.039581058 -109.695790742 -} -85f22847fffffff -{ - -76.812379876 -138.557679115 - -76.879489630 -138.338238188 - -76.865130427 -137.955113876 - -76.783712053 -137.795938593 - -76.717115858 -138.016847975 - -76.731425163 -138.395498365 -} -856d2d4bfffffff -{ - 15.475855766 -90.821752816 - 15.547623993 -90.761590024 - 15.632072760 -90.792024182 - 15.644754743 -90.882752226 - 15.572897140 -90.942962675 - 15.488447021 -90.912397522 -} -85f39b67fffffff -{ - -85.011279605 176.840058000 - -85.097996043 176.650380633 - -85.151375834 177.470877615 - -85.116515324 178.473923047 - -85.029277040 178.631744917 - -84.977400200 177.818682428 -} -85da6243fffffff -{ - -56.348169668 159.342803854 - -56.268627147 159.296246955 - -56.251584551 159.138539477 - -56.314051722 159.026964870 - -56.393658820 159.073169248 - -56.410734325 159.231301813 -} -85ec0347fffffff -{ - -69.661527104 145.713118114 - -69.635353916 145.475862997 - -69.698183138 145.292144803 - -69.787485217 145.345776554 - -69.813756640 145.584692232 - -69.750627045 145.768308554 -} -85030bcffffffff -{ - 83.713379413 -93.139049102 - 83.728467005 -93.939296829 - 83.658937861 -94.488884443 - 83.575487966 -94.240685583 - 83.560945153 -93.458935429 - 83.629316140 -92.907157152 -} -8582249bfffffff -{ - -9.173377994 10.460387253 - -9.081808897 10.471777009 - -9.027918776 10.401143824 - -9.065536170 10.319178017 - -9.157018129 10.307749081 - -9.210969836 10.378325048 -} -85ee24d7fffffff -{ - -79.193003920 -43.650489248 - -79.130105458 -43.258781055 - -79.034849257 -43.354654902 - -79.002243093 -43.835043933 - -79.064433372 -44.225426963 - -79.159933199 -44.136785485 -} -8500cc27fffffff +85f16e0bfffffff { - 87.884953408 82.838302353 - 87.869751256 85.281013698 - 87.940414709 86.987171508 - 88.029723982 86.224508176 - 88.046195989 83.588758086 - 87.972016509 81.918038701 + -85.714662927 9.848567631 + -85.620263743 9.792099864 + -85.577650612 8.713804261 + -85.628053252 7.665400263 + -85.722592341 7.675546078 + -85.766621232 8.780571943 } -859e8667fffffff -{ - -9.343802716 168.487036187 - -9.269362548 168.455202460 - -9.250977369 168.370918321 - -9.307028926 168.318333633 - -9.381564520 168.350099825 - -9.399953134 168.434518431 -} -85cc59b3fffffff -{ - -43.401285626 68.702920070 - -43.487258073 68.725479081 - -43.517958509 68.844821616 - -43.462652189 68.941462336 - -43.376685739 68.918707397 - -43.346019485 68.799507453 -} -858511c7fffffff -{ - -1.458138835 58.264145016 - -1.536938567 58.272827733 - -1.562931645 58.350731982 - -1.510034854 58.419922091 - -1.431221295 58.411137063 - -1.405318245 58.333264242 -} -85ce002bfffffff -{ - -44.674591144 -78.645679356 - -44.594775116 -78.592208633 - -44.517581430 -78.658468113 - -44.520045965 -78.778154128 - -44.599804656 -78.831920954 - -44.677156307 -78.765706342 -} -85ea89cbfffffff -{ - -65.778277961 177.369016810 - -65.790218972 177.198846909 - -65.864951392 177.155874349 - -65.927782002 177.284054524 - -65.915639907 177.455089048 - -65.840868878 177.497076424 -} -85d263c3fffffff -{ - -41.321227878 -117.467299518 - -41.265819576 -117.362238813 - -41.170102500 -117.372642541 - -41.129799608 -117.487747582 - -41.185080785 -117.592646433 - -41.280791724 -117.582602190 -} -85d94c2ffffffff -{ - -56.072651477 124.223907293 - -56.013629245 124.090532610 - -56.048196114 123.935367465 - -56.141979787 123.913085842 - -56.201209398 124.046730330 - -56.166447419 124.202387270 -} -85ceee6ffffffff -{ - -37.965540954 -81.076733425 - -37.890298008 -81.025007453 - -37.811758726 -81.081866621 - -37.808304803 -81.190392175 - -37.883469990 -81.242339719 - -37.962166993 -81.185540662 -} -85ecc927fffffff -{ - -73.403104774 114.752795521 - -73.338179966 114.523506115 - -73.362368848 114.204194652 - -73.451686894 114.111700307 - -73.517005396 114.341045434 - -73.492610763 114.662841763 -} -85c85337fffffff -{ - -41.377840678 100.704213132 - -41.304319637 100.639298736 - -41.307752419 100.516840966 - -41.384715024 100.458902946 - -41.458406707 100.523638434 - -41.454965119 100.646491766 -} -852ed1c7fffffff -{ - 46.698330594 137.953996479 - 46.779471444 137.919728634 - 46.793508211 137.807318920 - 46.726462929 137.729492814 - 46.645436696 137.763906065 - 46.631341136 137.876000611 -} -8526d9d7fffffff -{ - 32.878748836 -99.335573850 - 32.953062019 -99.267729618 - 33.040832605 -99.311691113 - 33.054281335 -99.423645397 - 32.979911918 -99.491492286 - 32.892150060 -99.447382511 -} -85e16117fffffff -{ - -67.897931791 48.006914845 - -67.812355577 48.070436854 - -67.749058328 47.924007319 - -67.771080598 47.714358060 - -67.856427497 47.649742212 - -67.919981746 47.795863631 -} -8520346bfffffff -{ - 45.596031115 65.931090343 - 45.512752438 66.002688561 - 45.514443495 66.141137180 - 45.599437430 66.208405648 - 45.682855890 66.136980694 - 45.681140588 65.998112973 -} -85f29c77fffffff -{ - -88.135938671 -95.527083600 - -88.153524037 -92.721275993 - -88.080060592 -91.025994642 - -87.992785303 -92.085072090 - -87.976428285 -94.675512476 - -88.046195989 -96.411241914 -} -859e1aa3fffffff -{ - -13.630611595 165.158370356 - -13.550343910 165.127183622 - -13.530794778 165.037468372 - -13.591500856 164.978792254 - -13.671862501 165.009888324 - -13.691424134 165.099751398 -} -85d30e9bfffffff -{ - -52.292543801 -113.700071784 - -52.234663802 -113.574745241 - -52.139185535 -113.595086988 - -52.101565510 -113.740223083 - -52.159303706 -113.865374288 - -52.254803386 -113.845565200 -} -85481d43fffffff -{ - 26.814767394 -107.527018726 - 26.895762041 -107.466597434 - 26.982931082 -107.515125353 - 26.989058956 -107.624167797 - 26.908007278 -107.684534239 - 26.820884781 -107.635913381 -} -8506422bfffffff -{ - 62.350568690 -35.402513564 - 62.353500350 -35.588951848 - 62.275645034 -35.691270146 - 62.195110768 -35.607426778 - 62.192289010 -35.421987093 - 62.269891928 -35.319395717 -} -8574892bfffffff -{ - -3.138185198 -7.113152217 - -3.204675748 -7.138657130 - -3.258656194 -7.083037594 - -3.246047251 -7.001910129 - -3.179503035 -6.976506860 - -3.125621344 -7.032129282 -} -858ed3cbfffffff -{ - -18.988902933 -88.694457334 - -19.063315546 -88.755914756 - -19.151218622 -88.717132103 - -19.164721773 -88.616836263 - -19.090299779 -88.555368468 - -19.002384044 -88.594206735 -} -85368d23fffffff -{ - 27.795173411 -150.502390395 - 27.708836437 -150.536970680 - 27.639802986 -150.466958595 - 27.657101405 -150.362379926 - 27.743433267 -150.327739499 - 27.812471873 -150.397737703 -} -85eeac2ffffffff -{ - -72.402386822 -20.302781537 - -72.316052686 -20.158020082 - -72.234605030 -20.331734504 - -72.239064578 -20.649045285 - -72.325035068 -20.795589283 - -72.406910060 -20.623058594 -} -85aa148bfffffff -{ - -25.757731626 68.440883641 - -25.853508765 68.459900381 - -25.886615129 68.561496100 - -25.823893006 68.643972731 - -25.728123908 68.624813060 - -25.695068789 68.523319561 -} -85c632c3fffffff -{ - -43.177010884 -134.244295226 - -43.139944468 -134.132229683 - -43.048460782 -134.115497691 - -42.994155084 -134.210521146 - -43.031180165 -134.322272295 - -43.122552152 -134.339313842 -} -85822b53fffffff -{ - -5.440005626 7.404592886 - -5.351347408 7.416539665 - -5.300398386 7.350284609 - -5.338037489 7.272147234 - -5.426600844 7.260168875 - -5.477619944 7.326359393 -} -85f17583fffffff -{ - -88.230027824 59.384401188 - -88.171500552 57.101075675 - -88.202203809 54.395918476 - -88.294020434 53.769484841 - -88.356582081 56.105402780 - -88.323122579 59.023482838 -} -852c70abfffffff -{ - 44.042411654 47.760372572 - 43.974812274 47.847918413 - 43.996236165 47.968491551 - 44.085390542 48.001794810 - 44.153130548 47.914163818 - 44.131575327 47.793314321 -} -85bb1983fffffff -{ - -38.523988763 179.280869819 - -38.444223077 179.228619277 - -38.442635618 179.119374950 - -38.520897245 179.062143719 - -38.600778578 179.114357802 - -38.602282567 179.223839985 -} -85c88337fffffff -{ - -33.037697335 106.858841991 - -32.975897294 106.796410207 - -32.984218731 106.694304724 - -33.054385975 106.654362180 - -33.116347075 106.716724517 - -33.107979763 106.819099348 +85f09c63fffffff +{ + -69.751397898 80.629023891 + -69.659580852 80.562726939 + -69.631631724 80.304829684 + -69.695289908 80.111662529 + -69.787213924 80.176127995 + -69.815373877 80.435597847 } -85cf4db7fffffff -{ - -47.015776929 -92.955488101 - -46.939892670 -92.871426794 - -46.851370390 -92.924005340 - -46.838594463 -93.060394027 - -46.914352438 -93.144635430 - -47.003012591 -93.092309101 -} -8532db23fffffff -{ - 45.850038412 161.804521255 - 45.943281486 161.798705428 - 45.984676270 161.678047677 - 45.932771590 161.563431386 - 45.839563597 161.569563220 - 45.798225004 161.689995552 -} -859c11b7fffffff -{ - -13.510321142 145.711205068 - -13.595971552 145.725358156 - -13.624035450 145.812499127 - -13.566500868 145.885478190 - -13.480863147 145.871356193 - -13.452747242 145.784223997 -} -85e42b23fffffff -{ - -62.947888257 97.914578120 - -62.863213792 97.809426159 - -62.861987717 97.596348314 - -62.945417877 97.487225264 - -63.030314559 97.591727809 - -63.031558926 97.806007682 -} -85c6e2a7fffffff -{ - -34.957898902 -132.252029814 - -34.917101338 -132.154372311 - -34.828618539 -132.142484992 - -34.781025553 -132.228009301 - -34.821761330 -132.325436452 - -34.910151752 -132.337569325 -} -85d20373fffffff -{ - -44.824113468 -107.595741811 - -44.759236709 -107.493357665 - -44.663886140 -107.521394215 - -44.633350250 -107.651441590 - -44.698078936 -107.753782971 - -44.793491352 -107.726120329 -} -85a4a413fffffff -{ - -20.513066368 -33.947236856 - -20.434317403 -33.897518194 - -20.358358293 -33.945872202 - -20.361151345 -34.043967940 - -20.439934726 -34.093733627 - -20.515890625 -34.045356689 -} -85bb7207fffffff -{ - -39.012842583 174.536389438 - -38.929410303 174.486755274 - -38.923467753 174.372178535 - -39.001018298 174.306978411 - -39.084562485 174.356532859 - -39.090444182 174.471367639 -} -8513ac6bfffffff -{ - 62.831255070 -129.742081803 - 62.744643637 -129.763749226 - 62.687767873 -129.621493934 - 62.717302487 -129.457172668 - 62.803942841 -129.434511984 - 62.861020274 -129.577165220 -} -852d916ffffffff -{ - 31.579439798 39.466729444 - 31.486828213 39.448020016 - 31.425455257 39.529934834 - 31.456617858 39.630511879 - 31.549143800 39.649358081 - 31.610592835 39.567490726 -} -85ca10cffffffff -{ - -41.889914663 52.128567969 - -41.975832273 52.134760882 - -42.021276545 52.236650871 - -41.980744048 52.332332841 - -41.894767994 52.325948486 - -41.849382788 52.224073729 -} -85e5589bfffffff -{ - -66.632506420 100.040444581 - -66.550123207 99.913580305 - -66.551873391 99.670251362 - -66.636012097 99.552225796 - -66.718655871 99.678343171 - -66.716900334 99.923240262 -} -85c59c5bfffffff -{ - -36.239619870 -45.164185316 - -36.305885362 -45.226615664 - -36.386459959 -45.196319930 - -36.400801137 -45.103371325 - -36.334440707 -45.040858615 - -36.253834138 -45.071376772 -} -85893063fffffff -{ - -16.304927026 -149.469076974 - -16.216640947 -149.441928616 - -16.148396933 -149.509798960 - -16.168342722 -149.604841597 - -16.256601714 -149.632122914 - -16.324942108 -149.564228784 -} -85b65113fffffff -{ - -22.882580284 -98.394328226 - -22.949085065 -98.455511301 - -23.034810374 -98.421046252 - -23.054078602 -98.325311811 - -22.987569616 -98.264069531 - -22.901796622 -98.298620802 -} -850d6263fffffff -{ - 68.633114091 -139.869933215 - 68.578395068 -140.065951056 - 68.493367127 -140.045200663 - 68.463045771 -139.830179728 - 68.517439002 -139.634808609 - 68.602478106 -139.653809790 -} -8578e8bbfffffff -{ - -5.730902643 -130.997837388 - -5.809366544 -131.030624952 - -5.868966371 -130.981973027 - -5.850152041 -130.900615352 - -5.771778827 -130.867843327 - -5.712129301 -130.916413356 -} -85ef1967fffffff -{ - -79.131338377 -38.679405976 - -79.062367524 -38.318827831 - -78.968916701 -38.455439167 - -78.944076446 -38.946075564 - -79.012330538 -39.306647912 - -79.106137753 -39.176644214 -} -85f02573fffffff -{ - -82.627797171 76.408214710 - -82.593170149 75.752729181 - -82.647134049 75.218932539 - -82.736711844 75.337689989 - -82.771928842 76.004788920 - -82.716969047 76.541410552 -} -85e5366ffffffff -{ - -60.322991740 125.289710154 - -60.265680330 125.137204129 - -60.303087266 124.963171036 - -60.398018797 124.941043226 - -60.455548944 125.093928387 - -60.417928151 125.268562949 -} -851731dbfffffff -{ - 61.904716611 149.429816826 - 61.815577436 149.482245464 - 61.792041372 149.676172053 - 61.857483095 149.818687664 - 61.946775015 149.767288548 - 61.970473130 149.572340995 -} -85f0229bfffffff -{ - -81.198053215 83.309286645 - -81.173667173 82.743516817 - -81.234127803 82.348870759 - -81.319806794 82.520530473 - -81.344503824 83.095715479 - -81.283206491 83.489729533 -} -85b86d4ffffffff -{ - -32.228454046 119.292315471 - -32.144098693 119.304236424 - -32.096738932 119.234179305 - -32.133623420 119.152252572 - -32.217858728 119.140191516 - -32.265329573 119.210197034 -} -85219067fffffff -{ - 38.674789764 61.139627172 - 38.595754846 61.208715410 - 38.601624717 61.329970755 - 38.686585285 61.382454851 - 38.765769678 61.313447772 - 38.759843920 61.191874771 -} -85056283fffffff +85060aabfffffff { - 84.874920956 139.450195894 - 84.789059809 139.892924652 - 84.779258756 140.942757718 - 84.855006090 141.582020360 - 84.941977959 141.161850259 - 84.952099311 140.079181102 + 67.464714238 -36.000351110 + 67.469505425 -36.227648456 + 67.391999368 -36.350197819 + 67.309985792 -36.245891405 + 67.305303906 -36.020078426 + 67.382526674 -35.897093938 } -85cca527fffffff -{ - -39.586012743 85.505741449 - -39.669669710 85.540502912 - -39.684280785 85.654445722 - -39.615263636 85.733429316 - -39.531667376 85.698568027 - -39.517027508 85.584822615 -} -857241a7fffffff -{ - 6.373808655 147.631643567 - 6.278800145 147.645800059 - 6.243245341 147.734433152 - 6.302660416 147.808894180 - 6.397625921 147.794772725 - 6.433219403 147.706155162 -} -855f2da3fffffff -{ - 2.581225686 -59.958219466 - 2.660070438 -59.911035364 - 2.739333182 -59.951422405 - 2.739732364 -60.038920856 - 2.660947217 -60.086045653 - 2.581703317 -60.045731374 -} -85c54a1bfffffff -{ - -38.663187217 -26.914632358 - -38.745112595 -26.972596831 - -38.827100601 -26.912322264 - -38.827115017 -26.793890363 - -38.745081931 -26.735989581 - -38.663142189 -26.796456505 -} -85911c47fffffff -{ - -14.807702257 -123.434063002 - -14.766462741 -123.362759524 - -14.697962418 -123.363148760 - -14.670715846 -123.434688368 - -14.711860385 -123.505894216 - -14.780346322 -123.505658042 -} -85400ed7fffffff -{ - 27.221146234 107.660637579 - 27.307386625 107.638300379 - 27.338184920 107.542014709 - 27.282715626 107.468077711 - 27.196433734 107.490490364 - 27.165662587 107.586764633 -} -85cb9043fffffff -{ - -41.534680061 42.950401847 - -41.616824973 42.948047547 - -41.667399252 43.035342121 - -41.635774971 43.125037592 - -41.553545264 43.127236373 - -41.503024597 43.039895430 -} -8505030ffffffff -{ - 78.230326982 118.471219367 - 78.162166823 118.803284435 - 78.186878016 119.257186767 - 78.280099656 119.384637531 - 78.348922607 119.052457233 - 78.323857667 118.592898620 -} -85f1654bfffffff -{ - -87.789932639 -6.713788042 - -87.698827366 -6.156333084 - -87.635665877 -7.821779299 - -87.660362726 -10.052198481 - -87.749786155 -10.755443330 - -87.816278973 -9.087974438 -} -8562ea77fffffff -{ - 7.173495039 63.708223003 - 7.251454375 63.682870294 - 7.267548665 63.613216187 - 7.205776742 63.568977100 - 7.127917108 63.594294832 - 7.111729759 63.663886651 -} -85b9aed3fffffff -{ - -31.828128928 138.233279478 - -31.734007718 138.224577036 - -31.694691889 138.126675272 - -31.749382783 138.037394981 - -31.843458879 138.045877432 - -31.882889329 138.143860126 -} -854ad54ffffffff -{ - 16.700256895 133.726578604 - 16.608899844 133.743163511 - 16.577920068 133.835917178 - 16.638321300 133.912117623 - 16.729690147 133.895547833 - 16.760646036 133.802762405 -} -85570d23fffffff -{ - 20.579945360 -31.231045651 - 20.503709404 -31.284951063 - 20.421790442 -31.238601662 - 20.416004068 -31.138429964 - 20.492144925 -31.084433945 - 20.574167261 -31.130699928 -} -8530a093fffffff -{ - 36.542497146 118.440443568 - 36.616846344 118.422859901 - 36.653420049 118.334055440 - 36.615624305 118.262811008 - 36.541222864 118.280483079 - 36.504669371 118.369311170 -} -85f24253fffffff -{ - -75.015764116 -117.567294282 - -75.060482975 -117.280594091 - -75.015247743 -116.974381839 - -74.925665073 -116.957069347 - -74.881429785 -117.242337802 - -74.926296076 -117.546355109 -} -85314823fffffff -{ - 39.404101293 130.879324577 - 39.482027392 130.843663821 - 39.494396604 130.751217957 - 39.428925094 130.694658586 - 39.351127677 130.730379403 - 39.338673172 130.822599876 -} -850a68d7fffffff -{ - 74.169825328 91.438097843 - 74.138337989 91.760099157 - 74.198979657 92.013961292 - 74.291601088 91.946118362 - 74.323336029 91.621199215 - 74.262200030 91.367055935 -} -8516b0bbfffffff -{ - 49.222814843 153.842780059 - 49.311414805 153.825644941 - 49.341877849 153.698148158 - 49.283718263 153.588104049 - 49.195187462 153.605547382 - 49.164746924 153.732727145 -} -85e76607fffffff -{ - -74.266276005 21.434321285 - -74.174862971 21.350864490 - -74.146652113 21.026034838 - -74.209643135 20.781627903 - -74.301335459 20.862020637 - -74.329759167 21.189901467 -} -85baf36bfffffff -{ - -26.666194867 -177.997754148 - -26.585493117 -177.948865084 - -26.506573919 -177.997922190 - -26.508332680 -178.095719975 - -26.588929694 -178.144612521 - -26.667872615 -178.095704025 -} -853951cffffffff -{ - 38.876517629 1.311802353 - 38.788242107 1.328161022 - 38.759461169 1.430928555 - 38.818979697 1.517554805 - 38.907343348 1.501350799 - 38.936100394 1.398365567 -} -85195667fffffff -{ - 54.832329574 -5.701637797 - 54.781283574 -5.809752214 - 54.697683141 -5.777118033 - 54.665143975 -5.636799246 - 54.716117974 -5.528872714 - 54.799702929 -5.561076834 -} -85e83637fffffff -{ - -67.727559782 -93.920142940 - -67.736638538 -93.686439204 - -67.664087631 -93.537882808 - -67.582821930 -93.622724386 - -67.573903129 -93.854820864 - -67.646090790 -94.003675923 -} -85cb0607fffffff -{ - -33.494127308 49.006410795 - -33.583971134 49.009353250 - -33.630122802 49.098905328 - -33.586353309 49.185521433 - -33.496427675 49.182425179 - -33.450353296 49.092866753 -} -853b312ffffffff -{ - 38.770450836 -52.536653779 - 38.685029251 -52.572910256 - 38.616498460 -52.503300407 - 38.633295929 -52.397362135 - 38.718737724 -52.360857751 - 38.787361948 -52.430539343 -} -85ad05d7fffffff -{ - -33.584695983 13.783632541 - -33.675339083 13.773898117 - -33.729772526 13.858085337 - -33.693504092 13.951850404 - -33.602928106 13.961363696 - -33.548553339 13.877332965 -} -85c4e84ffffffff -{ - -47.065842990 -33.994673200 - -47.137276617 -34.064727742 - -47.219678330 -34.008898580 - -47.230634806 -33.882723467 - -47.159105167 -33.812665323 - -47.076715155 -33.868785356 -} -85a8e957fffffff -{ - -16.325324192 -53.258569522 - -16.249499648 -53.207855021 - -16.166772145 -53.252782642 - -16.159909976 -53.348366744 - -16.235729130 -53.399041926 - -16.318415852 -53.354172444 -} -851032c3fffffff -{ - 57.373429950 40.515892846 - 57.319317482 40.636545782 - 57.354180334 40.783362405 - 57.443308034 40.809872038 - 57.497537079 40.688927142 - 57.462521514 40.541764380 -} -85deb65bfffffff -{ - -57.508930527 -34.781120334 - -57.441911134 -34.667833221 - -57.358169048 -34.724276155 - -57.341274444 -34.893322289 - -57.408017167 -35.006729164 - -57.491930780 -34.950972635 -} -851b5847fffffff -{ - 51.716030486 -36.228731457 - 51.637306604 -36.301399760 - 51.563108879 -36.227102476 - 51.567544392 -36.080250933 - 51.646210287 -36.007321115 - 51.720498701 -36.081503411 -} -85d2e48ffffffff -{ - -42.091385904 -108.244261489 - -42.027380100 -108.145889351 - -41.932291945 -108.171586390 - -41.901151806 -108.295312361 - -41.965010064 -108.393636793 - -42.060155785 -108.368283446 -} -85e6e48bfffffff -{ - -62.289333475 14.639020210 - -62.202717754 14.614262893 - -62.164276935 14.437904094 - -62.212263704 14.285494809 - -62.298994514 14.309182104 - -62.337624201 14.486350516 -} -85e46127fffffff -{ - -67.290013341 86.940509356 - -67.199705966 86.856751820 - -67.181406769 86.615197296 - -67.253276104 86.455927693 - -67.343743783 86.538353552 - -67.362182495 86.781386810 -} -85ed7537fffffff -{ - -72.109050369 172.322594822 - -72.120032652 172.078720925 - -72.198878664 171.994710369 - -72.266856391 172.156295146 - -72.255671778 172.402035527 - -72.176712627 172.484316178 -} -852b18b7fffffff -{ - 44.469528996 -66.783487479 - 44.429144709 -66.900910559 - 44.339942417 -66.911272082 - 44.291175762 -66.804647444 - 44.331418662 -66.687524428 - 44.420569263 -66.676726325 -} -85885d13fffffff -{ - -3.036868232 -161.747940782 - -3.120044947 -161.773370266 - -3.186997077 -161.710918116 - -3.170839472 -161.622994936 - -3.087665506 -161.597492233 - -3.020646319 -161.659985856 -} -851d18b3fffffff -{ - 53.828123596 -141.609905819 - 53.752577991 -141.598073316 - 53.709172604 -141.486950625 - 53.741209337 -141.387299211 - 53.816852020 -141.398659873 - 53.860361139 -141.510144348 -} -85bd162bfffffff -{ - -37.830443657 40.621053255 - -37.751008348 40.621570772 - -37.716949379 40.528222099 - -37.762343489 40.434255320 - -37.841808310 40.433652955 - -37.875849596 40.527102266 -} -853960abfffffff -{ - 43.788614723 1.780227039 - 43.703450301 1.797142546 - 43.677485420 1.906369248 - 43.736705481 1.998923628 - 43.821947481 1.982184823 - 43.847891918 1.872714567 -} -8500546ffffffff -{ - 83.879333324 20.568250824 - 83.948931598 21.060201150 - 84.032083793 20.704186118 - 84.044670798 19.841008516 - 83.973942622 19.356132622 - 83.891761371 19.726989925 -} -85f021c3fffffff -{ - -82.110137145 74.563962463 - -82.072789299 73.959658062 - -82.124289887 73.448669959 - -82.214052774 73.538627696 - -82.251996809 74.152470971 - -82.199573496 74.666746402 -} -850541d3fffffff -{ - 83.203351935 162.445756488 - 83.107918026 162.481079865 - 83.062433030 163.186435770 - 83.111447700 163.866701018 - 83.206932074 163.850440690 - 83.253364885 163.134831933 -} -85f2daa3fffffff -{ - -79.903725086 -78.746860051 - -79.893449532 -78.212515869 - -79.805516415 -78.000680679 - -79.728439387 -78.317522378 - -79.738602396 -78.843425365 - -79.825953410 -79.060839161 -} -8561b5c3fffffff -{ - 12.013570513 85.559690538 - 12.105111410 85.532074863 - 12.126570254 85.438360809 - 12.056524917 85.372330068 - 11.965036525 85.399959190 - 11.943540938 85.493605726 -} -8530de9bfffffff -{ - 33.228394474 127.214507612 - 33.157033664 127.231949623 - 33.138957124 127.324854908 - 33.192274083 127.400371926 - 33.263646136 127.382933342 - 33.281690056 127.289974234 -} -85dd211bfffffff -{ - -65.351081533 -17.749910939 - -65.265953052 -17.655390640 - -65.188643107 -17.787582389 - -65.196127816 -18.013825330 - -65.281005823 -18.109363594 - -65.358649976 -17.977647535 -} -85f1ad17fffffff -{ - -80.431649429 105.401467511 - -80.362319464 105.079269214 - -80.371206080 104.534426702 - -80.449554844 104.304034050 - -80.519521098 104.623731922 - -80.510500729 105.176402467 -} -8500cd93fffffff -{ - 88.273330167 61.989238248 - 88.290937645 64.972887450 - 88.378747971 66.120540896 - 88.451684445 64.048822276 - 88.432345374 60.772683266 - 88.341924806 59.877846999 -} -856a556bfffffff -{ - 5.714664108 32.315017912 - 5.801517969 32.318577204 - 5.849264358 32.240485632 - 5.810211766 32.158796861 - 5.723352069 32.155177505 - 5.675550706 32.233306977 -} -85405e73fffffff -{ - 28.478815720 100.605668408 - 28.564046065 100.580291722 - 28.590134120 100.479750534 - 28.530983341 100.404621761 - 28.445735433 100.430060316 - 28.419655804 100.530565892 -} -8501854ffffffff -{ - 72.554091787 50.895498144 - 72.581108374 51.159167902 - 72.664350748 51.192383304 - 72.720625771 50.959390821 - 72.693254567 50.693940502 - 72.609964757 50.663268395 -} -851266c3fffffff -{ - 59.407375898 -107.204103392 - 59.326071275 -107.290624129 - 59.244760670 -107.198358497 - 59.244517257 -107.019894641 - 59.325657397 -106.932807610 - 59.407205620 -107.024747678 -} -852d5ec7fffffff -{ - 44.564489698 42.970108917 - 44.501958054 43.060843678 - 44.528137833 43.175933263 - 44.616996858 43.200515730 - 44.679654136 43.109637979 - 44.653326533 42.994320560 -} -851663cbfffffff -{ - 56.782332884 176.581943094 - 56.698181204 176.549973659 - 56.645344140 176.672618517 - 56.676390494 176.827309473 - 56.760414978 176.860002562 - 56.813520787 176.737282602 -} -85e8a337fffffff -{ - -67.622281446 -78.788392629 - -67.609107173 -78.547110155 - -67.523432024 -78.449745340 - -67.451231678 -78.592515248 - -67.464371952 -78.832060488 - -67.549746309 -78.930564767 -} -8562e6b7fffffff -{ - 8.534110033 60.634296182 - 8.468645791 60.643823484 - 8.449457205 60.717195994 - 8.495798362 60.781006652 - 8.561257021 60.771392138 - 8.580380203 60.698054169 -} -85033057fffffff -{ - 87.462336085 -177.492690447 - 87.373451201 -178.095274056 - 87.303049964 -176.723659534 - 87.318743234 -174.764900660 - 87.405870681 -174.063602762 - 87.479109659 -175.415307963 -} -853eb00bfffffff -{ - 22.036173502 15.040822294 - 21.940655111 15.043801741 - 21.894122045 15.134292103 - 21.943052763 15.221915793 - 22.038609024 15.219087596 - 22.085196809 15.128484384 -} -85ca683bfffffff -{ - -37.468542191 67.911284420 - -37.559757431 67.931851120 - -37.592611755 68.043990936 - -37.534211105 68.135441953 - -37.442997277 68.114699073 - -37.410182571 68.002681193 -} -85c0e0cffffffff -{ - -39.556727950 -8.746182791 - -39.648337872 -8.786873655 - -39.720978666 -8.703897167 - -39.701915544 -8.580204955 - -39.610255204 -8.539737999 - -39.537708294 -8.622738861 -} -857736bbfffffff -{ - 7.723851267 149.999226385 - 7.629638833 150.012874530 - 7.593603588 150.100170716 - 7.651737696 150.173795764 - 7.745896301 150.160185033 - 7.781974664 150.072911805 -} -85039843fffffff -{ - 76.884251713 -145.457824233 - 76.821384717 -145.760779442 - 76.730751187 -145.686149975 - 76.702836014 -145.313168985 - 76.765150533 -145.011097481 - 76.855929632 -145.081103683 -} -85343647fffffff -{ - 37.506964851 -29.738511170 - 37.425721495 -29.805655442 - 37.339132534 -29.750828669 - 37.333702089 -29.628993403 - 37.414865266 -29.561729137 - 37.501539051 -29.616419588 -} -85204c6bfffffff -{ - 49.420638662 86.257374007 - 49.328560802 86.298222246 - 49.305229503 86.438780473 - 49.373865842 86.538872349 - 49.465980175 86.498463812 - 49.489421947 86.357522953 -} -85f29093fffffff -{ - -88.631558746 153.846115151 - -88.706702935 151.611901606 - -88.786999274 153.492665920 - -88.787132694 157.908416878 - -88.706781644 159.896905054 - -88.631515059 157.756822596 -} -857c69abfffffff -{ - 3.360883117 -32.057924171 - 3.441000800 -32.010594586 - 3.523886120 -32.057052853 - 3.526703365 -32.150869579 - 3.446590571 -32.198250080 - 3.363655623 -32.151763056 -} -854a935bfffffff -{ - 13.300118352 125.695368674 - 13.209043020 125.712275088 - 13.180418829 125.801319878 - 13.242918896 125.873512347 - 13.334040719 125.856606443 - 13.362616031 125.767507490 -} -8541045bfffffff -{ - 20.344144870 115.865799746 - 20.432647162 115.847953950 - 20.466157863 115.761561467 - 20.411108197 115.693000710 - 20.322532439 115.710924665 - 20.289079804 115.797331227 -} -8576b1bbfffffff -{ - -5.520461937 154.109597361 - -5.609608222 154.121987211 - -5.639287694 154.204419599 - -5.579894616 154.274428904 - -5.490802411 154.262077727 - -5.461049160 154.179678553 -} -851da58ffffffff -{ - 56.415493699 -146.083865568 - 56.359735198 -146.193922391 - 56.289334940 -146.165316827 - 56.274627288 -146.027271832 - 56.330150363 -145.917318976 - 56.400616022 -145.945306118 -} -85d829b7fffffff -{ - -52.231142784 129.725287142 - -52.178724523 129.600022658 - -52.217504002 129.468334127 - -52.308906948 129.461616307 - -52.361495000 129.587202137 - -52.322509873 129.719184385 -} -852004b7fffffff -{ - 47.263193817 70.181807714 - 47.177241569 70.249260121 - 47.173828467 70.392492567 - 47.256361256 70.468719274 - 47.342439433 70.401512798 - 47.345858917 70.257832538 -} -850486bbfffffff -{ - 66.678476383 138.551138216 - 66.592297597 138.656037889 - 66.584263467 138.897687115 - 66.662357854 139.036137742 - 66.748825115 138.932320228 - 66.756909798 138.688961807 -} -85cad437fffffff -{ - -47.240177184 58.122243236 - -47.322116920 58.135026909 - -47.362046942 58.250923409 - -47.319986698 58.353967470 - -47.238019092 58.340957026 - -47.198139467 58.225129308 -} -85713147fffffff -{ - 13.405107018 -173.980339825 - 13.317540143 -174.000000717 - 13.255312011 -173.937637622 - 13.280626621 -173.855521961 - 13.368263514 -173.835768427 - 13.430515794 -173.898223197 -} -85e7a4affffffff -{ - -65.202353055 42.298292936 - -65.131114435 42.180579800 - -65.130790521 41.979429821 - -65.201807996 41.894743545 - -65.273363556 42.012055724 - -65.273584297 42.214460203 -} -85002cd3fffffff -{ - 78.078010398 23.094778200 - 78.140083925 23.354479965 - 78.220452544 23.194698842 - 78.238277242 22.771125484 - 78.175606078 22.512667053 - 78.095709280 22.676495618 -} -85282dc3fffffff -{ - 38.184388507 -128.904942827 - 38.267175474 -128.859967748 - 38.335216380 -128.923262715 - 38.320418307 -129.031482680 - 38.237655923 -129.076266758 - 38.169666986 -129.013022079 -} -85033677fffffff -{ - 86.842127726 174.474917798 - 86.749890757 174.208255068 - 86.688515089 175.480220404 - 86.717104176 177.031008458 - 86.808470338 177.375022319 - 86.872167512 176.092474464 -} -85092d0ffffffff -{ - 68.765977905 -3.792394406 - 68.808371403 -3.956663752 - 68.767952501 -4.144350816 - 68.685272517 -4.166724730 - 68.643160276 -4.002764162 - 68.683447406 -3.816118147 -} -85040097fffffff -{ - 75.496843075 144.211454342 - 75.405328475 144.344807993 - 75.388167753 144.725317317 - 75.462331911 144.976579152 - 75.554198824 144.846621375 - 75.571550893 144.461976629 -} -85045863fffffff -{ - 71.966810127 177.276577177 - 71.872885331 177.213132090 - 71.809730171 177.440115087 - 71.840054646 177.730740138 - 71.933761126 177.796694853 - 71.997362981 177.569525733 -} -85227583fffffff -{ - 44.969331148 -175.361321854 - 45.059720200 -175.337216225 - 45.122627068 -175.435577891 - 45.095055024 -175.558090475 - 45.004585036 -175.581946372 - 44.941767910 -175.483539947 -} -850ba46bfffffff -{ - 56.722667995 78.902412411 - 56.634877597 78.966590259 - 56.619736654 79.137632205 - 56.692318322 79.245108511 - 56.780200456 79.181448807 - 56.795409405 79.009792904 -} -85038803fffffff -{ - 79.404865867 -134.140854541 - 79.357007859 -134.568353386 - 79.264602171 -134.573977868 - 79.220140511 -134.159481028 - 79.267449129 -133.735985971 - 79.359763718 -133.722989466 -} -8510f04bfffffff -{ - 56.376665720 53.990753151 - 56.307247855 54.097295156 - 56.326041236 54.261041927 - 56.414352215 54.318798480 - 56.483926913 54.212252035 - 56.465033531 54.047952088 -} -85033143fffffff -{ - 87.867491912 -153.547996866 - 87.797109189 -155.124894010 - 87.707992706 -154.320757253 - 87.687309982 -152.076173826 - 87.754435590 -150.485751112 - 87.845427047 -151.146876265 -} -85a8248bfffffff -{ - -27.880184176 -50.910354997 - -27.813934791 -50.858238669 - -27.739688168 -50.904947354 - -27.731727319 -51.003720863 - -27.797989588 -51.055806479 - -27.872199826 -51.009149435 -} -8503a1abfffffff -{ - 83.188498812 -150.425295695 - 83.120400913 -150.963152430 - 83.029350290 -150.751440730 - 83.005899205 -150.017501045 - 83.072935890 -149.479866165 - 83.164475680 -149.675752599 -} -85f2b1abfffffff -{ - -86.368265775 -169.593359811 - -86.457793929 -169.510987676 - -86.493534217 -168.177844034 - -86.438072295 -166.969573838 - -86.348823747 -167.114735182 - -86.314714259 -168.405909898 -} -85f0c02bfffffff -{ - -72.099283381 56.930179708 - -72.009672500 56.968816789 - -71.952057521 56.752543133 - -71.983723191 56.497404254 - -72.073158493 56.456666441 - -72.131104799 56.673160586 -} -853f95a3fffffff -{ - 27.422285872 12.072725023 - 27.326366120 12.078474895 - 27.282534363 12.173516782 - 27.334587997 12.262948255 - 27.430561929 12.257359152 - 27.474428147 12.162177679 -} -85d80c37fffffff -{ - -50.004103534 131.442173443 - -49.953857713 131.322701121 - -49.992927742 131.201032961 - -50.082446614 131.198606133 - -50.132848345 131.318390301 - -50.093574903 131.440289273 -} -85426b7bfffffff -{ - 31.652973686 73.070441999 - 31.571017422 73.118971914 - 31.564989937 73.229402071 - 31.640893091 73.291565819 - 31.722962689 73.243205245 - 31.729015855 73.132511066 -} -850c030ffffffff -{ - 63.292266549 -159.270269308 - 63.218553045 -159.383858193 - 63.142923202 -159.301958937 - 63.140799870 -159.107266151 - 63.214206062 -158.993328442 - 63.290042519 -159.074427920 -} -85e85babfffffff -{ - -55.510476096 -82.352856736 - -55.429111041 -82.276768590 - -55.351743715 -82.355411274 - -55.355583320 -82.509997239 - -55.436868952 -82.586511737 - -55.514394533 -82.508015464 -} -85000b9bfffffff -{ - 82.448712471 33.260945396 - 82.504411544 33.771184282 - 82.593335361 33.634805765 - 82.626118120 32.974530022 - 82.569436592 32.462407044 - 82.480962923 32.612328992 -} -85d21b4ffffffff -{ - -42.399705323 -104.658252385 - -42.332713406 -104.563593826 - -42.238560178 -104.595125542 - -42.211318289 -104.720991556 - -42.278161348 -104.815651330 - -42.372394965 -104.784444494 -} -853edd33fffffff -{ - 18.813831525 28.467257181 - 18.719571017 28.458993071 - 18.666891951 28.541794109 - 18.708379248 28.632888979 - 18.802602624 28.641293326 - 18.855375946 28.558462662 -} -85039693fffffff -{ - 77.216190125 -163.995072469 - 77.133630273 -164.208565885 - 77.051323252 -164.002613476 - 77.051099719 -163.586081730 - 77.133111994 -163.370206956 - 77.215894916 -163.573200136 -} -8526516bfffffff -{ - 37.233700940 -92.695697409 - 37.300090372 -92.623428774 - 37.386603488 -92.662156553 - 37.406747146 -92.773338734 - 37.340311155 -92.845662899 - 37.253778131 -92.806749560 -} -8548c873fffffff -{ - 35.242076274 -109.696882863 - 35.321404769 -109.633525424 - 35.404736609 -109.687293977 - 35.408698099 -109.804512631 - 35.329329557 -109.867789873 - 35.246039587 -109.813929028 -} -85ad06affffffff -{ - -32.609291004 14.945563741 - -32.699166937 14.937387021 - -32.752789975 15.020275175 - -32.716480733 15.111182231 - -32.626676306 15.119146890 - -32.573109522 15.036416449 -} -8565a96ffffffff -{ - 9.589279402 101.082322589 - 9.683509754 101.058630125 - 9.710282856 100.964257486 - 9.642791901 100.893607463 - 9.548552620 100.917355680 - 9.521813165 101.011698262 -} -855d3127fffffff -{ - 22.527768176 -153.652691909 - 22.437442607 -153.685152440 - 22.367149350 -153.615938582 - 22.387167091 -153.514258478 - 22.477494128 -153.481729390 - 22.547802006 -153.550948808 -} -85126d83fffffff -{ - 56.920618370 -99.232607350 - 56.844959989 -99.333809148 - 56.757480856 -99.264634230 - 56.745457003 -99.094738009 - 56.820911042 -98.993222605 - 56.908593209 -99.061914440 -} -8532f2bbfffffff -{ - 41.523676362 168.637176979 - 41.619719887 168.640467850 - 41.669703425 168.529998762 - 41.623562749 168.416374295 - 41.527517588 168.413371320 - 41.477614546 168.523704878 -} -8518f373fffffff -{ - 46.719537968 -17.010625951 - 46.650822315 -17.099518322 - 46.562726493 -17.053955614 - 46.543317177 -16.919789571 - 46.611943715 -16.830906157 - 46.700068550 -16.876179257 -} -8517036bfffffff -{ - 59.942302978 156.326544845 - 59.852895782 156.354016573 - 59.820660068 156.527430517 - 59.877619560 156.674105576 - 59.967100589 156.647618936 - 59.999549040 156.473470619 -} -85e29083fffffff -{ - -62.043156958 -113.633252756 - -61.989680125 -113.475216385 - -61.900169851 -113.501117994 - -61.864104326 -113.684209722 - -61.917413220 -113.841968936 - -62.006955066 -113.816914521 -} -8500c913fffffff +85418607fffffff { - 88.560197514 118.945992055 - 88.494538885 121.464134861 - 88.513353137 125.013849940 - 88.599702265 126.411618687 - 88.670668568 123.942075651 - 88.649805347 119.999718651 + 27.699593699 118.163889244 + 27.782646880 118.146785994 + 27.818665442 118.060816418 + 27.771589465 117.991928844 + 27.688464452 118.009114360 + 27.652487236 118.095105181 } -857d1663fffffff -{ - -8.041897261 -17.667842750 - -7.963521721 -17.628192768 - -7.888503835 -17.670176257 - -7.891816272 -17.751880569 - -7.970243726 -17.791617551 - -8.045306825 -17.749563255 -} -85935acbfffffff -{ - -10.672928426 -100.781519468 - -10.744739755 -100.839527741 - -10.832302527 -100.807814331 - -10.848097476 -100.718008865 - -10.776251479 -100.659936988 - -10.688645226 -100.691734114 -} -853faa67fffffff -{ - 28.851199122 15.861841017 - 28.754358578 15.864269901 - 28.707812576 15.960543972 - 28.758060597 16.054512300 - 28.854935103 16.052256241 - 28.901527746 15.955858951 -} -851daad3fffffff -{ - 54.042074814 -148.139469374 - 53.986108438 -148.238140711 - 53.919162504 -148.206787497 - 53.908103882 -148.077276708 - 53.963847226 -147.978654169 - 54.030871814 -148.009492663 -} -855b930bfffffff -{ - 16.154668881 -177.353650444 - 16.239693774 -177.338355776 - 16.289640604 -177.409645892 - 16.254443437 -177.496241516 - 16.169346826 -177.511405250 - 16.119519014 -177.440104466 -} -85aece43fffffff -{ - -30.459769045 102.711254152 - -30.536597732 102.749227113 - -30.541516017 102.837144648 - -30.469702713 102.886948734 - -30.392970433 102.848982969 - -30.387955098 102.761205765 -} -85e2c067fffffff -{ - -53.689179538 -126.165740211 - -53.646559545 -126.028021556 - -53.552472173 -126.023331533 - -53.501069491 -126.155813308 - -53.543599354 -126.293135447 - -53.637621709 -126.298371802 -} -85b78e2bfffffff -{ - -31.051801491 -87.981561488 - -31.117617551 -88.045575695 - -31.196456252 -88.004855936 - -31.209494769 -87.900064215 - -31.143684492 -87.836042895 - -31.064829946 -87.876820234 -} -8507a2bbfffffff -{ - 77.381783188 -16.765542475 - 77.417008612 -17.102470960 - 77.364578617 -17.389550637 - 77.277298042 -17.338164749 - 77.242430418 -17.003901464 - 77.294487993 -16.718365953 -} -85b632b3fffffff -{ - -30.813459482 -91.469828936 - -30.746078031 -91.407881801 - -30.663632660 -91.449485297 - -30.648434127 -91.552901897 - -30.715690247 -91.614965012 - -30.798270244 -91.573496011 -} -853e26b7fffffff -{ - 31.767673571 21.504553155 - 31.670633999 21.501740979 - 31.620120889 21.599198002 - 31.666587383 21.699558987 - 31.763629596 21.702557872 - 31.814202810 21.605009080 -} -85daedc3fffffff -{ - -51.494580930 156.960487135 - -51.409003898 156.921015980 - -51.387374255 156.776729486 - -51.451284304 156.671572394 - -51.536914506 156.710725610 - -51.558581648 156.855354606 -} -85f16043fffffff -{ - -87.783630570 18.620012153 - -87.691939916 18.163785906 - -87.661918115 16.016483336 - -87.721551848 14.198303951 - -87.814324113 14.494808792 - -87.846483899 16.773354571 -} -85104137fffffff -{ - 66.472798258 60.474347628 - 66.405204389 60.603779694 - 66.416562152 60.828133407 - 66.495572563 60.924138210 - 66.563363290 60.794963107 - 66.551946476 60.569522040 -} -853b258bfffffff -{ - 41.642625995 -49.895417579 - 41.556831687 -49.937391313 - 41.487158988 -49.865607632 - 41.503187516 -49.751795269 - 41.588991228 -49.709556525 - 41.658757114 -49.781394850 -} -85856e7bfffffff -{ - 3.063695373 67.287903752 - 2.988877191 67.302357832 - 2.964965093 67.383119874 - 3.015934481 67.449366240 - 3.090732338 67.434819416 - 3.114581235 67.354118913 -} -851836c7fffffff -{ - 56.241989052 -15.486380809 - 56.182490176 -15.591968207 - 56.101674375 -15.541083902 - 56.080322274 -15.385022626 - 56.139725267 -15.279474738 - 56.220576054 -15.329947768 -} -85045397fffffff -{ - 73.298326548 169.786635971 - 73.201957343 169.759820702 - 73.147375376 170.032937504 - 73.188704467 170.333930270 - 73.284962124 170.363970397 - 73.340004511 170.089799263 -} -85f2914bfffffff -{ - -89.753434647 -142.195308664 - -89.826299528 -126.505360119 - -89.780266586 -103.227958204 - -89.687406930 -106.498092600 - -89.640349056 -120.086968980 - -89.667525330 -134.560755986 -} -85f20443fffffff -{ - -79.133673749 -148.051128333 - -79.209457378 -147.852552976 - -79.210099029 -147.384194561 - -79.134799921 -147.121154813 - -79.059514510 -147.323842601 - -79.059028756 -147.785520575 -} -85d836b7fffffff -{ - -51.468845314 141.043099984 - -51.380673470 141.027330972 - -51.340650437 140.895095459 - -51.388710776 140.778453088 - -51.476860637 140.793838817 - -51.516972362 140.926250244 -} -85048d0bfffffff -{ - 67.796055215 149.700948029 - 67.703409464 149.766306938 - 67.678330236 150.011839680 - 67.745698329 150.193639749 - 67.838525159 150.129948994 - 67.863803861 149.882783384 -} -85f0252bfffffff -{ - -82.663344132 74.022105808 - -82.625219746 73.373788514 - -82.676391924 72.818716012 - -82.766664921 72.907750944 - -82.805447740 73.566931914 - -82.753289370 74.126131338 -} -85dd1a5bfffffff -{ - -59.184597981 -10.443084284 - -59.100933639 -10.389484266 - -59.033824166 -10.510742498 - -59.050090559 -10.685544875 - -59.133608236 -10.739937922 - -59.201006695 -10.618738180 -} -85ea84c3fffffff -{ - -61.970805268 -179.618237005 - -61.911470564 -179.698161227 - -61.922879516 -179.861665359 - -61.993669384 -179.945777942 - -62.053097456 -179.865916535 - -62.041642181 -179.701878372 -} -852b415bfffffff -{ - 38.975870869 -60.320127859 - 38.943589239 -60.426921046 - 38.861801462 -60.447145373 - 38.812381978 -60.360889372 - 38.844567451 -60.254379601 - 38.926268344 -60.233842868 -} -85566863fffffff -{ - 10.871438652 -25.237377981 - 10.943123952 -25.193908155 - 11.021353480 -25.238073320 - 11.027968150 -25.325758999 - 10.956293025 -25.369298821 - 10.877993012 -25.325083045 -} -85d49d1bfffffff -{ - -41.923680680 -153.355927247 - -41.835878236 -153.316871876 - -41.768428167 -153.401731822 - -41.788720980 -153.525646703 - -41.876499533 -153.564901969 - -41.944009264 -153.480042852 -} -8500ee03fffffff -{ - 85.816664273 49.605969602 - 85.853095065 50.740446264 - 85.945621706 50.877780167 - 86.001995864 49.831507636 - 85.964178152 48.664270949 - 85.871406706 48.576425571 -} -8526a097fffffff -{ - 43.510401206 -104.949719799 - 43.581031340 -104.877574098 - 43.660276972 -104.931809213 - 43.668866335 -105.058336037 - 43.598193042 -105.130431485 - 43.518973587 -105.076050809 -} -85032607fffffff +85271c63fffffff { - 89.694843126 84.573548627 - 89.667188173 100.274582029 - 89.709923472 115.779614303 - 89.799258488 121.429000141 - 89.851412983 96.359003907 - 89.780266586 76.772041796 + 49.155690058 -97.955289003 + 49.085429993 -98.040584258 + 48.999972188 -97.986413848 + 48.984598031 -97.847289251 + 49.054668778 -97.761805806 + 49.140302939 -97.815633747 } -850f3467fffffff +8522eab7fffffff { - 71.246818144 -67.919296158 - 71.206231703 -68.184332722 - 71.112490828 -68.202098931 - 71.059400336 -67.957100600 - 71.099719011 -67.693541295 - 71.193394449 -67.673506308 + 52.425412772 -173.834739652 + 52.509324784 -173.805569187 + 52.571667275 -173.913810159 + 52.550011302 -174.051301322 + 52.466021949 -174.080169627 + 52.403765773 -173.971849721 } -85cfa193fffffff +85005eb7fffffff { - -51.114174206 -71.075079546 - -51.031545718 -71.031374947 - -50.963181128 -71.113081470 - -50.977302247 -71.238552993 - -51.059924124 -71.282675430 - -51.128431704 -71.200909114 + 85.853343209 0.329184856 + 85.937814177 0.662462607 + 86.003072382 -0.259626082 + 85.981995129 -1.515910942 + 85.896683303 -1.806601743 + 85.833264409 -0.884488554 +} +8503303bfffffff +{ + 87.754710769 -168.361069250 + 87.671363083 -169.373034238 + 87.592335863 -168.107877137 + 87.593808595 -165.895735841 + 87.674526785 -164.796957668 + 87.756411577 -165.989795598 +} +85f11027fffffff +{ + -81.192459200 115.069134598 + -81.133648930 114.657337808 + -81.157209796 114.086231104 + -81.239931565 113.919001607 + -81.299461344 114.330998157 + -81.275545487 114.910096878 +} +85076467fffffff +{ + 64.238353596 -11.228302214 + 64.270318354 -11.381802250 + 64.219560926 -11.530189129 + 64.137010557 -11.524534682 + 64.105291463 -11.371497391 + 64.155877648 -11.223651527 +} +85e0c503fffffff +{ + -53.323728203 54.805583831 + -53.239642536 54.829554382 + -53.192279725 54.726151722 + -53.228791730 54.598762735 + -53.312739369 54.574296573 + -53.360313244 54.677713960 +} +85b455bbfffffff +{ + -25.173117352 -163.535701175 + -25.083764659 -163.494544655 + -25.007156892 -163.558877446 + -25.019830768 -163.664293555 + -25.109104980 -163.705542191 + -25.185783819 -163.641282901 +} +85294563fffffff +{ + 35.015242830 -133.082253518 + 35.098598620 -133.043841140 + 35.165380262 -133.105173052 + 35.148752636 -133.204845933 + 35.065436682 -133.243073242 + 34.998708479 -133.181812858 +} +85b84247fffffff +{ + -28.914588859 122.844289719 + -28.828899333 122.852406888 + -28.784867172 122.779417365 + -28.826402944 122.698339244 + -28.911984429 122.690073947 + -28.956138195 122.763034677 +} +85f175b3fffffff +{ + -88.161164430 49.587821470 + -88.091393339 47.718617104 + -88.107714158 45.013836693 + -88.195163130 43.951339655 + -88.268827876 45.780799873 + -88.251056692 48.725333292 +} +852c4297fffffff +{ + 44.264584186 51.178628011 + 44.193628477 51.264222898 + 44.211717068 51.389338973 + 44.300877253 51.429172388 + 44.371980602 51.343535869 + 44.353775915 51.218107018 +} +85b28aaffffffff +{ + -32.857881084 -77.511134535 + -32.926956474 -77.572502874 + -33.000104483 -77.528707026 + -33.004173044 -77.423531771 + -32.935113548 -77.362217137 + -32.861969625 -77.406023866 +} +85f27387fffffff +{ + -75.167224045 -124.771059877 + -75.220184355 -124.510997926 + -75.185192171 -124.186512299 + -75.097513705 -124.124966972 + -75.045061612 -124.384474294 + -75.079781836 -124.706095221 +} +85528323fffffff +{ + 12.008297183 39.236537401 + 11.922235065 39.221099943 + 11.871964269 39.289592392 + 11.907650180 39.373490700 + 11.993631636 39.389023909 + 12.044007890 39.320563210 +} +85cd6acffffffff +{ + -52.130826361 77.946684115 + -52.041461085 77.916032312 + -52.016146404 77.774609660 + -52.080029066 77.663387090 + -52.169432169 77.693451901 + -52.194915207 77.835327061 +} +85416b07fffffff +{ + 17.969946299 103.913097736 + 18.062467030 103.889865783 + 18.091086415 103.794241035 + 18.027152811 103.721871026 + 17.934603342 103.745167649 + 17.906016163 103.840769696 +} +85f00287fffffff +{ + -78.697099596 74.991433371 + -78.609095088 74.919563228 + -78.572135808 74.499839509 + -78.622790407 74.148250248 + -78.710905931 74.214498168 + -78.748259316 74.637972008 +} +85988c2bfffffff +{ + -19.888446157 -11.268733099 + -19.973970413 -11.303484810 + -20.043985494 -11.239373959 + -20.028363533 -11.140478058 + -19.942763531 -11.105856954 + -19.872861163 -11.170000879 +} +859546a7fffffff +{ + -4.176922658 126.357433788 + -4.269176646 126.373917878 + -4.303434044 126.461163821 + -4.245418959 126.531975639 + -4.153105538 126.515493144 + -4.118866604 126.428197171 +} +85a3717bfffffff +{ + -12.868963099 51.519538590 + -12.778617856 51.515858185 + -12.735997101 51.439544007 + -12.783748274 51.366804907 + -12.874187597 51.370433326 + -12.916781659 51.446852901 +} +85693603fffffff +{ + 13.733176703 108.132327318 + 13.826132608 108.111182611 + 13.855531294 108.019485030 + 13.791920586 107.948941159 + 13.698920894 107.970155436 + 13.669575655 108.061844071 +} +85e1ac4bfffffff +{ + -61.165459182 73.693084763 + -61.072077665 73.666759024 + -61.037476975 73.491211317 + -61.096042050 73.341354419 + -61.189426609 73.366677915 + -61.224243720 73.542861430 +} +85f2aa6ffffffff +{ + -85.338514277 -124.331768733 + -85.397309003 -123.473365291 + -85.362246592 -122.422180230 + -85.269368567 -122.258765186 + -85.212090840 -123.109846561 + -85.246197059 -124.132080654 +} +85f2a513fffffff +{ + -83.339886936 -159.471823562 + -83.424790949 -159.290551835 + -83.444345975 -158.536508348 + -83.378362294 -157.979915032 + -83.293942875 -158.177120065 + -83.275013094 -158.915190658 +} +854b429bfffffff +{ + 30.125671760 132.293794873 + 30.048479565 132.310866320 + 30.024586784 132.405311172 + 30.077912893 132.482722428 + 30.155110220 132.465664056 + 30.178976380 132.371181272 +} +85f2902bfffffff +{ + -89.565601879 147.891428345 + -89.632073000 138.765586253 + -89.719853856 143.020972567 + -89.724981756 162.463006370 + -89.639332556 168.599231793 + -89.568422845 160.323445399 } -85ccf563fffffff -{ - -39.088760937 78.396821208 - -39.176187292 78.426511487 - -39.198314550 78.542368437 - -39.133014858 78.628356110 - -39.045630373 78.598525515 - -39.023503623 78.482847245 -} -8568c12ffffffff -{ - 1.814592135 123.592269051 - 1.721759180 123.608889965 - 1.689134272 123.695080288 - 1.749381973 123.764706517 - 1.842283029 123.748082580 - 1.874868302 123.661835375 -} -85126983fffffff -{ - 55.780854497 -99.450678020 - 55.705576279 -99.548172376 - 55.618474744 -99.480702500 - 55.606450702 -99.316184208 - 55.681529222 -99.218390522 - 55.768831428 -99.285412104 -} -8528b0cffffffff -{ - 42.108480407 -113.001822954 - 42.185002787 -112.937009174 - 42.261422039 -112.996806342 - 42.261275152 -113.121495549 - 42.184723354 -113.186190098 - 42.108347862 -113.126315117 -} -85e8ad2ffffffff -{ - -64.972314971 -81.078971285 - -64.961976759 -80.864339032 - -64.879441231 -80.770121776 - -64.807533173 -80.889720081 - -64.817869527 -81.102966994 - -64.900115727 -81.197994989 -} -8505b557fffffff -{ - 70.064998721 111.775566680 - 70.004711272 111.992943847 - 70.037710989 112.251063813 - 70.131303789 112.293439921 - 70.191982039 112.075473768 - 70.158675106 111.815715505 -} -851ea833fffffff -{ - 44.152237130 16.293875975 - 44.062519260 16.296267493 - 44.021272806 16.409261660 - 44.069708418 16.520030524 - 44.159451075 16.517878293 - 44.200733491 16.404717798 -} -85162a1bfffffff -{ - 56.240653924 166.082832172 - 56.154558921 166.079958729 - 56.112620198 166.219759393 - 56.156531785 166.362783706 - 56.242598037 166.366443323 - 56.284782088 166.226292694 -} -8504b5affffffff -{ - 67.914005432 134.176988632 - 67.830608000 134.304232203 - 67.829364524 134.559756680 - 67.911526824 134.689952974 - 67.995259344 134.563672441 - 67.996494457 134.306222782 -} -85a20cb7fffffff -{ - -19.487997887 52.173985288 - -19.579397877 52.179079119 - -19.618126418 52.262331332 - -19.565351662 52.340479487 - -19.473883650 52.335257888 - -19.435258357 52.252015970 -} -8505091bfffffff -{ - 80.411000540 131.735439887 - 80.329485223 132.042579414 - 80.332772859 132.618417942 - 80.417638706 132.896865213 - 80.499887343 132.594026191 - 80.496536017 132.008326084 -} -85d253b7fffffff -{ - -39.179120069 -111.735564113 - -39.118643204 -111.638471778 - -39.023908272 -111.657546639 - -38.989615665 -111.773388404 - -39.049949664 -111.870395011 - -39.144718903 -111.851645881 -} -85f18337fffffff -{ - -76.274258288 101.638396395 - -76.198185655 101.425397974 - -76.201700359 101.032591275 - -76.281325076 100.848718443 - -76.357825971 101.059947816 - -76.354273567 101.456849601 -} -850061d3fffffff -{ - 80.751678836 -9.820903899 - 80.833192638 -9.772333005 - 80.883242010 -10.230774251 - 80.851009865 -10.734797547 - 80.769383541 -10.774430425 - 80.720095567 -10.319005587 -} -85f0c4cffffffff -{ - -73.480939615 60.227337967 - -73.390696003 60.252600310 - -73.336089210 60.006002178 - -73.371373470 59.733570986 - -73.461474893 59.705722030 - -73.516435720 59.952883458 -} -8514d44bfffffff -{ - 49.363668755 134.918289273 - 49.293897814 134.983642992 - 49.290774315 135.117796521 - 49.357420728 135.187123542 - 49.427387145 135.122044157 - 49.430511676 134.987362007 -} -85ae6e67fffffff -{ - -20.845412883 102.206752070 - -20.924543801 102.241489952 - -20.936363048 102.322688398 - -20.869138953 102.369029458 - -20.790122419 102.334295647 - -20.778215679 102.253216580 -} -8520a357fffffff -{ - 39.373785448 69.464362707 - 39.289257617 69.524172517 - 39.286481705 69.649108540 - 39.368232313 69.714574944 - 39.452888509 69.654944370 - 39.455665741 69.529667394 -} -85f2942ffffffff -{ - -88.551478343 159.539046554 - -88.631515059 157.756822596 - -88.706781644 159.896905054 - -88.696737187 163.997891518 - -88.612442333 165.489755510 - -88.542365097 163.203829633 -} -8510652ffffffff -{ - 68.250609210 52.758923834 - 68.192157341 52.911597142 - 68.214333070 53.141281004 - 68.295070681 53.219364947 - 68.353728580 53.066629878 - 68.331442304 52.835868950 -} -85cf50d3fffffff -{ - -48.948560681 -83.254277449 - -48.868053732 -83.186350228 - -48.787301526 -83.253598281 - -48.786898987 -83.388650459 - -48.867324830 -83.456890541 - -48.948234430 -83.389766622 -} -8599005bfffffff -{ - -7.292249698 -9.518260876 - -7.364525677 -9.547069939 - -7.423273200 -9.490128765 - -7.409638424 -9.404362468 - -7.337297704 -9.375658173 - -7.278656423 -9.432615241 -} -850ab3bbfffffff -{ - 56.666343280 97.575244940 - 56.575444571 97.596629328 - 56.537378098 97.743643479 - 56.590058512 97.869591368 - 56.680920840 97.848836480 - 56.719139484 97.701504113 -} -8592a353fffffff -{ - -11.565078947 -110.985782503 - -11.629899116 -111.038521963 - -11.712627228 -111.013529735 - -11.730607951 -110.935708851 - -11.665759636 -110.882880773 - -11.582958739 -110.907962199 -} -854d0c03fffffff -{ - 26.181350793 -62.405099023 - 26.105873502 -62.422771411 - 26.044384861 -62.364313462 - 26.058281649 -62.288089990 - 26.133795552 -62.270252609 - 26.195376156 -62.328803706 -} -850c4467fffffff -{ - 60.765414953 -146.820153232 - 60.705945690 -146.948182517 - 60.629884158 -146.912260722 - 60.613212763 -146.749155180 - 60.672408816 -146.621246709 - 60.748548835 -146.656321185 -} -85d7a5abfffffff -{ - -54.945308237 43.120184523 - -54.868025950 43.169824399 - -54.812943860 43.089715372 - -54.834969503 42.960169876 - -54.912062090 42.910185409 - -54.967318701 42.990089551 -} -85cdb653fffffff -{ - -39.344805148 97.788424005 - -39.271806175 97.730837286 - -39.272299953 97.613742053 - -39.345780419 97.553872258 - -39.418934168 97.611263026 - -39.418452707 97.728720343 -} -8587611bfffffff -{ - -17.755098864 82.955856628 - -17.846384400 82.983339173 - -17.870865080 83.078932414 - -17.804066393 83.146909763 - -17.712862214 83.119347444 - -17.688375338 83.023887350 -} -85db9e77fffffff -{ - -46.224139112 177.548310635 - -46.146888813 177.491113827 - -46.147698236 177.367198087 - -46.225827973 177.300174727 - -46.303180829 177.357307021 - -46.302301345 177.481527800 -} -85acea57fffffff -{ - -18.575090758 6.319796830 - -18.658836023 6.303634738 - -18.719293196 6.374462976 - -18.695901972 6.461374880 - -18.612164073 6.477372268 - -18.551809891 6.406622498 -} -850fad73fffffff -{ - 66.454178458 -79.000034097 - 66.397321166 -79.195943725 - 66.301470295 -79.170176259 - 66.262410782 -78.949997549 - 66.318986157 -78.754553030 - 66.414901961 -78.778819879 -} -85c7690bfffffff -{ - -35.765188136 -148.637503503 - -35.673206592 -148.605824070 - -35.606181055 -148.687560154 - -35.631073509 -148.801017276 - -35.723051286 -148.832890747 - -35.790140481 -148.751113302 -} -8500d8a7fffffff -{ - 85.197017766 110.027936995 - 85.141552208 110.923924004 - 85.178836900 111.962472372 - 85.272704484 112.131222798 - 85.329688808 111.224135542 - 85.291261205 110.159097845 -} -85ef057bfffffff -{ - -82.831867580 -53.114735461 - -82.782598083 -52.461156941 - -82.686954756 -52.486299901 - -82.640544796 -53.148066070 - -82.688884408 -53.793497790 - -82.784551772 -53.785319023 -} -858c5a87fffffff -{ - -7.858408046 96.703524811 - -7.772941664 96.679709880 - -7.749866317 96.589294664 - -7.812288157 96.522732719 - -7.897727639 96.546588393 - -7.920772246 96.636965364 -} -8557769bfffffff -{ - 21.888574583 -30.401580183 - 21.811614946 -30.457066444 - 21.728566543 -30.410707575 - 21.722377145 -30.308953184 - 21.799240379 -30.253378847 - 21.882389413 -30.299646659 -} -85dadd1bfffffff -{ - -46.368658467 157.063536161 - -46.278977630 157.026952092 - -46.256128027 156.893673528 - -46.322924907 156.796686871 - -46.412659158 156.833000640 - -46.435543256 156.966571958 -} -85d320cbfffffff -{ - -56.454575600 -116.035460724 - -56.400930914 -115.895717960 - -56.307151293 -115.912906397 - -56.267008390 -116.069191841 - -56.320511268 -116.208672991 - -56.414298449 -116.192130684 -} -85ee69cbfffffff -{ - -67.124116015 -60.381068765 - -67.083721885 -60.158566702 - -66.989680966 -60.134885177 - -66.936135350 -60.331997811 - -66.976275087 -60.553302558 - -67.070213619 -60.578689125 -} -8574b253fffffff -{ - 0.644261786 -12.587145688 - 0.716073679 -12.551942473 - 0.790007231 -12.590373986 - 0.792199531 -12.664082697 - 0.720353624 -12.699372306 - 0.646349397 -12.660866815 -} -8592a98ffffffff -{ - -13.669400186 -108.253445074 - -13.735154047 -108.308340129 - -13.819718523 -108.281231880 - -13.838599129 -108.199137414 - -13.772821797 -108.144156764 - -13.688187326 -108.171356160 -} -85f25aaffffffff -{ - -74.888968289 -106.517973475 - -74.919370295 -106.197262443 - -74.859424164 -105.926208834 - -74.769550815 -105.976802133 - -74.739538335 -106.294905029 - -74.799012125 -106.565012795 -} -850568cbfffffff -{ - 84.835753644 174.536237175 - 84.742445603 174.369265435 - 84.680827830 175.164312431 - 84.711102806 176.131254828 - 84.803879517 176.328153498 - 84.866931802 175.528546111 -} -85008167fffffff -{ - 78.417651338 76.817924325 - 78.409894265 77.271681849 - 78.486537249 77.524643741 - 78.571506513 77.321194470 - 78.579276163 76.860967270 - 78.502063521 76.610719143 -} -8500d9b7fffffff +850f9d2bfffffff { - 86.112708941 117.702941193 - 86.047987049 118.690256457 - 86.072967916 120.027942047 - 86.163624927 120.427590450 - 86.230312891 119.439531748 - 86.204348032 118.051426268 -} -85de5e33fffffff -{ - -48.349207147 -54.986445757 - -48.308470560 -54.874196170 - -48.232141302 -54.873211444 - -48.196563918 -54.983988593 - -48.237120622 -55.095976657 - -48.313434167 -55.097449016 -} -85eb5977fffffff -{ - -69.473681927 -168.092062337 - -69.543138929 -168.073166225 - -69.565885772 -167.864283401 - -69.518889761 -167.675368039 - -69.449475469 -167.695833589 - -69.427013312 -167.903647328 -} -85961097fffffff -{ - -11.936941318 31.591029772 - -11.839713507 31.595149008 - -11.787504566 31.511244775 - -11.832495277 31.423181005 - -11.929732051 31.418992498 - -11.981969232 31.502937020 -} -851740cbfffffff -{ - 61.780437113 170.409906523 - 61.689823910 170.391999506 - 61.639565624 170.552198469 - 61.679620679 170.730653314 - 61.770150787 170.749677977 - 61.820709759 170.589131568 -} -850505dbfffffff -{ - 79.176965088 107.259777978 - 79.123416724 107.677921285 - 79.165196722 108.133036219 - 79.261102696 108.174598804 - 79.315295382 107.753385204 - 79.272932357 107.293665802 -} -852382a7fffffff -{ - 43.581745947 -157.631219904 - 43.660930621 -157.590717504 - 43.731084325 -157.656505784 - 43.722012906 -157.762988737 - 43.642708514 -157.803407388 - 43.572595309 -157.737427319 -} -85dc844ffffffff -{ - -51.177577452 -5.542813825 - -51.263683411 -5.586274129 - -51.327711909 -5.484913389 - -51.305542281 -5.340107309 - -51.219399468 -5.296987145 - -51.155462969 -5.398332227 -} -8503260bfffffff -{ - 89.556994214 122.191964293 - 89.486014556 129.141378975 - 89.486607482 139.664535180 - 89.557956423 146.767953791 - 89.643742146 142.153644237 - 89.643401505 126.975075803 -} -852c94cbfffffff -{ - 29.248404466 45.066822149 - 29.158678753 45.044546287 - 29.096366542 45.117251292 - 29.123706578 45.212152921 - 29.213326477 45.234531276 - 29.275712154 45.161905769 -} -85cad187fffffff -{ - -47.702543804 59.966740417 - -47.784127077 59.981517494 - -47.822241247 60.100032785 - -47.778723312 60.203685319 - -47.697119198 60.188678298 - -47.659053722 60.070248660 -} -85f2441bfffffff -{ - -73.750818364 -122.991490762 - -73.800735698 -122.748239452 - -73.763166283 -122.456261266 - -73.675953837 -122.409799260 - -73.626502494 -122.652407697 - -73.663799433 -122.942129773 -} -85104e3bfffffff -{ - 65.825612594 62.627921831 - 65.755506898 62.750221447 - 65.763744365 62.971313691 - 65.842131057 63.071166383 - 65.912426861 62.949195303 - 65.904145670 62.727038866 -} -85a94873fffffff -{ - -24.562072794 -58.712272086 - -24.496876792 -58.662598658 - -24.419580364 -58.705396791 - -24.407535451 -58.797792388 - -24.472738168 -58.847405313 - -24.549979103 -58.804683231 -} -85401893fffffff -{ - 28.900998841 108.281660935 - 28.985660157 108.259473192 - 29.016773765 108.163063548 - 28.963200471 108.088851131 - 28.878497297 108.111116159 - 28.847409224 108.207516385 -} -85f21817fffffff -{ - -80.903674406 -130.282584639 - -80.966653766 -129.891883882 - -80.940422769 -129.339988889 - -80.851534865 -129.187657284 - -80.789354357 -129.578686157 - -80.815267267 -130.121803822 -} -8540622ffffffff -{ - 23.910475600 102.000092483 - 23.999673466 101.975640843 - 24.027278906 101.877218442 - 23.965669154 101.803277730 - 23.876448491 101.827792560 - 23.848860319 101.926185014 -} -858fb193fffffff -{ - -2.449940133 -91.035735294 - -2.525960209 -91.094175319 - -2.613470228 -91.058260825 - -2.624954241 -90.963848585 - -2.548885030 -90.905388049 - -2.461380984 -90.941360144 -} -85199203fffffff -{ - 57.084535439 -28.916732351 - 57.014711280 -29.008509655 - 56.940906048 -28.935670290 - 56.936840398 -28.771313509 - 57.006573928 -28.679332149 - 57.080463698 -28.751910298 -} -85123143fffffff -{ - 60.332649866 -122.580800635 - 60.246973029 -122.622645182 - 60.181381961 -122.500599476 - 60.201242486 -122.336565040 - 60.286883129 -122.293895288 - 60.352699963 -122.416083624 -} -85b3b6d3fffffff -{ - -19.032601821 -81.022713945 - -19.109678337 -81.082591391 - -19.196102081 -81.041466577 - -19.205437558 -80.940439265 - -19.128361163 -80.880592667 - -19.041949196 -80.921742367 -} -8500e683fffffff -{ - 82.615020449 49.320629026 - 82.650455359 49.955715941 - 82.741670636 50.021986863 - 82.797562309 49.437795209 - 82.761317809 48.792655463 - 82.670001767 48.741818593 -} -85ab9e63fffffff -{ - -29.324288865 62.694163634 - -29.419395865 62.708868714 - -29.456692543 62.810013951 - -29.398816171 62.896378045 - -29.303685952 62.881513410 - -29.266455220 62.780444180 -} -85ecde73fffffff -{ - -68.170446210 120.750222176 - -68.109887050 120.557086939 - -68.142821038 120.317232177 - -68.236536096 120.269240765 - -68.297391856 120.462779787 - -68.264234890 120.703910101 -} -8567ad5bfffffff -{ - 14.027918527 -77.809448987 - 13.964210880 -77.862273695 - 13.888880531 -77.824697268 - 13.877313759 -77.734286931 - 13.941072538 -77.681500615 - 14.016346948 -77.719086125 -} -858a7497fffffff -{ - -7.176415902 -67.740670600 - -7.253376116 -67.791133163 - -7.337844733 -67.750987861 - -7.345284858 -67.660407079 - -7.268323924 -67.610026689 - -7.183923564 -67.650144803 -} -8503a257fffffff -{ - 81.171856053 -161.904556338 - 81.091547252 -162.230110462 - 81.006893589 -161.953339912 - 81.001903352 -161.357675773 - 81.081424737 -161.027959608 - 81.166722071 -161.297937751 -} -858a7253fffffff -{ - -5.232477801 -66.002853704 - -5.308035022 -66.051691705 - -5.391613252 -66.012053416 - -5.399559329 -65.923609371 - -5.323999464 -65.874857100 - -5.240496136 -65.914463052 -} -852b44cffffffff -{ - 40.673798038 -59.475345643 - 40.641998360 -59.586304385 - 40.558632232 -59.608720769 - 40.507161239 -59.520509074 - 40.538868467 -59.409860281 - 40.622138916 -59.387113765 -} -854a616bfffffff -{ - 27.645752918 138.696201963 - 27.564270219 138.712478185 - 27.534581178 138.807075320 - 27.586389106 138.885411574 - 27.667861894 138.869159915 - 27.697536740 138.774547365 -} -85e9012ffffffff -{ - -65.694640446 -106.359209713 - -65.635417606 -106.195541470 - -65.551188880 -106.244482848 - -65.526092716 -106.456132670 - -65.585115401 -106.619736456 - -65.669433901 -106.571757595 -} -85ef248bfffffff -{ - -85.650662541 -83.865937207 - -85.649977762 -82.636407667 - -85.566944068 -82.072243657 - -85.486022387 -82.713703166 - -85.486671384 -83.898960795 - -85.568276930 -84.485952049 -} -85033013fffffff -{ - 87.778895341 -179.358242138 - 87.689346507 -179.971445955 - 87.620988517 -178.363794562 - 87.638990680 -176.153339955 - 87.726688399 -175.406654614 - 87.798304601 -176.997680163 -} -85665e8bfffffff -{ - 2.900688319 -70.591076726 - 2.828871797 -70.641913708 - 2.745585704 -70.602753934 - 2.734190834 -70.512773341 - 2.806037878 -70.462005081 - 2.889249297 -70.501148584 -} -85940e57fffffff -{ - -12.361561179 126.004505137 - -12.448322934 126.020796789 - -12.482929681 126.106799020 - -12.430771414 126.176559174 - -12.343953142 126.160268497 - -12.309349616 126.074216628 -} -858a03abfffffff -{ - -6.516030255 -63.050890745 - -6.591141699 -63.097522191 - -6.673031337 -63.058335912 - -6.679732567 -62.972559161 - -6.642173209 -62.949283413 - -6.604214782 -62.926064846 - -6.522814845 -62.965165611 -} -85ec302bfffffff -{ - -67.368540927 152.199630033 - -67.350168268 151.985964058 - -67.417387401 151.842797072 - -67.503229455 151.913697048 - -67.521615727 152.128790580 - -67.454146091 152.271550507 -} -85054113fffffff -{ - 83.061515756 165.938452081 - 82.965996835 165.926596977 - 82.915572402 166.594152023 - 82.959689211 167.281491809 - 83.055124093 167.311574547 - 83.106539136 166.636122728 -} -856b640bfffffff -{ - 17.595794719 29.744437433 - 17.502477529 29.735242920 - 17.449928578 29.816236549 - 17.490599579 29.906445866 - 17.583873234 29.915775123 - 17.636519529 29.834760426 -} -852129cbfffffff -{ - 53.378607855 62.773075784 - 53.299557010 62.861285138 - 53.306275390 63.021180221 - 53.392090025 63.093420386 - 53.471291530 63.005384217 - 53.464527630 62.844933139 -} -850a0ea3fffffff -{ - 65.929409709 92.329149054 - 65.895799242 92.538015374 - 65.950372084 92.705294911 - 66.038899708 92.663872908 - 66.072684733 92.453796647 - 66.017766735 92.286356260 -} -85032e1bfffffff -{ - 87.643741308 -64.454248040 - 87.700375412 -66.166005995 - 87.665321679 -68.299868338 - 87.575734211 -68.610616347 - 87.522206741 -66.929014814 - 87.555250566 -64.903573508 + 64.173055655 -90.425434350 + 64.103170351 -90.578382759 + 64.010523490 -90.517637387 + 63.987591106 -90.304991278 + 64.057205252 -90.151922732 + 64.150022415 -90.211616144 +} +85e4c81bfffffff +{ + -56.113324737 84.479336622 + -56.022941231 84.427707006 + -56.003972089 84.262374673 + -56.075252159 84.147997133 + -56.165732936 84.198955451 + -56.184836782 84.364964422 } -85160037fffffff +850f819bfffffff { - 55.232572012 164.539467330 - 55.317880299 164.537012597 - 55.357414363 164.397411557 - 55.311564053 164.260535527 - 55.226272193 164.263428770 - 55.186813951 164.402759715 + 66.523005444 -86.696374538 + 66.457139922 -86.873684415 + 66.363511326 -86.820323136 + 66.335601872 -86.591007336 + 66.401172826 -86.413755129 + 66.494947020 -86.465756389 } -85460337fffffff +85bf410bfffffff { - 24.234585387 -168.394666312 - 24.146100639 -168.419090960 - 24.085966976 -168.350758687 - 24.114315124 -168.257918609 - 24.202858269 -168.233392453 - 24.262994895 -168.301807840 + -42.338073430 149.739446807 + -42.244282460 149.714084935 + -42.212722269 149.591141603 + -42.274884769 149.493347870 + -42.368693243 149.518431235 + -42.400321883 149.641587151 } -85c8e25bfffffff +85056293fffffff { - -37.489954162 103.753132755 - -37.421813489 103.688924022 - -37.428096297 103.576322583 - -37.502549504 103.527598536 - -37.570859539 103.591688494 - -37.564546931 103.704621975 + 84.966930973 137.903199469 + 84.882216162 138.379037467 + 84.874920956 139.450195894 + 84.952099311 140.079181102 + 85.037997568 139.625331175 + 85.045539942 138.519775593 +} +85f14947fffffff +{ + -81.577411894 17.494657116 + -81.483625969 17.381814494 + -81.451145514 16.790720797 + -81.511927028 16.302946271 + -81.606058939 16.404337479 + -81.639070594 17.005038524 +} +85c7123bfffffff +{ + -47.027908922 -137.473379014 + -46.996055509 -137.353913012 + -46.905723269 -137.330756119 + -46.847372447 -137.426739273 + -46.879207728 -137.545829718 + -46.969411862 -137.569311814 +} +85f2d55bfffffff +{ + -82.395373652 -94.855827594 + -82.411639939 -94.166141547 + -82.338138503 -93.724509926 + -82.249331383 -93.970132887 + -82.233442882 -94.646059690 + -82.305989263 -95.089946275 +} +85f170dbfffffff +{ + -86.896038054 81.141360252 + -86.868510453 79.530151460 + -86.929342576 78.312697858 + -87.020045535 78.700462138 + -87.048752735 80.388040703 + -86.985531437 81.609404701 +} +8536144ffffffff +{ + 33.712445689 -151.602678101 + 33.631266140 -151.637813096 + 33.567158435 -151.565390473 + 33.584228642 -151.457840097 + 33.665408713 -151.422636902 + 33.729518110 -151.495052092 +} +853ab293fffffff +{ + 27.270294877 -59.092697080 + 27.192228693 -59.115053090 + 27.127567409 -59.055082899 + 27.140873076 -58.972671903 + 27.218966837 -58.950137731 + 27.283727467 -59.010192688 +} +85f14a8bfffffff +{ + -82.478778526 28.332338346 + -82.390293576 28.079246565 + -82.374774619 27.392204825 + -82.447489892 26.943859314 + -82.536664160 27.185754313 + -82.552438296 27.887388663 +} +85e7747bfffffff +{ + -72.421877359 26.405645301 + -72.333856364 26.306375919 + -72.312770513 26.012155503 + -72.379593454 25.814601240 + -72.467931706 25.911727084 + -72.489130652 26.208565474 +} +859ef527fffffff +{ + -12.910520177 162.914068271 + -12.830260299 162.884748298 + -12.809848297 162.795196243 + -12.869672981 162.734820679 + -12.950018699 162.764041238 + -12.970453939 162.853736986 +} +85b565b7fffffff +{ + -37.212702660 -167.031484070 + -37.127902382 -166.982646384 + -37.050025039 -167.051253791 + -37.056904587 -167.168578313 + -37.141633080 -167.217505903 + -37.219553823 -167.149019490 +} +854a2353fffffff +{ + 25.611749627 129.372952800 + 25.529849628 129.390080323 + 25.505561048 129.482784390 + 25.563210052 129.558407209 + 25.645126258 129.541287062 + 25.669377327 129.448536641 +} +8573537bfffffff +{ + 8.530433518 139.556952490 + 8.434684877 139.572641291 + 8.400049831 139.664449547 + 8.461156280 139.740580551 + 8.556897622 139.724916296 + 8.591539878 139.633096425 +} +85de76affffffff +{ + -52.516313298 -57.956722956 + -52.476574985 -57.826962502 + -52.395162462 -57.818590430 + -52.353533167 -57.939365649 + -52.393087967 -58.068742044 + -52.474455073 -58.077726894 +} +85ef2007fffffff +{ + -84.601320063 -70.445400192 + -84.578802070 -69.475641290 + -84.487363359 -69.224909418 + -84.419168269 -69.918952822 + -84.441053824 -70.862745502 + -84.531753405 -71.138023712 +} +850d744bfffffff +{ + 70.578258988 -144.356188742 + 70.517500686 -144.561902714 + 70.430921015 -144.517548877 + 70.405020946 -144.269569112 + 70.465396959 -144.064330808 + 70.552053864 -144.106591339 +} +85478177fffffff +{ + 26.063864991 -175.992241236 + 26.155639012 -175.973864393 + 26.213201445 -176.051972399 + 26.178874604 -176.148480785 + 26.087013321 -176.166700200 + 26.029566068 -176.088568909 +} +859c9caffffffff +{ + -6.211688859 147.442630810 + -6.302957989 147.456578965 + -6.334099127 147.543762465 + -6.274026449 147.616983369 + -6.182786087 147.603068841 + -6.151589571 147.515899741 +} +85ad1d4ffffffff +{ + -29.989351092 13.465436726 + -30.078862054 13.455747155 + -30.134537440 13.536292643 + -30.100634818 13.626385985 + -30.011185263 13.635872546 + -29.955576819 13.555468704 +} +854b23dbfffffff +{ + 30.627656913 123.819031231 + 30.554105604 123.836414713 + 30.536989265 123.926712289 + 30.593468699 123.999688006 + 30.667039789 123.982301633 + 30.684111731 123.891942362 +} +85f110d7fffffff +{ + -80.819292657 120.719528340 + -80.766684897 120.292962033 + -80.798687191 119.761079052 + -80.883734894 119.649451184 + -80.937012260 120.077911559 + -80.904567360 120.616147238 +} +85b21377fffffff +{ + -28.560748411 -74.222128588 + -28.634303469 -74.280767448 + -28.710475997 -74.237382743 + -28.713080976 -74.135363320 + -28.639547913 -74.076792880 + -28.563387903 -74.120173276 +} +85444cb3fffffff +{ + 32.024287968 -93.929554815 + 32.095041732 -93.860823584 + 32.183505911 -93.899041528 + 32.201229746 -94.006156384 + 32.130419153 -94.074929670 + 32.041941618 -94.036546244 +} +850d6a93fffffff +{ + 66.776439452 -136.430177302 + 66.726572552 -136.615404399 + 66.643688576 -136.609947544 + 66.610701526 -136.420722598 + 66.660289456 -136.236187567 + 66.743142336 -136.240185131 +} +857a488bfffffff +{ + 1.150968980 35.138700955 + 1.241726966 35.141240812 + 1.291339374 35.061706460 + 1.250238698 34.979581148 + 1.159460335 34.976978939 + 1.109802939 35.056564400 +} +85d3125bfffffff +{ + -54.247915191 -104.832073138 + -54.181460971 -104.713159366 + -54.088899584 -104.752371111 + -54.062710342 -104.909985560 + -54.129009148 -105.028897305 + -54.221652334 -104.990197834 +} +85efb357fffffff +{ + -78.529609506 11.489435590 + -78.434141813 11.454432385 + -78.391959691 11.033434530 + -78.444758372 10.643160432 + -78.540365858 10.671537732 + -78.583039445 11.096831105 +} +85ec6b53fffffff +{ + -79.464588095 141.035556555 + -79.437707609 140.599894298 + -79.496389954 140.226889636 + -79.582492251 140.288771529 + -79.609704157 140.729689526 + -79.550478994 141.103434921 +} +8509766bfffffff +{ + 68.400872197 1.566315224 + 68.446985391 1.422289620 + 68.413127998 1.235332135 + 68.333237809 1.193519180 + 68.287392838 1.337502802 + 68.321170263 1.523345105 +} +850d3007fffffff +{ + 74.419425807 -162.027019496 + 74.338802273 -162.212024813 + 74.256286324 -162.053674972 + 74.254022322 -161.712481094 + 74.334173071 -161.526093967 + 74.417060004 -161.682257996 +} +85b32d5bfffffff +{ + -18.053871504 -66.772589155 + -18.132182413 -66.824100653 + -18.212583602 -66.782663006 + -18.214629431 -66.689746289 + -18.136345473 -66.638325792 + -18.055988745 -66.679730902 +} +855c8e3bfffffff +{ + 6.115537417 -155.709908685 + 6.024759332 -155.739334439 + 5.953359342 -155.674380913 + 5.972685599 -155.579986038 + 6.063452136 -155.550494694 + 6.134904024 -155.615463698 +} +85029147fffffff +{ + 71.555555567 -135.087025989 + 71.506459563 -135.326847083 + 71.419126823 -135.326280657 + 71.380944504 -135.088269992 + 71.429708708 -134.849672128 + 71.516985348 -134.847862044 +} +85812e03fffffff +{ + -13.932200999 -44.238383513 + -13.851471377 -44.187028984 + -13.767999677 -44.234564650 + -13.765271886 -44.333432616 + -13.846005853 -44.384787616 + -13.929463262 -44.337274329 +} +85089033fffffff +{ + 58.207027389 19.373794492 + 58.133955194 19.372673008 + 58.098908018 19.510177177 + 58.136866696 19.649012199 + 58.209943427 19.650499115 + 58.245057150 19.512785518 +} +853e6977fffffff +{ + 28.849845709 36.519518263 + 28.755529581 36.503609487 + 28.696054241 36.586777353 + 28.730811742 36.685829584 + 28.825052024 36.701880884 + 28.884610721 36.618737650 +} +85c9a983fffffff +{ + -38.887815364 116.208767275 + -38.826908468 116.127226666 + -38.845238368 116.017024711 + -38.924585668 115.988075450 + -38.985675133 116.069643216 + -38.967234476 116.180133562 +} +85ee1633fffffff +{ + -75.090743315 -19.752679781 + -75.003640282 -19.585672539 + -74.922631371 -19.792685769 + -74.928228704 -20.165169124 + -75.014915266 -20.334699054 + -75.096421589 -20.129253060 +} +8509657bfffffff +{ + 72.556277533 2.599839908 + 72.623971353 2.681866306 + 72.681932495 2.493272744 + 72.671774983 2.222402784 + 72.603858067 2.142233555 + 72.546320666 2.331066812 +} +85058bcffffffff +{ + 70.912376608 132.420365541 + 70.829675668 132.574759454 + 70.831402168 132.869651705 + 70.915864707 133.012700804 + 70.998956031 132.859457007 + 70.997194240 132.561998947 +} +85ad848bfffffff +{ + -27.880699425 20.073704718 + -27.791009817 20.082844267 + -27.736231532 19.997499710 + -27.771128295 19.903035768 + -27.860782753 19.893829088 + -27.915575676 19.979153396 +} +85138337fffffff +{ + 59.853301150 -131.543743287 + 59.768787854 -131.557929021 + 59.713630060 -131.428075214 + 59.742806460 -131.283671202 + 59.827362778 -131.268685614 + 59.882700176 -131.398903703 +} +85b0e60ffffffff +{ + -22.481764515 -114.998254287 + -22.431180538 -114.921074556 + -22.350708611 -114.931841715 + -22.320802401 -115.019589202 + -22.371258607 -115.096694865 + -22.451748606 -115.086127191 +} +85164633fffffff +{ + 54.952606757 175.856844055 + 55.037480113 175.872231921 + 55.089590838 175.743403688 + 55.056731428 175.599273833 + 54.971822287 175.584301558 + 54.919808098 175.713043057 +} +8518adc3fffffff +{ + 51.254451938 -17.438371304 + 51.188669353 -17.533445127 + 51.103847760 -17.483872840 + 51.084773653 -17.339556554 + 51.150465719 -17.244486702 + 51.235322265 -17.293728442 +} +85ded637fffffff +{ + -49.797203850 -42.692827486 + -49.743509140 -42.590657637 + -49.665834957 -42.617678269 + -49.641771829 -42.746368402 + -49.695240352 -42.848464247 + -49.772997791 -42.821944763 +} +8574d8cbfffffff +{ + -5.321494768 -4.371097706 + -5.390940212 -4.394868018 + -5.446784500 -4.336507963 + -5.433079598 -4.254388203 + -5.363587115 -4.230731088 + -5.307846471 -4.289080416 +} +85aeec37fffffff +{ + -26.627103097 101.720808613 + -26.706086799 101.757326208 + -26.714360660 101.843464029 + -26.643744077 101.892950146 + -26.564865647 101.856434973 + -26.556498591 101.770431111 +} +8549a90ffffffff +{ + 20.242624407 -105.166398461 + 20.322520810 -105.107705771 + 20.409846113 -105.152077611 + 20.417226572 -105.255238088 + 20.337256716 -105.313896090 + 20.249979891 -105.269428546 +} +8526c63bfffffff +{ + 36.272848135 -99.696031439 + 36.345427186 -99.626219748 + 36.431632076 -99.671900746 + 36.445249658 -99.787549633 + 36.372619606 -99.857361188 + 36.286423028 -99.811524301 +} +85d0adc7fffffff +{ + -49.292712197 10.050187435 + -49.381342330 10.032126707 + -49.430907586 10.137717956 + -49.391787218 10.261157403 + -49.303201006 10.278860089 + -49.253691062 10.173481345 +} +85e45e57fffffff +{ + -60.906800126 86.558446624 + -60.815900469 86.492690301 + -60.798384623 86.300066923 + -60.871641824 86.172266325 + -60.962668139 86.237167631 + -60.980311057 86.430727620 +} +852d4587fffffff +{ + 48.343058182 39.958762068 + 48.284891845 40.057475437 + 48.315958585 40.176393708 + 48.405346786 40.196821205 + 48.463624572 40.097906601 + 48.432402478 39.978765661 +} +85002b0ffffffff +{ + 80.736888406 23.776076992 + 80.800899394 24.120523758 + 80.883915294 23.918440198 + 80.902334471 23.364757343 + 80.837549391 23.022229679 + 80.755121933 23.231371239 +} +853362d3fffffff +{ + 25.301383212 166.343063349 + 25.396160815 166.343340757 + 25.444315534 166.251403899 + 25.397601803 166.159296807 + 25.302835170 166.159213982 + 25.254771141 166.251043687 +} +85338a63fffffff +{ + 36.732931637 176.686610645 + 36.829164931 176.699307540 + 36.886394297 176.601966704 + 36.847290067 176.491970545 + 36.751007796 176.479512191 + 36.693878581 176.576811217 +} +85334eb7fffffff +{ + 28.125105425 162.003308950 + 28.220668919 161.998879537 + 28.266054231 161.902593379 + 28.215804092 161.810879158 + 28.120278037 161.815510521 + 28.074964537 161.911654260 +} +8552e443fffffff +{ + 15.789207050 45.241263386 + 15.703487914 45.221583169 + 15.650013140 45.285277792 + 15.682159201 45.368590701 + 15.767773967 45.388349415 + 15.821347035 45.324716899 +} +85c1ab4ffffffff +{ + -32.049357312 -16.749138504 + -32.138411562 -16.794470124 + -32.215974487 -16.726417705 + -32.204392071 -16.612941831 + -32.115246843 -16.567744978 + -32.037774979 -16.635888794 +} +856c4a73fffffff +{ + -0.044187981 -88.983888603 + -0.119840821 -89.041876059 + -0.206388637 -89.005401553 + -0.217266451 -88.910889041 + -0.141562203 -88.852890971 + -0.055031591 -88.889415902 +} +85ac82d3fffffff +{ + -18.717811733 17.042564404 + -18.623774567 17.052400978 + -18.567062381 16.972684407 + -18.604352241 16.883164969 + -18.698332110 16.873271928 + -18.755079467 16.952954708 +} +8585a6d3fffffff +{ + -3.826472958 54.251918014 + -3.740658536 54.247495953 + -3.695992347 54.176587809 + -3.737148070 54.110002754 + -3.823056497 54.114381635 + -3.867715183 54.185388814 +} +8586624bfffffff +{ + -10.242643692 78.681706213 + -10.331338326 78.705294697 + -10.358219704 78.796645270 + -10.296382733 78.864295442 + -10.207753551 78.840620493 + -10.180895831 78.749381680 +} +85421a6ffffffff +{ + 22.884080977 65.538310349 + 22.812816978 65.588648770 + 22.812231027 65.685181103 + 22.882927376 65.731578135 + 22.954319965 65.681320990 + 22.954887576 65.584585188 +} +850082b3fffffff +{ + 76.715375688 77.022774033 + 76.706725300 77.417878075 + 76.782363394 77.638850367 + 76.867151943 77.462731080 + 76.875810731 77.062732605 + 76.799672226 76.843787396 +} +852900d7fffffff +{ + 32.005549999 -123.926147405 + 32.090017061 -123.877975936 + 32.166339335 -123.936955666 + 32.158127653 -124.044094138 + 32.073662498 -124.092109560 + 31.997407076 -124.033142801 +} +8508c31bfffffff +{ + 66.450384126 25.671217962 + 66.420660358 25.832867075 + 66.472011213 25.983750069 + 66.553247276 25.973063581 + 66.583019980 25.810590958 + 66.531507329 25.659630532 +} +85ea99b3fffffff +{ + -64.620631416 173.874083272 + -64.627881164 173.706040913 + -64.701504886 173.653034094 + -64.767947765 173.768930141 + -64.760522403 173.937846025 + -64.686830286 173.989989707 +} +85062197fffffff +{ + 68.508749891 -22.547623799 + 68.531750701 -22.761468062 + 68.468596243 -22.922019148 + 68.382708318 -22.868458057 + 68.359933770 -22.655808631 + 68.422821732 -22.495528979 +} +8504501bfffffff +{ + 73.774142578 167.231370150 + 73.677338721 167.218630427 + 73.625980129 167.508431942 + 73.670969995 167.812384503 + 73.767704748 167.828594690 + 73.819521236 167.537385720 +} +8554a083fffffff +{ + 16.898165674 -19.281906501 + 16.828296353 -19.342746911 + 16.746948731 -19.308675990 + 16.735409574 -19.213898159 + 16.805162950 -19.153047558 + 16.886571332 -19.186984762 +} +855ee46ffffffff +{ + 15.557837973 -56.097137776 + 15.632199252 -56.049471342 + 15.702297612 -56.091098801 + 15.698051627 -56.180331670 + 15.623754935 -56.227952465 + 15.553639684 -56.186386118 +} +8504514ffffffff +{ + 73.270008316 170.939971039 + 73.173871866 170.906726980 + 73.117832525 171.175326212 + 73.157467189 171.478101249 + 73.253472883 171.514526513 + 73.309976883 171.245003088 +} +85f111abfffffff +{ + -81.895911111 112.466494470 + -81.834900370 112.038861991 + -81.854349878 111.414696263 + -81.935130142 111.208436234 + -81.996921569 111.635282300 + -81.977147676 112.269278967 +} +85f10d9bfffffff +{ + -85.773618987 96.145180345 + -85.769632416 94.913659279 + -85.844793708 94.281119526 + -85.925451109 94.901869247 + -85.929372220 96.181288136 + -85.852701324 96.790845627 +} +85e4f193fffffff +{ + -56.727209127 94.024030294 + -56.640620281 93.946509215 + -56.634444871 93.771195126 + -56.714804508 93.672596965 + -56.801565384 93.749585329 + -56.807794765 93.925707217 +} +858d9473fffffff +{ + -5.052034003 114.930358834 + -4.969371792 114.913487118 + -4.949172883 114.832994848 + -5.011723326 114.769364568 + -5.094422645 114.786302412 + -5.114534476 114.866804421 +} +85da41b3fffffff +{ + -55.959999251 154.020966135 + -55.878031193 153.982733459 + -55.854095182 153.827669930 + -55.912073173 153.710465661 + -55.994085649 153.748299152 + -56.018075922 153.903736917 +} +855b6397fffffff +{ + 6.052722907 168.451157150 + 6.127773918 168.453186343 + 6.167274971 168.379662052 + 6.131632467 168.304169195 + 6.056578157 168.302267390 + 6.017169515 168.375731044 +} +85e31a67fffffff +{ + -64.311277566 -136.766004128 + -64.288754004 -136.583670356 + -64.205078510 -136.550294854 + -64.144044836 -136.698480168 + -64.166520576 -136.879949508 + -64.250077482 -136.914095372 +} +852b69c3fffffff +{ + 37.744064922 -56.923195275 + 37.659841843 -56.952199623 + 37.595198864 -56.883202802 + 37.614694086 -56.785102053 + 37.698956835 -56.755858628 + 37.763684790 -56.824954937 +} +85042a53fffffff +{ + 76.188465739 149.103334998 + 76.094543156 149.211286345 + 76.069546811 149.602748617 + 76.138183853 149.890420643 + 76.232391029 149.786671402 + 76.257679072 149.391020494 +} +85b06643fffffff +{ + -23.496368877 -122.737276947 + -23.449890286 -122.655957458 + -23.369230992 -122.657269148 + -23.335073891 -122.739699181 + -23.381444703 -122.820894844 + -23.462080213 -122.819784245 +} +85d0169bfffffff +{ + -46.940662605 7.355246811 + -47.031030519 7.333738677 + -47.085212331 7.435144832 + -47.048961241 7.557888027 + -46.958626570 7.579060485 + -46.904509573 7.477825506 +} +85bb7417fffffff +{ + -40.801498018 173.116023804 + -40.717696360 173.066243161 + -40.711126502 172.947717190 + -40.788411356 172.878698126 + -40.872320414 172.928381528 + -40.878837197 173.047181778 +} +85a126a7fffffff +{ + -29.697779219 -132.638727888 + -29.607849528 -132.625851299 + -29.552030861 -132.702927085 + -29.586101457 -132.793011942 + -29.676100950 -132.806064279 + -29.731960108 -132.728855953 +} +85550b83fffffff +{ + 21.008982100 -10.149108001 + 20.941880869 -10.216504907 + 20.857402232 -10.190888302 + 20.840010400 -10.098043480 + 20.906999409 -10.030696104 + 20.991492336 -10.056143892 +} +85830133fffffff +{ + -11.778460440 11.234050487 + -11.686129095 11.245358737 + -11.630849803 11.173144872 + -11.667846849 11.089678432 + -11.760094097 11.078328463 + -11.815428406 11.150486567 +} +8534f223fffffff +{ + 27.913605909 -29.712647653 + 27.833721505 -29.772650908 + 27.747648406 -29.723700294 + 27.741365055 -29.614854952 + 27.821157347 -29.554756098 + 27.907325092 -29.603597798 +} +85ce088bfffffff +{ + -43.195759146 -81.066559343 + -43.117033565 -81.009848128 + -43.037636812 -81.072217489 + -43.036806982 -81.191226510 + -43.115460279 -81.248204290 + -43.195015826 -81.185907179 +} +85648187fffffff +{ + 17.066112938 97.342846260 + 17.158979684 97.317331831 + 17.184630396 97.219799820 + 17.117405626 97.147825112 + 17.024538450 97.173388722 + 16.998896415 97.270877975 +} +85b4d477fffffff +{ + -19.858338555 -155.239302499 + -19.768201013 -155.206244470 + -19.696187265 -155.273606771 + -19.714219956 -155.374014226 + -19.804307180 -155.407195056 + -19.876412107 -155.339845850 +} +8599315bfffffff +{ + -6.072773834 -10.696590401 + -6.143370940 -10.725963622 + -6.200963414 -10.670553792 + -6.187855305 -10.585749072 + -6.117191135 -10.556473984 + -6.059702069 -10.611905317 +} +85dd2da7fffffff +{ + -64.207743107 -24.250348636 + -64.127563614 -24.138327439 + -64.045336111 -24.245029974 + -64.042996394 -24.463036461 + -64.122885395 -24.575733774 + -64.205404592 -24.469754553 +} +85566d93fffffff +{ + 12.290045281 -23.971134340 + 12.222397678 -24.026155859 + 12.146130156 -23.989491751 + 12.137431348 -23.897909759 + 12.204969660 -23.842851817 + 12.281316013 -23.879412073 +} +85032667fffffff +{ + 89.777325492 -166.737429823 + 89.693704919 -174.841091395 + 89.616475391 -165.837284538 + 89.604478173 -152.335024361 + 89.666030321 -141.671883149 + 89.759257469 -144.190238597 +} +85f129b7fffffff +{ + -87.702737657 107.279881374 + -87.716218009 105.019932323 + -87.799699178 104.192673796 + -87.871781157 105.750227579 + -87.856965789 108.169802757 + -87.771467510 108.865207895 +} +8594ad7bfffffff +{ + -15.553149954 124.023667271 + -15.636371945 124.039874409 + -15.671191144 124.124186608 + -15.622786589 124.192344839 + -15.539506161 124.176135500 + -15.504688692 124.091770072 +} +85d1a6abfffffff +{ + -41.443861637 0.865155350 + -41.536697832 0.836186132 + -41.600552588 0.927841979 + -41.571485786 1.048384281 + -41.478650493 1.077073287 + -41.414880943 0.985500472 +} +85ccab37fffffff +{ + -37.885187930 81.200758170 + -37.972413293 81.232138138 + -37.992161371 81.346055271 + -37.924695603 81.428409049 + -37.837522282 81.396907048 + -37.817762615 81.283172975 +} +858b2187fffffff +{ + -17.841813158 -65.512494647 + -17.919956268 -65.562966041 + -17.999685704 -65.521767753 + -18.001225499 -65.430134662 + -17.923111718 -65.379757553 + -17.843428821 -65.420919149 +} +85eef4d7fffffff +{ + -70.983317658 -25.441385650 + -70.901226587 -25.284419951 + -70.815678216 -25.423901604 + -70.811857028 -25.718942598 + -70.893564351 -25.877052880 + -70.979476450 -25.738992634 +} +85e98563fffffff +{ + -71.433866651 -94.517733793 + -71.445428187 -94.236245214 + -71.372187840 -94.054953761 + -71.287811259 -94.154752580 + -71.276440875 -94.433920685 + -71.349256955 -94.615598209 +} +85b19153fffffff +{ + -32.125623097 -108.511503890 + -32.065265185 -108.427375361 + -31.975247239 -108.448905858 + -31.945531414 -108.554314252 + -32.005742682 -108.638405490 + -32.095816231 -108.617125920 +} +85958e67fffffff +{ + -13.302547791 119.122392780 + -13.386047678 119.138468237 + -13.421673639 119.219111130 + -13.373784128 119.283739867 + -13.290209396 119.267654918 + -13.254599012 119.186950675 +} +85340833fffffff +{ + 31.709834193 -23.420111553 + 31.632015013 -23.488700596 + 31.542707889 -23.443891757 + 31.531153354 -23.330656178 + 31.608871849 -23.262016228 + 31.698245496 -23.306662358 +} +85efa4abfffffff +{ + -82.839809419 0.909130150 + -82.744661438 0.990776052 + -82.688891221 0.388813825 + -82.727284820 -0.300196422 + -82.822224189 -0.398530757 + -82.878990063 0.208755070 +} +85f165a3fffffff +{ + -87.165836585 -24.955824742 + -87.085515932 -23.978139142 + -87.004431837 -24.873805281 + -87.001491692 -26.693521961 + -87.079437475 -27.715951062 + -87.162690237 -26.877695641 +} +85e42247fffffff +{ + -61.056375150 107.330733027 + -60.979348649 107.207899481 + -60.992199953 107.008985656 + -61.082154804 106.931886383 + -61.159431688 107.054468900 + -61.146503020 107.254405418 +} +85032617fffffff +{ + 89.534078134 80.837121167 + 89.516066127 91.661103957 + 89.574784925 100.958846676 + 89.667188173 100.274582029 + 89.694843126 84.573548627 + 89.617826601 75.512550586 +} +85bd5627fffffff +{ + -38.147076960 30.937737911 + -38.066914914 30.942683953 + -38.024741754 30.848069645 + -38.062730613 30.748462081 + -38.142897161 30.743428055 + -38.185070445 30.838089553 +} +8598a2b7fffffff +{ + -16.387756055 -13.526584276 + -16.469799356 -13.561995039 + -16.537889357 -13.502079202 + -16.523825552 -13.406707444 + -16.441697659 -13.371407497 + -16.373718110 -13.431368243 +} +852a2973fffffff +{ + 38.107336595 -66.388309008 + 38.069561217 -66.490896673 + 37.987156870 -66.500632155 + 37.942574591 -66.408110857 + 37.980221489 -66.305754631 + 38.062578869 -66.295688504 +} +85b16ca7fffffff +{ + -26.729087823 -129.397065943 + -26.641383553 -129.387899988 + -26.587308107 -129.461376199 + -26.620899282 -129.544152621 + -26.708682855 -129.553475714 + -26.762795995 -129.479865159 +} +857713cffffffff +{ + 3.750547708 152.349715360 + 3.657156097 152.362719618 + 3.622426719 152.447759076 + 3.681031574 152.519764803 + 3.774362543 152.506799279 + 3.809149330 152.421789267 +} +85ef32abfffffff +{ + -85.216679274 -24.335277373 + -85.135012779 -23.755479537 + -85.053107726 -24.305414824 + -85.051532629 -25.416113640 + -85.131797217 -26.013332284 + -85.215037242 -25.483265558 +} +850356bbfffffff +{ + 82.809478811 -82.662501773 + 82.839505152 -83.319388110 + 82.782760888 -83.890453167 + 82.696971934 -83.800841768 + 82.667720066 -83.154820427 + 82.723492731 -82.587630911 +} +852e6383fffffff +{ + 35.334816952 136.169728949 + 35.417850375 136.139429417 + 35.437754314 136.046122281 + 35.374685511 135.983335890 + 35.291784047 136.013726615 + 35.271819492 136.106812884 +} +85b4a827fffffff +{ + -23.664734171 -153.763463737 + -23.572937495 -153.730544834 + -23.500656505 -153.801075549 + -23.520086399 -153.904521993 + -23.611843662 -153.937578301 + -23.684210526 -153.867050992 +} +85262e43fffffff +{ + 44.170815098 -95.214940852 + 44.106198276 -95.295856503 + 44.022620628 -95.252166870 + 44.003508925 -95.127865601 + 44.067938916 -95.046838319 + 44.151667338 -95.090222978 +} +85936d57fffffff +{ + -7.306561184 -94.173012084 + -7.382064850 -94.232074453 + -7.470776319 -94.197071552 + -7.483998563 -94.102937833 + -7.408453850 -94.043839687 + -7.319727980 -94.078910929 +} +85ec64cbfffffff +{ + -76.174620632 157.818770491 + -76.169273811 157.479708518 + -76.243127595 157.281533158 + -76.322661615 157.424084763 + -76.327984762 157.766853680 + -76.253797456 157.963338043 +} +85252e8bfffffff +{ + 53.590061268 95.513878182 + 53.498114272 95.538280047 + 53.463186946 95.678668779 + 53.520059876 95.794967185 + 53.611981432 95.771114733 + 53.647055810 95.630414227 +} +85f2a903fffffff +{ + -83.177194730 -125.735662315 + -83.236638426 -125.166202574 + -83.203727210 -124.443453277 + -83.111973359 -124.304494841 + -83.053586194 -124.871605744 + -83.085906368 -125.580177663 +} +850a69bbfffffff +{ + 75.703914837 93.450505961 + 75.669687202 93.803837756 + 75.728715784 94.094758309 + 75.822510095 94.033021403 + 75.857047285 93.676279299 + 75.797478047 93.384702146 +} +851ec073fffffff +{ + 41.975241543 23.606413944 + 41.883380785 23.601081817 + 41.833866021 23.708393443 + 41.876157606 23.821131162 + 41.968010799 23.826693114 + 42.017580132 23.719287597 +} +85f286abfffffff +{ + -87.190379523 -157.069903034 + -87.277377080 -156.547450942 + -87.293835415 -154.672123660 + -87.222108866 -153.421441607 + -87.136577094 -154.029491118 + -87.121262424 -155.805985340 +} +8516119bfffffff +{ + 53.706197457 161.498009895 + 53.792773423 161.490939964 + 53.829656899 161.353894157 + 53.779901829 161.224212794 + 53.693357226 161.231688425 + 53.656536087 161.368440052 +} +85120dc3fffffff +{ + 58.095056632 -114.286604947 + 58.011823497 -114.349605598 + 57.937304551 -114.248008792 + 57.945783160 -114.083508523 + 58.028910521 -114.019865745 + 58.103665405 -114.121363188 +} +852eb577fffffff +{ + 45.825099489 150.003028524 + 45.914385458 149.982039486 + 45.942379132 149.862225722 + 45.881085982 149.763704512 + 45.791888304 149.784943730 + 45.763895379 149.904454513 +} +85bb13bbfffffff +{ + -40.106838941 -177.472343533 + -40.031340869 -177.416245393 + -39.951330396 -177.473478771 + -39.946812629 -177.586615824 + -40.022232972 -177.642722720 + -40.102248775 -177.585684158 +} +85024a2bfffffff +{ + 71.082050471 -81.791024054 + 71.022909671 -82.021617008 + 70.929896766 -81.977851123 + 70.895912382 -81.705648568 + 70.954708232 -81.475529080 + 71.047832051 -81.517132971 +} +85d7acdbfffffff +{ + -53.959242709 42.505959052 + -53.883149211 42.555239377 + -53.828911772 42.479000943 + -53.850598886 42.353682673 + -53.926505830 42.304088742 + -53.980912167 42.380125342 +} +85176a8ffffffff +{ + 62.782465561 175.409431385 + 62.692486009 175.373825242 + 62.636208544 175.528368897 + 62.669593690 175.718684862 + 62.759433320 175.755420283 + 62.816028477 175.600713184 +} +85b6d69bfffffff +{ + -22.025377896 -88.662370318 + -22.098083450 -88.724438987 + -22.184406062 -88.685256570 + -22.198038631 -88.583948718 + -22.125329295 -88.521869644 + -22.038991200 -88.561108671 +} +85116b7bfffffff +{ + 69.229797834 43.121862782 + 69.182562135 43.294124578 + 69.217072064 43.513540829 + 69.298975223 43.561528871 + 69.346391660 43.388759894 + 69.311723490 43.168508668 +} +85d75b27fffffff +{ + -48.088870357 30.305333911 + -48.169154866 30.316825930 + -48.197675658 30.411228481 + -48.145944822 30.493852614 + -48.065776707 30.482143851 + -48.037223032 30.388027217 +} +85169d5bfffffff +{ + 46.264761710 159.177727659 + 46.357183215 159.168334599 + 46.395439682 159.046393520 + 46.341229116 158.934097453 + 46.248855760 158.943800787 + 46.210644634 159.065490226 +} +85926c0ffffffff +{ + -14.797714359 -96.028687323 + -14.870555236 -96.088829642 + -14.959365762 -96.053962598 + -14.975368988 -95.958876688 + -14.902505106 -95.898688362 + -14.813661028 -95.933631849 } -85040c57fffffff +8522a833fffffff { - 75.370777069 153.081698007 - 75.275349650 153.158710721 - 75.244193260 153.521178825 - 75.308126181 153.810020134 - 75.403752811 153.737017559 - 75.435249955 153.371145622 + 49.632685595 -163.592025062 + 49.712876529 -163.552662862 + 49.781827272 -163.637389830 + 49.770530082 -163.761667839 + 49.690234772 -163.800860864 + 49.621341009 -163.715945791 } -8503256bfffffff +85f1638ffffffff { - 88.559976988 -19.113927063 - 88.649756582 -19.393055044 - 88.687622009 -23.066618098 - 88.631558746 -26.153884849 - 88.543173318 -25.461779549 - 88.509175349 -22.083873960 + -86.825612404 13.698318274 + -86.732233866 13.513571049 + -86.695285243 12.033568978 + -86.750034912 10.683120074 + -86.843859934 10.785813174 + -86.882544736 12.321874628 } -85dd8b43fffffff -{ - -54.860502553 -7.427613063 - -54.942531142 -7.476947048 - -55.005321278 -7.370735447 - -54.985984749 -7.215173710 - -54.903906462 -7.166209851 - -54.841214233 -7.272436678 -} -8592204ffffffff -{ - -8.288038863 -104.170728922 - -8.358603728 -104.226862478 - -8.444261764 -104.197507746 - -8.459404248 -104.111933124 - -8.388798344 -104.055726365 - -8.303091020 -104.085167389 -} -851a2e2bfffffff -{ - 51.193764027 -41.641796520 - 51.112500783 -41.705017993 - 51.042193535 -41.626650225 - 51.053057357 -41.485096871 - 51.134285975 -41.421566226 - 51.204685489 -41.499897322 -} -85f032b3fffffff -{ - -79.052389371 89.244302953 - -78.969808891 89.065316325 - -78.953684056 88.592624354 - -79.019950382 88.293185671 - -79.102906546 88.467393153 - -79.119222728 88.945867112 -} -8520b087fffffff -{ - 37.743602638 66.856756228 - 37.661117911 66.918315752 - 37.660976289 67.039716740 - 37.743336133 67.099879808 - 37.825957823 67.038462897 - 37.826082677 66.916739606 -} -8548488bfffffff -{ - 30.660860570 -118.317807779 - 30.744808559 -118.264347782 - 30.825675400 -118.320817943 - 30.822528669 -118.430774181 - 30.738560208 -118.484106478 - 30.657758923 -118.427610532 -} -85404b73fffffff -{ - 26.693886329 96.581259165 - 26.780277774 96.554676715 - 26.803899196 96.453884228 - 26.741131420 96.379722236 - 26.654735611 96.406354917 - 26.631111878 96.507099490 -} -851699cffffffff -{ - 45.633897578 160.293249445 - 45.726980763 160.285426587 - 45.766790028 160.164790871 - 45.713465941 160.052215877 - 45.620425768 160.060347714 - 45.580666480 160.180745833 -} -85a0d07bfffffff -{ - -10.481365878 -136.345792805 - -10.401528718 -136.331736440 - -10.342058053 -136.396823903 - -10.362338433 -136.476048793 - -10.442195912 -136.490231794 - -10.501752805 -136.425063268 -} -85324b23fffffff -{ - 36.311831586 154.426491965 - 36.406404735 154.412858861 - 36.443665035 154.306497587 - 36.386324971 154.213987366 - 36.291830152 154.227837647 - 36.254596958 154.333981273 -} -859a56bbfffffff -{ - -11.042308909 -176.734124299 - -10.965336249 -176.692200593 - -10.897888846 -176.735976820 - -10.907354436 -176.821568871 - -10.984214164 -176.863500948 - -11.051721155 -176.819832758 -} -8508cd33fffffff -{ - 69.326343232 26.299909721 - 69.376121902 26.451908601 - 69.449016643 26.376893932 - 69.471889944 26.148542379 - 69.421758580 25.996728121 - 69.349107194 26.073074437 -} -85f02c83fffffff -{ - -82.403215780 64.356091442 - -82.351519087 63.781867701 - -82.390223390 63.183055629 - -82.481445366 63.150178864 - -82.533982490 63.730570441 - -82.494447216 64.337696944 -} -85c1302ffffffff -{ - -25.015886001 -14.612818084 - -25.103760854 -14.652753385 - -25.177939544 -14.587878759 - -25.164139088 -14.483006139 - -25.076176351 -14.443198544 - -25.002101909 -14.508135526 -} -854aa303fffffff -{ - 18.736238547 126.947998337 - 18.648405155 126.965024431 - 18.621895058 127.055534804 - 18.683265382 127.129070954 - 18.771132099 127.112047636 - 18.797595227 127.021485319 -} -85026b07fffffff -{ - 72.568752407 -72.303920404 - 72.522519038 -72.577972316 - 72.429313904 -72.575906709 - 72.382349166 -72.302421668 - 72.428259564 -72.029729326 - 72.521455910 -72.029162866 -} -85b80133fffffff -{ - -30.095335516 128.511788084 - -30.005654422 128.514196347 - -29.962409995 128.431165653 - -30.008721805 128.345720068 - -30.098312490 128.343130849 - -30.141681837 128.426167984 -} -857a0bbbfffffff -{ - 1.713136895 42.055533376 - 1.801584199 42.055425849 - 1.850320784 41.977862736 - 1.810641599 41.900332343 - 1.722146420 41.900381680 - 1.673378236 41.978019635 -} -85d4a1cbfffffff -{ - -46.679191875 -154.312338703 - -46.595648816 -154.269926423 - -46.530842551 -154.359096243 - -46.549520062 -154.490666744 - -46.633034329 -154.533296999 - -46.697899981 -154.444139265 -} -85a44ca7fffffff -{ - -24.326286989 -17.723546423 - -24.412632998 -17.765865058 - -24.487453669 -17.704558355 - -24.475829943 -17.600849326 - -24.389384209 -17.558637514 - -24.314661911 -17.620027570 -} -851ea593fffffff -{ - 46.340443390 12.340647869 - 46.253535228 12.347402360 - 46.217816181 12.463807693 - 46.268981374 12.573665631 - 46.355928255 12.567153327 - 46.391671374 12.450540672 -} -854e5073fffffff -{ - 21.965582693 145.857181085 - 21.878061502 145.872046490 - 21.842555236 145.963686814 - 21.894564884 146.040451441 - 21.982051144 146.025620660 - 22.017562749 145.933990576 -} -85b902cffffffff -{ - -35.681744480 135.664673328 - -35.587828232 135.658718269 - -35.545275030 135.559316246 - -35.596523902 135.465802315 - -35.690379552 135.471521406 - -35.733047053 135.570990292 -} -850f997bfffffff -{ - 63.212275657 -91.937955213 - 63.140967767 -92.081889576 - 63.048913671 -92.018599622 - 63.027988189 -91.812315269 - 63.099034833 -91.668205364 - 63.191267772 -91.730551266 +85436e53fffffff +{ + 35.757767258 61.779593556 + 35.679264679 61.844864827 + 35.683833824 61.960860938 + 35.766955661 62.011876548 + 35.845606331 61.946685960 + 35.840986976 61.830398490 } -8503266ffffffff +85f29217fffffff { - 89.616475391 -165.837284537 - 89.534373259 -171.316059084 - 89.455436391 -165.468875525 - 89.446070979 -155.868486444 - 89.513746803 -149.069428948 - 89.604478173 -152.335024361 + -88.897089169 84.419938140 + -88.872793067 79.851752158 + -88.933893399 76.345867874 + -89.025892714 77.352041267 + -89.053494827 82.601992611 + -88.985413131 86.107088986 } -85da6537fffffff -{ - -58.747126175 157.122278694 - -58.669540062 157.076881764 - -58.650503223 156.911832837 - -58.709006137 156.791732566 - -58.786651866 156.836715090 - -58.805735256 157.002213419 -} -85efb64bfffffff -{ - -78.941544465 21.483337336 - -78.849275526 21.364425038 - -78.822198275 20.903406364 - -78.887081160 20.555185019 - -78.979717374 20.667885157 - -79.007106918 21.135067800 -} -857a4377fffffff -{ - 1.590397647 37.082625846 - 1.680403422 37.084412171 - 1.729751866 37.005292337 - 1.689136094 36.924327772 - 1.599102030 36.922479884 - 1.549711944 37.001658139 -} -85dedd97fffffff -{ - -47.538252560 -46.920577547 - -47.490268441 -46.819333124 - -47.415032689 -46.835645851 - -47.387733636 -46.952743562 - -47.435512983 -47.053855141 - -47.510795759 -47.038002272 -} -85ef09abfffffff -{ - -78.773886957 -57.015355144 - -78.729325578 -56.577680096 - -78.632619572 -56.559767108 - -78.580557819 -56.972452774 - -78.624571451 -57.405907129 - -78.721189561 -57.430884924 -} -85dcf647fffffff -{ - -49.886503496 -12.494494415 - -49.970994339 -12.546795137 - -50.041826248 -12.454747473 - -50.028079144 -12.310310492 - -49.943523449 -12.258275282 - -49.872779608 -12.350410692 -} -85466323fffffff -{ - 25.277055186 -160.090481131 - 25.187850983 -160.120089594 - 25.122683335 -160.049536433 - 25.146711021 -159.949331068 - 25.235942960 -159.919633310 - 25.301119525 -159.990230095 -} -85cb2967fffffff -{ - -31.937290552 54.027904153 - -32.029735048 54.035206433 - -32.072892619 54.130036443 - -32.023527422 54.217539918 - -31.931019306 54.210076044 - -31.887939934 54.115270359 -} -8536b083fffffff -{ - 31.125667154 -157.268904584 - 31.040900662 -157.300893921 - 30.978208416 -157.228368125 - 31.000279796 -157.123823867 - 31.085063822 -157.091748111 - 31.147758989 -157.164302881 -} -851e9c73fffffff -{ - 39.892064203 13.002370072 - 39.799685197 13.007968816 - 39.759556924 13.115841983 - 39.811783091 13.218290063 - 39.904204890 13.212901066 - 39.944357862 13.104854074 -} -857ec637fffffff -{ - 2.569223540 172.433995121 - 2.638995270 172.439202626 - 2.676011502 172.370504519 - 2.643164566 172.296637405 - 2.573376738 172.291545282 - 2.536451823 172.360204850 -} -85f05473fffffff -{ - -77.248806200 49.680455212 - -77.179522642 49.404891844 - -77.195069042 49.012507352 - -77.280206061 48.891117023 - -77.350077273 49.166336244 - -77.334221389 49.563322913 -} -8504a6affffffff -{ - 69.078032369 134.184583946 - 68.994273686 134.318825943 - 68.993087741 134.588464703 - 69.075668466 134.725994567 - 69.159777296 134.592826791 - 69.160955237 134.321043414 -} -856ce073fffffff -{ - 2.393189436 -95.551794578 - 2.319567844 -95.608892724 - 2.236185973 -95.575600895 - 2.226426189 -95.485143203 - 2.300109286 -95.428005637 - 2.383490603 -95.461365091 -} -85eac403fffffff -{ - -68.678629370 -176.335682020 - -68.699467473 -176.516252459 - -68.776236952 -176.539850611 - -68.832149241 -176.381563205 - -68.811061292 -176.200115851 - -68.734311673 -176.177834400 -} -85c8e6c7fffffff -{ - -38.348394664 105.062941505 - -38.280161909 104.995734449 - -38.287801761 104.881348611 - -38.363713638 104.833829526 - -38.432121227 104.900928692 - -38.424442007 105.015655557 -} -85050897fffffff -{ - 80.290975928 124.851585534 - 80.216144080 125.207904000 - 80.230726879 125.769741187 - 80.320392457 125.984334253 - 80.396008477 125.630017820 - 80.381171590 125.059008459 -} -859f68d7fffffff -{ - -26.940676631 164.162292437 - -26.850803353 164.127006318 - -26.831547632 164.022808664 - -26.902161588 163.953700135 - -26.992131135 163.988858337 - -27.011390493 164.093253328 -} -85898c77fffffff -{ - -8.923518131 -148.516831065 - -8.841944019 -148.492197781 - -8.777868795 -148.556054315 - -8.795267571 -148.644570188 - -8.876811194 -148.669322006 - -8.940986637 -148.605439531 -} -85baae9bfffffff -{ - -31.534684306 -175.018983759 - -31.452751598 -174.968715811 - -31.372522853 -175.024081126 - -31.374201687 -175.129562275 - -31.456040482 -175.179854242 - -31.536294312 -175.124641336 -} -85896873fffffff -{ - -13.119807596 -162.627598828 - -13.035363288 -162.591197460 - -12.965162248 -162.649716681 - -12.979315566 -162.744583123 - -13.063676434 -162.781063099 - -13.133967447 -162.722598242 -} -8596ddcffffffff -{ - -3.902395887 24.661468565 - -3.807946210 24.668093585 - -3.756089149 24.588642022 - -3.798623961 24.502560339 - -3.893046477 24.495874865 - -3.944961420 24.575331484 -} -85e8b2d7fffffff -{ - -71.453285333 -72.087222327 - -71.430556583 -71.797881515 - -71.339188054 -71.711364099 - -71.270826621 -71.912071255 - -71.293407780 -72.199016090 - -71.384496923 -72.287637121 -} -85cf081bfffffff -{ - -50.758635917 -80.547796316 - -50.677004827 -80.483226657 - -50.599180571 -80.556054123 - -50.602829948 -80.693363737 - -50.684395552 -80.758295726 - -50.762377410 -80.685556831 -} -85a44277fffffff -{ - -24.468334268 -21.611490299 - -24.552932170 -21.656890981 - -24.628749675 -21.599734351 - -24.619881700 -21.497068148 - -24.535172389 -21.451749028 - -24.459442485 -21.509014215 -} -851b0e07fffffff -{ - 56.277170661 -43.601264207 - 56.266360065 -43.761521232 - 56.181893288 -43.830518491 - 56.108451381 -43.739646271 - 56.119294900 -43.580125541 - 56.203547444 -43.510743039 -} -85812263fffffff -{ - -14.720674659 -42.025684910 - -14.639808828 -41.974456573 - -14.557093926 -42.022380076 - -14.555254907 -42.121519327 - -14.636131015 -42.172758377 - -14.718835861 -42.124847615 -} -85f12913fffffff -{ - -87.190084125 110.744960873 - -87.209110034 108.923911027 - -87.294187670 108.376362459 - -87.361641218 109.741599378 - -87.341209001 111.661377996 - -87.254783752 112.113976838 -} -85d45127fffffff -{ - -44.011541814 -169.922554298 - -43.933520474 -169.867802953 - -43.857160163 -169.938261801 - -43.858789642 -170.063307163 - -43.936743164 -170.118136855 - -44.013135026 -170.047843351 -} -85f1224ffffffff -{ - -83.211228698 134.887856675 - -83.262650152 134.289021542 - -83.346231792 134.403827787 - -83.378038161 135.134324776 - -83.325501799 135.736930532 - -83.242285152 135.605388668 -} -85f1004bfffffff -{ - -83.032216274 117.184272846 - -83.059729376 116.492314417 - -83.143289280 116.375925075 - -83.199637979 116.967275738 - -83.171353788 117.671730068 - -83.087502713 117.772222344 -} -8538a41bfffffff -{ - 29.852018026 -5.599196360 - 29.787272887 -5.674590198 - 29.697888832 -5.651992093 - 29.673272802 -5.554209246 - 29.737924766 -5.478907390 - 29.827285805 -5.501296315 -} -8538526bfffffff -{ - 31.083195011 5.539755847 - 30.989952198 5.551408983 - 30.952860157 5.648193230 - 31.009009815 5.733499664 - 31.102335552 5.721996593 - 31.139428768 5.625036806 -} -85a32627fffffff -{ - -10.766562236 44.496534067 - -10.672692257 44.495467325 - -10.625552747 44.414941325 - -10.672286067 44.335391829 - -10.766225583 44.336396722 - -10.813362279 44.417013009 -} -85451153fffffff -{ - 18.410511031 -84.440148410 - 18.477966891 -84.379372856 - 18.562008413 -84.404095905 - 18.578626947 -84.489733805 - 18.511093908 -84.550586776 - 18.427019593 -84.525724464 -} -853f9267fffffff -{ - 24.634894620 10.887953709 - 24.539730970 10.894557340 - 24.496277291 10.987023293 - 24.547952949 11.073023039 - 24.643176749 11.066569069 - 24.686664832 10.973965561 -} -85bd800bfffffff -{ - -33.592316521 41.741011772 - -33.508249935 41.741024050 - -33.471801933 41.650239399 - -33.519444368 41.559341632 - -33.603550420 41.559249495 - -33.639974651 41.650135037 -} -85ec2bcffffffff -{ - -72.183524383 150.254354394 - -72.165172792 149.985232478 - -72.232613889 149.796225838 - -72.318719730 149.876822773 - -72.337130617 150.148180562 - -72.269375772 150.336693839 -} -850512b7fffffff -{ - 74.906014023 113.838590244 - 74.843085487 114.117446700 - 74.874424237 114.463135361 - 74.969046221 114.533016865 - 75.032487115 114.253427531 - 75.000791108 113.904675073 -} -85e4a88bfffffff -{ - -55.338992617 101.086703809 - -55.257339947 100.995649529 - -55.261145476 100.825487762 - -55.346616656 100.745618367 - -55.428475765 100.836334765 - -55.424657202 101.007260904 -} -85d184abfffffff -{ - -43.620886520 1.765953478 - -43.713005919 1.737387565 - -43.774927161 1.832255669 - -43.744647238 1.955591710 - -43.652533337 1.983857855 - -43.590693696 1.889087990 -} -85e295a7fffffff -{ - -61.614953848 -116.485391240 - -61.564608259 -116.325744951 - -61.474445831 -116.344237867 - -61.434618163 -116.521538739 - -61.484806746 -116.680833307 - -61.574979488 -116.663179205 -} -8501967bfffffff -{ - 69.763834582 62.245968189 - 69.774081188 62.490384730 - 69.852398552 62.569256698 - 69.920657215 62.402126957 - 69.910210398 62.155917973 - 69.831706082 62.078639314 -} -8500ee2bfffffff -{ - 86.223263591 51.330449136 - 86.257323048 52.606243821 - 86.349663004 52.806532927 - 86.408385070 51.671370405 - 86.372872752 50.352243326 - 86.280131377 50.212262774 -} -85387193fffffff -{ - 36.214074243 6.028391822 - 36.122097926 6.040244483 - 36.087032043 6.142480085 - 36.143944656 6.233056249 - 36.235997112 6.221372610 - 36.271060895 6.118943535 -} -856ce5b3fffffff -{ - 3.254146889 -93.900577677 - 3.180531271 -93.957780516 - 3.097303032 -93.923770909 - 3.087697518 -93.832495011 - 3.161374462 -93.775259800 - 3.244595537 -93.809332760 -} -85ab9937fffffff -{ - -28.519201087 65.716560783 - -28.614661021 65.733742987 - -28.649803771 65.836246700 - -28.589428869 65.921475802 - -28.493961382 65.904139214 - -28.458876244 65.801727808 -} -85394e1bfffffff -{ - 40.342182900 4.750960735 - 40.253034157 4.764543362 - 40.221652496 4.870974932 - 40.279428718 4.964039963 - 40.368652414 4.950636122 - 40.400025019 4.843988162 -} -85e0f5cffffffff -{ - -54.360533240 59.281085240 - -54.273465385 59.295448052 - -54.228452049 59.179016722 - -54.270286264 59.048110421 - -54.357240315 59.033163514 - -54.402474275 59.149706127 -} -85e88e2bfffffff -{ - -65.493111301 -71.502465210 - -65.468843541 -71.284648015 - -65.379880103 -71.221184043 - -65.315403657 -71.374315634 - -65.339551764 -71.590778874 - -65.428295351 -71.655459159 -} -85027557fffffff -{ - 77.484783986 -81.700865119 - 77.428504119 -82.036478353 - 77.340484818 -81.972882921 - 77.308588668 -81.578225539 - 77.364367581 -81.243629533 - 77.452540775 -81.302656372 -} -850b8897fffffff -{ - 59.712323552 87.445837307 - 59.623414474 87.494319338 - 59.596691269 87.669681781 - 59.658759582 87.797145726 - 59.747710596 87.749371606 - 59.774551742 87.573424284 -} -850622a3fffffff -{ - 70.083678812 -24.666533671 - 70.105036335 -24.901685995 - 70.040049120 -25.069768283 - 69.953996011 -25.002518779 - 69.932857785 -24.768849430 - 69.997554296 -24.600951915 -} -854d809bfffffff -{ - 28.953124272 -70.310222887 - 28.917318592 -70.393278075 - 28.846882282 -70.395794890 - 28.812265262 -70.315490611 - 28.847948580 -70.232570570 - 28.918371056 -70.229819714 -} -85c3b143fffffff -{ - -45.479542910 -52.773674284 - -45.438547836 -52.672094579 - -45.366166026 -52.675632670 - -45.334776190 -52.780333552 - -45.375596099 -52.881717486 - -45.447980634 -52.878596361 -} -85f3304bfffffff -{ - -74.670074227 -178.159776406 - -74.746059523 -178.189521663 - -74.784815053 -177.927050618 - -74.747119285 -177.635968021 - -74.671029139 -177.609255666 - -74.632737471 -177.870588813 -} -850a0423fffffff -{ - 64.576215417 87.477566916 - 64.490834784 87.533132480 - 64.463748081 87.734356494 - 64.521919290 87.880782687 - 64.607357506 87.826151115 - 64.634567423 87.624157332 -} -85e8448ffffffff -{ - -57.360589608 -91.311746914 - -57.284063684 -91.210876339 - -57.200627110 -91.279157247 - -57.193570256 -91.447954367 - -57.269966260 -91.549137317 - -57.353548999 -91.481212796 -} -8584966ffffffff -{ - -14.970225051 57.876434184 - -15.061590225 57.885785873 - -15.096306314 57.972069297 - -15.039559960 58.048964037 - -14.948158016 58.039486081 - -14.913539101 57.953239662 -} -8511696ffffffff -{ - 70.175539698 42.749466233 - 70.210439009 42.959313354 - 70.290486183 42.951117006 - 70.335567344 42.731152863 - 70.300305286 42.520443809 - 70.220326177 42.530559971 -} -85d9350ffffffff -{ - -57.888096787 147.115568054 - -57.858570476 146.962580562 - -57.916346885 146.847902103 - -58.003871482 146.886289902 - -58.033446386 147.039977397 - -57.975447881 147.154575115 -} -850ca4dbfffffff -{ - 64.401143153 -173.191327089 - 64.315692054 -173.268484520 - 64.247723621 -173.136685706 - 64.264895520 -172.928073983 - 64.350093345 -172.849964472 - 64.418372864 -172.981413466 -} -855c201bfffffff -{ - 16.453989033 -150.764133818 - 16.362051791 -150.796938950 - 16.288840339 -150.730237121 - 16.307540221 -150.630741075 - 16.399460225 -150.597880555 - 16.472697630 -150.664571315 -} -85661b97fffffff -{ - 5.913039487 -75.862783312 - 5.842063435 -75.916132135 - 5.759444052 -75.877366143 - 5.747863646 -75.785248740 - 5.818882845 -75.731948396 - 5.901439308 -75.770716851 -} -8528aaa3fffffff -{ - 44.117153248 -119.170250785 - 44.194637227 -119.110414226 - 44.265016328 -119.175026979 - 44.257862870 -119.299502263 - 44.180365689 -119.359167995 - 44.110035138 -119.294529692 -} -854964c7fffffff -{ - 16.229519908 -116.906099051 - 16.310607472 -116.857271936 - 16.393156833 -116.907014037 - 16.394530753 -117.005611837 - 16.313392707 -117.054343726 - 16.230931186 -117.004573258 -} -859d9ab7fffffff -{ - -10.410297139 152.046846780 - -10.496698281 152.059661295 - -10.524035687 152.143217447 - -10.465041529 152.213931603 - -10.378678514 152.201154078 - -10.351271469 152.117625382 -} -8505132bfffffff -{ - 75.209294918 118.727678601 - 75.140423864 118.992251962 - 75.164352031 119.355613796 - 75.257438066 119.458002700 - 75.326845689 119.193380037 - 75.302628489 118.826395760 -} -85b4a53bfffffff -{ - -26.425244397 -151.619379165 - -26.332594602 -151.587595319 - -26.261306771 -151.661020462 - -26.282587592 -151.766242234 - -26.375211469 -151.798178700 - -26.446580535 -151.724740998 -} -85e30287fffffff -{ - -65.666778295 -143.818677869 - -65.654297819 -143.631791505 - -65.575507104 -143.579484544 - -65.509343871 -143.713405697 - -65.521825097 -143.899305109 - -65.600468640 -143.952266918 -} -8586645bfffffff -{ - -12.233953344 79.300194085 - -12.323866322 79.324508576 - -12.350588984 79.417152303 - -12.287380065 79.485364880 - -12.197535246 79.460963427 - -12.170831134 79.368436191 -} -85e56e0ffffffff -{ - -70.836874330 104.747821900 - -70.760200444 104.578844819 - -70.769051728 104.289067889 - -70.854644068 104.166077007 - -70.931649514 104.334322744 - -70.922730632 104.626302617 -} -858c183bfffffff -{ - -6.433912772 103.781035381 - -6.348218659 103.759445999 - -6.326191891 103.670723713 - -6.389914130 103.603610740 - -6.475607423 103.625255513 - -6.497579373 103.713957938 -} -85ef0633fffffff -{ - -83.569229910 -42.492771345 - -83.505984940 -41.855782423 - -83.412679749 -42.032980368 - -83.382156848 -42.827934791 - -83.444227665 -43.462095986 - -83.537983023 -43.304324583 -} -85a5255bfffffff -{ - -9.286879585 -26.508841883 - -9.204936797 -26.463348120 - -9.125192772 -26.509266506 - -9.127359000 -26.600728487 - -9.209338884 -26.646293123 - -9.289115439 -26.600324998 +85f1262ffffffff +{ + -83.653981249 143.601358295 + -83.715766214 143.040636048 + -83.796745800 143.285156611 + -83.815242167 144.107152402 + -83.752243755 144.666011412 + -83.671971113 144.405003510 +} +85d7ab2bfffffff +{ + -51.656453971 41.328776097 + -51.583111059 41.376720095 + -51.531112713 41.308247680 + -51.552299830 41.192020321 + -51.625464816 41.143821345 + -51.677620544 41.212103622 +} +8500c5a3fffffff +{ + 85.812245794 59.470579392 + 85.834045398 60.679292682 + 85.923735069 61.041150181 + 85.992495711 60.151836396 + 85.969787624 58.899020349 + 85.879251840 58.580570719 +} +8580d4cbfffffff +{ + 2.699122914 -38.354757878 + 2.780915232 -38.305387417 + 2.864818811 -38.352391481 + 2.866963660 -38.448769500 + 2.785188627 -38.498166089 + 2.701251456 -38.451158668 +} +85f2689bfffffff +{ + -70.916102099 -121.154829250 + -70.961686203 -120.943885875 + -70.921674371 -120.700403579 + -70.836333755 -120.669387227 + -70.791149695 -120.879739154 + -70.830907591 -121.121703169 +} +85592bdbfffffff +{ + 21.759958488 3.681925524 + 21.668758499 3.693970181 + 21.629973297 3.781625415 + 21.682378150 3.857386308 + 21.773669286 3.845460220 + 21.812464459 3.757654493 +} +8583418ffffffff +{ + -11.133582043 4.204534834 + -11.045691288 4.217463777 + -10.991636873 4.153328383 + -11.025417794 4.076339732 + -11.113205307 4.063384680 + -11.167315106 4.127444307 +} +85032a27fffffff +{ + 86.060103038 -74.015604341 + 86.103808464 -75.148539206 + 86.056644643 -76.313892501 + 85.967366936 -76.319778353 + 85.925344853 -75.212103798 + 85.970953434 -74.073254514 +} +856a04a7fffffff +{ + 8.687328840 26.096254127 + 8.600967390 26.090469343 + 8.554401626 26.167624350 + 8.594101780 26.250601539 + 8.680441220 26.256506814 + 8.727102637 26.179314462 +} +85322967fffffff +{ + 33.097967033 164.760754484 + 33.195141683 164.759228389 + 33.242729386 164.658016157 + 33.193065961 164.558470467 + 33.095912922 164.560227929 + 33.048401534 164.661299779 +} +85f28047fffffff +{ + -87.241269077 -140.262269110 + -87.317295747 -139.206422145 + -87.306444217 -137.280335702 + -87.219967605 -136.522205746 + -87.146360091 -137.614256721 + -87.156829639 -139.432291945 +} +85a26583fffffff +{ + -15.078455586 57.063442486 + -15.169625057 57.072164067 + -15.204597079 57.157748277 + -15.148300589 57.234577848 + -15.057090407 57.225730429 + -15.022217335 57.140179295 +} +852eb037fffffff +{ + 46.543262076 150.175313469 + 46.632188076 150.154303718 + 46.659957113 150.033107703 + 46.598798059 149.933231004 + 46.509958746 149.954497785 + 46.482191688 150.075384785 +} +852348bbfffffff +{ + 41.520272243 -178.095164077 + 41.613540956 -178.075348422 + 41.674708604 -178.172741247 + 41.642511901 -178.289961237 + 41.549170456 -178.309532893 + 41.488098318 -178.212128968 +} +8527b0d7fffffff +{ + 50.596429396 -109.672215214 + 50.519832667 -109.734236648 + 50.442713932 -109.658186953 + 50.441980760 -109.520266756 + 50.518448090 -109.457867492 + 50.595778191 -109.533764876 +} +85e169abfffffff +{ + -65.917515387 42.476415656 + -65.845930625 42.354361486 + -65.846132272 42.146780028 + -65.918026331 42.059922806 + -65.989937086 42.181557374 + -65.989627357 42.390474326 +} +856ed0c3fffffff +{ + 12.619065754 -112.683203763 + 12.697742621 -112.632421616 + 12.780237271 -112.678898090 + 12.783973131 -112.776205979 + 12.705227909 -112.826917213 + 12.622815171 -112.780391684 +} +85056887fffffff +{ + 85.110608432 -177.987095174 + 85.020288684 -178.298371721 + 84.950042885 -177.557954252 + 84.968626131 -176.509780824 + 85.058048274 -176.169933890 + 85.129799225 -176.906192162 +} +854ce2dbfffffff +{ + 20.137611396 -67.835885593 + 20.085786794 -67.881998689 + 20.018199946 -67.845353427 + 20.002500764 -67.762617360 + 20.054370055 -67.716572459 + 20.121893856 -67.753195352 +} +85bf9c03fffffff +{ + -30.171038614 162.956466256 + -30.079747345 162.920944009 + -30.059974068 162.812575273 + -30.131484388 162.739518606 + -30.222865518 162.774895360 + -30.242646519 162.883474649 +} +850325a7fffffff +{ + 87.713574320 -5.432878418 + 87.801632781 -5.043381758 + 87.860280077 -6.949026456 + 87.827491113 -9.208875387 + 87.738582173 -9.437842157 + 87.683204382 -7.570842163 +} +8503262bfffffff +{ + 89.937684450 -172.280549352 + 89.849268168 174.220594178 + 89.777325492 -166.737429823 + 89.759257469 -144.190238597 + 89.803886032 -123.073483968 + 89.893928397 -112.334903952 +} +85eef287fffffff +{ + -69.156667996 -23.634012990 + -69.073692773 -23.497831146 + -68.989985689 -23.632297919 + -68.988903362 -23.901888163 + -69.071536924 -24.039143912 + -69.155594496 -23.905747021 +} +85474ecffffffff +{ + 29.792911115 -161.992485353 + 29.706863463 -162.021625090 + 29.646345598 -161.949737270 + 29.671874205 -161.848653298 + 29.757955711 -161.819415943 + 29.818474805 -161.891360071 +} +85596637fffffff +{ + 23.911403372 8.115230928 + 23.817435851 8.124066878 + 23.775901656 8.215301352 + 23.828310769 8.297845430 + 23.922351618 8.289149048 + 23.963910099 8.197768864 +} +854e31bbfffffff +{ + 19.186290402 153.863660927 + 19.273785100 153.852000632 + 19.312985690 153.765101207 + 19.264642629 153.690009430 + 19.177220748 153.701813198 + 19.138069022 153.788565440 +} +85383177fffffff +{ + 34.183688816 -2.369303454 + 34.122740549 -2.448912520 + 34.032706305 -2.429389390 + 34.003665329 -2.330486984 + 34.064537068 -2.251001309 + 34.154526194 -2.270294624 +} +85c6518bfffffff +{ + -33.078076733 -136.572541714 + -32.986680443 -136.554844488 + -32.928828732 -136.635658963 + -32.962328654 -136.734294252 + -33.053779235 -136.752186844 + -33.111675688 -136.671248784 +} +85ef24a7fffffff +{ + -84.994179800 -83.985154288 + -84.993602988 -82.915457873 + -84.910531131 -82.418944431 + -84.829289774 -82.974245066 + -84.829852418 -84.010268453 + -84.911670182 -84.523948536 +} +85679b73fffffff +{ + 9.800473924 -82.752350406 + 9.731276082 -82.807620799 + 9.651781496 -82.770371036 + 9.641530455 -82.677823821 + 9.710783315 -82.622571552 + 9.790232171 -82.659848247 +} +8578b423fffffff +{ + -2.361887851 -142.719581933 + -2.446732896 -142.752150993 + -2.513625292 -142.693902158 + -2.495729329 -142.603130735 + -2.410950229 -142.570540357 + -2.344001135 -142.628742593 +} +854a70b7fffffff +{ + 26.335256668 135.674756609 + 26.252627212 135.691388659 + 26.224395830 135.785802942 + 26.278815107 135.863611162 + 26.361443179 135.846998266 + 26.389653436 135.752557918 +} +85a98203fffffff +{ + -27.532458191 -41.395202891 + -27.461472156 -41.343028563 + -27.389292646 -41.391984375 + -27.388118689 -41.493104316 + -27.459126842 -41.545292813 + -27.531286829 -41.496347361 +} +8518819bfffffff +{ + 50.270674577 -21.948892569 + 50.200252353 -22.038325986 + 50.116282542 -21.982946927 + 50.102681561 -21.838415505 + 50.173014298 -21.748920060 + 50.257037396 -21.804017243 +} +85acea93fffffff +{ + -19.186704301 6.118333920 + -19.271095740 6.101838799 + -19.331890705 6.173143680 + -19.308191049 6.260865192 + -19.223807053 6.277193234 + -19.163115128 6.205966889 +} +85ef5527fffffff +{ + -76.222896031 -61.114081227 + -76.184016579 -60.744683202 + -76.087745202 -60.701703644 + -76.030509390 -61.023501034 + -76.068995973 -61.389558749 + -76.165108072 -61.437145234 +} +85692217fffffff +{ + 15.428258575 110.783955790 + 15.520191842 110.763913017 + 15.550774029 110.673869504 + 15.489364795 110.603869694 + 15.397376061 110.623985648 + 15.366851997 110.714028273 +} +85095a9bfffffff +{ + 67.934754147 13.214412612 + 67.991318906 13.313182288 + 68.053702833 13.200254337 + 68.059218315 12.987925452 + 68.002392876 12.889889791 + 67.940312457 13.003443198 +} +8500cc43fffffff +{ + 86.976016352 82.750331530 + 86.961152775 84.465297102 + 87.032944761 85.631398841 + 87.121990125 85.066718047 + 87.137665378 83.258389510 + 87.063450890 82.111264624 +} +85059b83fffffff +{ + 68.452466351 129.846625963 + 68.372604871 129.992911869 + 68.378136005 130.253578367 + 68.463598380 130.369943008 + 68.543826786 130.224391869 + 68.538225527 129.961731085 +} +8519900ffffffff +{ + 57.388447528 -27.126561242 + 57.320208058 -27.221449948 + 57.245676373 -27.150703013 + 57.239303447 -26.985357956 + 57.307447982 -26.890294225 + 57.382060314 -26.960749244 +} +85c4910ffffffff +{ + -42.912517088 -47.238588674 + -42.973676459 -47.307418857 + -43.055252517 -47.277573387 + -43.075719219 -47.178631439 + -43.014485013 -47.109687692 + -42.932859025 -47.139799379 +} +8536f44bfffffff +{ + 29.231792566 -149.523898582 + 29.146909433 -149.559092217 + 29.078303056 -149.488958353 + 29.094576827 -149.383650912 + 29.179452941 -149.348400245 + 29.248062354 -149.418513864 +} +8566d317fffffff +{ + 0.244442189 -78.543477280 + 0.168948469 -78.598993247 + 0.082567745 -78.559817803 + 0.071732214 -78.465113551 + 0.147263502 -78.409636282 + 0.233592745 -78.448824431 +} +854e5ba7fffffff +{ + 22.826786359 141.548941928 + 22.739851480 141.564642679 + 22.706727181 141.658006408 + 22.760543426 141.735674288 + 22.847458599 141.720002289 + 22.880577306 141.626633592 +} +85543517fffffff +{ + 19.621348390 -13.591920654 + 19.552708996 -13.657269268 + 19.468991678 -13.628220784 + 19.453880859 -13.533981893 + 19.522404384 -13.468660214 + 19.606154470 -13.497550322 +} +8550ebd3fffffff +{ + 27.735433628 -134.043429533 + 27.656623066 -134.081523423 + 27.582697143 -134.022139437 + 27.587601190 -133.924761889 + 27.666369771 -133.886677318 + 27.740276312 -133.945960828 +} +85a22853fffffff +{ + -18.194983931 51.305165633 + -18.285438728 51.309524309 + -18.323579167 51.390861851 + -18.271158998 51.467834929 + -18.180634205 51.463352902 + -18.142599521 51.382021221 +} +854464c7fffffff +{ + 26.683302170 -93.163096129 + 26.755747503 -93.097342723 + 26.844693399 -93.133081307 + 26.861205338 -93.234726273 + 26.788692224 -93.300522859 + 26.699735020 -93.264631460 +} +858a04d7fffffff +{ + -9.138606477 -62.785908943 + -9.214741573 -62.832711551 + -9.296140149 -62.793256371 + -9.301331870 -62.707040970 + -9.225211092 -62.660333085 + -9.143884250 -62.699745804 +} +85e6cbb7fffffff +{ + -56.924069659 4.601543010 + -56.840988482 4.608821151 + -56.791512441 4.472977927 + -56.824889206 4.329505984 + -56.907974376 4.321444780 + -56.957679418 4.457638350 +} +85011213fffffff +{ + 71.898434850 40.654058451 + 71.937165161 40.879807219 + 72.018771316 40.860503019 + 72.061544871 40.613132136 + 72.022409624 40.386492792 + 71.940907354 40.408112330 +} +85a5b6b7fffffff +{ + -13.860610972 -37.411854267 + -13.778642612 -37.361557588 + -13.696661392 -37.409660827 + -13.696646506 -37.508068538 + -13.778634020 -37.558396736 + -13.860617259 -37.510285850 +} +85d52a0bfffffff +{ + -55.752343367 -162.741157500 + -55.682945498 -162.683149856 + -55.620146118 -162.776061778 + -55.626679300 -162.926842654 + -55.696019014 -162.985047403 + -55.758883752 -162.892275043 +} +85eae1bbfffffff +{ + -68.883916864 -170.767331958 + -68.952444977 -170.759466540 + -68.977794327 -170.562539380 + -68.934322679 -170.374363444 + -68.865805395 -170.383708665 + -68.840747820 -170.579751137 +} +8516f40ffffffff +{ + 50.496150782 164.915750891 + 50.586236904 164.914041725 + 50.628899005 164.785688274 + 50.581404849 164.659268469 + 50.491335505 164.661350178 + 50.448743304 164.789479273 +} +85ee4d07fffffff +{ + -65.643297800 -56.626913653 + -65.597827023 -56.423664730 + -65.503982387 -56.415880572 + -65.455658347 -56.609800787 + -65.500854721 -56.812145304 + -65.594648387 -56.821472968 +} +8505922ffffffff +{ + 66.591219674 122.185630732 + 66.519461778 122.343858060 + 66.536284387 122.578113065 + 66.625027435 122.655682077 + 66.697147382 122.497631420 + 66.680161449 122.261828538 +} +85c55da3fffffff +{ + -38.088859359 -27.449332261 + -38.170560867 -27.507230330 + -38.252640581 -27.448187064 + -38.252972205 -27.331052353 + -38.171161650 -27.273211940 + -38.089128575 -27.332448097 +} +85329b83fffffff +{ + 45.160925713 174.069503597 + 45.254597680 174.080265728 + 45.308872877 173.968577032 + 45.269386279 173.846211016 + 45.175683133 173.835757537 + 45.121497566 173.947361178 +} +85b29513fffffff +{ + -29.882891828 -80.940388609 + -29.953242240 -81.002503189 + -30.031126024 -80.959803679 + -30.038659473 -80.854962983 + -29.968320584 -80.792882106 + -29.890436753 -80.835608037 +} +85c76e33fffffff +{ + -37.619798086 -148.223642813 + -37.528523065 -148.191792875 + -37.462734410 -148.275291530 + -37.488160113 -148.390687079 + -37.579433792 -148.422740095 + -37.645283217 -148.339194733 +} +85c14d8ffffffff +{ + -29.803558443 0.309509825 + -29.895939252 0.283788443 + -29.962779289 0.362832973 + -29.937136523 0.467541468 + -29.844746700 0.493054297 + -29.778008517 0.414067369 +} +85c00113fffffff +{ + -34.873817769 -9.511309871 + -34.965798219 -9.550557232 + -35.039642299 -9.472954228 + -35.021406966 -9.356074207 + -34.929369100 -9.317021506 + -34.855623886 -9.394653746 +} +8568add7fffffff +{ + 3.927094733 116.606784656 + 4.015006298 116.590240562 + 4.040832775 116.509200616 + 3.978657434 116.444690316 + 3.890683630 116.461304586 + 3.864947375 116.542358985 +} +855731c3fffffff +{ + 24.780019116 -36.039427774 + 24.700072897 -36.090691194 + 24.618163577 -36.038623253 + 24.616086987 -35.935349494 + 24.695957777 -35.883957932 + 24.777980636 -35.935967942 +} +859c911bfffffff +{ + -5.770508790 149.099517736 + -5.861536386 149.113112168 + -5.892461017 149.199353365 + -5.832418113 149.271980646 + -5.741426350 149.258421458 + -5.710441597 149.172199708 +} +85915c97fffffff +{ + -8.551032230 -126.358789474 + -8.624937435 -126.390582131 + -8.678965322 -126.346927732 + -8.659137176 -126.271566805 + -8.585324127 -126.239800211 + -8.531247126 -126.283368427 +} +85e03693fffffff +{ + -60.469799519 68.529853017 + -60.376991446 68.519845017 + -60.336709065 68.358279061 + -60.389001828 68.206267484 + -60.481762537 68.215327845 + -60.522278466 68.377347313 +} +855531cffffffff +{ + 26.321817029 -12.389023282 + 26.251843914 -12.459888161 + 26.163262607 -12.430008442 + 26.144636493 -12.329450216 + 26.214499949 -12.258625420 + 26.303099048 -12.288318575 +} +851e8bc3fffffff +{ + 40.473161350 16.923840741 + 40.380436426 16.925486951 + 40.336671256 17.033662857 + 40.385593083 17.140340448 + 40.478342315 17.138914993 + 40.522145560 17.030591106 +} +8541096ffffffff +{ + 21.726275061 110.299963914 + 21.815927826 110.279268510 + 21.847723922 110.186904496 + 21.789823471 110.115238397 + 21.700116648 110.136009627 + 21.668364299 110.228371178 +} +85051137fffffff +{ + 76.661712278 117.058761505 + 76.594986034 117.359283283 + 76.621722208 117.757765345 + 76.715525196 117.859975794 + 76.782838243 117.559100021 + 76.755758593 117.156340729 +} +8500ed4ffffffff +{ + 86.736885406 30.180919230 + 86.798693633 31.329883441 + 86.888947316 30.929842470 + 86.916206349 29.306529294 + 86.852107554 28.156651257 + 86.763080493 28.629073285 +} +8560a5c7fffffff +{ + 14.703534307 77.959205656 + 14.790530220 77.931014811 + 14.807456513 77.842049754 + 14.737455203 77.781351332 + 14.650528618 77.809533452 + 14.633534009 77.898422818 +} +8516ce87fffffff +{ + 48.042712788 172.697613946 + 48.134616528 172.706936053 + 48.186676871 172.589024769 + 48.146745911 172.461902190 + 48.054819108 172.452920445 + 48.002846112 172.570720695 +} +85daa4a3fffffff +{ + -48.378635263 173.502156859 + -48.299793878 173.446230221 + -48.297136352 173.314186846 + -48.373368325 173.237729715 + -48.452307222 173.293539470 + -48.454916620 173.425923990 +} +85070823fffffff +{ + 69.027166130 -16.502993312 + 69.057502809 -16.707063718 + 69.001556757 -16.882481973 + 68.915511886 -16.853239738 + 68.885437152 -16.650141243 + 68.941146261 -16.475314533 +} +85e2190bfffffff +{ + -57.770315215 -130.689732016 + -57.735611336 -130.537369115 + -57.644796707 -130.522308458 + -57.588775908 -130.658993415 + -57.623410404 -130.810813843 + -57.714134759 -130.826490684 +} +8557284ffffffff +{ + 22.937096061 -31.890014660 + 22.859097211 -31.944662271 + 22.776042441 -31.896591810 + 22.770881952 -31.793956938 + 22.848789521 -31.739209858 + 22.931948874 -31.787196793 +} +85f15ab3fffffff +{ + -81.826230260 46.416643002 + -81.752929865 46.011591622 + -81.765437126 45.387442079 + -81.851587000 45.156459129 + -81.925775835 45.559112865 + -81.912921881 46.195293304 +} +8588e967fffffff +{ + -0.290935924 -159.473623256 + -0.377125709 -159.500517909 + -0.445707387 -159.437134732 + -0.428162922 -159.346824394 + -0.341979444 -159.319858947 + -0.273334052 -159.383274544 +} +85ec5b9bfffffff +{ + -76.379288192 126.991496096 + -76.331266644 126.675975629 + -76.372920750 126.325926282 + -76.462969550 126.289071065 + -76.511403000 126.606372705 + -76.469373109 126.958752146 } 85032623fffffff { @@ -16116,3968 +14458,6424 @@ 89.869343407 -68.541640464 89.872827683 -25.830927255 } -85a90e97fffffff +85a38a57fffffff +{ + -22.585751132 43.793717767 + -22.493617098 43.792881562 + -22.451254966 43.707740205 + -22.501051255 43.623337269 + -22.593247302 43.624104016 + -22.635585096 43.709343212 +} +855498affffffff +{ + 11.502277793 -21.864215716 + 11.435880115 -21.920122700 + 11.360362692 -21.885622906 + 11.351171464 -21.795326129 + 11.417458276 -21.739395311 + 11.493047109 -21.773784904 +} +8500d58ffffffff +{ + 83.264087066 81.366661960 + 83.250694365 82.143837599 + 83.324657535 82.638204151 + 83.413062045 82.350600567 + 83.426705996 81.554578844 + 83.351689209 81.065298747 +} +850649d3fffffff +{ + 58.720755858 -34.811263017 + 58.722515800 -34.976030313 + 58.645329115 -35.067971387 + 58.566619509 -34.995345613 + 58.564968829 -34.831357610 + 58.641918779 -34.739218517 +} +85234287fffffff +{ + 40.676028776 -173.625034784 + 40.767572710 -173.600434770 + 40.831530322 -173.690553081 + 40.803851935 -173.805329261 + 40.712215612 -173.829719922 + 40.648349982 -173.739544221 +} +85020517fffffff +{ + 79.946745133 -101.694551951 + 79.871370661 -101.978092412 + 79.795615516 -101.755198347 + 79.794737854 -101.252499669 + 79.869569847 -100.965666723 + 79.945821614 -101.184755797 +} +850f8427fffffff +{ + 67.483298594 -87.486702030 + 67.416708064 -87.668540691 + 67.323766644 -87.610253746 + 67.297257739 -87.371565752 + 67.363544519 -87.189743458 + 67.456643148 -87.246587343 +} +85d9b417fffffff +{ + -51.110074838 153.195540203 + -51.022920298 153.161611281 + -50.996586533 153.019581386 + -51.057354206 152.911172464 + -51.144545633 152.944759348 + -51.170932687 153.087097794 +} +85e64aabfffffff +{ + -62.634632891 -1.768132192 + -62.545926469 -1.737191046 + -62.486615754 -1.892922749 + -62.515711161 -2.079882790 + -62.604350675 -2.111975818 + -62.663962549 -1.955958912 +} +85057513fffffff +{ + 84.057268687 130.359629248 + 83.978352373 130.865332278 + 83.983628053 131.779692778 + 84.067954519 132.212972473 + 84.148055867 131.717419188 + 84.142642804 130.777978095 +} +8518f527fffffff +{ + 47.847419349 -14.345256938 + 47.781885031 -14.437519218 + 47.693860322 -14.395139864 + 47.671353149 -14.260812836 + 47.736800699 -14.168595146 + 47.824842039 -14.210659382 +} +85b753d3fffffff +{ + -30.368850520 -98.509169941 + -30.304225167 -98.438112927 + -30.218574360 -98.471730858 + -30.197440621 -98.576220947 + -30.261923931 -98.647335284 + -30.347682945 -98.613902639 +} +858e1e0bfffffff +{ + -11.975042531 -86.400118989 + -12.052555228 -86.459993716 + -12.142147610 -86.421230080 + -12.154221712 -86.322546648 + -12.076686649 -86.262673812 + -11.987099880 -86.301482367 +} +8504e20ffffffff +{ + 70.471083860 158.855290919 + 70.375092915 158.885462230 + 70.336074089 159.148021235 + 70.392720322 159.381995598 + 70.488778580 159.354227341 + 70.528125036 159.090077826 +} +85ef5a4ffffffff +{ + -73.816088895 -51.426251171 + -73.762940376 -51.135390652 + -73.666002664 -51.154596344 + -73.622182285 -51.461172092 + -73.674888365 -51.750533756 + -73.771854725 -51.734821479 +} +852473a3fffffff +{ + 45.664922878 108.910461942 + 45.577724931 108.907080064 + 45.535758268 109.003659118 + 45.580830382 109.103673653 + 45.667925057 109.107390091 + 45.710051016 109.010757830 +} +8570ad83fffffff +{ + 2.023503378 -172.260925638 + 1.940455766 -172.280715914 + 1.875437944 -172.220441990 + 1.893411845 -172.140298525 + 1.976500445 -172.120423901 + 2.041574215 -172.180777082 +} +853d6c67fffffff +{ + 38.908127843 89.692359154 + 38.818543763 89.720508268 + 38.795511625 89.833592829 + 38.861939326 89.918761720 + 38.951540634 89.890923660 + 38.974697230 89.777605349 +} +8556d433fffffff +{ + 7.902116606 -37.419463934 + 7.980871796 -37.370676821 + 8.062420363 -37.417334615 + 8.065257174 -37.512786826 + 7.986526934 -37.561603568 + 7.904934925 -37.514938603 +} +85058a9bfffffff +{ + 70.685289454 128.925427326 + 70.605776836 129.092087908 + 70.613016082 129.382095745 + 70.699856669 129.507893618 + 70.779775523 129.342072765 + 70.772447029 129.049600303 +} +85787677fffffff +{ + -0.534906452 -130.949388538 + -0.616746715 -130.982938658 + -0.681475305 -130.933194931 + -0.664404095 -130.849986865 + -0.582657962 -130.816453158 + -0.517888958 -130.866111017 +} +85032503fffffff +{ + 88.241141878 -2.504302380 + 88.328735206 -1.834783754 + 88.391253432 -4.252226955 + 88.361636646 -7.306495475 + 88.272569578 -7.706050566 + 88.214417865 -5.330991592 +} +85eaebb3fffffff +{ + -71.134302102 -171.579594323 + -71.206124036 -171.574210892 + -71.234240305 -171.351202865 + -71.190195944 -171.134686048 + -71.118374855 -171.141997728 + -71.090595854 -171.363899231 +} +8594413bfffffff +{ + -10.441762428 133.570891276 + -10.531431468 133.586866621 + -10.564653433 133.676105281 + -10.508220912 133.749398424 + -10.418521465 133.733436816 + -10.385284882 133.644168260 +} +85ec4063fffffff +{ + -76.967921261 139.791818902 + -76.937684665 139.436610695 + -76.995273888 139.125733145 + -77.083543980 139.169371868 + -77.114056659 139.527994158 + -77.056020822 139.839546170 +} +856d562bfffffff +{ + 10.420477526 -92.031613519 + 10.491557972 -91.973806269 + 10.572405283 -92.004169334 + 10.582158552 -92.092459295 + 10.510982053 -92.150305143 + 10.430148434 -92.119822533 +} +85004a83fffffff +{ + 85.001323033 -28.957027114 + 85.085141506 -29.207833334 + 85.109101460 -30.239520674 + 85.048440267 -30.992097660 + 84.965372615 -30.712761655 + 84.942198469 -29.708912511 +} +85079dc3fffffff +{ + 76.892677991 -34.022391246 + 76.904878160 -34.397288244 + 76.833941605 -34.609311417 + 76.751231584 -34.447395805 + 76.739177541 -34.076501459 + 76.809688507 -33.863548184 +} +85a92127fffffff +{ + -32.336547822 -52.582178436 + -32.276601675 -52.529953285 + -32.206850867 -52.576375069 + -32.197080557 -52.674963288 + -32.257040152 -52.727149861 + -32.326756610 -52.680786926 +} +85a05337fffffff +{ + -14.813751839 -142.245400862 + -14.727735574 -142.225192004 + -14.663620455 -142.293479861 + -14.685430064 -142.382039364 + -14.771450817 -142.402387554 + -14.835657590 -142.334036973 +} +850322d7fffffff +{ + 89.513746803 -149.069428948 + 89.446070979 -155.868486444 + 89.357098018 -152.908054154 + 89.329446726 -145.215402558 + 89.384753690 -138.714403147 + 89.478641783 -139.345724744 +} +85248323fffffff +{ + 36.996082797 98.738466786 + 36.909293766 98.751131133 + 36.880232717 98.849385201 + 36.937810194 98.935110714 + 37.024562668 98.922733823 + 37.053774417 98.824343968 +} +859b04c7fffffff +{ + -23.235330053 -173.044959455 + -23.151212682 -172.999321574 + -23.073759332 -173.052732246 + -23.080374873 -173.151658918 + -23.164387536 -173.197329062 + -23.241889317 -173.144040520 +} +85d619dbfffffff +{ + -48.267731406 35.264669196 + -48.202476967 35.267835830 + -48.172427588 35.166754651 + -48.207622318 35.062423586 + -48.272882773 35.059156227 + -48.302942567 35.160320669 +} +859e76b7fffffff +{ + -19.205188791 162.995346921 + -19.119204228 162.963876495 + -19.098595109 162.867970875 + -19.163952974 162.803370970 + -19.250028955 162.834727705 + -19.270655698 162.930798296 +} +850a1d83fffffff +{ + 64.769377556 93.414767963 + 64.734261755 93.612643079 + 64.786860143 93.774747845 + 64.874905326 93.739177612 + 64.910199983 93.540234636 + 64.857269796 93.377932881 +} +85154183fffffff +{ + 63.710248991 126.098356315 + 63.635675814 126.228650812 + 63.646088686 126.439954117 + 63.731180131 126.522248102 + 63.806077613 126.392273373 + 63.795558891 126.179679687 +} +85b203b7fffffff +{ + -27.638343856 -70.357911226 + -27.713179879 -70.413869907 + -27.788110225 -70.370652156 + -27.788185995 -70.271496385 + -27.713379490 -70.215622390 + -27.638467721 -70.258819336 +} +85519c47fffffff +{ + 18.348051351 -121.953908635 + 18.430174131 -121.908937027 + 18.510665716 -121.961167894 + 18.508941889 -122.058371056 + 18.426789816 -122.103224312 + 18.346390802 -122.050992949 +} +853b0207fffffff +{ + 36.971949962 -52.316513151 + 36.886810912 -52.352239694 + 36.817366469 -52.284327095 + 36.832963856 -52.180621001 + 36.918119919 -52.144658355 + 36.987661691 -52.212637712 +} +854b9bc3fffffff +{ + 19.054217444 123.506649084 + 18.968112578 123.523694075 + 18.943757897 123.612028510 + 19.005565630 123.683377890 + 19.091713393 123.666329576 + 19.116010579 123.577935136 +} +8525638bfffffff +{ + 54.028429807 106.067790683 + 53.938983043 106.069619228 + 53.893952203 106.191400336 + 53.938208872 106.311480282 + 54.027563370 106.310158933 + 54.072753693 106.188250969 +} +853ad503fffffff +{ + 22.449230753 -50.810581128 + 22.372072877 -50.842388321 + 22.300904332 -50.785815990 + 22.306773906 -50.697397504 + 22.383913724 -50.665425954 + 22.455202157 -50.722037112 +} +85009923fffffff +{ + 78.627255845 90.465359463 + 78.598258135 90.915208467 + 78.661720408 91.263846969 + 78.754845240 91.163014960 + 78.784174465 90.707383618 + 78.720043769 90.358409836 +} +85004d9bfffffff +{ + 83.049084777 -32.821949895 + 83.129134727 -33.046719260 + 83.146929805 -33.786547618 + 83.084221434 -34.286470861 + 83.004819435 -34.048456963 + 82.987470965 -33.323568248 +} +85b3940ffffffff +{ + -21.977984710 -81.057481284 + -22.053717136 -81.117949244 + -22.138391833 -81.076434668 + -22.147326804 -80.974426444 + -22.071599162 -80.913989748 + -21.986931794 -80.955529841 +} +85a15adbfffffff +{ + -21.324691486 -140.232227025 + -21.234758113 -140.212790667 + -21.170932947 -140.285243076 + -21.196962994 -140.377213160 + -21.286921194 -140.396806794 + -21.350824624 -140.324273116 +} +85692527fffffff +{ + 17.370094180 112.023073677 + 17.461132544 112.003496741 + 17.492623608 111.914011765 + 17.433019006 111.844100915 + 17.341919862 111.863752944 + 17.310486074 111.953240764 +} +85ced46bfffffff +{ + -37.556108319 -75.422399191 + -37.481225443 -75.381139429 + -37.407860004 -75.441518887 + -37.409223293 -75.543155105 + -37.484057516 -75.584653976 + -37.557577274 -75.524277905 +} +857a5a3bfffffff +{ + 4.227147607 37.609895092 + 4.314629110 37.611461174 + 4.363158783 37.533318658 + 4.324251021 37.453551038 + 4.236741820 37.451924968 + 4.188167995 37.530126522 +} +85ca6983fffffff +{ + -36.788599303 68.800136996 + -36.880197009 68.821357438 + -36.912352147 68.933207381 + -36.852872139 69.023711012 + -36.761279781 69.002318815 + -36.729161968 68.890594567 +} +85be6e57fffffff +{ + -37.968787726 143.618377549 + -37.873497762 143.602115583 + -37.836361498 143.490698199 + -37.894421127 143.395401289 + -37.989694282 143.411403695 + -38.026924778 143.522962667 +} +85f00e97fffffff +{ + -78.750657431 64.455582480 + -78.699284762 64.070377746 + -78.736140807 63.670929255 + -78.824945237 63.653044720 + -78.876882637 64.041057860 + -78.839446383 64.444153916 +} +8518368ffffffff +{ + 56.177172284 -15.017704315 + 56.118054174 -15.123537450 + 56.037041904 -15.073517159 + 56.015114845 -14.918076747 + 56.074137753 -14.812291243 + 56.155182731 -14.861897701 +} +85f2b3b7fffffff +{ + -87.059213049 -176.565716186 + -87.149135394 -176.686159811 + -87.195046857 -175.127481947 + -87.148622108 -173.493797944 + -87.058460414 -173.472246015 + -87.014893622 -174.985248042 +} +8517286bfffffff +{ + 63.035881859 159.123135372 + 62.943649765 159.144032200 + 62.906547477 159.333792152 + 62.961423966 159.503479208 + 63.053703391 159.483840912 + 63.091059953 159.293255627 +} +85be61cbfffffff +{ + -39.001590530 144.868295858 + -38.906431774 144.850207787 + -38.870249385 144.736166664 + -38.929136720 144.640057634 + -39.024285752 144.657880190 + -39.060557338 144.772077427 +} +854eb2abfffffff +{ + 27.303714160 158.981896259 + 27.398244202 158.974315132 + 27.441268082 158.878552992 + 27.389701585 158.790528210 + 27.295225890 158.798300257 + 27.252262216 158.893906321 +} +85294007fffffff +{ + 35.363391886 -132.363878068 + 35.446794920 -132.324426181 + 35.513972656 -132.386017926 + 35.497693651 -132.486993573 + 35.414327910 -132.526259628 + 35.347203840 -132.464736001 +} +85f2594ffffffff +{ + -73.784423157 -106.495113107 + -73.814170599 -106.196816927 + -73.754322754 -105.944687030 + -73.665172410 -105.991663544 + -73.635792234 -106.287701964 + -73.695197267 -106.539013600 +} +850d306bfffffff +{ + 74.014798952 -163.608034777 + 73.932813565 -163.780861020 + 73.851522471 -163.618009810 + 73.851835698 -163.284239831 + 73.933367286 -163.109924441 + 74.015039068 -163.270845056 +} +8524140bfffffff +{ + 43.547061349 97.791826931 + 43.456372740 97.807726847 + 43.423851350 97.919414710 + 43.481865992 98.015384914 + 43.572515014 97.999849491 + 43.605189203 97.887979340 +} +8564cc23fffffff +{ + 14.988839633 87.483020352 + 15.080275489 87.455396642 + 15.101633723 87.359887240 + 15.031587227 87.292067301 + 14.940192391 87.319710665 + 14.918802992 87.415154441 +} +8503368bfffffff +{ + 86.892685244 162.462141087 + 86.799249907 162.536780628 + 86.753636771 164.024765634 + 86.799457027 165.482944748 + 86.892957822 165.495895025 + 86.940635057 163.963009358 +} +85151eb7fffffff +{ + 55.899321591 116.713535717 + 55.838589383 116.830080678 + 55.859025667 116.983133097 + 55.940357777 117.020261145 + 56.001351226 116.903648290 + 55.980750806 116.749973806 +} +850ef407fffffff +{ + 56.823798977 -84.140813539 + 56.761192758 -84.275344358 + 56.665921783 -84.243039365 + 56.633157131 -84.076961602 + 56.695528102 -83.942534860 + 56.790898483 -83.974080265 +} +8524230bfffffff +{ + 46.778897625 101.085335338 + 46.688113236 101.096030698 + 46.650997349 101.209262435 + 46.704507513 101.311959833 + 46.795229424 101.301664551 + 46.832503865 101.188271915 +} +85c73653fffffff +{ + -49.868271830 -141.860377339 + -49.843044976 -141.736088642 + -49.755506216 -141.704514862 + -49.693338704 -141.796918876 + -49.718577024 -141.920778656 + -49.805971342 -141.952662376 +} +852cc053fffffff +{ + 36.778997940 53.103288106 + 36.706797101 53.177256746 + 36.719756873 53.289106804 + 36.805019191 53.327243212 + 36.877371267 53.253262416 + 36.864309606 53.141156942 +} +850894c7fffffff +{ + 57.820367718 16.763502017 + 57.746898678 16.765804004 + 57.714436838 16.903356779 + 57.755384569 17.038848259 + 57.828866135 17.036902852 + 57.861387644 16.899109203 +} +851f9e27fffffff +{ + 45.210452677 7.209358610 + 45.124066441 7.221325930 + 45.093209753 7.335152293 + 45.148735966 7.437243514 + 45.235180897 7.425490289 + 45.266041038 7.311431427 +} +85ad3207fffffff +{ + -32.903655439 17.863851379 + -32.819422515 17.874059190 + -32.765262905 17.788221837 + -32.795327517 17.692210597 + -32.879525270 17.681936601 + -32.933693661 17.767739929 +} +85b429bbfffffff +{ + -29.114570282 -161.791265959 + -29.024459773 -161.749857020 + -28.947894277 -161.818175038 + -28.961371797 -161.927835920 + -29.051414885 -161.969354725 + -29.128047911 -161.901103112 +} +8541706bfffffff +{ + 19.667225997 109.753813284 + 19.758047871 109.733004342 + 19.789283086 109.640815797 + 19.729649662 109.569440384 + 19.638775338 109.590323549 + 19.607586851 109.682507953 +} +85c8296ffffffff +{ + -43.046358047 107.491573925 + -42.975743170 107.413675041 + -42.986637711 107.287999685 + -43.068207845 107.239817212 + -43.139015111 107.317619382 + -43.128059696 107.443701666 +} +8527b267fffffff +{ + 49.225398659 -110.749161008 + 49.149736527 -110.806626755 + 49.074206391 -110.731647370 + 49.074130889 -110.599323952 + 49.149672209 -110.541494585 + 49.225410055 -110.616351054 +} +8569560bfffffff +{ + 12.341555750 116.869367124 + 12.431309095 116.852499370 + 12.461854587 116.769520128 + 12.402568192 116.703392728 + 12.312739752 116.720334571 + 12.282272794 116.803329731 +} +8565b143fffffff +{ + 11.629959952 106.569635312 + 11.723440401 106.547952570 + 11.751909153 106.455770690 + 11.686845705 106.385285233 + 11.593329903 106.407034511 + 11.564912854 106.499202776 +} +85e063d3fffffff +{ + -60.257823120 47.257683167 + -60.174478384 47.306882922 + -60.116244047 47.199800109 + -60.141143439 47.043704724 + -60.224289064 46.993914655 + -60.282734514 47.100807850 +} +85a2ee67fffffff +{ + -24.970885795 55.330742395 + -25.064746367 55.338716230 + -25.105065166 55.429496740 + -25.051433090 55.512274564 + -24.957514295 55.504155390 + -24.917285724 55.413403774 +} +85a6b12ffffffff +{ + -18.836168872 116.064372819 + -18.912928689 116.080060525 + -18.949167756 116.156972763 + -18.908640432 116.218260405 + -18.831811140 116.202559523 + -18.795578637 116.125584136 +} +85ea96abfffffff +{ + -60.444269181 175.373873114 + -60.379237254 175.301656438 + -60.384128333 175.137869520 + -60.454081720 175.045771179 + -60.519208391 175.117837693 + -60.514286882 175.282154141 +} +85a4c62bfffffff +{ + -27.772844754 -28.895202791 + -27.854025758 -28.947016306 + -27.932727224 -28.896908746 + -27.930191298 -28.794831091 + -27.848887564 -28.743051616 + -27.770242568 -28.793315440 +} +85d942b7fffffff +{ + -56.113856148 129.441174526 + -56.061162246 129.302342911 + -56.101730605 129.155585377 + -56.195208821 129.147289825 + -56.248083418 129.286511447 + -56.207298576 129.433638575 +} +85999cc7fffffff +{ + -12.959475591 -15.761978741 + -13.037616938 -15.797851093 + -13.103003100 -15.742011863 + -13.090141798 -15.650245737 + -13.011910342 -15.614465984 + -12.946630265 -15.670359528 +} +85030623fffffff +{ + 87.065083707 -123.573096712 + 87.033590156 -125.241837398 + 86.940965305 -125.546452900 + 86.880783932 -124.269052192 + 86.910918261 -122.674425311 + 87.002541672 -122.284951743 +} +85494eb7fffffff +{ + 22.103139042 -117.711797847 + 22.186622368 -117.661410143 + 22.269699068 -117.713812213 + 22.269211865 -117.816628364 + 22.185691658 -117.866907895 + 22.102695500 -117.814479691 +} +857e9d53fffffff +{ + 4.031258993 178.227726313 + 3.953080128 178.213924500 + 3.893592367 178.268220173 + 3.912241707 178.336410233 + 3.990488058 178.350289053 + 4.050017603 178.295900768 +} +852c6377fffffff +{ + 46.333172116 49.949483716 + 46.263755312 50.039339778 + 46.284011920 50.167895037 + 46.373807392 50.206918626 + 46.443369101 50.117000134 + 46.422990207 49.988119927 +} +859b6443fffffff +{ + -22.162269251 179.226047174 + -22.083721114 179.273454863 + -22.007609581 179.229949877 + -22.010022078 179.139179334 + -22.088458242 179.091783265 + -22.164593795 179.135145952 +} +855d1073fffffff +{ + 19.871543389 -155.890462671 + 19.779937275 -155.921523556 + 19.709624875 -155.852750060 + 19.730898240 -155.752897188 + 19.822512081 -155.721762286 + 19.892844881 -155.790554135 +} +85396143fffffff +{ + 43.518864761 2.562407330 + 43.433083338 2.578554135 + 43.406097154 2.687893697 + 43.464909784 2.781326126 + 43.550767210 2.765359565 + 43.577736083 2.655779970 +} +8532b4bbfffffff +{ + 38.824114407 179.115273025 + 38.919260755 179.131184017 + 38.978384632 179.033864273 + 38.942263006 178.920651805 + 38.847055640 178.904982191 + 38.788030777 179.002283355 +} +85e95dd7fffffff +{ + -59.390882509 -99.471703382 + -59.321317343 -99.347682872 + -59.234301921 -99.403488938 + -59.216735013 -99.582752636 + -59.286138149 -99.706916157 + -59.373269989 -99.651675098 +} +85c80a5bfffffff +{ + -39.347246873 106.444070424 + -39.278938998 106.373515859 + -39.288086312 106.257067134 + -39.365591170 106.210822480 + -39.434079459 106.281281544 + -39.424882351 106.398081513 +} +8599134bfffffff +{ + -9.252407607 -11.947138082 + -9.326997997 -11.978612627 + -9.388126666 -11.922053972 + -9.374557467 -11.833990668 + -9.299892713 -11.802616970 + -9.238871460 -11.859205539 +} +855b9337fffffff +{ + 16.077849709 -177.928956468 + 16.163004347 -177.914162791 + 16.212789724 -177.985989343 + 16.177301409 -178.072616957 + 16.092077560 -178.087277871 + 16.042411147 -178.015444100 +} +850f9887fffffff +{ + 64.529043387 -92.278657420 + 64.457367173 -92.428354608 + 64.365768058 -92.361034683 + 64.345658159 -92.145036868 + 64.417064763 -91.995132060 + 64.508850416 -92.061427952 +} +85631057fffffff +{ + 15.211198207 54.635689655 + 15.132631681 54.611802689 + 15.081061568 54.662272136 + 15.107975713 54.736540083 + 15.186423763 54.760464902 + 15.238076072 54.710084065 +} +85131403fffffff +{ + 66.195294561 -130.039358488 + 66.107298452 -130.062909719 + 66.051658634 -129.900622436 + 66.083797902 -129.714256802 + 66.171824493 -129.689418925 + 66.227682113 -129.852232511 +} +85e04c0ffffffff +{ + -57.576488750 44.215227376 + -57.496704446 44.266883913 + -57.439378278 44.176899640 + -57.461648925 44.035478097 + -57.541234716 43.983390974 + -57.598748374 44.073154080 +} +851ae2cbfffffff +{ + 44.996337260 -44.568952719 + 44.911468414 -44.621744693 + 44.838899161 -44.548772080 + 44.851104057 -44.423003724 + 44.935956533 -44.369939553 + 45.008620579 -44.442915421 +} +85e75e8ffffffff +{ + -68.907540706 15.095134276 + -68.816027738 15.060227598 + -68.777869801 14.825246345 + -68.830991508 14.623725576 + -68.922652378 14.656747661 + -68.961044887 14.893179556 +} +85994603fffffff +{ + -9.069043250 -2.926439534 + -9.143474598 -2.949898759 + -9.202452690 -2.888380606 + -9.186889620 -2.803422530 + -9.112415770 -2.780089492 + -9.053547376 -2.841588218 +} +850d43a3fffffff +{ + 65.958614825 -141.527624860 + 65.902698557 -141.697206697 + 65.820376145 -141.672726646 + 65.793939585 -141.480014618 + 65.849553225 -141.310862719 + 65.931905051 -141.333991094 +} +85df214ffffffff +{ + -62.460867974 -66.192394820 + -62.429025193 -66.002713204 + -62.339771732 -65.963563853 + -62.282511204 -66.113017272 + -62.314190191 -66.301731645 + -62.403292808 -66.341956994 +} +85c325c7fffffff +{ + -44.390025708 -66.788800307 + -44.311355176 -66.759289980 + -44.246074711 -66.832269501 + -44.259331365 -66.934848060 + -44.338012372 -66.964673731 + -44.403426440 -66.891605740 +} +85ad9cabfffffff +{ + -24.767169095 19.308223754 + -24.675377520 19.317515934 + -24.619572528 19.233917440 + -24.655538725 19.141050483 + -24.747288617 19.131694422 + -24.803114066 19.215269114 +} +85492b47fffffff +{ + 17.075285669 -111.503541133 + 17.156148515 -111.450145685 + 17.240964793 -111.497578880 + 17.244844394 -111.598466733 + 17.163916722 -111.651792575 + 17.079174273 -111.604300407 +} +850eb0dbfffffff +{ + 62.037082870 -97.142783500 + 61.961404273 -97.267041827 + 61.872328006 -97.191730373 + 61.858720615 -96.992882380 + 61.934163160 -96.868268881 + 62.023448953 -96.942854491 +} +85bc7327fffffff +{ + -33.521049758 25.218980820 + -33.435732330 25.226284852 + -33.386290443 25.135632808 + -33.422160449 25.037666743 + -33.507465208 25.030283744 + -33.556912724 25.120945716 +} +85932587fffffff +{ + 0.240492154 -101.160061532 + 0.168044915 -101.215958498 + 0.085276966 -101.185546614 + 0.074935628 -101.099159078 + 0.147443973 -101.043201531 + 0.230232495 -101.073692042 +} +856155c7fffffff +{ + 4.576280094 75.006735215 + 4.662740342 74.979607172 + 4.683765546 74.896365107 + 4.618395707 74.840322288 + 4.532027149 74.867434972 + 4.510936774 74.950605912 +} +85f02817fffffff +{ + -81.097168378 60.053004782 + -81.039849361 59.587996005 + -81.072053975 59.058977347 + -81.162215625 58.987766134 + -81.220304232 59.455795290 + -81.187454645 59.992058370 +} +85f175dbfffffff +{ + -87.952533524 73.492460328 + -87.913221520 71.179396752 + -87.963959167 69.097236020 + -88.057316256 69.254266729 + -88.099291015 71.705063991 + -88.045106009 73.858033333 +} +858c305bfffffff +{ + -8.752015009 108.524444965 + -8.670098248 108.504905332 + -8.650479778 108.419739204 + -8.712846069 108.354119455 + -8.794773808 108.373719921 + -8.814324358 108.458879347 +} +85052587fffffff +{ + 80.685385626 90.659118197 + 80.656651009 91.206972186 + 80.720378608 91.634566457 + 80.813643618 91.514981125 + 80.842796203 90.958557033 + 80.778260388 90.530365769 +} +85116817fffffff +{ + 69.629167472 39.717015581 + 69.666850994 39.912515333 + 69.745583287 39.891442518 + 69.786529339 39.673101217 + 69.748482875 39.476973231 + 69.669854518 39.499812628 +} +851340affffffff +{ + 63.575363543 -105.826866544 + 63.493489843 -105.930581089 + 63.411336547 -105.828152677 + 63.410803489 -105.622488228 + 63.492484756 -105.518071171 + 63.574891675 -105.620016374 +} +853285affffffff +{ + 40.453629756 173.680163376 + 40.549613263 173.689765728 + 40.604389270 173.584727271 + 40.563089346 173.470165149 + 40.467075089 173.460835028 + 40.412391328 173.565794608 +} +85054c83fffffff +{ + 83.216353947 175.839097664 + 83.122723623 175.693509033 + 83.059413518 176.293511365 + 83.088640102 177.041237173 + 83.181815731 177.204124050 + 83.246230315 176.602164836 +} +85def2c3fffffff +{ + -51.580091647 -44.212844999 + -51.526382743 -44.102924462 + -51.446170465 -44.127773160 + -51.419592344 -44.261976753 + -51.473066878 -44.371783947 + -51.553353449 -44.347501708 +} +852274c3fffffff +{ + 44.903638629 -173.319745541 + 44.993066467 -173.293285360 + 45.057318296 -173.388468267 + 45.032055482 -173.510179927 + 44.942539037 -173.536406674 + 44.878373916 -173.441155755 +} +85056313fffffff +{ + 84.963989530 152.978350216 + 84.871255009 153.195956708 + 84.839879958 154.207348150 + 84.900304041 155.027455555 + 84.993583749 154.842052663 + 85.025915171 153.803954224 +} +85dcdedbfffffff +{ + -45.559582540 -14.746499966 + -45.646058884 -14.798191835 + -45.720893420 -14.714628059 + -45.709168469 -14.579266439 + -45.622619228 -14.527786096 + -45.547867765 -14.611455122 +} +8500ea13fffffff +{ + 86.556140469 58.652401398 + 86.579325191 60.118640637 + 86.669420653 60.546307382 + 86.737362013 59.443565442 + 86.713031354 57.912463930 + 86.621943130 57.550632171 +} +85eea5a3fffffff +{ + -74.678045728 -16.535154742 + -74.588879392 -16.390914165 + -74.510939574 -16.608129929 + -74.521663768 -16.968542268 + -74.610465144 -17.115501245 + -74.688908339 -16.899355886 +} +85cd501bfffffff +{ + -48.317667250 82.529817746 + -48.231579625 82.491772755 + -48.213232891 82.358026802 + -48.280841514 82.261893583 + -48.367003236 82.299474188 + -48.385482571 82.433653285 +} +8550ce4bfffffff +{ + 29.498795070 -131.853415844 + 29.582766531 -131.815443533 + 29.653955589 -131.873798072 + 29.641104389 -131.970066516 + 29.557162683 -132.007872566 + 29.486042371 -131.949576553 +} +8524d35bfffffff +{ + 35.798212644 104.192782565 + 35.714458430 104.196835559 + 35.682970384 104.284922209 + 35.735081356 104.369035306 + 35.818772201 104.365238725 + 35.850415596 104.277072773 +} +8528d343fffffff +{ + 49.152829397 -120.926252889 + 49.226368576 -120.864941760 + 49.289920517 -120.934247511 + 49.279885342 -121.064875822 + 49.206331584 -121.125982610 + 49.142827534 -121.056665901 +} +8500f443fffffff +{ + 81.196192566 64.356549760 + 81.208862716 64.940217442 + 81.294902255 65.153207865 + 81.368774443 64.774150912 + 81.355767743 64.179992462 + 81.269229439 63.975500356 +} +85e0b1b7fffffff +{ + -53.491657036 69.715019852 + -53.401900530 69.703927109 + -53.366952928 69.570121158 + -53.421555880 69.447081686 + -53.511279657 69.457540789 + -53.546433655 69.591673061 +} +85b145d3fffffff +{ + -27.551816936 -126.725377532 + -27.506782498 -126.638293774 + -27.422609092 -126.634548837 + -27.383521038 -126.717670874 + -27.428461816 -126.804593395 + -27.512584140 -126.808554973 +} +855c325bfffffff +{ + 14.301289779 -155.093785488 + 14.208750770 -155.124495392 + 14.136725209 -155.057411801 + 14.157205665 -154.959605013 + 14.249742327 -154.928826779 + 14.321800933 -154.995923530 +} +85ef35cbfffffff +{ + -86.349683603 -45.373863791 + -86.290935978 -44.223946401 + -86.198405324 -44.471346776 + -86.163990088 -45.809458262 + -86.220740836 -46.944673497 + -86.313863308 -46.757233581 +} +85002ea3fffffff +{ + 78.876695421 25.084099776 + 78.937780615 25.376360136 + 79.020061944 25.219572564 + 79.040787948 24.765471707 + 78.979049640 24.474218716 + 78.897240541 24.636008200 +} +854a2563fffffff +{ + 27.169261773 129.570000453 + 27.089125415 129.587162933 + 27.065577647 129.680192763 + 27.122202055 129.756106046 + 27.202352273 129.738951353 + 27.225864295 129.645875511 +} +85005ea7fffffff +{ + 86.003072382 -0.259626082 + 86.087914601 0.073604239 + 86.152544882 -0.894988974 + 86.130397323 -2.196634620 + 86.044717770 -2.483358739 + 85.981995129 -1.515910942 +} +85f36887fffffff +{ + -69.336632836 -140.731881434 + -69.322824262 -140.515448922 + -69.245789231 -140.464160152 + -69.182700995 -140.628327090 + -69.196466563 -140.843478625 + -69.273363031 -140.895739281 +} +8581102bfffffff +{ + -11.874108225 -39.155769358 + -11.791592511 -39.105212443 + -11.708199264 -39.153161617 + -11.707319828 -39.251667833 + -11.789847201 -39.302248393 + -11.873242346 -39.254299239 +} +8515ae83fffffff +{ + 52.951766596 116.013979085 + 52.893792706 116.121224698 + 52.913623775 116.259985379 + 52.991583708 116.292005535 + 53.049798015 116.184688062 + 53.029811518 116.045421236 +} +8549152bfffffff +{ + 16.499384451 -106.688807128 + 16.578833125 -106.632590248 + 16.664592168 -106.676785797 + 16.670843111 -106.777281656 + 16.591317636 -106.833456784 + 16.505618048 -106.789178033 +} +85de5447fffffff +{ + -51.050587286 -55.153380569 + -51.008463887 -55.031779418 + -50.928531764 -55.030342102 + -50.890742127 -55.149935569 + -50.932673398 -55.271228011 + -51.012585951 -55.273235583 +} +85320243fffffff +{ + 35.944499269 170.546689659 + 36.041799913 170.552037968 + 36.094191263 170.450427795 + 36.049191082 170.343569236 + 35.951877051 170.338469105 + 35.899576415 170.439979274 +} +85480dd7fffffff +{ + 25.883330188 -111.330541143 + 25.965863198 -111.273208339 + 26.051730848 -111.323916824 + 26.055005853 -111.432027141 + 25.972423141 -111.489281122 + 25.886615129 -111.438503900 +} +85ecda37fffffff +{ + -68.511161076 117.380647076 + -68.446710190 117.192447367 + -68.474825453 116.943420669 + -68.567587258 116.881142713 + -68.632349128 117.069548504 + -68.604037209 117.320031391 +} +8503862bfffffff +{ + 79.437270669 -153.933724422 + 79.364668947 -154.260525794 + 79.275812293 -154.094488665 + 79.259170241 -153.607765982 + 79.331069964 -153.280109402 + 79.420310507 -153.439967201 +} +85f1290bfffffff +{ + -86.987330820 107.001990605 + -87.000520585 105.285201797 + -87.083608051 104.670642866 + -87.155067825 105.844462579 + -87.140869982 107.651910852 + -87.056256621 108.191883034 +} +855b505bfffffff +{ + 9.936703506 171.203130732 + 10.016993112 171.207705091 + 10.059820045 171.132257626 + 10.022254459 171.052287898 + 9.941949620 171.047851247 + 9.899225460 171.123246575 +} +85f20d23fffffff +{ + -76.930834516 -128.321938698 + -76.988879506 -128.043195710 + -76.959213694 -127.666552561 + -76.871752538 -127.572712115 + -76.814277306 -127.851315419 + -76.843695746 -128.223924408 +} +850306dbfffffff +{ + 87.384254405 -142.987373716 + 87.325897227 -144.532532484 + 87.232687809 -144.216233481 + 87.197115470 -142.465827888 + 87.252913660 -140.952121765 + 87.346768451 -141.155687779 +} +8504132ffffffff +{ + 71.358972116 144.750151375 + 71.267516019 144.851989304 + 71.249662265 145.149550576 + 71.323105834 145.347774907 + 71.414838330 145.248041649 + 71.432851909 144.947965587 +} +852d60dbfffffff +{ + 48.169641658 36.675402802 + 48.086585836 36.655533709 + 48.028629888 36.758363865 + 48.053671407 36.881023788 + 48.136673665 36.901110658 + 48.194688090 36.798320251 +} +85066c67fffffff +{ + 59.979004336 -28.807249799 + 59.988938307 -28.970900133 + 59.917713014 -29.077199287 + 59.836789933 -29.019883843 + 59.827011216 -28.856980463 + 59.898000749 -28.750647681 +} +85b0030bfffffff +{ + -25.397057204 -116.351999739 + -25.345476933 -116.270663880 + -25.261591153 -116.280176819 + -25.229276065 -116.370807372 + -25.280728132 -116.452052681 + -25.364623293 -116.442758052 +} +85588c9bfffffff +{ + 8.254207723 5.120406969 + 8.172173250 5.130101417 + 8.131832553 5.208131460 + 8.173485470 5.276582234 + 8.255587305 5.266984477 + 8.295968925 5.188839139 +} +850e6e6bfffffff +{ + 53.097620520 -66.397471722 + 53.056215793 -66.541877349 + 52.961214551 -66.555449490 + 52.907680695 -66.425271392 + 52.948931405 -66.281323769 + 53.043869523 -66.267096905 +} +85855e57fffffff +{ + -1.087454750 66.281758065 + -1.167604278 66.296020251 + -1.193699385 66.379068961 + -1.139574376 66.447793229 + -1.059440355 66.433430835 + -1.033415726 66.350444325 +} +85181443fffffff +{ + 54.019875821 -16.781648773 + 53.957072652 -16.881916067 + 53.874462174 -16.830983761 + 53.854618474 -16.680152245 + 53.917328470 -16.579900157 + 53.999975173 -16.630463573 +} +85ef1003fffffff +{ + -82.908026450 -21.700160083 + -82.823380713 -21.334299449 + -82.742500819 -21.738467586 + -82.745304935 -22.500957459 + -82.829050910 -22.876406817 + -82.910893627 -22.480043167 +} +85e7658ffffffff +{ + -75.805007822 16.651644709 + -75.711228662 16.589602485 + -75.676123089 16.237104490 + -75.734479870 15.943304880 + -75.828479712 16.001239590 + -75.863904714 16.357098331 +} +8516e5cbfffffff +{ + 52.499141970 169.492482102 + 52.587416933 169.497661918 + 52.634135936 169.368003496 + 52.592495266 169.233341603 + 52.504213819 169.228561642 + 52.457579275 169.358043611 +} +85274ebbfffffff +{ + 43.715588726 -86.029281394 + 43.657529591 -86.124290779 + 43.570320918 -86.097341872 + 43.541075569 -85.975770599 + 43.598936748 -85.880787229 + 43.686240967 -85.907348446 +} +85ef3613fffffff +{ + -86.510748549 -19.969604589 + -86.426245729 -19.283989109 + -86.348854237 -20.120572123 + -86.354018860 -21.616844475 + -86.436772461 -22.342837975 + -86.516118069 -21.534244247 +} +8521636ffffffff +{ + 55.596280833 71.186380282 + 55.512084161 71.264387348 + 55.507544607 71.433960665 + 55.587187060 71.526151727 + 55.671512753 71.448509553 + 55.676067030 71.278309530 +} +855796a3fffffff +{ + 19.080938854 -45.205634735 + 19.005701355 -45.243181176 + 18.931890166 -45.190000468 + 18.933193195 -45.099267560 + 19.008383248 -45.061576248 + 19.082317832 -45.114762526 +} +8555552ffffffff +{ + 19.086173677 -7.541667849 + 19.021465834 -7.608078079 + 18.939310439 -7.585936770 + 18.921857619 -7.497548412 + 18.986455771 -7.431200050 + 19.068616296 -7.453178094 +} +8500f533fffffff +{ + 82.891125538 59.831043701 + 82.911386633 60.541067769 + 83.000152188 60.749565142 + 83.069147905 60.233569081 + 83.048335638 59.508517632 + 82.959087164 59.314679463 +} +85f03473fffffff +{ + -80.061126011 93.183806323 + -79.981791577 92.958144303 + -79.971655213 92.435139803 + -80.040726190 92.130640420 + -80.120538686 92.351262980 + -80.130803688 92.881494738 +} +85a7ac53fffffff +{ + -26.285042121 117.765544921 + -26.204573299 117.777859266 + -26.162190100 117.715570700 + -26.200160510 117.641018221 + -26.280514879 117.628592190 + -26.323013265 117.690830116 +} +85194b37fffffff +{ + 49.787365844 1.449409415 + 49.739501063 1.350077046 + 49.653100019 1.368259547 + 49.614623486 1.485425559 + 49.662445410 1.584531589 + 49.748786579 1.566697842 +} +85119817fffffff +{ + 52.967836355 40.604002199 + 52.910998153 40.712680355 + 52.943893414 40.845092249 + 53.033779931 40.869107986 + 53.090731677 40.760193917 + 53.057683089 40.627499879 +} +85729e67fffffff +{ + -6.543359485 135.235397240 + -6.635939358 135.251302443 + -6.669518582 135.341285974 + -6.610532838 135.415389328 + -6.517929943 135.399500805 + -6.484335750 135.309492180 +} +8563b3abfffffff +{ + 11.771692841 50.765527773 + 11.692571881 50.743918594 + 11.643659760 50.798037068 + 11.673775027 50.873689976 + 11.752787325 50.895349758 + 11.801792979 50.841306175 +} +85034b7bfffffff +{ + 77.292270625 -66.855528475 + 77.255835664 -67.235473521 + 77.166891327 -67.266744223 + 77.114478342 -66.922634846 + 77.150537014 -66.545805813 + 77.239382051 -66.509981418 +} +8513362ffffffff +{ + 67.867187279 -131.082080898 + 67.778817692 -131.103181950 + 67.725033527 -130.927588289 + 67.759397441 -130.730242323 + 67.847806760 -130.707663136 + 67.901813317 -130.883907399 +} +850d9323fffffff +{ + 65.054531325 178.730243563 + 64.964286963 178.679187175 + 64.903139605 178.839027951 + 64.931897054 179.049955985 + 65.021955791 179.102281866 + 65.083443454 178.942414620 +} +8576b65bfffffff +{ + -6.593055463 151.406744591 + -6.682687020 151.419786530 + -6.712530117 151.504309046 + -6.652808842 151.575763574 + -6.563220266 151.562758617 + -6.533309930 151.478262121 +} +8505306ffffffff +{ + 76.465227110 103.345207297 + 76.416612711 103.693804583 + 76.463365391 104.044416755 + 76.559246991 104.048794493 + 76.608336871 103.697619000 + 76.561066157 103.344645502 +} +85122ccbfffffff +{ + 61.322648744 -115.438172275 + 61.237516527 -115.504281732 + 61.164246914 -115.389657293 + 61.175861682 -115.209003298 + 61.260890799 -115.142087975 + 61.334408688 -115.256629705 +} +85ef2573fffffff +{ + -84.310087239 -78.404812399 + -84.300325155 -77.464811594 + -84.213099718 -77.105396705 + -84.136601333 -77.668083084 + -84.146108109 -78.582321735 + -84.232363096 -78.959164630 +} +85a2cd3bfffffff +{ + -26.466989631 57.959783752 + -26.561647640 57.970106049 + -26.601207638 58.064774519 + -26.546026924 58.149075706 + -26.451322690 58.138601637 + -26.411845307 58.043978164 +} +85079e5bfffffff +{ + 78.713153003 -39.847962740 + 78.717661968 -40.290034170 + 78.643079801 -40.501690613 + 78.564451853 -40.273642877 + 78.559991406 -39.837164176 + 78.634110854 -39.623188498 +} +855494dbfffffff +{ + 15.283335134 -24.159871891 + 15.212998567 -24.216574481 + 15.133630895 -24.178532102 + 15.124519534 -24.083896878 + 15.194745359 -24.027154275 + 15.274193230 -24.065086669 +} +8598f337fffffff +{ + -20.792569733 -7.548720469 + -20.879399019 -7.580210468 + -20.948468160 -7.512770217 + -20.930592943 -7.413832433 + -20.843705053 -7.382491510 + -20.774750881 -7.449939056 +} +8503348ffffffff +{ + 87.924259183 147.340798856 + 87.835566287 148.082391549 + 87.811634824 150.501531622 + 87.874629408 152.340670244 + 87.965112100 151.770541352 + 87.990911252 149.182846318 +} +8586c317fffffff +{ + -1.439096923 78.188184307 + -1.352736763 78.161407341 + -1.328750048 78.076717794 + -1.391080777 78.018873491 + -1.477354016 78.045643165 + -1.501383424 78.130264520 +} +85f29b8bfffffff +{ + -87.189715513 -62.879886306 + -87.155711890 -61.112577480 + -87.063036656 -60.902890338 + -87.005047236 -62.360651524 + -87.037261129 -64.051796128 + -87.129188740 -64.359636006 +} +850ef213fffffff +{ + 55.766721201 -86.979033092 + 55.701556631 -87.104288762 + 55.607533492 -87.065815395 + 55.578553144 -86.902765696 + 55.643485636 -86.777530974 + 55.737630150 -86.815323309 +} +85f2a3cffffffff +{ + -85.330155710 -156.491752242 + -85.415590115 -156.172282551 + -85.431177781 -155.066688759 + -85.360601442 -154.316344447 + -85.276026987 -154.666388492 + -85.261153022 -155.736911548 +} +85d94987fffffff +{ + -55.576864232 122.001086167 + -55.515251882 121.872204731 + -55.546944830 121.715983873 + -55.640431572 121.688119772 + -55.702258470 121.817209631 + -55.670383562 121.973956050 +} +85054ccffffffff +{ + 82.836411179 173.255844983 + 82.741887608 173.150476641 + 82.681756763 173.741830355 + 82.715123064 174.441966425 + 82.809302041 174.563493289 + 82.870469978 173.968848198 +} +85014d93fffffff +{ + 77.088352442 -8.007642373 + 77.164927873 -7.961882877 + 77.214931811 -8.273553675 + 77.187804861 -8.629816241 + 77.111114289 -8.671288502 + 77.061662776 -8.360798113 +} +85dc866ffffffff +{ + -50.179145495 -4.789265367 + -50.266285188 -4.830901015 + -50.330348426 -4.730538156 + -50.307181077 -4.588565358 + -50.220008996 -4.547264064 + -50.156036483 -4.647600580 +} +85c81a9bfffffff +{ + -37.362979459 107.476934975 + -37.297139900 107.407900650 + -37.306901057 107.296497599 + -37.382556375 107.253809883 + -37.448572084 107.322768237 + -37.438756191 107.434490923 +} +858692affffffff +{ + 3.243640423 87.881880320 + 3.335443474 87.855296677 + 3.359588922 87.763023326 + 3.291946789 87.697394100 + 3.200198216 87.723997184 + 3.176037270 87.816210167 +} +850324dbfffffff +{ + 88.590442705 59.282950158 + 88.611882418 62.911515307 + 88.700807694 64.202137418 + 88.771335846 61.478833207 + 88.747293172 57.419291882 + 88.655551631 56.543283650 +} +85d8dd1bfffffff +{ + -41.532252388 128.747465973 + -41.441710279 128.749967803 + -41.392599897 128.653174449 + -41.433924539 128.553868225 + -41.524375542 128.551121110 + -41.573593096 128.647925214 +} +8510e673fffffff +{ + 58.935635076 53.668843666 + 58.868214067 53.782653428 + 58.887973304 53.956580615 + 58.975254511 54.017318736 + 59.042837220 53.903495910 + 59.022976720 53.728946381 +} +85b8611bfffffff +{ + -32.742509163 121.341203581 + -32.656489830 121.351232811 + -32.609157556 121.277133869 + -32.647730462 121.193046302 + -32.733633855 121.182862532 + -32.781080279 121.256920606 +} +85004d6bfffffff +{ + 83.808941605 -37.546867239 + 83.887297881 -37.864717849 + 83.897702989 -38.711698921 + 83.829430654 -39.220372300 + 83.751951153 -38.887981754 + 83.741861682 -38.061134676 +} +8505469bfffffff +{ + 82.961238654 145.147624917 + 82.870942931 145.404249888 + 82.852100577 146.165854916 + 82.923132114 146.687185500 + 83.014088803 146.444945388 + 83.033360288 145.666758795 +} +85033577fffffff +{ + 88.724574142 -171.221441850 + 88.639693024 -172.775040090 + 88.563602443 -170.478126273 + 88.567387597 -166.777717392 + 88.647974849 -164.944908413 + 88.729131062 -167.055192726 +} +85798ddbfffffff +{ + 1.820639193 -139.171292266 + 1.734087538 -139.204984977 + 1.664778263 -139.148002373 + 1.681974500 -139.057389808 + 1.768450629 -139.023687420 + 1.837806040 -139.080607148 +} +850ef583fffffff +{ + 56.389013537 -82.458699567 + 56.328274727 -82.594708016 + 56.232613769 -82.567133251 + 56.197607054 -82.404308454 + 56.258114155 -82.268448736 + 56.353859172 -82.295263796 +} +8553a6c3fffffff +{ + 23.534531701 33.786957547 + 23.439743316 33.773955116 + 23.383142762 33.855837852 + 23.421237839 33.950718938 + 23.515961375 33.963859926 + 23.572654766 33.881981438 +} +857f8c97fffffff +{ + -4.338203410 178.267644430 + -4.269329836 178.307703721 + -4.211322230 178.272085447 + -4.222133181 178.196509840 + -4.290900484 178.156462224 + -4.348963019 178.191978447 +} +85d97557fffffff +{ + -58.588268584 133.647381212 + -58.541267403 133.494759164 + -58.587589116 133.345454073 + -58.681146766 133.348465015 + -58.728308212 133.501632794 + -58.681751193 133.651243214 +} +85d2500bfffffff +{ + -40.292374890 -111.286317680 + -40.231296725 -111.187842432 + -40.136189344 -111.207986044 + -40.102122676 -111.326268854 + -40.163057261 -111.424660754 + -40.258201859 -111.404853526 +} +858da447fffffff +{ + -9.688651976 114.454313793 + -9.610384644 114.437479261 + -9.593234699 114.357745690 + -9.654433294 114.294838335 + -9.732725381 114.311736895 + -9.749794191 114.391478797 +} +853ce3dbfffffff +{ + 25.224639588 91.149691921 + 25.311014107 91.121808859 + 25.331222202 91.021841514 + 25.265076135 90.949819603 + 25.178715545 90.977735705 + 25.158487033 91.077640819 +} +85ee934bfffffff +{ + -67.924071779 -2.258905563 + -67.831683269 -2.218236729 + -67.770355276 -2.411045941 + -67.801055387 -2.644938191 + -67.893355067 -2.687388684 + -67.955044735 -2.494169360 +} +85f0346ffffffff +{ + -79.880474971 91.699211430 + -79.800042819 91.488272364 + -79.787627578 90.975935518 + -79.855489824 90.667711478 + -79.936368886 90.873516108 + -79.948940618 91.392744025 +} +85062977fffffff +{ + 66.069879169 -28.212403368 + 66.084316995 -28.415683658 + 66.014269175 -28.549468148 + 65.930051168 -28.480002813 + 65.915789741 -28.277868929 + 65.985570527 -28.144057936 +} +85da3633fffffff +{ + -51.903859007 174.269598004 + -51.828656407 174.209620068 + -51.828518141 174.070350068 + -51.903628307 173.990677945 + -51.978925542 174.050534635 + -51.979017957 174.190185576 +} +8505856ffffffff +{ + 71.459853681 121.819807268 + 71.387499620 122.020776400 + 71.405960990 122.315988057 + 71.496974531 122.412673999 + 71.569768666 122.211958018 + 71.551107963 121.914289926 +} +85f08d8ffffffff +{ + -72.877726585 72.086359094 + -72.785814123 72.051909352 + -72.745550611 71.773218455 + -72.796896234 71.527449268 + -72.888823286 71.559270052 + -72.929391797 71.839491288 +} +8560b5a3fffffff +{ + 16.959109048 78.996009444 + 17.045720447 78.967594093 + 17.061965208 78.877033207 + 16.991664098 78.814964162 + 16.905114817 78.843373569 + 16.888804513 78.933858070 +} +85056cdbfffffff +{ + 86.042315330 167.788979055 + 85.948417475 167.726290349 + 85.895551731 168.845169179 + 85.934856621 170.046543342 + 86.028477724 170.162985537 + 86.083108245 169.024644764 +} +85df116bfffffff +{ + -61.616286023 -55.112614636 + -61.569677108 -54.941053356 + -61.478518966 -54.939329018 + -61.433997403 -55.108030802 + -61.480353467 -55.278979149 + -61.571483067 -55.281838339 +} +8504095bfffffff +{ + 74.438809192 159.501782001 + 74.342008039 159.535535297 + 74.301322807 159.861508113 + 74.357036008 160.156131461 + 74.453909448 160.126145900 + 74.495000103 159.797762751 +} +8503ac2bfffffff +{ + 82.997584826 -140.056927890 + 82.942217037 -140.665282631 + 82.848645167 -140.593433865 + 82.810319946 -139.929951480 + 82.864748345 -139.327726018 + 82.958429876 -139.382794904 +} +85eb2977fffffff +{ + -65.204928482 -155.146474681 + -65.205782037 -154.975556706 + -65.134667167 -154.900347450 + -65.062862748 -154.995758177 + -65.062091823 -155.165793874 + -65.133042805 -155.241298246 +} +8546f17bfffffff +{ + 18.902753664 -168.652758139 + 18.812753674 -168.676434023 + 18.749463711 -168.609836262 + 18.776158552 -168.519482424 + 18.866216465 -168.495709659 + 18.929521640 -168.562387574 +} +85eecea7fffffff +{ + -64.952891730 -33.845009762 + -64.880539926 -33.699458749 + -64.791758350 -33.776729244 + -64.775107285 -33.998410959 + -64.847119594 -34.144214127 + -64.936121890 -34.068089177 +} +85165d77fffffff +{ + 52.596939167 178.887648954 + 52.683499053 178.906832069 + 52.739689502 178.787161994 + 52.709225815 178.648340103 + 52.622615862 178.629521551 + 52.566519456 178.749159761 +} +8564858bfffffff +{ + 16.434282772 98.417097651 + 16.527471289 98.391976414 + 16.553655640 98.294826793 + 16.486637655 98.222837970 + 16.393444779 98.248010978 + 16.367274191 98.345121150 +} +858636b7fffffff +{ + -7.985251584 88.254058800 + -7.900238127 88.228442459 + -7.875629121 88.139201048 + -7.936035745 88.075631769 + -8.020993894 88.101267247 + -8.045600760 88.190452970 +} +85310a43fffffff +{ + 42.588754540 121.676012257 + 42.535625646 121.748946562 + 42.544942628 121.855604190 + 42.607468955 121.889644979 + 42.660779267 121.816739553 + 42.651381622 121.709763855 +} +85d49c23fffffff +{ + -41.953712362 -152.565809171 + -41.865724108 -152.527583489 + -41.798919443 -152.612965503 + -41.820043564 -152.736580915 + -41.908011157 -152.775010859 + -41.974875393 -152.689621508 +} +85ce8d27fffffff +{ + -39.187704861 -74.892535836 + -39.111498912 -74.851042523 + -39.038260551 -74.913511954 + -39.041074208 -75.017476737 + -39.117236886 -75.059224673 + -39.190629355 -74.996753609 +} +85a8e57bfffffff +{ + -19.451826251 -51.339524948 + -19.377480382 -51.288184364 + -19.296368357 -51.334100837 + -19.289640499 -51.431306170 + -19.363989238 -51.482615031 + -19.445062973 -51.436750411 +} +8564b1b3fffffff +{ + 16.753141222 100.397987820 + 16.846276583 100.373516817 + 16.873328462 100.276790466 + 16.807223763 100.204568765 + 16.714075317 100.229096480 + 16.687044598 100.325789288 +} +858a3317fffffff +{ + -9.105073879 -61.126593880 + -9.029141707 -61.079111072 + -8.946716643 -61.119500648 + -8.940273654 -61.207295477 + -9.016173849 -61.254713728 + -9.098549015 -61.214401773 +} +8500e5affffffff +{ + 84.125665265 34.477307027 + 84.181091499 35.150842579 + 84.271476520 34.995466247 + 84.305932330 34.143143040 + 84.249251205 33.465417751 + 84.159383565 33.643978082 +} +851b5873fffffff { - -29.926065223 -51.288926673 - -29.862405574 -51.236685691 - -29.790203618 -51.283419091 - -29.781696499 -51.382340131 - -29.845369638 -51.434548499 - -29.917536408 -51.387868577 + 51.646210287 -36.007321115 + 51.567544392 -36.080250933 + 51.493116256 -36.006259801 + 51.497263605 -35.859455777 + 51.575870780 -35.786267545 + 51.650389369 -35.860140808 +} +85ee096bfffffff +{ + -70.998814743 -40.918172851 + -70.932321668 -40.701018524 + -70.838030148 -40.769090454 + -70.810047635 -41.052003687 + -70.876109944 -41.268960846 + -70.970584034 -41.203211359 +} +85a12c2ffffffff +{ + -28.641218272 -136.103892123 + -28.550085996 -136.087469554 + -28.490786377 -136.164661026 + -28.522566147 -136.258390326 + -28.613752269 -136.274990978 + -28.673104857 -136.197684241 +} +855ce083fffffff +{ + 8.734283929 -148.931010193 + 8.642837000 -148.963435300 + 8.569661561 -148.899431917 + 8.587890713 -148.803023341 + 8.679302053 -148.770552433 + 8.752519869 -148.834535757 +} +85a4a503fffffff +{ + -21.171855764 -32.924940667 + -21.093461376 -32.875555849 + -21.018569801 -32.923825600 + -21.022075419 -33.021507588 + -21.100506786 -33.070943660 + -21.175395540 -33.022646625 +} +85c1095bfffffff +{ + -28.982653978 -9.092560688 + -29.073773337 -9.128736596 + -29.146792725 -9.055996466 + -29.128585867 -8.947058170 + -29.037406186 -8.911053860 + -28.964493591 -8.983815912 +} +8503b43bfffffff +{ + 80.207980970 -171.284260490 + 80.120014630 -171.501720807 + 80.043004085 -171.173948269 + 80.053244054 -170.631630724 + 80.140613502 -170.408207020 + 80.218341584 -170.732967060 +} +850326abfffffff +{ + 89.607957108 62.054780890 + 89.617826601 75.512550586 + 89.694843126 84.573548627 + 89.780266586 76.772041796 + 89.764714933 53.971113021 + 89.671612131 51.353022682 } -85eed87bfffffff +854443a3fffffff { - -63.833634521 -26.837353758 - -63.755655493 -26.718817088 - -63.671751701 -26.815841871 - -63.665555350 -27.030603681 - -63.743232378 -27.149688126 - -63.827407600 -27.053468732 + 31.793741347 -91.676451490 + 31.862818521 -91.607623035 + 31.951245918 -91.643377090 + 31.970619127 -91.748129850 + 31.901486552 -91.817015269 + 31.813036233 -91.781091126 } -8590b543fffffff +85f2f36ffffffff { - -10.916587547 -115.861251672 - -10.977958526 -115.910224344 - -11.057157190 -115.888821903 - -11.075064625 -115.818362522 - -11.013667389 -115.769298557 - -10.934388958 -115.790785294 + -82.160742360 -99.750420234 + -82.184524555 -99.097109286 + -82.116391668 -98.626329565 + -82.025413237 -98.808958601 + -82.002142466 -99.450397428 + -82.069345793 -99.920949281 } -85219b6ffffffff +85018a47fffffff { - 38.651191351 66.292303001 - 38.568723016 66.355470704 - 38.569254502 66.478551372 - 38.652275184 66.538794811 - 38.734882170 66.475767701 - 38.734329787 66.352355831 + 74.854025085 57.585270817 + 74.873533606 57.908236498 + 74.957972057 57.987901166 + 75.023077179 57.741402083 + 75.003246149 57.415442227 + 74.918634564 57.338991579 } -85a75487fffffff +85f290abfffffff { - -27.478245355 109.975241948 - -27.424304982 109.916326197 - -27.433435543 109.826157732 - -27.496560219 109.794699545 - -27.550643409 109.853584173 - -27.541458986 109.943958435 + -89.173612444 161.784755601 + -89.255342294 158.746749863 + -89.329315206 163.001681860 + -89.311275774 170.761147991 + -89.222863155 172.680447923 + -89.158679868 168.141187520 +} +85c854bbfffffff +{ + -42.377900257 103.958619053 + -42.305426532 103.887107338 + -42.312394639 103.762289501 + -42.391870170 103.708576462 + -42.464527043 103.779944752 + -42.457525148 103.905170458 +} +85382d0ffffffff +{ + 36.948466291 2.138851163 + 36.858751104 2.154174281 + 36.827941545 2.255270643 + 36.886866831 2.341250676 + 36.976670770 2.326080133 + 37.007460723 2.224776693 +} +856722bbfffffff +{ + 17.872080622 -73.749369317 + 17.814448584 -73.799548857 + 17.743578757 -73.762228604 + 17.730399755 -73.674733422 + 17.788079493 -73.624606086 + 17.858890534 -73.661921624 +} +85242667fffffff +{ + 47.307374929 99.128704032 + 47.215948968 99.143218235 + 47.180204546 99.260927720 + 47.235730625 99.364314522 + 47.327105961 99.350216416 + 47.363006077 99.232315440 +} +85f06493fffffff +{ + -81.564721614 28.305461210 + -81.476152098 28.079682364 + -81.460356119 27.465928842 + -81.532912415 27.066471840 + -81.622104772 27.283351249 + -81.638121496 27.908727229 +} +85649013fffffff +{ + 20.152558989 100.483760140 + 20.244146084 100.459051551 + 20.271153053 100.361291920 + 20.206555883 100.288275001 + 20.114953045 100.313041754 + 20.087963063 100.410767368 +} +85a58e8bfffffff +{ + -18.168532058 -33.926836227 + -18.088353093 -33.877302469 + -18.010482024 -33.925481437 + -18.012789231 -34.023217152 + -18.093000913 -34.072797683 + -18.170872658 -34.024595863 +} +85f11eb3fffffff +{ + -81.751795426 106.445828351 + -81.684634749 106.068171712 + -81.694887015 105.443883452 + -81.772475104 105.187115233 + -81.840378243 105.561813241 + -81.829948446 106.196356737 +} +85c052b7fffffff +{ + -38.931031204 -5.079105002 + -39.023731280 -5.114914927 + -39.093696123 -5.029697131 + -39.070866064 -4.908684822 + -38.978133870 -4.873115720 + -38.908263721 -4.958317706 +} +85d21417fffffff +{ + -47.659670633 -104.664254245 + -47.592139605 -104.560295815 + -47.497727469 -104.594923131 + -47.470765436 -104.733117858 + -47.538147078 -104.837077602 + -47.632639920 -104.802842123 +} +85d6a07bfffffff +{ + -47.508069549 41.911108982 + -47.584495591 41.907605414 + -47.635724133 41.999427851 + -47.610486293 42.094814355 + -47.533989527 42.098144350 + -47.482801264 42.006261704 +} +851d72bbfffffff +{ + 51.763539918 -135.830398357 + 51.687504275 -135.831723236 + 51.637582451 -135.728547607 + 51.663560282 -135.623776306 + 51.739653141 -135.621988439 + 51.789711255 -135.725435037 +} +85030e5bfffffff +{ + 85.313703498 -103.568013055 + 85.313141156 -104.672077586 + 85.232725976 -105.240544472 + 85.154274133 -104.722462201 + 85.155007348 -103.654981473 + 85.234024264 -103.069809383 +} +85ac1377fffffff +{ + -22.535519808 12.937206630 + -22.444910399 12.948553008 + -22.387015953 12.871131571 + -22.419704206 12.782417845 + -22.510246408 12.771021734 + -22.568167602 12.848388984 +} +85f3337bfffffff +{ + -75.466392480 -175.270527134 + -75.543908508 -175.285133970 + -75.579989967 -174.996812810 + -75.538079552 -174.695490173 + -75.460501884 -174.684345679 + -75.424893786 -174.971060008 +} +85134bd7fffffff +{ + 60.573955299 -103.025559695 + 60.494498218 -103.127624271 + 60.409658497 -103.041326611 + 60.404044785 -102.853445775 + 60.483304709 -102.750880051 + 60.568375548 -102.836692729 +} +854ece2bfffffff +{ + 27.277968794 144.678375441 + 27.365783909 144.657242763 + 27.397099635 144.566072252 + 27.340607605 144.496226062 + 27.252908498 144.517483892 + 27.221585413 144.608463039 +} +8504908ffffffff +{ + 64.316976987 137.799267200 + 64.232448319 137.896942819 + 64.225563272 138.116392251 + 64.303170251 138.239571570 + 64.387971754 138.142755997 + 64.394893632 137.921894945 +} +8553186ffffffff +{ + 22.887283723 41.042787077 + 22.795836232 41.024470094 + 22.737515986 41.097957391 + 22.770551058 41.189712637 + 22.861902835 41.208138652 + 22.920315282 41.134700600 +} +85b6257bfffffff +{ + -31.095326263 -96.369856001 + -31.029268481 -96.300789686 + -30.944009307 -96.337279056 + -30.924689821 -96.442661064 + -30.990609261 -96.511804885 + -31.075986477 -96.475489653 +} +8520c043fffffff +{ + 40.818681269 80.299421735 + 40.729275143 80.344294801 + 40.714758772 80.469131163 + 40.789573472 80.549416951 + 40.879054835 80.504832901 + 40.893646420 80.379673390 +} +854ed2a3fffffff +{ + 29.284676207 149.076814516 + 29.375872666 149.059068879 + 29.410312742 148.963147611 + 29.353546211 148.885169766 + 29.262452060 148.903072302 + 29.228022087 148.998796069 +} +85b53223fffffff +{ + -37.089122244 -151.356923837 + -36.998044300 -151.321921132 + -36.929492824 -151.403546320 + -36.951955799 -151.520192332 + -37.043017614 -151.555384137 + -37.111632682 -151.473741134 +} +853a334bfffffff +{ + 30.711105788 -52.878240951 + 30.628500613 -52.910419211 + 30.558206165 -52.847666618 + 30.570409336 -52.752675270 + 30.653023513 -52.720295771 + 30.723425635 -52.783108716 +} +8501ad17fffffff +{ + 73.753404299 39.877602940 + 73.794617499 40.128915466 + 73.878052289 40.103046082 + 73.920149308 39.822946323 + 73.878483655 39.570583676 + 73.795175415 39.599366505 +} +85c2a9abfffffff +{ + -36.756010192 -54.726894924 + -36.703172132 -54.674736250 + -36.638377333 -54.720604547 + -36.626450194 -54.818564079 + -36.679300744 -54.870674399 + -36.744065937 -54.824873663 +} +857f49b7fffffff +{ + -0.269445833 167.410631954 + -0.352572862 167.419314780 + -0.382074867 167.487002811 + -0.328539760 167.545953073 + -0.245508038 167.537308326 + -0.215916149 167.469675257 +} +8500c283fffffff +{ + 84.340290210 81.395687304 + 84.327150578 82.319520335 + 84.401114720 82.910796665 + 84.489468548 82.571622728 + 84.502924139 81.621054877 + 84.427702684 81.036888584 +} +854b3357fffffff +{ + 28.354318261 122.294984084 + 28.278560009 122.312267025 + 28.261044866 122.401036296 + 28.319339837 122.472586922 + 28.395124449 122.455298435 + 28.412587794 122.366464800 +} +850e8b4bfffffff +{ + 55.013816651 -92.061124845 + 54.944363526 -92.173455229 + 54.852880297 -92.123702372 + 54.830692646 -91.962192643 + 54.899922652 -91.849751352 + 54.991563165 -91.898928732 +} +8571a447fffffff +{ + 10.558008110 -177.686836950 + 10.473434024 -177.703795189 + 10.412703293 -177.644637313 + 10.436518688 -177.568425606 + 10.521167940 -177.551379864 + 10.581926640 -177.610633355 +} +8564936ffffffff +{ + 21.604259868 99.177535791 + 21.694921833 99.152249364 + 21.721099172 99.053643881 + 21.656603893 98.980363384 + 21.565930584 99.005705296 + 21.539763838 99.104272334 +} +85cc33b3fffffff +{ + -43.150093736 85.420333060 + -43.069236729 85.380883237 + -43.056169800 85.259650256 + -43.123856871 85.177500936 + -43.204806150 85.216600981 + -43.217976335 85.338200863 +} +85031227fffffff +{ + 84.077513205 -144.045767325 + 84.017238277 -144.727914643 + 83.924156115 -144.580508007 + 83.891025374 -143.773499381 + 83.950133325 -143.096818523 + 84.043524030 -143.221500930 +} +851b4c9bfffffff +{ + 53.961643834 -30.932144546 + 53.887633578 -31.015870085 + 53.811830835 -30.944615272 + 53.809954019 -30.789837656 + 53.883885479 -30.705900488 + 53.959772538 -30.776951446 +} +85e3b0c3fffffff +{ + -70.230921854 -127.033213417 + -70.281767821 -126.849438014 + -70.249965769 -126.608009993 + -70.167495688 -126.552005313 + -70.117038660 -126.735642625 + -70.148663774 -126.975429136 +} +85dd1043fffffff +{ + -61.591676701 -7.469265010 + -61.504949011 -7.420620425 + -61.439636907 -7.559197629 + -61.460746470 -7.746469070 + -61.547347777 -7.796108648 + -61.612966586 -7.657484678 +} +85e2868bfffffff +{ + -62.195650406 -118.089312583 + -62.147618725 -117.925323983 + -62.057889568 -117.940050597 + -62.016192053 -118.117897508 + -62.064070269 -118.281477876 + -62.153798932 -118.267619813 +} +85ee540bfffffff +{ + -70.474531029 -44.106165094 + -70.411951215 -43.884634147 + -70.316828644 -43.935713273 + -70.284151871 -44.206028685 + -70.346318274 -44.427105492 + -70.441573274 -44.378327774 +} +854b5d27fffffff +{ + 29.268837732 135.246142304 + 29.189874396 135.262905839 + 29.163344063 135.357753353 + 29.215798153 135.435865079 + 29.294760349 135.419120105 + 29.321269670 135.324244765 +} +85dd494ffffffff +{ + -55.847915149 -32.681542349 + -55.780386756 -32.578622625 + -55.699201122 -32.637518647 + -55.685363274 -32.798756797 + -55.752630168 -32.901840481 + -55.833996123 -32.843524317 +} +85ce51affffffff +{ + -39.892488264 -85.300018578 + -39.816539431 -85.238910134 + -39.734032886 -85.293820795 + -39.727319885 -85.409728830 + -39.803171888 -85.471046747 + -39.885833812 -85.416247819 +} +85057493fffffff +{ + 83.590506332 118.853976727 + 83.523455638 119.449870849 + 83.547484114 120.273525350 + 83.639139224 120.519990169 + 83.707385601 119.924292884 + 83.682770407 119.081666646 +} +8594b34bfffffff +{ + -18.456847065 119.552183067 + -18.535509916 119.568151550 + -18.571128100 119.648514413 + -18.528080041 119.712968558 + -18.449353384 119.696991324 + -18.413738569 119.616568648 +} +852ef297fffffff +{ + 45.211205951 141.190377525 + 45.295540882 141.159960771 + 45.314070589 141.047040196 + 45.248309654 140.964844039 + 45.164087650 140.995430189 + 45.145513640 141.108043673 +} +85815153fffffff +{ + -7.535433675 -46.735002316 + -7.453016586 -46.684086148 + -7.367694851 -46.730654329 + -7.364799595 -46.828106440 + -7.447202499 -46.879011823 + -7.532514839 -46.832476021 +} +856641dbfffffff +{ + 4.270087466 -68.073309970 + 4.200360992 -68.122213170 + 4.118638047 -68.083455860 + 4.106722045 -67.995819512 + 4.176478245 -67.946991846 + 4.258120760 -67.985724899 +} +852da037fffffff +{ + 35.818787986 35.075234007 + 35.725620371 35.059442427 + 35.665966732 35.150244493 + 35.699410059 35.256822020 + 35.792513901 35.272783882 + 35.852238285 35.181998192 +} +859a868bfffffff +{ + -10.371936643 -166.118531875 + -10.290699225 -166.080997820 + -10.222621173 -166.135213020 + -10.235694940 -166.226893443 + -10.316839109 -166.264486360 + -10.385002756 -166.210340193 +} +854f053bfffffff +{ + 13.229080823 156.114572115 + 13.138695904 156.126767146 + 13.100643205 156.209579943 + 13.152930742 156.280157599 + 13.243239148 156.268004233 + 13.281336539 156.185231533 +} +85c5a837fffffff +{ + -34.990013415 -39.782415431 + -35.061897260 -39.843274319 + -35.143420509 -39.805103618 + -35.153065725 -39.705856272 + -35.081072983 -39.644950941 + -34.999544032 -39.683339195 +} +85873323fffffff +{ + -12.229871982 91.831379740 + -12.148834776 91.806734241 + -12.125566210 91.717765288 + -12.164098172 91.674910884 + -12.185049425 91.656164473 + -12.269527564 91.686218701 + -12.291065908 91.772518630 + -12.249122210 91.809943898 +} +850c35d3fffffff +{ + 67.678851087 -161.377228900 + 67.600803315 -161.507785386 + 67.522231058 -161.400437362 + 67.521444501 -161.163604929 + 67.599140102 -161.032417125 + 67.677974051 -161.138684939 +} +85f154b3fffffff +{ + -85.311902133 66.292758431 + -85.262854485 65.341046422 + -85.305127594 64.380057770 + -85.397786332 64.350372650 + -85.448161923 65.320488847 + -85.404524078 66.301926701 +} +85ed5e9bfffffff +{ + -73.201353567 159.903788234 + -73.197005510 159.624688346 + -73.271469076 159.471220301 + -73.350538490 159.598148113 + -73.354822497 159.879767711 + -73.280101279 160.031925200 +} +853d4b27fffffff +{ + 35.053967549 93.288180076 + 34.967351684 93.308949880 + 34.943441222 93.411129067 + 35.006012288 93.492714398 + 35.092627154 93.472221185 + 35.116672162 93.369865901 +} +850d45d7fffffff +{ + 67.548536338 -138.636911899 + 67.495663786 -138.825140011 + 67.411765710 -138.810513670 + 67.380743907 -138.609233033 + 67.433312929 -138.421646638 + 67.517206128 -138.434698004 +} +8596610bfffffff +{ + -15.562130998 19.925456515 + -15.466382240 19.934165013 + -15.410689264 19.853434942 + -15.450704675 19.764015183 + -15.546405963 19.755246707 + -15.602139370 19.835957896 +} +856b6a4ffffffff +{ + 14.224327462 32.169728958 + 14.133923039 32.158963662 + 14.082695101 32.235687783 + 14.121769108 32.323183047 + 14.212119716 32.334069864 + 14.263450227 32.257340014 +} +8534c313fffffff +{ + 25.309299260 -26.843857649 + 25.231573420 -26.904820281 + 25.145442739 -26.859825189 + 25.136951257 -26.753988204 + 25.214575087 -26.692955801 + 25.300792374 -26.737829805 +} +85058887fffffff +{ + 72.043471243 129.487724184 + 71.963243571 129.664398610 + 71.969741401 129.976326527 + 72.056550814 130.114420326 + 72.137207690 129.938771628 + 72.130625413 129.623985865 +} +85a38a5bfffffff +{ + -22.735183817 43.540302524 + -22.643028055 43.539569679 + -22.600575201 43.454240920 + -22.650301972 43.369547911 + -22.742518646 43.370210884 + -22.784947687 43.455636792 +} +85019dabfffffff +{ + 74.096097921 56.926194468 + 74.116083622 57.231646398 + 74.200013759 57.303412740 + 74.264113673 57.066812713 + 74.243810215 56.758706420 + 74.159726512 56.689867569 +} +85800b47fffffff +{ + -0.873183295 -43.654305279 + -0.790131007 -43.603913463 + -0.705190853 -43.650688625 + -0.703290046 -43.747836614 + -0.786320249 -43.798231488 + -0.871273336 -43.751475457 +} +8532106bfffffff +{ + 37.177812483 172.415546153 + 37.274789383 172.423235224 + 37.328705219 172.321469562 + 37.285550567 172.212099679 + 37.188549345 172.204663626 + 37.134726924 172.306344303 +} +85dcd213fffffff +{ + -46.229111448 -12.316010727 + -46.316344874 -12.365237907 + -46.389139537 -12.278008093 + -46.374613712 -12.141474194 + -46.287316537 -12.092485973 + -46.214608841 -12.179791978 +} +8553ae43fffffff +{ + 21.773447061 36.705247109 + 21.680297766 36.690216778 + 21.623581618 36.767873575 + 21.659918626 36.860538182 + 21.752989685 36.875692726 + 21.809802033 36.798058632 +} +85db043bfffffff +{ + -56.668487628 179.848501858 + -56.602561249 179.777953716 + -56.611111877 179.632096315 + -56.685647605 179.556363413 + -56.751665288 179.626854117 + -56.743055865 179.773136131 +} +8503b337fffffff +{ + 79.322498278 -159.344133186 + 79.244329621 -159.631948558 + 79.158370461 -159.423073963 + 79.150090467 -158.931468547 + 79.227581055 -158.641421519 + 79.314027825 -158.845139424 +} +85ef969bfffffff +{ + -76.980694410 16.053413764 + -76.886508176 15.990034225 + -76.850741937 15.607322149 + -76.908805552 15.284088866 + -77.003214559 15.342546954 + -77.039340361 15.729180444 +} +85f22253fffffff +{ + -78.479882398 -153.014317240 + -78.557550752 -152.863986778 + -78.565386487 -152.429164238 + -78.495296851 -152.150361343 + -78.418016060 -152.305062104 + -78.410435240 -152.734242741 +} +85f02d97fffffff +{ + -82.364449872 55.483847998 + -82.301386119 54.974209390 + -82.327619533 54.335032097 + -82.417538643 54.194068976 + -82.481541309 54.705541065 + -82.454677478 55.356256276 +} +85737363fffffff +{ + 11.466608302 138.638649559 + 11.371784268 138.654536509 + 11.337622017 138.746829412 + 11.398284584 138.823250175 + 11.493103565 138.807386507 + 11.527265098 138.715078727 +} +85020397fffffff +{ + 78.705286579 -106.238813930 + 78.625825702 -106.462576521 + 78.552413298 -106.236476700 + 78.557981362 -105.788820760 + 78.637012545 -105.561657422 + 78.710905931 -105.785501832 +} +85a28b97fffffff +{ + -28.188808748 49.261869122 + -28.280044264 49.264886620 + -28.324176765 49.350588317 + -28.276983956 49.433277034 + -28.185664408 49.430119098 + -28.141621663 49.344412996 +} +8524cbaffffffff +{ + 37.598280165 110.476168169 + 37.516490510 110.471009957 + 37.480400188 110.551195482 + 37.525944979 110.636564641 + 37.607639872 110.641959330 + 37.643884827 110.561748658 +} +85250417fffffff +{ + 52.259866694 93.537118210 + 52.167581248 93.565020830 + 52.135212530 93.704471580 + 52.194988338 93.816345096 + 52.287261127 93.788961342 + 52.319771065 93.649184845 +} +8526733bfffffff +{ + 39.481909957 -91.658294780 + 39.545626002 -91.584311240 + 39.630902952 -91.622719153 + 39.652487173 -91.735307369 + 39.588728889 -91.809356843 + 39.503428691 -91.770752367 +} +85110d57fffffff +{ + 63.135461701 34.389583983 + 63.092794318 34.533814248 + 63.135726485 34.691699799 + 63.221488366 34.705660699 + 63.264251889 34.560896083 + 63.221156982 34.402705513 +} +850305cffffffff +{ + 87.675078782 -94.092805412 + 87.689500763 -96.302366475 + 87.615944763 -97.713377164 + 87.531037231 -96.945761440 + 87.517796080 -94.873521390 + 87.588334494 -93.437177228 +} +85bc0cb7fffffff +{ + -34.257953473 29.354556838 + -34.173086662 29.360100624 + -34.127034358 29.267734301 + -34.165847986 29.169788494 + -34.250715415 29.164161192 + -34.296768696 29.256563178 +} +856da523fffffff +{ + 14.582146223 -99.129849039 + 14.658115984 -99.071255335 + 14.743329183 -99.109012796 + 14.752538771 -99.205475190 + 14.676479217 -99.264072082 + 14.591299940 -99.226203569 +} +85004cdbfffffff +{ + 83.550665647 -21.445148226 + 83.635043371 -21.534914811 + 83.670202793 -22.288326387 + 83.620124825 -22.938676056 + 83.536045430 -22.830152379 + 83.501732794 -22.089930963 +} +853b626ffffffff +{ + 36.344220548 -43.255250829 + 36.258877073 -43.304088737 + 36.181203480 -43.239836701 + 36.188765746 -43.126755493 + 36.274081088 -43.077707726 + 36.351862387 -43.141950640 +} +85b9b1b3fffffff +{ + -30.751308367 140.580692973 + -30.656942466 140.569352185 + -30.619568702 140.470146422 + -30.676450776 140.382184815 + -30.770785449 140.393308344 + -30.808269418 140.492610748 +} +8517b277fffffff +{ + 53.036325834 145.231047264 + 52.957099900 145.280351077 + 52.941201985 145.427629776 + 53.004437086 145.526214963 + 53.083817022 145.477430361 + 53.099808156 145.329539711 +} +8500ea6ffffffff +{ + 86.917674245 69.767842392 + 86.923483895 71.464970273 + 87.007032962 72.275454181 + 87.086668448 71.333943655 + 87.080509329 69.542645870 + 86.995077676 68.790352958 +} +85705077fffffff +{ + 1.057501618 -165.657521117 + 0.972128274 -165.681221464 + 0.904631410 -165.618508075 + 0.922446797 -165.532035683 + 1.007838193 -165.508254374 + 1.075396222 -165.571026367 +} +85c5a9abfffffff +{ + -35.382138708 -38.927790740 + -35.454735133 -38.988785422 + -35.536563579 -38.949077442 + -35.545798155 -38.848155392 + -35.473092175 -38.787119841 + -35.391261283 -38.827046983 +} +85145063fffffff +{ + 56.052075109 137.588834959 + 55.973739903 137.662361588 + 55.967267843 137.826432469 + 56.039104315 137.917762451 + 56.117658196 137.844709655 + 56.124157030 137.679850491 } -850f1b57fffffff +851e5cd3fffffff { - 64.813328698 -75.818335039 - 64.760228602 -76.009035276 - 64.663473445 -75.995718135 - 64.619789670 -75.793053878 - 64.672633733 -75.602907881 - 64.769416672 -75.614870982 + 46.940583431 28.956124606 + 46.853946593 28.944593758 + 46.801755736 29.054364096 + 46.836141370 29.175712253 + 46.922749641 29.187490043 + 46.975001004 29.077672974 } -852a84dbfffffff +85032c1bfffffff { - 41.147497619 -79.944122783 - 41.096084416 -80.041784041 - 41.009942601 -80.027225456 - 40.975164367 -79.915383838 - 41.026392881 -79.817828259 - 41.112584009 -79.832008289 + 87.232574689 -41.221895410 + 87.311772907 -42.071051903 + 87.315038613 -44.047863664 + 87.238824297 -45.063571785 + 87.161874935 -44.152541718 + 87.158880699 -42.283584472 } -85e70acffffffff +85114e07fffffff { - -68.444652075 29.541288809 - -68.360782147 29.448754157 - -68.343505361 29.209550101 - -68.410050309 29.061128717 - -68.494216330 29.152407965 - -68.511541661 29.393372368 -} -85ae3077fffffff -{ - -25.736978370 91.928422227 - -25.823853399 91.962091101 - -25.839606780 92.058226910 - -25.768542878 92.120540377 - -25.681766767 92.086826544 - -25.665955662 91.990843979 -} -852adca7fffffff -{ - 32.884610920 -76.118194712 - 32.842051491 -76.203961576 - 32.765722886 -76.197639758 - 32.731934796 -76.105826650 - 32.774342696 -76.020170013 - 32.850689958 -76.026216165 -} -858f6203fffffff -{ - -4.156347639 -76.090194394 - -4.233677334 -76.145344401 - -4.321082514 -76.105369396 - -4.331104989 -76.010240752 - -4.253751228 -75.955141376 - -4.166399059 -75.995119876 -} -85ee14cffffffff -{ - -76.037667667 -21.322348268 - -75.951653913 -21.134721666 - -75.869288100 -21.346734315 - -75.872421254 -21.744393019 - -75.957972663 -21.934679193 - -76.040853686 -21.724684091 -} -85f051b7fffffff -{ - -76.177400630 41.890192665 - -76.100301405 41.674641774 - -76.103821000 41.302055192 - -76.184591000 41.140717118 - -76.262221621 41.354803298 - -76.258549825 41.731724917 -} -850c8a13fffffff -{ - 58.015325517 -170.574669747 - 57.936691616 -170.642073170 - 57.872669809 -170.544763789 - 57.887035096 -170.380334765 - 57.965445673 -170.312400573 - 58.029714387 -170.409423497 -} -85ef2e0bfffffff -{ - -82.852512852 -64.495025047 - -82.820231750 -63.778969548 - -82.726011536 -63.659294075 - -82.664445351 -64.239699422 - -82.696069083 -64.942524204 - -82.789906129 -65.078039485 -} -85ec8247fffffff -{ - -62.369479609 135.349399305 - -62.325736052 135.175883847 - -62.375605327 135.011380228 - -62.469471717 135.020064777 - -62.513376174 135.194318991 - -62.463252681 135.359148573 -} -8540f60ffffffff -{ - 32.184848883 107.750074950 - 32.266256410 107.727360152 - 32.296756583 107.629333684 - 32.245829597 107.554033613 - 32.164385922 107.576826857 - 32.133905325 107.674841799 -} -85bda047fffffff -{ - -36.019534569 42.474847621 - -35.938395913 42.474534488 - -35.904504992 42.382890438 - -35.951776691 42.291452996 - -36.032952523 42.291685045 - -36.066819560 42.383435680 -} -85005e8ffffffff -{ - 85.843599894 6.105246780 - 85.925296072 6.558733712 - 85.996981496 5.739469227 - 85.985145310 4.455553656 - 85.902307348 4.038788990 - 85.832430536 4.868093879 -} -85c98017fffffff -{ - -35.556470686 116.969355403 - -35.498741387 116.892614476 - -35.516177712 116.790413632 - -35.591449515 116.764708720 - -35.649350134 116.841481343 - -35.631807396 116.943927546 -} -85cb4403fffffff -{ - -32.284661894 58.345125920 - -32.378176549 58.356320430 - -32.418760568 58.456206403 - -32.365758634 58.544845656 - -32.272199788 58.533483252 - -32.231686972 58.433649497 -} -85e7511bfffffff -{ - -69.508003583 17.389247305 - -69.416953159 17.343079591 - -69.382117708 17.098328816 - -69.438120391 16.898113615 - -69.529351219 16.942348562 - -69.564400173 17.188737444 -} -85008abbfffffff -{ - 79.297238231 83.806306725 - 79.278791580 84.294255409 - 79.349516180 84.620105556 - 79.439368462 84.456663045 - 79.458010613 83.961451237 - 79.386602496 83.637013487 -} -85e555c7fffffff -{ - -66.729403522 107.429086580 - -66.653572459 107.279296713 - -66.666705633 107.037205165 - -66.755758106 106.943394069 - -66.831880545 107.092814560 - -66.818658680 107.336422198 -} -858a5cc7fffffff -{ - -1.842620767 -67.940594835 - -1.916909339 -67.990362699 - -2.000960361 -67.950860367 - -2.010646507 -67.861615720 - -1.936342763 -67.811926760 - -1.852368012 -67.851403443 -} -85eea423fffffff -{ - -74.667485675 -12.101445990 - -74.575900827 -11.983313800 - -74.502584059 -12.220664009 - -74.520337576 -12.575690488 - -74.611622186 -12.696925892 - -74.685455142 -12.460054812 -} -85632117fffffff -{ - 18.001390188 58.884874970 - 17.938061294 58.936773379 - 17.939967073 59.023993952 - 18.005246153 59.059478331 - 18.068701684 59.007608509 - 18.066751404 58.920225482 -} -8502f28ffffffff -{ - 73.170613729 -116.412390660 - 73.083766222 -116.516241169 - 73.015746868 -116.324556291 - 73.034220905 -116.029150499 - 73.120899870 -115.923072835 - 73.189274430 -116.114616085 -} -85b7248ffffffff -{ - -40.011601004 -97.751051208 - -39.940669414 -97.669383793 - -39.850008439 -97.709591850 - -39.830161445 -97.831223508 - -39.900951921 -97.912977676 - -39.991730418 -97.873014124 -} -85e5952ffffffff -{ - -53.432807042 114.948498225 - -53.363801419 114.836400814 - -53.385996422 114.681090987 - -53.477327611 114.637296966 - -53.546556877 114.749416245 - -53.524230922 114.905309094 -} -85684837fffffff -{ - 9.030924301 128.068096295 - 8.937165986 128.084851663 - 8.905822143 128.174665227 - 8.968272771 128.247770974 - 9.062074621 128.231020285 - 9.093382355 128.141159099 -} -853d2b67fffffff -{ - 34.922189466 82.274766116 - 34.835540455 82.312598934 - 34.820741181 82.424867890 - 34.892506815 82.499560019 - 34.979222055 82.461976359 - 34.994105597 82.349450962 -} -8538aa8bfffffff -{ - 27.995562834 -2.063685124 - 27.933734079 -2.137459977 - 27.846336530 -2.119746794 - 27.820805279 -2.028455799 - 27.882546762 -1.954788518 - 27.969906648 -1.972304646 -} -85a131abfffffff -{ - -27.713537748 -132.110323069 - -27.624194680 -132.098254210 - -27.568065905 -132.173615940 - -27.601236643 -132.261175637 - -27.690649857 -132.273412139 - -27.746822248 -132.197921241 -} -85f28263fffffff -{ - -88.313746765 -128.957685401 - -88.378423484 -126.700036585 - -88.347731969 -123.685740986 - -88.254890407 -123.174962958 - -88.194376860 -125.405095322 - -88.222699634 -128.184272162 -} -85052973fffffff + 67.787695707 44.437714677 + 67.737613610 44.599319411 + 67.770434641 44.809804487 + 67.853486949 44.859475653 + 67.903744512 44.697466212 + 67.870773669 44.486188806 +} +8500cc37fffffff { - 82.278633251 118.114573160 - 82.211985699 118.617880768 - 82.237339524 119.301992311 - 82.329852764 119.495561343 - 82.397494999 118.991925229 - 82.371621466 118.294901474 + 87.819082544 78.924644868 + 87.810106153 81.316216255 + 87.884953408 82.838302353 + 87.972016509 81.918038701 + 87.981733584 79.337179849 + 87.903605271 77.875246793 } -851f632ffffffff -{ - 56.114265123 25.495289212 - 56.038383216 25.486433948 - 55.995234851 25.615101968 - 56.027899074 25.752736507 - 56.103767395 25.761926011 - 56.146985275 25.633146953 -} -85b6d443fffffff -{ - -21.942448118 -89.269135379 - -22.014913114 -89.331222637 - -22.101352042 -89.292295085 - -22.115343384 -89.191221304 - -22.042874038 -89.129120351 - -21.956417727 -89.168106721 -} -85ba3223fffffff -{ - -35.225912143 -177.505740921 - -35.147422871 -177.452578045 - -35.066764565 -177.506759743 - -35.064585579 -177.613929608 - -35.142987133 -177.667100126 - -35.223655345 -177.613093436 -} -85ef2d73fffffff -{ - -81.303646683 -73.990330933 - -81.286047479 -73.376242218 - -81.195391361 -73.178707096 - -81.122897297 -73.586297121 - -81.140216134 -74.189543983 - -81.230305376 -74.395918347 -} -85cb313bfffffff -{ - -32.678005490 48.458302845 - -32.767877499 48.460749472 - -32.814030398 48.548843945 - -32.770231987 48.634501377 - -32.680275506 48.631904963 - -32.634201867 48.543801041 -} -851a6b97fffffff -{ - 46.846134162 -29.570594497 - 46.768012124 -29.646964074 - 46.685418741 -29.584964551 - 46.680869269 -29.446772005 - 46.758915695 -29.370250135 - 46.841587179 -29.432072311 -} -85b1308bfffffff -{ - -36.367594381 -120.403831531 - -36.315387695 -120.305478089 - -36.222251971 -120.310615922 - -36.181346513 -120.413803436 - -36.233435509 -120.511992117 - -36.326547426 -120.507158020 -} -855d1baffffffff -{ - 17.156139981 -152.465703598 - 17.064099803 -152.497929425 - 16.991573714 -152.430554097 - 17.011062463 -152.330954231 - 17.103093201 -152.298666823 - 17.175644679 -152.366040712 -} -85b31097fffffff -{ - -19.031189566 -73.030141241 - -19.109547499 -73.086189358 - -19.192840736 -73.044172078 - -19.197744335 -72.946115484 - -19.119401450 -72.890136588 - -19.036139937 -72.932144918 -} -8507194ffffffff -{ - 71.309841757 -20.191871048 - 71.337451215 -20.430773922 - 71.278006556 -20.619807362 - 71.191236685 -20.569431393 - 71.163886064 -20.331965879 - 71.223047603 -20.143443021 -} -85e32b2bfffffff -{ - -62.525673611 -147.692614826 - -62.515790626 -147.527141948 - -62.437161023 -147.471892147 - -62.368570325 -147.581673471 - -62.378492418 -147.746347531 - -62.456966067 -147.802036573 -} -85e8da3bfffffff -{ - -59.071846330 -69.019676173 - -59.044160405 -68.850309324 - -58.958977053 -68.807479437 - -58.901640414 -68.933220508 - -58.929203610 -69.101787709 - -59.014225707 -69.145411179 -} -85712677fffffff -{ - 15.178667518 -173.269319126 - 15.090485577 -173.289609560 - 15.028523961 -173.226337001 - 15.054724455 -173.142682539 - 15.142976600 -173.122297722 - 15.204958060 -173.185661746 -} -85898423fffffff -{ - -10.651377112 -146.351433136 - -10.568334542 -146.328299669 - -10.504014713 -146.393643124 - -10.522638709 -146.482158366 - -10.605661576 -146.505417579 - -10.670080264 -146.440035902 -} -85d9256ffffffff -{ - -59.728151350 143.649984042 - -59.694678636 143.487790069 - -59.751065599 143.357032370 - -59.841163103 143.388453587 - -59.874717127 143.551402505 - -59.818091981 143.682173190 -} -8501695bfffffff -{ - 76.167091307 -7.131612041 - 76.212151327 -7.400683860 - 76.170721509 -7.685088008 - 76.084476384 -7.698193828 - 76.039796918 -7.430262971 - 76.080983838 -7.148078881 -} -858ca517fffffff -{ - -5.469939145 108.316902036 - -5.384731537 108.297065212 - -5.363244969 108.210836266 - -5.427035569 108.144451607 - -5.512259333 108.164350352 - -5.533676415 108.250571882 -} -852ab02ffffffff -{ - 41.818510675 -81.353183040 - 41.765489903 -81.450554113 - 41.678899930 -81.433181724 - 41.645270303 -81.318821650 - 41.698102119 -81.221539939 - 41.784752214 -81.238528534 -} -850ee087fffffff -{ - 55.470766681 -78.916062354 - 55.414093899 -79.054594448 - 55.317922580 -79.036734905 - 55.278372410 -78.881092507 - 55.334824251 -78.742794711 - 55.431046669 -78.759904237 -} -8552c637fffffff -{ - 12.393657359 45.210443903 - 12.310382217 45.191396579 - 12.260000054 45.253136613 - 12.292791892 45.333865977 - 12.375967757 45.352987090 - 12.426451060 45.291305210 -} -8505137bfffffff -{ - 74.810302441 117.991253897 - 74.742275037 118.252072299 - 74.767276703 118.604651921 - 74.860598112 118.699774487 - 74.929148195 118.438805195 - 74.903852004 118.082844739 -} -85f020abfffffff -{ - -82.050335222 77.870449240 - -82.017850439 77.258241216 - -82.073125924 76.775612254 - -82.161808814 76.903363392 - -82.194798713 77.525931649 - -82.138593304 78.010292713 -} -85032247fffffff -{ - 88.960862375 -132.936775269 - 88.914605846 -137.197413175 - 88.820498399 -137.039113624 - 88.772737785 -133.285560900 - 88.813806980 -129.402866789 - 88.907373770 -128.903779756 -} -8514c183fffffff -{ - 52.416363888 139.429177266 - 52.340598179 139.490851209 - 52.331968750 139.637299918 - 52.399063975 139.722697346 - 52.475018782 139.661433959 - 52.483689402 139.514360801 -} -8592b3b3fffffff -{ - -11.526823048 -112.776008773 - -11.590315422 -112.827470692 - -11.671871331 -112.803769321 - -11.690011018 -112.728518052 - -11.626491729 -112.676965744 - -11.544859657 -112.700755106 -} -85b58077fffffff -{ - -30.386785724 -147.988810281 - -30.293693906 -147.959440961 - -30.225322716 -148.037145132 - -30.249971380 -148.144261043 - -30.343059426 -148.173806507 - -30.411502682 -148.096060114 -} -85bb1133fffffff -{ - -40.285225672 -178.657526418 - -40.210835237 -178.600890805 - -40.130724514 -178.656541515 - -40.125003595 -178.768627702 - -40.199316923 -178.825262646 - -40.279428238 -178.769812407 -} -85a8e237fffffff -{ - -18.520930383 -49.988426816 - -18.445202976 -49.936955852 - -18.363577022 -49.983294788 - -18.357712795 -50.081058228 - -18.433443116 -50.132503394 - -18.515034755 -50.086211054 -} -85ef264bfffffff -{ - -86.092071077 -58.094887034 - -86.050832898 -56.859622014 - -85.956913584 -56.803795482 - -85.904452541 -57.928830404 - -85.944186972 -59.130093016 - -86.037848334 -59.239998546 -} -8584e14bfffffff -{ - -8.241259815 68.561572478 - -8.329335724 68.578271379 - -8.358494294 68.667072921 - -8.299510884 68.739097035 - -8.211456172 68.722289190 - -8.182363567 68.633566089 -} -85d81e07fffffff -{ - -47.389798030 135.866292590 - -47.299320157 135.859004664 - -47.254226462 135.741915827 - -47.299512932 135.632020236 - -47.389937746 135.638981605 - -47.435129321 135.756164960 -} -85e945d3fffffff -{ - -59.406643204 -105.487902500 - -59.342786446 -105.352588612 - -59.253158273 -105.395398765 - -59.227303892 -105.572863341 - -59.290992380 -105.708156435 - -59.380703166 -105.666007419 -} -8534b127fffffff -{ - 32.105071891 -35.233551493 - 32.022096495 -35.290262263 - 31.938190449 -35.234254889 - 31.937154590 -35.121611576 - 32.020061495 -35.064754662 - 32.104072787 -35.120686777 -} -857e04d3fffffff -{ - -3.460508121 174.955331139 - -3.404997764 174.923778193 - -3.408522381 174.900025484 - -3.397087019 174.850091205 - -3.444673760 174.807831578 - -3.509492771 174.840544589 - -3.526635050 174.915549828 -} -853f1c5bfffffff -{ - 33.089557382 17.640512381 - 32.993105786 17.641354572 - 32.946006208 17.741344341 - 32.995311606 17.840613894 - 33.091786795 17.839961656 - 33.138933126 17.739849857 -} -855d4487fffffff -{ - 20.145156487 -144.497022210 - 20.056002878 -144.532360184 - 19.981684167 -144.467362980 - 19.996507582 -144.367074498 - 20.085626954 -144.331703639 - 20.159957182 -144.396653977 -} -85b061c3fffffff -{ - -22.165731599 -124.197787025 - -22.120811958 -124.117839339 - -22.042188963 -124.117371291 - -22.008514525 -124.196660667 - -22.053332287 -124.276482415 - -22.131926193 -124.277140650 -} -8514091bfffffff -{ - 56.366552922 133.381488004 - 56.290763571 133.465889924 - 56.289896503 133.631517684 - 56.364834033 133.713547570 - 56.440865400 133.629527566 - 56.441717172 133.463093105 -} -85c7589bfffffff -{ - -37.351577470 -142.410890270 - -37.260141169 -142.385628871 - -37.199252793 -142.470328138 - -37.229748874 -142.580384090 - -37.321211847 -142.605859803 - -37.382152175 -142.521065377 -} -8526265bfffffff -{ - 46.748984674 -97.606196273 - 46.680813952 -97.687441361 - 46.596664858 -97.636880869 - 46.580517866 -97.505384543 - 46.648503324 -97.423976768 - 46.732820976 -97.474226828 -} -85bc25c7fffffff -{ - -37.566369628 32.619144161 - -37.485494406 32.623311036 - -37.444289079 32.528835146 - -37.483961708 32.430135169 - -37.564846154 32.425880345 - -37.606048844 32.520413437 -} -85b51957fffffff -{ - -32.826522508 -155.545161416 - -32.734913938 -155.507609322 - -32.661959764 -155.583345607 - -32.680545082 -155.696614979 - -32.772115719 -155.734321559 - -32.845139049 -155.658604604 -} -8549a0bbfffffff -{ - 16.782983803 -102.585941293 - 16.861081543 -102.527588687 - 16.947470465 -102.568836265 - 16.955717660 -102.668538650 - 16.877536831 -102.726873883 - 16.791191949 -102.685524314 -} -85a0f12ffffffff -{ - -12.893968882 -137.867165227 - -12.811081704 -137.851371549 - -12.749991229 -137.918214288 - -12.771701289 -138.000930011 - -12.854608131 -138.016857517 - -12.915785362 -137.949935486 -} -85569dcbfffffff -{ - 9.534193832 -42.134287283 - 9.612703485 -42.084759035 - 9.692897034 -42.131068061 - 9.694615364 -42.226893128 - 9.616142393 -42.276430923 - 9.535914415 -42.230134241 -} -850e5603fffffff -{ - 55.473984677 -75.494097885 - 55.421243609 -75.637681864 - 55.324691741 -75.628638824 - 55.280861095 -75.476775664 - 55.333392869 -75.333512036 - 55.429964024 -75.341790869 -} -85c0c153fffffff -{ - -43.091080615 -7.989561253 - -43.181687443 -8.031247057 - -43.252567344 -7.943572359 - -43.232748970 -7.814193770 - -43.142096740 -7.772759270 - -43.071308164 -7.860451511 -} -857c018bfffffff -{ - -0.590187760 -22.292579811 - -0.511869001 -22.250177747 - -0.432085947 -22.293935079 - -0.430561621 -22.380154714 - -0.508904828 -22.422635524 - -0.588747937 -22.378818015 -} -85072c2ffffffff -{ - 68.494885083 -7.735334283 - 68.533636206 -7.909666386 - 68.488219331 -8.091742840 - 68.404217502 -8.098584311 - 68.365745627 -7.924748564 - 68.410997074 -7.743573425 -} -858972b7fffffff -{ - -13.748995586 -157.081650427 - -13.662952324 -157.048904004 - -13.593326817 -157.111679184 - -13.609648100 -157.207178149 - -13.695628576 -157.240028044 - -13.765350620 -157.177275701 -} -85f16ad7fffffff -{ - -85.117227317 13.352835048 - -85.023127160 13.237500093 - -84.985404616 12.260270355 - -85.040688896 11.374387406 - -85.135108889 11.454535807 - -85.173948695 12.456004342 -} -85ed9acffffffff -{ - -60.793899396 145.751249878 - -60.763627792 145.583230022 - -60.822379326 145.453515899 - -60.911639894 145.491873037 - -60.941975640 145.660724893 - -60.882986356 145.790385109 -} -8539aec7fffffff -{ - 34.287219512 -8.942922134 - 34.220266074 -9.021867617 - 34.128935111 -8.993573346 - 34.104568017 -8.886564713 - 34.171428637 -8.807696434 - 34.262749038 -8.835759407 -} -8518704bfffffff -{ - 49.764369249 -6.055162268 - 49.708505126 -6.154000237 - 49.621025684 -6.123573990 - 49.589433711 -5.994669486 - 49.645228468 -5.895984803 - 49.732684389 -5.926051130 -} -8546d86bfffffff -{ - 14.406022526 -167.424023770 - 14.315452214 -167.448008821 - 14.249414846 -167.382243505 - 14.273919347 -167.292420519 - 14.364538543 -167.268343169 - 14.430604391 -167.334181056 -} -853b2933fffffff -{ - 38.185939671 -46.551048182 - 38.100182129 -46.596166655 - 38.025880413 -46.528832893 - 38.037233030 -46.416359430 - 38.122980558 -46.371008008 - 38.197385584 -46.438362655 -} -85596e4ffffffff -{ - 22.618958607 10.498980202 - 22.524485403 10.505782604 - 22.481024375 10.596489336 - 22.532000235 10.680527596 - 22.626535057 10.673868393 - 22.670032490 10.583027604 -} -8586666ffffffff -{ - -11.043027858 78.895079350 - -11.132249354 78.918937761 - -11.159096233 79.010814136 - -11.096699759 79.078718362 - -11.007544697 79.054773154 - -10.980719620 78.963010356 -} -851af28bfffffff -{ - 44.151898393 -47.829671116 - 44.066450243 -47.876571718 - 43.996300325 -47.802921619 - 44.011506197 -47.682332597 - 44.096954138 -47.635152885 - 44.167196521 -47.708840904 -} -850ad64ffffffff -{ - 60.513250660 107.205813576 - 60.460873269 107.358486482 - 60.495270936 107.523663835 - 60.582298211 107.536764200 - 60.634935680 107.383675768 - 60.600285007 107.217901919 -} -8528e1affffffff -{ - 44.909736253 -128.209027027 - 44.988585685 -128.159796013 - 45.050929258 -128.227702661 - 45.034380150 -128.344787998 - 44.955548033 -128.393800657 - 44.893247656 -128.325946605 -} -85e7699bfffffff -{ - -74.071927234 4.049998703 - -73.976456982 4.068725890 - -73.923052936 3.782441541 - -73.964685652 3.475921434 - -74.060141389 3.453660648 - -74.113981462 3.741450445 -} -855d295bfffffff -{ - 22.020851379 -149.088982872 - 21.931159445 -149.123198328 - 21.858724786 -149.055489740 - 21.875969167 -148.953587027 - 21.965645157 -148.919319811 - 22.038092755 -148.987006897 -} -85054b13fffffff -{ - 80.708202804 -179.710710322 - 80.615521065 -179.861124626 - 80.547042081 -179.449846772 - 80.570435521 -178.888524762 - 80.662665564 -178.729497340 - 80.731958592 -179.140314880 -} -85730187fffffff -{ - 11.536113075 133.777257848 - 11.441827763 133.793714656 - 11.409276846 133.885787334 - 11.471029708 133.961434257 - 11.565331608 133.944992430 - 11.597864122 133.852888624 -} -85f2234bfffffff -{ - -78.235398831 -147.662566492 - -78.310075193 -147.477229226 - -78.309825697 -147.046298924 - -78.234759908 -146.806422025 - -78.160548707 -146.995186617 - -78.160937138 -147.420449961 -} -85876e73fffffff -{ - -16.708842858 81.854166136 - -16.800201560 81.880819748 - -16.825451001 81.976032827 - -16.759341127 82.044462632 - -16.668060037 82.017725967 - -16.642811174 81.922642355 -} -8503247bfffffff +8519a38bfffffff +{ + 59.291519831 -19.453979224 + 59.231495588 -19.562401310 + 59.155389869 -19.501248122 + 59.139248586 -19.332095849 + 59.199166392 -19.223638339 + 59.275331748 -19.284367284 +} +85e6a05bfffffff +{ + -59.747109946 28.233414336 + -59.669632210 28.172737856 + -59.649333844 28.007043835 + -59.706463895 27.901191641 + -59.784152169 27.961237445 + -59.804500051 28.127768839 +} +85885b73fffffff +{ + -0.862011337 -161.168023693 + -0.947303938 -161.193991545 + -1.015337787 -161.130892600 + -0.998143556 -161.041785968 + -0.912852106 -161.015744514 + -0.844753661 -161.078883216 +} +85c8710bfffffff +{ + -44.066151068 104.167086054 + -43.992491583 104.092562244 + -43.999843414 103.963107787 + -44.080890867 103.907739720 + -44.154738302 103.982112152 + -44.147350236 104.112005088 +} +85e73683fffffff +{ + -68.670513367 47.177363521 + -68.601815199 47.023765149 + -68.609622217 46.791911581 + -68.686302167 46.712035245 + -68.755368803 46.865373987 + -68.747386228 47.098855876 +} +85ed90a3fffffff +{ + -59.965048873 150.484415496 + -59.940737184 150.321748167 + -60.002320960 150.208537601 + -60.088433776 150.258180069 + -60.112765319 150.421663550 + -60.050964043 150.534685822 +} +85e0f16ffffffff +{ + -52.912895033 57.967042793 + -52.827459798 57.983795444 + -52.782666426 57.874746318 + -52.823093992 57.748867394 + -52.908410790 57.731590936 + -52.953418733 57.840716357 +} +85ac7113fffffff +{ + -25.044500794 4.209592266 + -25.134039600 4.189735641 + -25.197555791 4.265673415 + -25.171431678 4.361389858 + -25.081899682 4.381055578 + -25.018484849 4.305195849 +} +85218a1bfffffff +{ + 41.306190380 65.465576916 + 41.223566639 65.532628055 + 41.225294455 65.661021545 + 41.309673156 65.722723253 + 41.392437823 65.655815517 + 41.390682812 65.527061847 +} +851254c3fffffff +{ + 56.509139277 -112.231484167 + 56.427411673 -112.297247049 + 56.351008476 -112.203639849 + 56.356102030 -112.044411074 + 56.437710242 -111.978090114 + 56.514344587 -112.071553954 +} +85c37553fffffff +{ + -39.296569968 -65.904253328 + -39.222185685 -65.879115845 + -39.157949558 -65.945436956 + -39.167965270 -66.036974799 + -39.242354042 -66.062369437 + -39.306722795 -65.995969231 +} +856acecffffffff +{ + -0.298515829 31.166064835 + -0.206158076 31.170157138 + -0.155873969 31.090169933 + -0.197896678 31.006055628 + -0.290257749 31.001900417 + -0.340592883 31.081922406 +} +85b28c67fffffff +{ + -31.733860946 -76.744275073 + -31.804205656 -76.804999042 + -31.878265727 -76.761298138 + -31.881975318 -76.656865870 + -31.811648087 -76.596199213 + -31.737593813 -76.639907329 +} +8589426ffffffff +{ + -11.116181288 -158.885935291 + -11.032576932 -158.852641364 + -10.964425132 -158.912847253 + -10.979781508 -159.006315219 + -11.063315464 -159.039700992 + -11.131563496 -158.979527149 +} +85c20693fffffff +{ + -40.103406766 -57.614445449 + -40.070484606 -57.523487462 + -40.006907046 -57.518122817 + -39.976275156 -57.603412499 + -40.009066317 -57.694183417 + -40.072620093 -57.699851599 +} +85dd4953fffffff +{ + -56.146100451 -32.770851683 + -56.078401098 -32.666756805 + -55.996882141 -32.725984712 + -55.982881207 -32.888717189 + -56.050316880 -32.992976727 + -56.132016872 -32.934341449 +} +85ef867bfffffff +{ + -78.263389162 4.958058485 + -78.167347492 4.976045426 + -78.115807785 4.586534578 + -78.159742125 4.176123066 + -78.255770051 4.151678920 + -78.307881966 4.544098320 +} +85055587fffffff +{ + 81.929046461 145.844743585 + 81.837957718 146.062023056 + 81.818031625 146.727984096 + 81.888806129 147.189094994 + 81.980456875 146.983001304 + 82.000776965 146.304459549 +} +8558983bfffffff +{ + 5.242509669 4.408870101 + 5.164165464 4.418747721 + 5.124604303 4.494292350 + 5.163344789 4.560069173 + 5.241751963 4.550280905 + 5.281355748 4.474626353 +} +85a49127fffffff +{ + -25.847189439 -36.682500895 + -25.773144314 -36.631471023 + -25.701082910 -36.680447121 + -25.703079209 -36.780464469 + -25.777154294 -36.831530324 + -25.849203111 -36.782542998 +} +85031ea7fffffff +{ + 84.462572585 -122.504401876 + 84.432445089 -123.396194805 + 84.340885445 -123.590346037 + 84.280059164 -122.916949379 + 84.309522795 -122.047115694 + 84.400462606 -121.829032740 +} +85f060d3fffffff +{ + -80.401882174 31.845398526 + -80.315683695 31.615760509 + -80.305112535 31.072959321 + -80.380652669 30.750671922 + -80.467470823 30.974312088 + -80.478130651 31.526339064 +} +8508201bfffffff +{ + 65.755006778 6.460030602 + 65.801398197 6.347595759 + 65.772656708 6.182159522 + 65.697555616 6.130074146 + 65.651394119 6.242647228 + 65.680103957 6.407170477 +} +8599502bfffffff +{ + -10.659653412 -4.247371518 + -10.736218487 -4.272506348 + -10.796951522 -4.210452172 + -10.781007327 -4.123275840 + -10.704394889 -4.098269036 + -10.643773896 -4.160310395 +} +8530aa73fffffff +{ + 34.295760868 121.282032092 + 34.371511736 121.266196821 + 34.409441310 121.182031007 + 34.371594683 121.113669839 + 34.295780256 121.129590358 + 34.257875994 121.213786774 +} +8500591bfffffff +{ + 86.393195444 -24.233364374 + 86.479957492 -24.468631660 + 86.511241336 -25.887219563 + 86.454375380 -27.020487986 + 86.368375930 -26.725074152 + 86.338440584 -25.355595719 +} +85dd154bfffffff +{ + -62.235954611 -8.927050874 + -62.149106363 -8.872323909 + -62.081935253 -9.011041885 + -62.101298971 -9.204479305 + -62.188003067 -9.260223695 + -62.255488264 -9.121516613 +} +858c25c7fffffff +{ + -12.446687253 106.374409155 + -12.368179891 106.354232165 + -12.349891013 106.268663308 + -12.410167883 106.203283695 + -12.488674543 106.223517626 + -12.506905115 106.309074282 +} +850f996bfffffff { - 89.197827928 36.192587743 - 89.251304257 41.632413742 - 89.344992193 41.180259130 - 89.382712655 33.586913293 - 89.319227930 27.832245800 - 89.229041209 29.866516998 -} -85cf2803fffffff -{ - -53.515088337 -82.161362165 - -53.433615298 -82.089096357 - -53.355413463 -82.164478168 - -53.358527093 -82.311997104 - -53.439923940 -82.384654346 - -53.518283479 -82.309402559 -} -85ef6147fffffff -{ - -75.717442839 -78.210960310 - -75.705218290 -77.831921934 - -75.616813384 -77.683458997 - -75.541057844 -77.911125175 - -75.553204498 -78.285904483 - -75.641183755 -78.437244975 -} -85b2d067fffffff -{ - -34.754953947 -74.894658820 - -34.823172145 -74.955106376 - -34.892730510 -74.910713258 - -34.894064742 -74.805873778 - -34.825865326 -74.745494608 - -34.756312921 -74.789886350 -} -8534eed7fffffff -{ - 27.680566741 -24.465859588 - 27.602993339 -24.530522202 - 27.515119242 -24.486657505 - 27.504743422 -24.378272211 - 27.582212805 -24.313554755 - 27.670161968 -24.357277073 -} -851113d7fffffff -{ - 57.808996400 33.057265755 - 57.763898955 33.181384017 - 57.806037890 33.314014480 - 57.893434495 33.322723572 - 57.938608907 33.198193525 - 57.896309473 33.065366661 -} -85eb05a3fffffff -{ - -62.838610067 -156.147601699 - -62.838839675 -155.991211569 - -62.767020911 -155.920048284 - -62.695134351 -156.005047488 - -62.694997166 -156.160697019 - -62.766654248 -156.232085745 -} -85004403fffffff -{ - 82.615770200 -3.509057477 - 82.698244537 -3.371971735 - 82.757246063 -3.906788032 - 82.732750222 -4.577038386 - 82.649924365 -4.700573514 - 82.591937061 -4.167526641 -} -851363c7fffffff -{ - 65.623558550 -104.804990138 - 65.542000696 -104.920275078 - 65.459470999 -104.812692378 - 65.458236645 -104.590426296 - 65.539581708 -104.474364083 - 65.622374041 -104.581339275 -} -8555a18ffffffff -{ - 23.687767046 -16.932825896 - 23.615544798 -16.999665880 - 23.528543965 -16.965523954 - 23.513721079 -16.864705600 - 23.585828996 -16.797871163 - 23.672874018 -16.831849290 -} -853d6d07fffffff -{ - 39.587671870 90.865152448 - 39.497771010 90.891644669 - 39.473369567 91.004718575 - 39.538739478 91.091528223 - 39.628649321 91.065356106 - 39.653180490 90.952053962 -} -856e72cffffffff -{ - 6.992113989 -119.588456241 - 7.065991219 -119.545206114 - 7.142755985 -119.592417089 - 7.145545736 -119.682889996 - 7.071612193 -119.726048065 - 6.994945155 -119.678825445 -} -852d7083fffffff -{ - 45.909964652 36.950575290 - 45.824724900 36.931013698 - 45.765682917 37.030514457 - 45.791822338 37.149536917 - 45.877004498 37.169302274 - 45.936104943 37.069841798 -} -85ef2e1bfffffff -{ - -82.977338141 -65.359691271 - -82.946433013 -64.627680955 - -82.852512852 -64.495025047 - -82.789906129 -65.078039485 - -82.820168087 -65.796043534 - -82.913669655 -65.944887453 -} -85324673fffffff -{ - 34.884254658 160.752657491 - 34.980859241 160.746406537 - 35.024640260 160.641890082 - 34.971758266 160.543800286 - 34.875198850 160.550284882 - 34.831476110 160.654625795 -} -85f2f1d3fffffff -{ - -81.589178493 -111.722829262 - -81.630169868 -111.168829311 - -81.577035749 -110.648660463 - -81.483680899 -110.687461661 - -81.443426313 -111.234604350 - -81.495797970 -111.749782749 -} -8564716bfffffff -{ - 7.743393097 90.044614875 - 7.836594596 90.018027343 - 7.860567294 89.923750586 - 7.791350739 89.856119447 - 7.698190632 89.882733334 - 7.674205648 89.976952126 -} -8578f36bfffffff -{ - -6.901681312 -135.868990586 - -6.981048925 -135.901693462 - -7.041542853 -135.849202303 - -7.022724678 -135.764077278 - -6.943437728 -135.731375790 - -6.882888310 -135.783797837 -} -85ef25bbfffffff -{ - -84.171798408 -84.096684257 - -84.171253916 -83.176531908 - -84.088092193 -82.744844940 - -84.006564436 -83.220228075 - -84.007112465 -84.115350707 - -84.089184626 -84.559661214 -} -8592981bfffffff -{ - -15.288028805 -113.148971762 - -15.349120812 -113.200841086 - -15.430842502 -113.177097705 - -15.451554663 -113.101394985 - -15.390448053 -113.049432559 - -15.308643861 -113.073265970 -} -853d7023fffffff -{ - 36.007764570 84.999766245 - 35.920072171 85.034028556 - 35.902467199 85.146213848 - 35.972454837 85.224384422 - 36.060196526 85.190392118 - 36.077901475 85.077958830 -} -851b8a03fffffff -{ - 50.074806194 -53.533782278 - 50.049529438 -53.672245809 - 49.961011418 -53.712247403 - 49.897922616 -53.614220464 - 49.923146236 -53.476275095 - 50.011511614 -53.435839785 -} -85272613fffffff -{ - 54.512998808 -94.763403497 - 54.441624448 -94.868367342 - 54.351803371 -94.813207123 - 54.333183404 -94.653593105 - 54.404343429 -94.548455975 - 54.494337574 -94.603104133 -} -8512220ffffffff -{ - 61.075916573 -120.281734544 - 60.990013661 -120.331933713 - 60.921917813 -120.210199821 - 60.939488684 -120.038186843 - 61.025333291 -119.987137357 - 61.093665850 -120.108949128 -} -859e86c7fffffff -{ - -9.677008533 169.089397992 - -9.602430016 169.057090840 - -9.584243225 168.972773922 - -9.640634282 168.920629142 - -9.715310241 168.952871035 - -9.733497698 169.037323160 -} -854399affffffff -{ - 21.483503892 59.534021373 - 21.416337461 59.588264649 - 21.418916593 59.680557596 - 21.488709501 59.718789537 - 21.556010543 59.664582608 - 21.553383968 59.572107105 -} -8521b663fffffff -{ - 40.033786314 56.903713548 - 39.957759347 56.978604438 - 39.968337670 57.099922148 - 40.055025939 57.146659034 - 40.131205561 57.071800719 - 40.120544102 56.950172328 -} -85175cabfffffff -{ - 59.981065345 171.514103581 - 59.892236612 171.493901373 - 59.841937642 171.641791417 - 59.880179847 171.810152847 - 59.968918394 171.831325438 - 60.019505636 171.683167577 -} -85c48223fffffff -{ - -42.820623457 -45.796393210 - -42.883325270 -45.865135351 - -42.965330653 -45.832873443 - -42.984677997 -45.731600777 - -42.921896897 -45.662754577 - -42.839847830 -45.695284987 -} -85c01243fffffff -{ - -36.557208146 -16.102121552 - -36.646450245 -16.149348413 - -36.724163921 -16.076744512 - -36.712548692 -15.956817409 - -36.623222298 -15.909746125 - -36.545595387 -15.982445853 -} -85b86643fffffff -{ - -32.590252441 123.787521623 - -32.502596927 123.795066179 - -32.456030990 123.716981644 - -32.497002497 123.631378017 - -32.584548846 123.623665342 - -32.631232872 123.701724164 -} -853a196ffffffff -{ - 26.283656633 -49.632765100 - 26.203092037 -49.667638124 - 26.130118645 -49.608652165 - 26.137591741 -49.514757580 - 26.218141280 -49.479705598 - 26.291232905 -49.538726985 -} -8552a433fffffff -{ - 16.951581899 38.349894261 - 16.861478711 38.334353309 - 16.807402814 38.406960686 - 16.843327804 38.495079222 - 16.933348147 38.510728197 - 16.987526394 38.438150780 -} -857819d3fffffff -{ - -2.643395460 -134.598391110 - -2.725633125 -134.631740246 - -2.789870092 -134.579286686 - -2.771918211 -134.493559361 - -2.689767191 -134.460215648 - -2.625481438 -134.512593735 + 63.048913671 -92.018599622 + 62.977541147 -92.161524434 + 62.885503549 -92.098345853 + 62.864659177 -91.893169899 + 62.935771717 -91.750068158 + 63.027988189 -91.812315269 } -85060aabfffffff +85e14d13fffffff +{ + -64.540487298 44.648130148 + -64.457626138 44.713066535 + -64.394439306 44.596455286 + -64.413896279 44.415252926 + -64.496528714 44.349596681 + -64.559932977 44.465858672 +} +85d88893fffffff +{ + -43.109336603 136.724915250 + -43.016477216 136.716909400 + -42.972612256 136.605776533 + -43.021504366 136.502557093 + -43.114310610 136.510272596 + -43.158278041 136.621497778 +} +853262cbfffffff +{ + 32.588631415 161.490207248 + 32.685250915 161.484960014 + 32.730036377 161.383429226 + 32.678138066 161.287307199 + 32.581559618 161.292777320 + 32.536838279 161.394146715 +} +85db4e97fffffff +{ + -59.997181286 163.343974173 + -59.923989243 163.287735158 + -59.913474610 163.117973341 + -59.976129554 163.003932752 + -60.049401428 163.059819016 + -60.059938643 163.230100074 +} +85099447fffffff +{ + 56.970320861 4.719178465 + 56.932480729 4.606164539 + 56.852079368 4.620978703 + 56.809575527 4.748367796 + 56.847381150 4.861054782 + 56.927724937 4.846679288 +} +85f1b39bfffffff +{ + -75.081545308 116.455311778 + -75.019640847 116.196657908 + -75.046277772 115.847993429 + -75.135061908 115.755095053 + -75.197397662 116.014023170 + -75.170516176 116.365590610 +} +851add53fffffff +{ + 40.373067907 -44.018121976 + 40.287468623 -44.068436845 + 40.211860857 -44.000322355 + 40.221751112 -43.881895108 + 40.307329857 -43.831343577 + 40.383038978 -43.899455521 +} +8588180ffffffff +{ + -4.512193511 -153.542814780 + -4.595644992 -153.571883390 + -4.662254512 -153.510014334 + -4.645478538 -153.419072598 + -4.562058780 -153.389949451 + -4.495383212 -153.451822466 +} +85ed5693fffffff +{ + -70.636544608 163.145641638 + -70.634896103 162.906119812 + -70.709989905 162.787081146 + -70.786929780 162.908705755 + -70.788474135 163.150085414 + -70.713183097 163.267973456 +} +85e2d577fffffff +{ + -54.880651411 -123.432382721 + -54.835204404 -123.292122083 + -54.741035123 -123.293035571 + -54.692358461 -123.433617862 + -54.737698733 -123.573501245 + -54.831822039 -123.573179252 +} +85dc8babfffffff +{ + -47.626676320 -10.904504134 + -47.713596047 -10.952936858 + -47.784564518 -10.862295997 + -47.768524433 -10.723161520 + -47.681546563 -10.674990998 + -47.610666810 -10.765692019 +} +85263147fffffff +{ + 45.126995079 -98.897103193 + 45.059547600 -98.972930062 + 44.977396858 -98.922097120 + 44.962524053 -98.795707198 + 45.029794525 -98.719711508 + 45.112114779 -98.770273500 +} +85e87417fffffff +{ + -59.985040859 -93.544424207 + -59.910941519 -93.431427456 + -59.827850132 -93.500137691 + -59.818715621 -93.681388498 + -59.892668340 -93.794687982 + -59.975902091 -93.726436378 +} +85701ca3fffffff +{ + 3.214942421 -170.512340093 + 3.130113946 -170.533330319 + 3.064188062 -170.471872846 + 3.083036069 -170.389349535 + 3.167903274 -170.368274058 + 3.233883800 -170.429807122 +} +85f28d7bfffffff +{ + -84.518445633 -107.918492726 + -84.555145437 -107.035155160 + -84.497125509 -106.276606423 + -84.403666502 -106.409239239 + -84.367947660 -107.273421655 + -84.424725087 -108.023942052 +} +8548a20ffffffff +{ + 25.699638944 -100.155834778 + 25.776988164 -100.092260739 + 25.865820670 -100.134382336 + 25.877283744 -100.240206288 + 25.799865150 -100.303777093 + 25.711052912 -100.261527419 +} +85a6ed13fffffff +{ + -23.305732318 106.837250144 + -23.380522912 106.872982602 + -23.388010859 106.949596907 + -23.320809280 106.990370260 + -23.246126908 106.954659147 + -23.238537975 106.878153246 +} +8543400bfffffff +{ + 33.682016755 62.300975410 + 33.604129686 62.363634184 + 33.607763217 62.476137105 + 33.689329284 62.526255247 + 33.767362868 62.463677253 + 33.763683783 62.350899797 +} +85f0e443fffffff +{ + -76.104984607 61.531303943 + -76.015619522 61.553271919 + -75.961932903 61.257592354 + -75.997208058 60.938992318 + -76.086441922 60.913384269 + -76.140533990 61.210005770 +} +8511b6d7fffffff +{ + 51.683032543 31.520630043 + 51.602360535 31.505405110 + 51.550438446 31.619814765 + 51.579124622 31.749470085 + 51.659762492 31.764965008 + 51.711748485 31.650534989 +} +8544433bfffffff +{ + 32.049819427 -91.296369563 + 32.118443304 -91.227364063 + 32.206786281 -91.262789854 + 32.226530162 -91.367392894 + 32.157851825 -91.436458075 + 32.069484131 -91.400860693 +} +858d73b3fffffff +{ + -15.651434628 105.043078495 + -15.576533657 105.022608343 + -15.559426953 104.937204722 + -15.617272199 104.872286706 + -15.692165636 104.892810816 + -15.709221440 104.978199042 +} +85cd73c3fffffff +{ + -50.193051225 83.791953510 + -50.105762770 83.749241847 + -50.088082483 83.608048785 + -50.157562702 83.509078711 + -50.244936166 83.551291266 + -50.262744739 83.692974104 +} +8507513bfffffff +{ + 65.904607235 -21.483201941 + 65.927138657 -21.672128217 + 65.864518178 -21.817523751 + 65.779608911 -21.773734163 + 65.757297406 -21.585726471 + 65.819675955 -21.440592027 +} +85e3719bfffffff +{ + -60.014246921 -149.704967837 + -60.004999954 -149.553376647 + -59.926354581 -149.498451116 + -59.857115172 -149.594780664 + -59.866419376 -149.745692631 + -59.944905775 -149.800952301 +} +852da25bfffffff +{ + 33.802856769 35.137408793 + 33.708929116 35.121886675 + 33.649292371 35.210763323 + 33.683509143 35.315146133 + 33.777370781 35.330831379 + 33.837081751 35.241970928 +} +8505660ffffffff +{ + 85.055551652 132.966687191 + 84.974788935 133.530465989 + 84.975557058 134.624267416 + 85.057098803 135.189663671 + 85.139214716 134.643590157 + 85.138435279 133.513617716 +} +8562c34bfffffff +{ + 5.307968296 62.413142119 + 5.237205602 62.424131360 + 5.215385530 62.500815522 + 5.264398063 62.566467570 + 5.335153525 62.555386076 + 5.356903789 62.478744763 +} +85f28313fffffff +{ + -87.207979572 -123.036965272 + -87.265679862 -121.560928201 + -87.227902560 -119.822688484 + -87.134242210 -119.637132779 + -87.079006390 -121.085818016 + -87.115033479 -122.748949685 +} +850409a3fffffff +{ + 75.079033069 162.538350385 + 74.981957094 162.554263136 + 74.936811789 162.884662975 + 74.988291952 163.201403225 + 75.085385021 163.189617024 + 75.130983823 162.856961528 +} +85141023fffffff +{ + 52.744389476 126.573271838 + 52.677059552 126.662190813 + 52.684332873 126.808027252 + 52.759009649 126.865557713 + 52.826579467 126.776799284 + 52.819232380 126.630348130 +} +85c78d93fffffff +{ + -44.147160114 -134.319861433 + -44.110500773 -134.205806642 + -44.018825758 -134.188661559 + -43.963922612 -134.285250614 + -44.000541931 -134.398979348 + -44.092104286 -134.416444511 +} +854a7633fffffff +{ + 25.759645703 134.460325915 + 25.676578186 134.477073614 + 25.648895934 134.571262973 + 25.704305510 134.648734743 + 25.787375339 134.632003950 + 25.815033357 134.537784402 +} +85ab5edbfffffff +{ + -19.710290334 73.844033277 + -19.804838234 73.866153099 + -19.834327755 73.964468706 + -19.769234226 74.040549569 + -19.674726465 74.018313054 + -19.645272010 73.920112204 +} +852e5e4ffffffff +{ + 40.606464425 134.931990072 + 40.687732560 134.898411058 + 40.702999168 134.799278908 + 40.637069246 134.733978104 + 40.555928246 134.767652539 + 40.540590089 134.866532778 +} +8502a467fffffff +{ + 77.068233259 -133.299281332 + 77.021367485 -133.651016875 + 76.930278403 -133.662159608 + 76.886152793 -133.326480438 + 76.932577582 -132.977535781 + 77.023565589 -132.961484154 +} +858b730ffffffff +{ + -12.214557571 -67.789417319 + -12.292909548 -67.840728092 + -12.376535252 -67.799930750 + -12.381751596 -67.707850430 + -12.303411748 -67.656624352 + -12.219843422 -67.697393790 +} +854e353bfffffff +{ + 18.687967211 154.417517074 + 18.775244512 154.406416868 + 18.814746044 154.319883813 + 18.766918381 154.244595208 + 18.679710780 154.255839251 + 18.640261049 154.342228224 +} +8586e8bbfffffff +{ + -4.540764769 77.188389491 + -4.624678300 77.210114458 + -4.651206254 77.297717234 + -4.593785802 77.363495568 + -4.509929590 77.341686904 + -4.483436441 77.254183469 +} +85056113fffffff +{ + 86.029259495 158.237942394 + 85.935800811 158.393009068 + 85.896384440 159.616107407 + 85.949005669 160.718715953 + 86.042806271 160.617392107 + 86.083681205 159.359339737 +} +85f18013fffffff +{ + -76.506248613 108.349208429 + -76.436578555 108.100144972 + -76.450627179 107.705191815 + -76.534491607 107.555298114 + -76.604631982 107.803482385 + -76.590436349 108.202468297 +} +85b5134bfffffff +{ + -33.668269047 -151.243961837 + -33.575966849 -151.210275139 + -33.506146025 -151.289153456 + -33.528559064 -151.401736347 + -33.620843842 -151.435599831 + -33.690733097 -151.356703909 +} +8504050bfffffff +{ + 75.940969329 145.753304729 + 75.848631918 145.880968511 + 75.828981606 146.271112684 + 75.901444406 146.537860351 + 75.994119270 146.413960056 + 76.013995843 146.019518216 +} +856e9147fffffff +{ + 9.448412476 -106.755771652 + 9.524155381 -106.702520713 + 9.605619510 -106.744456724 + 9.611273417 -106.839718343 + 9.535445812 -106.892931428 + 9.454049030 -106.850920944 +} +850361cffffffff +{ + 81.230823682 -44.303388852 + 81.229743048 -44.869720490 + 81.154069217 -45.103311068 + 81.080011520 -44.775649871 + 81.081025472 -44.218383267 + 81.156163181 -43.979812186 +} +856d33b3fffffff +{ + 16.500419327 -95.641980006 + 16.575160802 -95.581704507 + 16.661202539 -95.616936834 + 16.672486433 -95.712569264 + 16.597656283 -95.772868045 + 16.511630995 -95.737511265 +} +85cd0617fffffff +{ + -47.785749714 92.800172555 + -47.703067586 92.740787350 + -47.696868397 92.601346062 + -47.773294449 92.520782693 + -47.856122084 92.579813310 + -47.862378313 92.719763197 +} +85a352d3fffffff +{ + -16.061062214 50.201726407 + -15.970021605 50.198466111 + -15.928238799 50.119966931 + -15.977527442 50.044621374 + -16.068657450 50.047825789 + -16.110409418 50.126431711 +} +85ec9353fffffff +{ + -60.275333116 133.402388054 + -60.228397029 133.241777136 + -60.275259353 133.083909034 + -60.369298739 133.086303853 + -60.416402496 133.247514770 + -60.369298585 133.405730111 +} +85c0ab03fffffff +{ + -39.916852338 -14.997053729 + -40.005848639 -15.045165019 + -40.082616225 -14.968113971 + -40.070301858 -14.842858203 + -39.981228362 -14.794925924 + -39.904546370 -14.872069825 +} +85288d5bfffffff +{ + 45.728524760 -119.223640462 + 45.804672788 -119.162789253 + 45.873338614 -119.228588623 + 45.865808405 -119.355265614 + 45.789645733 -119.415939431 + 45.721027882 -119.350114095 +} +85d513a7fffffff +{ + -53.934277547 -156.445226254 + -53.859558998 -156.395741607 + -53.799623963 -156.492593896 + -53.814339668 -156.638886330 + -53.889015877 -156.688619845 + -53.949018825 -156.591812770 +} +85b21a3bfffffff +{ + -30.068791627 -73.148018641 + -30.141494534 -73.206336604 + -30.215514971 -73.162674763 + -30.216820639 -73.060703946 + -30.144141863 -73.002460205 + -30.070133316 -73.046112894 +} +85b14437fffffff +{ + -27.539835034 -126.384276525 + -27.494535473 -126.297231546 + -27.410262617 -126.293921467 + -27.371338422 -126.377438542 + -27.416542883 -126.464323953 + -27.500766468 -126.467851720 +} +85e16697fffffff +{ + -68.815768901 53.199681548 + -68.727249256 53.246884107 + -68.667519354 53.075313075 + -68.696024155 52.856586136 + -68.784346443 52.807983900 + -68.844361894 52.979502570 +} +8521603bfffffff +{ + 56.612534482 69.183190161 + 56.530205184 69.266833285 + 56.528480277 69.440446605 + 56.609084039 69.531074028 + 56.691551960 69.447772595 + 56.693277512 69.273499999 +} +850a695bfffffff +{ + 74.884633028 94.616178295 + 74.848502710 94.948361908 + 74.905835888 95.228423221 + 74.999809702 95.177057943 + 75.036250448 94.841920409 + 74.978404563 94.561115631 +} +85204477fffffff +{ + 49.823989920 81.651389729 + 49.733026674 81.701581676 + 49.715116600 81.847418958 + 49.788085454 81.943498900 + 49.879115611 81.893719849 + 49.897110213 81.747446953 +} +85d4919bfffffff +{ + -42.956303690 -150.473672408 + -42.868575531 -150.437311639 + -42.804165897 -150.524872642 + -42.827426275 -150.648824211 + -42.915142299 -150.685404396 + -42.979610193 -150.597813944 +} +85873533fffffff +{ + -14.069988861 92.411421029 + -14.154934918 92.442183258 + -14.175490236 92.529161659 + -14.111141161 92.585251531 + -14.026304032 92.554454192 + -14.005707092 92.467601924 +} +85bd288ffffffff +{ + -41.773392221 34.168131250 + -41.698263366 34.171676973 + -41.661665502 34.074838805 + -41.700197062 33.974385195 + -41.775335918 33.970746998 + -41.811933307 34.067654886 +} +85839d97fffffff +{ + -3.950100169 16.323807270 + -3.857712397 16.333279767 + -3.806203466 16.258897418 + -3.847013542 16.175075364 + -3.939337171 16.165554202 + -3.990914909 16.239903687 +} +85b88957fffffff +{ + -22.468947810 130.337963522 + -22.382704706 130.338352323 + -22.345688333 130.260050106 + -22.394786697 130.181342875 + -22.480958524 130.180796656 + -22.518103350 130.259114959 +} +850cb2c7fffffff +{ + 61.272568082 -179.780895946 + 61.185758518 -179.829576446 + 61.125909196 -179.695282044 + 61.152568553 -179.512339432 + 61.239199342 -179.462744336 + 61.299350063 -179.597003413 +} +85f173d7fffffff +{ + -86.146856616 66.391295809 + -86.097927919 65.233011890 + -86.140366807 64.061079889 + -86.233344511 64.016833371 + -86.283899542 65.202353913 + -86.239810675 66.404968049 +} +85f25657fffffff +{ + -77.703555980 -120.513693862 + -77.753621022 -120.175870133 + -77.712587079 -119.792075162 + -77.621894837 -119.749816302 + -77.572422277 -120.086015139 + -77.613052984 -120.466112947 +} +85400a4bfffffff +{ + 28.689566102 106.740965696 + 28.774585670 106.718091968 + 28.804757563 106.620635249 + 28.749886985 106.546067016 + 28.664830205 106.569015559 + 28.634681161 106.666457596 +} +857c5a43fffffff +{ + 6.534821239 -25.615241996 + 6.610363511 -25.571272609 + 6.690579959 -25.615857672 + 6.695320775 -25.704462387 + 6.619778976 -25.748501766 + 6.539495851 -25.703866519 +} +850c9d53fffffff +{ + 58.201149069 -173.172418902 + 58.120668198 -173.233678769 + 58.058216482 -173.129139990 + 58.075986703 -172.963558571 + 58.156257709 -172.901699460 + 58.218968555 -173.006018367 +} +85d48a83fffffff +{ + -41.953125673 -155.102346101 + -41.865863263 -155.061455487 + -41.797089617 -155.145156748 + -41.815519138 -155.269730120 + -41.902750757 -155.310810664 + -41.971583739 -155.227128329 +} +85f29983fffffff { - 67.464714238 -36.000351110 - 67.469505425 -36.227648456 - 67.391999368 -36.350197819 - 67.309985792 -36.245891405 - 67.305303906 -36.020078426 - 67.382526674 -35.897093938 + -86.711029781 -86.004174437 + -86.713840812 -84.383388116 + -86.632600346 -83.601032534 + -86.550487608 -84.402171658 + -86.547760693 -85.946853874 + -86.627065966 -86.764072117 } -85b51e8bfffffff -{ - -33.944794888 -153.135536787 - -33.852909131 -153.099874534 - -33.781838976 -153.177960090 - -33.802586436 -153.291709483 - -33.894446078 -153.327541458 - -33.965584465 -153.249454619 -} -85e7a997fffffff -{ - -65.556113627 32.709048329 - -65.476536399 32.617814461 - -65.463161341 32.408675113 - -65.529358817 32.289414983 - -65.609221985 32.379814948 - -65.622601819 32.590314727 -} -85a57513fffffff -{ - -13.387597904 -22.180752777 - -13.307274499 -22.137612200 - -13.232288909 -22.182158506 - -13.237600445 -22.269908235 - -13.317977667 -22.313130817 - -13.392989516 -22.268521730 -} -850aa06bfffffff -{ - 58.866872724 95.099986684 - 58.776749475 95.128669306 - 58.740861852 95.288528643 - 58.794951001 95.420114322 - 58.885058919 95.392138219 - 58.921093415 95.231869530 -} -85648233fffffff -{ - 18.821312581 98.491292687 - 18.913492236 98.466004445 - 18.939562165 98.368129835 - 18.873441186 98.295583412 - 18.781254789 98.320924404 - 18.755196054 98.418759183 -} -8520c557fffffff -{ - 42.135778810 80.587391022 - 42.045854543 80.632795414 - 42.030729098 80.760261709 - 42.105450768 80.842658981 - 42.195448158 80.797558891 - 42.210650919 80.669756534 -} -859ef2d3fffffff -{ - -11.079245838 164.417307965 - -11.001429726 164.387499954 - -10.981693978 164.300072043 - -11.039756295 164.242313050 - -11.117660456 164.272032084 - -11.137414284 164.359599291 -} -85af5bc3fffffff -{ - -21.070021353 97.833577652 - -21.152815126 97.867683946 - -21.167087775 97.954312702 - -21.098641609 98.006703169 - -21.015960725 97.972582696 - -21.001613184 97.886085773 -} -85021643fffffff -{ - 78.122307054 -127.855214289 - 78.083236577 -128.254830434 - 77.992667578 -128.308562726 - 77.941386664 -127.968283786 - 77.980063951 -127.572786313 - 78.070411737 -127.513469080 -} -85e44e13fffffff -{ - -63.875922631 83.007782412 - -63.783697347 82.947138867 - -63.760443005 82.739070903 - -63.829250075 82.590594671 - -63.921578792 82.650125223 - -63.944997660 82.859248408 -} -855aec57fffffff -{ - 17.955281720 167.256025273 - 18.044614086 167.257172778 - 18.090860914 167.172750342 - 18.047677264 167.087266344 - 17.958348926 167.086284631 - 17.912200058 167.170621127 -} -8564e877fffffff -{ - 13.269777209 88.263964998 - 13.361993871 88.236609672 - 13.384202412 88.141301981 - 13.314220605 88.073413245 - 13.222044801 88.100790408 - 13.199809908 88.196034595 -} -85cb6e03fffffff -{ - -31.150729732 60.196728007 - -31.244992738 60.209457041 - -31.284193671 60.310105247 - -31.229062123 60.397961519 - -31.134763453 60.385067233 - -31.095631896 60.284481907 -} -85b22867fffffff -{ - -26.649563977 -67.783927793 - -26.725151081 -67.837793795 - -26.799453090 -67.794962134 - -26.798145204 -67.698295130 - -26.722592802 -67.644522506 - -26.648313607 -67.687323380 -} -85206193fffffff -{ - 52.818430555 81.334747444 - 52.728156887 81.388730282 - 52.710184241 81.543949919 - 52.782402790 81.645680538 - 52.872747607 81.592160898 - 52.890802951 81.436446216 -} -852da993fffffff -{ - 38.078676660 38.043304809 - 37.987892007 38.024498315 - 37.926596992 38.113969958 - 37.956021388 38.222205697 - 38.046733427 38.241176389 - 38.108093764 38.151747452 -} -851ba333fffffff -{ - 54.312991043 -54.812020276 - 54.286687861 -54.966341534 - 54.195432026 -55.008014715 - 54.130633578 -54.895928819 - 54.156870752 -54.742242738 - 54.247972123 -54.700009088 -} -85cd658bfffffff -{ - -54.832081659 81.698424052 - -54.741615232 81.655741627 - -54.719563037 81.499102855 - -54.787825753 81.384559769 - -54.878363798 81.426589380 - -54.900567941 81.583816259 -} -851f1273fffffff -{ - 51.388419836 7.916323706 - 51.308265745 7.928555891 - 51.280967830 8.052525786 - 51.333808807 8.164533547 - 51.414009188 8.152558488 - 51.441322446 8.028318147 -} -8572f02bfffffff -{ - -1.513343048 140.412687576 - -1.608333614 140.428030559 - -1.642219805 140.518432444 - -1.581141821 140.593499726 - -1.486154649 140.578181900 - -1.452242001 140.487771572 -} -85cc8d57fffffff -{ - -36.785165993 81.022594939 - -36.873296545 81.053527848 - -36.893662658 81.166321848 - -36.825909251 81.248003775 - -36.737831598 81.216950352 - -36.717454383 81.104335201 -} -8545618ffffffff -{ - 20.622290802 -95.587869971 - 20.697360778 -95.525604644 - 20.785287549 -95.561942909 - 20.798135597 -95.660679574 - 20.722984313 -95.722970053 - 20.635066363 -95.686498882 -} -85380203fffffff -{ - 32.757917176 -0.981943901 - 32.697878892 -1.060052195 - 32.608697622 -1.042687964 - 32.579604799 -0.947434887 - 32.639568051 -0.869453378 - 32.728699047 -0.886598165 -} -85f29187fffffff -{ - -88.781296520 -142.981498642 - -88.859887720 -140.678852838 - -88.849880413 -136.144620643 - -88.762251893 -134.517254286 - -88.689108009 -137.012862367 - -88.698241781 -140.990274998 -} -85431243fffffff -{ - 25.532410792 54.513093730 - 25.464698991 54.574245120 - 25.471637753 54.669065688 - 25.546366334 54.702920606 - 25.614221813 54.641771179 - 25.607204884 54.546764598 -} -850a3063fffffff -{ - 62.159469061 86.691144940 - 62.072372639 86.744936119 - 62.046423960 86.933318128 - 62.107455970 87.068590225 - 62.194606825 87.015600071 - 62.220671657 86.826535051 -} -854e0ed3fffffff -{ - 20.916237592 150.662535562 - 20.828679666 150.676293774 - 20.791044773 150.764835823 - 20.840951145 150.839593685 - 20.928456998 150.825874953 - 20.966108596 150.737358845 -} -857c3117fffffff -{ - -2.577009978 -20.608306847 - -2.498663844 -20.566899867 - -2.420027021 -20.610024169 - -2.419678814 -20.694619829 - -2.498057855 -20.736108862 - -2.576752214 -20.692920234 -} -855e5297fffffff -{ - 15.512444344 -58.346895627 - 15.586509837 -58.299993005 - 15.655482294 -58.340480948 - 15.650403454 -58.427804991 - 15.576405935 -58.474655042 - 15.507419330 -58.434233695 -} -852ec23bfffffff -{ - 45.745630204 136.992993143 - 45.826553751 136.958387484 - 45.840260147 136.848714384 - 45.773106580 136.773950295 - 45.692300297 136.808687674 - 45.678530336 136.918057980 -} -85f3a64ffffffff -{ - -78.376798352 167.397948309 - -78.452355805 167.252757773 - -78.510019887 167.536048999 - -78.491482638 167.965251751 - -78.415509250 168.106002872 - -78.358486900 167.822030312 -} -8580625bfffffff -{ - -2.700035922 -48.495160665 - -2.617459980 -48.444684944 - -2.532534409 -48.490459235 - -2.530188819 -48.586670495 - -2.612735982 -48.637127911 - -2.697657502 -48.591392504 -} -85b1a157fffffff -{ - -33.781587220 -114.537218591 - -33.724915703 -114.446005687 - -33.633101573 -114.459460582 - -33.597941926 -114.563848629 - -33.654476619 -114.654961775 - -33.746307562 -114.641786783 -} -85f0593bfffffff -{ - -73.551798343 35.853323580 - -73.470131305 35.700236282 - -73.463602818 35.384582704 - -73.538778495 35.218910956 - -73.620869596 35.370371221 - -73.627360882 35.689150521 -} -853634a3fffffff -{ - 36.802192360 -150.209184866 - 36.724877955 -150.245483666 - 36.662679891 -150.172341633 - 36.677794862 -150.062917811 - 36.755106317 -150.026554454 - 36.817305805 -150.099679270 -} -85824b2ffffffff -{ - -1.946868345 -0.021182944 - -1.865109037 -0.008111889 - -1.819458246 -0.064402815 - -1.855492619 -0.133688913 - -1.937146957 -0.146775576 - -1.982871842 -0.090560595 -} -8511aa4bfffffff -{ - 55.415178128 37.165594890 - 55.363701563 37.281789083 - 55.401045555 37.415221107 - 55.490024228 37.432710700 - 55.541598651 37.316201566 - 55.504096262 37.182517889 -} -853282d7fffffff -{ - 42.126037610 176.442398223 - 42.220803149 176.455712677 - 42.277738375 176.351028533 - 42.239813823 176.233080641 - 42.145003117 176.220041662 - 42.088161959 176.324674814 -} -85e980abfffffff -{ - -71.878750667 -93.435549856 - -71.888902815 -93.145513960 - -71.814417477 -92.963726709 - -71.730213234 -93.071457447 - -71.720240488 -93.359014699 - -71.794293577 -93.541306184 -} -85e9811bfffffff -{ - -71.180145608 -92.682431902 - -71.188893049 -92.402515191 - -71.113828925 -92.230314142 - -71.030435812 -92.337488025 - -71.021852701 -92.615086373 - -71.096499244 -92.787816743 -} -85070a5bfffffff -{ - 70.672709893 -17.711648400 - 70.702813436 -17.936258032 - 70.646013989 -18.124146140 - 70.559372697 -18.086801527 - 70.529537596 -17.863402687 - 70.586076417 -17.676140124 -} -85033043fffffff -{ - 87.303049964 -176.723659534 - 87.214454119 -177.316280774 - 87.143218155 -176.039988271 - 87.157955508 -174.187528854 - 87.244845080 -173.508883796 - 87.318743234 -174.764900660 -} -859f760ffffffff -{ - -23.710414833 169.586751013 - -23.624643684 169.548618544 - -23.608746560 169.450255965 - -23.678643218 169.389841443 - -23.764528804 169.427887646 - -23.780403274 169.526434944 -} -857da493fffffff -{ - -8.887190370 -16.199219946 - -8.809465554 -16.160623055 - -8.735894334 -16.201842529 - -8.740004471 -16.281731975 - -8.817785415 -16.320417189 - -8.891400085 -16.279124660 -} -85ccda07fffffff -{ - -34.397484130 73.908392356 - -34.489655472 73.933394306 - -34.517589428 74.044303799 - -34.453332017 74.130064771 - -34.361189334 74.104914662 - -34.333275304 73.994151505 -} -85b98d27fffffff -{ - -29.721969414 134.325987510 - -29.629748140 134.321970569 - -29.589281843 134.231201670 - -29.640914214 134.144401648 - -29.733071590 134.148217994 - -29.773660602 134.239034851 -} -854d3243fffffff -{ - 30.897012263 -64.400961352 - 30.864198228 -64.490095236 - 30.791802797 -64.501397819 - 30.752268743 -64.423806090 - 30.784977786 -64.334855271 - 30.857325667 -64.323313311 -} -85dc987bfffffff -{ - -47.146883011 -5.677039657 - -47.235963640 -5.718012419 - -47.302829095 -5.623010682 - -47.280523724 -5.487047488 - -47.191408440 -5.446373363 - -47.124633031 -5.541363217 -} -856889bbfffffff -{ - 0.499640625 118.588660460 - 0.409409780 118.605037302 - 0.377288672 118.686866401 - 0.435449860 118.752383210 - 0.525765936 118.735995722 - 0.557835586 118.654102019 -} -85f0ad63fffffff -{ - -75.024626654 74.826497888 - -74.934082521 74.771981438 - -74.897181016 74.448339294 - -74.950510211 74.176998545 - -75.041122390 74.228173771 - -75.078339419 74.554037500 -} -850d22abfffffff -{ - 74.319540978 -154.341747195 - 74.246585443 -154.560218844 - 74.160063175 -154.446294112 - 74.146232531 -154.116655665 - 74.218696913 -153.897739450 - 74.305481601 -154.008886430 -} -85d38433fffffff -{ - -52.928295590 -100.487220442 - -52.857649890 -100.378620116 - -52.766349161 -100.424844333 - -52.745588057 -100.579237294 - -52.816084175 -100.687923779 - -52.907490785 -100.642132466 -} -85347213fffffff -{ - 31.819211467 -21.330078083 - 31.742634583 -21.400417493 - 31.652732434 -21.357856098 - 31.639350240 -21.245130396 - 31.715824119 -21.174758543 - 31.805783113 -21.217144450 -} -85cf0cdbfffffff -{ - -52.177429318 -80.046136598 - -52.095453564 -79.980722610 - -52.018605327 -80.056337791 - -52.023575676 -80.197282766 - -52.105488678 -80.263086138 - -52.182494236 -80.187556290 -} -8540b133fffffff -{ - 32.601319112 113.470731303 - 32.681382507 113.450795785 - 32.715435413 113.357742394 - 32.669399018 113.284616638 - 32.589284872 113.304636908 - 32.555257829 113.397698211 -} -855cd2d7fffffff -{ - 3.709724052 -153.422110828 - 3.620018903 -153.452230792 - 3.548955112 -153.388252892 - 3.567540893 -153.294151295 - 3.657221958 -153.263973325 - 3.728341380 -153.327954835 -} -85bb3373fffffff -{ - -42.384487444 -178.151713471 - -42.311311940 -178.093834945 - -42.231893875 -178.151629564 - -42.225649348 -178.267094513 - -42.298751564 -178.324976542 - -42.378171557 -178.267390487 -} -85f2741bfffffff -{ - -75.202871924 -132.327202210 - -75.263263066 -132.101597063 - -75.239338512 -131.766302615 - -75.155173888 -131.659956757 - -75.095278560 -131.885966635 - -75.119053337 -132.217938278 -} -85056d8ffffffff -{ - 85.710879100 -168.446310205 - 85.626597798 -168.986325522 - 85.547131292 -168.305591407 - 85.550415820 -167.103442711 - 85.633300900 -166.537698271 - 85.714301412 -167.198711877 -} -85659b43fffffff -{ - 15.895633725 102.489489230 - 15.988990253 102.465854156 - 16.016876905 102.370180850 - 15.951376661 102.298169592 - 15.857998741 102.321865669 - 15.830142402 102.417512094 -} -853515c7fffffff -{ - 43.090974916 -27.708862084 - 43.012241370 -27.783430216 - 42.926456412 -27.726693983 - 42.919331210 -27.595566699 - 42.997983976 -27.520881920 - 43.083842684 -27.577440405 -} -854ed113fffffff -{ - 28.289405908 147.866366049 - 28.379581715 147.847730021 - 28.413265213 147.753534997 - 28.356766935 147.678170752 - 28.266697505 147.696953407 - 28.233019943 147.790953961 -} -851aeda7fffffff -{ - 44.084496434 -37.725802046 - 44.001163980 -37.788320386 - 43.922380998 -37.720957677 - 43.926835630 -37.591149894 - 44.010120456 -37.528411735 - 44.088998330 -37.595700534 -} -85af05bbfffffff -{ - -18.915774959 88.825454620 - -19.004464336 88.856064240 - -19.025223710 88.949330620 - -18.957329178 89.011848391 - -18.868739294 88.981184133 - -18.847944465 88.888056540 -} -85da160bfffffff -{ - -49.434343110 172.143582187 - -49.355363961 172.087938125 - -49.351598968 171.952552783 - -49.426853050 171.872456282 - -49.505927160 171.927962865 - -49.509652227 172.063704236 -} -857b2343fffffff -{ - -8.412523551 49.637352767 - -8.321824840 49.634398715 - -8.276414066 49.558042953 - -8.321712193 49.484542248 - -8.412497762 49.487443103 - -8.457898352 49.563897922 -} -85f21babfffffff -{ - -80.982443691 -122.877830582 - -81.037356533 -122.429432531 - -81.000004705 -121.894263197 - -80.908249814 -121.815027314 - -80.854137991 -122.261144962 - -80.890986264 -122.788830733 -} -85136d43fffffff -{ - 64.553223101 -98.650870641 - 64.476050319 -98.781625401 - 64.388451214 -98.695141676 - 64.377795407 -98.478704597 - 64.454723697 -98.347465391 - 64.542552121 -98.433142380 -} -853ed3c3fffffff -{ - 18.168988865 24.568194063 - 18.074623271 24.563165621 - 18.023715061 24.647864995 - 18.067084718 24.737646311 - 18.161434403 24.742818745 - 18.212430463 24.658065920 -} -85652cd3fffffff -{ - 0.512277366 101.620023743 - 0.603625489 101.597165418 - 0.628472045 101.505557965 - 0.561925218 101.436835841 - 0.470577263 101.459748008 - 0.445775901 101.551328542 -} -85ace053fffffff -{ - -20.982646289 8.513779635 - -20.893675928 8.526296857 - -20.835338633 8.454056900 - -20.865942295 8.369370075 - -20.954830156 8.356813989 - -21.013196867 8.428983495 -} -85131ec3fffffff -{ - 64.161328856 -126.714994688 - 64.073826205 -126.748303272 - 64.013630486 -126.602671712 - 64.040712745 -126.423392729 - 64.128214500 -126.388985614 - 64.188635570 -126.534954620 -} -857ce3cffffffff -{ - 5.031419882 -22.084812948 - 5.106270582 -22.042895409 - 5.185541299 -22.086201245 - 5.190031652 -22.171484351 - 5.115171985 -22.213479712 - 5.035830891 -22.170114205 -} -85bb1e17fffffff -{ - -39.441501385 -178.485115142 - -39.366362121 -178.429084756 - -39.286078907 -178.484444112 - -39.280933147 -178.595638223 - -39.355993549 -178.651669295 - -39.436278532 -178.596505897 -} -85815a57fffffff -{ - -5.095576007 -46.817881755 - -5.012786908 -46.767140802 - -4.927421545 -46.813530198 - -4.924849867 -46.910628191 - -5.007619082 -46.961358066 - -5.092979852 -46.915001164 -} -85215827fffffff -{ - 51.873685758 76.098721339 - 51.785303417 76.161828300 - 51.774208541 76.317148447 - 51.851447563 76.409875839 - 51.939930787 76.347152556 - 51.951074245 76.191316821 -} -8516139bfffffff -{ - 52.745446194 160.654775504 - 52.832845858 160.646557871 - 52.869307688 160.511571195 - 52.818312163 160.385096468 - 52.730948440 160.393702897 - 52.694544069 160.528395614 -} -8546e5dbfffffff -{ - 22.005833924 -166.536746010 - 21.915988774 -166.562107892 - 21.853033698 -166.493810072 - 21.879913771 -166.400076443 - 21.969810471 -166.374616764 - 22.032775580 -166.442988452 -} -85ad5ea7fffffff -{ - -28.525602253 6.016130578 - -28.616760587 5.997644018 - -28.679084535 6.077011762 - -28.650157676 6.174769422 - -28.559020660 6.193048920 - -28.496789047 6.113777887 -} -8522903bfffffff -{ - 51.158109228 -156.020484643 - 51.231232204 -155.973236973 - 51.302309372 -156.044435128 - 51.300237318 -156.163138140 - 51.227009934 -156.210296709 - 51.155959049 -156.138842036 -} -85868577fffffff -{ - -0.977935141 85.836599366 - -0.888441547 85.810099200 - -0.863959202 85.719928382 - -0.928953372 85.656319767 - -1.018382781 85.682833131 - -1.042882224 85.772942019 -} -852331a3fffffff -{ - 36.626411465 -163.904108766 - 36.712697875 -163.871925643 - 36.779379581 -163.942243802 - 36.759699251 -164.044871385 - 36.673288732 -164.076937358 - 36.606682680 -164.006493312 -} -850d006bfffffff -{ - 71.671331276 -157.593774309 - 71.595503780 -157.768281331 - 71.512064553 -157.655159004 - 71.504184629 -157.369367921 - 71.579586254 -157.194248012 - 71.663292812 -157.305518341 -} -85bb0047fffffff -{ - -41.283721420 179.705870423 - -41.205427420 179.651362914 - -41.205789933 179.538372453 - -41.284530658 179.479635342 - -41.362935520 179.534107459 - -41.362488728 179.647352531 -} -8545890bfffffff -{ - 23.495287489 -81.537138704 - 23.559395727 -81.474565697 - 23.644465801 -81.497275523 - 23.665481693 -81.582707319 - 23.601313757 -81.645374894 - 23.516189681 -81.622516110 +85338803fffffff +{ + 35.338973195 175.888337268 + 35.435516437 175.899900523 + 35.492035020 175.803449332 + 35.451909135 175.695482750 + 35.355320943 175.684152576 + 35.298903435 175.780555695 +} +850cec33fffffff +{ + 58.606575284 -154.498537690 + 58.540707299 -154.603240876 + 58.468684805 -154.548187913 + 58.462387902 -154.389068795 + 58.527988412 -154.284256705 + 58.600152880 -154.338670414 +} +85628a1bfffffff +{ + 3.863656167 57.249065191 + 3.792287704 57.256684010 + 3.770393591 57.330365746 + 3.819949659 57.396403623 + 3.891326437 57.388691781 + 3.913138935 57.315035096 +} +851ed37bfffffff +{ + 38.959201264 21.092558026 + 38.865165167 21.089950226 + 38.816807597 21.195004897 + 38.862435493 21.302777101 + 38.956476163 21.305601184 + 39.004884516 21.200436791 +} +8572b6c7fffffff +{ + -2.669199473 130.537713528 + -2.763147331 130.554086626 + -2.797294287 130.643480483 + -2.737485852 130.716540651 + -2.643495882 130.700176358 + -2.609356411 130.610743022 +} +85415e0bfffffff +{ + 22.668371501 106.703942012 + 22.758137698 106.681531744 + 22.788350605 106.586094960 + 22.728764431 106.513082706 + 22.638957698 106.535564631 + 22.608777627 106.630987226 +} +85f0ea8bfffffff +{ + -73.206192749 52.474996154 + -73.141182176 52.257706857 + -73.158632759 51.967624082 + -73.241376880 51.892406968 + -73.306838389 52.109793966 + -73.289103219 52.402312326 +} +859f6d7bfffffff +{ + -27.467462906 163.396087768 + -27.377068208 163.361255761 + -27.357283503 163.256260448 + -27.427886025 163.185898826 + -27.518373784 163.220596698 + -27.538166003 163.325790670 +} +850a406bfffffff +{ + 71.279056351 97.827067866 + 71.237766266 98.090041978 + 71.289622840 98.326404608 + 71.383186655 98.300557146 + 71.424767622 98.035850424 + 71.372492183 97.798728660 +} +85d1b05bfffffff +{ + -43.367819485 -2.416393308 + -43.459634983 -2.450748659 + -43.525619374 -2.358462129 + -43.499699469 -2.231869638 + -43.407866877 -2.197798433 + -43.341971130 -2.290035175 +} +8500c50bfffffff +{ + 85.492132865 65.798729780 + 85.504044226 66.948760377 + 85.590439912 67.410562135 + 85.666027563 66.691744383 + 85.653611817 65.499870296 + 85.566125631 65.069617617 +} +85359c17fffffff +{ + 37.285695575 -35.570515655 + 37.201983674 -35.630463818 + 37.118840491 -35.570561366 + 37.119309696 -35.450792395 + 37.202960813 -35.390676047 + 37.286203545 -35.450496341 +} +850c4ddbfffffff +{ + 58.697628211 -143.774866189 + 58.642767226 -143.897808502 + 58.569217714 -143.873324511 + 58.550481269 -143.726638032 + 58.605096892 -143.603877824 + 58.678693735 -143.627620957 +} +85ae806ffffffff +{ + -33.547415343 93.856396498 + -33.629995103 93.893235591 + -33.639907170 93.994393141 + -33.567306888 94.058538069 + -33.484813579 94.021658725 + -33.474834107 93.920674442 +} +85552577fffffff +{ + 26.811298277 -8.631159547 + 26.744050567 -8.703476847 + 26.655628191 -8.677966011 + 26.634455971 -8.580331756 + 26.701599651 -8.508081177 + 26.790019448 -8.533398003 +} +857acd53fffffff +{ + 6.860782468 38.825495453 + 6.945231053 38.826587970 + 6.992817677 38.749615047 + 6.956000444 38.671487788 + 6.871522906 38.670337241 + 6.823891470 38.747372002 +} +85d34347fffffff +{ + -46.054080283 -119.085279452 + -46.000684470 -118.970076536 + -45.904202343 -118.978510582 + -45.861134171 -119.101723825 + -45.914409481 -119.216714374 + -46.010873180 -119.208704078 +} +856a992bfffffff +{ + -2.148015645 23.630237234 + -2.054741443 23.637188056 + -2.003672433 23.558758622 + -2.045815502 23.473378178 + -2.139058008 23.466368860 + -2.190189218 23.544798435 +} +85dd0223fffffff +{ + -61.863311156 -13.056872601 + -61.778274650 -12.989345544 + -61.707071635 -13.116622341 + -61.720595407 -13.311253804 + -61.805448522 -13.379682841 + -61.876961760 -13.252582310 +} +857ca637fffffff +{ + -0.168241977 -15.758789055 + -0.093811013 -15.721041560 + -0.017787216 -15.761459121 + -0.016126983 -15.839695834 + -0.090591050 -15.877529540 + -0.166682276 -15.837040344 +} +85bb0c8bfffffff +{ + -40.627495382 176.998625546 + -40.546634805 176.946226392 + -40.543962924 176.831409108 + -40.622224012 176.768730009 + -40.703196053 176.821069227 + -40.705795490 176.936147967 +} +85320043fffffff +{ + 34.946314369 169.771298325 + 35.043706862 169.775666464 + 35.095465579 169.674770296 + 35.049741717 169.569610493 + 34.952340414 169.565485283 + 34.900671611 169.666276888 +} +85d74473fffffff +{ + -52.259306214 27.278929408 + -52.339547599 27.287110016 + -52.367764859 27.391762673 + -52.315760823 27.487898967 + -52.235622532 27.479434500 + -52.207385124 27.375117012 +} +85413377fffffff +{ + 21.402862841 116.683387144 + 21.490534161 116.665898921 + 21.524602954 116.580124468 + 21.470943827 116.511821828 + 21.383197140 116.529388818 + 21.349184940 116.615179687 +} +8586cb2bfffffff +{ + -0.879059675 75.127288775 + -0.794048710 75.100627863 + -0.770625950 75.018724224 + -0.832161304 74.963550234 + -0.917078528 74.990196592 + -0.940554102 75.072031567 +} +85c9800bfffffff +{ + -35.290943189 116.867032212 + -35.233357580 116.790806981 + -35.250582885 116.689093873 + -35.325498778 116.663362984 + -35.383254948 116.739618507 + -35.365924433 116.841574988 +} +85dc1e03fffffff +{ + -52.891963643 -13.768147924 + -52.973153535 -13.824884783 + -53.042855777 -13.729736899 + -53.031278388 -13.577733938 + -52.950017576 -13.521275799 + -52.880404978 -13.616540891 +} +854f44cbfffffff +{ + 12.472531654 150.210565881 + 12.379615863 150.224257589 + 12.342579327 150.312003141 + 12.398425035 150.386033032 + 12.491285282 150.372379434 + 12.528355402 150.284657801 +} +85beaa7bfffffff +{ + -27.473400724 155.194847481 + -27.380328527 155.167866877 + -27.354195040 155.063028081 + -27.421080906 154.984995016 + -27.514207622 155.011799277 + -27.540394067 155.116813214 +} +85f20493fffffff +{ + -78.380268125 -149.021458171 + -78.455852869 -148.843425089 + -78.457695489 -148.407910715 + -78.383782610 -148.156244464 + -78.308648230 -148.338005102 + -78.306975068 -148.767754628 +} +85c1680ffffffff +{ + -28.011400618 -0.445172538 + -28.103062508 -0.471252908 + -28.170338668 -0.394135030 + -28.145847473 -0.290986023 + -28.054170460 -0.265104252 + -27.986999626 -0.342172700 +} +85595aaffffffff +{ + 17.282191466 10.369182100 + 17.190350939 10.375765494 + 17.146717946 10.462178018 + 17.194880338 10.542129214 + 17.286779977 10.535675516 + 17.330458202 10.449140813 +} +8516de4ffffffff +{ + 45.379124313 168.659550370 + 45.473192753 168.663052555 + 45.522107295 168.546520754 + 45.476874270 168.426637368 + 45.382804023 168.423455578 + 45.333968396 168.539836734 +} +85a26387fffffff +{ + -16.984045474 57.414350662 + -17.076376572 57.423482853 + -17.112286044 57.510696872 + -17.055767533 57.588742858 + -16.963394897 57.579480713 + -16.927582221 57.492302551 +} +85dd6d0bfffffff +{ + -59.479918546 -36.422476380 + -59.413063398 -36.297640498 + -59.326876065 -36.353130776 + -59.307377305 -36.532642869 + -59.373939242 -36.657558884 + -59.460292663 -36.602885530 +} +850d264ffffffff +{ + 75.295737771 -156.394188999 + 75.220514022 -156.617821584 + 75.134417962 -156.483708410 + 75.123232171 -156.128932441 + 75.197938369 -155.904512423 + 75.284346475 -156.035629990 +} +85e8a813fffffff +{ + -65.992404235 -79.553822333 + -65.980044913 -79.329462556 + -65.895783210 -79.236226303 + -65.824170255 -79.366390726 + -65.836508072 -79.589243592 + -65.920480173 -79.683432228 +} +8524b127fffffff +{ + 38.441190658 95.974482076 + 38.352684095 95.992000879 + 38.324679697 96.096586790 + 38.385036215 96.183824402 + 38.473520534 96.166613147 + 38.501670791 96.061856648 +} +85df30cbfffffff +{ + -65.159641227 -59.903101457 + -65.118752277 -59.699085069 + -65.025738907 -59.679029352 + -64.973704220 -59.861538405 + -65.014351388 -60.064558722 + -65.107273975 -60.086063982 +} +85ee133bfffffff +{ + -73.265969368 -23.180457369 + -73.181606358 -23.013757445 + -73.097595880 -23.182766476 + -73.097523211 -23.516892601 + -73.181476567 -23.685287138 + -73.265912323 -23.517882910 +} +85c6cc2bfffffff +{ + -31.115305632 -131.048996689 + -31.025971809 -131.037644320 + -30.972266941 -131.115252222 + -31.007863754 -131.204354527 + -31.097274627 -131.215883818 + -31.151011689 -131.138133802 +} +858c5b3bfffffff +{ + -7.658188437 95.304117618 + -7.572460150 95.279910214 + -7.549044589 95.189351110 + -7.611383192 95.123041156 + -7.697079779 95.147286027 + -7.720469523 95.237803483 +} +85ee46dbfffffff +{ + -70.278164753 -49.474125953 + -70.222470588 -49.239615545 + -70.126443094 -49.264566400 + -70.086056969 -49.521675294 + -70.141366434 -49.755315639 + -70.237445002 -49.732720158 +} +850f656ffffffff +{ + 60.980293649 -53.871857482 + 60.956836952 -54.059338891 + 60.864840312 -54.112405350 + 60.796476864 -53.978796580 + 60.819866344 -53.792260683 + 60.911686138 -53.738391193 +} +858e990ffffffff +{ + -16.583651178 -92.145054790 + -16.657641603 -92.206051983 + -16.746489094 -92.169040159 + -16.761368123 -92.070964610 + -16.687360675 -92.009939436 + -16.598491249 -92.047017661 +} +85bcde47fffffff +{ + -24.141382624 29.314110257 + -24.047496465 29.319409409 + -23.996468699 29.231409267 + -24.039317804 29.138077768 + -24.133203773 29.132702820 + -24.184240916 29.220735137 +} +8538f06ffffffff +{ + 27.695499363 1.819673752 + 27.604052956 1.833843639 + 27.568737775 1.925553683 + 27.624878762 2.003265183 + 27.716423729 1.989219888 + 27.751729175 1.897338282 +} +8572680bfffffff +{ + 8.021219531 147.969674992 + 7.926470303 147.983790475 + 7.890537636 148.072432248 + 7.949317696 148.146941815 + 8.044021548 148.132861882 + 8.079990762 148.044236790 +} +857926dbfffffff +{ + 11.416594435 -136.590174096 + 11.328812496 -136.625484371 + 11.254806814 -136.568155523 + 11.268563504 -136.475594470 + 11.356272927 -136.440283239 + 11.430298166 -136.497533885 +} +853c1b6bfffffff +{ + 24.822540851 88.671243227 + 24.908417831 88.642909003 + 24.927030546 88.543795418 + 24.859795568 88.473083835 + 24.773940312 88.501442931 + 24.755298253 88.600488878 +} +850dab37fffffff +{ + 67.435972978 -167.119080201 + 67.353143747 -167.228929538 + 67.278308084 -167.100867710 + 67.285993756 -166.863734220 + 67.368499599 -166.752952084 + 67.443643161 -166.880227988 +} +85e56203fffffff +{ + -69.468232566 110.597384761 + -69.396669263 110.419991063 + -69.414641586 110.151701983 + -69.504309086 110.058991273 + -69.576199842 110.236137970 + -69.558094892 110.506250890 +} +8500ec4bfffffff +{ + 85.705423441 42.150884294 + 85.752087091 43.177831245 + 85.844812676 43.141641710 + 85.890676301 42.031059832 + 85.842421570 40.983811116 + 85.749926617 41.067300258 } -851fa0c3fffffff +852906dbfffffff +{ + 31.540383363 -122.441205093 + 31.624810681 -122.391604917 + 31.702471881 -122.449962140 + 31.695638337 -122.557917015 + 31.611206713 -122.607368122 + 31.533612900 -122.549013682 +} +85032d73fffffff +{ + 86.019752752 -46.668214315 + 86.093746942 -47.357962541 + 86.088915923 -48.707454798 + 86.010214200 -49.314650962 + 85.937934658 -48.603049980 + 85.942646352 -47.304766085 +} +85bb5c43fffffff +{ + -35.511159414 173.192001881 + -35.425836411 173.145482381 + -35.416992728 173.034909738 + -35.493525518 172.970618264 + -35.578963387 173.017053752 + -35.587753565 173.127865167 +} +85f1664bfffffff +{ + -88.319571424 50.812177412 + -88.251056692 48.725333292 + -88.268827876 45.780799873 + -88.356716697 44.655214579 + -88.429517277 46.704587269 + -88.410022095 49.933370825 +} +85dc0943fffffff +{ + -52.609859646 -21.125454795 + -52.686905083 -21.191031177 + -52.761794964 -21.107011482 + -52.759568123 -20.957190865 + -52.682433768 -20.891794659 + -52.607615163 -20.976037856 +} +85ef6e93fffffff +{ + -75.124682206 -77.919364491 + -75.111846443 -77.555412894 + -75.023297385 -77.414358891 + -74.947991475 -77.634542324 + -74.960748305 -77.994570112 + -75.048889173 -78.138310284 +} +850f1983fffffff +{ + 64.997215838 -71.664373789 + 64.949622319 -71.863529545 + 64.852827301 -71.864514614 + 64.803642392 -71.667720496 + 64.851000866 -71.469302386 + 64.947778344 -71.466941102 +} +85ecdb0ffffffff +{ + -68.952918056 115.670958089 + -68.886682509 115.483503405 + -68.912301073 115.227186686 + -69.004337378 115.156751226 + -69.070892526 115.344307068 + -69.045090799 115.602203431 +} +8588328bfffffff +{ + -8.847631734 -150.502084397 + -8.765930349 -150.475812046 + -8.701305501 -150.539019467 + -8.718281505 -150.628514695 + -8.799944350 -150.654901367 + -8.864669832 -150.591678622 +} +85204827fffffff +{ + 49.172551314 88.172850520 + 49.080208063 88.209725052 + 49.054752463 88.347522521 + 49.121520453 88.448801612 + 49.213887011 88.412371866 + 49.239462531 88.274217620 +} +850325d7fffffff +{ + 88.225586118 11.234252647 + 88.305745276 12.588030084 + 88.383891318 10.821937200 + 88.377657295 7.583897637 + 88.294276201 6.416820475 + 88.220294558 8.283482802 +} +8597894bfffffff +{ + -12.020956069 33.823290081 + -11.923924804 33.826505899 + -11.872499770 33.742496959 + -11.918083355 33.655221277 + -12.015134984 33.651935873 + -12.066582742 33.735995735 +} +851482d7fffffff +{ + 47.496054653 127.824327334 + 47.433059036 127.898584253 + 47.437690592 128.024189025 + 47.505370685 128.075993879 + 47.568571963 128.001874747 + 47.563887330 127.875811860 +} +85e996cbfffffff +{ + -76.156710594 -87.412796555 + -76.159211277 -87.024373791 + -76.078141401 -86.817967360 + -75.995093347 -86.998154203 + -75.992694900 -87.382051848 + -76.073242956 -87.590252690 +} +85c0330ffffffff +{ + -33.971326382 -13.469734527 + -34.061914599 -13.512841087 + -34.138131711 -13.439741883 + -34.123665319 -13.323469587 + -34.033000827 -13.280528171 + -33.956878939 -13.353693457 +} +85115d77fffffff +{ + 66.691388579 45.672073281 + 66.638912693 45.826096979 + 66.670117369 46.030967310 + 66.753940381 46.082582599 + 66.806589421 45.928228946 + 66.775241717 45.722588344 +} +8565104bfffffff +{ + 7.053115900 104.132822729 + 7.146628973 104.110453452 + 7.173452961 104.018139704 + 7.106714839 103.948215851 + 7.013182359 103.970645940 + 6.986407349 104.062939146 +} +8569307bfffffff +{ + 13.535201832 109.275548516 + 13.627882933 109.254930726 + 13.657522875 109.164170524 + 13.594424324 109.094033589 + 13.501694907 109.114722206 + 13.472112319 109.205476981 +} +85bd3547fffffff +{ + -41.124002494 39.833317491 + -41.048722009 39.834209080 + -41.016694660 39.738761495 + -41.059959295 39.642321625 + -41.135262274 39.641341067 + -41.167278214 39.736889396 +} +852381d3fffffff +{ + 43.013683017 -158.828050951 + 43.094133757 -158.788754736 + 43.163977093 -158.856249311 + 43.153323659 -158.963223173 + 43.072752459 -159.002426147 + 43.002955198 -158.934748988 +} +85d48c7bfffffff +{ + -42.994154691 -155.599550521 + -42.907843253 -155.557652616 + -42.839355173 -155.641996803 + -42.857119871 -155.768214672 + -42.943398732 -155.810303982 + -43.011945563 -155.725984463 +} +85acf4cffffffff +{ + -20.625457632 11.338039681 + -20.534731088 11.349763644 + -20.476746121 11.274598276 + -20.509456356 11.187768692 + -20.600107745 11.175999425 + -20.658124078 11.251104949 +} +85679b83fffffff +{ + 10.361749717 -82.403478776 + 10.293121361 -82.458555700 + 10.214152590 -82.421294275 + 10.203858847 -82.328930182 + 10.272542077 -82.273872869 + 10.351464151 -82.311159911 +} +85eed6c7fffffff +{ + -67.300612284 -19.876146521 + -67.215748219 -19.765220198 + -67.135785938 -19.901760915 + -67.140339880 -20.148548266 + -67.224916045 -20.260575105 + -67.305226461 -20.124722791 +} +85488e9bfffffff +{ + 29.221731959 -100.846699852 + 29.298599947 -100.781527636 + 29.387076607 -100.825516601 + 29.398666898 -100.934810660 + 29.321736902 -100.999974410 + 29.233278675 -100.955852834 +} +85f16dcbfffffff +{ + -84.975565233 -9.409788142 + -84.884205513 -9.108734994 + -84.816641201 -9.839613211 + -84.838958129 -10.870488643 + -84.929500428 -11.200156978 + -84.998558961 -10.470883810 +} +858d10cffffffff +{ + -11.465825868 112.317540827 + -11.388525622 112.299829808 + -11.371834690 112.218538584 + -11.432518036 112.154955293 + -11.509834085 112.172728848 + -11.526451063 112.254023183 +} +85019a9bfffffff +{ + 72.868181819 63.612949298 + 72.878098602 63.906779866 + 72.958906620 64.008470639 + 73.030038319 63.814145482 + 73.019910008 63.517694095 + 72.938862726 63.418203351 +} +8520b653fffffff +{ + 36.421925382 65.444074096 + 36.340809529 65.506016718 + 36.341943725 65.624572772 + 36.424219857 65.681492581 + 36.505476404 65.619671888 + 36.504316076 65.500808810 +} +85e30933fffffff +{ + -61.279434035 -145.162263729 + -61.265549461 -145.000542313 + -61.184365394 -144.952211587 + -61.117216308 -145.065133398 + -61.131125095 -145.226106331 + -61.212158674 -145.274903674 +} +851ea377fffffff +{ + 43.724748639 12.976269623 + 43.635281109 12.982147728 + 43.597275060 13.094877036 + 43.648711978 13.201918039 + 43.738218647 13.196268944 + 43.776249404 13.083349645 +} +850322a7fffffff +{ + 89.175642292 -80.876202533 + 89.208062833 -86.898977564 + 89.142771322 -91.585337860 + 89.053864617 -90.141703965 + 89.027019962 -84.956855610 + 89.084161321 -80.444588948 +} +854b4863fffffff +{ + 30.046456215 136.420041692 + 29.968295249 136.436690856 + 29.941295290 136.531747979 + 29.992474574 136.610179614 + 30.070631527 136.593551205 + 30.097613285 136.498470327 +} +8522c857fffffff +{ + 54.783982102 -173.781277188 + 54.865504070 -173.750757917 + 54.926946817 -173.863642938 + 54.906778995 -174.007134885 + 54.825182184 -174.037325525 + 54.763827888 -173.924353750 +} +85f258dbfffffff +{ + -74.907112477 -110.429971243 + -74.942787947 -110.120571861 + -74.887883254 -109.836321580 + -74.797748148 -109.862876898 + -74.762502610 -110.170058827 + -74.816964796 -110.452898021 +} +85c0e9a7fffffff +{ + -41.662533151 -2.824366252 + -41.754924660 -2.858478782 + -41.822041735 -2.768583956 + -41.796676782 -2.644619093 + -41.704265993 -2.610776028 + -41.637239288 -2.700627978 +} +85b17527fffffff +{ + -29.198159368 -126.365271504 + -29.152448799 -126.275967425 + -29.066477209 -126.272599338 + -29.026267969 -126.358305987 + -29.071883689 -126.447442206 + -29.157803324 -126.451039489 +} +8503332bfffffff +{ + 86.925978706 -146.310363601 + 86.863534080 -147.567233754 + 86.771145784 -147.208654548 + 86.740350503 -145.671503133 + 86.800542170 -144.428220909 + 86.893731608 -144.707003278 +} +85503017fffffff +{ + 17.899060594 -128.300900688 + 17.979927468 -128.262618499 + 18.056350325 -128.315561135 + 18.051809932 -128.406753751 + 17.970935905 -128.444903089 + 17.894609344 -128.391992789 +} +856873affffffff +{ + 9.117597717 122.757295024 + 9.025998170 122.774074003 + 8.996567985 122.860548883 + 9.058791804 122.930304439 + 9.150454548 122.913520990 + 9.179830302 122.826986391 +} +85f04097fffffff +{ + -77.603536847 34.893535638 + -77.519952105 34.695716528 + -77.513278506 34.274973756 + -77.590201648 34.046533014 + -77.674317589 34.241275598 + -77.680979371 34.667583507 +} +852f4383fffffff +{ + 32.592011294 140.700998131 + 32.678490998 140.675105101 + 32.704083495 140.580834098 + 32.643232646 140.512671769 + 32.556879950 140.538680700 + 32.531251127 140.632736395 +} +85878a2bfffffff +{ + -4.196573184 88.946161400 + -4.108387975 88.920342174 + -4.083727868 88.829779636 + -4.147252550 88.765092294 + -4.235384004 88.790933022 + -4.260044565 88.881439696 +} +851d8c0ffffffff +{ + 52.672806627 -148.477094141 + 52.617687878 -148.570887747 + 52.552746415 -148.540163010 + 52.542844322 -148.416111520 + 52.597749233 -148.322356396 + 52.662769699 -148.352613424 +} +85f21527fffffff +{ + -80.724031209 -144.805031574 + -80.799232120 -144.541615250 + -80.795392505 -143.986776149 + -80.716266646 -143.704861122 + -80.641707721 -143.973112096 + -80.645632140 -144.518549113 +} +85b44173fffffff +{ + -24.494987350 -166.491326965 + -24.407051369 -166.448519541 + -24.329865440 -166.509652663 + -24.340550138 -166.613502374 + -24.428397516 -166.656383250 + -24.505648796 -166.595341255 +} +85aa2d83fffffff +{ + -20.437748820 73.923080514 + -20.532457796 73.945381219 + -20.561917395 74.044260867 + -20.496634083 74.120723305 + -20.401965108 74.098304832 + -20.372539360 73.999541522 +} +85377173fffffff +{ + 39.304203243 -142.051893599 + 39.233363012 -142.091339968 + 39.169188352 -142.021532129 + 39.175858910 -141.912349690 + 39.246683544 -141.872875634 + 39.310853254 -141.942611483 +} +85067673fffffff +{ + 65.819055472 -30.501277187 + 65.830388977 -30.706288738 + 65.757884500 -30.833882297 + 65.674316728 -30.756597278 + 65.663140695 -30.552769658 + 65.735375497 -30.425047456 +} +8502d6dbfffffff +{ + 71.359306179 -120.082650837 + 71.271157390 -120.159738438 + 71.206055106 -119.975696199 + 71.228784344 -119.714399146 + 71.316829100 -119.635359887 + 71.382249720 -119.819562080 +} +8520292ffffffff +{ + 49.376034798 75.681423310 + 49.287342325 75.742221604 + 49.276951380 75.890189202 + 49.355207495 75.977826237 + 49.444001370 75.917370099 + 49.454437849 75.768933567 +} +85e006d3fffffff +{ + -59.335298285 63.751780633 + -59.243953411 63.755921389 + -59.199325988 63.610287628 + -59.245805789 63.460230454 + -59.337061327 63.455245294 + -59.381926916 63.601160905 +} +855d485bfffffff +{ + 16.546415041 -142.645403052 + 16.456706850 -142.680631379 + 16.381749101 -142.617701083 + 16.396482808 -142.519597163 + 16.486144622 -142.484344228 + 16.561119130 -142.547219661 +} +854daa13fffffff +{ + 28.013849292 -68.823266308 + 27.979634036 -68.905508472 + 27.910790512 -68.910062156 + 27.876182738 -68.832596899 + 27.910283311 -68.750493827 + 27.979106129 -68.745717001 +} +85a28a33fffffff +{ + -28.746107161 48.439366436 + -28.836863891 48.441711703 + -28.881541062 48.526694509 + -28.835372797 48.609341089 + -28.744529198 48.606856395 + -28.699940700 48.521864670 +} +85bf3613fffffff +{ + -39.753025393 167.277574470 + -39.664878277 167.233415034 + -39.651706470 167.112999093 + -39.726703300 167.036471343 + -39.814946609 167.080483156 + -39.828096923 167.201170892 +} +85e225affffffff +{ + -60.895879520 -142.037980692 + -60.877801486 -141.875721585 + -60.794377694 -141.834211532 + -60.729173246 -141.954433614 + -60.747254047 -142.115961176 + -60.830536383 -142.157996053 +} +85cb0253fffffff +{ + -34.569967800 49.042056065 + -34.659385218 49.045059920 + -34.705809113 49.135576082 + -34.662740837 49.223094784 + -34.573242906 49.219933869 + -34.526893714 49.129411450 +} +85354c93fffffff +{ + 36.503474284 -13.948553923 + 36.432766875 -14.027764059 + 36.341188974 -13.991999196 + 36.320303514 -13.877256384 + 36.390914357 -13.798082672 + 36.482507100 -13.833615036 +} +85cb6bb3fffffff +{ + -31.507121126 62.553948927 + -31.601565191 62.568806622 + -31.639159087 62.671744780 + -31.582245935 62.759747151 + -31.487777752 62.744723769 + -31.450246734 62.641863645 +} +85048e63fffffff +{ + 66.113971078 146.741448441 + 66.023352592 146.813587696 + 66.002941728 147.044848105 + 66.072996720 147.205455820 + 66.163819413 147.134668731 + 66.184383672 146.901915616 +} +85f28257fffffff +{ + -88.296501295 -143.038253329 + -88.375168604 -141.426937791 + -88.367226271 -138.235024975 + -88.281070484 -136.959300210 + -88.206236444 -138.681184730 + -88.213761010 -141.585910217 +} +85165137fffffff +{ + 53.129295238 175.808193659 + 53.216107763 175.823011187 + 53.269104024 175.698295713 + 53.235193583 175.558844198 + 53.148344766 175.544416048 + 53.095442451 175.669049592 +} +85264acbfffffff +{ + 35.682281196 -89.648433108 + 35.747185426 -89.577059422 + 35.834279028 -89.611833206 + 35.856501187 -89.718167052 + 35.791551783 -89.789615542 + 35.704425456 -89.754655528 +} +85cd2453fffffff +{ + -50.798910157 96.013077694 + -50.715868945 95.942349758 + -50.713188308 95.791365639 + -50.793516629 95.710509740 + -50.876727579 95.780878787 + -50.879440560 95.932464336 +} +85b60443fffffff +{ + -29.628707450 -93.664793465 + -29.562993857 -93.600893867 + -29.480228380 -93.639500073 + -29.463050292 -93.741859709 + -29.528632487 -93.805854937 + -29.611524151 -93.767395338 +} +85a12a13fffffff +{ + -27.237621808 -135.249884586 + -27.147067736 -135.234586026 + -27.088046809 -135.310535975 + -27.119526194 -135.401900401 + -27.210136559 -135.417371040 + -27.269211324 -135.341305156 +} +8587598bfffffff +{ + -12.589431594 80.250944496 + -12.679290311 80.275874768 + -12.705627902 80.368567076 + -12.642092950 80.436210008 + -12.552306243 80.411195742 + -12.525982431 80.318622366 +} +8572250ffffffff +{ + 8.466705771 137.325189712 + 8.371002068 137.341185548 + 8.336867054 137.433157680 + 8.398436711 137.509153116 + 8.494143599 137.493178218 + 8.528277710 137.401186877 +} +85f16067fffffff +{ + -87.256242884 13.015268595 + -87.162927884 12.824946632 + -87.124998761 11.133701723 + -87.178394102 9.562011429 + -87.272132846 9.642520758 + -87.312127988 11.405663628 +} +85e019c3fffffff +{ + -56.335160528 59.069582289 + -56.246971982 59.085320938 + -56.200218281 58.962518946 + -56.241426086 58.823857797 + -56.329494629 58.807466927 + -56.376475721 58.930388371 +} +851c1bdbfffffff +{ + 47.635051262 -144.559125060 + 47.574720237 -144.600056747 + 47.520639629 -144.524699476 + 47.526878260 -144.408472813 + 47.587194575 -144.367496685 + 47.641286999 -144.442791397 +} +85006373fffffff { - 50.537436996 4.984067180 - 50.457365392 4.999295466 - 50.432746787 5.120651211 - 50.488197687 5.227057963 - 50.568325094 5.212063320 - 50.592945921 5.090427842 + 82.097372017 -8.321361701 + 82.180292884 -8.247195450 + 82.233006523 -8.779627332 + 82.201881113 -9.382669184 + 82.118781321 -9.444475144 + 82.066977266 -8.915656884 +} +85357413fffffff +{ + 41.497233256 -18.136735236 + 41.424761137 -18.218551671 + 41.334627891 -18.174710531 + 41.316932594 -18.049296249 + 41.389312159 -17.967474853 + 41.479479461 -18.011072215 +} +85f165cffffffff +{ + -87.797693622 -17.978432030 + -87.712401300 -16.985567857 + -87.637718424 -18.344353748 + -87.645241055 -20.643510657 + -87.727896783 -21.741131296 + -87.805693076 -20.442524791 +} +85f12a1bfffffff +{ + -85.235888612 116.015552923 + -85.262603683 114.981849176 + -85.348099048 114.779604896 + -85.407403256 115.645372513 + -85.379610291 116.707853973 + -85.293613857 116.875361201 +} +85ef12c3fffffff +{ + -82.501231920 -11.759843009 + -82.410104858 -11.527413195 + -82.338864750 -12.004481465 + -82.357750207 -12.712293584 + -82.448269966 -12.957223445 + -82.520517908 -12.482027391 +} +858c5acbfffffff +{ + -7.334559293 97.146412691 + -7.248630054 97.122683667 + -7.225504543 97.032168092 + -7.288340442 96.965418916 + -7.374244576 96.989189844 + -7.397337983 97.079668138 +} +853754bbfffffff +{ + 38.567755216 -143.717650617 + 38.495168633 -143.756516188 + 38.431088918 -143.685906391 + 38.439599152 -143.576491876 + 38.512171751 -143.537590761 + 38.576248142 -143.608139483 +} +85636b1bfffffff +{ + 12.121397345 65.623227881 + 12.200175903 65.596932967 + 12.213375536 65.523281823 + 12.147894131 65.475992970 + 12.069205901 65.502253917 + 12.055908789 65.575837718 +} +8592ddc7fffffff +{ + -19.989948840 -106.944627738 + -20.052598431 -107.001510703 + -20.137060023 -106.972885723 + -20.158944381 -106.887282793 + -20.096288738 -106.830313279 + -20.011754777 -106.859033219 +} +85016a97fffffff +{ + 76.008232274 -2.657883373 + 76.082301098 -2.583926290 + 76.137737963 -2.848346047 + 76.118573555 -3.186435185 + 76.044307465 -3.257015093 + 75.989400821 -2.992899325 +} +85108963fffffff +{ + 54.469099318 55.293673663 + 54.397321344 55.394167499 + 54.414004091 55.552278654 + 54.502557684 55.610416397 + 54.574491062 55.509945699 + 54.557715209 55.351312815 } -8512950bfffffff -{ - 53.488367232 -130.838458336 - 53.408915294 -130.851804877 - 53.353027650 -130.745772435 - 53.376425345 -130.626158459 - 53.455905166 -130.612271964 - 53.511959782 -130.718539242 -} -85419cd7fffffff -{ - 29.144746467 117.226974058 - 29.226980431 117.209272324 - 29.262809075 117.121675485 - 29.216366889 117.051761476 - 29.134065999 117.069546552 - 29.098274201 117.157162296 -} -855481c3fffffff -{ - 13.748636851 -20.253377399 - 13.680761264 -20.311632731 - 13.602674233 -20.277781444 - 13.592396983 -20.185796232 - 13.660158520 -20.127525548 - 13.738311271 -20.161255225 -} -85088657fffffff -{ - 59.244529771 17.138286296 - 59.173127112 17.140146937 - 59.141368658 17.281216168 - 59.180947924 17.420673305 - 59.252361006 17.419189194 - 59.284184606 17.277871238 -} -851d2223fffffff -{ - 56.500233740 -137.767509433 - 56.420343241 -137.764111437 - 56.372431712 -137.644228472 - 56.404278941 -137.527357416 - 56.484252407 -137.530155265 - 56.532296025 -137.650424753 -} -85c70a97fffffff -{ - -43.219130606 -141.471891746 - -43.130935639 -141.446041930 - -43.074925984 -141.536658177 - -43.107067224 -141.653241188 - -43.195289620 -141.679336751 - -43.251343468 -141.588603685 -} -85ee2447fffffff -{ - -78.683826538 -41.946253746 - -78.618706986 -41.580868172 - -78.523885298 -41.686168065 - -78.493907370 -42.150427952 - -78.558342287 -42.515013353 - -78.653435611 -42.416178631 -} -85eca41bfffffff -{ - -63.864113769 145.861484187 - -63.835272978 145.674475143 - -63.895872622 145.530347380 - -63.985565755 145.573295798 - -64.014476594 145.761337251 - -63.953623847 145.905394413 -} -8506354ffffffff -{ - 71.829739665 -25.409423494 - 71.851165278 -25.668072973 - 71.786079991 -25.849668503 - 71.699884574 -25.772457804 - 71.678681559 -25.515616070 - 71.743452429 -25.334184605 -} -8505628ffffffff -{ - 84.779258756 140.942757718 - 84.692345664 141.353799527 - 84.680132272 142.381787812 - 84.754453861 143.029359003 - 84.842405662 142.641256248 - 84.855006090 141.582020360 -} -85e2834ffffffff -{ - -59.991021089 -117.121599346 - -59.940487653 -116.968061016 - -59.848998145 -116.984232553 - -59.808038077 -117.153172461 - -59.858423287 -117.306372275 - -59.949916313 -117.290971033 -} -85002c7bfffffff -{ - 78.792658270 23.621602567 - 78.854979179 23.902334415 - 78.936305585 23.735693637 - 78.954820259 23.283569745 - 78.891860089 23.004145894 - 78.811026260 23.175486130 -} -85cc6663fffffff -{ - -47.354930168 75.061926110 - -47.269363525 75.040938710 - -47.243655166 74.918828727 - -47.303344568 74.817388365 - -47.388926993 74.837906947 - -47.414804601 74.960335080 -} -855f9b03fffffff -{ - 11.548060740 -47.666117572 - 11.625658820 -47.616591110 - 11.703080801 -47.661685166 - 11.702929749 -47.756271571 - 11.625380948 -47.805783901 - 11.547933941 -47.760724085 -} -85056493fffffff -{ - 86.613067293 122.741471769 - 86.542880808 123.773302680 - 86.559493001 125.331505954 - 86.647018740 125.927901079 - 86.719429512 124.909177095 - 86.702063051 123.278817899 -} -850f1257fffffff -{ - 68.742133995 -79.663083522 - 68.684946817 -79.876188500 - 68.590171650 -79.845249811 - 68.552504904 -79.602995370 - 68.609384555 -79.390408025 - 68.704237303 -79.419554249 -} -85033237fffffff -{ - 86.859958023 -164.743628886 - 86.778975026 -165.567366160 - 86.696707807 -164.736102495 - 86.693495526 -163.124033653 - 86.772447458 -162.262946163 - 86.856638033 -163.048509983 -} -85eb6b23fffffff -{ - -71.320048327 -159.499370837 - -71.391159625 -159.439591608 - -71.404504508 -159.191157802 - -71.346499122 -159.004259054 - -71.275545726 -159.065819781 - -71.262438635 -159.312505114 -} -857c2c0ffffffff -{ - -2.321013577 -24.112088819 - -2.241149923 -24.068437882 - -2.160630082 -24.113049329 - -2.159920300 -24.201367584 - -2.239809694 -24.245093929 - -2.320383148 -24.200426686 -} -85417177fffffff -{ - 19.160436661 108.505118392 - 19.251767788 108.483769653 - 19.282426171 108.390737540 - 19.221708985 108.319062302 - 19.130330205 108.340483562 - 19.099716225 108.433507596 -} -855f9c87fffffff -{ - 9.037057585 -48.021992682 - 9.116262288 -47.972307517 - 9.195622477 -48.017468275 - 9.195798615 -48.112278483 - 9.116641767 -48.161947915 - 9.037260948 -48.116823000 -} -8502b31bfffffff -{ - 73.574889924 -138.887722258 - 73.520555624 -139.148677239 - 73.431351121 -139.126556327 - 73.396475769 -138.846514867 - 73.450404830 -138.586774922 - 73.539612332 -138.605858042 -} -851e1a2ffffffff -{ - 44.880783889 18.881709246 - 44.791453207 18.881321037 - 44.747936368 18.994618284 - 44.793706753 19.108450150 - 44.883050624 19.109085225 - 44.926611088 18.995641521 -} -85f28397fffffff -{ - -86.869858614 -127.925668558 - -86.933327865 -126.711047364 - -86.903206851 -125.104745176 - -86.810901715 -124.784401210 - -86.749701141 -125.991807715 - -86.778582612 -127.528522856 -} -8500584ffffffff -{ - 86.746535687 -4.027879279 - 86.833345095 -3.719376543 - 86.893618037 -5.000344086 - 86.864718440 -6.578022303 - 86.777170317 -6.810814709 - 86.719210840 -5.543009108 -} -85f15e5bfffffff +85369347fffffff { - -82.481541309 54.705541065 - -82.417538643 54.194068976 - -82.442678514 53.541676044 - -82.532430653 53.388721477 - -82.597391381 53.901675337 - -82.571633401 54.566228254 -} -85399833fffffff -{ - 29.394887909 -7.512366812 - 29.328494121 -7.587104911 - 29.238920720 -7.562219168 - 29.215753311 -7.462801943 - 29.282048998 -7.388142397 - 29.371610063 -7.412821402 -} -85de9aaffffffff -{ - -51.493256113 -35.893684561 - -51.432195589 -35.797650197 - -51.354352150 -35.841934332 - -51.337429538 -35.981767541 - -51.398251560 -36.077861534 - -51.476234391 -36.034064059 -} -85cf2427fffffff -{ - -56.348529689 -79.515428893 - -56.266316880 -79.444788449 - -56.192006815 -79.528608691 - -56.199751824 -79.682978629 - -56.281901639 -79.754095852 - -56.356369613 -79.670367842 -} -85211187fffffff -{ - 48.090048336 60.651215608 - 48.011089008 60.733291964 - 48.019606267 60.875997669 - 48.107143499 60.937065279 - 48.186253191 60.855094176 - 48.177675158 60.711949131 -} -85e3862bfffffff -{ - -67.813334899 -126.325958082 - -67.779660670 -126.122271142 - -67.696112279 -126.115062877 - -67.646289837 -126.310349509 - -67.679820407 -126.513166392 - -67.763316406 -126.521564969 -} -850003affffffff -{ - 80.358989421 38.585254960 - 80.406981576 39.013794426 - 80.496012341 38.958032515 - 80.536830301 38.464996550 - 80.488085715 38.033680296 - 80.399281365 38.098147261 -} -85d0d86ffffffff -{ - -55.369900146 18.441000423 - -55.292198554 18.412122631 - -55.259849487 18.272275908 - -55.305075166 18.160765496 - -55.382896948 18.189032748 - -55.415373256 18.329422139 -} -85484233fffffff -{ - 29.463385720 -115.174897801 - 29.546768113 -115.119056098 - 29.629953358 -115.173490617 - 29.629693555 -115.283814060 - 29.546278550 -115.339547978 - 29.463155945 -115.285066544 -} -8500ce37fffffff -{ - 87.028960788 96.811762254 - 86.992480629 98.440101367 - 87.047349112 99.922382927 - 87.141036950 99.808439571 - 87.179422333 98.111689042 - 87.122147047 96.598480365 -} -85033207fffffff -{ - 86.690643571 -169.579564980 - 86.605986070 -170.246233530 - 86.527710548 -169.346693775 - 86.532089259 -167.808594676 - 86.614997602 -167.097370020 - 86.695285243 -167.966431022 -} -85dfb6d7fffffff -{ - -65.408253256 -39.730759762 - -65.341816901 -39.565834262 - -65.250188034 -39.622852511 - -65.224834021 -39.843437525 - -65.290921231 -40.008309309 - -65.382710720 -39.952654507 -} -85dfb06ffffffff -{ - -63.644807569 -40.942902060 - -63.580403316 -40.786170378 - -63.489425822 -40.835049749 - -63.462713240 -41.039454332 - -63.526788274 -41.196083014 - -63.617904293 -41.148413653 -} -8500ad1bfffffff -{ - 79.474670982 59.182853445 - 79.494345519 59.657825873 - 79.581671747 59.789526439 - 79.649624984 59.439652306 - 79.629543213 58.958051241 - 79.541919396 58.833007715 -} -857c58affffffff -{ - 6.073028380 -27.356706573 - 6.149708604 -27.311753496 - 6.230614572 -27.356929573 - 6.234903298 -27.447103763 - 6.158225309 -27.492122343 - 6.077256327 -27.446901322 -} -85eb218bfffffff -{ - -62.369726350 -152.902807209 - -62.365934418 -152.744190411 - -62.291150760 -152.679524091 - -62.220320794 -152.773170310 - -62.224186579 -152.931032288 - -62.298808551 -152.996000569 -} -85ef46c7fffffff -{ - -76.928309543 -65.932591371 - -76.896939280 -65.532812664 - -76.802059653 -65.453791832 - -76.738807786 -65.769732740 - -76.769846108 -66.165257391 - -76.864465235 -66.249069174 -} -8565ae0bfffffff -{ - 9.784680346 103.735034764 - 9.878637604 103.712321023 - 9.906041637 103.619027319 - 9.839444396 103.548469538 - 9.745466139 103.571244398 - 9.718106067 103.664516000 -} -8526542bfffffff -{ - 39.026560902 -92.998718707 - 39.091807453 -92.925218274 - 39.177321180 -92.964967353 - 39.197606518 -93.078408391 - 39.132315524 -93.151963990 - 39.046783703 -93.112023607 -} -85f3a083fffffff -{ - -77.933387395 174.096914810 - -78.011429717 174.003340010 - -78.061848631 174.310055405 - -78.033598042 174.709795812 - -77.955271967 174.798650363 - -77.905477315 174.492509582 -} -8500b473fffffff -{ - 73.757658811 68.742250376 - 73.760503270 69.059332209 - 73.839682663 69.195162031 - 73.916340845 69.011833160 - 73.913355525 68.691619153 - 73.833853687 68.557886223 -} -85ee4a83fffffff -{ - -66.025609861 -51.580929841 - -65.973323535 -51.383563490 - -65.879031749 -51.395616003 - -65.837010803 -51.603428978 - -65.888982418 -51.800098691 - -65.983288479 -51.789652929 -} -85c9858ffffffff -{ - -36.533308624 117.518978456 - -36.475212524 117.440150541 - -36.493578034 117.336267040 - -36.570151099 117.310960337 - -36.628420986 117.389827229 - -36.609943775 117.493962219 -} -85071153fffffff -{ - 73.500862043 -13.698484961 - 73.537318511 -13.947723512 - 73.486513352 -14.175430438 - 73.399518966 -14.152749390 - 73.363378322 -13.904850242 - 73.413917671 -13.678293587 -} -85f29e4bfffffff -{ - -88.987397973 -35.802281255 - -88.917420036 -32.453056994 - -88.831443098 -34.135734390 - -88.811329786 -38.626890835 - -88.874356820 -42.014830200 - -88.964121572 -40.925350927 + 26.566845010 -157.692100795 + 26.478478271 -157.723183441 + 26.412658460 -157.652193458 + 26.435197564 -157.550090425 + 26.523583373 -157.518923798 + 26.589411059 -157.589944047 } -85dc9ebbfffffff -{ - -48.053360018 -4.703399240 - -48.142096933 -4.743539521 - -48.207524380 -4.646414550 - -48.184125082 -4.509174512 - -48.095357776 -4.469347443 - -48.030019999 -4.566446630 -} -85945857fffffff -{ - -13.372065428 133.020706163 - -13.459087479 133.036658760 - -13.491828992 133.125399229 - -13.437564682 133.198218297 - -13.350510784 133.182278402 - -13.317752977 133.093506670 -} -850c25c3fffffff -{ - 67.870162254 -153.798736525 - 67.799508422 -153.953754077 - 67.717410072 -153.876082979 - 67.705781738 -153.644774971 - 67.776070396 -153.489568561 - 67.858351742 -153.565852285 -} -85c3202ffffffff -{ - -44.038786000 -65.316835500 - -43.960775982 -65.290399795 - -43.897042972 -65.363326001 - -43.911191364 -65.462788315 - -43.989219081 -65.489532399 - -44.053080892 -65.416505974 -} -852b8b57fffffff -{ - 42.852787991 -75.720509299 - 42.804075525 -75.826534038 - 42.715764590 -75.819475396 - 42.676147297 -75.706810331 - 42.724681590 -75.600958070 - 42.813010999 -75.607598242 -} -851ae8b7fffffff -{ - 43.624308018 -39.066457030 - 43.540379192 -39.126620708 - 43.462365305 -39.058646443 - 43.468183865 -38.930565751 - 43.552070692 -38.870174638 - 43.630181021 -38.938091045 -} -85b35383fffffff -{ - -24.215683883 -66.467601943 - -24.292390471 -66.519969716 - -24.368066819 -66.477694730 - -24.367007258 -66.383086885 - -24.290336704 -66.330814946 - -24.214689699 -66.373054903 -} -85343607fffffff -{ - 37.565455653 -29.182303300 - 37.484501277 -29.250113687 - 37.397633180 -29.195801762 - 37.391636451 -29.073820281 - 37.472509191 -29.005894877 - 37.559460275 -29.060065428 -} -85ec2e23fffffff -{ - -71.407073989 153.169971409 - -71.392350532 152.912359447 - -71.461850082 152.743412102 - -71.546358642 152.832724287 - -71.561099088 153.092426682 - -71.491313653 153.260715630 -} -854221d7fffffff -{ - 28.945952606 61.092322739 - 28.871688763 61.151691427 - 28.875235765 61.255785327 - 28.953095447 61.300744073 - 29.027504147 61.241434646 - 29.023908211 61.137106790 -} -850d222ffffffff -{ - 73.841238407 -154.649179929 - 73.768020574 -154.859858905 - 73.681899379 -154.747639280 - 73.668735367 -154.427316918 - 73.741474895 -154.216184070 - 73.827855359 -154.325809147 -} -85ad89cbfffffff -{ - -25.149345804 15.724544015 - -25.059091721 15.735120023 - -25.002024699 15.654191599 - -25.035190980 15.562729485 - -25.125391088 15.552096398 - -25.182478948 15.632982407 -} -85911ba7fffffff -{ - -13.055035670 -123.067084630 - -12.980445508 -123.064530456 - -12.929283645 -123.124993183 - -12.952659823 -123.188117533 - -13.027315943 -123.190772719 - -13.078529972 -123.130202454 -} -85a7b367fffffff -{ - -23.520794617 120.980664900 - -23.439644951 120.989892577 - -23.400074897 120.924583435 - -23.441532021 120.850080321 - -23.522578916 120.840732267 - -23.562271464 120.906007518 -} -854ae1d7fffffff -{ - 21.520546238 135.199130555 - 21.432909116 135.215687732 - 21.402931116 135.309333837 - 21.460612268 135.386449980 - 21.548251877 135.369910812 - 21.578207921 135.276237415 -} -85de536bfffffff -{ - -49.108835688 -53.282877289 - -49.065888110 -53.169788478 - -48.988384557 -53.172593441 - -48.953830854 -53.287975560 - -48.996587115 -53.400816254 - -49.074087950 -53.398522983 -} -85b14a9bfffffff -{ - -24.746989256 -125.125239239 - -24.701628230 -125.041961782 - -24.620091988 -125.040331241 - -24.583954566 -125.121774672 - -24.629215717 -125.204911390 - -24.710713992 -125.206745315 -} -85cd764bfffffff -{ - -50.005955518 86.510815275 - -49.919455363 86.462121093 - -49.905078132 86.319163778 - -49.977092588 86.224386646 - -50.063698454 86.272610506 - -50.078184447 86.416083072 -} -85da160bfffffff -{ - -49.434343110 172.143582187 - -49.355363961 172.087938125 - -49.351598968 171.952552783 - -49.426853050 171.872456282 - -49.505927160 171.927962865 - -49.509652227 172.063704236 -} -85efaa87fffffff -{ - -79.556451795 -12.577752697 - -79.465109073 -12.402069908 - -79.392020384 -12.743395673 - -79.409544786 -13.259299346 - -79.500437355 -13.441436166 - -79.574258874 -13.101288005 -} -85ce859bfffffff -{ - -41.961617532 -71.724125708 - -41.883645226 -71.686585450 - -41.813192575 -71.754118160 - -41.820564160 -71.859226421 - -41.898515256 -71.897054231 - -41.969116166 -71.829486597 -} -8513a1d7fffffff -{ - 63.822860646 -132.387976341 - 63.736217669 -132.401456402 - 63.682771539 -132.251074794 - 63.715779692 -132.086705756 - 63.802476362 -132.072169316 - 63.856111823 -132.223058176 -} -8546496ffffffff -{ - 21.012863274 -157.263953553 - 20.921612462 -157.294490986 - 20.852455145 -157.225262533 - 20.874530731 -157.125470125 - 20.965795906 -157.094853957 - 21.034971183 -157.164108801 -} -856d8a8bfffffff -{ - 9.222441206 -101.076085675 - 9.296645675 -101.020448797 - 9.377994638 -101.058234870 - 9.385090547 -101.151754158 - 9.310793061 -101.207383658 - 9.229492747 -101.169501418 -} -8500cddbfffffff -{ - 87.906969387 75.372975641 - 87.903605271 77.875246793 - 87.981733584 79.337179849 - 88.066456811 78.217590315 - 88.070133212 75.504935397 - 87.988755913 74.133394669 -} -85061c57fffffff -{ - 70.187694537 -36.388793621 - 70.193315032 -36.645926819 - 70.116435549 -36.782938668 - 70.034243362 -36.663407588 - 70.028729503 -36.408173677 - 70.105301628 -36.270580913 -} -852532b7fffffff -{ - 51.068572966 89.895855232 - 50.976203648 89.930607084 - 50.948239968 90.071613959 - 51.012518328 90.178230387 - 51.104899757 90.143965207 - 51.132990998 90.002596344 -} -85008c0ffffffff -{ - 79.407720539 75.607879731 - 79.402200831 76.104121694 - 79.480230836 76.371939919 - 79.564386761 76.140056759 - 79.569894487 75.636051273 - 79.491258047 75.371771685 -} -8505a50ffffffff -{ - 73.383989876 112.001864476 - 73.323319837 112.261655180 - 73.357013412 112.571766327 - 73.451727558 112.624458777 - 73.512858049 112.363851511 - 73.478811717 112.051359444 -} -85702423fffffff -{ - 8.572966413 -170.212256041 - 8.484996262 -170.233924285 - 8.419130314 -170.170898258 - 8.441192723 -170.086125705 - 8.529212331 -170.064368259 - 8.595120116 -170.127472544 -} -8544d123fffffff -{ - 33.626976701 -81.107369833 - 33.685545161 -81.038928554 - 33.771230188 -81.063323071 - 33.798412864 -81.156337255 - 33.739811995 -81.224893816 - 33.654060895 -81.200320912 -} -85acb5c7fffffff -{ - -21.704079143 18.293277636 - -21.610832775 18.302806863 - -21.554364094 18.221077281 - -21.591114398 18.129846784 - -21.684311612 18.120257225 - -21.740807736 18.201958412 -} -85a05a67fffffff -{ - -13.145872907 -143.342737393 - -13.061048500 -143.321818544 - -12.996925456 -143.389032673 - -13.017532267 -143.477221281 - -13.102353526 -143.498274758 - -13.166571239 -143.431005073 -} -85c68e6bfffffff -{ - -37.925544784 -125.242773546 - -37.877925226 -125.140342431 - -37.784940181 -125.138188758 - -37.739630994 -125.238159004 - -37.787154931 -125.340376511 - -37.880083470 -125.342837190 -} -85ec5a2ffffffff -{ - -75.682980043 125.633937199 - -75.632735914 125.336145836 - -75.672590081 124.997580532 - -75.763035753 124.954539776 - -75.813682669 125.253796849 - -75.773478731 125.594634115 -} -854b8a73fffffff -{ - 20.821399848 124.751183632 - 20.736295555 124.768286641 - 20.712257827 124.857740774 - 20.773377740 124.930149447 - 20.858518090 124.913045277 - 20.882502530 124.823533523 -} -85ed34dbfffffff -{ - -63.028154122 169.305552895 - -63.026592961 169.125615304 - -63.098280273 169.060807863 - -63.169161417 169.161130914 - -63.168110667 169.326420208 - -63.096318994 169.390522743 - -63.061011246 169.340224867 -} -85032a6bfffffff -{ - 86.275174133 -83.627759943 - 86.305409139 -84.929272901 - 86.245287346 -86.018931523 - 86.156853747 -85.796101076 - 86.128001446 -84.537749187 - 86.186236400 -83.459808980 -} -85f2a447fffffff -{ - -83.963338221 -169.401911871 - -84.050745623 -169.350481004 - -84.085162063 -168.567378843 - -84.031158154 -167.850364069 - -83.943890714 -167.923917325 - -83.910471871 -168.692467304 -} -85820a03fffffff -{ - -2.804796702 7.903616490 - -2.717071372 7.915315263 - -2.667988859 7.849266588 - -2.706556748 7.771580808 - -2.794190752 7.759850140 - -2.843348186 7.825837070 -} -852ecc13fffffff -{ - 43.825403557 134.701561435 - 43.905371716 134.666120880 - 43.918131045 134.562299877 - 43.850995847 134.494196708 - 43.771149728 134.529740324 - 43.758316811 134.633284531 -} -85046b13fffffff -{ - 75.724405048 -170.337481824 - 75.636842010 -170.493207672 - 75.560014400 -170.271920635 - 75.570256055 -169.896429040 - 75.657379256 -169.737962167 - 75.734701278 -169.957695619 -} -853ac283fffffff -{ - 22.368572912 -49.717655616 - 22.291193871 -49.750851621 - 22.219199096 -49.694500799 - 22.224462446 -49.604921019 - 22.301818636 -49.571561706 - 22.373934455 -49.627945330 -} -852221d3fffffff -{ - 42.772651084 -168.463915425 - 42.860367973 -168.433133814 - 42.927198975 -168.517685589 - 42.906234656 -168.633131303 - 42.818411325 -168.663733062 - 42.751658716 -168.579069504 -} -85e40243fffffff -{ - -58.816599868 103.056597308 - -58.735857361 102.951523653 - -58.742421365 102.764218747 - -58.829760993 102.681068049 - -58.910730481 102.785789422 - -58.904133225 102.974017025 -} -85ef086ffffffff -{ - -79.490848379 -50.308115030 - -79.436837916 -49.870524082 - -79.340315293 -49.910879793 - -79.297715524 -50.380792198 - -79.351051274 -50.815199872 - -79.447655775 -50.782893617 -} -85f3b627fffffff -{ - -79.170730496 158.481034715 - -79.168159445 158.052638386 - -79.242680353 157.805751043 - -79.320192371 157.990029037 - -79.322748542 158.424370581 - -79.247807442 158.668436062 -} -8504426ffffffff -{ - 74.004214696 174.856556781 - 73.909027259 174.799035066 - 73.847990380 175.064452962 - 73.881649022 175.387936027 - 73.976635394 175.448768505 - 74.038166339 175.182820220 -} -85f0252ffffffff -{ - -82.676391924 72.818716012 - -82.636522835 72.174911999 - -82.686245862 71.609778564 - -82.776805871 71.683601265 - -82.817365906 72.337839713 - -82.766664921 72.907750944 -} -85e7a4c7fffffff -{ - -64.914517506 43.421892345 - -64.844542217 43.302723300 - -64.845596028 43.105051518 - -64.916738311 43.025347201 - -64.987028688 43.144173965 - -64.985861251 43.343052071 -} -856d5d93fffffff -{ - 9.028149838 -88.470238376 - 8.957645058 -88.526576384 - 8.878224878 -88.490934191 - 8.869339897 -88.398907797 - 8.939905508 -88.342562062 - 9.019295223 -88.378250331 -} -8593aab3fffffff -{ - -5.965125869 -108.365858557 - -6.033687344 -108.419291699 - -6.116245068 -108.392948432 - -6.130296256 -108.313085437 - -6.061688415 -108.259570793 - -5.979075776 -108.286000632 -} -85dae3cffffffff -{ - -49.673573809 160.611355218 - -49.587900864 160.568274599 - -49.570223439 160.427793815 - -49.638200309 160.330050975 - -49.723940164 160.372864046 - -49.741636358 160.513688280 -} -85878407fffffff -{ - -6.499872101 92.708725001 - -6.413115380 92.683805320 - -6.389027232 92.593043378 - -6.451711723 92.527249009 - -6.538427853 92.552199885 - -6.562500135 92.642914037 -} -85005d73fffffff -{ - 85.768171327 -17.424441337 - 85.855462255 -17.477724545 - 85.897036855 -18.616083321 - 85.849843982 -19.673796455 - 85.762788190 -19.574404506 - 85.722657645 -18.463229609 -} -85d2d45bfffffff -{ - -39.819795713 -100.767149181 - -39.750788375 -100.681485193 - -39.658785783 -100.717366907 - -39.635688009 -100.838644024 - -39.704549082 -100.924357832 - -39.796654065 -100.888745339 -} -85aa8c07fffffff -{ - -31.755647301 71.504431665 - -31.849641281 71.526952982 - -31.880177214 71.634845079 - -31.816687188 71.720086926 - -31.722712780 71.697415978 - -31.692208723 71.589652622 -} -85dcdda7fffffff -{ - -45.441540446 -19.056407499 - -45.525649531 -19.112823742 - -45.603213171 -19.034945698 - -45.596595023 -18.900494980 - -45.512399880 -18.844244999 - -45.434908917 -18.922278730 -} -85ef8563fffffff -{ - -79.032447576 -5.266119971 - -78.938028295 -5.159559943 - -78.873270323 -5.527291277 - -78.902240116 -6.002446278 - -78.996391089 -6.115823382 - -79.061844931 -5.747271657 -} -8586ad8ffffffff -{ - -3.875581219 84.568751966 - -3.788162331 84.542368914 - -3.763367887 84.453688059 - -3.825975620 84.391452784 - -3.913326052 84.417845316 - -3.938137220 84.506463744 -} -85d4ea33fffffff -{ - -41.370258788 -166.121687343 - -41.287643491 -166.071238943 - -41.211674431 -166.144095233 - -41.218277886 -166.267275528 - -41.300828608 -166.317830068 - -41.376840473 -166.245098661 -} -85ecc8b7fffffff -{ - -72.827451673 119.255834170 - -72.767445078 119.019920681 - -72.798364662 118.718446312 - -72.889538060 118.650817795 - -72.949915969 118.887212140 - -72.918747608 119.190762409 -} -85005eb3fffffff -{ - 85.804365722 2.418787015 - 85.887892444 2.791809734 - 85.955535896 1.915925920 - 85.937814177 0.662462607 - 85.853343209 0.329184856 - 85.787516330 1.208669979 -} -8509903bfffffff -{ - 57.267946230 6.353623976 - 57.195875352 6.368959523 - 57.174796081 6.504719232 - 57.225762437 6.625481063 - 57.297874237 6.610445711 - 57.318978912 6.474347761 -} -85dc1813fffffff -{ - -52.622703866 -15.446666324 - -52.703251997 -15.505365493 - -52.774407180 -15.412905272 - -52.764927911 -15.261602758 - -52.684303912 -15.203159375 - -52.613234975 -15.295761697 -} -85e8024ffffffff -{ - -65.290999256 -87.531186209 - -65.290043372 -87.316330663 - -65.212608697 -87.200937061 - -65.136451701 -87.299850298 - -65.137483419 -87.513314482 - -65.214596589 -87.629250814 -} -85375513fffffff -{ - 38.149706240 -142.788879244 - 38.077034822 -142.827890905 - 38.012142483 -142.758046055 - 38.019926504 -142.649255887 - 38.092582561 -142.610213334 - 38.157470000 -142.679991622 -} -857d2a6ffffffff -{ - -8.071467548 -23.015652892 - -7.990701132 -22.972317629 - -7.912326126 -23.016864870 - -7.914677162 -23.104807130 - -7.995485681 -23.148221455 - -8.073901058 -23.103614527 -} -85ef1e03fffffff -{ - -81.135659581 -28.634913550 - -81.056463656 -28.277179277 - -80.969375358 -28.540887360 - -80.960815329 -29.155158938 - -81.039192705 -29.516727239 - -81.126946520 -29.260324600 -} -85e6db8bfffffff -{ - -55.155045583 9.332926593 - -55.239145636 9.311639508 - -55.284575898 9.428688114 - -55.245842077 9.566771123 - -55.161771103 9.587616284 - -55.116404644 9.470820366 -} -8504ca27fffffff -{ - 66.533438242 169.873294389 - 66.439493066 169.853814398 - 66.387280968 170.048627849 - 66.428668087 170.263459128 - 66.522524297 170.284578306 - 66.575083540 170.089229328 -} -852015c3fffffff -{ - 44.243466085 69.224487368 - 44.158091344 69.289777072 - 44.155746252 69.425421419 - 44.238776503 69.496177194 - 44.324280398 69.431095937 - 44.326624896 69.295049482 -} -8538106bfffffff -{ - 30.943790728 -2.497202031 - 30.881941448 -2.573677554 - 30.792937245 -2.554763057 - 30.765822569 -2.459585253 - 30.827588749 -2.383222877 - 30.916552586 -2.401925133 -} -85e8207bfffffff -{ - -64.931620464 -96.164477495 - -64.862170773 -96.027522456 - -64.781868668 -96.100710919 - -64.770872511 -96.310173017 - -64.840142623 -96.447440937 - -64.920588259 -96.374937524 -} -85031507fffffff -{ - 86.271318085 -138.220788129 - 86.218985586 -139.380232812 - 86.124912709 -139.278921056 - 86.083001259 -138.076091587 - 86.133639514 -136.941179783 - 86.227843558 -136.984345326 -} -8500c24ffffffff -{ - 84.011217704 89.111707757 - 83.985837286 89.965201075 - 84.051566144 90.615454953 - 84.143907558 90.412822350 - 84.169907754 89.537994775 - 84.102934385 88.887448489 -} -85e613affffffff -{ - -61.699272077 22.405598709 - -61.616490264 22.357262099 - -61.588509465 22.180002589 - -61.643199463 22.050166796 - -61.726164394 22.097624361 - -61.754256669 22.275799643 -} -8552ed5bfffffff -{ - 14.401099893 48.387486216 - 14.318348239 48.366418428 - 14.266400597 48.425182596 - 14.297109323 48.504942876 - 14.379751462 48.526073965 - 14.431794363 48.467381637 -} -85ec4547fffffff -{ - -77.587749278 143.698908001 - -77.563401491 143.322673744 - -77.625173172 143.017692446 - -77.711753769 143.088828714 - -77.736331674 143.469143300 - -77.674096711 143.774215349 -} -85e42b53fffffff -{ - -62.524493252 99.503000309 - -62.440950334 99.394823155 - -62.442143094 99.184494828 - -62.526877218 99.081177305 - -62.610648998 99.188778677 - -62.609457783 99.400278032 -} -85a7696ffffffff -{ - -26.033786114 104.185052450 - -26.110672890 104.221623497 - -26.117761865 104.303997986 - -26.048062951 104.349677203 - -25.971281648 104.313118764 - -25.964093857 104.230868375 -} -85f1413bfffffff -{ - -84.150433604 24.494290429 - -84.060030966 24.226844428 - -84.038910022 23.357454440 - -84.107688192 22.733085599 - -84.198822158 22.979848860 - -84.220457276 23.872029771 -} -850db49bfffffff -{ - 70.897026732 175.567219033 - 70.802763599 175.515506008 - 70.741956974 175.735938656 - 70.774990179 176.008407959 - 70.869067689 176.062427471 - 70.930299098 175.841679321 +85bf721bfffffff +{ + -41.423377712 156.020298675 + -41.330647959 155.987388636 + -41.305682581 155.863175947 + -41.373407041 155.771624106 + -41.466187138 155.804292132 + -41.491192563 155.928754473 } -85f29307fffffff +855c414ffffffff { - -89.635723652 -12.996216498 - -89.547718109 -8.949449866 - -89.479323094 -16.141701713 - -89.483917192 -26.557239059 - -89.557956423 -33.232046209 - -89.641805272 -27.940797341 + 9.818533311 -142.426602407 + 9.728417854 -142.460904722 + 9.654566307 -142.399839124 + 9.670797626 -142.304523961 + 9.760855180 -142.270199186 + 9.834739332 -142.331211888 } -85ab76affffffff -{ - -16.258705288 70.389793283 - -16.352371914 70.408889087 - -16.383222606 70.503918366 - -16.320352461 70.579755561 - -16.226710953 70.560540324 - -16.195914374 70.465607204 -} -8500dc47fffffff -{ - 84.340250303 99.108776778 - 84.299789778 99.959064869 - 84.352948064 100.754208725 - 84.447790396 100.709155739 - 84.489281091 99.841321842 - 84.434880296 99.036213015 -} -85488d4ffffffff -{ - 30.147518576 -102.570271817 - 30.225122274 -102.505356310 - 30.313065183 -102.551222521 - 30.323380303 -102.662130782 - 30.245717818 -102.727024874 - 30.157799045 -102.681032409 -} -85950c37fffffff -{ - -5.088461043 122.065619286 - -5.178716899 122.082038852 - -5.213026229 122.166228661 - -5.157050692 122.234057393 - -5.066720215 122.217632454 - -5.032439886 122.133384098 -} -8537414bfffffff -{ - 37.558320786 -139.871916258 - 37.486409895 -139.911411744 - 37.419793275 -139.843875760 - 37.425097445 -139.736927217 - 37.496989313 -139.697415057 - 37.563596071 -139.764867908 -} -85f2522ffffffff -{ - -77.158361571 -113.273679711 - -77.199108669 -112.919319230 - -77.147920478 -112.574019038 - -77.056473832 -112.585472657 - -77.016248698 -112.937171325 - -77.066951773 -113.280076297 -} -85d019dbfffffff -{ - -48.478531917 13.687386041 - -48.566866904 13.675208033 - -48.613076833 13.779263519 - -48.570910916 13.895258520 - -48.482638468 13.907098621 - -48.436469246 13.803281464 -} -85042577fffffff -{ - 78.530134230 139.436921072 - 78.441997879 139.640301546 - 78.432585576 140.123017036 - 78.511182554 140.409130189 - 78.599838197 140.210323024 - 78.609378990 139.720764691 -} -85eacd13fffffff -{ - -71.857233879 -174.269520649 - -71.929875217 -174.276292898 - -71.961694518 -174.049510755 - -71.920502569 -173.816993245 - -71.847825531 -173.812326582 - -71.816374599 -174.038071696 -} -8562d38bfffffff -{ - 4.001321769 60.774159759 - 3.929077614 60.784162915 - 3.906655634 60.860573031 - 3.956553392 60.926942100 - 4.028796026 60.916844599 - 4.051142529 60.840472361 -} -8502a92bfffffff -{ - 74.708596929 -117.379886543 - 74.621755327 -117.487986302 - 74.555720056 -117.275184494 - 74.576144830 -116.954333189 - 74.662809825 -116.843522511 - 74.729228008 -117.056259068 -} -858c4343fffffff -{ - -9.922543635 97.115201252 - -9.839188048 97.091659195 - -9.816807681 97.001886874 - -9.877815514 96.935693442 - -9.961144844 96.959276645 - -9.983492664 97.049012225 -} -85056a47fffffff -{ - 83.600151051 170.480897867 - 83.505352497 170.402912145 - 83.448816459 171.086852923 - 83.485959722 171.854948094 - 83.580483543 171.953658682 - 83.638153037 171.263674165 -} -85a90eabfffffff -{ - -29.517556331 -51.272411423 - -29.453402297 -51.220205533 - -29.380771661 -51.266911334 - -29.372330659 -51.365769824 - -29.436498079 -51.417943220 - -29.509093118 -51.371290756 -} -8500db4bfffffff -{ - 83.821999225 121.034498688 - 83.752535723 121.629132651 - 83.773038588 122.490732602 - 83.863517176 122.778594417 - 83.934217592 122.185984778 - 83.913192381 121.303159484 -} -8514e08ffffffff -{ - 54.040065803 135.049297298 - 53.965260404 135.124080379 - 53.962096290 135.278194379 - 54.033735999 135.358221128 - 54.108761957 135.283803457 - 54.111927656 135.128991490 -} -85668667fffffff -{ - 6.374410218 -83.021813216 - 6.302377205 -83.077760426 - 6.219807583 -83.040165712 - 6.209314464 -82.946595169 - 6.281400334 -82.890665250 - 6.363926439 -82.928288451 -} -85425823fffffff -{ - 27.760181615 73.067228983 - 27.681490819 73.112998512 - 27.675835646 73.217140159 - 27.748846633 73.275746629 - 27.827649066 73.230127615 - 27.833328927 73.125751183 -} -857a21cbfffffff -{ - -2.883637556 45.410408813 - -2.793231335 45.409037647 - -2.745071248 45.331646117 - -2.787303026 45.255539102 - -2.877775944 45.256853506 - -2.925950428 45.334331735 -} -856044c3fffffff -{ - 7.628399793 69.498064512 - 7.711160904 69.471374970 - 7.728851695 69.393705087 - 7.663866160 69.342794420 - 7.581201374 69.369456914 - 7.563425847 69.447057175 -} -851cc807fffffff -{ - 42.707987617 -138.895239643 - 42.787335354 -138.861614132 - 42.842163067 -138.927021997 - 42.817617110 -139.025940332 - 42.738327375 -139.059350879 - 42.683525563 -138.994058093 -} -85072bbbfffffff -{ - 68.392851326 -11.324172345 - 68.428122814 -11.508183325 - 68.378246942 -11.685583359 - 68.293294718 -11.678202623 - 68.258296792 -11.494859775 - 68.307978340 -11.318229102 -} -854d1ad3fffffff -{ - 27.569276418 -66.167341590 - 27.537050139 -66.249972954 - 27.469286410 -66.258138819 - 27.433781971 -66.183887074 - 27.465904079 -66.101406767 - 27.533634600 -66.093027276 -} -85b6a843fffffff -{ - -25.921057070 -88.768592454 - -25.990940922 -88.831495745 - -26.074579344 -88.791833901 - -26.088351918 -88.689210074 - -26.018469725 -88.626295508 - -25.934813328 -88.666015884 -} -85a9a03bfffffff -{ - -30.218433767 -43.744355240 - -30.151328334 -43.691694690 - -30.081315742 -43.740554717 - -30.078430690 -43.842054147 - -30.145554750 -43.894717588 - -30.215545232 -43.845878870 -} -85009e63fffffff -{ - 76.033396646 88.460112643 - 76.006836952 88.829377307 - 76.071550017 89.102639049 - 76.163370011 89.006554039 - 76.190158298 88.633306504 - 76.124895911 88.360152783 -} -85730247fffffff -{ - 9.480401517 132.070373111 - 9.385694953 132.086924581 - 9.353190086 132.178338294 - 9.415413860 132.253236737 - 9.510146559 132.236697127 - 9.542629407 132.145247139 -} -85701253fffffff -{ - 2.975804549 -173.914719798 - 2.892990982 -173.933540877 - 2.828743406 -173.873936599 - 2.847256877 -173.795427732 - 2.930118396 -173.776522109 - 2.994418542 -173.836209898 -} -850f64abfffffff -{ - 62.193654850 -52.950896931 - 62.171888388 -53.146023097 - 62.080445149 -53.203822367 - 62.010954837 -53.067343486 - 62.032660338 -52.873250160 - 62.123916766 -52.814606509 -} -85b30baffffffff +8500d60ffffffff { - -22.522872804 -68.062333276 - -22.600262932 -68.115628937 - -22.678364448 -68.073385248 - -22.679044068 -67.977874646 - -22.601684736 -67.924668770 - -22.523615009 -67.966883588 + 81.360329163 89.106842149 + 81.334195149 89.700910187 + 81.399805152 90.149921247 + 81.492411038 90.005026932 + 81.518955991 89.400676605 + 81.452478286 88.951608584 } -85e0ad8ffffffff +8527aa2ffffffff { - -55.546869824 63.114266395 - -55.457547805 63.119579413 - -55.414869132 62.990878245 - -55.461288128 62.856653724 - -55.550521409 62.850673778 - -55.593424842 62.979584647 + 47.374696747 -103.345514447 + 47.303175739 -103.416293984 + 47.222554268 -103.355384372 + 47.213263124 -103.223926178 + 47.284622448 -103.152896505 + 47.365434663 -103.213573937 } -85e94ba3fffffff +85594e6bfffffff { - -56.542585056 -98.322867400 - -56.470992149 -98.209341829 - -56.382645949 -98.263625076 - -56.365773603 -98.430962577 - -56.437214925 -98.544639161 - -56.525679995 -98.490829011 + 19.546060027 11.570940229 + 19.452537536 11.576695696 + 19.408175504 11.665068743 + 19.457290090 11.747809032 + 19.550867465 11.742191582 + 19.595275466 11.653695719 } -85034197fffffff +853ca127fffffff { - 80.140641468 -57.019470498 - 80.120035930 -57.521682278 - 80.036508314 -57.637724561 - 79.973890566 -57.257895433 - 79.994181242 -56.762176774 - 80.077401258 -56.639847914 + 23.966876093 84.439426531 + 24.051691124 84.410593333 + 24.067737316 84.313800245 + 23.999013288 84.245915177 + 23.914232605 84.274759240 + 23.898141553 84.371477638 } -85042823fffffff +859ea587fffffff { - 77.505865789 154.234136398 - 77.410228507 154.315319091 - 77.377151587 154.734445306 - 77.439302127 155.076830843 - 77.535145590 155.001184377 - 77.568636040 154.577590609 -} -85056ac7fffffff -{ - 84.034857958 170.070758194 - 83.940187706 169.993560102 - 83.884209291 170.729058154 - 83.921708356 171.549124031 - 84.016101990 171.650164029 - 84.073289576 170.907441928 -} -854830abfffffff -{ - 21.930643917 -106.438934521 - 22.011259985 -106.380169946 - 22.098663011 -106.426073434 - 22.105399558 -106.530833521 - 22.024715381 -106.589554284 - 21.937362795 -106.543559031 -} -85f3363bfffffff -{ - -74.432860451 -179.693414863 - -74.508197122 -179.730931940 - -74.548458444 -179.477987081 - -74.512918064 -179.188467452 - -74.437454476 -179.153847104 - -74.397656171 -179.405844234 -} -85446a8ffffffff -{ - 30.853851205 -93.823198644 - 30.925120416 -93.755152923 - 31.013832788 -93.792871099 - 31.031288952 -93.898797592 - 30.959960607 -93.966885237 - 30.871235297 -93.929004655 -} -85ad7657fffffff -{ - -32.708479583 9.971718122 - -32.800219780 9.957302854 - -32.858517756 10.040996603 - -32.825001685 10.138972651 - -32.733308794 10.153162732 - -32.675084545 10.069601941 -} -8578680bfffffff -{ - -1.287751008 -125.828692693 - -1.366255769 -125.861486043 - -1.427841820 -125.816865875 - -1.410958653 -125.739544995 - -1.332554112 -125.706780703 - -1.270932588 -125.751308175 + -13.488272710 169.326477773 + -13.409826265 169.292612058 + -13.392002154 169.204721083 + -13.452630371 169.150548862 + -13.531181878 169.184344654 + -13.549000094 169.272382808 +} +85ba2b53fffffff +{ + -33.099647813 176.797646809 + -33.016780327 176.750254007 + -33.010086979 176.645977182 + -33.086331534 176.588878036 + -33.169321378 176.636220099 + -33.175944243 176.740712412 +} +85b21237fffffff +{ + -27.941045191 -74.772607450 + -28.014901656 -74.831430740 + -28.091977249 -74.788172424 + -28.095183845 -74.686092496 + -28.021348175 -74.627334700 + -27.944285142 -74.670591171 +} +85cb0b17fffffff +{ + -35.247799149 54.111024594 + -35.338868410 54.118627318 + -35.382597111 54.216474963 + -35.335185323 54.306693541 + -35.244055334 54.298918986 + -35.200397780 54.201097759 +} +85e6b0c7fffffff +{ + -58.014984404 30.465738251 + -57.940796639 30.403406496 + -57.923230195 30.248057245 + -57.979824017 30.154298196 + -58.054221590 30.216123316 + -58.071815632 30.372216434 +} +851624a3fffffff +{ + 59.167399430 161.637699909 + 59.078189914 161.648160016 + 59.039643451 161.809593217 + 59.090063785 161.961121987 + 59.179289045 161.951622111 + 59.218078989 161.789632759 +} +857ee91bfffffff +{ + 0.820247434 169.205227768 + 0.738262624 169.213379672 + 0.708456383 169.278661035 + 0.760545967 169.335734550 + 0.842431710 169.327619653 + 0.872326893 169.262394254 +} +85116d03fffffff +{ + 70.341836347 38.231088095 + 70.381739295 38.430250260 + 70.460925992 38.401740842 + 70.500084512 38.172181311 + 70.459801851 37.972437198 + 70.380741648 38.002831420 +} +8546221bfffffff +{ + 27.340338091 -169.851499273 + 27.429458773 -169.827403533 + 27.489581513 -169.898636287 + 27.460476914 -169.994031706 + 27.371244482 -170.017998532 + 27.311228386 -169.946699151 +} +853aa94ffffffff +{ + 25.767008557 -52.760965564 + 25.687641621 -52.791414414 + 25.617359559 -52.732351746 + 25.626329915 -52.642787236 + 25.705694557 -52.612160065 + 25.776091265 -52.671275603 +} +85e34413fffffff +{ + -58.801062607 -149.581779247 + -58.790805617 -149.435099720 + -58.711453491 -149.382195363 + -58.642517370 -149.475653871 + -58.652832311 -149.621697825 + -58.732025448 -149.674917058 +} +85b4848bfffffff +{ + -24.220648893 -149.731212637 + -24.128360579 -149.701825107 + -24.058253422 -149.774573137 + -24.080350009 -149.876734409 + -24.172619363 -149.906274372 + -24.242811188 -149.833500818 +} +859860c3fffffff +{ + -13.286668310 -0.029809634 + -13.366007418 -0.051516069 + -13.427169540 0.014031598 + -13.408880275 0.101248000 + -13.329512492 0.122810969 + -13.268462515 0.057301112 +} +852470cbfffffff +{ + 46.286407624 107.223658087 + 46.198158274 107.223166509 + 46.156809669 107.324212945 + 46.203550064 107.425827528 + 46.291703439 107.426675144 + 46.333212544 107.325552498 +} +85f28873fffffff +{ + -85.272980312 -101.037871754 + -85.299570956 -99.962106422 + -85.233139655 -99.173738676 + -85.141652482 -99.462460879 + -85.115906227 -100.506739518 + -85.180822543 -101.293234491 +} +8567b107fffffff +{ + 14.929560930 -81.842433386 + 14.865586229 -81.896522116 + 14.791521223 -81.859703922 + 14.781477836 -81.768773934 + 14.845506925 -81.714706637 + 14.919524991 -81.751547773 +} +85474a0ffffffff +{ + 28.539796488 -161.307057065 + 28.452769869 -161.336422620 + 28.390756486 -161.264886389 + 28.415766505 -161.163932638 + 28.502825133 -161.134472142 + 28.564841782 -161.206060225 +} +85015ad7fffffff +{ + 79.402381715 13.309188549 + 79.473319184 13.533887039 + 79.547516918 13.278337421 + 79.550120006 12.794814766 + 79.478619182 12.573901664 + 79.405077976 12.832658149 +} +85d3630bfffffff +{ + -48.166970742 -122.611780832 + -48.117997588 -122.490018365 + -48.021968574 -122.492287069 + -47.974955467 -122.615866740 + -48.023823452 -122.737353073 + -48.119809426 -122.735535693 +} +85a10d1bfffffff +{ + -25.860538933 -136.731657613 + -25.769819398 -136.715021482 + -25.709189217 -136.790263008 + -25.739217758 -136.882247002 + -25.829985233 -136.899052506 + -25.890676316 -136.823704648 +} +85f132d7fffffff +{ + -80.839540615 134.200464343 + -80.804201007 133.719442452 + -80.854492810 133.250117445 + -80.940716321 133.258810303 + -80.976571105 133.745332165 + -80.925681931 134.217638524 +} +85f144dbfffffff +{ + -86.647922673 41.441069933 + -86.570116693 40.571220415 + -86.575468740 39.045448404 + -86.658919916 38.316205484 + -86.738723948 39.156625966 + -86.733068429 40.758117524 +} +853f040bfffffff +{ + 36.250523165 17.405975942 + 36.155279996 17.407075989 + 36.109341281 17.510365677 + 36.158603441 17.612687012 + 36.253870496 17.611789201 + 36.299851645 17.508367753 +} +85aa842ffffffff +{ + -31.520009405 68.352739300 + -31.614490526 68.372612471 + -31.647648866 68.479142326 + -31.586281677 68.565686852 + -31.491805094 68.545656238 + -31.458691055 68.439238395 +} +851a64bbfffffff +{ + 51.001614093 -32.268845689 + 50.924490089 -32.346568642 + 50.846820706 -32.277295976 + 50.846190521 -32.130465939 + 50.923243893 -32.052534421 + 51.000998084 -32.121640548 +} +85df1327fffffff +{ + -61.333548679 -54.091375427 + -61.285716100 -53.923068287 + -61.194718855 -53.924719993 + -61.151570094 -54.093564227 + -61.199145165 -54.261303732 + -61.290125638 -54.260766570 +} +85e76a6ffffffff +{ + -72.113809275 8.638710420 + -72.019246710 8.631123711 + -71.972058667 8.365234701 + -72.019085667 8.105358198 + -72.113713522 8.110158280 + -72.161251079 8.377623429 +} +8528128bfffffff +{ + 41.217622040 -119.804970483 + 41.297452118 -119.747625426 + 41.370148144 -119.810576169 + 41.362963164 -119.930891020 + 41.283123638 -119.988071519 + 41.210478511 -119.925102103 +} +85cd686bfffffff +{ + -52.739670198 76.676491228 + -52.649863952 76.648495581 + -52.622804121 76.506555199 + -52.685374418 76.392166175 + -52.775207673 76.419551704 + -52.802444062 76.561937081 +} +85dea4dbfffffff +{ + -57.954496133 -42.848973260 + -57.895058636 -42.717371115 + -57.808127654 -42.751707329 + -57.780533600 -42.916818149 + -57.839692595 -43.048293084 + -57.926723535 -43.014786082 +} +85c9ae87fffffff +{ + -37.618243159 117.960056178 + -37.559668163 117.879002909 + -37.578944885 117.773078818 + -37.656913103 117.747948646 + -37.715664635 117.829047681 + -37.696271155 117.935231504 +} +859d23dbfffffff +{ + -22.639189500 151.827239020 + -22.548200084 151.805017272 + -22.520648669 151.706710622 + -22.584014784 151.630482550 + -22.675043146 151.652534985 + -22.702666575 151.750984989 +} +85a2dc87fffffff +{ + -28.152389942 54.182433164 + -28.245744826 54.189631032 + -28.287745754 54.281554929 + -28.236305834 54.366257354 + -28.142886903 54.358907969 + -28.100971870 54.267007736 +} +85e941abfffffff +{ + -58.456255193 -102.676858286 + -58.389215750 -102.549623447 + -58.300004144 -102.597468049 + -58.277733569 -102.771957800 + -58.344609199 -102.899246546 + -58.433918927 -102.851993417 +} +858eb51bfffffff +{ + -9.832678905 -92.357553164 + -9.908591276 -92.417264092 + -9.998030675 -92.381121232 + -10.011570192 -92.285203030 + -9.935624278 -92.225464256 + -9.846172426 -92.261671409 +} +85ef3617fffffff +{ + -86.436772461 -22.342837975 + -86.354018860 -21.616844475 + -86.274520887 -22.388972580 + -86.275937187 -23.857448157 + -86.356884557 -24.617769847 + -86.438223370 -23.877249534 +} +85d30e6bfffffff +{ + -51.479496992 -112.648261753 + -51.420249875 -112.526098274 + -51.324641586 -112.548160017 + -51.288251594 -112.691874490 + -51.347355191 -112.813887544 + -51.442991973 -112.792337069 +} +855c0073fffffff +{ + 13.029680057 -151.142631057 + 12.937408576 -151.174832171 + 12.864094397 -151.108953303 + 12.883017565 -151.010881847 + 12.975268420 -150.978625601 + 13.048616778 -151.044495796 +} +85067513fffffff +{ + 64.083963238 -28.128719803 + 64.097293840 -28.316711770 + 64.026980544 -28.440740693 + 63.943591518 -28.376799850 + 63.930432160 -28.189788042 + 64.000491121 -28.065740043 +} +85ef0a57fffffff +{ + -79.951439293 -44.314428785 + -79.889536820 -43.890165690 + -79.794280065 -43.987231686 + -79.760675525 -44.500215571 + -79.821822784 -44.922751610 + -79.917324178 -44.834076467 +} +859cac2ffffffff +{ + -10.842130745 146.350640359 + -10.930143729 146.364721424 + -10.959354158 146.451898932 + -10.900605476 146.524984486 + -10.812610801 146.510935464 + -10.783346426 146.423768800 +} +8503264bfffffff +{ + 89.228827266 148.445977959 + 89.140360501 150.190296609 + 89.110562655 156.061639758 + 89.163803427 161.112222652 + 89.255414795 160.628869260 + 89.291474181 153.749132806 +} +850b726bfffffff +{ + 66.320541661 75.172462668 + 66.241870328 75.266396304 + 66.231934847 75.491890812 + 66.300621720 75.624540673 + 66.379440950 75.531388765 + 66.389425646 75.304800975 +} +85d6ab97fffffff +{ + -46.362920588 38.171572622 + -46.294995526 38.173293444 + -46.265961495 38.074051104 + -46.304850719 37.972989359 + -46.372787868 37.971171876 + -46.401823792 38.070512836 +} +855c6453fffffff +{ + 14.761480020 -143.248304805 + 14.671186843 -143.283141015 + 14.596378025 -143.220316939 + 14.611840590 -143.122707572 + 14.702086269 -143.087844773 + 14.776916906 -143.150617773 +} +851b636bfffffff +{ + 55.668627538 -32.941811141 + 55.594866260 -33.025108471 + 55.522167473 -32.949120256 + 55.523140016 -32.790019084 + 55.596824747 -32.706466277 + 55.669613495 -32.782268903 +} +8500d207fffffff +{ + 81.707730148 95.933009177 + 81.671228823 96.530316783 + 81.728681468 97.051271519 + 81.823514180 96.978146271 + 81.860631521 96.371502186 + 81.802291834 95.847389369 +} +85f00803fffffff +{ + -78.075673388 59.313060570 + -78.017698154 58.971170600 + -78.047297693 58.576920816 + -78.135355598 58.520518898 + -78.193914119 58.863948041 + -78.163827627 59.262258939 +} +85257253fffffff +{ + 51.586677725 100.822610695 + 51.495368376 100.834950894 + 51.455994352 100.960344592 + 51.507772313 101.073598280 + 51.599019855 101.061746425 + 51.638551501 100.936152685 +} +850d8a4bfffffff +{ + 64.913002504 -173.709691061 + 64.826894784 -173.786749239 + 64.758953123 -173.650517129 + 64.776800931 -173.437562180 + 64.862655174 -173.359491957 + 64.930915446 -173.495383139 +} +85f3b53bfffffff +{ + -78.922095260 165.888171042 + -78.997476319 165.724142452 + -79.057151764 166.013544164 + -79.040775777 166.468099034 + -78.964931978 166.627405207 + -78.905924817 166.336927607 +} +859649d7fffffff +{ + -11.677920302 17.004650648 + -11.582997491 17.014210838 + -11.527831158 16.936863363 + -11.567535269 16.849987618 + -11.662395950 16.840374295 + -11.717614694 16.917689772 +} +8549b203fffffff +{ + 17.669767476 -97.977815883 + 17.745949697 -97.917490363 + 17.832807468 -97.955151192 + 17.843458996 -98.053257916 + 17.767190823 -98.113593622 + 17.680357147 -98.075812598 +} +850d215bfffffff +{ + 74.119049159 -150.408154400 + 74.050479264 -150.639613554 + 73.962630302 -150.549687155 + 73.943151570 -150.231221431 + 74.011239529 -149.999791948 + 74.099286351 -150.086782686 +} +85359c03fffffff +{ + 37.201314389 -35.750270314 + 37.117541760 -35.809924389 + 37.034498549 -35.749941651 + 37.035128033 -35.630384613 + 37.118840491 -35.570561366 + 37.201983674 -35.630463818 +} +85005207fffffff +{ + 84.874232952 29.372056633 + 84.935893595 30.084035483 + 85.024744090 29.812749293 + 85.051127970 28.800963478 + 84.988020391 28.089373254 + 84.899990954 28.388689770 +} +85005baffffffff +{ + 87.174349544 -26.881641326 + 87.261068540 -27.270759541 + 87.287940112 -29.134929415 + 87.226534142 -30.519852367 + 87.141044556 -30.036189334 + 87.115673732 -28.259634003 +} +8574924ffffffff +{ + -2.208370783 -13.305914674 + -2.134511094 -13.269972495 + -2.060547191 -13.309034660 + -2.060379349 -13.384113258 + -2.134281155 -13.420142703 + -2.208308706 -13.381006292 +} +857056dbfffffff +{ + 2.008369231 -167.260894789 + 1.922916593 -167.283750325 + 1.855779593 -167.221291133 + 1.874036419 -167.135911570 + 1.959514549 -167.112973047 + 2.026710430 -167.175497034 +} +85e76893fffffff +{ + -74.251436780 7.933145394 + -74.156095724 7.928757696 + -74.108084505 7.628813010 + -74.155015285 7.331301270 + -74.250411543 7.332086679 + -74.298824388 7.633987987 +} +8547ae03fffffff +{ + 28.300452432 -175.719220495 + 28.393026857 -175.700102048 + 28.451953134 -175.779924631 + 28.418192454 -175.878892528 + 28.325528809 -175.897846537 + 28.266714991 -175.817997362 +} +85014e07fffffff +{ + 78.077286504 -1.003711969 + 78.153609408 -0.903799165 + 78.212510740 -1.211002579 + 78.194456109 -1.618015303 + 78.117868384 -1.713255108 + 78.059597175 -1.406185747 +} +85a34813fffffff +{ + -13.598730926 55.792827050 + -13.688501070 55.800463716 + -13.722863086 55.883806558 + -13.667352593 55.959486523 + -13.577538167 55.951728180 + -13.543278427 55.868411578 +} +85f325bbfffffff +{ + -71.505789420 -167.710404220 + -71.578191261 -167.687337619 + -71.601998595 -167.450700871 + -71.553085568 -167.238518458 + -71.480736139 -167.263579280 + -71.457245866 -167.498831772 +} +85a34663fffffff +{ + -13.662446772 52.091413571 + -13.750694433 52.096211459 + -13.785667372 52.175553691 + -13.732284403 52.250089112 + -13.643976912 52.245175042 + -13.609112150 52.165841792 +} +85f012abfffffff +{ + -76.252737628 82.019808935 + -76.164731991 81.917094748 + -76.137939605 81.547044885 + -76.198895825 81.276423749 + -76.287095403 81.375486597 + -76.314146876 81.748840191 +} +85d2869bfffffff +{ + -45.239993315 -96.093960726 + -45.166339725 -96.007269048 + -45.075791507 -96.053725586 + -45.058771136 -96.186600589 + -45.132288510 -96.273419331 + -45.222962391 -96.227236935 +} +85aa93cffffffff +{ + -35.485985428 66.759478332 + -35.578593350 66.778657870 + -35.612753219 66.888158675 + -35.554259898 66.978369175 + -35.461648136 66.959017333 + -35.427533421 66.849627159 +} +85af1403fffffff +{ + -22.111677048 86.026594288 + -22.202326853 86.056678458 + -22.223787756 86.154141273 + -22.154625752 86.221374098 + -22.064064711 86.191218866 + -22.042576901 86.093901647 +} +85e61eb7fffffff +{ + -62.126039965 20.356705693 + -62.041847791 20.313891941 + -62.011094037 20.134623084 + -62.064399452 19.997255422 + -62.148760018 20.039114851 + -62.179647327 20.219299013 +} +850da55bfffffff +{ + 71.336302545 -173.849438765 + 71.247136173 -173.952888215 + 71.175262503 -173.768366660 + 71.192146296 -173.480996415 + 71.280993351 -173.375693555 + 71.353276622 -173.559600590 +} +8502916bfffffff +{ + 71.303817041 -134.615862598 + 71.255380345 -134.853238942 + 71.168329235 -134.854996194 + 71.129775629 -134.621683192 + 71.177889047 -134.385526213 + 71.264877722 -134.381463517 +} +85f129b7fffffff +{ + -87.702737657 107.279881374 + -87.716218009 105.019932323 + -87.799699178 104.192673796 + -87.871781157 105.750227579 + -87.856965789 108.169802757 + -87.771467510 108.865207895 +} +8521a163fffffff +{ + 44.373910649 60.294092810 + 44.294837263 60.371180204 + 44.302962807 60.504287342 + 44.390224676 60.560687742 + 44.469448482 60.483686941 + 44.461259873 60.350198276 +} +85d39137fffffff +{ + -50.925282305 -96.732591786 + -50.851504143 -96.634840217 + -50.761467219 -96.685566136 + -50.745084919 -96.833695442 + -50.818723523 -96.931593644 + -50.908883870 -96.881217182 +} +8503b19bfffffff +{ + 80.520190358 -163.789573001 + 80.438094242 -164.077882454 + 80.354863505 -163.803161103 + 80.353094378 -163.245429098 + 80.434471534 -162.952912125 + 80.518335936 -163.222225656 +} +853722a7fffffff +{ + 42.628687722 -149.243696033 + 42.559200644 -149.281641487 + 42.502289417 -149.206365741 + 42.514859056 -149.093169775 + 42.584339141 -149.055159758 + 42.641256629 -149.130410037 +} +85dfb16ffffffff +{ + -62.812069456 -42.667043528 + -62.749937974 -42.511247018 + -62.659020212 -42.552689428 + -62.630117028 -42.748766119 + -62.691930020 -42.904391069 + -62.782963866 -42.864113725 +} +854012d7fffffff +{ + 29.585112602 111.924515397 + 29.668510864 111.904032117 + 29.701734111 111.810532247 + 29.651528902 111.737512932 + 29.568078734 111.758077939 + 29.534885640 111.851580574 +} +853a1ed3fffffff +{ + 28.149125636 -52.093627500 + 28.067858589 -52.125891335 + 27.996799232 -52.065171181 + 28.006894221 -51.972134903 + 28.088161304 -51.939682238 + 28.159333485 -52.000454539 +} +850b4ec7fffffff +{ + 70.706143451 76.808594917 + 70.695896934 77.077996594 + 70.767621773 77.226967567 + 70.849943899 77.105590369 + 70.860181564 76.833920792 + 70.788105876 76.685908796 +} +854693affffffff +{ + 16.964522247 -176.320568190 + 17.049935123 -176.304261554 + 17.100740634 -176.375090281 + 17.066014008 -176.462242885 + 16.980524026 -176.478420104 + 16.929837698 -176.407574319 +} +852ba633fffffff +{ + 49.228523440 -72.978703632 + 49.180016298 -73.104221069 + 49.086414053 -73.102101384 + 49.041322406 -72.975024406 + 49.089647396 -72.849784798 + 49.183245749 -72.851344325 +} +850c4b6bfffffff +{ + 56.798828030 -146.509718186 + 56.742346859 -146.620685219 + 56.671438223 -146.590541293 + 56.656940799 -146.450062515 + 56.713182377 -146.339192579 + 56.784160473 -146.368703208 +} +85329d6bfffffff +{ + 44.181186053 173.842960808 + 44.275467166 173.853276745 + 44.329768607 173.742920104 + 44.289698989 173.622332713 + 44.195387534 173.612317613 + 44.141175846 173.722588840 +} +8588c253fffffff +{ + 0.726961194 -154.247628336 + 0.639188591 -154.277044682 + 0.569488659 -154.213694581 + 0.587500525 -154.120920393 + 0.675248688 -154.091445138 + 0.745009485 -154.154802863 +} +8502ccdbfffffff +{ + 70.914528872 -102.381618562 + 70.834917768 -102.536130695 + 70.752682568 -102.410042105 + 70.749761029 -102.130549081 + 70.829088250 -101.974971751 + 70.911620870 -102.099940827 +} +857d6823fffffff +{ + -4.988168428 -31.108640916 + -4.905427019 -31.061153272 + -4.822396175 -31.107985656 + -4.822071727 -31.202338879 + -4.904830094 -31.249882059 + -4.987895955 -31.203016597 +} +85ef04affffffff +{ + -83.690850698 -54.450579949 + -83.643724125 -53.700891299 + -83.548429676 -53.711359190 + -83.500271161 -54.449802425 + -83.546372528 -55.188204207 + -83.641642174 -55.199436880 +} +85f3904bfffffff +{ + -81.956441335 151.328650746 + -82.024372988 150.957219204 + -82.099071012 151.228512046 + -82.105106704 151.879113943 + -82.036277495 152.246205469 + -81.962312316 151.967187265 +} +85b98c47fffffff +{ + -29.436444455 136.376887135 + -29.343610380 136.370555113 + -29.304360574 136.277536896 + -29.357824831 136.190787860 + -29.450605759 136.196915476 + -29.489975699 136.289996464 +} +85e68ba7fffffff +{ + -56.840312642 17.929790853 + -56.760641094 17.900767435 + -56.727360499 17.754023192 + -56.773615732 17.635710594 + -56.853409944 17.664052419 + -56.886826703 17.811389767 +} +855e5d07fffffff +{ + 16.751112298 -61.745496907 + 16.823583297 -61.700108066 + 16.889200085 -61.738587373 + 16.882358977 -61.822382748 + 16.809959950 -61.867710420 + 16.744330114 -61.829303940 +} +85e8e867fffffff +{ + -58.153166399 -79.599233905 + -58.071202758 -79.525141601 + -57.997937490 -79.612693168 + -58.006476787 -79.774235848 + -58.088373806 -79.848848606 + -58.161798333 -79.761399933 +} +85038e2ffffffff +{ + 79.098112348 -137.479594181 + 79.045650477 -137.881722912 + 78.953210530 -137.859033122 + 78.913237577 -137.441202849 + 78.965119372 -137.042171981 + 79.057549337 -137.057866834 +} +85f293c3fffffff +{ + -89.510591186 70.191717799 + -89.462226730 61.401148144 + -89.495029686 52.041275326 + -89.585680212 48.938376041 + -89.649238774 59.023138660 + -89.604161690 71.223218362 } -85041c37fffffff -{ - 73.146550963 148.983033982 - 73.052766196 149.072657577 - 73.028151723 149.395593466 - 73.097082037 149.631741447 - 73.191106794 149.544956461 - 73.215962945 149.219169355 -} -8504e123fffffff -{ - 71.605659273 165.125707546 - 71.509099084 165.125303165 - 71.461091488 165.387737850 - 71.509248089 165.651863233 - 71.605778178 165.655000282 - 71.654183766 165.391280121 -} -85179363fffffff -{ - 50.729656249 149.102053374 - 50.814955181 149.078196909 - 50.838860628 148.949058905 - 50.777466391 148.844135826 - 50.692251533 148.868276412 - 50.668346716 148.997056649 -} -85031183fffffff -{ - 85.711269626 -133.606806202 - 85.665148511 -134.666685726 - 85.571014397 -134.678292444 - 85.523132632 -133.674317269 - 85.567917894 -132.639120472 - 85.661890493 -132.583325682 -} -85d8c877fffffff -{ - -42.080857304 126.283247822 - -41.991695007 126.288834701 - -41.940996624 126.195487864 - -41.979356572 126.096565595 - -42.023891068 126.093656753 - -42.065355323 126.087825929 - -42.119221376 126.184079312 -} -859e8d97fffffff -{ - -11.158277570 165.086743383 - -11.080588838 165.056446379 - -11.061077830 164.969128643 - -11.119240394 164.911968191 - -11.197019258 164.942179045 - -11.216545454 165.029636704 -} -8579198ffffffff -{ - 4.646264081 -135.138223144 - 4.560159721 -135.172613402 - 4.489887192 -135.118053755 - 4.505684544 -135.029182396 - 4.591704601 -134.994796128 - 4.662011583 -135.049277114 -} -85db5283fffffff -{ - -56.643857182 169.644967018 - -56.570316988 169.584509552 - -56.566561488 169.428749874 - -56.636360520 169.332985176 - -56.709989726 169.393226097 - -56.713730917 169.549449479 -} -857b4063fffffff -{ - -6.213498163 41.583465324 - -6.119818075 41.583537417 - -6.070670958 41.503162050 - -6.115188133 41.422636139 - -6.208923031 41.422501416 - -6.258085999 41.502955270 -} -8504e69bfffffff -{ - 71.927063712 155.349339199 - 71.831355936 155.400240326 - 71.797171448 155.691092825 - 71.858385763 155.933143024 - 71.954222589 155.884964385 - 71.988717939 155.592005212 -} -8571242ffffffff -{ - 15.911213279 -172.237910568 - 15.822484981 -172.258951664 - 15.760149423 -172.194901879 - 15.786523137 -172.109721596 - 15.875319186 -172.088585285 - 15.937673787 -172.152724462 -} -85e92503fffffff -{ - -65.622539514 -117.086972688 - -65.575578787 -116.906328430 - -65.489148935 -116.925524855 - -65.449666428 -117.124299833 - -65.496450428 -117.304476582 - -65.582893023 -117.286346419 -} -85ef26bbfffffff -{ - -85.784000904 -70.334629784 - -85.761506178 -69.098813633 - -85.670470783 -68.788391028 - -85.602828814 -69.673108428 - -85.624498833 -70.867138935 - -85.714613443 -71.217348080 -} -8594ac73fffffff -{ - -15.514395635 123.013595471 - -15.597343922 123.029785147 - -15.632388061 123.113379941 - -15.584480171 123.180840108 - -15.501470645 123.164646661 - -15.466430219 123.080996760 -} -8506412ffffffff -{ - 60.502732233 -33.783927576 - 60.506778623 -33.957193677 - 60.430463447 -34.056502417 - 60.350346153 -33.982737457 - 60.346420220 -33.810330297 - 60.422491457 -33.710831942 -} -85032353fffffff -{ - 88.720476716 -90.213557304 - 88.740018095 -94.215924896 - 88.667797725 -96.860672082 - 88.581643868 -95.572656556 - 88.564607897 -91.991484928 - 88.631422287 -89.306167908 -} -85c51297fffffff -{ - -32.143353342 -39.521412092 - -32.215958123 -39.580002386 - -32.296199363 -39.542829903 - -32.303834830 -39.446865118 - -32.231115913 -39.388233380 - -32.150875780 -39.425607682 -} -85d718b7fffffff -{ - -53.888652227 37.211357610 - -53.823972956 37.144361415 - -53.813931174 37.011969017 - -53.868592995 36.946027310 - -53.933474295 37.012764299 - -53.943491655 37.145703683 -} -85cb4b73fffffff -{ - -35.124235860 63.547658687 - -35.217069332 63.563901945 - -35.253953596 63.670957449 - -35.197949434 63.761679903 - -35.105097115 63.745260803 - -35.068267692 63.638295011 -} -8523b29bfffffff -{ - 41.510617590 -154.533817329 - 41.438019390 -154.569113878 - 41.383442195 -154.492736374 - 41.401457579 -154.381049091 - 41.474058742 -154.345665948 - 41.528641617 -154.422056481 -} -8562d54ffffffff -{ - 4.952554287 60.569681690 - 4.881734255 60.579467114 - 4.860017079 60.655116556 - 4.909193881 60.720944027 - 4.980011931 60.711065794 - 5.001655266 60.635452890 -} -85f16a4bfffffff -{ - -84.717922849 20.021296948 - -84.625651218 19.800452472 - -84.597780119 18.857999208 - -84.661423436 18.111300239 - -84.754306522 18.304355124 - -84.782951624 19.272289839 -} -852159b7fffffff -{ - 52.795384660 77.228781498 - 52.706739224 77.290918224 - 52.694100115 77.448697865 - 52.770050280 77.544867850 - 52.858791316 77.483145178 - 52.871486750 77.324837046 -} -85655c67fffffff -{ - 4.239806999 93.206795511 - 4.332909344 93.181155416 - 4.357790020 93.087294008 - 4.289562161 93.019122721 - 4.196491890 93.044797503 - 4.171617356 93.138608999 -} -85be1bcbfffffff -{ - -30.593990904 152.401383904 - -30.499432034 152.376466258 - -30.470796769 152.268802571 - -30.536655476 152.185882546 - -30.631251747 152.210599917 - -30.659952043 152.318437839 -} -8534108bfffffff -{ - 34.464165784 -29.599666946 - 34.382923511 -29.664514281 - 34.295905726 -29.611817946 - 34.290042602 -29.494401473 - 34.371200763 -29.429443897 - 34.458306147 -29.482012550 -} -85034143fffffff -{ - 80.213315529 -62.122744663 - 80.185204350 -62.618824930 - 80.100097706 -62.695536067 - 80.043313178 -62.283191837 - 80.071012709 -61.792979962 - 80.155904274 -61.709283756 -} -85542a8ffffffff -{ - 16.681172553 -11.310719441 - 16.615281267 -11.374671703 - 16.534729195 -11.349000569 - 16.520042281 -11.259529095 - 16.585818880 -11.195615342 - 16.666396947 -11.221134429 -} -8538d21bfffffff -{ - 24.369533840 1.986179340 - 24.278466650 1.999778846 - 24.241728013 2.088678304 - 24.296059173 2.164138702 - 24.387224609 2.150656703 - 24.423960662 2.061596601 -} -85bb4bd3fffffff -{ - -34.021048146 169.682053708 - -33.933171389 169.638983073 - -33.920433924 169.528126968 - -33.995606864 169.460107117 - -34.083592836 169.503068716 - -34.096296646 169.614159642 -} -850516cbfffffff -{ - 74.084525486 108.743212283 - 74.028169780 109.024859370 - 74.066753586 109.339824513 - 74.162092941 109.375418164 - 74.218905630 109.092495006 - 74.179919447 108.775248236 -} -85cd757bfffffff -{ - -51.614284598 83.958966023 - -51.526078867 83.914326617 - -51.508047058 83.767912505 - -51.578091410 83.665611385 - -51.666384618 83.709716593 - -51.684546349 83.856658353 -} -85da490bfffffff -{ - -55.043742520 149.251216225 - -54.959591183 149.221076920 - -54.929518350 149.071607792 - -54.983527262 148.951968628 - -55.067701171 148.981691303 - -55.097843828 149.131470306 -} -85bae68ffffffff -{ - -29.606607832 179.467018414 - -29.528443799 179.517980600 - -29.448677450 179.470843749 - -29.447067192 179.372908734 - -29.525131704 179.321958578 - -29.604905926 179.368931196 -} -856b2e8ffffffff -{ - 16.370150114 23.697756220 - 16.276878844 23.693516246 - 16.226979247 23.777313968 - 16.270263235 23.865408592 - 16.363523332 23.869788744 - 16.413510738 23.785934131 -} -85f0464bfffffff -{ - -77.516869855 43.070562512 - -77.440615302 42.824716590 - -77.446442010 42.412840460 - -77.528708054 42.241570051 - -77.605550304 42.485820836 - -77.599537375 42.902980821 -} -85d61b9bfffffff -{ - -47.767467985 35.595214289 - -47.701447377 35.598208134 - -47.671261138 35.497525728 - -47.707086748 35.393764709 - -47.773114280 35.390670958 - -47.803309363 35.491438148 -} -85e6c53bfffffff -{ - -59.242768232 9.972392365 - -59.157924901 9.964065662 - -59.114095730 9.810723958 - -59.154901443 9.665162520 - -59.239804442 9.672592140 - -59.283842741 9.826480873 -} -85b1b33bfffffff -{ - -33.755436082 -109.933488259 - -33.695277471 -109.845925004 - -33.603825375 -109.865992604 - -33.572484873 -109.973354773 - -33.632497909 -110.060864155 - -33.723996821 -110.041065522 -} -85c6abcbfffffff -{ - -38.608402454 -128.407556596 - -38.564045372 -128.303561273 - -38.471733897 -128.296585272 - -38.423855689 -128.393304363 - -38.468133812 -128.497059533 - -38.560368923 -128.504335474 -} -85ee9c1bfffffff -{ - -68.849265094 -8.314233198 - -68.757908652 -8.244782529 - -68.689250889 -8.429413103 - -68.711559307 -8.683523504 - -68.802740904 -8.754762673 - -68.871790053 -8.570110445 -} -856b185bfffffff -{ - 11.070551929 22.393121623 - 10.981620066 22.390092821 - 10.934482791 22.470635612 - 10.976189182 22.554265921 - 11.065116424 22.557423059 - 11.112342024 22.476821570 +853da947fffffff +{ + 28.394150917 80.398673048 + 28.313264408 80.435440117 + 28.302062689 80.538056055 + 28.371679745 80.604122662 + 28.452644869 80.567551297 + 28.463914456 80.464717258 +} +859e148ffffffff +{ + -15.321873883 169.058755518 + -15.241608261 169.024356919 + -15.223870445 168.934515209 + -15.286405735 168.878918852 + -15.366778457 168.913243194 + -15.384508778 169.003238383 +} +85f29803fffffff +{ + -87.754646158 -75.865836296 + -87.740817939 -73.524148728 + -87.652893951 -72.789485447 + -87.580855994 -74.273017103 + -87.593658046 -76.463344407 + -87.679473990 -77.314937793 +} +85056dc7fffffff +{ + 85.688471898 -172.173806500 + 85.601654775 -172.640073872 + 85.525574945 -171.898725860 + 85.534706422 -170.704274851 + 85.620263743 -170.207900136 + 85.697959074 -170.935019871 +} +851549c3fffffff +{ + 64.054503702 132.522328091 + 63.974077675 132.635661166 + 63.975065444 132.852728521 + 64.056508275 132.957843893 + 64.137238025 132.845133560 + 64.136221104 132.626679132 +} +85cb692bfffffff +{ + -31.144144553 63.271190522 + -31.238775714 63.286631376 + -31.275828148 63.389789767 + -31.218187868 63.477425303 + -31.123536146 63.461820290 + -31.086545158 63.358743831 +} +85df854ffffffff +{ + -61.503331170 -45.500689362 + -61.444992270 -45.346385870 + -61.354411746 -45.376541501 + -61.322088576 -45.559909793 + -61.380127717 -45.713947501 + -61.470788971 -45.684884573 +} +851e4167fffffff +{ + 47.863413042 31.797602776 + 47.778415099 31.782864880 + 47.724192965 31.891102020 + 47.754907575 32.014092598 + 47.839867242 32.029072237 + 47.894150724 31.920819876 +} +8530ae93fffffff +{ + 35.763744516 120.274516912 + 35.838332137 120.258013447 + 35.875831060 120.171921129 + 35.838720439 120.102303810 + 35.764075075 120.118894296 + 35.726598045 120.205015061 +} +856574cffffffff +{ + 0.975337542 98.327822428 + 1.067268002 98.303833235 + 1.092243085 98.211152256 + 1.025256079 98.142496686 + 0.933339162 98.166532784 + 0.908395645 98.259177644 +} +85064e2ffffffff +{ + 59.983192438 -35.674021899 + 59.984514264 -35.846522523 + 59.906397078 -35.940547610 + 59.827200000 -35.862316075 + 59.825982558 -35.690671149 + 59.903858087 -35.596404874 +} +85b2632bfffffff +{ + -28.955491863 -62.834934809 + -29.029707145 -62.885117230 + -29.098274201 -62.842837704 + -29.092606142 -62.750424250 + -29.018436811 -62.700350434 + -28.949889615 -62.742581375 +} +853e6d13fffffff +{ + 30.389101881 35.834203047 + 30.294646869 35.818618400 + 30.235109821 35.903790551 + 30.269947349 36.004527252 + 30.364330508 36.020261574 + 30.423948068 35.935109745 +} +85aaddd3fffffff +{ + -31.966620645 79.231341641 + -32.058362431 79.259748206 + -32.082103714 79.368178517 + -32.014105401 79.448042637 + -31.922416284 79.419516742 + -31.898672741 79.311245790 +} +850e8e0bfffffff +{ + 56.922678556 -92.358379177 + 56.852258087 -92.476070386 + 56.760479759 -92.422912312 + 56.738957954 -92.252693947 + 56.809149333 -92.134871353 + 56.901091324 -92.187396190 +} +85e45ad7fffffff +{ + -60.524180900 85.218547484 + -60.432849059 85.157578366 + -60.413561727 84.968650471 + -60.485469077 84.839804174 + -60.576914384 84.899915216 + -60.596339363 85.089733409 +} +85239a83fffffff +{ + 45.925237096 -156.381446816 + 46.002163513 -156.338521727 + 46.072944848 -156.404301001 + 46.066767758 -156.513218481 + 45.989726213 -156.556065699 + 45.918976936 -156.490073824 +} +85af024ffffffff +{ + -21.912378635 88.199688098 + -22.001826426 88.230764700 + -22.021896055 88.326736610 + -21.952554800 88.391485991 + -21.863202343 88.360349021 + -21.843095814 88.264522820 +} +8516f1a3fffffff +{ + 49.967804655 167.959338911 + 50.058468382 167.962074388 + 50.104773895 167.836628135 + 50.060337110 167.708628838 + 49.969674860 167.706261877 + 49.923447684 167.831525675 +} +85218313fffffff +{ + 41.401809079 62.763892625 + 41.321035787 62.834336877 + 41.325759287 62.961993546 + 41.411301928 63.019559275 + 41.492222139 62.949224836 + 41.487452701 62.821214062 +} +85e9344ffffffff +{ + -69.494863626 -115.757100491 + -69.533315587 -115.546359045 + -69.486197815 -115.329374225 + -69.400919862 -115.324179154 + -69.362827305 -115.534072957 + -69.409654640 -115.750010350 +} +85cf1573fffffff +{ + -52.322141133 -74.600859403 + -52.239266971 -74.547771666 + -52.167743979 -74.628960173 + -52.178944509 -74.763244526 + -52.261790004 -74.816761175 + -52.333463837 -74.735565427 +} +8501984ffffffff +{ + 73.382968903 62.818122269 + 73.394280250 63.120320301 + 73.475839196 63.221067038 + 73.546323425 63.017239349 + 73.534783896 62.712283983 + 73.452989659 62.613929304 +} +85cc80a3fffffff +{ + -36.307652462 84.521210084 + -36.394414451 84.554292769 + -36.411543034 84.665206429 + -36.341936215 84.742852976 + -36.255237892 84.709670714 + -36.238082673 84.598941162 +} +8502cd6bfffffff +{ + 69.390613599 -99.459988781 + 69.312982968 -99.615316589 + 69.227748899 -99.507702545 + 69.219879095 -99.245891173 + 69.297225205 -99.089805155 + 69.382725431 -99.196279195 +} +85144157fffffff +{ + 59.198301735 141.013406315 + 59.115204230 141.085500444 + 59.103889949 141.266728448 + 59.175607669 141.376810071 + 59.258919018 141.305389916 + 59.270299067 141.123210837 +} +852756affffffff +{ + 46.388580622 -91.948695403 + 46.324233635 -92.039716447 + 46.237205484 -91.999722054 + 46.214385690 -91.869083041 + 46.278532898 -91.777991178 + 46.365699498 -91.817608110 +} +858b804bfffffff +{ + -12.056547366 -55.796637671 + -11.979262234 -55.746918042 + -11.895524085 -55.790405168 + -11.889113109 -55.883546650 + -11.966379750 -55.933217876 + -12.050075864 -55.889796125 +} +8510187bfffffff +{ + 58.314946824 50.151433933 + 58.250746406 50.267498803 + 58.274850342 50.434201345 + 58.363273720 50.485386412 + 58.427627727 50.369222641 + 58.403404435 50.201971471 +} +85be8ed3fffffff +{ + -26.118569014 155.286233298 + -26.026096131 155.259564006 + -26.000165709 155.156271831 + -26.066654931 155.079478896 + -26.159183510 155.105977459 + -26.185167282 155.209439943 +} +852da66bfffffff +{ + 34.184331393 34.405455222 + 34.090262198 34.390512515 + 34.031018931 34.480522639 + 34.065771328 34.585465343 + 34.159778058 34.600575456 + 34.219094952 34.510575695 +} +859d2cabfffffff +{ + -24.137449401 149.317276059 + -24.045353781 149.297314733 + -24.015877399 149.198604345 + -24.078413935 149.119719941 + -24.170533796 149.139500164 + -24.200093020 149.238346050 } 85108977fffffff { @@ -20088,3526 +20886,4194 @@ 54.734819372 55.467316430 54.717950205 55.308158552 } -85f124a7fffffff -{ - -84.303307166 157.317470554 - -84.378518186 156.862522717 - -84.451379428 157.337723327 - -84.447832622 158.279750989 - -84.371470545 158.720851008 - -84.299805076 158.234236112 -} -85e533d7fffffff -{ - -61.223813569 123.544855968 - -61.164519215 123.390358943 - -61.199983833 123.208289610 - -61.294949975 123.180028738 - -61.354475746 123.334868855 - -61.318803260 123.517627901 -} -8501012ffffffff -{ - 73.782384839 25.545896845 - 73.837838707 25.742435653 - 73.915463264 25.640157270 - 73.937312579 25.339076124 - 73.881408387 25.142932875 - 73.804106154 25.247460413 -} -85530d9bfffffff -{ - 26.279081504 44.349620041 - 26.188922138 44.328449686 - 26.128144885 44.400030921 - 26.157445667 44.492711509 - 26.247499213 44.513982129 - 26.308357799 44.442472134 -} -85c2e28ffffffff -{ - -35.301690371 -57.569624682 - -35.248747807 -57.518526416 - -35.181904805 -57.562814825 - -35.168041916 -57.658125591 - -35.220998784 -57.709164891 - -35.287804236 -57.664952492 -} -85797197fffffff -{ - 6.913147983 -129.681138240 - 6.829498246 -129.715687435 - 6.759440180 -129.665521546 - 6.773011985 -129.580900597 - 6.856569219 -129.546372630 - 6.926647104 -129.596444295 -} -85a29c2bfffffff -{ - -29.145401557 46.278903266 - -29.058709902 46.277004933 - -29.022657144 46.190650393 - -29.073332505 46.106082458 - -29.160084600 46.107910571 - -29.196100946 46.194376911 -} -852e26c7fffffff -{ - 36.990466899 146.761788253 - 37.081120061 146.739916610 - 37.110352975 146.635559297 - 37.048945572 146.553317020 - 36.958401625 146.575363137 - 36.929155829 146.679477453 -} -85dcc8abfffffff -{ - -45.533696454 -21.464521255 - -45.616191829 -21.523462174 - -45.695004197 -21.448861623 - -45.691256071 -21.315137258 - -45.608669173 -21.256336333 - -45.529921921 -21.331119043 -} -8577a35bfffffff -{ - 1.130444893 150.293835172 - 1.036760212 150.307287705 - 1.002920659 150.393567542 - 1.062709872 150.466371415 - 1.156344741 150.452955846 - 1.190240254 150.366699407 -} -85037623fffffff -{ - 84.266270433 -64.600991234 - 84.320757418 -65.283971261 - 84.288460602 -66.146461139 - 84.202475899 -66.307145627 - 84.149288099 -65.628270782 - 84.180800326 -64.784385665 -} -85e54923fffffff -{ - -69.816200141 91.920795375 - -69.729287864 91.807295224 - -69.718166244 91.533358768 - -69.793864820 91.370970482 - -69.881007066 91.483038557 - -69.892221286 91.758936875 -} -85860e47fffffff -{ - -6.614903481 82.596533593 - -6.699509886 82.621567863 - -6.725098736 82.709399627 - -6.666069412 82.772085286 - -6.581541010 82.746982546 - -6.555963896 82.659262463 -} -85d01237fffffff -{ - -48.417593516 8.851461103 - -48.506942243 8.831785515 - -48.558467580 8.935789707 - -48.520584437 9.059274683 - -48.431274880 9.078600190 - -48.379809117 8.974790827 -} -85d1295bfffffff -{ - -37.327555329 12.412008809 - -37.419247739 12.399974692 - -37.473609361 12.488576136 - -37.436221555 12.589046713 - -37.344591981 12.600833040 - -37.290287262 12.512396508 -} -85e5ae87fffffff -{ - -57.849682778 116.527393768 - -57.781901703 116.398314489 - -57.807260132 116.224831358 - -57.900550600 116.179716055 - -57.968568923 116.308870690 - -57.943059028 116.483067108 -} -85950c87fffffff -{ - -4.736777665 121.612801490 - -4.826996420 121.629213598 - -4.861207381 121.713083460 - -4.805168528 121.780600523 - -4.714873563 121.764182340 - -4.680693653 121.680253112 -} -852f693bfffffff -{ - 29.892115141 137.969943814 - 29.813531904 137.986386153 - 29.785338663 138.081403729 - 29.835744018 138.159997063 - 29.914319578 138.143578222 - 29.942497536 138.048542473 -} -858d2457fffffff -{ - -16.361173877 112.320890101 - -16.290027563 112.303483836 - -16.276575340 112.223588372 - -16.334334380 112.161096181 - -16.405486942 112.178562862 - -16.418874294 112.258461342 -} -856c99cffffffff -{ - 1.428349478 -103.303319984 - 1.356979473 -103.358119460 - 1.276122411 -103.329127249 - 1.266612041 -103.245255172 - 1.338045875 -103.190389245 - 1.418926191 -103.219461803 -} -85e60a53fffffff -{ - -62.746977429 16.462719526 - -62.660577673 16.431482966 - -62.624527321 16.250408272 - -62.674702919 16.099689913 - -62.761237839 16.129847152 - -62.797462704 16.311804345 -} -85bae8bbfffffff -{ - -26.509061987 176.436152520 - -26.426664015 176.392568220 - -26.416592724 176.295947162 - -26.488980626 176.242725919 - -26.571505716 176.286264581 - -26.581515710 176.383070415 -} -85e6ab53fffffff -{ - -58.844896846 21.314110129 - -58.764480295 21.273616075 - -58.735205585 21.114627680 - -58.786234562 20.995407482 - -58.866809491 21.035171989 - -58.896197474 21.194888235 -} -8504186bfffffff -{ - 71.616980283 150.605552958 - 71.522791805 150.679739124 - 71.495817109 150.974090101 - 71.562786100 151.196566670 - 71.657173722 151.124846665 - 71.684394765 150.828172946 +8547a213fffffff +{ + 28.784500132 -178.314275815 + 28.878324041 -178.297583790 + 28.936398270 -178.380935383 + 28.900535750 -178.480985694 + 28.806634820 -178.497499095 + 28.748673334 -178.414141061 +} +85e5abd3fffffff +{ + -57.833006111 113.442299951 + -57.761951939 113.318670560 + -57.783129475 113.142207372 + -57.875487941 113.088609655 + -57.946782437 113.212219989 + -57.925477706 113.389449305 +} +855532dbfffffff +{ + 26.968261260 -14.625308727 + 26.896631081 -14.695786751 + 26.807625869 -14.663040656 + 26.790222117 -14.560000059 + 26.861741777 -14.489545940 + 26.950775587 -14.522108279 +} +858d9ea7fffffff +{ + -4.518020288 112.182812609 + -4.433540003 112.164626019 + -4.412358352 112.081311008 + -4.475737834 112.016179709 + -4.560248516 112.034431719 + -4.581349387 112.117749635 +} +85192cdbfffffff +{ + 60.163375884 -3.009389184 + 60.120472944 -3.130809043 + 60.042170894 -3.099678632 + 60.006784646 -2.947664192 + 60.049613162 -2.826522098 + 60.127902087 -2.857116540 +} +85dd0a73fffffff +{ + -59.936214719 -16.838230741 + -59.854526026 -16.763872390 + -59.780923174 -16.873858627 + -59.788721872 -17.057922575 + -59.870204736 -17.132980722 + -59.944095040 -17.023278626 +} +859f5da7fffffff +{ + -23.090667824 163.070496741 + -23.002114240 163.037594775 + -22.981681242 162.937533005 + -23.049788364 162.870193756 + -23.138434589 162.902972307 + -23.158881094 163.003213819 +} +85ee2843fffffff +{ + -74.795867003 -44.782045750 + -74.733926953 -44.496409622 + -74.637936032 -44.557826856 + -74.603727749 -44.901111823 + -74.665155923 -45.185914484 + -74.761301666 -45.128278766 +} +8597768ffffffff +{ + -21.691693882 28.640236264 + -21.596457610 28.645757362 + -21.544324851 28.558854983 + -21.587413780 28.466403660 + -21.682646316 28.460808809 + -21.734793745 28.547739002 +} +8540c9bbfffffff +{ + 32.200111546 98.604214574 + 32.281167896 98.577760871 + 32.304895556 98.475248498 + 32.247565494 98.399233315 + 32.166498559 98.425745217 + 32.142772206 98.528214234 +} +850eaa37fffffff +{ + 58.066605768 -88.790192167 + 57.999073821 -88.919870728 + 57.905360919 -88.874079879 + 57.879039413 -88.699352468 + 57.946331642 -88.569641968 + 58.040184689 -88.614688571 +} +858adb07fffffff +{ + 3.839146419 -61.463687479 + 3.917223639 -61.417251332 + 3.994938152 -61.456678740 + 3.994557287 -61.542467033 + 3.916543863 -61.588840194 + 3.838847547 -61.549488108 +} +85420a37fffffff +{ + 26.001951596 66.508265325 + 25.927293586 66.560030635 + 25.926388926 66.661355668 + 26.000156944 66.711139369 + 26.074945994 66.659470703 + 26.075835956 66.557921286 +} +85d29933fffffff +{ + -40.346238370 -96.690912996 + -40.274562626 -96.610370908 + -40.184356239 -96.652243281 + -40.165703106 -96.774421317 + -40.237240204 -96.855063708 + -40.327569009 -96.813428474 +} +85e55987fffffff +{ + -67.375524649 96.697320698 + -67.290850690 96.578006595 + -67.287371202 96.328146517 + -67.368532667 96.195955621 + -67.453452404 96.314313266 + -67.456965054 96.565826085 +} +8544767bfffffff +{ + 27.566035589 -88.490116338 + 27.634524239 -88.423805335 + 27.722802724 -88.454910600 + 27.742625343 -88.552489114 + 27.674075485 -88.618871122 + 27.585764279 -88.587603712 +} +8594084ffffffff +{ + -12.497170839 127.147577125 + -12.584101018 127.163849192 + -12.618474786 127.250477998 + -12.565918143 127.320881682 + -12.478935316 127.304612476 + -12.444561738 127.217936660 +} +8538da2bfffffff +{ + 23.447847279 5.571708136 + 23.355133462 5.582510530 + 23.315386115 5.672447095 + 23.368338170 5.751732558 + 23.461136328 5.741059791 + 23.500898144 5.650971760 +} +85b45d43fffffff +{ + -22.776069467 -165.277062478 + -22.687861056 -165.235662666 + -22.611575244 -165.297013414 + -22.623426390 -165.399683122 + -22.711547955 -165.441161207 + -22.787905226 -165.379891593 +} +853b8487fffffff +{ + 34.189483817 -57.919627833 + 34.106780381 -57.945809869 + 34.041917518 -57.880085740 + 34.059668454 -57.788083830 + 34.142410284 -57.761686136 + 34.207362885 -57.827505951 +} +8511818ffffffff +{ + 55.134058613 37.363214340 + 55.082180836 37.478575548 + 55.119208301 37.611503816 + 55.208271482 37.629322913 + 55.260247977 37.513653648 + 55.223062294 37.380473434 +} +85e024d3fffffff +{ + -63.195772272 63.553468746 + -63.103445287 63.558820035 + -63.056398549 63.393747431 + -63.101423736 63.222966020 + -63.193655591 63.216525195 + -63.240958045 63.381954085 +} +8554aec3fffffff +{ + 15.181699899 -19.012350958 + 15.113154046 -19.072213784 + 15.033523575 -19.039036418 + 15.022378412 -18.946125739 + 15.090808679 -18.886254755 + 15.170499598 -18.919302405 +} +8574248bfffffff +{ + 4.790740975 -3.548981755 + 4.717246345 -3.534639517 + 4.680697941 -3.464488334 + 4.717622475 -3.408568574 + 4.791197083 -3.422847892 + 4.827767195 -3.493110006 +} +85cc9d2bfffffff +{ + -34.284587251 82.335256933 + -34.373763750 82.366359345 + -34.393842254 82.476168872 + -34.324761363 82.554701935 + -34.235645319 82.523491404 + -34.215549653 82.413855630 +} +85b8b447fffffff +{ + -24.434271176 137.856201759 + -24.343569065 137.848623288 + -24.307854364 137.759158166 + -24.362722151 137.677205734 + -24.453384723 137.684599424 + -24.489219178 137.774130291 +} +85ef1e27fffffff +{ + -80.674374357 -31.089127680 + -80.597458095 -30.728485893 + -80.508552939 -30.957619999 + -80.495974622 -31.540246681 + -80.572089832 -31.903537124 + -80.661581586 -31.681663520 +} +85f2f2b3fffffff +{ + -82.831952018 -109.393953191 + -82.870207291 -108.728217015 + -82.814043756 -108.134906461 + -82.720567448 -108.212875361 + -82.683115931 -108.868070151 + -82.738347977 -109.455774483 +} +85054477fffffff +{ + 83.503148095 152.680362596 + 83.409774683 152.854692627 + 83.378943821 153.648381562 + 83.440768923 154.284043831 + 83.534584739 154.129175864 + 83.566145635 153.318992790 +} +85622e9bfffffff +{ + 11.530825081 59.702239585 + 11.604253237 59.677688882 + 11.609961976 59.645328128 + 11.609962828 59.605636807 + 11.553745712 59.572902914 + 11.480407787 59.597414387 + 11.468896534 59.662054043 +} +850a0ccffffffff +{ + 66.099793834 90.690722161 + 66.068504633 90.902415646 + 66.124826334 91.066121359 + 66.212782530 91.018214062 + 66.244228981 90.805249386 + 66.187561206 90.641467648 +} +85cc0297fffffff +{ + -42.864133951 83.018334404 + -42.946026675 83.052618116 + -42.961685488 83.171686500 + -42.895466943 83.256263969 + -42.813624836 83.221857015 + -42.797950590 83.102995446 +} +85dc205bfffffff +{ + -57.977455664 -16.478663401 + -57.897359512 -16.410114052 + -57.825412077 -16.513795634 + -57.833287503 -16.685791855 + -57.913190955 -16.754961173 + -57.985411970 -16.651517141 +} +85dda503fffffff +{ + -61.280256364 -4.366353434 + -61.193113353 -4.328405619 + -61.131358113 -4.471633382 + -61.156448937 -4.652973901 + -61.243499477 -4.691936867 + -61.305552407 -4.548546384 +} +85ccb367fffffff +{ + -34.877850929 86.957415720 + -34.964207263 86.991478012 + -34.979663984 87.099561244 + -34.908802256 87.173400309 + -34.822518021 87.139255275 + -34.807023383 87.031353611 +} +85f104d3fffffff +{ + -83.376910455 131.714097413 + -83.424485550 131.074329045 + -83.508897927 131.148866879 + -83.545493133 131.881422131 + -83.496806326 132.527166835 + -83.412648627 132.434464249 +} +851f893bfffffff +{ + 47.544224318 12.823145237 + 47.458422417 12.829477937 + 47.422955494 12.947708284 + 47.473263681 13.059815856 + 47.559101087 13.053734602 + 47.594594957 12.935294106 +} +850c528bfffffff +{ + 60.020518828 -154.478478219 + 59.953612739 -154.588808353 + 59.879871684 -154.530870499 + 59.872888938 -154.363309534 + 59.939515394 -154.252859293 + 60.013403772 -154.310087528 +} +859b0497fffffff +{ + -23.506482037 -173.479624612 + -23.422610579 -173.433694732 + -23.345013921 -173.486736592 + -23.351242231 -173.585584035 + -23.435008646 -173.631543716 + -23.512651743 -173.578626402 +} +852582c3fffffff +{ + 42.579333357 89.940556114 + 42.488052102 89.970087950 + 42.463134866 90.090205389 + 42.529371892 90.181053090 + 42.620665853 90.151874486 + 42.645710313 90.031494589 +} +859d1193fffffff +{ + -19.114635762 151.780836030 + -19.026350699 151.759493580 + -18.999783907 151.664892726 + -19.061429626 151.591501879 + -19.149754946 151.612687384 + -19.176394417 151.707420846 +} +85099eabfffffff +{ + 58.379858449 8.534010303 + 58.308705173 8.546959186 + 58.286000968 8.686166883 + 58.334413244 8.812760173 + 58.405600789 8.800138997 + 58.428341958 8.660596287 +} +851f8197fffffff +{ + 48.692050273 8.305773192 + 48.608723367 8.317133506 + 48.579046680 8.436581856 + 48.632685074 8.544917885 + 48.716061448 8.533797793 + 48.745750096 8.414101104 +} +85b99d43fffffff +{ + -27.364639959 137.659644753 + -27.272318822 137.652029015 + -27.234847173 137.559744429 + -27.289577595 137.475006650 + -27.381854525 137.482425152 + -27.419445368 137.574778625 +} +85dd716ffffffff +{ + -60.230644375 -26.694817646 + -60.154925048 -26.591407939 + -60.073441713 -26.676758230 + -60.067431776 -26.864909104 + -60.142879530 -26.968743953 + -60.224608680 -26.884006649 +} +850d2463fffffff +{ + 75.492318455 -151.272774883 + 75.422628662 -151.522707040 + 75.334292764 -151.418637932 + 75.315412190 -151.068084815 + 75.384577837 -150.818067906 + 75.473146146 -150.918667048 +} +853d96d7fffffff +{ + 22.989731768 74.880725600 + 22.915507536 74.921293142 + 22.909265021 75.017966783 + 22.977213974 75.074273340 + 23.051538945 75.033846528 + 23.057814292 74.936972090 +} +85b50197fffffff +{ + -36.479006204 -156.673660273 + -36.389011921 -156.633629964 + -36.316424756 -156.711397282 + -36.333768768 -156.829164094 + -36.423723478 -156.869354293 + -36.496373825 -156.791618162 +} +855619a7fffffff +{ + 11.790787125 -34.110066214 + 11.865530222 -34.062542067 + 11.944549608 -34.108725159 + 11.948879704 -34.202452798 + 11.874161485 -34.250019207 + 11.795088274 -34.203815837 +} +85199827fffffff +{ + 54.919479775 -23.449030319 + 54.851727150 -23.544162710 + 54.772624947 -23.481934647 + 54.761210603 -23.324886162 + 54.828869073 -23.229655588 + 54.908035937 -23.291570596 +} +8500726bfffffff +{ + 82.721041026 20.791091847 + 82.789474006 21.204248209 + 82.872001977 20.909255518 + 82.885286008 20.190426607 + 82.815901327 19.782055927 + 82.734187229 20.087514057 } -8503263bfffffff +85d4a15bfffffff +{ + -46.428283928 -154.185376037 + -46.344462788 -154.143237431 + -46.279560042 -154.232216911 + -46.298419243 -154.363324933 + -46.382212174 -154.405680959 + -46.447174219 -154.316712021 +} +85071bd3fffffff +{ + 72.122649950 -20.201999737 + 72.150748346 -20.451504728 + 72.091635771 -20.648830458 + 72.004719514 -20.596100598 + 71.976886246 -20.348163456 + 72.035705329 -20.151392942 +} +85584583fffffff +{ + 15.689959905 14.641973200 + 15.598001460 14.645108275 + 15.552261280 14.730644229 + 15.598416874 14.813147585 + 15.690412175 14.810147005 + 15.736215138 14.724508508 +} +85157473fffffff +{ + 61.794788384 117.007475616 + 61.730476458 117.149718677 + 61.753082059 117.337747733 + 61.840190092 117.384474750 + 61.904809582 117.242142597 + 61.882012753 117.053169735 +} +850e9bb7fffffff +{ + 55.159945414 -95.318963832 + 55.087852288 -95.424502109 + 54.998176802 -95.367130825 + 54.980416386 -95.204738413 + 55.052294973 -95.099007198 + 55.142148342 -95.155859189 +} +85f26367fffffff +{ + -72.710143862 -122.433221632 + -72.758605802 -122.203428019 + -72.720266833 -121.930865888 + -72.633730918 -121.890052195 + -72.585708684 -122.119231861 + -72.623784293 -122.389845974 +} +85efa8a3fffffff +{ + -80.046738303 -18.820151171 + -79.959252980 -18.581050463 + -79.879951288 -18.894183439 + -79.887407974 -19.443324084 + -79.974296149 -19.688153015 + -80.054326371 -19.378209732 +} +853e6b63fffffff +{ + 27.810896038 35.604851497 + 27.716188628 35.589833164 + 27.657389996 35.673166728 + 27.693213334 35.771501130 + 27.787848412 35.786662797 + 27.846732557 35.703346934 +} +85bd2c4bfffffff +{ + -41.979226701 35.341054955 + -41.904483854 35.344054728 + -41.869101122 35.247161504 + -41.908463278 35.147191524 + -41.983218367 35.144099208 + -42.018599153 35.241069427 +} +85ee330ffffffff +{ + -76.277298716 -26.821455980 + -76.195778814 -26.597563655 + -76.108927721 -26.781111953 + -76.103128997 -27.185706899 + -76.184122055 -27.411543562 + -76.271440103 -27.230879664 +} +85ec6d73fffffff +{ + -80.235396851 149.326207983 + -80.220657826 148.849683637 + -80.287677442 148.505489091 + -80.369990770 148.639044542 + -80.384923281 149.122559594 + -80.317346666 149.465464516 +} +85e080cffffffff +{ + -52.264301526 68.066439101 + -52.175717102 68.059652586 + -52.139970726 67.932982220 + -52.192602453 67.812824810 + -52.281142117 67.819024107 + -52.317095225 67.945967941 +} +85c0ec57fffffff +{ + -40.432975469 -5.786398010 + -40.525161637 -5.823828384 + -40.595246891 -5.737453368 + -40.573052464 -5.613656055 + -40.480831100 -5.576472429 + -40.410839228 -5.662838929 +} +850a0c23fffffff +{ + 66.702856666 91.544341783 + 66.670375839 91.761133968 + 66.726312686 91.931917466 + 66.815083914 91.886041790 + 66.847735536 91.667931322 + 66.791444272 91.497019397 +} +85ed868ffffffff +{ + -61.164521090 153.682943533 + -61.144950299 153.514909007 + -61.209366097 153.406454434 + -61.293559698 153.466327536 + -61.313121558 153.635251907 + -61.248498688 153.743410314 +} +8520022ffffffff +{ + 44.835717590 72.129979516 + 44.748660694 72.191564607 + 44.742868750 72.328500735 + 44.824113468 72.404258189 + 44.911287833 72.342922285 + 44.917100067 72.205578749 +} +85010303fffffff +{ + 73.513595164 29.567997536 + 73.565180617 29.777403675 + 73.644644935 29.697290841 + 73.672255389 29.405349363 + 73.620215022 29.195937555 + 73.541020384 29.278460922 +} +85bcb183fffffff +{ + -28.766913898 39.239313108 + -28.677546016 39.240405266 + -28.635623912 39.150896685 + -28.683087210 39.060210334 + -28.772493287 39.059039789 + -28.814397949 39.148634017 +} +857d081bfffffff +{ + -6.478072480 -23.027747920 + -6.397520508 -22.984506396 + -6.318535805 -23.028954405 + -6.320058402 -23.116703383 + -6.400648790 -23.160023574 + -6.479678167 -23.115516188 +} +857c4d6ffffffff +{ + 5.577571947 -30.649453421 + 5.655900588 -30.602869767 + 5.737799876 -30.648915383 + 5.741426350 -30.741578542 + 5.663104795 -30.788217654 + 5.581149656 -30.742138257 +} +85a68223fffffff +{ + -17.359581339 114.868711753 + -17.437271238 114.884317961 + -17.473621750 114.960140196 + -17.432271003 115.020420391 + -17.354506004 115.004799580 + -17.318166853 114.928913141 +} +85033373fffffff +{ + 86.849199062 -151.990933307 + 86.780280907 -153.104153328 + 86.690079962 -152.601186641 + 86.667574775 -151.052400924 + 86.734251904 -149.936473123 + 86.825637278 -150.370032444 +} +85da5c2ffffffff +{ + -53.392550827 154.409772367 + -53.307948497 154.372707047 + -53.283713506 154.224535614 + -53.344031063 154.113085791 + -53.428677055 154.149790509 + -53.452962018 154.298306380 +} +8549187bfffffff +{ + 19.361965519 -107.095756463 + 19.442398834 -107.038528188 + 19.529096552 -107.083989109 + 19.535304265 -107.186763412 + 19.454799597 -107.243945563 + 19.368158595 -107.198399779 +} +851b3257fffffff +{ + 58.963978287 -52.370031910 + 58.942071393 -52.546232978 + 58.851042524 -52.599966598 + 58.782101506 -52.478177474 + 58.803959244 -52.302823408 + 58.894806897 -52.248414181 +} +85031567fffffff +{ + 85.851051138 -136.823440942 + 85.800529824 -137.883373555 + 85.706377189 -137.824768565 + 85.662685075 -136.753470346 + 85.711721018 -135.715456229 + 85.805901870 -135.726746297 +} +85000c07fffffff +{ + 80.970521992 29.261661456 + 81.029400332 29.657221935 + 81.115593911 29.503151812 + 81.142431332 28.944786924 + 81.082730555 28.549340495 + 80.997019374 28.712060923 +} +8504688bfffffff +{ + 77.041206553 -170.921735151 + 76.953194383 -171.089298597 + 76.876475928 -170.842314285 + 76.887224153 -170.429509802 + 76.974765682 -170.258546472 + 77.052030527 -170.503744765 +} +85d56323fffffff +{ + -53.709172761 -172.989480904 + -53.643688223 -172.924756132 + -53.573075284 -173.000628719 + -53.567913482 -173.140981203 + -53.633333756 -173.205771328 + -53.703980066 -173.130144331 +} +85c70ec3fffffff +{ + -44.272693124 -141.786748035 + -44.185241957 -141.760177224 + -44.129761911 -141.851923870 + -44.161688614 -141.970358506 + -44.249164625 -141.997181107 + -44.304689215 -141.905317424 +} +85b40827fffffff +{ + -25.919649212 -160.167340380 + -25.828945211 -160.128369212 + -25.753379594 -160.196025173 + -25.768442075 -160.302601569 + -25.859080949 -160.341685302 + -25.934722515 -160.274080371 +} +8557a44ffffffff +{ + 22.575156524 -41.397381657 + 22.496438873 -41.441167679 + 22.418546380 -41.387369957 + 22.419249885 -41.289804774 + 22.497909973 -41.245873260 + 22.575924210 -41.299652163 +} +8565a42ffffffff +{ + 8.365330105 105.876386226 + 8.458746337 105.854631894 + 8.486188698 105.762938450 + 8.420160878 105.693014841 + 8.326715969 105.714833351 + 8.299327503 105.806511360 +} +85a8a3affffffff +{ + -22.220132527 -43.838601086 + -22.144956379 -43.786628471 + -22.066919971 -43.834828454 + -22.064082192 -43.934980039 + -22.139274895 -43.986955027 + -22.217288820 -43.938776212 +} +850e5363fffffff +{ + 53.147215046 -75.855049105 + 53.094482235 -75.989686700 + 52.998807816 -75.980318747 + 52.955843795 -75.836988821 + 53.008372834 -75.702627068 + 53.104069162 -75.711319071 +} +85f08e47fffffff +{ + -71.138062376 77.149602043 + -71.045975952 77.094796656 + -71.012868764 76.827148155 + -71.071598930 76.612712433 + -71.163757985 76.665360689 + -71.197115584 76.934606724 +} +8501b0a3fffffff +{ + 69.945986250 52.209790234 + 69.969515730 52.439246116 + 70.049892365 52.473557615 + 70.106798988 52.276552477 + 70.082968240 52.045712058 + 70.002533474 52.013265249 +} +85c58c6ffffffff +{ + -36.715909757 -41.720354768 + -36.785452589 -41.782967728 + -36.867201574 -41.746991632 + -36.879425480 -41.648174037 + -36.809780637 -41.585498910 + -36.728014005 -41.621703369 +} +853ed453fffffff +{ + 19.926442888 23.418128801 + 19.831084187 23.413989698 + 19.780140185 23.500584100 + 19.824471916 23.591379920 + 19.919821195 23.595668444 + 19.970848290 23.509011764 +} +850385cbfffffff +{ + 80.935449187 -151.267191062 + 80.865978547 -151.666788731 + 80.775609669 -151.499609339 + 80.754323728 -150.941606569 + 80.822985142 -150.541816581 + 80.913736649 -150.700133103 +} +850c1d53fffffff +{ + 62.478137278 -160.295497011 + 62.404017797 -160.402907246 + 62.329674281 -160.320325698 + 62.329239826 -160.131052776 + 62.403061845 -160.023276713 + 62.477615461 -160.105135295 +} +85d2edcffffffff +{ + -38.391774918 -110.161732485 + -38.330161399 -110.067304812 + -38.235980472 -110.088554695 + -38.203367816 -110.203920386 + -38.264835788 -110.298282976 + -38.359061743 -110.277345301 +} +85ef8ecffffffff +{ + -77.308994784 -7.054316903 + -77.215106623 -6.948767249 + -77.147839186 -7.259529274 + -77.173851261 -7.676153214 + -77.267474205 -7.786692072 + -77.335353372 -7.475649521 +} +85d11e1bfffffff +{ + -41.448104685 7.171335270 + -41.540633798 7.151216653 + -41.598331541 7.244815347 + -41.563430796 7.358388450 + -41.470937393 7.378220768 + -41.413308874 7.284766353 +} +85eca467fffffff +{ + -64.107395847 144.757396767 + -64.077147483 144.568789142 + -64.136934894 144.420035667 + -64.227227778 144.459913464 + -64.257557883 144.649557369 + -64.197512907 144.798283785 +} +85b973d7fffffff +{ + -37.021648285 128.402620109 + -36.930706315 128.405377827 + -36.883331916 128.314895116 + -36.926784569 128.221647714 + -37.017632191 128.218674807 + -37.065121577 128.309164245 +} +856f0a8bfffffff +{ + 0.156223046 -116.951414317 + 0.223125778 -116.908345437 + 0.294682054 -116.952272195 + 0.299246557 -117.039289915 + 0.232277115 -117.082284451 + 0.160809845 -117.038335759 +} +85b2e033fffffff +{ + -31.514119878 -69.946557982 + -31.586341485 -70.003044901 + -31.656892318 -69.959217076 + -31.655208849 -69.858925337 + -31.583017360 -69.802527262 + -31.512479247 -69.846331932 +} +858ed8bbfffffff +{ + -20.569180094 -85.985662547 + -20.643907378 -86.047116539 + -20.730669678 -86.007147531 + -20.742710217 -85.905678591 + -20.667979105 -85.844228868 + -20.581211310 -85.884243653 +} +8560962bfffffff +{ + 21.438360524 78.697727118 + 21.522059088 78.668882042 + 21.535675290 78.577212557 + 21.465658875 78.514467129 + 21.382012663 78.543305202 + 21.368330485 78.634895814 +} +859c2653fffffff +{ + -17.268588147 147.983665797 + -17.181969317 147.966460688 + -17.154402092 147.875592571 + -17.213366124 147.801819233 + -17.300006725 147.818866335 + -17.327661664 147.909844889 +} +85032053fffffff +{ + 89.633951975 -31.625424747 + 89.719853856 -36.979027433 + 89.717556338 -56.184494455 + 89.629894986 -61.160261937 + 89.562079961 -52.529056176 + 89.564017894 -40.207322072 +} +852db197fffffff +{ + 33.649292371 35.210763323 + 33.555342537 35.195201933 + 33.495675861 35.283860795 + 33.529884620 35.388064555 + 33.623767980 35.403788262 + 33.683509143 35.315146133 +} +8581a833fffffff +{ + -9.215214855 -38.231635092 + -9.131961665 -38.181469337 + -9.047854067 -38.229258802 + -9.046990113 -38.327218167 + -9.130252007 -38.377411464 + -9.214369147 -38.329617998 +} +8529ac67fffffff +{ + 35.418779497 -119.609053476 + 35.501658753 -119.554627917 + 35.579056523 -119.614070130 + 35.573516509 -119.727956427 + 35.490626102 -119.782235928 + 35.413286832 -119.722775511 +} +85018897fffffff +{ + 75.029411151 50.500981626 + 75.058635271 50.810170175 + 75.144289669 50.847143363 + 75.200773377 50.571402414 + 75.171137854 50.259783954 + 75.085432496 50.226344290 +} +85ef2463fffffff +{ + -85.353891573 -75.225875331 + -85.339166340 -74.084844180 + -85.250347080 -73.709001997 + -85.177292329 -74.444437222 + -85.191521700 -75.548343337 + -85.279289196 -75.953143061 +} +856799c7fffffff +{ + 10.651841977 -81.667548846 + 10.583634582 -81.722364365 + 10.504903001 -81.684980102 + 10.494427330 -81.592757203 + 10.562688925 -81.537964509 + 10.641371970 -81.575371764 +} +859fa197fffffff +{ + -17.580307586 174.684544152 + -17.501248776 174.646060421 + -17.486768175 174.557517563 + -17.551383055 174.507304524 + -17.630562997 174.545741500 + -17.645006866 174.634438495 +} +8536e5a3fffffff +{ + 30.195757978 -144.043972489 + 30.113744243 -144.081085295 + 30.043346685 -144.013311045 + 30.054966339 -143.908477825 + 30.136959738 -143.871331002 + 30.207353863 -143.939051222 +} +85eed36bfffffff +{ + -64.864827883 -22.246308242 + -64.782836304 -22.138054885 + -64.701855313 -22.253964965 + -64.702556643 -22.477463447 + -64.784265356 -22.586516275 + -64.865555712 -22.471277685 +} +85efa26ffffffff +{ + -80.122509627 3.103245859 + -80.026618800 3.142146425 + -79.972972057 2.690187404 + -80.014521064 2.195776527 + -80.110334582 2.147863149 + -80.164682743 2.603354876 +} +858ad18ffffffff +{ + 0.766713009 -60.691916388 + 0.845314867 -60.644922377 + 0.925225664 -60.684989597 + 0.926509440 -60.771976296 + 0.847964491 -60.818908714 + 0.768078885 -60.778916092 +} +850a34c3fffffff +{ + 61.568110112 83.082088883 + 61.481666638 83.144235162 + 61.460576806 83.333790851 + 61.525834790 83.461923350 + 61.612355989 83.400508230 + 61.633541834 83.210227349 +} +859d525bfffffff +{ + -18.568763645 145.312118962 + -18.481138536 145.297380538 + -18.451872873 145.206977948 + -18.510134567 145.131214015 + -18.597766645 145.145787164 + -18.627130206 145.236289595 +} +853d915bfffffff +{ + 23.287605448 77.268218076 + 23.369004365 77.239215811 + 23.380645849 77.148290606 + 23.310957662 77.086448203 + 23.229609006 77.115439232 + 23.217898246 77.206284003 +} +854010d3fffffff +{ + 28.660669672 111.724208831 + 28.744953429 111.703697130 + 28.778052153 111.610331866 + 28.726835326 111.537476249 + 28.642498902 111.558068946 + 28.609431932 111.651436306 +} +85e0d5abfffffff +{ + -51.762909461 58.072527462 + -51.678308761 58.088530594 + -51.634604681 57.982649920 + -51.675290751 57.860691680 + -51.759776912 57.844195645 + -51.803691804 57.950149983 +} +85af810ffffffff +{ + -27.887198729 88.129757105 + -27.976035206 88.162373432 + -27.993703642 88.263251191 + -27.922577882 88.331351541 + -27.833828596 88.298668233 + -27.816117871 88.197951303 +} +85e282abfffffff +{ + -60.820004786 -117.306096807 + -60.770175566 -117.148976182 + -60.679322926 -117.165060722 + -60.638295752 -117.337461340 + -60.687974313 -117.494223545 + -60.778830210 -117.478943886 +} +855b8d8bfffffff +{ + 13.488955778 177.280647413 + 13.572723300 177.290915113 + 13.619492844 177.216732477 + 13.582379989 177.132303007 + 13.498567440 177.122174340 + 13.451912652 177.196335997 +} +85e55d03fffffff +{ + -67.553909243 98.961249149 + -67.470965129 98.833338189 + -67.470978500 98.581162496 + -67.553929113 98.455220260 + -67.637135688 98.582272406 + -67.637129210 98.836133683 +} +8500092bfffffff +{ + 83.068765853 25.605906947 + 83.133019351 26.090647520 + 83.218807372 25.841248600 + 83.239619984 25.093226160 + 83.174315967 24.610949387 + 83.089255932 24.874008240 +} +85c8545bfffffff +{ + -41.599336782 104.237497281 + -41.527684561 104.166749701 + -41.534876087 104.044054953 + -41.613755230 103.991714979 + -41.685589306 104.062327596 + -41.678362292 104.185416051 +} +85008677fffffff +{ + 76.097311795 75.741475606 + 76.090434588 76.118516034 + 76.166711511 76.321717815 + 76.250331062 76.145888303 + 76.257188573 75.764383298 + 76.180446143 75.563206925 +} +8516b3d7fffffff +{ + 48.301250585 154.137092882 + 48.390669612 154.120594056 + 48.422018796 153.994898390 + 48.363925705 153.886008105 + 48.274575765 153.902808288 + 48.243249671 154.028197904 +} +859c6a8ffffffff +{ + -17.697120746 135.811867842 + -17.779596438 135.827452195 + -17.809981772 135.916012531 + -17.757917439 135.989010977 + -17.675420487 135.973443682 + -17.645009054 135.884860819 +} +85c4c90bfffffff +{ + -50.145553235 -33.896274342 + -50.214629786 -33.969865704 + -50.295905460 -33.910992459 + -50.308090550 -33.778206270 + -50.238921097 -33.704612209 + -50.157659553 -33.763806408 +} +851021a7fffffff +{ + 62.817892754 41.899586948 + 62.766248067 42.038740004 + 62.801259178 42.212201915 + 62.888065401 42.247014475 + 62.939846818 42.107502450 + 62.904684826 41.933536314 +} +859720dbfffffff +{ + -23.718295415 34.222458118 + -23.624365405 34.225666934 + -23.576144975 34.137397275 + -23.621854995 34.045860555 + -23.715806662 34.042574911 + -23.764026736 34.130902816 +} +85efa137fffffff +{ + -81.303263463 -11.403508410 + -81.211646870 -11.205819374 + -81.140365974 -11.622078323 + -81.159831396 -12.234911496 + -81.250935403 -12.442076240 + -81.323091498 -12.027051196 +} +85df5847fffffff +{ + -53.537402326 -61.561463845 + -53.501454937 -61.424550913 + -53.419561167 -61.406894342 + -53.373692650 -61.525520407 + -53.409475553 -61.661967205 + -53.491290974 -61.680253310 +} +8528d857fffffff +{ + 49.900853534 -124.105706914 + 49.823721733 -124.133014136 + 49.761184270 -124.041735679 + 49.775591525 -123.923048181 + 49.852697365 -123.895290883 + 49.915422253 -123.986670635 +} +85e50a6bfffffff +{ + -62.917402571 111.784103959 + -62.845002360 111.643123923 + -62.864503577 111.435065167 + -62.956527968 111.366906646 + -63.029195144 111.507789367 + -63.009570444 111.716931752 +} +854b5567fffffff +{ + 29.307399732 131.761462877 + 29.229282621 131.778550924 + 29.205335347 131.872709359 + 29.259533833 131.949819215 + 29.337657784 131.932743193 + 29.361576485 131.838545210 +} +856af00ffffffff +{ + 1.697766098 27.089643831 + 1.788552661 27.095234444 + 1.837896315 27.016721077 + 1.796514228 26.932601134 + 1.705743017 26.926950696 + 1.656338452 27.005479994 +} +85a50547fffffff +{ + -12.287750478 -27.191975230 + -12.205915460 -27.145906959 + -12.127333079 -27.192242710 + -12.130561945 -27.284694763 + -12.212438017 -27.330832575 + -12.291044158 -27.284448892 +} +85359a4ffffffff +{ + 35.181408302 -37.492297007 + 35.097249373 -37.548255486 + 35.014999415 -37.488453750 + 35.016803100 -37.372753698 + 35.100906564 -37.316622478 + 35.183261861 -37.376363595 +} +85f2832ffffffff +{ + -86.952049709 -110.400668539 + -86.992743707 -108.837967497 + -86.937460817 -107.445245766 + -86.843711826 -107.645374851 + -86.804823869 -109.151483568 + -86.857938174 -110.513293596 +} +8554e67bfffffff +{ + 12.477566212 -14.685063398 + 12.412769032 -14.745090881 + 12.336411296 -14.717135248 + 12.324806193 -14.629285269 + 12.389488935 -14.569274783 + 12.465891101 -14.597097133 +} +853fa30ffffffff +{ + 30.089879975 13.622808577 + 29.993599349 13.627309927 + 29.949131378 13.724860480 + 30.000907712 13.818048443 + 30.097233997 13.813719925 + 30.141738402 13.716030498 +} +8501440bfffffff +{ + 75.854677657 6.551351960 + 75.925222553 6.677966764 + 75.990163751 6.457238151 + 75.984035112 6.108985778 + 75.913154758 5.985042576 + 75.848737238 6.206656342 +} +859ad347fffffff +{ + -5.053615927 -171.034979869 + -4.978964407 -170.997034989 + -4.916928931 -171.044248371 + -4.929467203 -171.129325459 + -5.004020449 -171.167302312 + -5.066133663 -171.120170265 +} +85ee5d43fffffff +{ + -66.759970502 -48.108748506 + -66.703060618 -47.912667762 + -66.608646941 -47.939293247 + -66.571080580 -48.160314192 + -66.627648166 -48.355843241 + -66.722123165 -48.330905457 +} +85ef5bc7fffffff +{ + -73.111808255 -55.297499913 + -73.064063531 -55.008056531 + -72.967234571 -55.004783742 + -72.918187939 -55.287742247 + -72.965541903 -55.575433938 + -73.062330926 -55.581917158 +} +85120ed3fffffff +{ + 58.023106827 -117.750752095 + 57.939224184 -117.803605095 + 57.868297940 -117.696796457 + 57.881024101 -117.537136208 + 57.964830273 -117.483604638 + 58.035987172 -117.590410083 +} +85569c73fffffff +{ + 9.625823946 -42.851383631 + 9.704365336 -42.801790519 + 9.784389364 -42.848001467 + 9.785904928 -42.943790373 + 9.707401751 -42.993389932 + 9.627344804 -42.947194274 +} +85ef6d9bfffffff +{ + -73.574487178 -81.567280158 + -73.567010915 -81.237430018 + -73.481355832 -81.091032737 + -73.403587724 -81.272597326 + -73.411058504 -81.599183792 + -73.496302680 -81.747447797 +} +856606cffffffff +{ + 9.887802987 -76.034203906 + 9.820392395 -76.086957972 + 9.740986130 -76.048696073 + 9.729052750 -75.957676978 + 9.796511063 -75.904969499 + 9.875855037 -75.943234407 +} +85004d63fffffff +{ + 83.663778768 -37.748327674 + 83.741861682 -38.061134676 + 83.751951153 -38.887981754 + 83.683651208 -39.382505080 + 83.606429810 -39.055934123 + 83.596641692 -38.248302175 +} +850a7023fffffff +{ + 69.610356467 91.394451599 + 69.578286923 91.643509604 + 69.636398212 91.839265634 + 69.726974632 91.786130904 + 69.759235690 91.535328461 + 69.700727685 91.339412191 +} +85e81d57fffffff +{ + -63.670423683 -85.843857111 + -63.666574513 -85.642078813 + -63.588672423 -85.538842767 + -63.514918898 -85.636837435 + -63.518821205 -85.837385850 + -63.596424082 -85.941164491 +} +854446bbfffffff +{ + 29.825794584 -90.803278486 + 29.895169070 -90.735594436 + 29.983804004 -90.769810004 + 30.003089683 -90.871875594 + 29.933656442 -90.939620056 + 29.844996342 -90.905238655 +} +8516152bfffffff +{ + 53.965652018 161.476734602 + 54.051954140 161.469598969 + 54.088653935 161.331906550 + 54.038988630 161.201647298 + 53.952717784 161.209192336 + 53.916080722 161.346587560 +} +8516984bfffffff +{ + 45.103618789 158.598598360 + 45.196613692 158.588604057 + 45.234770504 158.468658609 + 45.179889693 158.358955580 + 45.086946719 158.369247320 + 45.048832452 158.488944968 +} +85ed0973fffffff +{ + -70.259220238 163.486820417 + -70.257774285 163.252225847 + -70.332832027 163.136956347 + -70.409526736 163.257395132 + -70.410865167 163.493771359 + -70.335616753 163.607918540 +} +8506540bfffffff +{ + 64.960138873 -34.741187428 + 64.965349726 -34.945356329 + 64.888440179 -35.059335125 + 64.806586949 -34.969451449 + 64.801495095 -34.766477614 + 64.878137849 -34.652197000 +} +85347227fffffff +{ + 31.176242226 -20.922369165 + 31.099964277 -20.992489130 + 31.010101648 -20.950700704 + 30.996461309 -20.838967056 + 31.072635044 -20.768818715 + 31.162553246 -20.810432027 +} +85094193fffffff +{ + 71.091411574 10.141510088 + 71.153899605 10.247477918 + 71.217377093 10.100965283 + 71.217991509 9.847775261 + 71.155221426 9.743024148 + 71.092118524 9.890236707 +} +855d94a3fffffff +{ + 15.849183493 -161.873164808 + 15.757187427 -161.900600533 + 15.688510639 -161.833065551 + 15.711801394 -161.738045642 + 15.803825817 -161.710524022 + 15.872531177 -161.778108115 +} +85b02047fffffff +{ + -28.377331959 -119.001038883 + -28.326119904 -118.914711879 + -28.239292052 -118.921111857 + -28.203684355 -119.013600541 + -28.254773652 -119.099808756 + -28.341593197 -119.093647091 +} +852d0ecffffffff +{ + 41.810375724 36.395783445 + 41.721364997 36.377682378 + 41.661548851 36.473053956 + 41.690681700 36.586495682 + 41.779630843 36.604784208 + 41.839508826 36.509443879 +} +8570210ffffffff +{ + 7.271656218 -169.183303742 + 7.183809783 -169.205494419 + 7.117256851 -169.142368057 + 7.138504365 -169.056976748 + 7.226394122 -169.034698182 + 7.292993093 -169.097898783 +} +85dd762bfffffff +{ + -61.559673614 -23.277786569 + -61.480530648 -23.179304849 + -61.400578034 -23.278587775 + -61.399493225 -23.475799141 + -61.478373592 -23.574867886 + -61.558601406 -23.476142731 +} +850328b3fffffff +{ + 86.304019257 -51.022851821 + 86.374411393 -51.856733299 + 86.362313473 -53.301644788 + 86.280268740 -53.853205740 + 86.211830839 -53.002627300 + 86.223497694 -51.615606580 +} +85b261b7fffffff +{ + -27.867133594 -61.412248641 + -27.941764564 -61.460929145 + -28.010406741 -61.419203129 + -28.004395494 -61.328848898 + -27.929813452 -61.280278790 + -27.861193758 -61.321952438 +} +8500516bfffffff +{ + 85.481896064 12.061717908 + 85.559547476 12.587723438 + 85.636871103 11.940508330 + 85.634971561 10.749375722 + 85.556028522 10.247855995 + 85.480271125 10.912010572 +} +85949ecffffffff +{ + -20.480765798 121.591719353 + -20.557848665 121.607734056 + -20.592756411 121.689559400 + -20.550584134 121.755426554 + -20.473446193 121.739406032 + -20.438535569 121.657524121 +} +85bd893bfffffff +{ + -32.904831482 36.874492660 + -32.818942278 36.876659919 + -32.777920069 36.784743913 + -32.822799665 36.690583006 + -32.908714484 36.688332620 + -32.949724181 36.780326288 +} +855dac07fffffff +{ + 18.169180768 -156.278066573 + 18.077094010 -156.308717283 + 18.006382990 -156.240401203 + 18.027734578 -156.141414012 + 18.119828835 -156.110689223 + 18.190564055 -156.179025572 +} +851fb4a3fffffff +{ + 49.562583853 2.363318236 + 49.515521791 2.264497614 + 49.429238169 2.281135321 + 49.390080787 2.396250845 + 49.437103652 2.494839913 + 49.523322958 2.478544877 +} +85cd6357fffffff +{ + -52.515358858 80.801197204 + -52.426021044 80.763230970 + -52.403839007 80.616856850 + -52.470842530 80.507942724 + -52.560242479 80.545325016 + -52.582577174 80.692206439 +} +85ea165bfffffff +{ + -62.240985959 -173.600859026 + -62.186909790 -173.686026444 + -62.205005366 -173.840904060 + -62.277242808 -173.911088640 + -62.331402489 -173.825870830 + -62.313241060 -173.670517840 +} +8562194ffffffff +{ + 8.427396058 59.595202445 + 8.362054710 59.604058817 + 8.343057683 59.676738583 + 8.389469225 59.740530890 + 8.454807298 59.731587400 + 8.473737200 59.658938717 +} +854dadb3fffffff +{ + 27.877417898 -66.208802803 + 27.844981619 -66.291943844 + 27.776736442 -66.300103854 + 27.740960813 -66.225339406 + 27.773291967 -66.142351133 + 27.841503675 -66.133974671 +} +85298b6ffffffff +{ + 40.525244934 -118.339832180 + 40.605078976 -118.281305697 + 40.679437774 -118.343162875 + 40.673911687 -118.463577619 + 40.594063581 -118.521950761 + 40.519755604 -118.460062886 +} +85032e0bfffffff { - 89.851412983 96.359003907 - 89.799258488 121.429000141 - 89.798933506 148.511147329 - 89.849268168 174.220594178 - 89.937684450 -172.280549352 - 89.941929081 85.085528952 + 87.522206741 -66.929014814 + 87.575734211 -68.610616347 + 87.537150271 -70.597887340 + 87.447206422 -70.811331358 + 87.396575671 -69.167353546 + 87.433078284 -67.270411973 +} +856db263fffffff +{ + 13.255668181 -104.857019595 + 13.333195281 -104.801229471 + 13.417484103 -104.843071761 + 13.424188586 -104.940791731 + 13.346577038 -104.996552450 + 13.262345497 -104.954622810 +} +85ec1a33fffffff +{ + -68.706446067 139.191949652 + -68.670624394 138.967577588 + -68.726749072 138.769617812 + -68.818995467 138.795727250 + -68.854980616 139.021444410 + -68.798554956 139.219702810 +} +8504ecc7fffffff +{ + 71.891100280 166.738862873 + 71.794587799 166.730000383 + 71.744350705 166.991776447 + 71.790214333 167.263598766 + 71.886670265 167.275264467 + 71.937321155 167.012306971 +} +8503aac3fffffff +{ + 81.358553474 -143.903919259 + 81.297956941 -144.373880813 + 81.205320890 -144.275796931 + 81.173080867 -143.718486615 + 81.232870481 -143.251156462 + 81.325699862 -143.338447401 +} +8544755bfffffff +{ + 27.596211609 -90.330884898 + 27.666170168 -90.264482504 + 27.754801279 -90.297552571 + 27.773498748 -90.397185433 + 27.703476827 -90.463648701 + 27.614820866 -90.430418359 +} +8505a977fffffff +{ + 74.328107986 126.672862672 + 74.250508597 126.888137171 + 74.261752319 127.242351386 + 74.350737329 127.384919701 + 74.428834150 127.170636093 + 74.417447462 126.812768341 +} +8500cdb7fffffff +{ + 88.860975996 62.837770788 + 88.876273748 67.393069741 + 88.962398533 69.390752752 + 89.037857695 66.311373464 + 89.020228577 61.029210746 + 88.929735267 59.621284679 +} +85033437fffffff +{ + 88.285613636 160.383474808 + 88.193320018 160.620559756 + 88.149951372 163.262403678 + 88.195448250 165.815720668 + 88.287998666 165.856955585 + 88.334992585 163.065434294 +} +85568657fffffff +{ + 12.059680956 -42.942342953 + 12.136448451 -42.892917359 + 12.214567568 -42.938952181 + 12.215954462 -43.034397181 + 12.139227742 -43.083828786 + 12.061073360 -43.037809516 +} +850eaac7fffffff +{ + 58.705430781 -89.605440633 + 58.636976841 -89.735719188 + 58.543567508 -89.686911337 + 58.518463807 -89.508579754 + 58.586676272 -89.378242147 + 58.680233515 -89.426292715 +} +859a1c6ffffffff +{ + -11.973772817 -172.607309276 + -11.893973899 -172.566285751 + -11.824831671 -172.614943184 + -11.835418893 -172.704526378 + -11.915109554 -172.745578357 + -11.984321196 -172.697018875 +} +85e4155bfffffff +{ + -58.044196488 105.169193902 + -57.965288446 105.061657045 + -57.974876202 104.879034641 + -58.063424995 104.803081367 + -58.142563844 104.910343820 + -58.132922892 105.093836902 +} +856036cffffffff +{ + 11.167963334 79.169732964 + 11.256673608 79.141845257 + 11.275907626 79.052818262 + 11.206492572 78.991752559 + 11.117855529 79.019635022 + 11.098560310 79.108588533 +} +85d4e513fffffff +{ + -44.941374627 -165.195369885 + -44.861193221 -165.143490349 + -44.787660012 -165.220557831 + -44.794263390 -165.349378306 + -44.874385161 -165.401381664 + -44.947963221 -165.324441281 +} +8522a4cbfffffff +{ + 46.402925145 -159.328146749 + 46.482053257 -159.287110174 + 46.552383868 -159.359264101 + 46.543543122 -159.472655131 + 46.464301075 -159.513582930 + 46.394013738 -159.441229055 +} +85f286a3fffffff +{ + -87.034693744 -156.322769686 + -87.121262424 -155.805985340 + -87.136577094 -154.029491118 + -87.064252592 -152.862066966 + -86.979115924 -153.454194146 + -86.964834482 -155.141317005 } -85193347fffffff +850066bbfffffff { - 60.854518279 -11.780816914 - 60.803377838 -11.900113059 - 60.726749291 -11.851122143 - 60.701229773 -11.683362959 - 60.752267452 -11.564192362 - 60.828927160 -11.612654543 + 80.439267254 -0.557331951 + 80.518341256 -0.426588941 + 80.579443570 -0.813754006 + 80.560677339 -1.331619880 + 80.481260603 -1.454899395 + 80.420948254 -1.067840156 +} +8550d103fffffff +{ + 29.094399805 -129.279295849 + 29.178806803 -129.238404232 + 29.252352562 -129.296583077 + 29.241419258 -129.395609165 + 29.157031465 -129.436338847 + 29.083557717 -129.378204531 +} +85020293fffffff +{ + 79.203475187 -111.456390915 + 79.189056605 -111.925667712 + 79.105810048 -112.116573446 + 79.037527933 -111.842851254 + 79.051869144 -111.380259675 + 79.134568645 -111.184767341 +} +85f0ec9bfffffff +{ + -75.110245124 50.914726844 + -75.042860155 50.674635291 + -75.059139867 50.342485121 + -75.143094785 50.247193312 + -75.210987348 50.487203499 + -75.194415483 50.822605981 +} +85500973fffffff +{ + 22.997816063 -133.552091031 + 22.915751873 -133.589351126 + 22.840655492 -133.531723662 + 22.847636813 -133.436933729 + 22.929646997 -133.399684401 + 23.004729879 -133.457214104 +} +8537416bfffffff +{ + 37.296684692 -139.495519876 + 37.224656827 -139.535021775 + 37.157683175 -139.467874340 + 37.162748109 -139.361309754 + 37.234756339 -139.321793023 + 37.301719306 -139.388855504 +} +8590cc63fffffff +{ + -3.472235181 -123.725897998 + -3.411694556 -123.689619330 + -3.345523597 -123.733797285 + -3.341830783 -123.787437130 + -3.347699246 -123.812170874 + -3.423776991 -123.844243667 + -3.482153760 -123.802112095 + -3.470376619 -123.752694141 +} +851e96b3fffffff +{ + 40.266445261 8.880104984 + 40.175551509 8.889790862 + 40.139842435 8.997595240 + 40.195018820 9.095912463 + 40.285972434 9.086424006 + 40.321689914 8.978420660 +} +857ea287fffffff +{ + -0.131520586 178.902983105 + -0.206985560 178.889018314 + -0.267115449 178.942802051 + -0.251832915 179.010639466 + -0.176313837 179.024679322 + -0.116131357 178.970806664 +} +851303d7fffffff +{ + 65.868251959 -123.262328935 + 65.780223822 -123.310842838 + 65.716459453 -123.160749969 + 65.740471459 -122.961899597 + 65.828460059 -122.912150092 + 65.892476929 -123.062483910 +} +85ad9b0ffffffff +{ + -22.431694625 18.482185493 + -22.338761725 18.491678211 + -22.282389886 18.409544744 + -22.318925282 18.317946081 + -22.411810592 18.308392293 + -22.468208160 18.390498153 +} +85d93563fffffff +{ + -57.626115471 146.999737940 + -57.596348999 146.847962746 + -57.653847899 146.733914383 + -57.741334569 146.771715815 + -57.771150474 146.924179109 + -57.713430057 147.038150951 +} +859b9ccbfffffff +{ + -15.618329348 -165.079385086 + -15.532978876 -165.040661334 + -15.460680518 -165.098394790 + -15.473649731 -165.194781891 + -15.558909252 -165.233575562 + -15.631290516 -165.175912445 +} +8564f04bfffffff +{ + 16.001153622 93.749481764 + 16.093924098 93.723036783 + 16.118009597 93.625688679 + 16.049329727 93.554837953 + 15.956574845 93.581321789 + 15.932484184 93.678617620 +} +851eb693fffffff +{ + 43.091316021 7.279137520 + 43.003090860 7.290729999 + 42.970774693 7.401664500 + 43.026681480 7.501226649 + 43.114968492 7.489837750 + 43.147286978 7.378682825 +} +85f21b7bfffffff +{ + -81.567485442 -121.353647724 + -81.620917664 -120.862467887 + -81.581373378 -120.295733730 + -81.488980721 -120.228369669 + -81.436393110 -120.716317434 + -81.475360981 -121.274914008 +} +85f0632ffffffff +{ + -78.228160898 30.060795777 + -78.140880136 29.885941210 + -78.126894516 29.443477694 + -78.200089096 29.169852583 + -78.287864393 29.340439372 + -78.301951899 29.788972737 +} +85f29adbfffffff +{ + -88.413408312 -36.521830595 + -88.344495608 -34.297467248 + -88.257252815 -35.337664493 + -88.236304180 -38.358594436 + -88.300641754 -40.597401788 + -88.390359852 -39.815711595 +} +8520406bfffffff +{ + 48.728709374 82.906304796 + 48.637308698 82.953063791 + 48.618087813 83.094848909 + 48.690175819 83.190280503 + 48.781634953 83.143927397 + 48.800947840 83.001735922 +} +85f12483fffffff +{ + -83.781761454 158.511223453 + -83.857420455 158.111251007 + -83.928764667 158.559680242 + -83.923333360 159.417157196 + -83.846647822 159.804899187 + -83.776418199 159.347745123 +} +85f35a13fffffff +{ + -74.768221483 -136.217345613 + -74.831515847 -136.017423083 + -74.813274656 -135.689607518 + -74.731819454 -135.564987621 + -74.668987466 -135.765739707 + -74.687149063 -136.090302995 +} +8543ad2ffffffff +{ + 26.071681479 57.192564053 + 26.001868957 57.252446722 + 26.007312090 57.349957067 + 26.082633937 57.387785401 + 26.152590862 57.327925795 + 26.147081407 57.230214471 +} +85f28413fffffff +{ + -86.204844472 -157.564406411 + -86.291372111 -157.193849221 + -86.308746608 -155.827026654 + -86.238649629 -154.884900707 + -86.153142395 -155.303098108 + -86.136686227 -156.617076686 +} +85274083fffffff +{ + 45.830825353 -86.704555293 + 45.770776449 -86.803102960 + 45.681986058 -86.773534010 + 45.653140727 -86.645836916 + 45.712986075 -86.547306556 + 45.801880038 -86.576455180 +} +855130cbfffffff +{ + 10.201508950 -127.090208981 + 10.276767780 -127.052993231 + 10.351920581 -127.102716582 + 10.351710372 -127.189632382 + 10.276422886 -127.226732460 + 10.201374174 -127.177032526 +} +853ca087fffffff +{ + 23.939792153 82.630327340 + 24.023737856 82.601347124 + 24.038566118 82.505733760 + 23.969499872 82.439177756 + 23.885592795 82.468163000 + 23.870713294 82.563699348 +} +85d6835bfffffff +{ + -44.244214914 41.242914033 + -44.323256357 41.238953245 + -44.374793797 41.325968186 + -44.347244601 41.417003658 + -44.268122005 41.420807751 + -44.216629718 41.333733328 +} +85ef629bfffffff +{ + -77.484514252 -75.959577071 + -77.469132699 -75.528719563 + -77.379193264 -75.375307151 + -77.305077981 -75.648642585 + -77.320316572 -76.074065480 + -77.409811850 -76.231542560 +} +85806003fffffff +{ + -3.244316788 -50.095486606 + -3.162120198 -50.045145835 + -3.077328414 -50.090443546 + -3.074742778 -50.186037165 + -3.156908564 -50.236352800 + -3.241690778 -50.191100078 +} +85c8cbabfffffff +{ + -37.320024393 96.129876912 + -37.248514599 96.077265253 + -37.247587370 95.965315227 + -37.318147257 95.905647168 + -37.389800283 95.958063265 + -37.390750248 96.070343681 +} +850a684bfffffff +{ + 73.846019370 93.725462526 + 73.811044578 94.037682181 + 73.868959409 94.295942563 + 73.962331805 94.242537455 + 73.997583849 93.927668465 + 73.939184223 93.668865937 +} +8502c65bfffffff +{ + 72.046502433 -111.886483347 + 71.961337573 -112.006064803 + 71.888100862 -111.839373157 + 71.899690119 -111.553583937 + 71.984646387 -111.432227130 + 72.058222693 -111.598422882 +} +85834ab3fffffff +{ + -9.263343368 3.270303727 + -9.176382948 3.283299101 + -9.123749500 3.220847761 + -9.158016520 3.145477327 + -9.244871611 3.132458297 + -9.297564970 3.194833280 +} +85ec0a63fffffff +{ + -71.128912984 140.965469770 + -71.096851056 140.713069075 + -71.155372843 140.497784785 + -71.246283191 140.534653678 + -71.278511244 140.788812095 + -71.219661728 141.004337113 +} +85ca482bfffffff +{ + -40.335893501 69.446603630 + -40.424647205 69.469140348 + -40.455433820 69.585134120 + -40.397433628 69.678452413 + -40.308688018 69.655733782 + -40.277934386 69.539878565 +} +85989653fffffff +{ + -19.274171430 -18.296529664 + -19.357178677 -18.336988711 + -19.428625707 -18.279584936 + -19.416964396 -18.181643827 + -19.333855241 -18.141277007 + -19.262509296 -18.198758783 +} +856eed07fffffff +{ + 11.541749108 -120.129752656 + 11.619592349 -120.085434503 + 11.698868679 -120.134497562 + 11.700204169 -120.227888655 + 11.622312631 -120.272106159 + 11.543133841 -120.223033395 +} +857ba94bfffffff +{ + -1.734928455 50.003155967 + -1.647635774 50.000160731 + -1.600869454 49.926261130 + -1.641388726 49.855262854 + -1.728761346 49.858208462 + -1.775534772 49.932202031 +} +85570257fffffff +{ + 22.211249777 -36.026893829 + 22.133044135 -36.076733575 + 22.052283743 -36.026133755 + 22.049614473 -35.925748689 + 22.127741592 -35.875787943 + 22.208616554 -35.926332962 +} +85811a13fffffff +{ + -9.530896064 -40.003696736 + -9.447825002 -39.953144437 + -9.363441230 -40.000894991 + -9.362124002 -40.099194267 + -9.445200185 -40.149766270 + -9.529588471 -40.102019440 +} +856d7113fffffff +{ + 12.228553082 -89.004650993 + 12.298542927 -88.946112334 + 12.379993643 -88.974046036 + 12.391455980 -89.060644349 + 12.321373302 -89.119236145 + 12.239921219 -89.091176564 +} +85f1b44bfffffff +{ + -74.799428063 122.947861522 + -74.745187775 122.673204648 + -74.781341779 122.345300375 + -74.872044221 122.289776376 + -74.926682181 122.565453304 + -74.890217939 122.895641655 +} +85014133fffffff +{ + 77.177899482 -0.332286760 + 77.252855974 -0.235617898 + 77.311805684 -0.516128917 + 77.295210787 -0.893329972 + 77.219996725 -0.986061396 + 77.161632684 -0.705554261 +} +8550e8a7fffffff +{ + 27.074405672 -134.836188123 + 26.994533226 -134.874134832 + 26.920444475 -134.814224065 + 26.926245150 -134.716463324 + 27.006075074 -134.678522712 + 27.080146869 -134.738336592 +} +855b0a47fffffff +{ + 9.823908450 174.142554692 + 9.903781672 174.149711213 + 9.947058877 174.076172117 + 9.910355658 173.995512788 + 9.830454597 173.988490219 + 9.787284462 174.061992956 +} +85364397fffffff +{ + 30.523206859 -138.719104496 + 30.444142204 -138.757341694 + 30.372248595 -138.693134735 + 30.379431956 -138.590773374 + 30.458466640 -138.552525785 + 30.530347969 -138.616649768 +} +851b1b13fffffff +{ + 54.013657936 -46.765683312 + 53.997901888 -46.917604457 + 53.911757693 -46.976182596 + 53.841565643 -46.883246120 + 53.857325978 -46.731978926 + 53.943274039 -46.672996172 +} +859e0233fffffff +{ + -15.791747630 166.594917521 + -15.709984930 166.561966135 + -15.691129506 166.470580092 + -15.754033425 166.411990135 + -15.835897062 166.444853662 + -15.854755856 166.536395244 +} +8507a547fffffff +{ + 76.137486402 -13.289944497 + 76.176028985 -13.584163537 + 76.127029827 -13.855149551 + 76.039799248 -13.830263710 + 76.001613984 -13.537886916 + 76.050303988 -13.268554670 +} +8500d583fffffff +{ + 83.200369752 80.119805560 + 83.188938945 80.891162392 + 83.264087066 81.366661960 + 83.351689209 81.065298747 + 83.363319373 80.275267855 + 83.287144001 79.805564704 +} +855a6e33fffffff +{ + 12.437051233 163.284706365 + 12.520125029 163.282147474 + 12.562196612 163.201483426 + 12.521107842 163.123473333 + 12.438055490 163.126176514 + 12.396070324 163.206745547 +} +850d360ffffffff +{ + 74.897892972 -166.234830523 + 74.813558787 -166.404175184 + 74.733737486 -166.217116882 + 74.737819373 -165.862561537 + 74.821696154 -165.691231853 + 74.901948418 -165.876414749 +} +8534495bfffffff +{ + 26.204885670 -16.083747695 + 26.132447340 -16.152927482 + 26.043882346 -16.118781432 + 26.027718536 -16.015631496 + 26.100044987 -15.946464125 + 26.188647012 -15.980434023 +} +855e9157fffffff +{ + 16.314854307 -46.255991670 + 16.388477046 -46.206766653 + 16.461780442 -46.251892026 + 16.461493224 -46.346214130 + 16.387918746 -46.395431079 + 16.314583242 -46.350334119 +} +85450abbfffffff +{ + 20.596247151 -87.528044355 + 20.665828103 -87.465584611 + 20.752124448 -87.493950706 + 20.768865317 -87.584921393 + 20.699207821 -87.647448756 + 20.612886077 -87.618937886 +} +85464e2ffffffff +{ + 21.834284923 -159.201005297 + 21.743366907 -159.230643118 + 21.675662807 -159.161133451 + 21.698860957 -159.061948393 + 21.789801752 -159.032226132 + 21.857521667 -159.101773251 +} +85e2ce23fffffff +{ + -51.691237628 -126.583730225 + -51.648241037 -126.451630445 + -51.553645987 -126.446313788 + -51.502115934 -126.572597187 + -51.545026718 -126.704327775 + -51.639553073 -126.710143666 +} +85f17373fffffff +{ + -85.571003014 62.258809825 + -85.516535541 61.296235586 + -85.553266157 60.241185502 + -85.645741275 60.120913611 + -85.701722183 61.098410013 + -85.663685357 62.181530368 +} +855a208ffffffff +{ + 11.086280657 173.000134498 + 11.167883249 173.006377521 + 11.211927462 172.931039888 + 11.174261908 172.849502884 + 11.092635583 172.843399238 + 11.048698408 172.918693157 +} +85ef846bfffffff +{ + -79.081867166 1.309103912 + -78.986061056 1.359834028 + -78.929740695 0.957745437 + -78.968577110 0.502422618 + -79.064273241 0.444344425 + -79.121248068 0.848916599 +} +858f6017fffffff +{ + -3.619588117 -74.893925808 + -3.696534777 -74.948372742 + -3.783501034 -74.908385949 + -3.793463418 -74.813953192 + -3.716493571 -74.759561728 + -3.629584524 -74.799547418 +} +8501414ffffffff +{ + 77.351303088 2.427341385 + 77.425513104 2.543657621 + 77.487572527 2.272512368 + 77.474824605 1.884571552 + 77.400305222 1.772083095 + 77.338840950 2.043677767 +} +85eb3227fffffff +{ + -59.654011706 -158.611648834 + -59.587916529 -158.554320619 + -59.532477347 -158.658882079 + -59.543050532 -158.820680510 + -59.609088089 -158.878287012 + -59.664610173 -158.773817805 +} +85ee1a8ffffffff +{ + -71.977098074 -26.494679750 + -71.895671736 -26.324459629 + -71.809164098 -26.466671109 + -71.803711512 -26.777453719 + -71.884727995 -26.948850768 + -71.971606622 -26.808305795 +} +85b4d50ffffffff +{ + -19.639279803 -156.378923579 + -19.549427494 -156.345000120 + -19.477047247 -156.411550667 + -19.494428704 -156.512004236 + -19.584225384 -156.546045408 + -19.656696305 -156.479515528 } -85dce237fffffff +85f284a7fffffff { - -49.654415570 -18.236064695 - -49.735968062 -18.295282805 - -49.810982060 -18.211068474 - -49.804367128 -18.067468775 - -49.722732089 -18.008449761 - -49.647794489 -18.092830450 + -85.874542594 -150.665882844 + -85.957421003 -150.178011827 + -85.963840344 -148.901576099 + -85.886922620 -148.162362943 + -85.805302131 -148.682605187 + -85.799330565 -149.910895360 } -85d30a2ffffffff +85f05ba3fffffff { - -50.175088454 -112.806358711 - -50.115701612 -112.687171600 - -50.019736645 -112.708360251 - -49.983131282 -112.848250524 - -50.042376076 -112.967292093 - -50.138367966 -112.946589399 + -73.348596953 38.209965655 + -73.269022639 38.048021738 + -73.265957663 37.737451634 + -73.342542804 37.585818895 + -73.422551427 37.746404033 + -73.425540256 38.059999959 } -85db5837fffffff +85b4ac3bfffffff { - -57.771968525 162.975611714 - -57.695830945 162.922463386 - -57.683991499 162.760409912 - -57.748270476 162.651034925 - -57.824484578 162.703857140 - -57.836343296 162.866381710 + -24.919157037 -153.144760807 + -24.826961586 -153.112019907 + -24.754858388 -153.183687942 + -24.774866860 -153.288098172 + -24.867027265 -153.320982038 + -24.939214330 -153.249312942 +} +85c99db3fffffff +{ + -35.235953271 114.570959433 + -35.176762769 114.497000304 + -35.192093950 114.393814554 + -35.266708796 114.364330332 + -35.326071555 114.438295625 + -35.310646999 114.541739396 +} +85f0c513fffffff +{ + -73.409519100 55.796808783 + -73.320749358 55.843855477 + -73.261624319 55.616310282 + -73.290920763 55.341559571 + -73.379497120 55.292144543 + -73.438971615 55.519838395 +} +85ef6a5bfffffff +{ + -74.528812951 -71.148575776 + -74.505150924 -70.802942304 + -74.412643814 -70.705123884 + -74.344105939 -70.949828848 + -74.367573067 -71.292077573 + -74.459771356 -71.392985185 +} +85a6008bfffffff +{ + -23.912331635 113.009325255 + -23.872344329 112.956816286 + -23.881966709 112.874314719 + -23.940010199 112.848994279 + -23.988500855 112.906336458 + -23.978819631 112.989005680 + -23.949751996 113.001593156 +} +851759cffffffff +{ + 58.827620271 173.411434562 + 58.740370105 173.386420881 + 58.688928972 173.524629653 + 58.724456365 173.688040716 + 58.811600865 173.713928882 + 58.863324264 173.575532991 +} +8565a987fffffff +{ + 8.620753409 101.412347238 + 8.714880070 101.388842887 + 8.741578259 101.294868399 + 8.674113492 101.224427256 + 8.579977568 101.247987732 + 8.553315616 101.341933318 +} +850d142bfffffff +{ + 72.371326158 -165.537379885 + 72.288004770 -165.685588636 + 72.208883321 -165.528637627 + 72.212715806 -165.224892378 + 72.295630773 -165.075285428 + 72.375119554 -165.230804483 +} +856bb453fffffff +{ + 9.522221659 14.528644126 + 9.435708187 14.531698321 + 9.391598638 14.612691468 + 9.433934119 14.690722744 + 9.520479755 14.687788962 + 9.564657861 14.606703433 +} +855c0917fffffff +{ + 11.092893803 -147.270492229 + 11.001354652 -147.303759113 + 10.927478338 -147.239817485 + 10.945105806 -147.142638069 + 11.036606186 -147.109330441 + 11.110517904 -147.173242823 +} +85000223fffffff +{ + 79.562205422 43.295692052 + 79.603827162 43.714293123 + 79.693056802 43.704709657 + 79.740574011 43.268931659 + 79.698291610 42.846798731 + 79.609157895 42.863971089 +} +85038d3bfffffff +{ + 80.216571686 -129.458014511 + 80.175443347 -129.939418193 + 80.083409541 -129.989048733 + 80.032713806 -129.565711204 + 80.073331385 -129.090075849 + 80.165149897 -129.032038583 +} +850694dbfffffff +{ + 76.694650936 -58.586776360 + 76.670091350 -58.965539695 + 76.582763405 -59.045162493 + 76.520214352 -58.749783024 + 76.544524893 -58.374650418 + 76.631631481 -58.291288292 +} +852a102bfffffff +{ + 40.553937221 -73.875772416 + 40.508139004 -73.978415404 + 40.422174765 -73.975071033 + 40.382004042 -73.869464141 + 40.427635948 -73.766999477 + 40.513604560 -73.769963332 +} +85dd14c7fffffff +{ + -63.033556361 -7.205623719 + -62.945567462 -7.155187940 + -62.879905898 -7.302053526 + -62.901914412 -7.499421463 + -62.989774207 -7.550970780 + -63.055755350 -7.404041964 +} +859484b3fffffff +{ + -16.768318562 121.362370255 + -16.849439701 121.378474352 + -16.884766503 121.460616938 + -16.838968013 121.526712991 + -16.757783648 121.510602667 + -16.722460973 121.428402462 +} +85a95d7bfffffff +{ + -24.749625862 -56.606675616 + -24.683281375 -56.556227331 + -24.605965909 -56.600169686 + -24.595045687 -56.694490019 + -24.661397633 -56.744884981 + -24.738662358 -56.701013034 +} +855699d3fffffff +{ + 8.654793079 -42.008065951 + 8.733873211 -41.958489308 + 8.814687068 -42.004871565 + 8.816454449 -42.100818748 + 8.737409640 -42.150405508 + 8.656562132 -42.104035105 +} +854c9c3bfffffff +{ + 20.705676316 -74.317451594 + 20.764232071 -74.259763677 + 20.843887493 -74.274492592 + 20.865056805 -74.347035874 + 20.806449844 -74.404828036 + 20.726724807 -74.389972615 +} +854c2b8ffffffff +{ + 21.686306585 -66.184189022 + 21.753763166 -66.141472546 + 21.810485605 -66.176796702 + 21.799770558 -66.254760746 + 21.732385531 -66.297408999 + 21.675644053 -66.262161459 +} +85416e2ffffffff +{ + 17.570240718 105.506136518 + 17.662735271 105.483589002 + 17.691976357 105.388982305 + 17.628684625 105.316940746 + 17.536154906 105.339555632 + 17.506952036 105.434144784 +} +854a0d07fffffff +{ + 24.755481976 133.865180917 + 24.671412374 133.881959972 + 24.643654066 133.975898506 + 24.699991409 134.053090001 + 24.784065658 134.036326702 + 24.811797993 133.942356074 +} +853a849bfffffff +{ + 27.073901162 -56.420063865 + 26.994824122 -56.445992174 + 26.927678380 -56.385913770 + 26.939503750 -56.299833872 + 27.018597173 -56.273723845 + 27.085848963 -56.333875366 +} +85d46d63fffffff +{ + -45.990508842 -176.875543678 + -45.919511741 -176.815529641 + -45.841953680 -176.877917531 + -45.835384856 -177.000098151 + -45.906313906 -177.060127805 + -45.983879796 -176.997961670 +} +85038547fffffff +{ + 80.752198757 -148.878087799 + 80.685457782 -149.286059524 + 80.594269588 -149.145527395 + 80.569504293 -148.605832726 + 80.635457805 -148.198493486 + 80.726958642 -148.330143714 +} +8504c4cffffffff +{ + 69.625230413 159.594784652 + 69.529425012 159.620267979 + 69.489559678 159.870539165 + 69.545178300 160.096741852 + 69.641037376 160.073476483 + 69.681225779 159.821787542 +} +8587a80ffffffff +{ + -7.914969432 90.289962766 + -7.829640580 90.264672280 + -7.805348271 90.174774957 + -7.866393668 90.110220391 + -7.951673765 90.135535470 + -7.975957263 90.225380625 +} +8502d1cffffffff +{ + 70.445340707 -113.459191385 + 70.359275477 -113.562721720 + 70.286722502 -113.404117144 + 70.299916698 -113.142285263 + 70.385808551 -113.037174678 + 70.458680285 -113.195467246 +} +8558c287fffffff +{ + 7.393441721 10.210124759 + 7.310375216 10.216261827 + 7.268356861 10.295300884 + 7.309347722 10.368305533 + 7.392461738 10.362276690 + 7.434537478 10.283134886 +} +85ab9917fffffff +{ + -28.437914506 65.222597816 + -28.533379482 65.239351438 + -28.568860989 65.341486833 + -28.508818010 65.426779092 + -28.413342975 65.409870626 + -28.377920873 65.307824654 +} +854eab87fffffff +{ + 25.598901269 152.446548071 + 25.690235654 152.432653482 + 25.728243476 152.339560412 + 25.674884070 152.260536416 + 25.583635832 152.274590851 + 25.545660777 152.367509661 +} +850d49b3fffffff +{ + 63.792825371 -137.268269824 + 63.742913214 -137.429149232 + 63.663301112 -137.421589127 + 63.633618157 -137.254269516 + 63.683275072 -137.093893027 + 63.762869339 -137.100332847 +} +85e47463fffffff +{ + -64.269937310 95.879578060 + -64.184004670 95.775809816 + -64.179580923 95.553485850 + -64.261049545 95.433629538 + -64.347199164 95.536610134 + -64.351663349 95.760240172 +} +85cac16ffffffff +{ + -46.716083848 63.014246814 + -46.798897183 63.031973880 + -46.834359062 63.151949149 + -46.786962119 63.254088043 + -46.704136963 63.236137945 + -46.668720433 63.116271882 +} +8503266bfffffff +{ + 89.517700173 177.670813230 + 89.427937607 175.669081478 + 89.362239135 -177.917877872 + 89.374030167 -169.590420233 + 89.455436391 -165.468875525 + 89.534373259 -171.316059084 } -85321e2bfffffff +8521b1bbfffffff +{ + 42.017494209 58.846404757 + 41.939656467 58.921930890 + 41.948797131 59.048793879 + 42.035847347 59.100473984 + 42.113836859 59.025008400 + 42.104624244 58.897801428 +} +85df68a3fffffff +{ + -53.471162995 -70.651560438 + -53.387983228 -70.606470170 + -53.321009359 -70.692952195 + -53.337074365 -70.824598377 + -53.420250771 -70.870154426 + -53.487365755 -70.783599200 +} +8552e313fffffff +{ + 14.211343768 46.149116700 + 14.127259466 46.129231964 + 14.075254476 46.190832165 + 14.107235077 46.272253487 + 14.191214905 46.292210677 + 14.243318595 46.230674258 +} +857664b3fffffff +{ + 5.841437683 164.144946404 + 5.754523519 164.154703026 + 5.720034141 164.227429414 + 5.772383700 164.290345989 + 5.859200466 164.280629818 + 5.893765040 164.207956632 +} +8561432bfffffff +{ + 4.193096338 72.491944946 + 4.277885052 72.465110552 + 4.298452604 72.384725966 + 4.234302780 72.331245961 + 4.149610541 72.358059559 + 4.128971697 72.438374022 +} +8503ad4bfffffff +{ + 82.886522958 -136.787649801 + 82.835513323 -137.408834347 + 82.741787548 -137.380338996 + 82.699070828 -136.747029177 + 82.749210737 -136.133445603 + 82.842925779 -136.145555750 +} +855116cbfffffff +{ + 12.343610233 -125.397647430 + 12.421201755 -125.358078737 + 12.498194217 -125.408510012 + 12.497492891 -125.498493684 + 12.419871636 -125.537945856 + 12.342981357 -125.487531016 +} +850c63d3fffffff +{ + 61.914830250 -144.623478564 + 61.857135586 -144.761251786 + 61.779512637 -144.730754915 + 61.759525050 -144.563427529 + 61.816943701 -144.425860065 + 61.894625235 -144.455412579 +} +852a3623fffffff +{ + 43.346370344 -71.435874051 + 43.301559275 -71.547054182 + 43.212807197 -71.548217024 + 43.168880747 -71.438627655 + 43.213529019 -71.327679839 + 43.302266184 -71.326089152 +} +850d4997fffffff +{ + 64.032352105 -137.289633902 + 63.982322444 -137.452143108 + 63.902424022 -137.444425682 + 63.872572302 -137.275342202 + 63.922344408 -137.113345621 + 64.002224930 -137.119919495 +} +850790b7fffffff +{ + 79.275728899 -31.612208773 + 79.292379191 -32.059927919 + 79.225396885 -32.328772334 + 79.142275676 -32.150807421 + 79.125823716 -31.708733277 + 79.192296602 -31.439024923 +} +85a91647fffffff +{ + -31.178467947 -45.449101296 + -31.113260800 -45.396282034 + -31.043811854 -45.444890502 + -31.039593959 -45.546289262 + -31.104817836 -45.599103123 + -31.174242875 -45.550523785 +} +85052183fffffff +{ + 80.722455559 97.228343377 + 80.683733731 97.758622525 + 80.739436785 98.232608156 + 80.834644052 98.179322305 + 80.873941518 97.641891564 + 80.817449245 97.164940624 +} +85bc6d57fffffff +{ + -35.689039923 19.966609376 + -35.607315384 19.976156682 + -35.555642816 19.887475032 + -35.585687869 19.789268550 + -35.667386697 19.779648845 + -35.719066270 19.868307925 +} +85096613fffffff +{ + 71.289120003 0.411973824 + 71.337066885 0.240233262 + 71.302873619 0.023559149 + 71.220837787 -0.019893175 + 71.173191803 0.151716193 + 71.207281414 0.366914602 +} +8516b313fffffff +{ + 48.206001022 154.513403998 + 48.295630729 154.497426095 + 48.327475511 154.371859095 + 48.269665582 154.262573242 + 48.180103505 154.278854125 + 48.148283566 154.404118374 +} +855d2d1bfffffff +{ + 23.309016958 -148.880327469 + 23.220067569 -148.914811113 + 23.148037578 -148.846800585 + 23.164946579 -148.744329227 + 23.253880943 -148.709794049 + 23.325921378 -148.777781589 +} +85498e4ffffffff +{ + 21.768142009 -101.271041844 + 21.846408609 -101.209846381 + 21.934638464 -101.251622890 + 21.944570861 -101.354710905 + 21.866228205 -101.415896131 + 21.778029263 -101.374003807 +} +85f29333fffffff { - 38.013699691 169.807171141 - 38.110759884 169.811752485 - 38.162396913 169.706970308 - 38.116886951 169.597719227 - 38.019818042 169.593399954 - 37.968267631 169.698069626 -} -85801ecffffffff -{ - -2.465019144 -39.595184254 - -2.381664659 -39.545200628 - -2.296621994 -39.592506428 - -2.294913383 -39.689794097 - -2.378258716 -39.739798839 - -2.463321810 -39.692494938 -} -851815abfffffff -{ - 53.199905171 -14.253956854 - 53.138739337 -14.354715987 - 53.054706889 -14.308605743 - 53.031817044 -14.162111610 - 53.092893409 -14.061407064 - 53.176948911 -14.107141404 -} -85da1a63fffffff -{ - -48.949623854 166.011588813 - -48.866200067 165.962619073 - -48.854880619 165.824790243 - -48.926994413 165.735579958 - -49.010502031 165.784343424 - -49.021812087 165.922524261 -} -85a1308bfffffff -{ - -28.052331890 -130.589671505 - -27.963649929 -130.579148182 - -27.909008027 -130.654161521 - -27.943010033 -130.739832922 - -28.031768430 -130.750521137 - -28.086448437 -130.675372981 -} -851aa41bfffffff -{ - 49.055033787 -53.370489029 - 49.029840820 -53.505531864 - 48.942045861 -53.544873147 - 48.879594813 -53.449583211 - 48.904736106 -53.315034061 - 48.992379952 -53.275282358 -} -85a4c4affffffff -{ - -26.849533250 -27.518060686 - -26.931454424 -27.568573119 - -27.009520755 -27.517190863 - -27.005602464 -27.415148915 - -26.923559432 -27.364679743 - -26.845556621 -27.416208937 -} -8502c00ffffffff -{ - 71.464086580 -107.028040896 - 71.381456946 -107.166308115 - 71.303393236 -107.020315143 - 71.307636676 -106.736882340 - 71.390014913 -106.597198316 - 71.468401439 -106.742351607 -} -85962987fffffff -{ - -15.546470698 25.217449133 - -15.449592330 25.224181910 - -15.395304855 25.140625766 - -15.437862568 25.050328333 - -15.534718539 25.043528466 - -15.589039270 25.127093073 -} -85246edbfffffff -{ - 47.346056386 112.083281764 - 47.260105776 112.074313616 - 47.215084333 112.167798969 - 47.255858857 112.270269028 - 47.341690918 112.279566883 - 47.386867097 112.186065494 -} -858f10bbfffffff -{ - -1.745559700 -85.725688136 - -1.822141597 -85.783627524 - -1.909837513 -85.745835489 - -1.920926017 -85.650064097 - -1.844299848 -85.592129764 - -1.756629481 -85.629961631 -} -853188b3fffffff -{ - 38.835323898 117.717624765 - 38.757632322 117.702461181 - 38.717888158 117.771015437 - 38.755694279 117.854698913 - 38.833266811 117.870054517 - 38.873152278 117.801534986 -} -85350c17fffffff -{ - 41.309988791 -22.070552055 - 41.234398885 -22.148984456 - 41.145400064 -22.100204406 - 41.131938463 -21.973207853 - 41.207437367 -21.894726165 - 41.296488788 -21.943289757 -} -85c0811bfffffff -{ - -40.074461251 -17.822049717 - -40.161925558 -17.873217458 - -40.240263975 -17.799351997 - -40.231059232 -17.674195963 - -40.143508123 -17.623182995 - -40.065248528 -17.697170693 -} -854f96c7fffffff -{ - 22.492746111 164.200023777 - 22.585566265 164.198098433 - 22.631721817 164.108241809 - 22.584971009 164.020424017 - 22.492173544 164.022530502 - 22.446104049 164.112273692 -} -85948447fffffff -{ - -17.399425766 121.113462374 - -17.479799991 121.129539487 - -17.515144865 121.211393196 - -17.470112214 121.277227616 - -17.389675398 121.261143927 - -17.354333798 121.179232340 -} -8507983bfffffff -{ - 76.934160572 -39.161516065 - 76.938918237 -39.545888165 - 76.863528504 -39.734176584 - 76.783793913 -39.539789921 - 76.779101564 -39.159654205 - 76.854078960 -38.969700355 -} -85d38ac7fffffff -{ - -49.221044015 -100.072338316 - -49.149735427 -99.972219592 - -49.057488489 -100.015806079 - -49.036442919 -100.159144318 - -49.107605754 -100.259344411 - -49.199959750 -100.216125967 -} -851776b3fffffff -{ - 63.188648283 163.468022081 - 63.096133344 163.473620768 - 63.053369423 163.656912002 - 63.102837490 163.835277008 - 63.195347714 163.830964603 - 63.238395574 163.647000694 -} -85e18abbfffffff -{ - -57.143938095 70.644409238 - -57.052041449 70.629563170 - -57.015883888 70.479636788 - -57.071408464 70.344133215 - -57.163278055 70.358198654 - -57.199650658 70.508548494 -} -85eea117fffffff -{ - -73.475072044 -16.001000867 - -73.385762444 -15.869898567 - -73.308350930 -16.074028377 - -73.319776736 -16.408420372 - -73.408753132 -16.541912754 - -73.486637907 -16.338643961 -} -85f39543fffffff -{ - -81.391392970 158.849751889 - -81.464936606 158.569266683 - -81.533471869 158.889988897 - -81.527660737 159.495635716 - -81.453382754 159.769909149 - -81.385649219 159.444872243 -} -85075647fffffff -{ - 68.360269842 -19.913894230 - 68.386291837 -20.120215370 - 68.326117895 -20.284619520 - 68.240174814 -20.242306594 - 68.214393920 -20.037052675 - 68.274315868 -19.873046993 -} -85e421b3fffffff -{ - -63.775303699 105.839392495 - -63.697224684 105.708978386 - -63.707932745 105.490771213 - -63.796785695 105.401742367 - -63.875127898 105.531790673 - -63.864353658 105.751238628 -} -85f16597fffffff -{ - -87.466425179 -31.612645616 - -87.392311875 -30.327129830 - -87.306834184 -31.128968215 - -87.293442926 -33.128180736 - -87.364695323 -34.441802309 - -87.452160624 -33.732804997 -} -855ab6c7fffffff -{ - 18.762145292 -178.451048619 - 18.849976230 -178.436266514 - 18.901811769 -178.510822018 - 18.865696768 -178.600164123 - 18.777795572 -178.614803362 - 18.726079540 -178.540243541 -} -85419bb3fffffff -{ - 30.626837710 115.194828296 - 30.708412955 115.175943601 - 30.743395620 115.085472231 - 30.696771423 115.013872418 - 30.615137173 115.032841250 - 30.580186092 115.123325774 -} -85144c0ffffffff -{ - 59.721212412 143.685154440 - 59.636260090 143.750820198 - 59.621166237 143.934206016 - 59.690930003 144.052882597 - 59.776078044 143.987981287 - 59.791266978 143.803635651 -} -85d68a73fffffff -{ - -43.493385778 38.926309920 - -43.421288692 38.927641737 - -43.390454439 38.830487328 - -43.431722792 38.731902130 - -43.503837104 38.730477865 - -43.534665926 38.827731288 -} -85a9835bfffffff -{ - -27.024177579 -41.838726845 - -26.952826588 -41.786538212 - -26.879948570 -41.835403724 - -26.878441745 -41.936445648 - -26.949814272 -41.988646301 - -27.022672082 -41.939793170 -} -856d444bfffffff -{ - 11.525005402 -88.815707295 - 11.456491819 -88.871607694 - 11.379778227 -88.836379174 - 11.371609588 -88.745203769 - 11.440184787 -88.689294240 - 11.516866962 -88.724569134 -} -85db8cd7fffffff -{ - -50.221604740 176.888764663 - -50.146932733 176.828302021 - -50.149029632 176.695498154 - -50.225859371 176.622807902 - -50.300628457 176.683188898 - -50.298470686 176.816342547 -} -8533695bfffffff -{ - 25.821714327 161.192745055 - 25.916071490 161.187581275 - 25.960728714 161.093635877 - 25.910957277 161.004994009 - 25.816641455 161.010347843 - 25.772055588 161.104153604 -} -85dba8d3fffffff -{ - -51.681772747 178.393435597 - -51.609632342 178.330278592 - -51.614148798 178.195798828 - -51.690870137 178.124116806 - -51.763105848 178.187207610 - -51.758524861 178.322047411 -} -85041153fffffff -{ - 72.330284259 142.408956452 - 72.240004528 142.528029785 - 72.225815237 142.843634738 - 72.301776264 143.043022342 - 72.392375028 142.926127863 - 72.406694655 142.607649660 -} -85383133fffffff -{ - 34.485395164 -2.248551686 - 34.424655643 -2.328461379 - 34.334585945 -2.309024486 - 34.305301688 -2.209909276 - 34.365965625 -2.130124651 - 34.455989287 -2.149330145 -} -85b61d97fffffff -{ - -26.742389916 -94.052201405 - -26.808512301 -94.115127271 - -26.891983809 -94.077782428 - -26.909366798 -93.977434422 - -26.843245731 -93.914468595 - -26.759740381 -93.951890603 -} -85875e5bfffffff -{ - -11.458533437 82.631596502 - -11.546883808 82.657605045 - -11.572322399 82.748777680 - -11.509405935 82.813821183 - -11.421136456 82.787738992 - -11.395702520 82.696686773 -} -853610abfffffff -{ - 33.035481676 -150.593736400 - 32.953881208 -150.629170370 - 32.888629838 -150.557323649 - 32.904977577 -150.450056782 - 32.986575834 -150.414559164 - 33.051828617 -150.486391867 -} -856f9957fffffff -{ - 4.059250443 -109.064508407 - 4.130853261 -109.014665660 - 4.207386542 -109.056293804 - 4.212241380 -109.147823906 - 4.140556192 -109.197620764 - 4.064098550 -109.155933584 -} -857a2353fffffff -{ - -1.822242384 45.851273391 - -1.732709825 45.849746866 - -1.684625492 45.772962226 - -1.726057823 45.697617252 - -1.815657215 45.699088085 - -1.863757482 45.775959631 -} -85e0f1b3fffffff -{ - -53.810411223 57.665738139 - -53.724475545 57.683607435 - -53.678685474 57.572441819 - -53.718614089 57.443332108 - -53.804426972 57.424915709 - -53.850434314 57.536155186 -} -85831d73fffffff -{ - -9.596023480 11.813644283 - -9.503656710 11.824688806 - -9.449410500 11.752569857 - -9.487470811 11.669458939 - -9.579754967 11.658372258 - -9.634061439 11.730438568 -} -856d9263fffffff -{ - 10.518433635 -106.100714633 - 10.594749632 -106.046685787 - 10.677077953 -106.088526296 - 10.683025922 -106.184474399 - 10.606624875 -106.238468295 - 10.524360943 -106.196549235 -} -85eece77fffffff -{ - -64.723066772 -32.381740672 - -64.649426027 -32.241822491 - -64.561558438 -32.323500221 - -64.547098095 -32.544026518 - -64.620405494 -32.684265318 - -64.708506096 -32.603663031 -} -854915cffffffff -{ - 15.893870414 -106.281158638 - 15.972969246 -106.224976685 - 16.058522906 -106.268686080 - 16.064918897 -106.368662025 - 15.985741585 -106.424804989 - 15.900246794 -106.381011220 -} -854da317fffffff -{ - 29.377733939 -68.647281092 - 29.342752928 -68.731936977 - 29.271858197 -68.736868574 - 29.235967260 -68.657379998 - 29.270830283 -68.572872270 - 29.341702011 -68.567705053 -} -85e59d33fffffff -{ - -54.729231291 110.669682342 - -54.655781729 110.560976086 - -54.672663676 110.396907807 - -54.763093999 110.340868408 - -54.836771949 110.449486996 - -54.819790867 110.614234581 -} -85bf6b33fffffff -{ - -43.825224933 147.125189864 - -43.731842123 147.102822437 - -43.697627518 146.979248185 - -43.756718600 146.877842965 - -43.850104804 146.899912453 - -43.884396713 147.023685344 -} -8510d63bfffffff -{ - 54.393738129 57.022044262 - 54.320263316 57.120250105 - 54.334712740 57.279721146 - 54.422719598 57.341522783 - 54.496350516 57.243376484 - 54.481818262 57.083367600 -} -85164033fffffff -{ - 54.801331482 177.754276057 - 54.885921352 177.772520796 - 54.939983155 177.646479588 - 54.909358032 177.502246955 - 54.824724182 177.484404403 - 54.770759206 177.610391714 -} -85e1531bfffffff -{ - -62.687276751 56.089829862 - -62.597884300 56.118206187 - -62.544103927 55.975734996 - -62.579466116 55.804814131 - -62.668702238 55.775515169 - -62.722732939 55.918057320 -} -85d59e7bfffffff -{ - -48.316429402 -148.055281461 - -48.232924814 -148.019353577 - -48.174931323 -148.114157531 - -48.200385838 -148.244951671 - -48.283883775 -148.281141643 - -48.341933982 -148.186275747 -} -85a41087fffffff -{ - -20.765910518 -30.595930478 - -20.687150339 -30.547562171 - -20.613073822 -30.595384542 - -20.617756830 -30.691612000 - -20.696558984 -30.740040344 - -20.770636135 -30.692181315 -} -85dd6e2bfffffff -{ - -59.480822565 -33.031329913 - -59.410839262 -32.914470086 - -59.326216073 -32.979865898 - -59.311380564 -33.161379824 - -59.381075777 -33.278435859 - -59.465894223 -33.213784966 -} -85519b8bfffffff -{ - 20.134530606 -122.329770595 - 20.217457033 -122.284533185 - 20.297886975 -122.337599494 - 20.295300360 -122.435901770 - 20.212349659 -122.481016172 - 20.132009788 -122.427951503 -} -85ef23b7fffffff -{ - -83.658290386 -67.289668694 - -83.630571284 -66.472788220 - -83.537536731 -66.300296889 - -83.472738304 -66.925332052 - -83.499809767 -67.724344334 - -83.592315689 -67.915956902 -} -85175b2ffffffff -{ - 57.634051108 173.522289693 - 57.548002512 173.497954943 - 57.497358427 173.630469333 - 57.532490124 173.787489270 - 57.618435723 173.812629266 - 57.669353202 173.679945413 -} -85146577fffffff -{ - 62.252062681 136.287702956 - 62.169792340 136.382519086 - 62.165124050 136.585473968 - 62.242709716 136.694818315 - 62.325246745 136.600683166 - 62.329931506 136.396517816 -} -85dd8e5bfffffff -{ - -56.303956362 -4.645374652 - -56.221894163 -4.612638839 - -56.162741993 -4.724091197 - -56.185020128 -4.881598206 - -56.212194310 -4.897059973 - -56.266855928 -4.919382698 - -56.326525684 -4.799051898 -} -85cec5a3fffffff -{ - -38.056214617 -80.585132539 - -37.980864242 -80.534203244 - -37.902719721 -80.591543086 - -37.899767902 -80.699757563 - -37.975043134 -80.750911555 - -38.053345467 -80.693626891 -} -853559d7fffffff -{ - 34.508752728 -17.304582834 - 34.435019943 -17.380022322 - 34.343928898 -17.340906830 - 34.326536295 -17.226559752 - 34.400167999 -17.151123923 - 34.491293277 -17.190031155 -} -8556a41bfffffff -{ - 15.292725996 -40.731799232 - 15.366240894 -40.682873735 - 15.441900219 -40.728926960 - 15.444086229 -40.823899383 - 15.370610320 -40.872840199 - 15.294909413 -40.826793406 -} -85c3a8c7fffffff -{ - -43.473377770 -56.761072293 - -43.437451268 -56.661870419 - -43.368463703 -56.657615244 - -43.335425406 -56.752194330 - -43.371202527 -56.851179326 - -43.440166997 -56.855801987 -} -85d16d37fffffff -{ - -36.902977846 22.121032235 - -36.822202909 22.129771791 - -36.772584454 22.039099554 - -36.803734541 21.939697141 - -36.884490570 21.930880331 - -36.934115511 22.021543101 -} -85f2938bfffffff + -89.557956423 -33.232046209 + -89.483917192 -26.557239059 + -89.401312082 -30.652836650 + -89.383447279 -39.390504414 + -89.443142180 -46.322026462 + -89.533693981 -44.738757958 +} +85f29383fffffff { - -89.790452443 76.048158603 - -89.742297046 56.541211113 - -89.759257469 35.809761403 - -89.833847437 19.354357128 - -89.921669732 33.715499682 + -89.867510404 126.833332400 -89.881742454 84.142735302 + -89.921669732 33.715499682 + -89.949985838 -57.757362933 + -89.915696433 -140.297307936 + -89.880377542 170.215354173 } -85638967fffffff -{ - 9.724885689 55.463886324 - 9.798385033 55.459386040 - 9.843665263 55.393938513 - 9.815471355 55.332903922 - 9.741908578 55.337368154 - 9.696603115 55.402903081 -} -85ce024ffffffff -{ - -44.226850347 -76.732071167 - -44.147144890 -76.682855727 - -44.071741612 -76.750087086 - -44.075887598 -76.866514195 - -44.155546295 -76.916029732 - -44.231105937 -76.848818664 -} -85285053fffffff -{ - 43.572043570 -129.438494127 - 43.651917275 -129.391608229 - 43.714565225 -129.458628126 - 43.697296490 -129.572473847 - 43.617446282 -129.619144552 - 43.554841262 -129.552184963 -} -85358833fffffff -{ - 36.398541586 -31.626951088 - 36.316350597 -31.691043017 - 36.230598803 -31.635174082 - 36.226946425 -31.515328901 - 36.309061664 -31.451103748 - 36.394905033 -31.506856481 -} -8569a933fffffff -{ - 8.706313427 113.014009213 - 8.797510803 112.995441171 - 8.825932157 112.909353114 - 8.763080041 112.841827658 - 8.671824772 112.860467291 - 8.643479480 112.946560815 -} -855c018ffffffff -{ - 13.199296927 -149.800270468 - 13.107209726 -149.832989220 - 13.033569718 -149.767494778 - 13.051984166 -149.669297499 - 13.144045562 -149.636528170 - 13.217718358 -149.702006547 -} -85ecadd7fffffff -{ - -67.166989153 141.557246722 - -67.133714180 141.345741641 - -67.191809215 141.167643150 - -67.283463887 141.200910618 - -67.316866999 141.413661311 - -67.258486568 141.591894790 -} -85ef8137fffffff -{ - -78.224604490 -9.444378854 - -78.131660341 -9.312175202 - -78.061762648 -9.633643287 - -78.084153465 -10.087140938 - -78.176760554 -10.224858461 - -78.247317039 -9.903609513 -} -852510c3fffffff -{ - 48.921175847 91.167366015 - 48.828660703 91.198134279 - 48.799991468 91.331605336 - 48.863704749 91.434623619 - 48.956222452 91.404305008 - 48.985024583 91.270518024 -} -850009b7fffffff -{ - 82.624000412 21.774057877 - 82.691482282 22.191368718 - 82.774607951 21.911854151 - 82.789474006 21.204248209 - 82.721041026 20.791091847 - 82.638696461 21.081184690 -} -85f2aa37fffffff -{ - -84.729207496 -126.605482090 - -84.790401727 -125.875488618 - -84.758830991 -124.932717167 - -84.666830634 -124.744486804 - -84.606995653 -125.471220708 - -84.637818239 -126.389795574 -} -85f282bbfffffff -{ - -87.723447640 -139.640020545 - -87.799079769 -138.329911625 - -87.786696085 -135.986970234 - -87.699303119 -135.118694940 - -87.626638781 -136.476537529 - -87.638434339 -138.662016924 -} -8564209bfffffff -{ - 6.695856910 97.967000700 - 6.789839823 97.942479045 - 6.815619611 97.848110402 - 6.747392392 97.778301915 - 6.653417995 97.802871253 - 6.627662244 97.897201500 -} -858a10b3fffffff -{ - -7.640498301 -60.398738417 - -7.563504182 -60.351035596 - -7.480892460 -60.391771004 - -7.475320151 -60.480133435 - -7.552278856 -60.527773930 - -7.634845284 -60.487114391 -} -85bf954bfffffff -{ - -30.019682877 165.509940082 - -29.929636091 165.472221114 - -29.912021987 165.364693075 - -29.984461608 165.294671249 - -30.074608140 165.332261920 - -30.092215331 165.440003097 -} -85079a93fffffff -{ - 77.874643360 -40.411460424 - 77.877962840 -40.825387775 - 77.802274146 -41.020438150 - 77.723698653 -40.803715744 - 77.720420616 -40.394693446 - 77.795676960 -40.197527992 -} -85428917fffffff -{ - 20.424396260 67.148470877 - 20.355158035 67.195518930 - 20.353449459 67.288883989 - 20.420987529 67.335391201 - 20.490346217 67.288429054 - 20.492046354 67.194873471 -} -854b2903fffffff -{ - 31.427600432 127.910950188 - 31.353493249 127.928312551 - 31.333734596 128.021272207 - 31.388117468 128.096920958 - 31.462236901 128.079563323 - 31.481961283 127.986552130 -} -851471cffffffff -{ - 58.957420144 134.951495698 - 58.878396846 135.039381750 - 58.875536370 135.219966396 - 58.951698791 135.313620664 - 59.030973163 135.226234676 - 59.033834051 135.044690912 -} -85d88babfffffff -{ - -41.741887768 135.348959116 - -41.648904354 135.342929568 - -41.604224443 135.235752630 - -41.652422238 135.134529948 - -41.745344635 135.140283842 - -41.790130394 135.247535933 -} -853ba36bfffffff -{ - 34.047359899 -57.445345803 - 33.964543582 -57.472174814 - 33.899174132 -57.406546486 - 33.916529808 -57.313996208 - 33.999382209 -57.286951556 - 34.064842953 -57.352672753 -} -850373bbfffffff -{ - 82.831500221 -65.207816981 - 82.884170862 -65.753525002 - 82.851575475 -66.435226174 - 82.766955723 -66.559517965 - 82.715323716 -66.016626154 - 82.747282108 -65.346519989 -} -85d0106ffffffff -{ - -48.035514514 9.277548811 - -48.125029193 9.258653027 - -48.176377358 9.362070849 - -48.138152639 9.484187799 - -48.048679785 9.502738355 - -47.997389652 9.399517197 -} -85194c47fffffff -{ - 51.997860864 1.758796489 - 51.952216730 1.655618694 - 51.867253723 1.673996443 - 51.827991871 1.795176518 - 51.873594043 1.898107318 - 51.958499870 1.880104908 -} -85ce6b7bfffffff -{ - -39.790868135 -90.635250473 - -39.716622354 -90.565053633 - -39.630232627 -90.614111977 - -39.617944420 -90.733197239 - -39.692070336 -90.803557045 - -39.778604342 -90.754669337 -} -85f1a323fffffff -{ - -78.023235851 111.558988105 - -77.958024335 111.265284446 - -77.976857108 110.829263451 - -78.061115796 110.682176360 - -78.126861252 110.975367470 - -78.107812036 111.416194223 -} -859756cffffffff -{ - -18.368694675 28.562746948 - -18.272142633 28.568221543 - -18.219297011 28.482565785 - -18.262982335 28.391408772 - -18.359529436 28.385862544 - -18.412396237 28.471544931 -} -8507851bfffffff -{ - 76.590248027 -23.053054807 - 76.617265541 -23.392185157 - 76.557250496 -23.643045450 - 76.470614376 -23.554194581 - 76.443883034 -23.218083536 - 76.503503616 -22.967818584 -} -85b9988bfffffff -{ - -26.904986690 138.067061548 - -26.812779598 138.059031015 - -26.775764599 137.966777180 - -26.830838221 137.882482831 - -26.923003801 137.890317531 - -26.960137402 137.982642378 -} -85289b4bfffffff -{ - 48.073618808 -113.781734800 - 48.145173798 -113.713293730 - 48.214990556 -113.777695164 - 48.213207164 -113.910619323 - 48.141620030 -113.978917310 - 48.071848425 -113.914434760 -} -85135c33fffffff -{ - 61.764081228 -108.162354193 - 61.681453462 -108.252636639 - 61.601111681 -108.151039590 - 61.603148502 -107.959500973 - 61.685610275 -107.868536393 - 61.766201456 -107.969788812 -} -855a4597fffffff -{ - 12.804946555 164.149955358 - 12.888568329 164.148178457 - 12.931133565 164.067384580 - 12.889987913 163.988459525 - 12.806383798 163.990382812 - 12.763907534 164.071084807 -} -850a7427fffffff -{ - 69.548400990 88.446345109 - 69.520650935 88.697090595 - 69.581690944 88.881902444 - 69.670871511 88.815919970 - 69.698773874 88.563342368 - 69.637342426 88.378587463 -} -85126a9bfffffff -{ - 56.072251306 -103.159002308 - 55.994602410 -103.247962247 - 55.910232569 -103.172190076 - 55.903295962 -103.007823331 - 55.980763965 -102.918476707 - 56.065349526 -102.993881115 -} -853eeacbfffffff -{ - 21.823961032 28.466629840 - 21.728331582 28.458141898 - 21.674506016 28.543190052 - 21.716219688 28.636757497 - 21.811811745 28.645393392 - 21.865727635 28.560313992 -} -85f1942bfffffff -{ - -73.917758026 112.078116078 - -73.850198567 111.851604278 - -73.870272912 111.519031256 - -73.958082859 111.410212552 - -74.026048248 111.636492810 - -74.005796492 111.971838944 -} -8501727bfffffff -{ - 75.494324175 18.001904849 - 75.557634889 18.186511106 - 75.632055145 18.029076684 - 75.642722518 17.684862977 - 75.578957181 17.501666103 - 75.504979343 17.661249098 -} -85e17503fffffff -{ - -67.444383282 55.241056182 - -67.354825456 55.278226720 - -67.297555775 55.109838935 - -67.329565569 54.904218803 - -67.418947490 54.865741373 - -67.476496141 55.034186616 -} -85ee3163fffffff -{ - -76.535280689 -30.664107011 - -76.457366503 -30.413755098 - -76.367846038 -30.576785030 - -76.355814823 -30.986698462 - -76.433164833 -31.238435380 - -76.523108922 -31.078912608 -} -85e534c7fffffff -{ - -61.455718719 127.926898607 - -61.401966925 127.765494720 - -61.442992730 127.589984320 - -61.537999848 127.575316191 - -61.591961214 127.737212128 - -61.550705177 127.913284400 -} -853d1a4ffffffff -{ - 29.302440069 80.576047724 - 29.220654975 80.613080295 - 29.209041257 80.717018025 - 29.279142986 80.784146216 - 29.361005684 80.747315641 - 29.372689188 80.643154502 -} -853e226ffffffff -{ - 29.717910563 21.834911508 - 29.620564793 21.831848462 - 29.569588856 21.927268979 - 29.615894739 22.025838452 - 29.713241183 22.029080930 - 29.764281202 21.933574524 -} -85c76b37fffffff -{ - -35.536205703 -147.619875146 - -35.444067947 -147.589358355 - -35.377758709 -147.671274261 - -35.403524358 -147.783757068 - -35.495663220 -147.814470077 - -35.562035434 -147.732504285 +8594104ffffffff +{ + -13.902898462 122.471521969 + -13.987197727 122.487738251 + -14.022393597 122.571135425 + -13.973282206 122.638372597 + -13.888917737 122.622151695 + -13.853729838 122.538698185 +} +8577a3c3fffffff +{ + 1.565211765 150.312903808 + 1.471428609 150.326360127 + 1.437416880 150.412679474 + 1.497133007 150.485518985 + 1.590865797 150.472099690 + 1.624932868 150.385803827 +} +85595b2ffffffff +{ + 16.898614654 11.647702806 + 16.806608969 11.653262975 + 16.762277229 11.739575512 + 16.809900692 11.820444634 + 16.901959049 11.815016255 + 16.946341367 11.728586864 +} +85dc2e57fffffff +{ + -56.471408435 -19.057212917 + -56.394052351 -18.985197829 + -56.321110462 -19.078297481 + -56.325268522 -19.243130231 + -56.402420983 -19.315655265 + -56.475619189 -19.222840173 +} +8588a02bfffffff +{ + -4.989071239 -148.610583780 + -5.072299629 -148.641334613 + -5.138115062 -148.580947246 + -5.120765749 -148.489828331 + -5.037585199 -148.459037553 + -4.971706080 -148.519405512 +} +8594b463fffffff +{ + -16.821323783 118.640702433 + -16.901329067 118.656655346 + -16.937163161 118.736396086 + -16.892983881 118.800245086 + -16.812909334 118.784282142 + -16.777083317 118.704480182 +} +852604abfffffff +{ + 44.489806390 -96.886591228 + 44.423976976 -96.965060086 + 44.341090713 -96.918242869 + 44.323874421 -96.793244722 + 44.389521210 -96.714639038 + 44.472566846 -96.761167325 +} +857d106ffffffff +{ + -7.381911548 -18.540833596 + -7.303207620 -18.500585391 + -7.227307393 -18.542990207 + -7.230064536 -18.625712504 + -7.308817382 -18.666046664 + -7.384764165 -18.623572611 +} +8513a427fffffff +{ + 64.432798309 -133.913099654 + 64.346203421 -133.921648814 + 64.294786680 -133.766235122 + 64.329783931 -133.601696638 + 64.416446929 -133.592052342 + 64.468045212 -133.748041875 +} +85dd351bfffffff +{ + -65.498088280 -10.418435783 + -65.409368676 -10.350548720 + -65.339288162 -10.504354126 + -65.357579884 -10.725957388 + -65.446122364 -10.795120308 + -65.516551017 -10.641409452 +} +8505520bfffffff +{ + 79.023668681 143.533812689 + 78.932993953 143.713855803 + 78.916875373 144.212901733 + 78.991199083 144.539001975 + 79.082341175 144.364705648 + 79.098694830 143.858495158 +} +85316667fffffff +{ + 44.399451414 128.861287989 + 44.339309722 128.927831484 + 44.342244101 129.043380281 + 44.405360365 129.092773687 + 44.465687628 129.026359803 + 44.462712940 128.910422026 +} +85ad6503fffffff +{ + -35.025110409 4.504468286 + -35.118417580 4.482500164 + -35.181156633 4.568055237 + -35.150502736 4.675477204 + -35.057214895 4.697203290 + -34.994561478 4.611749565 +} +856400c3fffffff +{ + 9.838196007 96.698211804 + 9.932454735 96.673068790 + 9.958115852 96.577616224 + 9.889503497 96.507349432 + 9.795255192 96.532537826 + 9.769608763 96.627947742 +} +85082a8ffffffff +{ + 65.943358046 12.013243305 + 65.997680232 12.098510288 + 66.056686816 11.993571999 + 66.061094716 11.802898537 + 66.006544928 11.718262267 + 65.947814643 11.823664562 +} +85e94d93fffffff +{ + -56.547733049 -102.554486710 + -56.479848440 -102.433132671 + -56.389440860 -102.479086367 + -56.366820755 -102.645857410 + -56.434546759 -102.767263626 + -56.525051207 -102.721848185 +} +85152d17fffffff +{ + 61.586428198 112.585098595 + 61.527222813 112.734883958 + 61.555553537 112.915509433 + 61.643314967 112.947159920 + 61.702813865 112.797117338 + 61.674257016 112.615679659 +} +85966347fffffff +{ + -14.471722513 20.709176689 + -14.375631294 20.717565418 + -14.320269445 20.636702709 + -14.360956755 20.547465998 + -14.457003486 20.539016611 + -14.512407458 20.619864524 +} +85e51213fffffff +{ + -58.920981967 119.146532042 + -58.856163188 119.009032281 + -58.885264653 118.833200908 + -58.979357230 118.794166993 + -59.044412170 118.931830432 + -59.015137799 119.108365738 +} +85f226abfffffff +{ + -77.405278669 -154.521243928 + -77.482425378 -154.394766155 + -77.492005933 -154.001607842 + -77.424173791 -153.739533010 + -77.347355286 -153.869791893 + -77.338038722 -154.258378429 +} +85038c93fffffff +{ + 80.902352390 -138.434034200 + 80.848806469 -138.911413982 + 80.755679215 -138.873756817 + 80.716065090 -138.368735551 + 80.768905221 -137.895511593 + 80.862058333 -137.923135802 +} +85e48327fffffff +{ + -51.874450333 99.453324941 + -51.792932905 99.373387559 + -51.794644444 99.217767551 + -51.877871252 99.141446678 + -51.959578295 99.221069415 + -51.957868913 99.377329561 +} +853d1b03fffffff +{ + 30.164958079 81.878067536 + 30.082213300 81.913771840 + 30.069331865 82.018321531 + 30.139117547 82.087389825 + 30.221932861 82.051898808 + 30.234892109 81.947125841 +} +855d6c9bfffffff +{ + 21.272693462 -141.771761612 + 21.185166488 -141.807891427 + 21.110501205 -141.744233041 + 21.123357667 -141.644506262 + 21.210844288 -141.608354419 + 21.285514829 -141.671951214 +} +851053d3fffffff +{ + 62.288950528 57.136727584 + 62.220672132 57.256098570 + 62.236319009 57.450389812 + 62.320324638 57.526107288 + 62.388778564 57.406829305 + 62.373051041 57.211738290 +} +8503accffffffff +{ + 83.182689091 -145.587287120 + 83.120319139 -146.167913229 + 83.027704560 -146.020091699 + 82.997130580 -145.308462182 + 83.058468069 -144.731040934 + 83.151401048 -144.861905876 +} +8582ee83fffffff +{ + -0.314293175 5.826558194 + -0.229331466 5.838569394 + -0.182964669 5.775557708 + -0.221480962 5.700600212 + -0.306349592 5.688562016 + -0.352794993 5.751508240 +} +85ec9553fffffff +{ + -61.208266263 136.856318975 + -61.166173727 136.688447870 + -61.217099843 136.533786127 + -61.310367830 136.546745156 + -61.352604344 136.715333190 + -61.301428311 136.870243827 +} +85bf0a27fffffff +{ + -38.911343448 157.287008794 + -38.818175813 157.253690483 + -38.794204257 157.133199823 + -38.863366036 157.045787736 + -38.956591584 157.078886751 + -38.980597557 157.199617590 } -85032213fffffff +85509627fffffff { - 89.372703570 -124.181533300 - 89.336778042 -131.646338196 - 89.242858638 -132.088984912 - 89.187290179 -126.718488518 - 89.216837672 -120.510250043 - 89.307362476 -118.537228884 + 24.985066283 -119.786203527 + 25.069319119 -119.736613746 + 25.150982566 -119.791024159 + 25.148314779 -119.895038726 + 25.064037730 -119.944505652 + 24.982452641 -119.890081111 } -85030c2bfffffff -{ - 85.186133795 -83.892974680 - 85.215580478 -84.895485487 - 85.155937216 -85.736866961 - 85.068334553 -85.569087097 - 85.039969120 -84.592387065 - 85.098146899 -83.757999642 -} -85b27227fffffff -{ - -29.127060576 -66.517592695 - -29.201263875 -66.570952192 - -29.272228594 -66.527901499 - -29.268971480 -66.431527320 - -29.194806131 -66.378267019 - -29.123859972 -66.421281581 -} -85819ecffffffff -{ - -6.646940195 -32.540227610 - -6.563798500 -32.492033501 - -6.480615336 -32.539228364 - -6.480545665 -32.634645137 - -6.563704595 -32.682889819 - -6.646915961 -32.635667279 -} -85d8cb53fffffff -{ - -41.277487026 126.333029803 - -41.188103715 126.338492474 - -41.137746465 126.246126315 - -41.176666983 126.148308232 - -41.265949894 126.142616129 - -41.316412750 126.234971216 -} -85e78867fffffff -{ - -62.131533849 29.930694375 - -62.052852447 29.859359588 - -62.035041655 29.677794401 - -62.095878174 29.566553172 - -62.174798198 29.637178956 - -62.192643248 29.819758643 -} -85f2d963fffffff -{ - -78.440962534 -80.920439553 - -78.433799174 -80.452498939 - -78.347302598 -80.250838206 - -78.268514770 -80.513181608 - -78.275636630 -80.974591320 - -78.361587166 -81.180127651 -} -85e028affffffff -{ - -60.888874636 55.576907042 - -60.800265485 55.605013125 - -60.747282859 55.472475487 - -60.782668946 55.311782970 - -60.871122810 55.282872031 - -60.924346243 55.415456428 -} -85f04873fffffff -{ - -74.468474786 29.669939843 - -74.381791680 29.539654722 - -74.366151444 29.204696613 - -74.437121600 28.996584221 - -74.524193027 29.124403601 - -74.539906731 29.462824202 -} -85cd6817fffffff -{ - -53.432934621 76.760061035 - -53.342701483 76.731341395 - -53.315381799 76.586683086 - -53.378117764 76.470282198 - -53.468378672 76.498369335 - -53.495876296 76.643490617 -} -85c86d5bfffffff -{ - -47.777859721 100.629390114 - -47.699342233 100.554721218 - -47.702672590 100.413599238 - -47.784528673 100.346621907 - -47.863231207 100.421051551 - -47.859892585 100.562699183 -} -85ecadd3fffffff -{ - -67.017064288 141.698983039 - -66.983915098 141.488711838 - -67.042098413 141.312156103 - -67.133714180 141.345741641 - -67.166989153 141.557246722 - -67.108521860 141.733928290 -} -8544b657fffffff -{ - 24.023849653 -75.735931252 - 24.082603972 -75.675660292 - 24.164681659 -75.692319184 - 24.188078155 -75.769387452 - 24.129278520 -75.829767370 - 24.047127731 -75.812970011 -} -8541425bfffffff -{ - 20.982392200 107.554447793 - 21.073019994 107.532540179 - 21.103513265 107.438235336 - 21.043340440 107.365849429 - 20.952668643 107.387829160 - 20.922213631 107.482122746 -} -850662c7fffffff -{ - 63.162807951 -28.485224857 - 63.175124019 -28.667478911 - 63.104323848 -28.786717356 - 63.021458183 -28.723735250 - 63.009308244 -28.542405055 - 63.079858343 -28.423135988 -} -85068b17fffffff -{ - 69.876594807 -55.083185726 - 69.854407070 -55.344951497 - 69.763978433 -55.414061841 - 69.695939450 -55.223037263 - 69.718009081 -54.963088027 - 69.808235021 -54.892355076 -} -855ea14ffffffff -{ - 13.368795293 -50.148475956 - 13.445127915 -50.099322662 - 13.520070226 -50.143540377 - 13.518702673 -50.236868418 - 13.442424723 -50.285997535 - 13.367459682 -50.241822906 -} -8557098bfffffff -{ - 20.123211480 -31.553026019 - 20.047251290 -31.606351760 - 19.965754950 -31.559987494 - 19.960114484 -31.460377809 - 20.035980167 -31.406960468 - 20.117580832 -31.453244114 -} -853f5e4ffffffff -{ - 31.690347519 26.949750074 - 31.593663679 26.941843064 - 31.539159626 27.036162241 - 31.581267612 27.138438138 - 31.677924284 27.146525992 - 31.732500265 27.052157218 -} -851985a3fffffff -{ - 58.051316490 -19.102607674 - 57.990310026 -19.208631451 - 57.912649387 -19.149632505 - 57.895940155 -18.985015401 - 57.956843903 -18.878964749 - 58.034559433 -18.937556944 -} -859806b3fffffff -{ - -13.338723257 -8.197142533 - -13.418431019 -8.226760235 - -13.482583083 -8.165004939 - -13.466913257 -8.073621591 - -13.387142372 -8.044128368 - -13.323104342 -8.105893822 -} -85f39b03fffffff -{ - -84.589334974 175.149783032 - -84.675098941 174.947596160 - -84.730212161 175.682172911 - -84.698145063 176.614646844 - -84.611819583 176.790483559 - -84.558105943 176.060478548 -} -85203163fffffff -{ - 45.766947953 68.852709639 - 45.681749350 68.920342126 - 45.679917051 69.059684554 - 45.763286621 69.131817961 - 45.848615837 69.064400562 - 45.850444873 68.924633609 -} -853a8643fffffff -{ - 25.881376823 -57.448986998 - 25.803659176 -57.473151424 - 25.737522621 -57.414028092 - 25.748998535 -57.330664880 - 25.826733757 -57.306325479 - 25.892975610 -57.365524215 -} -85c38937fffffff -{ - -40.611087141 -55.073003948 - -40.665218606 -55.137902361 - -40.742742030 -55.121672103 - -40.766209282 -55.040325178 - -40.712023607 -54.975288436 - -40.634424937 -54.991737031 -} -85f3aa57fffffff -{ - -80.289184818 -177.519160551 - -80.372324563 -177.562291522 - -80.415111117 -177.126237429 - -80.374019507 -176.650327034 - -80.290737288 -176.615417711 - -80.248683414 -177.048182166 -} -85e12a93fffffff -{ - -67.375054711 65.255619243 - -67.282167678 65.255400666 - -67.235060117 65.057025974 - -67.280561616 64.858291016 - -67.373368688 64.856983918 - -67.420755163 65.055936031 -} -85025887fffffff -{ - 72.363826014 -86.585909673 - 72.299478696 -86.815665246 - 72.208833551 -86.746970737 - 72.182358819 -86.450790691 - 72.246333937 -86.221142910 - 72.337154696 -86.287557374 -} -850569dbfffffff -{ - 84.675538456 -173.795750157 - 84.587290325 -174.149981546 - 84.512653410 -173.523057231 - 84.524932903 -172.549048594 - 84.612205293 -172.173493065 - 84.688182130 -172.792713145 -} -85ef7673fffffff -{ - -79.644378728 -64.217083047 - -79.610903426 -63.719436521 - -79.515744281 -63.636333646 - -79.454329136 -64.043091864 - -79.487347217 -64.534336562 - -79.582232631 -64.625179938 -} -857d30d3fffffff -{ - -11.120549599 -19.240814586 - -11.041173673 -19.199832616 - -10.966701455 -19.242840183 - -10.971570120 -19.326898523 - -11.051001737 -19.367966602 - -11.125508983 -19.324890276 -} -8538e143fffffff -{ - 30.277664685 4.636574127 - 30.184762460 4.648875991 - 30.148126125 4.744486805 - 30.204393710 4.827970648 - 30.297382958 4.815812677 - 30.334017650 4.720026750 -} -850a90d3fffffff -{ - 55.273549658 100.146914985 - 55.182627128 100.161828246 - 55.142387659 100.299320752 - 55.192914588 100.422149031 - 55.283781804 100.407815445 - 55.324177714 100.270074041 -} -85047137fffffff -{ - 76.709131841 173.168741774 - 76.613307382 173.111519813 - 76.553710052 173.437470179 - 76.589361650 173.821712374 - 76.684986151 173.883803094 - 76.745162261 173.556802312 -} -85b6adabfffffff -{ - -26.272769781 -90.704077148 - -26.341306260 -90.767120124 - -26.424925042 -90.728230759 - -26.440031153 -90.626232422 - -26.371495873 -90.563167407 - -26.287853310 -90.602122614 -} -858e72a3fffffff -{ - -12.556920333 -79.557306214 - -12.635711829 -79.615444463 - -12.724076856 -79.574870170 - -12.733622770 -79.476139574 - -12.654820612 -79.418038238 - -12.566483221 -79.458630429 -} -8532c4d3fffffff -{ - 40.529165718 165.623676966 - 40.625497969 165.623096524 - 40.672770383 165.512416111 - 40.623638423 165.402477381 - 40.527322079 165.403337347 - 40.480121599 165.513856577 -} -85da9663fffffff -{ - -41.516470060 172.850157766 - -41.432794620 172.800097603 - -41.426267272 172.680204237 - -41.503466740 172.610091340 - -41.587248157 172.660049749 - -41.593724112 172.780223371 -} -8534897bfffffff -{ - 27.424821813 -31.537328371 - 27.344521429 -31.595133811 - 27.259415985 -31.544901403 - 27.254510208 -31.436957996 - 27.334723195 -31.379045115 - 27.419929364 -31.429182703 -} -85c56463fffffff -{ - -32.262474093 -26.997565486 - -32.345432336 -27.051102310 - -32.426127107 -26.995599877 - -32.423806951 -26.886395976 - -32.340732470 -26.832912654 - -32.260094444 -26.888579336 -} -852ed9dbfffffff -{ - 46.685868288 134.705557369 - 46.764442689 134.668455128 - 46.767138832 134.543611713 - 46.703280752 134.480386390 - 46.681151361 134.500875249 - 46.628837973 134.525676637 - 46.618087877 134.634073185 -} -8581020ffffffff -{ - -12.099938777 -41.083956887 - -12.017754966 -41.033044896 - -11.934035380 -41.080887374 - -11.932502809 -41.179633485 - -12.014694283 -41.230560417 - -12.098410660 -41.182726447 -} -85687683fffffff -{ - 9.892882368 120.447231800 - 9.802723721 120.463945256 - 9.774584258 120.548620763 - 9.836665993 120.616646588 - 9.926893972 120.599924965 - 9.954970901 120.515185627 -} -8546314bfffffff -{ - 26.151066516 -171.034173807 - 26.240379106 -171.011389960 - 26.299419378 -171.083247182 - 26.269036927 -171.177945923 - 26.179617148 -171.200597741 - 26.120686984 -171.128683130 -} -85134003fffffff -{ - 63.655676965 -106.757707008 - 63.573272405 -106.858660875 - 63.491950665 -106.753657256 - 63.492777362 -106.548143971 - 63.574996116 -106.446455101 - 63.656574178 -106.551009843 -} -85a76c63fffffff -{ - -27.783430017 104.950752047 - -27.859155217 104.987972254 - -27.864491503 105.070620275 - -27.794204239 105.115922637 - -27.718580308 105.078718536 - -27.713142435 104.996195846 -} -8538c06bfffffff -{ - 27.041553179 4.787998420 - 26.948553226 4.799797871 - 26.910511683 4.892502186 - 26.965465810 4.973570888 - 27.058553490 4.961907106 - 27.096599365 4.869038755 -} -85bfa1c7fffffff -{ - -35.200534594 164.604018137 - -35.109824454 164.564745701 - -35.092567273 164.450122421 - -35.166025415 164.374532075 - -35.256827826 164.413652559 - -35.274079867 164.528515799 -} -85ccaa0ffffffff -{ - -37.290167492 83.001215001 - -37.376995051 83.033633026 - -37.395189406 83.146268821 - -37.326575733 83.226301250 - -37.239806236 83.193772811 - -37.221592290 83.081322030 -} -8503893bfffffff -{ - 79.210463176 -127.095566021 - 79.172622072 -127.538517474 - 79.081675721 -127.603762702 - 79.028820799 -127.232813871 - 79.066242797 -126.794989036 - 79.156934533 -126.723015564 -} -8505640ffffffff -{ - 86.196710437 132.650391094 - 86.116784670 133.383341133 - 86.117627600 134.793009723 - 86.198405324 135.528653224 - 86.280084569 134.825414575 - 86.279231995 133.355089770 -} -85921807fffffff -{ - -13.299960300 -106.368262233 - -13.367226875 -106.424182615 - -13.452725701 -106.395811331 - -13.471022533 -106.311429120 - -13.403730288 -106.255427375 - -13.318166884 -106.283889176 -} -85127483fffffff -{ - 59.455785417 -110.150242495 - 59.373182546 -110.228265245 - 59.294574203 -110.129941552 - 59.298327436 -109.953827991 - 59.380787897 -109.875176602 - 59.459637810 -109.973264552 -} -85db082bfffffff -{ - -56.815832024 173.331537242 - -56.745026825 173.266785942 - -56.745924429 173.113321223 - -56.817658129 173.024148427 - -56.888555752 173.088739101 - -56.887627237 173.242664378 -} -855ab64ffffffff -{ - 19.290183764 -178.361940667 - 19.378433385 -178.346991903 - 19.430690742 -178.421894750 - 19.394578879 -178.511751485 - 19.306258028 -178.526556016 - 19.254120176 -178.451648227 -} -8594cca7fffffff -{ - -16.763656662 132.090731021 - -16.847097361 132.106671918 - -16.879275729 132.194726502 - -16.828030339 132.266873729 - -16.744556506 132.250943864 - -16.712361133 132.162855674 -} -8506d257fffffff -{ - 68.205356667 -57.422299483 - 68.179041100 -57.664618545 - 68.086769751 -57.720372435 - 68.020985783 -57.535300683 - 68.047168143 -57.294496922 - 68.139266886 -57.237255636 -} -85dadb07fffffff -{ - -44.555826129 155.864423775 - -44.464591650 155.830275054 - -44.439976558 155.700690393 - -44.506555889 155.604984035 - -44.597838782 155.638868109 - -44.622494072 155.768723708 -} -85dd698ffffffff -{ - -58.658920224 -36.610191287 - -58.592780534 -36.488377456 - -58.507221823 -36.541794337 - -58.487641449 -36.716251659 - -58.553494082 -36.838135199 - -58.639213675 -36.785494314 -} -8500702bfffffff -{ - 82.203101736 10.543213475 - 82.278749499 10.825415716 - 82.352592762 10.444319252 - 82.349862453 9.775957427 - 82.273503679 9.502065361 - 82.200583726 9.888050748 -} -8541752bfffffff -{ - 18.275194044 109.137270302 - 18.366741889 109.116271820 - 18.397484716 109.024004045 - 18.336631753 108.952740841 - 18.245033914 108.973812186 - 18.214338995 109.066073925 -} -85aeb573fffffff -{ - -32.435676696 90.466167302 - -32.521239472 90.501229214 - -32.534730222 90.604413986 - -32.462712023 90.672363080 - -32.377233228 90.637242193 - -32.363688646 90.534230911 -} -85c65303fffffff -{ - -32.988933584 -135.095066489 - -32.897992664 -135.079026770 - -32.841458985 -135.159473304 - -32.875825651 -135.256090462 - -32.966827492 -135.272323184 - -33.023401824 -135.191745722 -} -853743d3fffffff -{ - 37.584805065 -140.691052570 - 37.512490141 -140.730402017 - 37.446212252 -140.662241907 - 37.452257806 -140.554810684 - 37.524554562 -140.515440628 - 37.590823969 -140.583522193 -} -85131ecbfffffff -{ - 64.046350740 -126.927109724 - 63.958905157 -126.959535808 - 63.898933037 -126.814246147 - 63.926183575 -126.636187176 - 64.013630486 -126.602671712 - 64.073826205 -126.748303272 -} -85c31143fffffff -{ - -44.098607010 -59.752007211 - -44.065093547 -59.649104552 - -43.995658020 -59.639054250 - -43.959779222 -59.731535521 - -43.993154541 -59.834185010 - -44.062546483 -59.844606137 -} -85f28337fffffff +85df56bbfffffff { - -86.817323068 -114.828004662 - -86.864244875 -113.395835094 - -86.814981791 -111.986236244 - -86.720776554 -112.048623937 - -86.675787263 -113.439035979 - -86.723126882 -114.808764606 -} -855f1823fffffff -{ - 6.870428312 -54.950784721 - 6.949864695 -54.902152051 - 7.028499128 -54.944871179 - 7.027699084 -55.036163548 - 6.948321173 -55.084753295 - 6.869684869 -55.042093694 -} -85b64343fffffff -{ - -22.331864851 -99.919595284 - -22.397773390 -99.980184072 - -22.483519544 -99.946696442 - -22.503409615 -99.852531031 - -22.437496283 -99.791876932 - -22.351697683 -99.825453474 -} -85c15153fffffff -{ - -30.759085134 -6.096528245 - -30.851329467 -6.130108983 - -30.922790427 -6.053647861 - -30.901901472 -5.943609563 - -30.809613711 -5.910221918 - -30.738258218 -5.986679166 -} -85d39ac7fffffff -{ - -49.213968433 -95.371818662 - -49.139275065 -95.279724019 - -49.049588037 -95.330897343 - -49.034465370 -95.473858133 - -49.109024023 -95.566111619 - -49.198839975 -95.515246643 -} -85bc8293fffffff -{ - -27.038319423 38.095310266 - -26.947294522 38.096887594 - -26.903439104 38.007805652 - -26.950622122 37.917067289 - -27.041682718 37.915412075 - -27.085524680 38.004573137 -} -855c6053fffffff -{ - 13.605796222 -143.053268347 - 13.515430128 -143.087980094 - 13.440730960 -143.025572596 - 13.456373595 -142.928504739 - 13.546689632 -142.893767406 - 13.621413112 -142.956123361 -} -856d5b0bfffffff -{ - 6.953001334 -90.018230524 - 6.881006401 -90.074999310 - 6.799931725 -90.039705685 - 6.790876068 -89.947591764 - 6.862932286 -89.890808149 - 6.943982826 -89.926153171 -} -857ea38bfffffff -{ - 0.226098138 178.258449415 - 0.150824254 178.244874395 - 0.091081298 178.298225487 - 0.106561130 178.365240894 - 0.181891167 178.378890242 - 0.241685256 178.325449820 -} -852d65a7fffffff -{ - 49.901451691 36.799929955 - 49.847489974 36.902599134 - 49.882212601 37.019714783 - 49.971056595 37.034351818 - 50.025114272 36.931433224 - 49.990231776 36.814127105 -} -8511845bfffffff -{ - 53.652134768 34.933336693 - 53.602223429 35.045184898 - 53.640669621 35.168699412 - 53.729187477 35.180558316 - 53.779184233 35.068394193 - 53.740577479 34.944687329 -} -85a2b613fffffff -{ - -26.250538459 41.566716745 - -26.159851277 41.566802440 - -26.118097156 41.479171169 - -26.167052288 41.391361058 - -26.257789059 41.391200900 - -26.299521175 41.478925363 -} -851ed12bfffffff -{ - 40.060899359 22.418478177 - 39.967585229 22.414476820 - 39.918418010 22.520164240 - 39.962511926 22.629953753 - 40.055824047 22.634176218 - 40.105044415 22.528388105 -} -85371553fffffff -{ - 40.441005769 -152.269271459 - 40.367596708 -152.305427503 - 40.310314067 -152.230080674 - 40.326435939 -152.118580852 - 40.399844589 -152.082348539 - 40.457131834 -152.157692106 -} -853911b3fffffff -{ - 37.981080940 -7.339201845 - 37.916737403 -7.422303694 - 37.825264560 -7.394878583 - 37.798157125 -7.284606922 - 37.862417324 -7.201603564 - 37.953868163 -7.228773216 -} -85924527fffffff -{ - -15.892638847 -97.805555451 - -15.964001694 -97.865493293 - -16.052309127 -97.831484308 - -16.069294864 -97.737456315 - -15.997911508 -97.677464405 - -15.909562944 -97.711554464 -} -8534402bfffffff -{ - 29.025459043 -18.109664849 - 28.951201416 -18.179940249 - 28.861496606 -18.142329034 - 28.846005267 -18.034621988 - 28.920154401 -17.964343104 - 29.009903262 -18.001774443 -} -855842d3fffffff -{ - 13.635452793 13.148381672 - 13.545442697 13.152626123 - 13.500781766 13.236599404 - 13.546070666 13.316432974 - 13.636123341 13.312315780 - 13.680844645 13.228237682 -} -8534808bfffffff -{ - 31.095795605 -34.567748278 - 31.013280068 -34.624581769 - 30.929036040 -34.569735592 - 30.927202614 -34.458134427 - 31.009645803 -34.401162600 - 31.093994799 -34.455929858 -} -85ef3477fffffff -{ - -86.517076667 -36.559210273 - -86.447844182 -35.513885744 - -86.358829733 -35.986440645 - -86.337823636 -37.448783829 - -86.404906679 -38.498383059 - -86.495114114 -38.082967500 -} -854a2b63fffffff -{ - 25.141477326 133.080382698 - 25.058010577 133.097244275 - 25.030955282 133.191084119 - 25.087394765 133.268097043 - 25.170868164 133.251249787 - 25.197895506 133.157375206 -} -85f292abfffffff + -57.096779969 -61.550880412 + -57.059699199 -61.397469904 + -56.973833427 -61.377766476 + -56.925135255 -61.510682187 + -56.962036319 -61.663507852 + -57.047814673 -61.684001577 +} +857715c7fffffff { - -89.053494827 82.601992611 - -89.025892714 77.352041267 - -89.083659531 73.100154474 - -89.176608910 73.925514759 - -89.208734673 80.065032484 - -89.142798612 84.410394461 -} -85056d37fffffff -{ - 85.222985359 -164.691417092 - 85.141412145 -165.240312728 - 85.058789298 -164.688086119 - 85.056461482 -163.606141471 - 85.136680280 -163.040449252 - 85.220579387 -163.572681651 -} -85056a47fffffff -{ - 83.600151051 170.480897867 - 83.505352497 170.402912145 - 83.448816459 171.086852923 - 83.485959722 171.854948094 - 83.580483543 171.953658682 - 83.638153037 171.263674165 -} -85f2d46bfffffff -{ - -83.091802270 -93.526830261 - -83.106168187 -92.764065267 - -83.031379091 -92.292908399 - -82.943270128 -92.580711453 - -82.929265261 -93.326550548 - -83.003014216 -93.801268024 -} -855e724ffffffff -{ - 13.617266957 -58.692836058 - 13.692528389 -58.645924085 - 13.763343676 -58.686346963 - 13.758907781 -58.773614126 - 13.683715109 -58.820472214 - 13.612889621 -58.780117097 -} -850665b7fffffff -{ - 61.163735178 -25.042400870 - 61.178890866 -25.206646299 - 61.111713128 -25.323258755 - 61.029611011 -25.275547641 - 61.014637116 -25.112029672 - 61.081584041 -24.995497200 -} -8503a223fffffff -{ - 81.454120924 -158.045202264 - 81.377531601 -158.414678687 - 81.290391791 -158.167435951 - 81.279257926 -157.558953798 - 81.355005667 -157.186549784 - 81.442725486 -157.425420379 -} -85032267fffffff -{ - 88.740151892 -115.027640028 - 88.720551624 -119.050099637 - 88.630011338 -120.143687342 - 88.562284646 -117.610929403 - 88.580034515 -114.022288100 - 88.667192909 -112.563691856 -} -85e90c03fffffff -{ - -65.043621694 -106.532657722 - -64.984133453 -106.372016367 - -64.899168853 -106.419488920 - -64.873605136 -106.626679042 - -64.932897713 -106.787252039 - -65.017949179 -106.740705798 -} -854759bbfffffff -{ - 28.126620589 -161.998190699 - 28.039325235 -162.027093946 - 27.977473822 -161.955781986 - 28.002914558 -161.855511230 - 28.090244497 -161.826511908 - 28.152099162 -161.897879312 -} -8595b283fffffff -{ - -12.215590076 114.248325005 - -12.140118116 114.231541224 - -12.124648373 114.152295185 - -12.184727353 114.089825231 - -12.260217759 114.106671891 - -12.275610816 114.185925641 -} -85756977fffffff -{ - -0.015196714 2.812860686 - 0.067542034 2.825402172 - 0.112539610 2.766053432 - 0.074876880 2.694234133 - -0.007763639 2.681671787 - -0.052839625 2.740949532 -} -85ab8297fffffff -{ - -26.331258974 62.151988318 - -26.426742911 62.165874203 - -26.463916596 62.264127844 - -26.405534005 62.348426324 - -26.310024990 62.334388342 - -26.272923544 62.236203932 -} -8504306bfffffff -{ - 74.112628328 134.229650483 - 74.028085300 134.405293488 - 74.027099069 134.758558254 - 74.110660438 134.939844149 - 74.195645172 134.766063946 - 74.196626835 134.409109054 -} -85f318a3fffffff -{ - -76.940241072 -162.233159373 - -77.019158394 -162.162536263 - -77.039442534 -161.799118445 - -76.980426184 -161.509949276 - -76.901690156 -161.584657349 - -76.881786474 -161.944469838 -} -851ee9cbfffffff -{ - 43.956071848 27.789884518 - 43.866351476 27.779989097 - 43.813865898 27.886797145 - 43.851041052 28.003556391 - 43.940735839 28.013684592 - 43.993281211 27.906820954 -} -8527a82bfffffff -{ - 47.897460455 -102.098956263 - 47.826030077 -102.173246954 - 47.744165373 -102.113595714 - 47.733542428 -101.979910700 - 47.804804031 -101.905380672 - 47.886857389 -101.964773711 -} -8549936ffffffff -{ - 21.666355968 -97.255404756 - 21.742407525 -97.192976787 - 21.830751595 -97.231173308 - 21.843029951 -97.331928269 - 21.766899447 -97.394371589 - 21.678569603 -97.356044786 -} -85e2d43bfffffff -{ - -55.873934914 -122.705333214 - -55.828069386 -122.562269643 - -55.734262746 -122.564777345 - -55.686361491 -122.709726371 - -55.732114779 -122.852407571 - -55.825881179 -122.850521820 -} -858f1b93fffffff -{ - -5.023581391 -84.215888222 - -5.101230758 -84.274112372 - -5.190088564 -84.235497236 - -5.201271590 -84.138622749 - -5.123586841 -84.080411252 - -5.034754475 -84.119061445 -} -8568b22bfffffff -{ - -0.699399060 112.160428153 - -0.611939113 112.142007326 - -0.588465116 112.057645490 - -0.652532549 111.991701596 - -0.740030916 112.010189451 - -0.763423487 112.094554201 -} -8532558ffffffff -{ - 35.348719647 161.437877242 - 35.445458980 161.432390872 - 35.489796637 161.327405816 - 35.437334132 161.228080181 - 35.340635966 161.233804659 - 35.296358983 161.338616814 -} -851374c7fffffff -{ - 67.188126018 -112.127929888 - 67.102630851 -112.222814235 - 67.027339624 -112.088617678 - 67.037257470 -111.859834363 - 67.122592182 -111.763802018 - 67.198169994 -111.897694865 -} -85e66003fffffff -{ - -67.689923260 4.318551057 - -67.597240398 4.330779149 - -67.544321608 4.125693749 - -67.583765733 3.907593679 - -67.676449921 3.893566622 - -67.729689989 4.099437628 -} -85b3b5d3fffffff -{ - -19.216882086 -78.905471293 - -19.294390109 -78.964576927 - -19.380037366 -78.923033092 - -19.388159216 -78.822367590 - -19.310655164 -78.763303777 - -19.225025316 -78.804863480 -} -855e64abfffffff -{ - 11.128364104 -63.022048521 - 11.203711222 -62.976864839 - 11.274546289 -63.014903389 - 11.270033491 -63.098049608 - 11.194760213 -63.143168190 - 11.123925949 -63.105205702 -} -85e770a7fffffff -{ - -72.448888364 22.634391676 - -72.358739704 22.553594589 - -72.331995750 22.261485128 - -72.395230091 22.047687602 - -72.485651494 22.126097657 - -72.512567061 22.420705266 -} -85170b07fffffff -{ - 59.867615305 162.360661650 - 59.777763896 162.369103440 - 59.737982507 162.533329815 - 59.787801019 162.689676076 - 59.877660447 162.682243158 - 59.917694140 162.517454739 -} -85cf6b73fffffff -{ - -47.845553413 -92.059340905 - -47.769020890 -91.975601268 - -47.681206967 -92.030287589 - -47.669784694 -92.168466810 - -47.746194205 -92.252404689 - -47.834148980 -92.197966208 -} -85152357fffffff -{ - 58.559540811 110.714655699 - 58.503824438 110.852060912 - 58.532883854 111.011541111 - 58.617878458 111.034223898 - 58.673857460 110.896555649 - 58.644578544 110.736466622 -} -85b50093fffffff -{ - -36.909004431 -155.100596263 - -36.818724061 -155.061891844 - -36.747360917 -155.141124356 - -36.766214588 -155.259044747 - -36.856462199 -155.297919375 - -36.927888982 -155.218703762 -} -85976a2ffffffff -{ - -20.648063282 21.917348701 - -20.553280124 21.925508231 - -20.497998362 21.841767959 - -20.537473128 21.749877245 - -20.632221306 21.741651933 - -20.687529771 21.825383049 -} -85c04817fffffff -{ - -38.594602088 2.248510375 - -38.688036948 2.222468571 - -38.751752524 2.311291024 - -38.721947415 2.426065171 - -38.628520812 2.451844428 - -38.564890911 2.363112288 -} -8516525bfffffff -{ - 52.182111845 171.314036225 - 52.270567911 171.321929775 - 52.319411358 171.194542913 - 52.279710859 171.059410105 - 52.191239407 171.051909143 - 52.142483594 171.179148201 -} -853c4207fffffff -{ - 29.760632038 94.472521561 - 29.843553612 94.445020311 - 29.864748127 94.343025286 - 29.803030491 94.268586951 - 29.720109702 94.296133103 - 29.698905698 94.398072831 -} -85caf30bfffffff -{ - -46.498651620 58.008332277 - -46.581402492 58.020888423 - -46.621609491 58.135657598 - -46.579014495 58.237804024 - -46.496234019 58.225025083 - -46.456078013 58.110322530 -} -8554826bfffffff -{ - 13.226712741 -22.304415670 - 13.158647381 -22.361106760 - 13.081219266 -22.325551171 - 13.071783125 -22.233417017 - 13.139736572 -22.176698576 - 13.217238003 -22.212141425 -} -854f8433fffffff -{ - 19.707878797 160.658996777 - 19.797928643 160.653653167 - 19.841316987 160.565824223 - 19.794579815 160.483463310 - 19.704570497 160.488971766 - 19.661257689 160.576676387 -} -8545684bfffffff -{ - 22.784333434 -95.546279578 - 22.859252142 -95.482925385 - 22.947811177 -95.519854590 - 22.961446593 -95.620275839 - 22.886450949 -95.683656316 - 22.797896896 -95.646589436 -} -85822ca3fffffff -{ - -7.748524964 7.461885246 - -7.659053956 7.473939438 - -7.606495387 7.406952374 - -7.643342773 7.327976728 - -7.732718032 7.315890194 - -7.785341639 7.382811567 -} -8582c3cbfffffff -{ - 2.682933403 7.082709418 - 2.766472163 7.094305211 - 2.810582916 7.030727036 - 2.771236442 6.955613864 - 2.687782889 6.943989301 - 2.643590602 7.007506610 -} -8513b6a7fffffff -{ - 62.214497994 -139.317812557 - 62.162788686 -139.465598055 - 62.084886528 -139.451961383 - 62.058688123 -139.291523155 - 62.110143819 -139.144118265 - 62.188050775 -139.156770290 -} -85f25187fffffff -{ - -75.282613072 -116.422758231 - -75.326134249 -116.126271750 - -75.279302570 -115.817217457 - -75.189341945 -115.806813260 - -75.146305825 -116.101671046 - -75.192747887 -116.408565017 -} -85f1a14bfffffff -{ - -78.336457675 114.715362720 - -78.274923965 114.399329096 - -78.298531941 113.958477836 - -78.383943668 113.828934234 - -78.446025339 114.145043064 - -78.422144735 114.590653752 -} -85813227fffffff -{ - -14.180583087 -39.489042292 - -14.098996063 -39.438251259 - -14.016592520 -39.486345649 - -14.015779185 -39.585229724 - -14.097381117 -39.636043054 - -14.179781470 -39.587950161 -} -85498a83fffffff -{ - 22.326933880 -101.833484013 - 22.405495029 -101.772247154 - 22.493781244 -101.814681351 - 22.503474060 -101.918467088 - 22.424838512 -101.979689937 - 22.336584599 -101.937141294 -} -858266bbfffffff -{ - -7.317040132 3.629692308 - -7.230273324 3.642510105 - -7.178920612 3.580157461 - -7.214269699 3.505061309 - -7.300932212 3.492219500 - -7.352349895 3.554497779 -} -85272bcbfffffff -{ - 50.136673074 -91.951287822 - 50.069796270 -92.050709209 - 49.980324518 -92.007006336 - 49.957583044 -91.864331103 - 50.024250561 -91.764825242 - 50.113868628 -91.808077738 + 5.866231764 152.134806735 + 5.772644500 152.147903804 + 5.737110977 152.233373357 + 5.795111973 152.305716787 + 5.888637811 152.292658547 + 5.924224108 152.207218021 } -85f286a3fffffff +85f29307fffffff { - -87.034693744 -156.322769686 - -87.121262424 -155.805985340 - -87.136577094 -154.029491118 - -87.064252592 -152.862066966 - -86.979115924 -153.454194146 - -86.964834482 -155.141317005 + -89.635723652 -12.996216498 + -89.547718109 -8.949449866 + -89.479323094 -16.141701713 + -89.483917192 -26.557239059 + -89.557956423 -33.232046209 + -89.641805272 -27.940797341 } -85d3082bfffffff -{ - -50.454188586 -114.470080852 - -50.396650021 -114.348585138 - -50.300577380 -114.366695281 - -50.262027777 -114.505804748 - -50.319428373 -114.627124432 - -50.415516218 -114.609511042 -} -851752b7fffffff -{ - 59.399174321 166.198111586 - 59.309943885 166.194563879 - 59.265891811 166.349663768 - 59.310803418 166.508739810 - 59.400000539 166.513257846 - 59.444320128 166.357729866 -} -8514692bfffffff -{ - 61.861188873 145.071993833 - 61.773931107 145.138442636 - 61.756570070 145.335478992 - 61.826351033 145.467160306 - 61.913803826 145.401638673 - 61.931281124 145.203504587 -} -859e0da3fffffff -{ - -18.001264904 163.255715047 - -17.916328794 163.224450025 - -17.895859677 163.129846270 - -17.960309301 163.066346778 - -18.045337150 163.097502343 - -18.065823677 163.192267108 -} -850814affffffff -{ - 62.942565825 9.807452472 - 62.877925222 9.819895010 - 62.857342288 9.972846999 - 62.901341067 10.113745014 - 62.966007867 10.101706248 - 62.986649880 9.948365045 -} -85e588cbfffffff -{ - -56.095514643 110.603394750 - -56.021776356 110.490747438 - -56.038783885 110.320493524 - -56.129629825 110.262157046 - -56.203601215 110.374707972 - -56.186493225 110.545693923 -} -85f2f173fffffff -{ - -81.371974143 -107.027925990 - -81.406272035 -106.464056073 - -81.346942580 -105.985213066 - -81.254124159 -106.073222327 - -81.220462807 -106.629126621 - -81.278990728 -107.104935270 -} -85c51433fffffff -{ - -31.219220111 -38.382409916 - -31.292938778 -38.440085958 - -31.372909742 -38.401648733 - -31.379153970 -38.305338999 - -31.305318191 -38.247629804 - -31.225355412 -38.286263294 -} -85be507bfffffff -{ - -33.172564971 146.852531543 - -33.077112935 146.833326042 - -33.043576990 146.725618428 - -33.105405589 146.636966875 - -33.200861413 146.655944866 - -33.234485003 146.763802076 -} -857376affffffff -{ - 12.796211632 136.938918542 - 12.702076371 136.955061227 - 12.668685546 137.047598702 - 12.729438673 137.124014181 - 12.823575554 137.107892041 - 12.856957756 137.015333807 -} -85390d13fffffff -{ - 40.451254679 -2.728516388 - 40.392568379 -2.814954807 - 40.302011216 -2.793233228 - 40.270187217 -2.685344611 - 40.328806971 -2.599049048 - 40.419317145 -2.620499204 -} -85d8cb07fffffff -{ - -41.369349883 125.659195772 - -41.280355098 125.665479212 - -41.229615553 125.574165880 - -41.267766199 125.476585748 - -41.356658321 125.470076508 - -41.407502517 125.561372864 -} -8526e38bfffffff -{ - 37.634490957 -97.172969876 - 37.704225580 -97.101371394 - 37.790139760 -97.145074542 - 37.806321102 -97.260548046 - 37.736537320 -97.332167339 - 37.650621417 -97.288292601 -} -85bae923fffffff -{ - -25.393455815 175.490334075 - -25.310726600 175.447808351 - -25.299506608 175.351632738 - -25.371070849 175.297800669 - -25.453926297 175.340275734 - -25.465091202 175.436633816 -} -8572822bfffffff -{ - -4.433245197 134.958771382 - -4.526998585 134.974752481 - -4.560891295 135.064973712 - -4.501041550 135.139239887 - -4.407264771 135.123275106 - -4.373361066 135.033027762 -} -85f2e22bfffffff -{ - -80.165344882 -110.233730360 - -80.203626258 -109.753756814 - -80.148415119 -109.316356883 - -80.055599895 -109.362173312 - -80.017938039 -109.836780957 - -80.072477838 -110.270918477 -} -85ef1987fffffff -{ - -79.855626907 -41.494025824 - -79.790167818 -41.090612285 - -79.695783079 -41.211956008 - -79.666539347 -41.728836647 - -79.731237854 -42.131393841 - -79.825935640 -42.017982847 -} -85df9283fffffff -{ - -61.715648600 -35.975500684 - -61.647019104 -35.841502540 - -61.559273019 -35.903003075 - -61.539975090 -36.097558891 - -61.608293277 -36.231668734 - -61.696220157 -36.171114748 -} -85b52d5bfffffff -{ - -38.058553092 -159.082879322 - -37.970235454 -159.039949994 - -37.896729397 -159.117086202 - -37.911482125 -159.237097326 - -37.999752217 -159.280176688 - -38.073317191 -159.203095308 -} -85a2f64ffffffff -{ - -26.261984441 49.530631285 - -26.353433026 49.533819617 - -26.396589554 49.618459375 - -26.348203605 49.699913757 - -26.256671973 49.696588882 - -26.213609298 49.611946274 -} -8546caabfffffff -{ - 15.539687221 -165.088875910 - 15.448368106 -165.114407408 - 15.381355499 -165.047600060 - 15.405634655 -164.955197385 - 15.496994919 -164.929575135 - 15.564034921 -164.996446245 -} -85a09b4bfffffff -{ - -9.962367470 -131.872693107 - -9.885263673 -131.862735884 - -9.828550531 -131.926143191 - -9.848863404 -131.999599911 - -9.926001487 -132.009675648 - -9.982792509 -131.946176113 -} -85ce289bfffffff -{ - -46.136651209 -82.285039432 - -46.056777413 -82.222668979 - -45.976397366 -82.287344094 - -45.975732987 -82.414292862 - -46.055530033 -82.476951663 - -46.136068332 -82.412374202 -} -855c9e23fffffff -{ - 4.888330770 -158.375102920 - 4.798460838 -158.403126571 - 4.727963441 -158.338353717 - 4.747281124 -158.245528556 - 4.837148563 -158.217433418 - 4.907700875 -158.282234827 -} -85d72073fffffff -{ - -57.794653046 35.202888953 - -57.724089520 35.130263498 - -57.712405410 34.977336440 - -57.771299699 34.896307511 - -57.842090329 34.968542440 - -57.853759515 35.122199106 -} -8507903bfffffff -{ - 79.516935477 -34.261088874 - 79.529917367 -34.725028612 - 79.460684759 -34.984929110 - 79.378988640 -34.782422719 - 79.366159506 -34.324602475 - 79.434875333 -34.063222407 -} -85f0a86bfffffff -{ - -73.856308604 76.448120907 - -73.765362329 76.388655172 - -73.730844012 76.082092543 - -73.786988853 75.832935847 - -73.878017567 75.889517958 - -73.912820788 76.198147251 -} -85cea5d3fffffff -{ - -44.640960190 -72.001833156 - -44.561176891 -71.961753665 - -44.490474871 -72.032689972 - -44.499408216 -72.143741777 - -44.579172866 -72.184139576 - -44.650023012 -72.113167704 -} -85038e8ffffffff -{ - 79.607504574 -140.215176303 - 79.551444785 -140.624616766 - 79.458884917 -140.576319370 - 79.422318429 -140.126214966 - 79.477737480 -139.719527690 - 79.570358483 -139.760172794 -} -85bf5a13fffffff -{ - -38.431714353 150.268413231 - -38.336750568 150.243654406 - -38.305676331 150.126495250 - -38.369497044 150.033899386 - -38.464482026 150.058408414 - -38.495625252 150.175763383 -} -8500cb8bfffffff -{ - 87.512632375 121.998336532 - 87.443567938 123.408772016 - 87.460368911 125.510160461 - 87.547220944 126.328989144 - 87.619318493 124.941975615 - 87.601479929 122.707373404 -} -85e751affffffff -{ - -69.715363886 15.878519137 - -69.623650606 15.838653250 - -69.586648995 15.593135942 - -69.641128081 15.385883020 - -69.733003634 15.423729093 - -69.770239144 15.670853313 -} -85e49b43fffffff -{ - -49.021754279 97.420503211 - -48.940536927 97.349893623 - -48.939830561 97.204895555 - -49.020322249 97.129953113 - -49.101713012 97.200255354 - -49.102438727 97.345808911 -} -8503b4cffffffff -{ - 79.963155909 -174.407263734 - 79.873136411 -174.593108134 - 79.799133840 -174.249452659 - 79.814424380 -173.721839692 - 79.903914444 -173.529608382 - 79.978645991 -173.871291480 -} -85152473fffffff -{ - 58.961508609 107.000667715 - 58.909968236 107.145406851 - 58.943635456 107.301336296 - 59.029085261 107.313054152 - 59.080873557 107.167937149 - 59.046963409 107.011479702 -} -854ed553fffffff -{ - 27.731385084 148.937205429 - 27.821947848 148.919658023 - 27.856690326 148.825561304 - 27.800857819 148.749202792 - 27.710397175 148.766900667 - 27.675666875 148.860806855 -} -85111d37fffffff -{ - 61.054165957 35.517061393 - 61.008529680 35.652286031 - 61.049724822 35.803240403 - 61.136716350 35.819267874 - 61.182449589 35.683590476 - 61.141093970 35.532338731 -} -85f064d3fffffff -{ - -81.540410251 31.171740846 - -81.453738048 30.918107675 - -81.442428091 30.303480568 - -81.517661470 29.930810817 - -81.605013795 30.176481753 - -81.616454891 30.802931439 -} -850c218ffffffff -{ - 66.678525188 -153.359359941 - 66.608844103 -153.507233282 - 66.527677525 -153.435458493 - 66.516021475 -153.217059100 - 66.585353620 -153.069040038 - 66.666689988 -153.139560491 -} -853f8b73fffffff -{ - 25.962889085 17.605251501 - 25.865930761 17.606069858 - 25.817764574 17.699514742 - 25.866499562 17.792248020 - 25.963482238 17.791595480 - 26.011705697 17.698043799 -} -85361ad7fffffff -{ - 30.900931257 -149.415968484 - 30.817583383 -149.451487482 - 30.750067073 -149.380828496 - 30.765897012 -149.274671588 - 30.849238653 -149.239095080 - 30.916756641 -149.309732799 -} -850352affffffff -{ - 81.583391170 -86.008163874 - 81.524432270 -86.464368469 - 81.441981820 -86.332869467 - 81.418169579 -85.754009300 - 81.476383971 -85.298444126 - 81.559150102 -85.421026541 -} -8521430bfffffff -{ - 53.436363698 73.698372305 - 53.349729136 73.768158600 - 53.341757411 73.929460665 - 53.420388239 74.021537339 - 53.507137486 73.952124373 - 53.515141322 73.790259806 -} -856c2403fffffff -{ - 11.018735492 -93.972535847 - 11.091019644 -93.914565302 - 11.172882016 -93.946844409 - 11.182440484 -94.037211838 - 11.110060606 -94.095212121 - 11.028218078 -94.062815356 -} -850f69affffffff -{ - 57.062267177 -54.522829509 - 57.036894311 -54.689355785 - 56.944978082 -54.734985807 - 56.878596952 -54.614738472 - 56.903903359 -54.448953776 - 56.995657063 -54.402677003 -} -85e8d04ffffffff -{ - -62.023673302 -70.849552446 - -61.998366177 -70.660122185 - -61.911503680 -70.606767975 - -61.850139897 -70.741901150 - -61.875333195 -70.930312623 - -61.962003605 -70.984606273 +85190a67fffffff +{ + 56.428119279 -8.221795234 + 56.375989749 -8.332356606 + 56.293998798 -8.294117261 + 56.264136259 -8.145769003 + 56.316183680 -8.035369594 + 56.398175525 -8.073156047 +} +85c09053fffffff +{ + -40.347785139 -23.410825844 + -40.431640509 -23.467363883 + -40.512488502 -23.400639181 + -40.509420543 -23.277201336 + -40.425464706 -23.220765168 + -40.344677316 -23.287664393 +} +85e3a177fffffff +{ + -67.407419523 -134.320594906 + -67.383892067 -134.117702573 + -67.302093741 -134.087494908 + -67.243927234 -134.259165435 + -67.267371764 -134.461028481 + -67.349065247 -134.492247074 +} +8564f437fffffff +{ + 14.516438396 93.809364721 + 14.609702507 93.783057424 + 14.634037507 93.686156478 + 14.565111743 93.615614591 + 14.471864829 93.641960559 + 14.447526428 93.738809868 +} +85e96e3bfffffff +{ + -58.016671036 -105.803209308 + -57.952501263 -105.671956306 + -57.861768762 -105.712630318 + -57.835126737 -105.883937793 + -57.899132641 -106.015163304 + -57.989944101 -105.975110311 +} +852c648ffffffff +{ + 47.250311559 46.164488416 + 47.185023096 46.258433409 + 47.209606007 46.384320630 + 47.299615155 46.416555249 + 47.365038667 46.322492490 + 47.340317743 46.196312488 +} +8506d14ffffffff +{ + 66.714409383 -54.447424735 + 66.691980240 -54.676780177 + 66.600590185 -54.739598168 + 66.531820951 -54.574288980 + 66.554157715 -54.346338739 + 66.645355528 -54.282298146 +} +8591aa13fffffff +{ + -14.525421952 -119.758435703 + -14.482778846 -119.688185170 + -14.413946737 -119.692536304 + -14.387757360 -119.766981621 + -14.430297408 -119.837150514 + -14.499129733 -119.832955729 +} +85af6493fffffff +{ + -14.253625093 93.191736956 + -14.338155305 93.222790053 + -14.358265702 93.309213780 + -14.293890948 93.364458646 + -14.209471112 93.333373683 + -14.189315703 93.247075555 +} +850e2e0bfffffff +{ + 60.624700432 -72.760469544 + 60.575115344 -72.931103823 + 60.477724871 -72.928749824 + 60.429925021 -72.756792046 + 60.479293815 -72.586675737 + 60.576678024 -72.587999245 +} +85d968dbfffffff +{ + -58.617131771 125.649764465 + -58.560007491 125.504542787 + -58.597267255 125.339937052 + -58.691860396 125.320021327 + -58.749194401 125.465594844 + -58.711724928 125.630732808 +} +851b36cbfffffff +{ + 60.292818324 -53.244898120 + 60.270055726 -53.428410724 + 60.178421259 -53.482032392 + 60.109728278 -53.352898655 + 60.132431149 -53.170297470 + 60.223886414 -53.115921606 +} +85f2d6cffffffff +{ + -84.047019236 -90.860392534 + -84.057369912 -89.968668146 + -83.980089537 -89.457523020 + -83.893639119 -89.830729272 + -83.883583291 -90.699136511 + -83.959688728 -91.217250513 +} +85160abbfffffff +{ + 53.706085241 167.811985029 + 53.793172127 167.814670094 + 53.837370350 167.680939792 + 53.794399170 167.544733675 + 53.707313784 167.542466670 + 53.663197818 167.675987704 +} +858eb12bfffffff +{ + -11.526680899 -92.305284867 + -11.602301223 -92.365312402 + -11.691828352 -92.328956026 + -11.705750350 -92.232507180 + -11.630100703 -92.172451759 + -11.540558415 -92.208872947 +} +859d910ffffffff +{ + -11.406477660 153.614970412 + -11.491291176 153.627377471 + -11.517357225 153.709520118 + -11.458682943 153.779224272 + -11.373910207 153.766854977 + -11.347770913 153.684743745 +} +856db1affffffff +{ + 13.384187369 -102.199834242 + 13.460918361 -102.142821291 + 13.545424472 -102.182714131 + 13.553152142 -102.279718437 + 13.476333003 -102.336717107 + 13.391874398 -102.296725945 +} +85301eabfffffff +{ + 37.165643907 122.411341994 + 37.101962697 122.428925414 + 37.090362695 122.519316508 + 37.142476477 122.592190465 + 37.206168581 122.574601517 + 37.217736066 122.484144068 +} +8503b553fffffff +{ + 80.495618328 -168.906937686 + 80.409399060 -169.151558495 + 80.330241731 -168.833713619 + 80.336594707 -168.275064288 + 80.422162472 -168.024765450 + 80.502029741 -168.338685404 +} +8548130ffffffff +{ + 26.115242556 -104.642295015 + 26.194975003 -104.580533560 + 26.283021521 -104.626596555 + 26.291298217 -104.734529037 + 26.211502292 -104.796256049 + 26.123493186 -104.750085298 +} +8580a347fffffff +{ + -2.194619582 -35.523727561 + -2.111636501 -35.474781439 + -2.027209483 -35.522021205 + -2.025734326 -35.618222540 + -2.108717404 -35.667207005 + -2.193175647 -35.619951925 +} +85501203fffffff +{ + 21.429424672 -126.497642961 + 21.512453170 -126.456280364 + 21.590146029 -126.510632492 + 21.584720413 -126.606322434 + 21.501685984 -126.647547775 + 21.424083032 -126.593220589 +} +856a5ecffffffff +{ + 4.357583574 33.064385894 + 4.445737221 33.067681386 + 4.494171338 32.989120351 + 4.454504369 32.907222371 + 4.366341198 32.903866048 + 4.317854428 32.982468531 +} +85de14c3fffffff +{ + -57.356240077 -48.499881373 + -57.303317167 -48.361188727 + -57.216052715 -48.378668198 + -57.181668193 -48.534001632 + -57.234332730 -48.672409792 + -57.321639495 -48.655769792 +} +85f39b57fffffff +{ + -84.674675086 172.357425108 + -84.759438058 172.105385433 + -84.817877184 172.819587035 + -84.790102601 173.784305324 + -84.704646091 174.010245970 + -84.647642131 173.297932924 +} +85169963fffffff +{ + 45.245474797 160.908116824 + 45.338924459 160.901155371 + 45.379592591 160.781327446 + 45.326758374 160.668690785 + 45.233348818 160.675959911 + 45.192733182 160.795558266 } -85e4f6b3fffffff +85f291cbfffffff { - -55.702296956 96.980190543 - -55.617750227 96.897696503 - -55.615824726 96.726260158 - -55.698420296 96.636543610 - -55.783154192 96.718596758 - -55.785105427 96.890809868 + -89.374920706 -168.651351032 + -89.466540720 -167.935812057 + -89.495702293 -158.400350862 + -89.424670726 -151.863347481 + -89.338000908 -154.713537691 + -89.316113922 -162.240145666 } -85173183fffffff -{ - 62.297483511 150.295291822 - 62.207752330 150.345595971 - 62.182911403 150.541504345 - 62.247629786 150.688136714 - 62.337506359 150.638909701 - 62.362519869 150.441969898 -} -85661897fffffff -{ - 6.981234291 -75.761128517 - 6.911203583 -75.814246645 - 6.829393246 -75.775605245 - 6.817676966 -75.683843512 - 6.887752097 -75.630773937 - 6.969499089 -75.669417418 -} -850424c7fffffff -{ - 78.143133611 131.457892092 - 78.061326817 131.709793513 - 78.065045453 132.178466901 - 78.150634652 132.401687026 - 78.233045625 132.152547487 - 78.229262586 131.677365232 -} -85f35477fffffff -{ - -74.305887271 -148.365860556 - -74.376712594 -148.233490240 - -74.376124443 -147.917679820 - -74.304587781 -147.737306621 - -74.234101834 -147.871596745 - -74.234812489 -148.184359597 -} -85189577fffffff -{ - 50.374269565 -26.583398491 - 50.300382388 -26.667814208 - 50.218724662 -26.606069392 - 50.210884033 -26.460141590 - 50.284687337 -26.375596982 - 50.366415083 -26.437108157 -} -852a6c0bfffffff -{ - 33.830455243 -62.408254667 - 33.797913097 -62.503590678 - 33.721908310 -62.518627687 - 33.678509370 -62.438590782 - 33.710950410 -62.343472711 - 33.786891284 -62.328173887 -} -85f295affffffff -{ - -88.228125754 -160.929292039 - -88.317251942 -160.286225842 - -88.339087870 -157.271228949 - -88.269497303 -155.153170249 - -88.182384771 -156.030688973 - -88.162716199 -158.804058945 -} -8591301bfffffff -{ - -17.997377280 -124.690913727 - -17.954853006 -124.615852954 - -17.882001892 -124.614856997 - -17.851699308 -124.688755357 - -17.894127344 -124.763703318 - -17.966954044 -124.764865664 -} -853ed1b3fffffff -{ - 19.385659191 25.959902289 - 19.290745115 25.953660215 - 19.238828493 26.038500178 - 19.281736800 26.129628170 - 19.376627279 26.136015843 - 19.428633167 26.051129993 -} -85d413b3fffffff -{ - -47.172936442 -158.295356335 - -47.091378247 -158.248431737 - -47.023885427 -158.334900630 - -47.037893399 -158.468235888 - -47.119409608 -158.515352160 - -47.186959912 -158.428942061 -} -8508a623fffffff -{ - 60.205615590 12.694423570 - 60.136223492 12.702339108 - 60.110219847 12.846897001 - 60.153551602 12.983854411 - 60.222965481 12.976314419 - 60.249026019 12.831441056 -} -852e8aa7fffffff -{ - 47.746438438 142.678320649 - 47.830283956 142.648222866 - 47.848745359 142.529388499 - 47.783396676 142.440986473 - 47.699656837 142.471282629 - 47.681159961 142.589783087 -} -851ca04bfffffff -{ - 49.299268176 -150.430756804 - 49.368793189 -150.381427592 - 49.440304183 -150.438485008 - 49.442286738 -150.545132188 - 49.372658624 -150.594436317 - 49.301151122 -150.537118810 -} -85c44813fffffff -{ - -45.976411331 -25.222016595 - -46.055931823 -25.284806948 - -46.136278287 -25.215382512 - -46.137053099 -25.082945708 - -46.057435614 -25.020253486 - -45.977140344 -25.089899224 -} -859e6b8bfffffff -{ - -20.719859523 156.596764782 - -20.630928955 156.570388280 - -20.606559810 156.472771699 - -20.671071808 156.401376059 - -20.760066331 156.427605766 - -20.784485000 156.525378137 -} -85cd641bfffffff -{ - -54.220602514 83.448346513 - -54.130801189 83.401901902 - -54.111167919 83.245863238 - -54.181197777 83.135674595 - -54.271085014 83.181502929 - -54.290856875 83.338137648 -} -850f9aaffffffff -{ - 63.711584343 -94.657047443 - 63.637775980 -94.795805492 - 63.547367831 -94.723311040 - 63.530567159 -94.512948616 - 63.604119189 -94.373894266 - 63.694727891 -94.445494030 -} -85f2993bfffffff -{ - -86.364337000 -77.049140799 - -86.352644694 -75.590055221 - -86.265155472 -75.078678463 - -86.190751177 -75.980671271 - -86.201916104 -77.379033740 - -86.287996063 -77.934437435 +850caadbfffffff +{ + 60.863716578 -170.109683763 + 60.782917467 -170.185579213 + 60.715744662 -170.079171756 + 60.729105894 -169.897231443 + 60.809659093 -169.820699475 + 60.877097080 -169.926740693 +} +85012243fffffff +{ + 70.766063808 28.452289445 + 70.815700951 28.624862013 + 70.891485735 28.552515687 + 70.917392093 28.305924848 + 70.867368206 28.133424204 + 70.791825535 28.207434961 +} +8533ac07fffffff +{ + 31.192117134 176.591283864 + 31.288175696 176.603054850 + 31.344382111 176.511931176 + 31.304422651 176.409073675 + 31.208314312 176.397511631 + 31.152215072 176.488597954 +} +8545631bfffffff +{ + 21.174461629 -94.141280273 + 21.248607134 -94.078520852 + 21.336577177 -94.113639009 + 21.350400195 -94.211654357 + 21.276174597 -94.274447667 + 21.188206151 -94.239191893 +} +85bb0983fffffff +{ + -38.987083900 175.741066199 + -38.904575916 175.690627001 + -38.899820100 175.577148906 + -38.977639105 175.513856146 + -39.060260281 175.564226651 + -39.064949213 175.677959084 +} +8518508bfffffff +{ + 47.794162038 -7.589993645 + 47.735191281 -7.685358757 + 47.646506095 -7.653454317 + 47.616809655 -7.526521077 + 47.675706597 -7.431283088 + 47.764373631 -7.462850966 +} +8503204ffffffff +{ + 89.450436725 -66.270069839 + 89.502024737 -74.476608099 + 89.449993559 -83.035682162 + 89.358592398 -82.110095826 + 89.318350727 -75.043277314 + 89.359851639 -67.743940606 } -85e72317fffffff -{ - -71.265197933 39.288899004 - -71.187493360 39.141329993 - -71.185267842 38.867134488 - -71.260834144 38.738167970 - -71.338936054 38.884760128 - -71.341073932 39.161308841 -} -85a8b1a7fffffff -{ - -22.339860481 -41.885268606 - -22.264131123 -41.833468062 - -22.186735865 -41.881959403 - -22.185088618 -41.982239041 - -22.260837812 -42.034051206 - -22.338214412 -41.985572269 -} -85f1412ffffffff -{ - -83.878768764 23.715353269 - -83.787920690 23.470654650 - -83.765538404 22.641129502 - -83.833495873 22.036034980 - -83.925020053 22.261491273 - -83.947920877 23.111594621 -} -853f264ffffffff -{ - 37.913400133 15.714547591 - 37.819256680 15.717352958 - 37.775539660 15.822766071 - 37.825930818 15.925522368 - 37.920105826 15.922923901 - 37.963858260 15.817362133 -} -8553a9b3fffffff -{ - 22.083350795 39.776722996 - 21.991496520 39.759419195 - 21.933887248 39.833866259 - 21.968037702 39.925575988 - 22.059801057 39.942992584 - 22.117504915 39.868586857 -} -853d76dbfffffff -{ - 35.557771261 82.423102830 - 35.470667434 82.461091131 - 35.455529153 82.574392319 - 35.527409312 82.649965520 - 35.614578169 82.612232178 - 35.629802006 82.498670215 -} -85dd5367fffffff -{ - -57.118559998 -23.042224905 - -57.042883752 -22.958286086 - -56.966377058 -23.044080262 - -56.965301292 -23.213411584 - -57.040745673 -23.297789171 - -57.117497728 -23.212399507 -} -851969b7fffffff -{ - 52.146878580 6.106356711 - 52.068255727 6.120731275 - 52.043567602 6.245487071 - 52.097492363 6.356155330 - 52.176165181 6.342033023 - 52.200863409 6.216989749 -} -85031613fffffff -{ - 84.952864015 -159.917258564 - 84.875380403 -160.509494813 - 84.789311151 -160.062789882 - 84.779663948 -159.045319358 - 84.855779771 -158.443008919 - 84.942903327 -158.867585520 -} -858e9d37fffffff -{ - -15.587526592 -91.549222759 - -15.662209344 -91.610057180 - -15.751327689 -91.572890488 - -15.765781829 -91.474825138 - -15.691080119 -91.413965893 - -15.601943255 -91.451196689 -} -85e398a3fffffff -{ - -65.485197190 -123.336038932 - -65.445976575 -123.149949708 - -65.359568302 -123.151558228 - -65.312413853 -123.338213454 - -65.351488732 -123.523641429 - -65.437863182 -123.523074654 -} -8547023bfffffff -{ - 31.589028286 -172.085527871 - 31.680606233 -172.062173859 - 31.742563589 -172.140332580 - 31.712839056 -172.241903145 - 31.621156798 -172.265100291 - 31.559303341 -172.186884078 -} -85ee2b07fffffff -{ - -73.485402093 -45.240127853 - -73.424032212 -44.975005311 - -73.328027663 -45.028978780 - -73.293255455 -45.344850061 - -73.354151862 -45.609211223 - -73.450291711 -45.558472305 -} -8518d293fffffff -{ - 45.615832374 -19.788994066 - 45.544073084 -19.874269102 - 45.456177433 -19.825566641 - 45.439999267 -19.691850211 - 45.511668819 -19.606548692 - 45.599606163 -19.654989467 -} -8545aad3fffffff -{ - 20.131613437 -81.355281761 - 20.196398873 -81.294551898 - 20.279946100 -81.316428030 - 20.298755704 -81.399174387 - 20.233902340 -81.459994041 - 20.150307364 -81.437977550 -} -8526aca3fffffff -{ - 41.848637523 -102.329232669 - 41.918896029 -102.256793486 - 42.000580726 -102.307649524 - 42.011989276 -102.431103301 - 41.941685515 -102.503518089 - 41.860018509 -102.452503892 -} -85116e67fffffff -{ - 68.688720329 39.175348743 - 68.645389587 39.347624917 - 68.684408268 39.552712780 - 68.766924697 39.586171470 - 68.810410160 39.413260610 - 68.771223798 39.207525549 -} -85575033fffffff -{ - 17.935351455 -30.327616854 - 17.861360853 -30.380841480 - 17.781036467 -30.336486292 - 17.774601924 -30.238990184 - 17.848493723 -30.185685138 - 17.928918866 -30.229956342 -} -85e436d7fffffff -{ - -58.732955699 111.556445685 - -58.659964374 111.433180703 - -58.678669198 111.250454371 - -58.770477787 111.190158828 - -58.843713362 111.313342371 - -58.824895689 111.496905501 -} -850354a3fffffff -{ - 82.774021926 -73.352447648 - 82.816634336 -73.952753198 - 82.772316207 -74.585621478 - 82.686220564 -74.609921646 - 82.644557307 -74.016411276 - 82.688051089 -73.391787684 -} -8591189bfffffff -{ - -14.357014946 -123.365082506 - -14.280980485 -123.362245069 - -14.229581569 -123.423733154 - -14.254166838 -123.488169045 - -14.330270594 -123.491111275 - -14.381719828 -123.429512729 -} -85f2858ffffffff -{ - -85.569121677 -143.126122661 - -85.646670408 -142.529847637 - -85.641016266 -141.340663489 - -85.557825008 -140.791127601 - -85.481696006 -141.406242743 - -85.487340448 -142.553062623 -} -854ccec7fffffff -{ - 16.790494933 -66.953607416 - 16.734851901 -66.999676712 - 16.663662376 -66.962694078 - 16.648187202 -66.879667445 - 16.703874543 -66.833670117 - 16.774992776 -66.870627375 -} -854649bbfffffff -{ - 21.832486596 -156.987876666 - 21.741568782 -157.018662332 - 21.672640904 -156.949203427 - 21.694614584 -156.848933723 - 21.785546321 -156.818069541 - 21.854490506 -156.887553445 -} -85ac1103fffffff -{ - -23.687560399 12.366642783 - -23.597885608 12.378224242 - -23.539832115 12.300956518 - -23.571429587 12.212164474 - -23.661037316 12.200534053 - -23.719114673 12.277744538 -} -85ba15dbfffffff -{ - -34.264233078 -177.830266853 - -34.185537505 -177.777535066 - -34.104875146 -177.830729402 - -34.102898299 -177.936483150 - -34.181504079 -177.989220142 - -34.262176451 -177.936198466 -} -8538344bfffffff -{ - 34.524179083 -5.093887788 - 34.460768405 -5.173751043 - 34.369975579 -5.150500761 - 34.342624753 -5.047621394 - 34.405951820 -4.967864779 - 34.496713198 -4.990880805 -} -85ef242bfffffff -{ - -85.127930208 -77.340353273 - -85.116587626 -76.246702393 - -85.028927633 -75.849931858 - -84.953685420 -76.521501633 - -84.964664987 -77.580605469 - -85.051240938 -78.001959428 -} -850fa927fffffff -{ - 64.995291986 -79.037792752 - 64.938160508 -79.223323091 - 64.841867025 -79.198811459 - 64.802641350 -78.990114344 - 64.859502967 -78.804999751 - 64.955859216 -78.828164616 -} -85328d97fffffff -{ - 41.189150871 170.409914962 - 41.285249128 170.415459242 - 41.336983424 170.306702102 - 41.292534045 170.192516446 - 41.196423897 170.187256088 - 41.144774828 170.295897369 -} -855b4ac7fffffff -{ - 9.700631350 166.611563348 - 9.780614938 166.612036394 - 9.822222024 166.534705626 - 9.783752057 166.456976517 - 9.703773359 166.456641608 - 9.662259596 166.533897680 -} -85da4407fffffff -{ - -56.030840661 157.251899669 - -55.950075002 157.208694326 - -55.930248715 157.052281731 - -55.991146860 156.938670954 - -56.071969530 156.981505732 - -56.091837220 157.138322818 -} -85671a2bfffffff -{ - 12.976864335 -76.273619954 - 12.912550978 -76.325948989 - 12.836126647 -76.288094734 - 12.824075680 -76.197907543 - 12.888438674 -76.145623228 - 12.964802996 -76.183481266 -} -85b61e33fffffff -{ - -26.489566233 -91.832957139 - -26.557265905 -91.896020110 - -26.640821147 -91.857617475 - -26.656703918 -91.756081844 - -26.589005405 -91.692990663 - -26.505422989 -91.731463177 -} -85f19643fffffff -{ - -72.383764442 112.910271144 - -72.316184435 112.698904403 - -72.337621498 112.393733041 - -72.426813065 112.297625934 - -72.494767414 112.508875208 - -72.473154712 112.816360797 -} -85703697fffffff -{ - 7.349601624 -173.597253241 - 7.263927063 -173.616645251 - 7.199791745 -173.555700004 - 7.221289103 -173.475276641 - 7.307021253 -173.455796644 - 7.371198492 -173.516827997 -} -85031673fffffff -{ - 84.592892085 -157.251708272 - 84.517863017 -157.841216958 - 84.430116754 -157.465083976 - 84.416498913 -156.520075288 - 84.490220103 -155.924289936 - 84.578858137 -156.279283309 -} -85eb46b3fffffff -{ - -68.062321214 -157.706733141 - -68.128446598 -157.650407007 - -68.137716754 -157.442024605 - -68.080678155 -157.291227932 - -68.014704874 -157.348745477 - -68.005617307 -157.555872927 -} -85b6c463fffffff -{ - -21.662513469 -92.762429087 - -21.733340139 -92.824398533 - -21.820118168 -92.787064134 - -21.836098295 -92.687689558 - -21.765265047 -92.625688019 - -21.678458274 -92.663093015 -} -85e83223fffffff -{ - -67.348959150 -90.958196153 - -67.353652927 -90.725543334 - -67.278326990 -90.588419407 - -67.198662502 -90.683483043 - -67.194091842 -90.914520187 - -67.269063088 -91.052102021 -} -851684b3fffffff -{ - 49.704644565 157.317169855 - 49.794014911 157.304657286 - 49.828299089 157.175901723 - 49.773173378 157.059955469 - 49.683856846 157.072803388 - 49.649612018 157.201262648 -} -85da830ffffffff -{ - -44.330330295 168.659097583 - -44.245258496 168.610753230 - -44.235296277 168.483270109 - -44.310433383 168.403823805 - -44.395599614 168.452014663 - -44.405534333 168.579805981 -} -858d59d3fffffff -{ - -13.927539168 101.307396329 - -13.849450378 101.285460154 - -13.829963960 101.197861734 - -13.888609882 101.132224913 - -13.966683179 101.154209638 - -13.986126121 101.241782709 -} -85c84467fffffff -{ - -44.629358780 102.257549711 - -44.554049773 102.185241178 - -44.559269005 102.053892513 - -44.639818490 101.994399580 - -44.715311154 102.066524357 - -44.710070615 102.198326948 -} -85ef8567fffffff -{ - -78.996391089 -6.115823382 - -78.902240116 -6.002446278 - -78.836438362 -6.364433675 - -78.864095121 -6.840442324 - -78.957959081 -6.960506078 - -79.024457487 -6.597920012 -} -851cec37fffffff -{ - 46.146650606 -138.278577552 - 46.224126849 -138.242660401 - 46.276070706 -138.310972255 - 46.250515716 -138.415079434 - 46.173090541 -138.450762394 - 46.121169243 -138.382572421 -} -857d3393fffffff -{ - -10.138469597 -19.632605056 - -10.058939319 -19.591406948 - -9.983649595 -19.634546559 - -9.987852463 -19.718952127 - -10.067435811 -19.760235576 - -10.142763210 -19.717028164 -} -85efa2cffffffff -{ - -80.718389774 5.899373645 - -80.622485085 5.912495645 - -80.572849902 5.418715830 - -80.618419536 4.906939247 - -80.714319841 4.883580661 - -80.764662133 5.382230179 -} -852e100ffffffff -{ - 42.030168307 145.767382813 - 42.118971435 145.742909271 - 42.144458681 145.631754137 - 42.081164189 145.545352960 - 41.992468221 145.570018706 - 41.966959539 145.680893919 -} -852b23b7fffffff -{ - 46.922153324 -60.660295561 - 46.888185113 -60.787529612 - 46.798601018 -60.810920552 - 46.743085129 -60.707525188 - 46.776947724 -60.580690999 - 46.866431532 -60.556853062 -} -8524c123fffffff -{ - 38.945120413 108.154049311 - 38.861007267 108.152209133 - 38.824806754 108.238535393 - 38.872561616 108.326750740 - 38.956586220 108.328854811 - 38.992944621 108.242479898 -} -85b0162ffffffff -{ - -27.217977882 -113.170711422 - -27.163352061 -113.089027839 - -27.077397731 -113.102988706 - -27.046041711 -113.198405735 - -27.100530688 -113.280018450 - -27.186512330 -113.266285147 +855369b7fffffff +{ + 25.928747620 53.134803123 + 25.861672296 53.197135262 + 25.869639050 53.291428454 + 25.944766050 53.323570738 + 26.011985069 53.261230070 + 26.003933235 53.166755392 +} +85ae03a7fffffff +{ + -25.714402520 95.987898520 + -25.798331928 96.022919662 + -25.811149459 96.115116511 + -25.740111603 96.172145062 + -25.656286887 96.137099583 + -25.643395379 96.045049691 +} +85221487fffffff +{ + 45.352613130 -163.644815006 + 45.435696999 -163.608127009 + 45.504702425 -163.687295112 + 45.490563529 -163.803315282 + 45.407367657 -163.839855459 + 45.338422681 -163.760523885 +} +8580c673fffffff +{ + 3.245672845 -40.664000869 + 3.327488959 -40.614227065 + 3.411246669 -40.661093994 + 3.413216978 -40.757728490 + 3.331424437 -40.807518447 + 3.247638017 -40.760657895 +} +85e95eb3fffffff +{ + -60.630509178 -98.294904715 + -60.560483116 -98.169308348 + -60.475059298 -98.229465232 + -60.459537328 -98.414641776 + -60.529399467 -98.540423763 + -60.614947278 -98.480845998 +} +85058403fffffff +{ + 70.964893607 117.610787394 + 70.897380059 117.820834646 + 70.922134991 118.102313789 + 71.014653607 118.175875018 + 71.082594709 117.965691091 + 71.057588185 117.682072918 +} +853d8383fffffff +{ + 25.484281150 78.491753683 + 25.406662000 78.529390223 + 25.397613890 78.628513216 + 25.466130597 78.690205953 + 25.543837116 78.652740164 + 25.552939669 78.553410544 +} +85e861affffffff +{ + -55.654528645 -94.204115863 + -55.579546228 -94.101078313 + -55.493122412 -94.161740176 + -55.481545448 -94.325058122 + -55.556390178 -94.428327625 + -55.642949467 -94.368049007 +} +85ac4ab7fffffff +{ + -21.408093924 0.172370610 + -21.495515227 0.148837930 + -21.560802113 0.220643578 + -21.538556199 0.315935392 + -21.451115579 0.339295937 + -21.385940051 0.267536944 +} +8599091bfffffff +{ + -9.035081014 -5.895100387 + -9.109653014 -5.921290941 + -9.169405140 -5.861144270 + -9.154475110 -5.774810298 + -9.079849673 -5.748739326 + -9.020207602 -5.808882595 +} +851aab13fffffff +{ + 45.445303475 -49.371719387 + 45.360092450 -49.416954982 + 45.292246439 -49.341278245 + 45.309523272 -49.220309920 + 45.394741728 -49.174779652 + 45.462676030 -49.250512007 +} +8500615bfffffff +{ + 81.242166318 -9.515045364 + 81.324239376 -9.460499671 + 81.374955144 -9.944752354 + 81.342782859 -10.480291642 + 81.260582305 -10.524816786 + 81.210674475 -10.043857689 +} +85866297fffffff +{ + -11.265611010 78.530493744 + -11.355080621 78.554177795 + -11.382068437 78.646267577 + -11.319563422 78.714559948 + -11.230158764 78.690787559 + -11.203194109 78.598810977 +} +85b53007fffffff +{ + -38.085224341 -152.183843404 + -37.994785244 -152.147607076 + -37.926078572 -152.229646574 + -37.947748442 -152.347933116 + -38.038168018 -152.384358835 + -38.106937344 -152.302308949 +} +852a913bfffffff +{ + 39.178913587 -82.993759545 + 39.126548471 -83.083847936 + 39.043139644 -83.064589832 + 39.012027296 -82.955578752 + 39.064208926 -82.865549812 + 39.147686125 -82.884472098 +} +851c936bfffffff +{ + 44.929383327 -154.162624654 + 45.004865059 -154.118943520 + 45.075622729 -154.179284800 + 45.070874318 -154.283522142 + 44.995276453 -154.327148645 + 44.924543197 -154.266592887 +} +857972affffffff +{ + 6.101987320 -131.289752595 + 6.017513200 -131.324301789 + 5.947428711 -131.272790967 + 5.961793590 -131.186821039 + 6.046176891 -131.152288213 + 6.116286091 -131.203708850 +} +858d2dabfffffff +{ + -17.016866169 108.207049924 + -16.944878424 108.187925804 + -16.929962193 108.104914682 + -16.987089369 108.041034853 + -17.059074753 108.060216151 + -17.073935400 108.143220142 +} +858b2337fffffff +{ + -16.751943789 -64.630602060 + -16.829973753 -64.680166946 + -16.909750130 -64.639288671 + -16.911446132 -64.548884627 + -16.833445294 -64.499415486 + -16.753719331 -64.540254551 +} +85d01b97fffffff +{ + -49.007836549 13.613769461 + -49.095886678 13.601370893 + -49.141768734 13.706342409 + -49.099559469 13.823470407 + -49.011570727 13.835524878 + -48.965729706 13.730795283 +} +85f0f373fffffff +{ + -72.360031648 64.767585071 + -72.268356263 64.769663824 + -72.219114670 64.521459218 + -72.261219471 64.270298611 + -72.352810559 64.265805249 + -72.402382625 64.514883875 +} +85f2954ffffffff +{ + -88.806695673 173.908695946 + -88.895461008 172.813329410 + -88.954547092 176.470577271 + -88.917943960 -178.885975905 + -88.826942709 -178.410253475 + -88.774374300 178.069044206 +} +85b1893bfffffff +{ + -28.468754869 -113.612108085 + -28.413720615 -113.528583788 + -28.326485971 -113.542221257 + -28.294260973 -113.639146246 + -28.349158283 -113.722593295 + -28.436417332 -113.709192743 +} +85cd45a3fffffff +{ + -52.279599437 78.803202540 + -52.190193294 78.770340030 + -52.165784598 78.627273098 + -52.230618471 78.516599543 + -52.320069744 78.548874178 + -52.344642432 78.692411115 +} +859b987bfffffff +{ + -13.993349262 -165.418906835 + -13.909148363 -165.380540117 + -13.838020728 -165.437151662 + -13.851009955 -165.532060058 + -13.935118666 -165.570493033 + -14.006330340 -165.513951577 +} +850ee307fffffff +{ + 54.074479597 -80.251164751 + 54.016664472 -80.382619497 + 53.921198583 -80.362122962 + 53.883485300 -80.210859401 + 53.941080644 -80.079590116 + 54.036608564 -80.099398089 +} +85a38443fffffff +{ + -19.880648823 40.717775986 + -19.786255843 40.718209993 + -19.740431512 40.632731075 + -19.789011721 40.546733339 + -19.883456690 40.546228224 + -19.929269520 40.631791992 +} +8583335bfffffff +{ + -11.951904842 15.407596600 + -11.857589441 15.417681293 + -11.802236011 15.341542803 + -11.841145092 15.255358701 + -11.935391860 15.245223734 + -11.990798215 15.321323061 +} +856e9a6bfffffff +{ + 11.989961809 -106.571443246 + 12.067266094 -106.517056180 + 12.150574687 -106.559685232 + 12.156514514 -106.656779782 + 12.079127401 -106.711128512 + 11.995883320 -106.668421233 +} +85f38c17fffffff +{ + -80.897819743 -172.525168510 + -80.982150321 -172.522478976 + -81.018959589 -172.029231465 + -80.970710662 -171.543944839 + -80.886369218 -171.556144946 + -80.850280834 -172.044131004 +} +8500e51bfffffff +{ + 83.756681347 38.688717947 + 83.806795220 39.360286126 + 83.898059149 39.277790354 + 83.938903225 38.502183418 + 83.887642205 37.823731949 + 83.796698483 37.927658036 +} +85ee514ffffffff +{ + -68.422763778 -44.168645938 + -68.360606297 -43.967796643 + -68.266175904 -44.013726397 + -68.233781307 -44.258620061 + -68.295558808 -44.459092635 + -68.390109568 -44.415053258 +} +85454357fffffff +{ + 23.907862487 -92.443680499 + 23.980503236 -92.379354831 + 24.069002713 -92.413566754 + 24.084871923 -92.512251889 + 24.012157601 -92.576623008 + 23.923647715 -92.542263683 +} +85346087fffffff +{ + 32.434153684 -16.021226283 + 32.361194759 -16.095567181 + 32.270247551 -16.058964199 + 32.252229587 -15.948223477 + 32.325084743 -15.873897478 + 32.416061516 -15.910296992 +} +8586ab93fffffff +{ + -2.255667310 84.243679678 + -2.167343394 84.217134713 + -2.142758477 84.128188275 + -2.206476704 84.065850353 + -2.294730972 84.092403997 + -2.319336670 84.181286986 +} +85235e4ffffffff +{ + 43.321984656 -172.440728287 + 43.411791390 -172.413892511 + 43.476600424 -172.505570466 + 43.451515947 -172.624159020 + 43.361615557 -172.650778697 + 43.296893219 -172.559026451 +} +85bb1caffffffff +{ + -39.711672104 -179.925193070 + -39.633021066 -179.978720019 + -39.632849636 179.911146383 + -39.711415767 179.854298166 + -39.790180385 179.907794547 + -39.790265220 -179.981829871 +} +85618e93fffffff +{ + 13.159543650 80.726340255 + 13.248608692 80.698291346 + 13.267571562 80.607414673 + 13.197526620 80.544660460 + 13.108527118 80.572708476 + 13.089507007 80.663511706 +} +85ee31c7fffffff +{ + -77.204422867 -31.035653867 + -77.126916839 -30.770420732 + -77.037235019 -30.939261213 + -77.024619679 -31.369455951 + -77.101532058 -31.636147170 + -77.191651907 -31.471230148 +} +85cbb677fffffff +{ + -39.042717317 41.833719646 + -38.965121654 41.833690366 + -38.933156837 41.740176823 + -38.978806624 41.646585084 + -39.056432472 41.646529665 + -39.088378432 41.740150742 +} +8575714ffffffff +{ + 3.780924565 0.181482823 + 3.706426905 0.193719843 + 3.668571482 0.265859893 + 3.705180739 0.325872524 + 3.779748337 0.313709520 + 3.817636782 0.241459755 +} +85dcd46bfffffff +{ + -47.370302733 -13.104465529 + -47.456407469 -13.155533168 + -47.529192832 -13.067721144 + -47.515787383 -12.928751360 + -47.429615981 -12.877923375 + -47.356916605 -12.965824757 +} +85aaca4ffffffff +{ + -32.266071880 81.043352876 + -32.356927695 81.073063929 + -32.378942704 81.181346695 + -32.310112656 81.259753236 + -32.219315786 81.229931181 + -32.197289958 81.121813307 +} +85030503fffffff +{ + 87.459217360 -88.832563707 + 87.481810786 -90.812534310 + 87.414197081 -92.259443382 + 87.326861206 -91.728788747 + 87.305820467 -89.854908549 + 87.370625809 -88.409083628 +} +858ee277fffffff +{ + -15.988249122 -84.632147385 + -16.065365422 -84.692451435 + -16.153911721 -84.652639828 + -16.165336550 -84.552484864 + -16.088209160 -84.492192145 + -15.999668059 -84.532042900 +} +85236687fffffff +{ + 36.563357503 -173.247404237 + 36.655667041 -173.223716301 + 36.719033507 -173.308552882 + 36.689992816 -173.417132706 + 36.597585770 -173.440635244 + 36.534316858 -173.355743755 +} +85524d43fffffff +{ + 17.140588239 53.246658207 + 17.059773561 53.222831727 + 17.005995289 53.276310687 + 17.032949335 53.353526924 + 17.113644004 53.377398711 + 17.167504570 53.324009114 +} +85a98923fffffff +{ + -25.083990140 -45.871972044 + -25.012280997 -45.819698379 + -24.936291260 -45.867707116 + -24.932038063 -45.967959294 + -25.003762974 -46.020225666 + -25.079725312 -45.972247307 +} +85d2da07fffffff +{ + -35.416987904 -101.644932187 + -35.350568186 -101.564030210 + -35.260189128 -101.596280828 + -35.236133273 -101.709194176 + -35.302405548 -101.790129996 + -35.392880993 -101.758119125 +} +8500580bfffffff +{ + 86.514750046 -7.437928337 + 86.602182014 -7.239840659 + 86.657937758 -8.490903480 + 86.624120141 -9.921391724 + 86.536243028 -10.051607360 + 86.482582062 -8.819966458 +} +8578e8d7fffffff +{ + -5.607556315 -131.389429516 + -5.686291348 -131.422261622 + -5.746206218 -131.373230610 + -5.727436011 -131.291448614 + -5.648791198 -131.258631006 + -5.588826415 -131.307580812 +} +850ee217fffffff +{ + 55.157578928 -81.376260951 + 55.098281476 -81.509659218 + 55.002687142 -81.485718874 + 54.966316714 -81.329099478 + 55.025388575 -81.195868513 + 55.121055958 -81.219088595 +} +8592c9affffffff +{ + -21.615307119 -103.810919862 + -21.679031525 -103.869773538 + -21.764099350 -103.838847618 + -21.785506894 -103.748974015 + -21.721778225 -103.690041456 + -21.636646273 -103.721061333 +} +85291b53fffffff +{ + 36.343149699 -122.714971515 + 36.426254616 -122.663470872 + 36.500751783 -122.724508074 + 36.492085694 -122.837041107 + 36.408981379 -122.888377887 + 36.334542515 -122.827345788 +} +859a8d8ffffffff +{ + -8.783150207 -170.244169665 + -8.704743935 -170.205225577 + -8.638490343 -170.254859328 + -8.650564971 -170.343353139 + -8.728869643 -170.382335175 + -8.795201254 -170.332785634 +} +858053c3fffffff +{ + 1.008041893 -45.647204043 + 1.090600082 -45.596874246 + 1.174872375 -45.643147633 + 1.176597979 -45.739723711 + 1.094070206 -45.790047743 + 1.009786425 -45.743801599 +} +85dc4b0bfffffff +{ + -48.090907788 -30.568643200 + -48.164584951 -30.637717411 + -48.245946277 -30.574950003 + -48.253602023 -30.442827454 + -48.179827750 -30.373791044 + -48.098494915 -30.436838713 +} +8556cdaffffffff +{ + 5.523749583 -31.346368425 + 5.602356208 -31.299479076 + 5.684415864 -31.345667057 + 5.687923174 -31.438775736 + 5.609324861 -31.485718182 + 5.527210903 -31.439498964 +} +85254a0ffffffff +{ + 49.872093214 109.516102636 + 49.784194702 109.511293393 + 49.738954655 109.615378006 + 49.781455431 109.724326737 + 49.869244315 109.729528501 + 49.914642194 109.625389549 +} +85f17543fffffff +{ + -87.544563056 66.705968917 + -87.495871592 64.891171105 + -87.538098509 63.043601811 + -87.631478258 62.932825340 + -87.682769521 64.814237933 + -87.637981489 66.740266574 +} +85ec201bfffffff +{ + -69.402886000 156.914877559 + -69.392132734 156.683512137 + -69.463382051 156.545618229 + -69.545622503 156.639820391 + -69.556341087 156.872901110 + -69.484853871 157.010056198 +} +8513508bfffffff +{ + 63.239893101 -113.090995482 + 63.154778256 -113.169521948 + 63.079374957 -113.051849601 + 63.088826943 -112.855833730 + 63.173811220 -112.776433745 + 63.249474499 -112.893919370 +} +8565158ffffffff +{ + 5.131905809 103.565106998 + 5.224997431 103.542648627 + 5.251233812 103.450589346 + 5.184329611 103.381010494 + 5.091223617 103.403527968 + 5.065036135 103.495565269 +} +856a249bfffffff +{ + 11.644867706 24.975253566 + 11.555470913 24.970187130 + 11.507367672 25.049976669 + 11.548567845 25.134878172 + 11.637947148 25.140072689 + 11.686143892 25.060237667 +} +856f52dbfffffff +{ + 2.120489544 -118.414322553 + 2.189407211 -118.371735115 + 2.262547590 -118.416832217 + 2.266676953 -118.504532949 + 2.197696144 -118.547038773 + 2.124649069 -118.501925629 +} +85ecf69bfffffff +{ + -67.562791048 136.207905169 + -67.522278281 135.996500610 + -67.574853982 135.799108039 + -67.668230576 135.812681902 + -67.708927257 136.025206604 + -67.656062483 136.223034631 +} +8519693bfffffff +{ + 51.923239532 5.308726002 + 51.844647818 5.323918346 + 51.820694111 5.447922314 + 51.875325761 5.557023241 + 51.953969886 5.542076409 + 51.977930080 5.417782676 +} +85ef1c17fffffff +{ + -81.613985996 -36.999744910 + -81.543630233 -36.549729762 + -81.451722607 -36.743541534 + -81.429662502 -37.376961450 + -81.499101639 -37.827680744 + -81.591511682 -37.644401081 +} +85ad4133fffffff +{ + -30.813971605 3.729615543 + -30.906443211 3.707785358 + -30.970539811 3.788887126 + -30.942070558 3.891733444 + -30.849610274 3.913345559 + -30.785607779 3.832329546 +} +85db4aaffffffff +{ + -59.183582914 160.833346942 + -59.108122857 160.781780892 + -59.094042175 160.614726303 + -59.155389869 160.498751878 + -59.230922043 160.549942036 + -59.245034553 160.717483821 +} +8586816bfffffff +{ + 0.130174724 85.093508045 + 0.219992981 85.066840129 + 0.244263199 84.976747788 + 0.178736960 84.913386824 + 0.088985092 84.940065931 + 0.064693060 85.030094918 +} +85175343fffffff +{ + 58.733262673 166.941760192 + 58.644741351 166.936056060 + 58.600252577 167.086344717 + 58.644020264 167.242724732 + 58.732501225 167.249352605 + 58.777255585 167.098677178 +} +85e4f39bfffffff +{ + -55.391761289 94.181373982 + -55.305666114 94.106245948 + -55.299911501 93.937138493 + -55.380200664 93.842409615 + -55.466465240 93.917045710 + -55.472271410 94.086905001 +} +85e2f28ffffffff +{ + -57.251671237 -124.157869940 + -57.208331992 -124.009312812 + -57.115499239 -124.008684686 + -57.066054401 -124.155957015 + -57.109286087 -124.304080466 + -57.202069776 -124.305364791 +} +85e4460ffffffff +{ + -63.665523040 89.369827870 + -63.575773848 89.288653455 + -63.561713381 89.074987926 + -63.637295987 88.941324937 + -63.727207640 89.021542738 + -63.741374665 89.236384626 +} +85b80b7bfffffff +{ + -27.868004814 126.702398733 + -27.780335160 126.706608632 + -27.738094214 126.628508238 + -27.783396680 126.546203173 + -27.870971888 126.541829905 + -27.913339125 126.619924882 +} +8568e41bfffffff +{ + 5.432964696 120.083359366 + 5.341886853 120.099945731 + 5.311589789 120.183750200 + 5.372427783 120.251031795 + 5.463582393 120.234436819 + 5.493822248 120.150568803 +} +85a3130bfffffff +{ + -16.704892179 43.907459348 + -16.610796261 43.906599201 + -16.565490743 43.823694747 + -16.614295817 43.741557248 + -16.708458583 43.742351588 + -16.753749467 43.825349287 +} +856f8dbbfffffff +{ + 2.551144473 -112.539037378 + 2.621231129 -112.491934723 + 2.695923274 -112.534887108 + 2.700445587 -112.624985003 + 2.630283223 -112.672027519 + 2.555674243 -112.629032447 +} +85d98573fffffff +{ + -50.458669192 146.754549774 + -50.369741619 146.730405601 + -50.335755386 146.594289871 + -50.390621223 146.482080629 + -50.479554210 146.505860363 + -50.513616159 146.642214087 +} +85074d8bfffffff +{ + 61.633448292 -19.642598323 + 61.654941755 -19.799525783 + 61.593889100 -19.925483197 + 61.511554195 -19.894273050 + 61.490270287 -19.737960290 + 61.551112269 -19.612244055 +} +859a5343fffffff +{ + -9.356009112 -177.008826636 + -9.280379584 -176.967491995 + -9.214809027 -177.010282916 + -9.224806828 -177.094303323 + -9.300324672 -177.135644857 + -9.365956322 -177.092959237 } 85176413fffffff { @@ -23618,7492 +25084,9977 @@ 65.825039708 169.930645113 65.876846052 169.740151693 } -85cd1867fffffff -{ - -45.441256641 88.309431336 - -45.358878501 88.262033492 - -45.348082637 88.132296017 - -45.419577010 88.049527304 - -45.502068838 88.096560809 - -45.512952830 88.226728345 -} -85d80583fffffff -{ - -51.443227078 134.880729985 - -51.397013327 134.755010839 - -51.440217874 134.634905738 - -51.529849121 134.640339418 - -51.576199784 134.766441718 - -51.532781913 134.886726710 -} -85032543fffffff -{ - 88.655670592 -2.097954018 - 88.743422853 -1.177216019 - 88.806417525 -4.406541890 - 88.775581514 -8.498780558 - 88.685935811 -8.943305606 - 88.628708893 -5.793766275 -} -850b9137fffffff -{ - 55.978130407 88.547404875 - 55.887153707 88.589154252 - 55.859599408 88.747847397 - 55.922900382 88.865260375 - 56.013903668 88.824107214 - 56.041579725 88.664943933 -} -85860023fffffff -{ - -7.394307079 83.952872064 - -7.479130809 83.978723973 - -7.504339134 84.066552391 - -7.444718505 84.128414391 - -7.359977847 84.102498176 - -7.334774723 84.014784109 -} -856cb327fffffff -{ - 4.968635385 -104.032703546 - 5.040504265 -103.979970213 - 5.118029528 -104.018684155 - 5.123624362 -104.110211642 - 5.051665071 -104.162923213 - 4.974201405 -104.124129226 -} -855cca93fffffff -{ - 3.198880925 -147.881255114 - 3.109675480 -147.913290324 - 3.038521280 -147.851112074 - 3.056519750 -147.756922881 - 3.145679216 -147.724847380 - 3.216886226 -147.787001225 -} -85249ab7fffffff -{ - 34.699541110 98.428425097 - 34.614455189 98.441086846 - 34.587223053 98.536059537 - 34.644929660 98.618499016 - 34.729984885 98.606104128 - 34.757364392 98.511002895 -} -85d7b0dbfffffff -{ - -53.060684638 49.270087589 - -52.980232033 49.305388813 - -52.929871924 49.215281835 - -52.959769611 49.089959110 - -53.040059318 49.054250258 - -53.090614329 49.144270557 -} -85cd215bfffffff -{ - -50.541084268 92.870913869 - -50.456601006 92.807358240 - -50.449948255 92.658458094 - -50.527719819 92.572534967 - -50.612353708 92.635687218 - -50.619065572 92.785167575 -} -85dd018ffffffff -{ - -62.635232285 -16.778620438 - -62.551366021 -16.696816975 - -62.476230031 -16.818251581 - -62.484650371 -17.021150794 - -62.568294957 -17.103806741 - -62.643741245 -16.982715680 -} -85348dc3fffffff -{ - 29.251739112 -31.452118694 - 29.170769519 -31.511220376 - 29.085140420 -31.460012466 - 29.080382096 -31.349801931 - 29.161266336 -31.290588902 - 29.246994260 -31.341697351 -} -8514c6c3fffffff -{ - 51.209400856 136.032033889 - 51.136897311 136.098703467 - 51.132473964 136.240284958 - 51.200543738 136.315783490 - 51.273247770 136.249439188 - 51.277681575 136.107269425 -} -85d7b363fffffff -{ - -51.595397653 48.279919296 - -51.516794818 48.315640666 - -51.467473719 48.231443599 - -51.496568579 48.111619105 - -51.575010762 48.075537274 - -51.624518802 48.159639322 -} -85f063affffffff -{ - -78.610008972 29.125531692 - -78.522053170 28.951729391 - -78.506721088 28.495027723 - -78.579217357 28.205747088 - -78.667667606 28.374825072 - -78.683128786 28.837966278 -} -8541295bfffffff -{ - 18.813904857 112.207905845 - 18.904385312 112.188324970 - 18.936319257 112.098586368 - 18.877718186 112.028425249 - 18.787176189 112.048082064 - 18.755296780 112.137824092 -} -85b25c1bfffffff -{ - -31.632926478 -65.253427853 - -31.705506930 -65.306258756 - -31.772849154 -65.263003881 - -31.767596734 -65.166959461 - -31.695056243 -65.114233461 - -31.627728236 -65.157446864 -} -8540b313fffffff -{ - 33.383452817 114.286498364 - 33.462492487 114.266924546 - 33.496979711 114.174442164 - 33.452402239 114.101523037 - 33.373311434 114.121182556 - 33.338849193 114.213675525 -} -85164533fffffff -{ - 55.596452025 178.904614197 - 55.679848769 178.924895949 - 55.734593192 178.798550734 - 55.705842647 178.651958443 - 55.622397622 178.632083070 - 55.567751198 178.758392941 -} -85640263fffffff -{ - 11.414466463 96.364703290 - 11.508635982 96.339340926 - 11.534188952 96.243395791 - 11.465561058 96.172857110 - 11.371401558 96.198264414 - 11.345859878 96.294165572 -} -852d040bfffffff -{ - 41.441350874 32.868333467 - 41.350795726 32.853658469 - 41.293359787 32.952644406 - 41.326415501 33.066308264 - 41.416921962 33.081185679 - 41.474421521 32.982197091 -} -8500cedbfffffff -{ - 86.061312175 88.868618514 - 86.036785110 90.160937129 - 86.102304257 91.153392335 - 86.194215640 90.855489168 - 86.219718641 89.513676765 - 86.152305276 88.520369878 -} -85484b3bfffffff -{ - 32.380563635 -118.516971222 - 32.464185763 -118.462906890 - 32.544110539 -118.520309271 - 32.540350495 -118.631801410 - 32.456710685 -118.685733107 - 32.376848575 -118.628305607 -} -8580c297fffffff -{ - 3.668175783 -41.091488773 - 3.749849474 -41.041680321 - 3.833429542 -41.088484101 - 3.835364283 -41.185088302 - 3.753715923 -41.234911025 - 3.670107494 -41.188115415 -} -850e99affffffff -{ - 55.314753130 -93.743464651 - 55.243807742 -93.853005991 - 55.153161633 -93.798961774 - 55.133291862 -93.635928260 - 55.204017358 -93.526231479 - 55.294832297 -93.579721550 -} -85dd0487fffffff -{ - -64.295671839 -14.356134290 - -64.209423084 -14.277412422 - -64.135780681 -14.413597972 - -64.148055823 -14.628235252 - -64.234094060 -14.708004577 - -64.308068204 -14.572094508 -} -852a5207fffffff -{ - 34.779560510 -70.262397585 - 34.740097467 -70.355983359 - 34.661344821 -70.358877966 - 34.622073267 -70.268483709 - 34.661397890 -70.175069771 - 34.740132216 -70.171878334 -} -8504cb87fffffff -{ - 67.045664547 171.674687357 - 66.951843301 171.647400422 - 66.897250470 171.841823621 - 66.936121310 172.063990431 - 67.029828940 172.092961329 - 67.084780530 171.898084661 -} -85e6b2c3fffffff -{ - -57.066251447 30.914463308 - -56.993408984 30.853191290 - -56.976322474 30.703104291 - -57.032054893 30.613595954 - -57.105102357 30.674404240 - -57.122212480 30.825186691 -} -8564da6bfffffff -{ - 20.004229626 88.922755231 - 20.093745356 88.894919103 - 20.114255897 88.797305947 - 20.045278620 88.727594025 - 19.955790962 88.755455040 - 19.935252459 88.853003223 -} -85e1a2abfffffff -{ - -60.343178119 77.907705310 - -60.250212441 77.869191585 - -60.221217353 77.691062794 - -60.284998123 77.550731790 - -60.378007430 77.588311732 - -60.407192952 77.767158025 -} -855b18cbfffffff -{ - 10.335060242 176.126858366 - 10.415282488 176.135782629 - 10.459279998 176.063255226 - 10.422945045 175.981829360 - 10.342686127 175.973037120 - 10.298798710 176.045538631 -} -85f10bdbfffffff -{ - -83.679628231 88.447238504 - -83.663359254 87.639086013 - -83.730598193 87.136508175 - -83.815223956 87.446641590 - -83.831743965 88.274806894 - -83.763381665 88.772508726 -} -851ba047fffffff -{ - 55.245097275 -56.269121072 - 55.217003458 -56.427150445 - 55.124690657 -56.466449174 - 55.060618014 -56.348333758 - 55.088632282 -56.190959659 - 55.180798433 -56.151047453 -} -852ecdbbfffffff -{ - 43.241526118 133.317077260 - 43.320545724 133.280921646 - 43.332376765 133.179712497 - 43.265267195 133.114925252 - 43.186370890 133.151169731 - 43.174460910 133.252113042 -} -85ed76c3fffffff -{ - -69.825765218 169.232421449 - -69.831337947 169.011041249 - -69.908143532 168.923246609 - -69.979508165 169.058101642 - -69.973771878 169.281045857 - -69.896835110 169.367564241 -} -8596852ffffffff -{ - -7.030901540 32.470881650 - -6.934860234 32.474570817 - -6.883145471 32.392265536 - -6.927435564 32.306228288 - -7.023488936 32.302472388 - -7.075240231 32.384820460 -} -852ce02bfffffff -{ - 39.024084785 50.967791903 - 38.953357058 51.046053004 - 38.969284161 51.160014339 - 39.056053196 51.195972873 - 39.126929520 51.117674639 - 39.110888013 51.003454595 -} -852058a7fffffff -{ - 46.996513450 85.409473367 - 46.904611519 85.450066294 - 46.882901433 85.585089775 - 46.952987505 85.679876970 - 47.044931168 85.639680201 - 47.066747256 85.504299390 -} -85f2a3d7fffffff -{ - -85.073501179 -157.382208783 - -85.159103467 -157.096118469 - -85.176024343 -156.053910995 - -85.106604134 -155.329349096 - -85.021774158 -155.643514125 - -85.005576862 -156.654746594 -} -8500c5abfffffff -{ - 85.764694300 61.526894164 - 85.783321426 62.733068517 - 85.872062454 63.135421634 - 85.943146111 62.292114855 - 85.923735069 61.041150181 - 85.834045398 60.679292682 +852ba133fffffff +{ + 47.286465556 -71.249416110 + 47.240428858 -71.371024217 + 47.148283530 -71.372666339 + 47.102192534 -71.253210516 + 47.148059244 -71.131882263 + 47.240186535 -71.129730088 } -856e2877fffffff -{ - 4.810817096 -118.863837438 - 4.882599161 -118.820709060 - 4.957949957 -118.866911757 - 4.961422705 -118.956257621 - 4.889580251 -118.999299350 - 4.814325388 -118.953082021 -} -8505601bfffffff -{ - 85.590361891 142.196449261 - 85.503081380 142.656418785 - 85.488655419 143.861674678 - 85.560984024 144.648798454 - 85.649428289 144.222292029 - 85.664394788 142.974211834 -} -85e15057fffffff -{ - -63.565160758 57.128580690 - -63.475096778 57.154632661 - -63.421664642 57.004638986 - -63.458040365 56.828475695 - -63.547953735 56.801417968 - -63.601642495 56.951526815 -} -858f1277fffffff -{ - -2.663944361 -87.151299692 - -2.740671488 -87.209601048 - -2.828708234 -87.172169541 - -2.839998750 -87.076391469 - -2.763227318 -87.018088222 - -2.675209710 -87.055564803 -} -859122d7fffffff -{ - -17.112922575 -126.149609872 - -17.032556188 -126.144243296 - -16.979111590 -126.209304040 - -17.005981525 -126.279846773 - -17.086418360 -126.285333724 - -17.139914861 -126.220157480 -} -85005dd7fffffff -{ - 85.238728511 -13.325895747 - 85.325567004 -13.294873980 - 85.372903982 -14.260578559 - 85.331971000 -15.240600573 - 85.245113590 -15.235204209 - 85.199182209 -14.286259124 -} -85e6408ffffffff -{ - -65.020702198 3.304444140 - -64.929824398 3.319179870 - -64.876044989 3.138247134 - -64.912845942 2.941998193 - -65.003713893 2.925837130 - -65.057791813 3.107349330 -} -85dc086ffffffff -{ - -52.664458056 -19.992707291 - -52.742208621 -20.057054061 - -52.816382550 -19.971177979 - -52.812730993 -19.820745485 - -52.734893530 -19.756594990 - -52.660794501 -19.842679669 -} -8507410ffffffff -{ - 63.527416617 -19.115456322 - 63.550897214 -19.282652404 - 63.490621202 -19.418403397 - 63.407081889 -19.386665931 - 63.383821424 -19.220160676 - 63.443880746 -19.084703289 -} -85c0314bfffffff -{ - -33.322048301 -13.055388837 - -33.412776016 -13.097732871 - -33.488711291 -13.024791446 - -33.473822039 -12.909444275 - -33.383019245 -12.867265649 - -33.307180715 -12.940268349 -} -858e5043fffffff -{ - -14.972758756 -80.718997996 - -15.051075623 -80.778005309 - -15.139121265 -80.737343418 - -15.148830477 -80.637651057 - -15.070506258 -80.578675357 - -14.982480203 -80.619360245 -} -85f07447fffffff -{ - -80.205334409 48.832616223 - -80.134696674 48.478143419 - -80.150271527 47.962888353 - -80.236841912 47.794153397 - -80.308232557 48.147737294 - -80.292296092 48.671022227 -} -85069277fffffff -{ - 75.248931483 -66.570181527 - 75.211943448 -66.902369076 - 75.121265488 -66.931528315 - 75.067667740 -66.631971784 - 75.104334013 -66.302186355 - 75.194917575 -66.269563193 -} -85a44573fffffff -{ - -23.081837413 -19.722308881 - -23.166673134 -19.765619475 - -23.241206688 -19.707258298 - -23.230809960 -19.605492305 - -23.145867791 -19.562273033 - -23.071428803 -19.620728110 -} -85b8d8abfffffff -{ - -21.265598182 125.677493581 - -21.182976632 125.682334745 - -21.146032409 125.611690711 - -21.191582303 125.536215300 - -21.274118636 125.531239037 - -21.311190343 125.601873128 -} -85eee2a3fffffff -{ - -69.225772514 -32.686534324 - -69.150719485 -32.515239461 - -69.060735012 -32.613356420 - -69.045533093 -32.881171402 - -69.120193845 -33.052916860 - -69.210448065 -32.956407141 -} -85f1448bfffffff -{ - -86.576913970 34.447185326 - -86.493316164 33.753624148 - -86.487792777 32.258214864 - -86.565645129 31.386090049 - -86.650946117 32.036125029 - -86.656700147 33.604062701 -} -85cb4343fffffff -{ - -34.458537737 59.583368670 - -34.551321076 59.595915771 - -34.591255755 59.698983289 - -34.538342035 59.789441096 - -34.445521174 59.776718886 - -34.405651452 59.673713965 -} -85ce147bfffffff -{ - -45.116706215 -74.327232905 - -45.036498167 -74.282054896 - -44.963492186 -74.352188397 - -44.970541775 -74.467509284 - -45.050718160 -74.513006418 - -45.123876805 -74.442864083 -} -8502accffffffff -{ - 76.394172742 -124.237071559 - 76.360179097 -124.591892568 - 76.271887796 -124.662809971 - 76.217850830 -124.382943611 - 76.251559045 -124.031576487 - 76.339587259 -123.956640359 -} -8581aed7fffffff -{ - -10.391567628 -36.778997074 - -10.308499129 -36.729117361 - -10.225144875 -36.776967337 - -10.224848645 -36.874707473 - -10.307931678 -36.924621121 - -10.391296401 -36.876760839 -} -855d2a63fffffff -{ - 21.321323192 -150.683884198 - 21.230933673 -150.717405190 - 21.158865686 -150.649336962 - 21.177171778 -150.547759595 - 21.267550251 -150.514181178 - 21.339633725 -150.582237388 -} -85069e77fffffff -{ - 73.186255070 -63.213328047 - 73.153266647 -63.513685837 - 73.061736595 -63.556170973 - 73.003324826 -63.300942625 - 73.036065562 -63.002703372 - 73.127464133 -62.957582161 -} -856c6137fffffff -{ - 4.812655363 -86.774672146 - 4.739289919 -86.831607601 - 4.655790769 -86.794899500 - 4.645688119 -86.701214010 - 4.719109326 -86.644278502 - 4.802577380 -86.681028411 -} -851b9abbfffffff -{ - 48.912464093 -57.263241900 - 48.882493322 -57.397521761 - 48.792848422 -57.429011008 - 48.733301211 -57.326677137 - 48.763189817 -57.192864994 - 48.852707549 -57.160920040 -} -8520a0dbfffffff -{ - 40.064476160 67.589250075 - 39.980804400 67.652235581 - 39.980080975 67.778432718 - 40.063041316 67.841991896 - 40.146847857 67.779168713 - 40.147559257 67.652623242 -} -8545810bfffffff -{ - 20.993616166 -80.340148376 - 21.057377308 -80.279347082 - 21.140832039 -80.300324123 - 21.160578763 -80.382243384 - 21.096753834 -80.443138627 - 21.013246024 -80.422020652 -} -85b54c37fffffff -{ - -32.193039612 -167.437429442 - -32.106321682 -167.390771417 - -32.027615929 -167.455515096 - -32.035579102 -167.566805230 - -32.122216725 -167.613541571 - -32.200971485 -167.548909824 -} -85492a43fffffff -{ - 16.363016721 -110.323515232 - 16.443342147 -110.269595271 +851c0393fffffff +{ + 49.695860931 -143.119069609 + 49.769669606 -143.088655509 + 49.813296794 -143.158590809 + 49.783108132 -143.258783850 + 49.726632463 -143.300766021 + 49.674371445 -143.225045441 + 49.675784670 -143.185830935 +} +85b04b33fffffff +{ + -17.409129985 -121.774641504 + -17.365426368 -121.700701415 + -17.292704817 -121.702970991 + -17.263697832 -121.779012061 + -17.307297766 -121.852853466 + -17.380008204 -121.850752456 +} +85032203fffffff +{ + 89.216837672 -120.510250043 + 89.187290179 -126.718488518 + 89.094153241 -127.596828652 + 89.033756948 -123.340062446 + 89.058915716 -118.065326635 + 89.148284924 -116.201950957 +} +85f172affffffff +{ + -85.997016754 71.980791403 + -85.955961667 70.805967331 + -86.005780375 69.743674500 + -86.098363490 69.837031916 + -86.140768389 71.045941194 + -86.089204781 72.127055643 +} +857d04cffffffff +{ + -9.816268300 -21.042590435 + -9.736154483 -21.000438378 + -9.659781851 -21.044234066 + -9.663485551 -21.130246645 + -9.743649127 -21.172481848 + -9.820059236 -21.128621383 +} +850f9103fffffff +{ + 66.162200855 -94.641683095 + 66.088370722 -94.793370641 + 65.998601320 -94.714175323 + 65.982449708 -94.484355708 + 66.056004586 -94.332315415 + 66.145985930 -94.410441470 +} +8539536ffffffff +{ + 37.397992543 1.484574957 + 37.308851155 1.500521769 + 37.278964902 1.601713543 + 37.338242770 1.687168533 + 37.427474216 1.671372283 + 37.457337784 1.569970183 +} +85ece5b7fffffff +{ + -72.934905869 138.128185206 + -72.899878747 137.853605848 + -72.955550763 137.606012299 + -73.046603151 137.632437550 + -73.081851633 137.908989908 + -73.025824877 138.157136927 +} +85a25343fffffff +{ + -22.809886710 55.751300492 + -22.903639759 55.759483082 + -22.942895902 55.849120493 + -22.888305826 55.930545165 + -22.794497696 55.922221753 + -22.755334647 55.832614528 +} +859868c3fffffff +{ + -14.862959109 2.438164984 + -14.943699198 2.418619679 + -15.004677344 2.485990341 + -14.984805146 2.572853581 + -14.904048922 2.592247860 + -14.843180891 2.524930011 +} +8507136ffffffff +{ + 74.019959233 -17.583418020 + 74.052321707 -17.853587739 + 73.997133894 -18.079991745 + 73.909890024 -18.035316728 + 73.877828541 -17.766893450 + 73.932711474 -17.541402954 +} +85269a4ffffffff +{ + 37.043083189 -110.303622866 + 37.121732248 -110.239685423 + 37.203649187 -110.294785743 + 37.206875416 -110.413914811 + 37.128189229 -110.477764612 + 37.046313954 -110.422573376 +} +85bc89bbfffffff +{ + -26.763007526 32.653176810 + -26.671012161 32.657108961 + -26.623163774 32.567619766 + -26.667311388 32.474146884 + -26.759320752 32.470135823 + -26.807168593 32.559676546 +} +8508207bfffffff +{ + 65.597303387 7.067819873 + 65.643842077 6.958046518 + 65.615781798 6.793868439 + 65.541209441 6.740369538 + 65.494897012 6.850298915 + 65.522930822 7.013574172 +} +85458ed3fffffff +{ + 21.478702500 -80.077620630 + 21.542125119 -80.016667720 + 21.625668278 -80.037457652 + 21.645843863 -80.119342172 + 21.582359239 -80.180390514 + 21.498761088 -80.159458894 +} +8542343bfffffff +{ + 26.161168476 58.959464621 + 26.090225840 59.018116198 + 26.094528178 59.116830961 + 26.169830406 59.157102046 + 26.240916606 59.098487753 + 26.236556899 58.999564745 +} +85e29c37fffffff +{ + -59.552923000 -116.392510628 + -59.501267451 -116.241451934 + -59.409485316 -116.259163492 + -59.369350032 -116.427182281 + -59.420856252 -116.577927951 + -59.512646618 -116.560968276 +} +85285927fffffff +{ + 45.614329266 -134.453152849 + 45.692697797 -134.412068061 + 45.748743851 -134.480613052 + 45.726389520 -134.590144354 + 45.648059937 -134.630996345 + 45.592045685 -134.562549967 +} +8508930ffffffff +{ + 57.995281116 21.301586148 + 57.921871784 21.297932744 + 57.884564017 21.433891595 + 57.920596453 21.573684658 + 57.994004651 21.577701107 + 58.031381752 21.441561485 +} +856331abfffffff +{ + 17.419370673 56.376014030 + 17.357819933 56.428998540 + 17.360609774 56.513980727 + 17.425003622 56.546129900 + 17.486680374 56.493158056 + 17.483837157 56.408024165 +} +8561117bfffffff +{ + 8.082968127 81.040806605 + 8.172955658 81.013212932 + 8.194185233 80.923542431 + 8.125477699 80.861536593 + 8.035562960 80.889130286 + 8.014282962 80.978729902 +} +859565dbfffffff +{ + -0.403213815 125.766877095 + -0.496535962 125.783455625 + -0.530098211 125.870819082 + -0.470310182 125.941655869 + -0.376927023 125.925077947 + -0.343392877 125.837662564 +} +85015ca3fffffff +{ + 78.156066474 6.570258471 + 78.229459761 6.724108369 + 78.296408419 6.456118192 + 78.289334007 6.032936408 + 78.215537660 5.883026924 + 78.149216967 6.152316262 +} +85ebad3bfffffff +{ + -61.365906691 -165.051501084 + -61.305573952 -164.984597693 + -61.247491120 -165.084411039 + -61.249660998 -165.250918597 + -61.309923119 -165.318030663 + -61.368086001 -165.218427693 +} +85b58a5bfffffff +{ + -27.982711584 -149.196563739 + -27.889707530 -149.166661490 + -27.820060865 -149.242186982 + -27.843340889 -149.347646293 + -27.936332817 -149.377713530 + -28.006056946 -149.302156670 +} +85f08b2bfffffff +{ + -70.403422472 70.334744888 + -70.310561819 70.312089028 + -70.268573769 70.070505574 + -70.319160389 69.850492628 + -70.412003703 69.871100879 + -70.454279044 70.113770304 +} +85318e93fffffff +{ + 38.963288343 116.269877052 + 38.884412033 116.256544083 + 38.844939715 116.328021794 + 38.884198681 116.412809036 + 38.962958867 116.426346779 + 39.002576239 116.354892862 +} +85db3167fffffff +{ + -55.880901223 -178.843637337 + -55.815222402 -178.914059021 + -55.824876841 -179.055888824 + -55.900275774 -179.127697903 + -55.966044870 -179.057312387 + -55.956324677 -178.915080749 +} +858ca02bfffffff +{ + -4.099014273 108.324453280 + -4.012615163 108.304532841 + -3.990402825 108.217931757 + -4.054659624 108.151258621 + -4.141077387 108.171241532 + -4.163219770 108.257835156 +} +8514766bfffffff +{ + 57.581426928 132.319111546 + 57.505414559 132.409490157 + 57.506080218 132.581606783 + 57.582785003 132.664212559 + 57.659051795 132.574218307 + 57.658359286 132.401230944 +} +8534f057fffffff +{ + 28.799396747 -29.155232788 + 28.719413196 -29.216398015 + 28.632847971 -29.167455765 + 28.626174307 -29.057462966 + 28.706065324 -28.996204407 + 28.792722524 -29.045031580 +} +85e9a413fffffff +{ + -72.423222148 -106.597399583 + -72.452310961 -106.323260377 + -72.392802902 -106.090897054 + -72.304618724 -106.133370710 + -72.275874543 -106.405606427 + -72.334971731 -106.637265817 +} +85a46dcbfffffff +{ + -21.726751139 -16.952003848 + -21.811938820 -16.992493301 + -21.884910493 -16.932162009 + -21.872591970 -16.831267260 + -21.787306630 -16.790883206 + -21.714437450 -16.851288193 +} +850248abfffffff +{ + 71.531850356 -77.266026865 + 71.478573701 -77.514333090 + 71.384972468 -77.489922348 + 71.344590729 -77.219548754 + 71.397531424 -76.972098294 + 71.491188262 -76.994162548 +} +85ee928bfffffff +{ + -68.769978080 -0.127244684 + -68.676842069 -0.094482049 + -68.618045747 -0.300245922 + -68.652023319 -0.539361788 + -68.745096710 -0.574084040 + -68.804256567 -0.367734320 +} +85db23d7fffffff +{ + -57.641754617 -179.075045126 + -57.577785925 -179.147881313 + -57.587995546 -179.295258099 + -57.662234105 -179.370231604 + -57.726292975 -179.297438057 + -57.716023021 -179.149627380 +} +8542840ffffffff +{ + 19.768893100 62.460368866 + 19.702132323 62.511022325 + 19.702774635 62.602251440 + 19.770208780 62.643007327 + 19.837097119 62.592407813 + 19.836423685 62.500998179 +} +85eb502bfffffff +{ + -66.939440791 -162.659008735 + -67.004753545 -162.623421674 + -67.019365747 -162.433363007 + -66.968452834 -162.279876250 + -66.903234713 -162.316603633 + -66.888834045 -162.505680263 +} +853d46cbfffffff +{ + 35.477344688 86.246915848 + 35.389946486 86.278946191 + 35.371468281 86.389138000 + 35.440282578 86.467534270 + 35.527722823 86.435773701 + 35.546306921 86.325346729 +} +85f19c47fffffff +{ + -74.599817475 102.921104601 + -74.523687284 102.723409490 + -74.529387938 102.369788182 + -74.611271495 102.210578140 + -74.687794390 102.406979963 + -74.682040611 102.763907185 +} +85f10527fffffff +{ + -84.864438001 117.626730738 + -84.893399595 116.679487991 + -84.978947676 116.522228354 + -85.035938179 117.342200838 + -85.005915143 118.312831432 + -84.919983476 118.439812737 +} +856b934ffffffff +{ + 4.683730769 16.437527185 + 4.769778335 16.446626705 + 4.815192047 16.374817514 + 4.774635185 16.293938844 + 4.688642811 16.284793891 + 4.643152051 16.356572977 +} +850a48cffffffff +{ + 73.314371116 102.792785604 + 73.266143831 103.077402880 + 73.312635107 103.360156887 + 73.407787926 103.359786897 + 73.456398618 103.073413335 + 73.409470760 102.789167559 +} +8522cb4bfffffff +{ + 55.980556919 -174.014471931 + 56.060893544 -173.983573758 + 56.121599261 -174.099492959 + 56.101877561 -174.246398213 + 56.021468000 -174.276949740 + 55.960852919 -174.160943619 +} +85556daffffffff +{ + 18.952025951 -1.664894411 + 18.865276282 -1.649575071 + 18.829466324 -1.567554949 + 18.880411045 -1.500707539 + 18.967266778 -1.515935791 + 19.003071720 -1.598102717 +} +853e1a27fffffff +{ + 23.973415171 23.414432981 + 23.876565561 23.410144723 + 23.824777951 23.499927548 + 23.869762846 23.594065624 + 23.966603478 23.598514513 + 24.018468321 23.508664735 +} +850fb397fffffff +{ + 68.873938100 -92.478890443 + 68.802436358 -92.655470082 + 68.712520769 -92.574965927 + 68.693895573 -92.319301595 + 68.765086880 -92.142419028 + 68.855213185 -92.221495818 +} +85436caffffffff +{ + 37.575265509 62.331650748 + 37.495716160 62.398258135 + 37.500137785 62.517926260 + 37.584156209 62.571297050 + 37.663853093 62.504781477 + 37.659383928 62.384802649 +} +85cb5667fffffff +{ + -35.757973605 55.675892303 + -35.849226744 55.684974518 + -35.892000523 55.785152539 + -35.843452491 55.876211083 + -35.752145578 55.866952816 + -35.709440379 55.766812109 +} +85072d6ffffffff +{ + 67.958234558 -9.179989067 + 67.995214100 -9.354207550 + 67.947844901 -9.530383875 + 67.863671210 -9.531528594 + 67.826965255 -9.357850457 + 67.874160142 -9.182486212 +} +85836b83fffffff +{ + -11.970857121 2.649376816 + -11.884062283 2.662643089 + -11.829833423 2.600210673 + -11.851515842 2.549789774 + -11.857545473 2.521840243 + -11.934710713 2.503028194 + -11.993803510 2.568177631 + -11.981683728 2.624128288 +} +8506c22ffffffff +{ + 65.665280668 -51.036092261 + 65.647516765 -51.256770007 + 65.557758187 -51.328104091 + 65.485976104 -51.179777046 + 65.503689095 -50.960440496 + 65.593234722 -50.888095275 +} +85dd6c63fffffff +{ + -59.902862417 -34.604606320 + -59.834023043 -34.482214153 + -59.748292163 -34.543940864 + -59.731216068 -34.727260072 + -59.799761077 -34.849799036 + -59.885676110 -34.788875188 +} +8512a927fffffff +{ + 54.573872126 -121.734264510 + 54.492197892 -121.771552100 + 54.425924862 -121.670179965 + 54.441117824 -121.531436066 + 54.522750640 -121.493571899 + 54.589232308 -121.595027220 +} +85279d93fffffff +{ + 46.261442857 -106.180842450 + 46.330298169 -106.107346289 + 46.368315111 -106.135848424 + 46.407275858 -106.167755932 + 46.413426890 -106.295046705 + 46.344528675 -106.368477136 + 46.268552176 -106.311302848 +} +850d0a0bfffffff +{ + 69.201376938 -155.376194505 + 69.128567395 -155.536658846 + 69.045942104 -155.446902754 + 69.035913017 -155.198193964 + 69.108337605 -155.037407190 + 69.191175407 -155.125642954 +} +85f38c73fffffff +{ + -81.282721996 -173.019879367 + -81.367449957 -173.022151969 + -81.405182014 -172.508197542 + -81.357419526 -171.997595188 + -81.272667297 -172.005745585 + -81.235694451 -172.514083622 +} +85bf25d3fffffff +{ + -43.982911836 164.214848169 + -43.894986519 164.171235793 + -43.879812458 164.042630204 + -43.952567297 163.957336791 + -44.040575011 164.000754450 + -44.055745558 164.129660882 +} +85d54ac3fffffff +{ + -50.388162178 -172.440353338 + -50.318362449 -172.379121211 + -50.245171631 -172.452113914 + -50.241751794 -172.586121606 + -50.311486955 -172.647418887 + -50.384706502 -172.574643947 +} +8512e0d3fffffff +{ + 54.786860252 -116.712259891 + 54.705352878 -116.763068683 + 54.633718723 -116.667334585 + 54.643370895 -116.520816136 + 54.724796376 -116.469454533 + 54.796651932 -116.565162747 +} +85950d13fffffff +{ + -4.876219098 122.574049782 + -4.966786250 122.590489699 + -5.001070988 122.675101634 + -4.944760452 122.743331288 + -4.854120302 122.726886787 + -4.819863674 122.642217156 +} +85f0481bfffffff +{ + -74.785046086 29.516551017 + -74.698157049 29.384363878 + -74.682367393 29.042409795 + -74.753389064 28.829060737 + -74.840671313 28.958660924 + -74.856539490 29.304221637 +} +85e9b083fffffff +{ + -74.744005491 -99.856854944 + -74.764892869 -99.522874146 + -74.696895571 -99.279261037 + -74.608511608 -99.369714854 + -74.587925708 -99.700576423 + -74.655424292 -99.944086031 +} +8573853bfffffff +{ + 4.191430977 130.437954278 + 4.096235078 130.454490539 + 4.062940899 130.544708043 + 4.124862704 130.618429739 + 4.220097049 130.601902277 + 4.253371192 130.511644249 +} +85dc6c3bfffffff +{ + -52.703516678 -32.720958182 + -52.638794995 -32.627462661 + -52.560877061 -32.680820569 + -52.547514361 -32.827197401 + -52.611994500 -32.920827270 + -52.690078639 -32.867947648 +} +8516610bfffffff +{ + 57.395378384 178.575895999 + 57.311389789 178.537831381 + 57.256245383 178.658699244 + 57.284817654 178.817654194 + 57.368659954 178.856442666 + 57.424076726 178.735554199 +} +8578c333fffffff +{ + -8.043685889 -133.375728304 + -8.121183341 -133.408282362 + -8.179370547 -133.358074798 + -8.160114791 -133.275388141 + -8.082701256 -133.242842786 + -8.024459589 -133.292975296 +} +8530ea8ffffffff +{ + 36.615614093 129.147237561 + 36.692230305 129.112085637 + 36.705119986 129.025612855 + 36.641480584 128.974491343 + 36.564995069 129.009686483 + 36.552018359 129.095960201 +} +851699bbfffffff +{ + 45.950951254 160.972782208 + 46.043975122 160.965835822 + 46.084398853 160.844783775 + 46.031745665 160.730912126 + 45.938761122 160.738172792 + 45.898390247 160.858991074 +} +85034693fffffff +{ + 82.282494027 -61.960116815 + 82.255662901 -62.579956012 + 82.172830646 -62.675924802 + 82.117089004 -62.162968888 + 82.143398390 -61.552287576 + 82.225964770 -61.445482398 +} +85d56357fffffff +{ + -54.008604529 -172.116489566 + -53.942862618 -172.052053998 + -53.872911227 -172.129626536 + -53.868664735 -172.271395584 + -53.934342266 -172.335907668 + -54.004330644 -172.258574929 +} +85c72863fffffff +{ + -44.107972847 -145.260119081 + -44.020437881 -145.229369394 + -43.961523207 -145.320244183 + -43.990091959 -145.441952898 + -44.077636652 -145.472947069 + -44.136602992 -145.381988276 +} +8500c4cbfffffff +{ + 83.938817381 66.555927866 + 83.949103524 67.412188434 + 84.034835261 67.760345571 + 84.111107151 67.235744798 + 84.100456948 66.356429507 + 84.013905535 66.025164534 +} +85a8aa37fffffff +{ + -20.410842189 -44.843646471 + -20.334522148 -44.791772195 + -20.254821350 -44.839649883 + -20.251464040 -44.939376527 + -20.327797226 -44.991248434 + -20.407474575 -44.943396218 +} +85ed0993fffffff +{ + -70.108056334 165.562301485 + -70.109199131 165.332191141 + -70.185008307 165.226903470 + -70.259844812 165.352906367 + -70.258573007 165.584726484 + -70.182594151 165.688825928 +} +85a1486bfffffff +{ + -22.670039535 -144.266695265 + -22.578626999 -144.242981373 + -22.512031337 -144.316119376 + -22.536765889 -144.413031787 + -22.628185277 -144.436904630 + -22.694863368 -144.363706219 +} +85035c3bfffffff +{ + 79.997475098 -72.865084470 + 79.954048855 -73.317835438 + 79.867405388 -73.308545903 + 79.824177115 -72.853736525 + 79.867049584 -72.404598107 + 79.953699385 -72.406656296 +} +8509b093fffffff +{ + 58.197108309 0.716335598 + 58.156164991 0.599770345 + 58.076113730 0.622512368 + 58.037042264 0.761336816 + 58.077931204 0.877599091 + 58.157945762 0.855339773 +} +857919a7fffffff +{ + 4.482780917 -134.708744783 + 4.396930575 -134.743121650 + 4.326884142 -134.688956361 + 4.342653814 -134.600493970 + 4.428418752 -134.566122508 + 4.498499393 -134.620207920 +} +85f0608bfffffff +{ + -80.206559054 30.315100514 + -80.119291823 30.102978852 + -80.106269450 29.571670891 + -80.180389002 29.243795280 + -80.268239694 29.449787544 + -80.281389284 29.989878361 +} +85069caffffffff +{ + 72.854894565 -57.751128047 + 72.829902213 -58.052260343 + 72.739985083 -58.119743548 + 72.675254310 -57.888420866 + 72.700068643 -57.589614782 + 72.789790526 -57.519816539 +} +85f2e32bfffffff +{ + -79.124431463 -107.679940949 + -79.158653132 -107.236093753 + -79.100056050 -106.852700109 + -79.007876232 -106.915217887 + -78.974185579 -107.354190491 + -79.032148473 -107.735496539 +} +85a775abfffffff +{ + -29.099726069 108.358046666 + -29.043118982 108.298811562 + -29.051642662 108.205017212 + -29.116822092 108.170233102 + -29.173577354 108.229421481 + -29.165004899 108.323441073 +} +8500f5d7fffffff +{ + 82.200059399 59.046924381 + 82.221208101 59.690644661 + 82.309990630 59.870193215 + 82.378043233 59.393837021 + 82.356363719 58.737892850 + 82.267169627 58.570665631 +} +859a2ea7fffffff +{ + -15.501518285 -176.002156347 + -15.421558570 -175.958667718 + -15.349680164 -176.005127891 + -15.357707006 -176.094961498 + -15.437553026 -176.138462889 + -15.509485825 -176.092118091 +} +859ca367fffffff +{ + -9.424482950 148.100978657 + -9.513184965 148.114721193 + -9.542523306 148.201122759 + -9.483218380 148.273765483 + -9.394542959 148.260056904 + -9.365145802 148.173671605 +} +85bf628bfffffff +{ + -44.209870489 153.701496182 + -44.117802864 153.670262980 + -44.090695194 153.542034814 + -44.155604850 153.444786052 + -44.247710505 153.475744271 + -44.274868630 153.604226690 +} +8555193bfffffff +{ + 20.754431047 -12.280504736 + 20.686078972 -12.347125136 + 20.601507064 -12.319173878 + 20.585262089 -12.224766968 + 20.653499658 -12.158182638 + 20.738096578 -12.185968989 +} +85aeec8ffffffff +{ + -26.575653320 101.201868978 + -26.655105717 101.238295215 + -26.663762734 101.325061754 + -26.593059143 101.375266409 + -26.513712186 101.338840302 + -26.504963440 101.252209254 +} +850ba94ffffffff +{ + 60.525353661 83.808218887 + 60.437937361 83.866848901 + 60.415923265 84.050385380 + 60.481226424 84.175964109 + 60.568712294 84.118034502 + 60.590825784 83.933823904 +} +85f2a143fffffff +{ + -84.499627552 -153.007622842 + -84.582799184 -152.682115677 + -84.592760700 -151.739354990 + -84.519073325 -151.148777092 + -84.436749490 -151.494141982 + -84.427256602 -152.410702283 +} +85f0eb0ffffffff +{ + -72.396296112 48.647906164 + -72.327350175 48.454232617 + -72.339047721 48.171915741 + -72.419915568 48.080892093 + -72.489299517 48.274305203 + -72.477376368 48.559014942 +} +8578619bfffffff +{ + 0.552556269 -126.704643321 + 0.472629816 -126.737862425 + 0.408850551 -126.691979377 + 0.424965446 -126.612970567 + 0.504792118 -126.579779028 + 0.568603609 -126.625568669 +} +85ec6e6bfffffff +{ + -78.426712464 145.621436474 + -78.405609308 145.217901956 + -78.469275851 144.903166324 + -78.554532378 144.992185741 + -78.575853031 145.400535055 + -78.511697460 145.715015520 +} +8528ac6ffffffff +{ + 43.117528341 -119.692436084 + 43.195966564 -119.633819643 + 43.266957135 -119.697978115 + 43.259460174 -119.820773837 + 43.181011175 -119.879219776 + 43.110069885 -119.815040898 +} +852c0943fffffff +{ + 41.162870714 48.354236266 + 41.094485271 48.437059321 + 41.113885246 48.552297971 + 41.201798006 48.584968069 + 41.270326594 48.502074772 + 41.250799065 48.386581258 +} +85c6de73fffffff +{ + -32.350003219 -126.681029744 + -32.304038097 -126.587187059 + -32.215310246 -126.583221867 + -32.172605926 -126.672847454 + -32.218478936 -126.766503160 + -32.307148199 -126.770720080 +} +8548ae6bfffffff +{ + 27.395271373 -101.894348168 + 27.473287646 -101.830596000 + 27.561820228 -101.874843855 + 27.572311608 -101.982967994 + 27.494230773 -102.046704519 + 27.405723169 -102.002332813 +} +85ed2867fffffff +{ + -68.841299513 169.880648289 + -68.846975059 169.670683962 + -68.923316714 169.589771399 + -68.994102512 169.719993260 + -68.988261436 169.931359649 + -68.911800666 170.011096401 +} +859876b7fffffff +{ + -14.020476375 -2.906424646 + -14.100950141 -2.931194954 + -14.163810136 -2.866176949 + -14.146081795 -2.776410322 + -14.065567304 -2.751780970 + -14.002821756 -2.816777144 +} +85174d43fffffff +{ + 61.104025644 177.615918241 + 61.016213666 177.575559566 + 60.958926810 177.715485640 + 60.989150011 177.895834902 + 61.076807632 177.937150538 + 61.134397008 177.797162563 +} +858cce4bfffffff +{ + -2.701845093 98.180396643 + -2.612169533 98.156630507 + -2.587994143 98.064958262 + -2.653528125 97.997087947 + -2.743185823 98.020899612 + -2.767327465 98.112536157 +} +853b1937fffffff +{ + 34.283193640 -50.366484924 + 34.198501445 -50.403855269 + 34.126469882 -50.338648878 + 34.139024961 -50.236023472 + 34.223720760 -50.198434599 + 34.295857988 -50.263689443 +} +8537a6a3fffffff +{ + 39.176847080 -156.935458770 + 39.100759564 -156.969026202 + 39.045415348 -156.893360208 + 39.066155958 -156.784097334 + 39.142254285 -156.750436912 + 39.197601252 -156.826132179 +} +85e1304ffffffff +{ + -66.013592898 76.318447289 + -65.920120839 76.277509807 + -65.887119645 76.064065566 + -65.947368925 75.890562047 + -66.040880943 75.930103302 + -66.074104615 76.144546602 +} +854168c7fffffff +{ + 17.067708235 105.191494455 + 17.160424276 105.168851808 + 17.189481334 105.074210003 + 17.125784274 105.002229415 + 17.033034617 105.024938679 + 17.004015585 105.119561991 +} +850a582bfffffff +{ + 70.709802445 106.323281023 + 70.656621330 106.561746665 + 70.697395451 106.815652265 + 70.791712520 106.832468079 + 70.845259964 106.592942957 + 70.804122236 106.337659923 +} +85e8b4bbfffffff +{ + -71.339366441 -78.442246352 + -71.326455610 -78.152042151 + -71.239051576 -78.036781605 + -71.164902377 -78.210038720 + -71.177763744 -78.497736987 + -71.264823335 -78.614669742 +} +8587829bfffffff +{ + -4.960822781 92.688984060 + -4.872796802 92.663939393 + -4.848497314 92.572740559 + -4.912238250 92.506634794 + -5.000223868 92.531710907 + -5.024508961 92.622861443 +} +85006a1bfffffff +{ + 82.803825010 -19.494734512 + 82.887662900 -19.550754501 + 82.925433423 -20.211356631 + 82.878549763 -20.806210264 + 82.794909539 -20.735048160 + 82.757944703 -20.084122381 +} +857e2dc3fffffff +{ + -2.417109935 171.993953802 + -2.495326502 172.001216532 + -2.521580931 172.062096404 + -2.469712671 172.115657920 + -2.391590903 172.108429567 + -2.365242636 172.047605345 +} +85715013fffffff +{ + 9.127519322 -167.736922490 + 9.038277450 -167.760184300 + 8.971177440 -167.695989956 + 8.993276983 -167.608463248 + 9.082560602 -167.585112960 + 9.149702979 -167.649377817 +} +856480bbfffffff +{ + 17.471826672 98.407008478 + 17.564612466 98.381801342 + 17.590737070 98.284330173 + 17.524063360 98.212105992 + 17.431272303 98.237365212 + 17.405160160 98.334796642 +} +8596048ffffffff +{ + -14.629608292 29.643848044 + -14.532321161 29.648803410 + -14.479527421 29.564239747 + -14.523994105 29.474689323 + -14.621280821 29.469663896 + -14.674101350 29.554258929 +} +858c1ebbfffffff +{ + -6.504698730 105.041928334 + -6.419401638 105.020825579 + -6.397692490 104.932782884 + -6.461339418 104.865859376 + -6.546639949 104.887019466 + -6.568290190 104.975045791 +} +852a6e53fffffff +{ + 34.141283314 -63.779613909 + 34.107466708 -63.875134960 + 34.030684963 -63.888167367 + 33.987776447 -63.805950119 + 34.021484644 -63.710642051 + 34.098209540 -63.697338502 +} +85d92e2bfffffff +{ + -58.256244616 140.839066761 + -58.218588052 140.684636872 + -58.271657472 140.552952742 + -58.362619567 140.575605836 + -58.400379046 140.730691488 + -58.347073119 140.862466741 +} +85b729cbfffffff +{ + -35.562691792 -99.704051479 + -35.495094032 -99.625443339 + -35.405410745 -99.660340528 + -35.383218648 -99.773619507 + -35.450671301 -99.852282431 + -35.540461054 -99.817612125 +} +85024833fffffff +{ + 71.384972468 -77.489922348 + 71.331353205 -77.735884001 + 71.237688435 -77.710648775 + 71.197583292 -77.441759138 + 71.250867854 -77.196623968 + 71.344590729 -77.219548754 +} +85931627fffffff +{ + -2.996216819 -106.971497155 + -3.066032041 -107.025222081 + -3.147880674 -106.998195913 + -3.159958141 -106.917360039 + -3.090088362 -106.863557809 + -3.008195711 -106.890668735 +} +8550b0a7fffffff +{ + 22.195147592 -121.979369870 + 22.278843007 -121.933029555 + 22.359474185 -121.986886483 + 22.356323826 -122.087084303 + 22.272606993 -122.133298720 + 22.192061884 -122.079441424 +} +85b69177fffffff +{ + -24.633987946 -83.565342251 + -24.707245875 -83.627115235 + -24.790751659 -83.585852999 + -24.801002010 -83.482780720 + -24.727748859 -83.421025707 + -24.644240609 -83.462324827 +} +8503248bfffffff +{ + 88.501799998 43.212598037 + 88.547168287 46.266552469 + 88.640863180 46.368722896 + 88.689108009 42.987137633 + 88.639134165 39.736595958 + 88.545814710 40.061987135 +} +85036327fffffff +{ + 80.865267415 -50.716829275 + 80.854428540 -51.262520404 + 80.774527499 -51.437947341 + 80.705897279 -51.073846514 + 80.716529794 -50.536296486 + 80.795996607 -50.354788291 +} +85e0414bfffffff +{ + -57.664361715 46.729683661 + -57.582657984 46.776020991 + -57.526468347 46.679111365 + -57.551783013 46.536033391 + -57.633296047 46.489209581 + -57.689685178 46.585948332 +} +85532e4ffffffff +{ + 27.805270234 42.246995427 + 27.713778887 42.226943113 + 27.652730084 42.302400662 + 27.683091651 42.397849359 + 27.774484505 42.418015537 + 27.835614307 42.342619399 +} +85004a13fffffff +{ + 85.252743147 -29.736774986 + 85.336514507 -30.015897173 + 85.359249186 -31.109051051 + 85.297405722 -31.891020369 + 85.214464009 -31.580699508 + 85.192518146 -30.519036638 +} +8587069bfffffff +{ + -12.818072085 91.407145315 + -12.903031563 91.437268079 + -12.924480434 91.524209137 + -12.861004906 91.580902685 + -12.776152045 91.550741265 + -12.754668131 91.463924788 +} +85d065d7fffffff +{ + -41.863096304 22.095481045 + -41.950177950 22.095859834 + -41.991950790 22.186899959 + -41.946632684 22.277331162 + -41.859653889 22.276717723 + -41.817890302 22.185907439 +} +858288d3fffffff +{ + 2.237565952 12.076661409 + 2.324067481 12.087093882 + 2.370231182 12.018271222 + 2.329972696 11.939062724 + 2.243543968 11.928591635 + 2.197300897 11.997367588 +} +85032447fffffff +{ + 89.063888580 42.264993081 + 89.109558530 47.202767642 + 89.203320821 47.487508621 + 89.251304257 41.632413742 + 89.197827928 36.192587743 + 89.104985141 37.090618861 +} +859b91affffffff +{ + -15.835681490 -164.905626606 + -15.750140445 -164.866931092 + -15.677709255 -164.924929569 + -15.690736117 -165.021554115 + -15.776186803 -165.060320703 + -15.848700991 -165.002391906 +} +859d1d43fffffff +{ + -18.763400182 149.416552197 + -18.675352579 149.397626967 + -18.647783688 149.304475857 + -18.708179883 149.230129099 + -18.796255708 149.248893444 + -18.823907253 149.342165563 +} +85668b43fffffff +{ + 2.628234493 -80.877555884 + 2.553880856 -80.933528424 + 2.468589069 -80.895024297 + 2.457697755 -80.800526240 + 2.532096600 -80.744581356 + 2.617341535 -80.783106736 +} +85e071c7fffffff +{ + -59.518257626 50.190193259 + -59.433274688 50.230999682 + -59.377449902 50.118535882 + -59.406388214 49.965369283 + -59.491188305 49.923935550 + -59.547233114 50.036293576 +} +8522914ffffffff +{ + 51.652901561 -156.644229740 + 51.726149918 -156.597048344 + 51.797060377 -156.670245523 + 51.794693666 -156.790882358 + 51.721341656 -156.837965631 + 51.650460042 -156.764510894 +} +85ed50affffffff +{ + -72.228605112 162.020931277 + -72.226491973 161.758980834 + -72.301747586 161.623909956 + -72.379341327 161.752077214 + -72.381362785 162.016251144 + -72.305882472 162.150022276 +} +8518a18bfffffff +{ + 52.621351537 -19.784345592 + 52.554632900 -19.879511929 + 52.471772944 -19.825163708 + 52.455584460 -19.675974247 + 52.522210710 -19.580775097 + 52.605117696 -19.634797363 +} +85005977fffffff +{ + 86.591878703 -30.288367002 + 86.676748204 -30.697386088 + 86.698389516 -32.250479093 + 86.634090654 -33.329463932 + 86.550441937 -32.860085610 + 86.529837743 -31.370416156 +} +852ef183fffffff +{ + 43.977892476 139.556612873 + 44.061648451 139.525222759 + 44.079264213 139.415918340 + 44.013176356 139.338297687 + 43.929537980 139.369836066 + 43.911869867 139.478847368 +} +85e62eb3fffffff +{ + -66.893934441 19.429820629 + -66.805389092 19.381115933 + -66.773341756 19.163043696 + -66.829672551 18.992341658 + -66.918405379 19.039594403 + -66.950620792 19.259005873 +} +851525dbfffffff +{ + 59.613282844 106.929544877 + 59.561572841 107.077748111 + 59.595736624 107.237193054 + 59.681857563 107.248985259 + 59.733819623 107.100384369 + 59.699407940 106.940388456 +} +8577a3abfffffff +{ + 1.667570799 150.948575862 + 1.573993145 150.961883313 + 1.539999830 151.047754890 + 1.599527165 151.120293647 + 1.693051771 151.107023727 + 1.727102129 151.021177488 +} +85da1337fffffff +{ + -49.676712702 168.578127985 + -49.595492672 168.525804144 + -49.587567914 168.387556546 + -49.660884908 168.301271382 + -49.742194090 168.353413723 + -49.750097163 168.492023574 +} +85f2a60ffffffff +{ + -84.780595859 -172.311964547 + -84.868831245 -172.303387935 + -84.907779114 -171.414247465 + -84.857238583 -170.551046336 + -84.769032848 -170.589876713 + -84.731316773 -171.461729836 +} +8530da8ffffffff +{ + 32.538441447 128.267459226 + 32.465738950 128.284844715 + 32.446390241 128.378174867 + 32.499775849 128.454170186 + 32.572488809 128.436790129 + 32.591805768 128.343409241 +} +85008577fffffff +{ + 77.812608912 71.501785102 + 77.812905849 71.930364928 + 77.893131549 72.133610212 + 77.973533423 71.904962682 + 77.973126586 71.470604770 + 77.892428537 71.270723219 +} +85ef2a2ffffffff +{ + -81.346134607 -59.983936813 + -81.306571415 -59.406876982 + -81.210842309 -59.353684661 + -81.154862326 -59.866022809 + -81.193779597 -60.435176520 + -81.289314834 -60.499851613 +} +855e734ffffffff +{ + 14.078039237 -59.582033849 + 14.152815532 -59.535506350 + 14.222659080 -59.575410807 + 14.217736418 -59.661773298 + 14.143030136 -59.708244518 + 14.073176553 -59.668409595 +} +85dd50b7fffffff +{ + -58.800478096 -24.100960960 + -58.724028446 -24.009350646 + -58.645412899 -24.097373340 + -58.642995840 -24.276526556 + -58.719197247 -24.368597784 + -58.798063957 -24.281058244 +} +85f228d7fffffff +{ + -76.498754862 -140.362926961 + -76.566928231 -140.159280900 + -76.555207568 -139.785124417 + -76.475327189 -139.618933915 + -76.407640028 -139.824229020 + -76.419347397 -140.194097912 +} +85cb1ab7fffffff +{ + -36.873473598 50.678624912 + -36.962426950 50.683181057 + -37.008452492 50.778053954 + -36.965455318 50.868366766 + -36.876430125 50.863641489 + -36.830473881 50.768772658 +} +85040237fffffff +{ + 73.951445252 145.930505628 + 73.859025734 146.041779923 + 73.839168859 146.384730558 + 73.911530055 146.619699225 + 74.004246934 146.511341471 + 74.024306796 146.165077977 +} +852ca413fffffff +{ + 34.168158073 42.504438654 + 34.077897764 42.482867891 + 34.014817939 42.562954432 + 34.041931575 42.664540465 + 34.132099040 42.686239184 + 34.195245749 42.606224213 +} +85d27083fffffff +{ + -42.992012907 -114.641213306 + -42.933791917 -114.535177822 + -42.837632467 -114.550652895 + -42.799680291 -114.671785897 + -42.857765620 -114.777685433 + -42.953938523 -114.762588148 +} +8592513bfffffff +{ + -16.782288251 -101.249979929 + -16.851080858 -101.308968314 + -16.938359606 -101.276912163 + -16.956899338 -101.185779758 + -16.888088926 -101.126723508 + -16.800756599 -101.158867461 +} +85ef1c8ffffffff +{ + -81.775968069 -37.265795928 + -81.705958805 -36.805006731 + -81.613985996 -36.999744910 + -81.591511682 -37.644401081 + -81.660586560 -38.105799814 + -81.753063992 -37.922063631 +} +855b5a53fffffff +{ + 11.593053316 168.999322479 + 11.675496066 169.001980770 + 11.718929449 168.923995871 + 11.679819689 168.843418496 + 11.597371361 168.840904304 + 11.554038225 168.918823370 +} +85f29bb7fffffff +{ + -86.689200930 -68.841183116 + -86.664415915 -67.284244704 + -86.573155822 -66.940522953 + -86.507695724 -68.086552986 + -86.531322934 -69.578811672 + -86.621529662 -69.988061392 +} +85d2250bfffffff +{ + -48.710794171 -112.860519522 + -48.651188912 -112.744610263 + -48.554958882 -112.765101170 + -48.518307628 -112.901042387 + -48.577771841 -113.016813242 + -48.674028053 -112.996781712 +} +85d6d693fffffff +{ + -44.249338358 36.342102516 + -44.177996446 36.344669042 + -44.145435464 36.246485958 + -44.184216094 36.145651082 + -44.255569755 36.142989628 + -44.288131128 36.241257999 +} +855cb653fffffff +{ + 10.001830226 -161.336413115 + 9.910419356 -161.363480996 + 9.840445613 -161.297506278 + 9.861839420 -161.204419321 + 9.953268228 -161.177270617 + 10.023285347 -161.243289605 +} +854264c7fffffff +{ + 32.789630207 66.737127413 + 32.709678948 66.794219106 + 32.709201968 66.906519490 + 32.788692391 66.962003354 + 32.868779751 66.905032531 + 32.869240557 66.792456422 +} +85340003fffffff +{ + 34.477163937 -25.866623568 + 34.397827864 -25.935265106 + 34.309136578 -25.886317510 + 34.299707283 -25.768884514 + 34.378950377 -25.700165891 + 34.467715697 -25.748956879 +} +85d88697fffffff +{ + -43.854107707 141.993890603 + -43.760747669 141.978544419 + -43.721456594 141.859778671 + -43.775433465 141.756209985 + -43.868768788 141.771252251 + -43.908152135 141.890167185 +} +85b99173fffffff +{ + -27.138805112 139.798368997 + -27.046029958 139.788372289 + -27.009807760 139.694011378 + -27.066246257 139.609563665 + -27.158989054 139.619361210 + -27.195325850 139.713805626 +} +856daa13fffffff +{ + 11.732219824 -99.780144170 + 11.807321374 -99.723007021 + 11.890609524 -99.760482978 + 11.898755450 -99.855200518 + 11.823561464 -99.912337158 + 11.740314059 -99.874756938 +} +85dad093fffffff +{ + -45.868756132 162.066512443 + -45.780887730 162.024135264 + -45.763795633 161.891615721 + -45.834563184 161.801162524 + -45.922505211 161.843314121 + -45.939606156 161.976145171 +} +85a19da3fffffff +{ + -18.869208197 -130.022186763 + -18.785114667 -130.013114893 + -18.728775329 -130.081381618 + -18.756470875 -130.158833876 + -18.840627331 -130.168041864 + -18.897025382 -130.099661411 +} +859c5db3fffffff +{ + -15.133970984 135.666831083 + -15.219300026 135.682492711 + -15.250650628 135.771392732 + -15.196696831 135.844654212 + -15.111345524 135.829009544 + -15.079970207 135.740086371 +} +851fb523fffffff +{ + 49.275605902 3.959673784 + 49.194571839 3.975681989 + 49.170168549 4.094383495 + 49.226803745 4.197350559 + 49.307898671 4.181561321 + 49.332297650 4.062585619 +} +8573034bfffffff +{ + 9.500917522 133.011197412 + 9.406027416 133.027674575 + 9.373236009 133.119326785 + 9.435353313 133.194535129 + 9.530265388 133.178071504 + 9.563038251 133.086385923 +} +85972b33fffffff +{ + -21.448163683 29.553053635 + -21.352782316 29.558191376 + -21.301057409 29.471177046 + -21.344700603 29.378992221 + -21.440082453 29.373780318 + -21.491820712 29.460827373 +} +85660673fffffff +{ + 9.502359003 -75.933834781 + 9.434605274 -75.986606842 + 9.354863070 -75.948289777 + 9.342937246 -75.857197869 + 9.410738267 -75.804472903 + 9.490417821 -75.842792629 +} +850518c3fffffff +{ + 76.617714337 122.257778265 + 76.544948903 122.532176988 + 76.563504290 122.939524020 + 76.655071018 123.077149985 + 76.728424048 122.803331132 + 76.709620584 122.391271570 +} +85276a57fffffff +{ + 44.967904088 -84.796387065 + 44.909965109 -84.895900640 + 44.821271671 -84.870558697 + 44.790428135 -84.746121628 + 44.848166181 -84.646655429 + 44.936948403 -84.671578251 +} +85c63053fffffff +{ + -42.939715073 -135.348898968 + -42.903812821 -135.237603546 + -42.812978011 -135.219279646 + -42.758162094 -135.311953008 + -42.794029501 -135.422932624 + -42.884747559 -135.441554127 +} +85f2e613fffffff +{ + -80.330889071 -119.957346468 + -80.381929608 -119.521622561 + -80.340257457 -119.033297447 + -80.248077883 -118.986606340 + -80.197772437 -119.419482984 + -80.238917277 -119.901926528 +} +854e962bfffffff +{ + 29.720187007 158.689091020 + 29.815519215 158.680981425 + 29.858171725 158.582500411 + 29.805436233 158.492295714 + 29.710160718 158.500606256 + 29.667563874 158.598920721 +} +8531a13bfffffff +{ + 41.728552186 116.011421954 + 41.647676601 115.997708233 + 41.605642172 116.073662123 + 41.644336651 116.163305889 + 41.725090122 116.177250028 + 41.767271258 116.101320400 +} +85ef2623fffffff +{ + -85.434276360 -65.926504270 + -85.404798678 -64.807251663 + -85.312036514 -64.602901650 + -85.249370911 -65.480266458 + -85.277878220 -66.566873310 + -85.369998235 -66.808210992 +} +85606687fffffff +{ + 5.815705461 70.657895792 + 5.899350612 70.631175935 + 5.918505774 70.552537086 + 5.854094781 70.500687879 + 5.770547041 70.527383103 + 5.751312933 70.605952225 +} +85492a4ffffffff +{ 16.528237826 -110.316086922 + 16.608631895 -110.262093972 + 16.693593612 -110.308639805 + 16.698090169 -110.409243656 + 16.617627372 -110.463174066 16.532736752 -110.416563400 - 16.452342358 -110.470420938 - 16.367518011 -110.423864655 -} -857499a3fffffff -{ - -3.556438942 -9.423549572 - -3.623581334 -9.451074725 - -3.678253088 -9.396465355 - -3.665683408 -9.314316544 - -3.598480595 -9.286887827 - -3.543907811 -9.341511339 -} -85f2106ffffffff -{ - -82.348931863 -146.165376951 - -82.426397368 -145.858303470 - -82.425108465 -145.181107239 - -82.346217695 -144.825111390 - -82.269506905 -145.139874529 - -82.270930844 -145.803134304 -} -8508e82ffffffff -{ - 68.949874730 21.882760438 - 69.002508388 22.017159042 - 69.072309161 21.927424544 - 69.089203670 21.702184108 - 69.036241484 21.568197304 - 68.966713627 21.659032498 -} -852092cbfffffff -{ - 33.645003161 68.951618980 - 33.563418182 69.006859769 - 33.560990320 69.120923821 - 33.640149029 69.180030796 - 33.721863569 69.124934713 - 33.724289839 69.010586369 -} -85dcec27fffffff -{ - -49.067328422 -22.787327974 - -49.146343616 -22.850864934 - -49.224268388 -22.774179003 - -49.223116331 -22.633737481 - -49.144009352 -22.570339735 - -49.066146225 -22.647243440 -} -8500ebc3fffffff -{ - 87.333236948 54.090285619 - 87.363351241 55.940753487 - 87.455124603 56.349934047 - 87.517743998 54.791248844 - 87.485785260 52.842817343 - 87.393128118 52.553686816 -} -854e24d7fffffff -{ - 16.465062839 154.011024767 - 16.375389834 154.023844447 - 16.337001981 154.109051282 - 16.388254450 154.181403255 - 16.477859935 154.168624762 - 16.516280495 154.083453087 -} -85f0238bfffffff -{ - -81.275814700 75.744932946 - -81.240173960 75.195451836 - -81.292528775 74.742894694 - -81.381360742 74.837547735 - -81.417510086 75.395086099 - -81.364312383 75.849854491 -} -85f16407fffffff -{ - -88.434223456 -15.777024480 - -88.347813040 -14.518987462 - -88.275674367 -16.478367977 - -88.285613636 -19.616525192 - -88.368524380 -21.089156620 - -88.445064281 -19.229031479 -} -85f2a473fffffff -{ - -83.943890714 -167.923917325 - -84.031158154 -167.850364069 - -84.063454547 -167.060545288 - -84.007514360 -166.359735897 - -83.920448198 -166.455036592 - -83.889106026 -167.229531255 -} -852a0e1bfffffff -{ - 38.432572282 -70.312963326 - 38.391084774 -70.413877207 - 38.307721381 -70.416898421 - 38.265865708 -70.319351263 - 38.307205878 -70.218636803 - 38.390548756 -70.215270178 -} -859e6d57fffffff -{ - -22.174932172 157.125051013 - -22.085091688 157.097754958 - -22.060840196 156.998507589 - -22.126383186 156.926394009 - -22.216289992 156.953540693 - -22.240587582 157.052950573 -} -85032543fffffff -{ - 88.655670592 -2.097954018 - 88.743422853 -1.177216019 - 88.806417525 -4.406541890 - 88.775581514 -8.498780558 - 88.685935811 -8.943305606 - 88.628708893 -5.793766275 -} -85e5930bfffffff -{ - -51.685650072 113.516052836 - -51.615659972 113.410956805 - -51.635590685 113.261195392 - -51.725628496 113.215980487 - -51.795837993 113.321065014 - -51.775789943 113.471377293 -} -8566559bfffffff -{ - 5.201054808 -70.417417811 - 5.131225458 -70.467771002 - 5.049284625 -70.428908288 - 5.037248937 -70.339708886 - 5.107113019 -70.289423962 - 5.188978084 -70.328270067 -} -85f1644ffffffff -{ - -88.680216434 5.224959955 - -88.587150344 5.354626177 - -88.538286096 2.246917045 - -88.577657250 -1.164765543 - -88.669767581 -1.745952142 - -88.723774700 1.528057002 -} -851e04b7fffffff -{ - 50.061268291 17.934910096 - 49.977461716 17.935593106 - 49.938073925 18.057073725 - 49.982447464 18.178048486 - 50.066268163 18.177646806 - 50.105701379 18.055988946 -} -85519eb7fffffff -{ - 18.594551772 -121.818774619 - 18.676805716 -121.773583575 - 18.757406544 -121.825881881 - 18.755661314 -121.923372678 - 18.673378096 -121.968445362 - 18.592869323 -121.916145803 -} -85e54517fffffff -{ - -69.926510935 104.909762951 - -69.849548539 104.747127381 - -69.858700155 104.469250679 - -69.944881073 104.351996286 - -70.022162940 104.513971167 - -70.012944010 104.793871606 -} -8515622ffffffff -{ - 63.627247285 121.288151752 - 63.557526823 121.430547158 - 63.574844686 121.637124097 - 63.662041250 121.702494822 - 63.732090677 121.560195032 - 63.714613907 121.352424536 -} -85de406bfffffff -{ - -49.180959139 -58.079739110 - -49.142980583 -57.962103312 - -49.065919297 -57.954218508 - -49.026877081 -58.063466781 - -49.064687664 -58.180785766 - -49.141708012 -58.189172995 -} -858a5263fffffff -{ - -2.065294925 -65.163661197 - -2.138701629 -65.211352439 - -2.221481221 -65.172264580 - -2.230773059 -65.085519537 - -2.157356539 -65.037914227 - -2.074657957 -65.076967943 -} -85d4e80bfffffff -{ - -42.039580288 -166.776658961 - -41.957875093 -166.725335200 - -41.881908603 -166.797994087 - -41.887606472 -166.921844769 - -41.969246498 -166.973270702 - -42.045253845 -166.900744278 -} -85f10c73fffffff -{ - -84.766850448 100.421292126 - -84.769474860 99.432137580 - -84.847123185 98.993841383 - -84.923238374 99.562821574 - -84.920333679 100.582422744 - -84.841599084 101.001985812 -} -856a9833fffffff -{ - -1.806132943 22.507449513 - -1.713270769 22.514789584 - -1.662427293 22.437022026 - -1.704381672 22.351919424 - -1.797207152 22.344522333 - -1.848115020 22.422284811 -} -85216e6ffffffff -{ - 56.110300208 73.039749299 - 56.025221501 73.115071861 - 56.018131472 73.286321012 - 56.096092242 73.382881369 - 56.181292726 73.307967166 - 56.188410762 73.136082321 -} -85104b23fffffff -{ - 66.011812643 67.649682131 - 65.937848965 67.761534088 - 65.938831381 67.985950744 - 66.013784199 68.099614904 - 66.087926981 67.988282957 - 66.086937813 67.762762401 -} -853af51bfffffff -{ - 25.212096047 -50.448266534 - 25.132521233 -50.481612376 - 25.060391071 -50.423222511 - 25.067717480 -50.331447304 - 25.147278618 -50.297926270 - 25.219527149 -50.356355481 -} -85de3117fffffff -{ - -57.163239654 -53.109853043 - -57.115757895 -52.965378588 - -57.028576793 -52.969550680 - -56.988881368 -53.117359948 - -57.036127328 -53.261432713 - -57.123303836 -53.258097999 -} -85e9452ffffffff -{ - -58.629542248 -103.893677963 - -58.563744983 -103.763713878 - -58.474151041 -103.809157830 - -58.450262772 -103.983953148 - -58.515894773 -104.113939490 - -58.605579993 -104.069109969 -} -85420d93fffffff -{ - 28.263010558 65.530601056 - 28.186873428 65.585153346 - 28.186915935 65.689751070 - 28.263117322 65.740034992 - 28.339390433 65.685578148 - 28.339326132 65.580741492 -} -852fb503fffffff -{ - 39.400457192 156.705561478 - 39.495327388 156.694050192 - 39.533822172 156.583120226 - 39.477411070 156.483925434 - 39.382606339 156.495683152 - 39.344147107 156.606389522 -} -85c96663fffffff -{ - -48.163622911 116.398007585 - -48.097618687 116.297615526 - -48.119914089 116.162399304 - -48.208344782 116.127142547 - -48.274556343 116.227578617 - -48.252129534 116.363228306 -} -85eccc83fffffff -{ - -72.600860765 124.048404512 - -72.546673790 123.802895275 - -72.584449692 123.515802228 - -72.676699465 123.472521062 - -72.731230392 123.718925245 - -72.693165927 124.007719895 -} -85558cc3fffffff -{ - 20.515952027 -18.022721504 - 20.444508196 -18.086707888 - 20.359898535 -18.052581921 - 20.346680010 -17.954618538 - 20.418007787 -17.890629844 - 20.502670037 -17.924606613 -} -853b81dbfffffff -{ - 32.762395330 -57.256840283 - 32.680101334 -57.283493091 - 32.614243137 -57.218953285 - 32.630584682 -57.127671771 - 32.712911455 -57.100810195 - 32.778864012 -57.165438831 -} -85212e6ffffffff -{ - 51.961740467 61.041129486 - 51.883567363 61.129197812 - 51.892333100 61.283489167 - 51.979329410 61.350225382 - 52.057654296 61.262287378 - 52.048830955 61.107481465 -} -853e3067fffffff -{ - 28.873238039 19.882870516 - 28.775905856 19.881624014 - 28.726295540 19.977024364 - 28.773957653 20.073769165 - 28.871301466 20.075192211 - 28.920971668 19.979693900 -} -852990c7fffffff -{ - 37.079039442 -112.086670253 - 37.158520606 -112.024173773 - 37.239480380 -112.080515005 - 37.240913392 -112.199430674 - 37.161399298 -112.261825849 - 37.080485127 -112.205407048 -} -85aaa84ffffffff -{ - -30.279239182 70.661270929 - -30.373918721 70.682832827 - -30.405311870 70.789131173 - -30.341988556 70.873745962 - -30.247325448 70.852035684 - -30.215969121 70.745858824 -} -852c4007fffffff -{ - 45.068175732 51.538953765 - 44.996970292 51.625531200 - 45.015016874 51.752890248 - 45.104383172 51.793996819 - 45.175736636 51.707381518 - 45.157575566 51.579696923 -} -85a00ec7fffffff -{ - -18.048955805 -137.557248769 - -17.961898140 -137.540989403 - -17.900055964 -137.611033881 - -17.925192699 -137.697426205 - -18.012281774 -137.713832493 - -18.074202807 -137.643699547 -} -85ad1c67fffffff -{ - -30.075143523 14.145801924 - -30.164403919 14.136922151 - -30.219437516 14.217409811 - -30.185146276 14.306632340 - -30.095950560 14.315310629 - -30.040981304 14.234967789 -} -85709b27fffffff -{ - -4.005945013 -174.640778344 - -4.082195741 -174.658566870 - -4.145022420 -174.601224690 - -4.131662854 -174.526014266 - -4.055381453 -174.508146688 - -3.992490220 -174.565568591 -} -85029927fffffff -{ - 70.535613977 -125.543611878 - 70.446658295 -125.592685026 - 70.387363938 -125.403891172 - 70.416743138 -125.165513871 - 70.505667407 -125.114554954 - 70.565245002 -125.303855337 -} -85d40557fffffff -{ - -49.407437734 -162.523515089 - -49.330250699 -162.470969299 - -49.261617544 -162.555705073 - -49.270117871 -162.692874481 - -49.347251684 -162.745585429 - -49.415938445 -162.660962465 -} -8519a0cbfffffff -{ - 60.239847853 -19.919161432 - 60.180431790 -20.029316170 - 60.105639480 -19.966074526 - 60.090198826 -19.793113082 - 60.149505234 -19.682911584 - 60.224361781 -19.745716946 -} -8500ed63fffffff -{ - 86.963085486 25.982267748 - 87.029550991 27.126582268 - 87.117922946 26.563839597 - 87.138237779 24.778224144 - 87.069342376 23.647429435 - 86.982596682 24.285832453 -} -85bd629bfffffff -{ - -41.822630678 28.907046382 - -41.747538431 28.913035357 - -41.706446436 28.816780188 - -41.740441152 28.714500198 - -41.815532346 28.708420657 - -41.856629972 28.804711629 -} -858126affffffff -{ - -16.173353569 -42.651712794 - -16.093425763 -42.600308144 - -16.011373116 -42.648252863 - -16.009262015 -42.747586818 - -16.089201161 -42.798999319 - -16.171240064 -42.751070167 -} -85f1402bfffffff -{ - -84.690002688 33.801066491 - -84.605554634 33.359366845 - -84.599061284 32.385544971 - -84.676888124 31.823790057 - -84.762450192 32.247245393 - -84.769074938 33.251306117 -} -852a2c83fffffff -{ - 40.210281231 -65.409779091 - 40.172640290 -65.517540281 - 40.088017564 -65.529446242 - 40.041091909 -65.433948742 - 40.078605869 -65.326449012 - 40.163172178 -65.314185633 -} -85d88ebbfffffff -{ - -42.798869704 137.773773404 - -42.705657298 137.764383899 - -42.662714504 137.652350685 - -42.712882751 137.549604612 - -42.806047218 137.558703818 - -42.849091536 137.670839321 -} -850774cbfffffff -{ - 67.258209604 -11.076395859 - 67.292821725 -11.250421579 - 67.242921423 -11.419149834 - 67.158594904 -11.413149604 - 67.124248352 -11.239715047 - 67.173963480 -11.071689117 -} -85f01127fffffff -{ - -77.228360369 74.272278292 - -77.139159516 74.212795770 - -77.101295261 73.840177429 - -77.152271697 73.524146182 - -77.241552314 73.579133563 - -77.279779537 73.954656380 -} -85df2a33fffffff -{ - -60.399561389 -64.354863350 - -60.365437304 -64.180485594 - -60.277232026 -64.149782646 - -60.223274622 -64.292501674 - -60.257227269 -64.466084202 - -60.345308106 -64.497740945 -} -85b403cbfffffff -{ - -27.254966294 -156.599061112 - -27.163108381 -156.562535863 - -27.089037777 -156.633670545 - -27.106747247 -156.741305326 - -27.198556637 -156.777964547 - -27.272705149 -156.706855298 -} -8590b62ffffffff -{ - -10.802413198 -114.831309289 - -10.864659080 -114.881082159 - -10.944599977 -114.858934527 - -10.962373107 -114.786928539 - -10.900099696 -114.737064632 - -10.820080669 -114.759297772 -} -855755cbfffffff -{ - 18.847010253 -29.977770231 - 18.772353276 -30.031846453 - 18.691216604 -29.987324511 - 18.684637089 -29.888813756 - 18.759194726 -29.834657580 - 18.840431213 -29.879091826 -} -85db11b3fffffff -{ - -54.661717537 178.857332626 - -54.592857219 178.790284889 - -54.599344327 178.648859181 - -54.674751534 178.574083514 - -54.743704587 178.641064045 - -54.737157637 178.782888345 -} -854f7017fffffff -{ - 12.524952521 151.919832208 - 12.432603962 151.933109571 - 12.395268522 152.019577239 - 12.450243997 152.092738536 - 12.542530431 152.079500608 - 12.579903544 151.993061919 -} -85f392dbfffffff -{ - -81.859810864 145.650363147 - -81.922199427 145.235609809 - -82.000093386 145.445726710 - -82.015005374 146.079948397 - -81.951684288 146.492771985 - -81.874388156 146.273432954 -} -85ac032bfffffff -{ - -24.010490842 10.221032115 - -23.922136687 10.233260858 - -23.863652380 10.158105305 - -23.893499936 10.070787086 - -23.981781551 10.058514257 - -24.040288179 10.133603632 -} -8578ec73fffffff -{ - -5.189997349 -131.438168242 - -5.269073063 -131.471065127 - -5.329450983 -131.421898283 - -5.310802600 -131.339915881 - -5.231817462 -131.307033415 - -5.171390175 -131.356118848 -} -85ee5697fffffff -{ - -70.663766323 -42.453687106 - -70.599147287 -42.235221960 - -70.504437694 -42.294765639 - -70.474187792 -42.570485669 - -70.538385336 -42.788628507 - -70.633252739 -42.731381634 -} -857aa09bfffffff -{ - 2.901599109 49.702138045 - 2.985505539 49.699304264 - 3.032606407 49.626670324 - 2.995819999 49.556780377 - 2.911843408 49.559566059 - 2.864723354 49.632289841 -} -8500c3d7fffffff -{ - 85.210173021 84.460873562 - 85.192388142 85.543152329 - 85.263113294 86.292217954 - 85.353139726 85.954054687 - 85.371481211 84.835669920 - 85.299225310 84.092303348 -} -8500d473fffffff -{ - 82.037249637 84.239436023 - 82.018945611 84.893706512 - 82.089898496 85.337678840 - 82.180067647 85.125247771 - 82.198668125 84.457903133 - 82.126798160 84.016227947 -} -854d4637fffffff -{ - 21.891616104 -61.356093300 - 21.959977037 -61.310922019 - 22.019528814 -61.349297718 - 22.010740774 -61.432773809 - 21.942445941 -61.477885867 - 21.882873096 -61.439581113 -} -85d30263fffffff -{ - -53.326945792 -110.506808942 - -53.265936428 -110.382388316 - -53.171343431 -110.409644619 - -53.137715193 -110.560781919 - -53.198574631 -110.685083200 - -53.293211901 -110.658367274 -} -85f10493fffffff -{ - -83.749736180 132.820863784 - -83.798963281 132.150166313 - -83.883608806 132.244888866 - -83.918726502 133.030770146 - -83.868306728 133.707432721 - -83.783975876 133.592369735 -} -85721cc3fffffff -{ - 2.621484936 137.777485058 - 2.525421948 137.793293629 - 2.491048422 137.884511184 - 2.552727652 137.959937499 - 2.648796334 137.944150264 - 2.683180156 137.852915309 -} -8507b533fffffff -{ - 78.321007761 -16.294304003 - 78.357279732 -16.655653052 - 78.305951832 -16.966604595 - 78.218751990 -16.914352858 - 78.182862036 -16.556034522 - 78.233792725 -16.246945144 -} -85f31a43fffffff -{ - -78.506317265 -166.486222879 - -78.587734258 -166.437782027 - -78.614815675 -166.032825568 - -78.559979802 -165.680489980 - -78.478680953 -165.734561312 - -78.452095925 -166.135358064 -} -850a0817fffffff -{ - 66.667111475 93.358618942 - 66.632052835 93.573487677 - 66.686114400 93.749389143 - 66.775588075 93.710655812 - 66.810837738 93.494526489 - 66.756421762 93.318395105 -} -85f1249bfffffff -{ - -83.635043371 158.465085189 - -83.710529452 158.074228477 - -83.781761454 158.511223453 - -83.776418199 159.347745123 - -83.699928231 159.726988941 - -83.629783612 159.281649739 -} -853f5c27fffffff -{ - 32.874642012 28.747213296 - 32.778560956 28.737543179 - 32.722868089 28.831611252 - 32.763183847 28.935385619 - 32.859228766 28.945236931 - 32.914994187 28.851132827 -} -8508aab3fffffff -{ - 61.961989510 17.654692224 - 61.894710922 17.655925057 - 61.864573703 17.804648891 - 61.901638975 17.952408972 - 61.968924787 17.951596890 - 61.999138320 17.802603799 -} -85e5646bfffffff -{ - -70.514194207 113.392748846 - -70.446138417 113.198320146 - -70.468358494 112.920326870 - -70.558802172 112.834861865 - -70.627200959 113.029231638 - -70.604812082 113.309134055 -} -853d06bbfffffff -{ - 33.148445374 77.800318144 - 33.063948671 77.843554735 - 33.053585514 77.955157786 - 33.127662774 78.023786999 - 33.212250827 77.980761541 - 33.222670386 77.868895240 -} -85e19b0bfffffff -{ - -54.619647835 72.566428948 - -54.528837033 72.547653866 - -54.496200832 72.404801490 - -54.554175690 72.280316193 - -54.644977417 72.298411635 - -54.677813841 72.441672384 -} -85ab8647fffffff -{ - -26.280677288 61.312684416 - -26.376041509 61.325852243 - -26.413698358 61.423397185 - -26.355916179 61.507709906 - -26.260522589 61.494389866 - -26.222940449 61.396909285 -} -858d13cffffffff -{ - -10.802582159 111.621039552 - -10.724196209 111.602975533 - -10.706826151 111.520877205 - -10.767915492 111.456841536 - -10.846316934 111.474968007 - -10.863613621 111.557067723 -} -85975933fffffff -{ - -16.938448584 22.404167265 - -16.842323440 22.412016721 - -16.787136761 22.329320835 - -16.828040970 22.238781751 - -16.924130846 22.230867877 - -16.979351852 22.313557442 -} -85e31eb7fffffff -{ - -65.062929857 -140.086883797 - -65.045247342 -139.901374960 - -64.963843282 -139.858959086 - -64.900254919 -140.001320629 - -64.917911790 -140.185894572 - -64.999182409 -140.229038819 -} -8521ad1bfffffff -{ - 45.913031400 62.375499864 - 45.832384481 62.452214332 - 45.838391390 62.590169117 - 45.925094280 62.651821598 - 46.005888839 62.575230075 - 45.999832769 62.436862128 -} -8500ce0bfffffff -{ - 86.445051137 95.265097224 - 86.410811692 96.645183843 - 86.468210005 97.856500916 - 86.561847074 97.705843154 - 86.597572817 96.274889479 - 86.538129849 95.046344124 -} -8556502bfffffff -{ - 10.149679748 -30.633951000 - 10.224532721 -30.587682864 - 10.304292456 -30.633420129 - 10.309259356 -30.725459027 - 10.234422912 -30.771781940 - 10.154603011 -30.726011285 -} -85c7a4d3fffffff -{ - -49.934261636 -136.614781309 - -49.902761343 -136.487805550 - -49.812001486 -136.464711472 - -49.752866416 -136.568216815 - -49.784344100 -136.694773622 - -49.874979328 -136.718243165 -} -8596a237fffffff -{ - -8.402372582 34.195172731 - -8.306072195 34.198192362 - -8.254692960 34.115426278 - -8.299584575 34.029589455 - -8.395906176 34.026502281 - -8.447315028 34.109319474 -} -850db2abfffffff -{ - 68.564277722 175.782040312 - 68.470967302 175.735021474 - 68.410950242 175.930898102 - 68.443858769 176.174036848 - 68.536996255 176.222881950 - 68.597399321 176.026767876 -} -855c834ffffffff -{ - 6.360536859 -157.389576625 - 6.269812502 -157.418249051 - 6.198762315 -157.353106550 - 6.218384763 -157.259267503 - 6.309104874 -157.230525059 - 6.380206844 -157.295691572 -} -85737657fffffff -{ - 12.403175840 136.312017283 - 12.308917183 136.328226976 - 12.275670159 136.420697596 - 12.336692193 136.496981306 - 12.430955536 136.480791067 - 12.464192224 136.388297592 -} -85494087fffffff -{ - 20.185087729 -116.318590281 - 20.267853156 -116.267733513 - 20.351508009 -116.318772202 - 20.352316308 -116.420701541 - 20.269505747 -116.471459849 - 20.185931991 -116.420387517 -} -8540d643fffffff -{ - 34.805177702 106.815184946 - 34.883655986 106.791797613 - 34.913095353 106.692058526 - 34.864041340 106.615721991 - 34.785533284 106.639187888 - 34.756108952 106.738911840 -} -85061e43fffffff -{ - 70.870391495 -39.514349056 - 70.871848055 -39.783781229 - 70.792502964 -39.915008324 - 70.712009604 -39.777653841 - 70.710622942 -39.510309932 - 70.789659996 -39.378243185 -} -8586b033fffffff -{ - -0.429655961 89.027499429 - -0.339121342 89.001390369 - -0.314527279 88.909737887 - -0.380462460 88.844251614 - -0.470944603 88.870382909 - -0.495544073 88.961978353 -} -85efa90ffffffff -{ - -79.240816210 -22.274022631 - -79.155741666 -22.025078545 - -79.073087006 -22.291127619 - -79.074864033 -22.802610893 - -79.159332112 -23.055736380 - -79.242630014 -22.793276553 -} -855b589bfffffff -{ - 10.265906845 168.253745996 - 10.346680098 168.255696413 - 10.389062950 168.178518644 - 10.350574935 168.099458110 - 10.269799448 168.097647758 - 10.227514066 168.174757865 } -85f29387fffffff +85f2946bfffffff +{ + -88.481768887 137.947083943 + -88.539411420 135.222894567 + -88.628052951 135.857138170 + -88.656979316 139.604110798 + -88.594004402 142.362902866 + -88.507664964 141.358608374 +} +851b92cffffffff +{ + 50.116259571 -62.061298397 + 50.080395866 -62.197956444 + 49.988120757 -62.220134571 + 49.931804115 -62.106188681 + 49.967548724 -61.969980804 + 50.059728718 -61.947269498 +} +850325c3fffffff +{ + 88.383891318 10.821937200 + 88.464417538 12.294516957 + 88.542271962 10.319509278 + 88.534902142 6.733169252 + 88.450889928 5.493551206 + 88.377657295 7.583897637 +} +850d8253fffffff +{ + 66.882101864 -179.304144293 + 66.791705731 -179.366941700 + 66.727467003 -179.200339773 + 66.753265966 -178.971019666 + 66.843444143 -178.906805092 + 66.908042080 -179.073321697 +} +850272d3fffffff +{ + 77.413802148 -91.147771176 + 77.346716459 -91.437246203 + 77.262129598 -91.315979405 + 77.244331738 -90.909001261 + 77.310917532 -90.618975965 + 77.395799286 -90.736448183 +} +85db692bfffffff +{ + -62.252733801 161.205832172 + -62.243394391 161.036761285 + -62.312239977 160.947784044 + -62.390589608 161.028392504 + -62.399852921 161.198386404 + -62.330842877 161.286845602 +} +856544d7fffffff +{ + 0.928355922 95.322522728 + 1.020295820 95.297668301 + 1.045187676 95.204670652 + 0.978120512 95.136571418 + 0.886206923 95.161465397 + 0.861334133 95.254419165 +} +856e2547fffffff +{ + 2.082743514 -117.624070584 + 2.151757584 -117.580862614 + 2.225057971 -117.625696777 + 2.229252155 -117.713758646 + 2.160173139 -117.756887647 + 2.086964843 -117.712033900 +} +8535b60bfffffff +{ + 41.687456005 -38.599633360 + 41.603206176 -38.658883940 + 41.523816509 -38.593041276 + 41.528578498 -38.468007288 + 41.612783588 -38.408544409 + 41.692271487 -38.474327249 +} +850ace73fffffff +{ + 65.218359490 112.049741955 + 65.158585248 112.223539939 + 65.189300594 112.430923283 + 65.280045925 112.465566926 + 65.340146504 112.291401625 + 65.309174369 112.082957356 +} +850333a3fffffff +{ + 87.479909579 -148.789579340 + 87.414655268 -150.254682814 + 87.323265138 -149.730102387 + 87.295863518 -147.850487406 + 87.358353940 -146.395226567 + 87.450941833 -146.806553331 +} +858ac497fffffff +{ + -1.638112194 -62.739218497 + -1.560710984 -62.693015370 + -1.480693181 -62.731972905 + -1.478112261 -62.817054990 + -1.555459801 -62.863191085 + -1.635441911 -62.824312181 +} +8585526ffffffff +{ + -1.770844044 64.597796999 + -1.851583413 64.610973092 + -1.878034272 64.693590079 + -1.823669913 64.762974338 + -1.742939315 64.749695587 + -1.716564192 64.667135191 +} +8556d99bfffffff +{ + 4.501108150 -34.741688511 + 4.581329377 -34.693447419 + 4.664295402 -34.740183515 + 4.667085448 -34.835179019 + 4.586877266 -34.883460828 + 4.503865979 -34.836706544 +} +850ab297fffffff +{ + 55.617246374 96.321486308 + 55.525880202 96.345196138 + 55.489455043 96.490802189 + 55.544247221 96.613024807 + 55.635584377 96.589916427 + 55.672158709 96.443983783 +} +85c72327fffffff +{ + -45.787667078 -144.957039327 + -45.701471285 -144.926019203 + -45.644193934 -145.018879048 + -45.673061502 -145.142849886 + -45.759266559 -145.174125616 + -45.816594916 -145.081175143 +} +855b8d0bfffffff +{ + 13.871552963 177.247466148 + 13.955756083 177.257747959 + 14.002821756 177.183222856 + 13.965569141 177.098437185 + 13.881320746 177.088295669 + 13.834370119 177.162799415 +} +850aa143fffffff +{ + 59.693994690 95.134192979 + 59.604299576 95.163412998 + 59.568211656 95.326679728 + 59.621671820 95.461152551 + 59.711353035 95.432670135 + 59.747588399 95.268976883 +} +857513bbfffffff +{ + 7.306941166 -5.782311017 + 7.249956601 -5.840435340 + 7.182487543 -5.822841270 + 7.171985521 -5.747247279 + 7.228868406 -5.689176956 + 7.296354867 -5.706646583 +} +85ed9123fffffff +{ + -60.964584411 149.237934243 + -60.939047577 149.069394060 + -61.000496661 148.948725313 + -61.087709121 148.996757822 + -61.113277989 149.166165300 + -61.051602155 149.286670174 +} +8500ea2ffffffff +{ + 87.205856266 63.692263561 + 87.221245765 65.539554182 + 87.308721491 66.249800489 + 87.382515725 65.027497885 + 87.366174195 63.071035671 + 87.277031156 62.450017332 +} +857adec7fffffff +{ + 8.944485771 42.421687027 + 9.025463507 42.421450066 + 9.072313841 42.346446975 + 9.038227493 42.271609627 + 8.957212632 42.271792279 + 8.910321168 42.346866621 +} +85032143fffffff +{ + 88.471192374 -47.827988234 + 88.545805997 -49.766088667 + 88.535321670 -53.409225655 + 88.451172984 -54.742744019 + 88.381220629 -52.691420384 + 88.390827173 -49.396410969 +} +85e20e97fffffff +{ + -58.593450752 -135.136198573 + -58.564994300 -134.980909415 + -58.476460664 -134.955911878 + -58.416497059 -135.085620253 + -58.444912411 -135.240297446 + -58.533332210 -135.265876729 +} +85c06d47fffffff +{ + -35.036195293 2.888196972 + -35.129649690 2.864128742 + -35.193828460 2.949247794 + -35.164463336 3.058347255 + -35.071019123 3.082174724 + -35.006929704 2.997143655 +} +854f954bfffffff +{ + 22.063775952 162.533704882 + 22.156045459 162.530101129 + 22.201075578 162.440253413 + 22.153755556 162.354131034 + 22.061517974 162.357911960 + 22.016568346 162.447638170 +} +8502cb1bfffffff +{ + 68.301244175 -102.037751064 + 68.221528502 -102.176488990 + 68.137722470 -102.065426423 + 68.133361130 -101.816521197 + 68.212821236 -101.676957037 + 68.296898221 -101.787116015 +} +85658163fffffff +{ + 12.002214951 103.020372667 + 12.096248523 102.997225223 + 12.123877385 102.902945685 + 12.057434534 102.831838285 + 11.963380721 102.855046326 + 11.935789946 102.949301257 +} +85eeadcffffffff +{ + -72.502710246 -21.737749086 + -72.417385537 -21.585138468 + -72.334660077 -21.753459250 + -72.336839583 -22.073074908 + -72.421784221 -22.227366270 + -72.504929666 -22.060380400 +} +85e71497fffffff +{ + -67.884475611 41.993430863 + -67.811135335 41.861032989 + -67.811467152 41.632909525 + -67.885249741 41.535574782 + -67.958941342 41.667439076 + -67.958498558 41.897179120 +} +8590a62bfffffff +{ + -10.832621391 -117.048841721 + -10.893070255 -117.096823588 + -10.971323345 -117.076299650 + -10.989208566 -117.007711306 + -10.928734257 -116.959638289 + -10.850400152 -116.980244797 +} +85559223fffffff { - -89.915696433 -140.297307936 - -89.949985838 -57.757362933 - -89.858736589 -55.603769920 - -89.793429041 -78.463827775 - -89.780266586 -103.227958204 - -89.826299528 -126.505360119 + 20.552853195 -23.788266064 + 20.478839565 -23.848570394 + 20.394845197 -23.808648538 + 20.384786806 -23.708547172 + 20.458689486 -23.648200566 + 20.542761445 -23.687997320 } -85e996d7fffffff -{ - -75.981896908 -88.531138819 - -75.986094974 -88.148577674 - -75.906069263 -87.938687522 - -75.822368898 -88.109738267 - -75.818294027 -88.487917954 - -75.897797176 -88.699395072 -} -8508c4b3fffffff -{ - 66.535876360 20.997244932 - 66.511575104 21.157707920 - 66.566195707 21.294125168 - 66.645267418 21.270007152 - 66.669583597 21.108674044 - 66.614812899 20.972331741 -} -85f12527fffffff -{ - -85.415689803 152.335428924 - -85.487596932 151.681155796 - -85.565383135 152.188023391 - -85.569921556 153.373914280 - -85.496448410 154.012417424 - -85.420008044 153.481708780 -} -8500c3cffffffff -{ - 85.151705306 87.684476116 - 85.128842288 88.742214262 - 85.196033777 89.528409549 - 85.287604464 89.256231922 - 85.311181882 88.165046627 - 85.242456558 87.380120521 -} -85f390c3fffffff -{ - -81.543654261 153.424741180 - -81.613026889 153.090483310 - -81.685841116 153.367633747 - -81.688549472 153.985476146 - -81.618348087 154.315090130 - -81.546268224 154.031637992 -} -85a4ea7bfffffff -{ - -28.159981712 -26.107541187 - -28.243143922 -26.157989978 - -28.321849164 -26.103970708 - -28.317325395 -25.999357804 - -28.234044236 -25.948964197 - -28.155405855 -26.003127961 -} -8506a297fffffff -{ - 74.995581252 -43.728902192 - 74.992694887 -44.070870952 - 74.912364984 -44.216243557 - 74.835267880 -44.021434191 - 74.838155310 -43.682798744 - 74.918138667 -43.535661523 -} -857e0313fffffff -{ - -1.764174960 174.475921098 - -1.701401260 174.482424157 - -1.668439847 174.418409734 - -1.698334060 174.347918519 - -1.761125843 174.341517215 - -1.794005432 174.405505321 -} -85d68b37fffffff -{ - -43.799188875 36.952118242 - -43.727252005 36.954387694 - -43.694864165 36.856588877 - -43.734414714 36.756432271 - -43.806364920 36.754068718 - -43.838751331 36.851955899 -} -85dd0e37fffffff -{ - -61.076035923 -17.733444474 - -60.993870176 -17.653265574 - -60.918764572 -17.765527471 - -60.925530852 -17.957630953 - -61.007476930 -18.038544196 - -61.082876688 -17.926623636 -} -85ac9683fffffff -{ - -18.139246011 19.687805323 - -18.044137685 19.696694793 - -17.988125361 19.615238680 - -18.027186842 19.524913536 - -18.122248431 19.515963161 - -18.178295337 19.597398759 -} -85065d53fffffff -{ - 61.413648177 -37.149197910 - 61.413762070 -37.331626557 - 61.334233754 -37.427070954 - 61.254838627 -37.340404940 - 61.254818343 -37.158935266 - 61.334099825 -37.063176003 -} -85c4245bfffffff -{ - -35.642799332 -35.528186894 - -35.718446854 -35.588388971 - -35.800737420 -35.543242955 - -35.807367474 -35.437679708 - -35.731606811 -35.377462463 - -35.649329337 -35.422823334 -} -851b346bfffffff -{ - 60.384108439 -50.969373077 - 60.364602296 -51.153388024 - 60.274313066 -51.213178980 - 60.203723614 -51.089659983 - 60.223191973 -50.906579107 - 60.313287332 -50.846086345 -} -85a94ba3fffffff -{ - -23.775218027 -59.230568064 - -23.709530114 -59.181166134 - -23.631719901 -59.223614651 - -23.619654678 -59.315388069 - -23.685347922 -59.364728007 - -23.763101080 -59.322356602 -} -857763c7fffffff -{ - 9.864025426 160.766679731 - 9.775146617 160.777500160 - 9.738169351 160.854860041 - 9.790009911 160.921350401 - 9.878797802 160.910571732 - 9.915836034 160.833260946 -} -854e258ffffffff -{ - 16.343591851 152.582169803 - 16.253334618 152.595356055 - 16.215282609 152.681778532 - 16.267457606 152.754983515 - 16.357652055 152.741837599 - 16.395734322 152.655446336 -} -85798993fffffff -{ - 0.992438486 -138.491274850 - 0.906548019 -138.524925182 - 0.838005383 -138.468621697 - 0.855306301 -138.378732748 - 0.941119093 -138.345075132 - 1.009708631 -138.401313627 -} -8517636ffffffff -{ - 63.096004862 172.119953668 - 63.004786014 172.095203652 - 62.951828543 172.259585406 - 62.989774207 172.449029220 - 63.080887400 172.474991005 - 63.134161448 172.310299279 -} -8506560bfffffff -{ - 65.560429702 -36.853926637 - 65.563059892 -37.065407310 - 65.484272331 -37.176842889 - 65.403124013 -37.077214465 - 65.400593448 -36.867021018 - 65.479111883 -36.755174002 -} -850b4d33fffffff -{ - 72.951545219 74.458034902 - 72.945537270 74.763553263 - 73.020637324 74.921600399 - 73.102116622 74.772701367 - 73.108079652 74.464254631 - 73.032608433 74.307653672 -} -850f5d43fffffff -{ - 58.488036313 -64.204345559 - 58.449631712 -64.373484631 - 58.353582314 -64.395204240 - 58.296024905 -64.248643001 - 58.334277785 -64.080164531 - 58.430239230 -64.057588057 -} -85f1b37bfffffff -{ - -74.624444421 113.751540457 - -74.559172308 113.509410522 - -74.581756231 113.165490335 - -74.669816237 113.060798700 - -74.735511254 113.302872362 - -74.712721847 113.649710297 -} -85b94a8ffffffff -{ - -34.944831968 123.240818036 - -34.857058188 123.249177955 - -34.808733203 123.169585088 - -34.848068519 123.081663089 - -34.935730321 123.073127632 - -34.984168802 123.152689434 -} -859e142ffffffff -{ - -14.973860892 168.417037497 - -14.893616145 168.383176875 - -14.875544338 168.293374330 - -14.937721314 168.237280063 - -15.018071062 168.271063680 - -15.036138829 168.361018800 -} -85c3635bfffffff -{ - -37.323610313 -66.260362590 - -37.391410773 -66.315326165 - -37.452463799 -66.270849204 - -37.445709864 -66.171448188 - -37.377941348 -66.116591528 - -37.316894841 -66.161028838 -} -857aae9bfffffff -{ - 3.893936919 48.168225423 - 3.977766344 48.165924551 - 4.025159175 48.092499948 - 3.988746621 48.021289348 - 3.904853306 48.023540295 - 3.857436393 48.097051817 -} -852b58c3fffffff -{ - 38.458341668 -63.388678912 - 38.423244724 -63.493366160 - 38.341117861 -63.508269832 - 38.294154678 -63.418809385 - 38.329138375 -63.314379935 - 38.411198249 -63.299153481 -} -85f2a427fffffff -{ - -83.715240291 -163.047944343 - -83.801480457 -162.906659377 - -83.826545851 -162.120913767 - -83.764581144 -161.493214264 - -83.678724471 -161.653577972 - -83.654436748 -162.422758644 -} -852f72c3fffffff -{ - 32.795241497 145.341590455 - 32.884984092 145.319561254 - 32.914767038 145.221527993 - 32.854821803 145.145743409 - 32.765194762 145.167920293 - 32.735397390 145.265734420 -} -85af32bbfffffff -{ - -21.002713143 85.213523656 - -21.093678753 85.242930058 - -21.116020065 85.339966399 - -21.047417338 85.407453614 - -20.956538890 85.377973591 - -20.934175994 85.281079755 -} -85093453fffffff -{ - 63.153357722 -9.536875111 - 63.106974316 -9.664516466 - 63.032721533 -9.617345019 - 63.004822909 -9.443136163 - 63.051099722 -9.315685135 - 63.125381459 -9.362251835 -} -854b0817fffffff -{ - 29.054264288 127.926243782 - 28.977024003 127.943531711 - 28.955792943 128.036103234 - 29.011839879 128.111437807 - 29.089095281 128.094154594 - 29.110288701 128.001532013 -} -855b9253fffffff -{ - 16.018280501 -175.944124030 - 16.102632309 -175.927679162 - 16.152669357 -175.997349522 - 16.118235763 -176.083483815 - 16.033806776 -176.099803430 - 15.983888487 -176.030114185 -} -8517096bfffffff -{ - 60.296628776 163.137643082 - 60.206406765 163.143732299 - 60.165462628 163.309154361 - 60.214481738 163.469041830 - 60.304703196 163.463992623 - 60.345906915 163.298015709 -} -858e9bc3fffffff -{ - -16.460652155 -93.475130200 - -16.534055079 -93.535990680 - -16.622858476 -93.499626687 - -16.638285514 -93.402331727 - -16.564864590 -93.341436729 - -16.476034655 -93.377871088 -} -853c3113fffffff -{ - 28.922515507 83.663624626 - 28.840822756 83.696181924 - 28.827080894 83.797617171 - 28.894946297 83.866700926 - 28.976700429 83.834355769 - 28.990527940 83.732714400 -} -856d5447fffffff -{ - 11.120955008 -91.363961198 - 11.191944882 -91.305828443 - 11.273213994 -91.335739427 - 11.283483519 -91.423904951 - 11.212398403 -91.482079777 - 11.131139102 -91.452047103 -} -855f8247fffffff -{ - 8.398359095 -47.469956470 - 8.477931606 -47.420191890 - 8.557908772 -47.465545724 - 8.558334260 -47.560630462 - 8.478807821 -47.610381609 - 8.398809843 -47.565061581 -} -85eea087fffffff -{ - -74.172619206 -12.451809379 - -74.081278466 -12.335269861 - -74.007565491 -12.563882043 - -74.024693398 -12.908561557 - -74.115737726 -13.027991576 - -74.189952051 -12.799872989 -} -85b98123fffffff -{ - -29.524402152 137.018930644 - -29.431333337 137.011857039 - -29.392386314 136.917977359 - -29.446389257 136.831103561 - -29.539408232 136.837970991 - -29.578474231 136.931918335 -} -851b89cffffffff -{ - 50.652109339 -51.077036334 - 50.629997776 -51.217304626 - 50.542564635 -51.262784955 - 50.477410271 -51.168408046 - 50.499488789 -51.028682765 - 50.586754589 -50.982792794 -} -857e810bfffffff -{ - 2.487345273 177.699654328 - 2.410695715 177.686293609 - 2.351391130 177.739755575 - 2.368690958 177.806669521 - 2.445404317 177.820105272 - 2.504754071 177.766552007 -} -85476303fffffff -{ - 32.744194788 -162.551971560 - 32.660698489 -162.581205405 - 32.603183448 -162.508330912 - 32.629166548 -162.406161317 - 32.712696301 -162.376825723 - 32.770209551 -162.449761364 -} -85f13143fffffff -{ - -82.372438078 130.870575976 - -82.418253159 130.313593863 - -82.501620373 130.368872785 - -82.538988789 130.994733388 - -82.492220188 131.556541207 - -82.409046181 131.487708453 +8505281bfffffff +{ + 81.445932612 110.484495288 + 81.388628474 110.991818101 + 81.425800303 111.581503924 + 81.520926862 111.672260826 + 81.579084454 111.161398942 + 81.541253811 110.563265129 +} +85f17287fffffff +{ + -86.234313785 77.179369036 + -86.200879823 75.881872958 + -86.257136307 74.824583137 + -86.348732547 75.053248238 + -86.383344610 76.397248666 + -86.325146508 77.465216098 +} +854643b7fffffff +{ + 22.840248089 -160.246253760 + 22.749800659 -160.275452925 + 22.683250452 -160.205679628 + 22.707134385 -160.106663525 + 22.797609323 -160.077376638 + 22.864172867 -160.147193464 +} +8514a5a7fffffff +{ + 51.521601269 125.133991836 + 51.456573114 125.222261470 + 51.465252819 125.362099111 + 51.539043210 125.414226507 + 51.604305638 125.326076588 + 51.595543146 125.185678081 +} +852814c3fffffff +{ + 39.548741467 -120.631749838 + 39.629844061 -120.576265924 + 39.703392197 -120.638501869 + 39.695784672 -120.756233394 + 39.614675768 -120.811553553 + 39.541180669 -120.749306291 +} +85e4a0cffffffff +{ + -54.182310784 106.237073787 + -54.105027102 106.138180683 + -54.115869072 105.974189215 + -54.204054491 105.908394621 + -54.281558043 106.007092062 + -54.270656107 106.171781865 +} +85bf8c43fffffff +{ + -32.440238378 161.374071943 + -32.347972937 161.339116968 + -32.327127755 161.227630578 + -32.398532904 161.150881054 + -32.490879950 161.185672361 + -32.511740311 161.297377255 +} +859a5633fffffff +{ + -10.753718472 -176.737824346 + -10.676943003 -176.696011874 + -10.609798960 -176.739666896 + -10.619370323 -176.825027077 + -10.696033074 -176.866847859 + -10.763237101 -176.823300305 +} +85022c9bfffffff +{ + 81.178260362 -89.646776420 + 81.115008696 -90.059098124 + 81.033537779 -89.902680638 + 81.014940193 -89.341452438 + 81.077483107 -88.928559983 + 81.159328546 -89.077388840 +} +854f2d2ffffffff +{ + 11.204954522 153.953734045 + 11.112920819 153.966468139 + 11.075635824 154.051058212 + 11.130339146 154.122879711 + 11.222303067 154.110186130 + 11.259633468 154.025630515 +} +85150d0bfffffff +{ + 59.730965274 117.962214429 + 59.666640403 118.092385457 + 59.687155358 118.267967011 + 59.772166841 118.314207553 + 59.836783343 118.183992065 + 59.816096116 118.007578127 +} +852c552bfffffff +{ + 43.091017672 51.128331331 + 43.020013752 51.212180439 + 43.037647523 51.334633363 + 43.126400987 51.373536052 + 43.197552775 51.289646352 + 43.179803023 51.166894040 +} +8502b6a3fffffff +{ + 74.598372478 -143.583752446 + 74.537934818 -143.847693218 + 74.448297197 -143.795736015 + 74.419007161 -143.483223591 + 74.478978838 -143.220141580 + 74.568704201 -143.268703395 +} +850326d7fffffff +{ + 89.149824657 96.752290344 + 89.111572550 102.242978161 + 89.158451569 107.662272919 + 89.250958051 108.185273563 + 89.297059128 101.931998149 + 89.241870054 95.940113913 } -85054243fffffff +85ecacb3fffffff +{ + -66.690774974 142.356966172 + -66.658386957 142.149204341 + -66.717093207 141.977042768 + -66.808467202 142.012550100 + -66.840972361 142.221528814 + -66.781985713 142.393779221 +} +85e299abfffffff +{ + -57.891298365 -116.693240884 + -57.839122907 -116.547995714 + -57.746181447 -116.564295203 + -57.705410798 -116.725147375 + -57.757443116 -116.870097500 + -57.850388788 -116.854490834 +} +85c75b13fffffff +{ + -36.248547138 -141.211384997 + -36.156844707 -141.187778016 + -36.096418871 -141.271586775 + -36.127644612 -141.379104433 + -36.219379632 -141.402921684 + -36.279856425 -141.319011105 +} +854493d7fffffff +{ + 27.627524200 -74.715784986 + 27.683688874 -74.654050954 + 27.766124992 -74.670176197 + 27.792477903 -74.748180425 + 27.736280780 -74.810032437 + 27.653763205 -74.793762176 +} +854ed3affffffff +{ + 29.249149652 147.754458964 + 29.339590171 147.735505277 + 29.372887085 147.640276640 + 29.315739815 147.564201112 + 29.225406499 147.583304202 + 29.192113219 147.678333709 +} +853d09d7fffffff +{ + 33.952489347 83.420881386 + 33.866404122 83.456429189 + 33.850940466 83.566215147 + 33.921472335 83.640695055 + 34.007617642 83.605394054 + 34.023171170 83.495365939 +} +85176b83fffffff +{ + 62.751743467 177.706751833 + 62.662659862 177.663529287 + 62.604082996 177.812093137 + 62.634272983 178.003948501 + 62.723193579 178.048251414 + 62.782087866 177.899621757 +} +85956c6bfffffff +{ + -1.723356247 128.296403646 + -1.817105284 128.312900120 + -1.851108057 128.401475616 + -1.791344761 128.473600193 + -1.697544444 128.457108652 + -1.663558663 128.368487532 +} +85f28077fffffff +{ + -87.045681757 -135.139558847 + -87.116881906 -134.022570160 + -87.097946785 -132.255479974 + -87.008614859 -131.697687003 + -86.939784936 -132.830062618 + -86.957949610 -134.507774998 +} +856e689bfffffff +{ + 7.877315569 -125.479259169 + 7.950789976 -125.441145378 + 8.025605123 -125.489831596 + 8.026841999 -125.576616066 + 7.953329557 -125.614621142 + 7.878618189 -125.565950587 +} +85a8299bfffffff +{ + -24.239918184 -53.852554583 + -24.171384827 -53.801352357 + -24.093626299 -53.846577698 + -24.084445922 -53.942943754 + -24.152987233 -53.994103264 + -24.230700979 -53.948939553 +} +85237267fffffff +{ + 39.900531794 -170.360835610 + 39.990507001 -170.333118430 + 40.056030382 -170.417362967 + 40.031491433 -170.529411942 + 39.941411590 -170.556948228 + 39.875975285 -170.472616909 +} +85561187fffffff +{ + 14.324938878 -36.340745695 + 14.398104038 -36.292702460 + 14.475138213 -36.338888157 + 14.479057195 -36.433128584 + 14.405923437 -36.481205204 + 14.328839282 -36.435008138 +} +85cc6083fffffff +{ + -48.326161703 73.883896301 + -48.239814202 73.865021939 + -48.212339622 73.741645695 + -48.271036100 73.636828451 + -48.357389427 73.655211018 + -48.385040827 73.778902942 +} +85d47317fffffff +{ + -46.597705278 -169.256829650 + -46.521654749 -169.200747507 + -46.447128838 -169.274389390 + -46.448618802 -169.403943339 + -46.524604618 -169.460115536 + -46.599165188 -169.386644302 +} +852a4b4ffffffff +{ + 30.865242490 -66.847668019 + 30.830637572 -66.935793752 + 30.757808849 -66.943525500 + 30.719619265 -66.863378027 + 30.754109063 -66.775421142 + 30.826903341 -66.767443026 +} +85ba0b37fffffff +{ + -30.024205036 177.124917828 + -29.941658962 177.079102260 + -29.933734789 176.978983333 + -30.008425840 176.924481476 + -30.091097669 176.970252385 + -30.098952617 177.070570134 +} +85f05453fffffff +{ + -77.504586837 51.211202941 + -77.436970656 50.922185574 + -77.454863685 50.524832120 + -77.540712004 50.411875876 + -77.608924997 50.700819242 + -77.590690133 51.102825414 +} +8582d58ffffffff +{ + 2.374152871 8.593131634 + 2.458794438 8.604412978 + 2.503723152 8.539114080 + 2.464091286 8.462590940 + 2.379531925 8.451277757 + 2.334522216 8.516519481 +} +855356cffffffff +{ + 23.789802769 44.864974442 + 23.700358058 44.843981788 + 23.640920996 44.913181457 + 23.670842824 45.003303553 + 23.760179597 45.024389313 + 23.819702475 44.955260092 +} +852aaed7fffffff +{ + 40.284170188 -77.298347587 + 40.235530873 -77.397114552 + 40.150000685 -77.387587093 + 40.113079982 -77.279664758 + 40.161542998 -77.181033028 + 40.247102699 -77.190188199 +} +85032213fffffff { - 81.432376084 152.212270430 - 81.338316339 152.350715615 - 81.308261702 152.960845663 - 81.371730742 153.442240226 - 81.466145379 153.315049048 - 81.496743294 152.695119723 + 89.372703570 -124.181533300 + 89.336778042 -131.646338196 + 89.242858638 -132.088984912 + 89.187290179 -126.718488518 + 89.216837672 -120.510250043 + 89.307362476 -118.537228884 } -854cd293fffffff -{ - 18.223852037 -71.077571016 - 18.167903755 -71.126146597 - 18.097643868 -71.088931872 - 18.083394725 -71.003154647 - 18.139389313 -70.954639610 - 18.209586747 -70.991841158 -} -85af73b7fffffff -{ - -18.111036535 94.068066378 - -18.196230478 94.100378607 - -18.214255301 94.188737853 - -18.147142362 94.244652197 - -18.062059412 94.212310017 - -18.043978461 94.124083268 -} -85dda5d7fffffff -{ - -61.613766771 -3.822441473 - -61.526233092 -3.785831738 - -61.464947267 -3.931877224 - -61.490896849 -4.114722017 - -61.578343080 -4.152378423 - -61.639927946 -4.006145559 -} -8518621bfffffff -{ - 49.130318851 -2.730932503 - 49.077437762 -2.829290359 - 48.989854445 -2.804555939 - 48.955193174 -2.681814957 - 49.008015630 -2.583642035 - 49.095557829 -2.608025097 -} -8584f633fffffff -{ - -10.389786734 65.017480215 - -10.479431306 65.031876765 - -10.510202742 65.120444289 - -10.451251439 65.194548701 - -10.361609829 65.180035182 - -10.330916450 65.091534161 -} -852d0e77fffffff -{ - 41.983113231 37.077791920 - 41.894516572 37.059022654 - 41.834292015 37.153740975 - 41.862603131 37.267191139 - 41.951136084 37.286144995 - 42.011421728 37.191464439 -} -858d705bfffffff -{ - -15.546461184 106.301942109 - -15.471827101 106.281950689 - -15.455210809 106.197245577 - -15.513282631 106.132544067 - -15.587912112 106.152591138 - -15.604474452 106.237284121 -} -85076123fffffff -{ - 62.916081304 -13.920334190 - 62.944393990 -14.072355625 - 62.890195267 -14.210846693 - 62.807868230 -14.196892747 - 62.779788915 -14.045372807 - 62.833803822 -13.907305533 -} -85dd720bfffffff -{ - -60.768128598 -22.703554650 - -60.689183716 -22.609498209 - -60.610186601 -22.707553599 - -60.609862338 -22.899161979 - -60.688553943 -22.993791220 - -60.767823152 -22.896243396 -} -850445c3fffffff -{ - 76.582689071 179.280128092 - 76.489045076 179.181767703 - 76.422263957 179.474838368 - 76.448550451 179.866270390 - 76.541882967 179.968939824 - 76.609242927 179.675897323 -} -85b76523fffffff -{ - -32.968671403 -106.006578850 - -32.906245105 -105.923825561 - -32.816107091 -105.949082182 - -32.788324346 -106.056845826 - -32.850602225 -106.139586317 - -32.940811099 -106.114576327 -} -85b3493bfffffff -{ - -25.664028296 -60.773961771 - -25.739512157 -60.821648399 - -25.809828014 -60.780453393 - -25.804631855 -60.691624918 - -25.729197451 -60.644047872 - -25.658909774 -60.685189648 -} -85d0d007fffffff -{ - -54.063419748 13.913458583 - -54.147782192 13.900414820 - -54.189116806 14.015119004 - -54.146045403 14.142574803 - -54.061735808 14.155208932 - -54.020444572 14.040796666 -} -85af15d7fffffff -{ - -21.601961520 86.755330959 - -21.692191859 86.785651828 - -21.713334004 86.882297562 - -21.644275539 86.948477464 - -21.554136700 86.918089580 - -21.532964823 86.821588590 -} -8594b02bfffffff -{ - -17.498504422 119.505174546 - -17.578169497 119.521165570 - -17.613839799 119.601613771 - -17.569839601 119.666130961 - -17.490108542 119.650131094 - -17.454443647 119.569622831 -} -85381b57fffffff -{ - 29.965365758 1.020046119 - 29.874416099 1.035148525 - 29.840830169 1.128445774 - 29.898210948 1.206820870 - 29.989260669 1.191844991 - 30.022829571 1.098367252 -} -85e60493fffffff -{ - -65.723849022 23.792803525 - -65.638331660 23.730894933 - -65.612405679 23.521271771 - -65.671886584 23.372263347 - -65.757626095 23.432991737 - -65.783663120 23.643913731 -} -85c872cffffffff -{ - -42.345347972 105.653352051 - -42.273999013 105.579316181 - -42.282792586 105.454961260 - -42.362981561 105.404240968 - -42.434517627 105.478157085 - -42.425677490 105.602914169 -} -85efb55bfffffff -{ - -80.363903663 13.759956885 - -80.268940989 13.696611162 - -80.230545630 13.189631915 - -80.286577559 12.739457322 - -80.381755190 12.793629484 - -80.420692108 13.307188207 -} -85bb0a47fffffff -{ - -38.513466499 178.623300018 - -38.433141506 178.571418952 - -38.430929081 178.461485228 - -38.509122135 178.403192389 - -38.589562691 178.455031257 - -38.591694564 178.565205584 -} -85d08597fffffff -{ - -50.583723877 6.788290407 - -50.671817844 6.764574828 - -50.723901868 6.871950506 - -50.687824372 7.002856074 - -50.599755932 7.026194252 - -50.547739264 6.919004387 -} -85502cdbfffffff -{ - 17.954517728 -132.640338518 - 17.870397074 -132.676757613 - 17.795327691 -132.621253579 - 17.804383576 -132.529426549 - 17.888436640 -132.493020973 - 17.963501405 -132.548428788 -} -85bfaa2ffffffff -{ - -33.485568060 161.460173108 - -33.393296012 161.424699006 - -33.372683739 161.311836465 - -33.444329588 161.234224252 - -33.536682820 161.269531141 - -33.557309090 161.382617866 -} -855a18abfffffff -{ - 16.612055138 172.011463804 - 16.699963671 172.017158311 - 16.747453443 171.936453469 - 16.706925489 171.850109546 - 16.618995576 171.844573692 - 16.571614851 171.925223046 -} -859b03affffffff -{ - -20.708123060 -173.745538503 - -20.624902334 -173.700681496 - -20.548878992 -173.752063811 - -20.556024987 -173.848184095 - -20.639137352 -173.893067885 - -20.715212025 -173.841804836 -} -85030307fffffff -{ - 85.784790664 -106.959042657 - 85.778979380 -108.187455766 - 85.695624809 -108.751764764 - 85.619528789 -108.114021813 - 85.625320259 -106.930759120 - 85.707225282 -106.341198810 -} -85d86a37fffffff -{ - -49.907879950 120.123672433 - -49.845042557 120.014384011 - -49.872266909 119.877229011 - -49.962486123 119.848942864 - -50.025527911 119.958351936 - -49.998145691 120.095927218 -} -8577336ffffffff -{ - 6.124716421 151.937309806 - 6.031057815 151.950460612 - 5.995434376 152.036118764 - 6.053417849 152.108597589 - 6.147015642 152.095485508 - 6.182690806 152.009855850 -} -85a4ad1bfffffff -{ - -22.983403698 -31.135921368 - -23.060575178 -31.184729986 - -23.135734643 -31.140234842 - -23.132689875 -31.045574703 - -23.054414780 -30.995573149 - -22.979311024 -31.040215622 - -22.980876144 -31.087474233 -} -8544f613fffffff -{ - 29.263441657 -81.065357148 - 29.324661547 -80.999667875 - 29.410634657 -81.023041793 - 29.435451734 -81.112269314 - 29.374188573 -81.178064972 - 29.288151645 -81.154526723 -} -85c9290bfffffff -{ - -45.629370118 118.644653490 - -45.566594867 118.547389976 - -45.590336671 118.421896366 - -45.676993268 118.393306001 - -45.739965669 118.490645054 - -45.716083988 118.616499544 -} -8514d563fffffff -{ - 49.987960911 136.991574617 - 49.916259662 137.053989123 - 49.910714854 137.190604277 - 49.976852946 137.265350258 - 50.048743869 137.203253986 - 50.054307083 137.066092023 -} -85ac8023fffffff -{ - -19.098142290 15.465171135 - -19.004859354 15.475549295 - -18.947770837 15.397005050 - -18.983930336 15.308123926 - -19.077150234 15.297692218 - -19.134273714 15.376195093 -} -85326617fffffff -{ - 31.430261792 161.552254044 - 31.526705505 161.547147476 - 31.571649130 161.447010449 - 31.520083075 161.352136755 - 31.423680002 161.357460334 - 31.378802196 161.457440725 -} -85ef8b0bfffffff -{ - -75.596615206 -13.747121583 - -75.505769327 -13.611215039 - -75.430743859 -13.855634345 - -75.446023594 -14.235196841 - -75.536524145 -14.374454790 - -75.612091884 -14.130828308 -} -85050597fffffff -{ - 79.901660583 107.061801434 - 79.848561203 107.510251130 - 79.890706378 107.996711753 - 79.986568272 108.039945171 - 80.040355256 107.587927777 - 79.997586535 107.096228905 -} -85033267fffffff -{ - 86.369891289 -164.723067105 - 86.288732066 -165.439231231 - 86.206330117 -164.717385565 - 86.203413527 -163.311903218 - 86.282807694 -162.567365870 - 86.366880084 -163.254867222 -} -85053163fffffff -{ - 77.464548268 105.226673484 - 77.413459385 105.596187886 - 77.457847994 105.982130192 - 77.553856682 106.001642862 - 77.605481387 105.629455258 - 77.560557483 105.240425019 -} -85033573fffffff -{ - 88.626146272 -176.622523756 - 88.538286096 -177.753082955 - 88.467240190 -175.364094047 - 88.479137684 -171.909205675 - 88.563602443 -170.478126273 - 88.639693024 -172.775040090 +85e16d9bfffffff +{ + -67.359320182 43.535533130 + -67.287776497 43.401866119 + -67.290016107 43.180782916 + -67.363925362 43.091863838 + -67.435815705 43.225106911 + -67.433449599 43.447699636 +} +85191867fffffff +{ + 57.017304612 -11.408889372 + 56.962531479 -11.519049453 + 56.881564367 -11.474582344 + 56.855352283 -11.320405446 + 56.910034402 -11.210358313 + 56.991019401 -11.254374482 +} +859e8267fffffff +{ + -8.694584637 167.677128659 + -8.620590802 167.646010757 + -8.601960919 167.561989727 + -8.657317558 167.508954051 + -8.731403622 167.540001767 + -8.750040828 167.624155534 +} +85628c0bfffffff +{ + 5.248513710 57.171336854 + 5.179164118 57.178813367 + 5.158351453 57.251555616 + 5.206966942 57.316797182 + 5.276322882 57.309229892 + 5.297057087 57.236511824 +} +853731d7fffffff +{ + 42.256280327 -151.241949545 + 42.185605271 -151.278967627 + 42.129580215 -151.203112798 + 42.144223760 -151.090250504 + 42.214895136 -151.053158990 + 42.270926701 -151.129002980 +} +859aed17fffffff +{ + -8.573833084 -177.517293923 + -8.499074538 -177.476151212 + -8.434514451 -177.518067308 + -8.444652119 -177.601021442 + -8.519299446 -177.642168732 + -8.583920245 -177.600357447 +} +85a3b187fffffff +{ + -19.181538283 39.949926039 + -19.086672577 39.950676557 + -19.040066301 39.865190224 + -19.088333925 39.778872027 + -19.183248685 39.778050181 + -19.229846829 39.863617895 +} +8594ad37fffffff +{ + -15.128462147 124.485237787 + -15.212240024 124.501460559 + -15.246987088 124.586142514 + -15.197954657 124.654654033 + -15.114119008 124.638429786 + -15.079373526 124.553695434 +} +850a64a7fffffff +{ + 72.209733248 82.899393951 + 72.190761344 83.192069388 + 72.258761248 83.381969753 + 72.346152804 83.278609786 + 72.365214447 82.983319429 + 72.296794056 82.794018895 +} +850052b7fffffff +{ + 84.748724522 24.452644461 + 84.815373058 25.083009658 + 84.901572493 24.732139237 + 84.920136035 23.726948459 + 84.852110836 23.102297011 + 84.766908444 23.476573375 +} +8576926ffffffff +{ + -10.205407655 153.675523027 + -10.291262496 153.687937330 + -10.318106080 153.770177092 + -10.259168478 153.839970850 + -10.173357101 153.827594478 + -10.146439804 153.745386397 +} +85bb29dbfffffff +{ + -41.770142913 174.980224035 + -41.688198812 174.928378044 + -41.684034175 174.809827921 + -41.761875695 174.742847546 + -41.843927955 174.794611942 + -41.848030500 174.913438851 +} +8558966ffffffff +{ + 5.712740532 0.876225479 + 5.635604175 0.888295042 + 5.597244193 0.962247385 + 5.635988581 1.024243775 + 5.713198500 1.012253361 + 5.751590511 0.938187290 +} +850f95cbfffffff +{ + 67.620054164 -95.087202870 + 67.545926921 -95.246327627 + 67.456969991 -95.160947645 + 67.441916302 -94.917615607 + 67.515756248 -94.758070990 + 67.604936754 -94.842271069 +} +85e89473fffffff +{ + -70.158675106 -68.184284495 + -70.129814680 -67.917127071 + -70.036981337 -67.853728668 + -69.973226122 -68.055460791 + -70.001894776 -68.320653600 + -70.094509230 -68.386070188 +} +854f8353fffffff +{ + 21.740569190 160.101913973 + 21.832106370 160.095896408 + 21.875544333 160.006014105 + 21.827373442 159.922282150 + 21.735881313 159.928470909 + 21.692514891 160.018220542 +} +85f3ab03fffffff +{ + -80.101311582 -169.878935407 + -80.184773293 -169.852664173 + -80.217499214 -169.390425709 + -80.166130509 -168.959482588 + -80.082724195 -168.993658256 + -80.050625616 -169.450891417 +} +8516c6a7fffffff +{ + 48.996039950 169.052808914 + 49.087498863 169.057070088 + 49.135423235 168.934317759 + 49.091807995 168.807467124 + 49.000345020 168.803562836 + 48.952501118 168.926152227 +} +8529b51bfffffff +{ + 33.844966816 -114.620797111 + 33.927003065 -114.562299427 + 34.008538484 -114.618526981 + 34.007983130 -114.733307243 + 33.925918137 -114.791692232 + 33.844437233 -114.735410000 +} +85479167fffffff +{ + 24.281610750 -178.727198458 + 24.373540036 -178.711735848 + 24.429059768 -178.791345906 + 24.392532839 -178.886421629 + 24.300530064 -178.901721467 + 24.245127610 -178.822108565 +} +85c6ee77fffffff +{ + -33.016351909 -132.427003139 + -32.926414019 -132.413909658 + -32.872394538 -132.493606373 + -32.908280633 -132.586539309 + -32.998290783 -132.599820545 + -33.052342639 -132.519981024 +} +85053237fffffff +{ + 76.030325477 104.364517434 + 75.980201613 104.699319869 + 76.025446442 105.042840795 + 76.121306861 105.053921672 + 76.171903641 104.716836554 + 76.126163771 104.370952688 +} +85e812b7fffffff +{ + -66.813650115 -84.957267753 + -66.809439958 -84.726100853 + -66.728948522 -84.611097761 + -66.652996195 -84.726498420 + -66.657253490 -84.956052074 + -66.737416132 -85.071810810 +} +858aa5affffffff +{ + -7.433717505 -58.508910829 + -7.355643882 -58.460452336 + -7.272376298 -58.502248068 + -7.267222769 -58.592430716 + -7.345262459 -58.640832443 + -7.428489608 -58.599108370 +} +85c48e8bfffffff +{ + -43.596900860 -44.046455781 + -43.660936560 -44.115921445 + -43.743423432 -44.080240529 + -43.761911109 -43.974816308 + -43.697792837 -43.905256556 + -43.615269555 -43.941214944 +} +85e985c7fffffff +{ + -71.668654647 -96.394176660 + -71.683062980 -96.111719574 + -71.611764899 -95.921351867 + -71.526488595 -96.013199293 + -71.512298322 -96.293350376 + -71.583167489 -96.483948222 +} +8584a273fffffff +{ + -10.609841242 59.528321343 + -10.698561918 59.538615018 + -10.730489385 59.623458089 + -10.673601788 59.697965331 + -10.584858114 59.687552837 + -10.553024929 59.602751914 +} +85a5958bfffffff +{ + -16.539793375 -37.003815750 + -16.459014067 -36.953430191 + -16.378765509 -37.001713128 + -16.379298251 -37.100391271 + -16.460101498 -37.150810388 + -16.540348055 -37.102517949 +} +85675367fffffff +{ + 10.135640745 -70.972842886 + 10.070359214 -71.022743025 + 9.991909550 -70.984468785 + 9.978814641 -70.896308589 + 10.044138788 -70.846472839 + 10.122515250 -70.884732793 +} +8548532ffffffff +{ + 30.947452422 -112.810476600 + 31.029771284 -112.751885882 + 31.113659350 -112.805681173 + 31.115173378 -112.918132116 + 31.032816999 -112.976627216 + 30.948984108 -112.922767318 +} +85661b5bfffffff +{ + 5.554921996 -76.738091366 + 5.483423510 -76.791917922 + 5.400434911 -76.753177882 + 5.389005329 -76.660605497 + 5.460547625 -76.606823984 + 5.543475693 -76.645569686 +} +858b4eabfffffff +{ + -9.301630716 -70.805734683 + -9.379928095 -70.858687053 + -9.465685804 -70.817995783 + -9.473088414 -70.724368798 + -9.394789664 -70.671489837 + -9.309089668 -70.712164329 +} +85419507fffffff +{ + 28.603501639 118.525992054 + 28.685683124 118.509024452 + 28.721982482 118.423208041 + 28.676061152 118.354336868 + 28.593808589 118.371387212 + 28.557548421 118.457225981 +} +85a85263fffffff +{ + -18.746119236 -52.479843128 + -18.671759177 -52.428772955 + -18.590222411 -52.474191109 + -18.583086432 -52.570623696 + -18.657446844 -52.621657435 + -18.738942891 -52.576295144 +} +853b5ad3fffffff +{ + 31.552911592 -45.227264995 + 31.468825775 -45.270614274 + 31.392013221 -45.209165003 + 31.399171955 -45.104358623 + 31.483232088 -45.060815912 + 31.560159276 -45.122272723 +} +852f5993fffffff +{ + 34.029566217 139.126237289 + 34.114974866 139.098617373 + 34.138358432 139.003991810 + 34.076379310 138.937207247 + 33.991099944 138.964936263 + 33.967670461 139.059341092 +} +85650c8bfffffff +{ + 3.184033325 100.001836126 + 3.276870746 99.978229256 + 3.302358132 99.885331210 + 3.234971572 99.816072096 + 3.142137896 99.839730296 + 3.116686973 99.932596373 +} +85432b97fffffff +{ + 32.314661263 56.335514076 + 32.241535556 56.402088686 + 32.249896998 56.508803911 + 32.331463784 56.549183409 + 32.404740520 56.482628608 + 32.396299291 56.375674089 +} +85432197fffffff +{ + 32.539925517 52.903139700 + 32.469310502 52.972370089 + 32.480520723 53.076676506 + 32.562443573 53.111973794 + 32.633208526 53.042730874 + 32.621900515 52.938202853 +} +85afa437fffffff +{ + -24.548570907 84.816589511 + -24.639816341 84.846633225 + -24.661330340 84.946676997 + -24.591622692 85.016526306 + -24.500459448 84.986402724 + -24.478921640 84.886509464 +} +85401477fffffff +{ + 28.271351066 111.733445520 + 28.355975553 111.712968138 + 28.389067944 111.619747060 + 28.337503235 111.547001285 + 28.252825521 111.567559438 + 28.219765704 111.660782636 +} +8557a223fffffff +{ + 20.862383803 -41.576546006 + 20.785095206 -41.619286998 + 20.708100272 -41.566429122 + 20.708271863 -41.470846964 + 20.785501186 -41.427965339 + 20.862618285 -41.480806262 +} +85cb2653fffffff +{ + -30.780626123 47.729220117 + -30.870658849 47.731009192 + -30.916439079 47.816540682 + -30.872102706 47.900296397 + -30.781981592 47.898364949 + -30.736285208 47.812820293 +} +85792573fffffff +{ + 11.093245452 -134.304751881 + 11.006643628 -134.340108833 + 10.933113488 -134.284758932 + 10.946168755 -134.194137707 + 11.032692261 -134.158787873 + 11.106238800 -134.214052025 +} +85188c87fffffff +{ + 49.377272061 -20.173726985 + 49.307656846 -20.263609258 + 49.222304924 -20.211518614 + 49.206522910 -20.069834747 + 49.276048337 -19.979917392 + 49.361445447 -20.031718243 +} +852176dbfffffff +{ + 52.936049255 64.252071394 + 52.855618877 64.337232835 + 52.860312605 64.496277809 + 52.945471973 64.570711824 + 53.026049730 64.485749070 + 53.021320658 64.326152059 +} +85b96613fffffff +{ + -39.709904915 127.367695937 + -39.619689095 127.371805724 + -39.570530093 127.279703859 + -39.611477456 127.183493706 + -39.701595655 127.179158332 + -39.750864180 127.271258407 } -8514d63bfffffff -{ - 48.872556288 135.503002044 - 48.803003067 135.566327562 - 48.799200147 135.698636862 - 48.864944578 135.768133215 - 48.934688279 135.705083473 - 48.938497085 135.572260252 -} -85f2d0c7fffffff -{ - -82.804100934 -90.937024317 - -82.814270106 -90.198583438 - -82.736872720 -89.771910585 - -82.650292663 -90.078734646 - -82.640384517 -90.801122516 - -82.716799477 -91.232508714 -} -85f18a47fffffff -{ - -75.710341851 95.241838608 - -75.628891279 95.068994715 - -75.622364976 94.692002615 - -75.697225203 94.484116205 - -75.779032516 94.654596876 - -75.785623398 95.035353933 -} -85f22d8ffffffff -{ - -75.290481685 -139.580809921 - -75.356883990 -139.390809526 - -75.343720509 -139.049417868 - -75.264178893 -138.901618367 - -75.198230180 -139.092908159 - -75.211369873 -139.430732518 -} -8532746ffffffff -{ - 33.224430602 163.454524954 - 33.321456259 163.451489408 - 33.367905491 163.349680502 - 33.317257645 163.251057622 - 33.220261450 163.254323401 - 33.173883479 163.355981922 -} -8568e9a7fffffff -{ - 4.733832657 125.343489942 - 4.640255697 125.360191464 - 4.608217287 125.447928187 - 4.669795087 125.519016967 - 4.763431184 125.502315339 - 4.795430374 125.414524969 -} -85cf5657fffffff -{ - -49.022693933 -81.837730780 - -48.941772832 -81.772686210 - -48.862284704 -81.841600476 - -48.863559898 -81.975457896 - -48.944407878 -82.040829170 - -49.024053913 -81.972017318 -} -85380a0bfffffff -{ - 32.073318090 2.104341358 - 31.982023553 2.118922208 - 31.948520658 2.214919655 - 32.006327623 2.296522857 - 32.097716978 2.282079441 - 32.131204586 2.185895141 -} -85e616a7fffffff -{ - -62.369031204 26.134371913 - -62.287699212 26.073432158 - -62.264776967 25.890390822 - -62.323112308 25.767284044 - -62.404660211 25.827392356 - -62.427657195 26.011442410 -} -85ef2bcbfffffff -{ - -81.305209187 -62.170542197 - -81.268963224 -61.587496892 - -81.173654074 -61.511496525 - -81.114840943 -62.007334562 - -81.150492653 -62.581927991 - -81.245544248 -62.669074088 -} -857aad43fffffff -{ - 3.748939231 46.716005211 - 3.833623100 46.714208508 - 3.881309334 46.639774964 - 3.844338047 46.567053634 - 3.759594158 46.568798364 - 3.711881527 46.643316443 -} -8516e6bbfffffff -{ - 51.856634921 167.757458820 - 51.945577059 167.759977319 - 51.990720635 167.630427711 - 51.946842240 167.498556576 - 51.857902259 167.496430214 - 51.812838269 167.625782836 -} -858e0a57fffffff -{ - -12.824001321 -83.493110332 - -12.902106655 -83.552560062 - -12.991253780 -83.512817983 - -13.002281284 -83.413592116 - -12.924159503 -83.354159406 - -12.835026691 -83.393935387 -} -85f296b3fffffff +853733d7fffffff +{ + 41.650856768 -152.287694537 + 41.579043730 -152.324105012 + 41.523061986 -152.248205041 + 41.538887403 -152.135897562 + 41.610699063 -152.099409628 + 41.666686741 -152.175306418 +} +858edb8ffffffff +{ + -21.597315644 -86.278287042 + -21.671351856 -86.339996360 + -21.757574078 -86.299991191 + -21.769767637 -86.198229285 + -21.695729024 -86.136522653 + -21.609499282 -86.176575076 +} +85e234c3fffffff +{ + -64.280114362 -135.886831692 + -64.256420301 -135.704465934 + -64.172326618 -135.673297250 + -64.112040856 -135.823704234 + -64.135680612 -136.005216602 + -64.219660084 -136.037172870 +} +85bb7487fffffff +{ + -41.033454293 172.908958347 + -40.949601840 172.859181249 + -40.942919275 172.740121037 + -41.020141052 172.670562016 + -41.104100267 172.720239266 + -41.110730923 172.839575936 +} +856841affffffff +{ + 9.801645914 126.086283523 + 9.708845469 126.103100736 + 9.678492330 126.191931996 + 9.740983771 126.263998671 + 9.833834508 126.247182645 + 9.864143552 126.158298688 +} +85ee8acbfffffff +{ + -68.216236089 -13.481185118 + -68.127308859 -13.391825663 + -68.053198763 -13.555500061 + -68.067635945 -13.808214813 + -68.156330703 -13.899073001 + -68.230821520 -13.735726294 +} +85d09e67fffffff +{ + -55.021162042 4.006609490 + -55.105463096 3.976123845 + -55.156776074 4.091300624 + -55.123706557 4.236786181 + -55.039408824 4.266832650 + -54.988177053 4.151833061 +} +85eb419bfffffff +{ + -69.424934133 -158.832728224 + -69.493259416 -158.776551147 + -69.504683986 -158.553386165 + -69.447574760 -158.387825863 + -69.379399673 -158.445414953 + -69.368182678 -158.667157807 +} +85f12a67fffffff +{ + -85.222918579 109.172219098 + -85.239259257 108.107654681 + -85.322225474 107.778814399 + -85.389704975 108.544324703 + -85.372603765 109.642362450 + -85.288800252 109.940765933 +} +85a45bd3fffffff +{ + -27.079878662 -21.734673974 + -27.165391273 -21.781530829 + -27.242760242 -21.722801108 + -27.234532800 -21.617098218 + -27.148909661 -21.570327028 + -27.071624514 -21.629172698 +} +8552d213fffffff +{ + 10.124853507 42.655186441 + 10.042122871 42.637949701 + 9.993686486 42.701456958 + 10.027876647 42.782155314 + 10.110518896 42.799472431 + 10.159059394 42.736010965 +} +850a1ab7fffffff +{ + 63.430218689 96.902293960 + 63.390425989 97.086478321 + 63.438408736 97.248616348 + 63.526498043 97.226897034 + 63.566495212 97.041845462 + 63.518197777 96.879382299 +} +850db0a7fffffff +{ + 69.526579823 178.681790420 + 69.434024346 178.619634886 + 69.370394485 178.814981167 + 69.398920824 179.072531482 + 69.491260714 179.136582875 + 69.555290964 178.941196118 +} +85db4d07fffffff +{ + -60.891475134 160.262394797 + -60.817945826 160.209757193 + -60.803771401 160.036338429 + -60.863088239 159.915037804 + -60.936690447 159.967261952 + -60.950903078 160.141201625 +} +851bb627fffffff +{ + 53.923992659 -61.471042716 + 53.888875322 -61.621777064 + 53.794879251 -61.647562197 + 53.736105386 -61.523253664 + 53.771102470 -61.373072556 + 53.864993268 -61.346647927 +} +8581911bfffffff +{ + -7.727504079 -32.690137018 + -7.644332418 -32.641810319 + -7.561380205 -32.689100230 + -7.561574273 -32.784744132 + -7.644765124 -32.833120993 + -7.727742715 -32.785803916 +} +854c1c67fffffff +{ + 22.444281671 -68.150095546 + 22.395344694 -68.196008061 + 22.330536575 -68.159652754 + 22.314722557 -68.077405972 + 22.363703186 -68.031559700 + 22.428454191 -68.067893889 +} +85b89197fffffff +{ + -21.761641155 135.145529255 + -21.673802735 135.141016817 + -21.638760453 135.057264560 + -21.691432565 134.977979674 + -21.779222075 134.982323366 + -21.814388501 135.066120620 +} +85d82873fffffff +{ + -51.652282588 132.159503202 + -51.602790603 132.034500788 + -51.643618507 131.908865198 + -51.734147813 131.907995036 + -51.783794274 132.033347181 + -51.742756544 132.159219494 +} +8504e8cffffffff +{ + 70.719080849 168.150447600 + 70.623052379 168.135180888 + 70.571324580 168.377254984 + 70.615226935 168.635530014 + 70.711179290 168.653255066 + 70.763307181 168.410249709 +} +85874a6bfffffff +{ + -12.891052849 79.564045439 + -12.981298974 79.588636774 + -13.007914129 79.681695195 + -12.944266586 79.750043918 + -12.854089688 79.725365693 + -12.827491054 79.632425464 +} +85f12a77fffffff +{ + -85.269631531 111.008460617 + -85.288800252 109.940765933 + -85.372603765 109.642362450 + -85.438016143 110.443419701 + -85.417989543 111.544137522 + -85.333427360 111.810158836 +} +85047623fffffff +{ + 76.684372295 162.606904066 + 76.587309477 162.624192442 + 76.541856680 162.992859358 + 76.592967486 163.347034632 + 76.690049434 163.334899267 + 76.736005164 162.963432377 +} +8506ec47fffffff +{ + 64.497535381 -41.561509105 + 64.493046008 -41.769014917 + 64.409914141 -41.864218755 + 64.331525081 -41.752494858 + 64.336066994 -41.546227379 + 64.418945527 -41.450450482 +} +8503a597fffffff +{ + 84.226289424 -161.891718011 + 84.146771235 -162.385374524 + 84.061989048 -161.965657648 + 84.055739219 -161.067528063 + 84.134081345 -160.564442513 + 84.219845516 -160.968457685 +} +85f1512bfffffff +{ + -83.361757854 51.068868478 + -83.293526042 50.523606416 + -83.313544007 49.769434014 + -83.402355409 49.543729659 + -83.471682897 50.088382709 + -83.451094081 50.859579348 +} +8580a3a7fffffff +{ + -2.349098712 -36.392905644 + -2.265978380 -36.343690456 + -2.181382588 -36.390990893 + -2.179878344 -36.487518354 + -2.262996942 -36.536768334 + -2.347621522 -36.489456196 +} +85c429b3fffffff +{ + -39.555499311 -31.142774297 + -39.633716684 -31.204116275 + -39.716566702 -31.149565162 + -39.721170917 -31.033450045 + -39.642844969 -30.972131958 + -39.560023460 -31.026904648 +} +85158303fffffff +{ + 50.562268747 119.152540743 + 50.503253019 119.247853682 + 50.518433933 119.379707449 + 50.592754511 119.416722194 + 50.651999605 119.321406497 + 50.636694397 119.189077763 +} +85ef84cffffffff +{ + -79.685310280 2.814467654 + -79.589400236 2.854389351 + -79.535249701 2.422361488 + -79.576339472 1.947220265 + -79.672170034 1.899026661 + -79.726996124 2.334228597 +} +85eea29bfffffff { - -88.236040106 130.907877629 - -88.284549361 128.363789976 - -88.374232782 128.518950055 - -88.414735407 131.516031045 - -88.361914133 134.161821282 - -88.273105841 133.713697579 + -73.481548135 -8.229161555 + -73.388531969 -8.140952175 + -73.319547991 -8.376921638 + -73.343098418 -8.701155304 + -73.435894044 -8.792284904 + -73.505361564 -8.556276231 +} +851cd92ffffffff +{ + 41.507451454 -140.886469597 + 41.440123760 -140.926694470 + 41.377531069 -140.856803600 + 41.382270215 -140.746768708 + 41.449582254 -140.706521283 + 41.512170835 -140.776331076 +} +856b70dbfffffff +{ + 15.092356930 27.214379552 + 15.000296632 27.207370254 + 14.949771207 27.288319331 + 14.991210413 27.376312966 + 15.083241009 27.383455613 + 15.133862219 27.302471350 +} +8500d623fffffff +{ + 81.677407112 89.705723389 + 81.650434177 90.320680412 + 81.715407316 90.791851554 + 81.808247544 90.648519493 + 81.835666418 90.022618430 + 81.769792620 89.551107851 +} +85ee92b3fffffff +{ + -68.845071324 -1.300098151 + -68.752037910 -1.261950266 + -68.691755683 -1.465593312 + -68.724137723 -1.707899838 + -68.817091722 -1.748004984 + -68.877744494 -1.543850507 +} +856a06c3fffffff +{ + 7.714208245 24.595562996 + 7.628803430 24.590955170 + 7.583095812 24.668212100 + 7.622700300 24.750121270 + 7.708090257 24.754848903 + 7.753890707 24.677547596 +} +85129637fffffff +{ + 52.992091697 -132.504240951 + 52.913604196 -132.513408790 + 52.859696235 -132.407942652 + 52.884119057 -132.293057677 + 52.962645187 -132.283372402 + 53.016710217 -132.389089510 +} +850f9673fffffff +{ + 67.336089862 -99.648084933 + 67.258107623 -99.789903967 + 67.172102547 -99.690609785 + 67.163828180 -99.450439129 + 67.241548817 -99.307972314 + 67.327805265 -99.406316577 +} +85155ac3fffffff +{ + 59.525530328 128.887495946 + 59.450842909 128.992603257 + 59.456486046 129.175271956 + 59.536881565 129.253804186 + 59.611849726 129.149024386 + 59.606141382 128.965381366 +} +85e92d77fffffff +{ + -63.560681602 -111.720370658 + -63.505943382 -111.558078898 + -63.418137770 -111.590142975 + -63.385021905 -111.783590649 + -63.439579837 -111.945643104 + -63.527433389 -111.914488592 +} +856ac45bfffffff +{ + 1.476588861 28.792524027 + 1.567607892 28.797485288 + 1.617157431 28.718460148 + 1.575745537 28.634450019 + 1.484734332 28.629427737 + 1.435127105 28.708476581 +} +85ca9e83fffffff +{ + -48.336719850 50.022924235 + -48.415662931 50.027414221 + -48.461930233 50.133986209 + -48.429205239 50.236068586 + -48.350211936 50.231363472 + -48.303993739 50.124791304 +} +8582e1b3fffffff +{ + -1.222626035 5.907997284 + -1.137038780 5.920040744 + -1.089856884 5.856680375 + -1.128184851 5.781342284 + -1.213677893 5.769271443 + -1.260937165 5.832566001 +} +85489187fffffff +{ + 28.447976828 -97.827857259 + 28.523142889 -97.762053690 + 28.612086377 -97.802962157 + 28.625857067 -97.909817802 + 28.550626077 -97.975634503 + 28.461689387 -97.934582657 +} +85ca542ffffffff +{ + -41.027366649 62.332990866 + -41.115891015 62.349011677 + -41.153255543 62.461302047 + -41.102045207 62.557479947 + -41.013500093 62.541261212 + -40.976185939 62.429062430 +} +85032187fffffff +{ + 87.987604663 -27.166621269 + 88.074959400 -27.735683277 + 88.100674954 -30.416225151 + 88.036920141 -32.340478479 + 87.951413904 -31.585652715 + 87.927703575 -29.084751128 +} +85050db7fffffff +{ + 81.592750625 126.451781352 + 81.516661527 126.847853088 + 81.528608899 127.496778154 + 81.616877944 127.761848609 + 81.693855742 127.369163760 + 81.681672370 126.707866080 +} +85a27267fffffff +{ + -20.122811326 54.349771396 + -20.215362101 54.356642110 + -20.253829645 54.442841925 + -20.199646966 54.522149514 + -20.107036917 54.515145869 + -20.068668747 54.428967615 +} +85d090dbfffffff +{ + -53.261594507 0.559726493 + -53.347206149 0.524483964 + -53.403639225 0.634222932 + -53.374373758 0.779089938 + -53.288751736 0.813930718 + -53.232405348 0.704306721 +} +852c43b7fffffff +{ + 45.171627228 52.907152588 + 45.099122825 52.992777181 + 45.115747607 53.121820423 + 45.204984062 53.165577873 + 45.277638333 53.079934509 + 45.260906077 52.950551814 +} +851aa8dbfffffff +{ + 46.647792463 -50.103526035 + 46.626218471 -50.230592321 + 46.542014903 -50.273596833 + 46.479546380 -50.189860607 + 46.501093780 -50.063243284 + 46.585136212 -50.019914294 +} +85e44a9bfffffff +{ + -63.294335246 81.687506254 + -63.201741326 81.632447669 + -63.176806712 81.430338722 + -63.244293406 81.282311847 + -63.336975484 81.336280705 + -63.362083372 81.539369100 +} +85cb0583fffffff +{ + -32.143719501 50.538538247 + -32.234736403 50.542773658 + -32.279768031 50.633323827 + -32.233702503 50.719635844 + -32.142608136 50.715246084 + -32.097656709 50.624698768 +} +85d8a847fffffff +{ + -45.171768402 137.687902543 + -45.079641796 137.678310793 + -45.036318605 137.562548263 + -45.085023548 137.456268938 + -45.177103652 137.465550293 + -45.220525485 137.581421281 +} +8590dc23fffffff +{ + -3.237757576 -121.552355362 + -3.176211424 -121.514132787 + -3.109219284 -121.558055984 + -3.103862634 -121.640203847 + -3.165466401 -121.678343371 + -3.232369257 -121.634418198 +} +8572ea2bfffffff +{ + -0.751337887 145.025891145 + -0.845937655 145.040441758 + -0.879629669 145.129506234 + -0.818763579 145.204013166 + -0.724188971 145.189493997 + -0.690455232 145.100436402 +} +85e75c57fffffff +{ + -69.488383611 14.409939495 + -69.396322796 14.377095516 + -69.357205932 14.136232024 + -69.409902683 13.926713161 + -69.502105242 13.957543955 + -69.541470658 14.199911291 +} +851b99a7fffffff +{ + 49.430570243 -53.948787659 + 49.404705257 -54.085079337 + 49.316357531 -54.123640181 + 49.254023340 -54.026336357 + 49.279831976 -53.890544740 + 49.368030969 -53.851558097 +} +853c1ec7fffffff +{ + 25.755364527 86.129609790 + 25.839391761 86.100792010 + 25.855810972 86.002458782 + 25.788240917 85.933016413 + 25.704240732 85.961850787 + 25.687783500 86.060111075 +} +852028a7fffffff +{ + 49.413009011 73.662689780 + 49.325333307 73.727082639 + 49.317511101 73.875788066 + 49.397333259 73.960577420 + 49.485120516 73.896501070 + 49.492974152 73.747317606 +} +85e52e47fffffff +{ + -64.977251581 120.946616581 + -64.915740884 120.775600309 + -64.948552644 120.564061535 + -65.043081116 120.522554300 + -65.104857890 120.693895882 + -65.071839266 120.906421848 +} +85a29b13fffffff +{ + -30.501774931 46.885496660 + -30.591412912 46.886576851 + -30.637394093 46.970663798 + -30.593652868 47.053688333 + -30.503923569 47.052469260 + -30.458026789 46.968364674 +} +85cf91c7fffffff +{ + -47.029420256 -66.796840316 + -46.949130521 -66.765674402 + -46.884200256 -66.842701823 + -46.899427888 -66.950993891 + -46.979732465 -66.982511183 + -47.044794764 -66.905385312 +} +8500e317fffffff +{ + 84.789787962 52.995825080 + 84.820963568 53.928139270 + 84.912535797 54.095779897 + 84.973306515 53.300722018 + 84.941126251 52.344713242 + 84.849200021 52.207752022 +} +8503126ffffffff +{ + 83.582956121 -146.971214648 + 83.518988890 -147.574931507 + 83.426712923 -147.398197160 + 83.397998921 -146.636342668 + 83.460859599 -146.035290945 + 83.553529002 -146.193242378 +} +851f5023fffffff +{ + 53.039267241 21.465853101 + 52.958998860 21.462285904 + 52.917844932 21.587540132 + 52.956901763 21.716513335 + 53.037170157 21.720388995 + 53.078381899 21.594983023 +} +85b20e17fffffff +{ + -28.234521264 -69.814024608 + -28.309049638 -69.869719742 + -28.383052751 -69.826441723 + -28.382509483 -69.727491552 + -28.308011913 -69.671883590 + -28.234026833 -69.715138484 +} +85e31b03fffffff +{ + -63.610054921 -138.179420719 + -63.588884483 -138.001505961 + -63.505299826 -137.965464702 + -63.443010773 -138.106628642 + -63.464146932 -138.283703791 + -63.547606142 -138.320452074 +} +853255b3fffffff +{ + 35.191444324 161.140574046 + 35.288127473 161.134751303 + 35.332215135 161.029910040 + 35.279559901 160.931065938 + 35.182919653 160.937125117 + 35.138891583 161.041792117 +} +851534cbfffffff +{ + 56.061317586 106.799993052 + 56.011297033 106.931410283 + 56.043262603 107.072385286 + 56.125472511 107.082371307 + 56.175721321 106.950638994 + 56.143531361 106.809235431 +} +85d20227fffffff +{ + -45.361465200 -107.191301110 + -45.296200110 -107.088418663 + -45.200926272 -107.117408140 + -45.170852782 -107.248902153 + -45.235969483 -107.351747178 + -45.331307833 -107.323136233 +} +85e35247fffffff +{ + -60.292194919 -141.588956291 + -60.273135389 -141.429143179 + -60.189060432 -141.389237686 + -60.124185014 -141.508626725 + -60.143245514 -141.667733518 + -60.227180314 -141.708155561 +} +85bd85dbfffffff +{ + -34.724242472 41.649452183 + -34.641387901 41.649504989 + -34.605741710 41.558137498 + -34.652973078 41.466615536 + -34.735864965 41.466481808 + -34.771488249 41.557951017 +} +85e728d7fffffff +{ + -72.188865211 34.610980744 + -72.106747979 34.475336474 + -72.097922987 34.184105601 + -72.171233064 34.025879886 + -72.253738381 34.160044226 + -72.262545581 34.453930043 +} +85f21b27fffffff +{ + -80.883248731 -120.313613719 + -80.935038860 -119.853224590 + -80.893924691 -119.333521057 + -80.801579975 -119.280948731 + -80.750568533 -119.738240665 + -80.791129613 -120.251238086 +} +85e781affffffff +{ + -62.955833763 33.995534525 + -62.879353511 33.910226358 + -62.867165912 33.723225957 + -62.931467544 33.620447760 + -63.008214699 33.705131347 + -63.020393317 33.893221872 +} +850b26a3fffffff +{ + 60.853361305 66.182920582 + 60.776044908 66.281885982 + 60.778826187 66.474289546 + 60.858943289 66.568535488 + 60.936418925 66.469913134 + 60.933618162 66.276699007 +} +850aab0ffffffff +{ + 61.104156662 100.333426430 + 61.060237587 100.498346370 + 61.102831764 100.653908864 + 61.189629910 100.644944442 + 61.233767414 100.479385675 + 61.190887576 100.323430952 +} +85130a63fffffff +{ + 63.714743218 -119.839122333 + 63.627784086 -119.895693248 + 63.559605783 -119.763010334 + 63.578135817 -119.573677599 + 63.665026686 -119.516089709 + 63.733456380 -119.648848752 +} +854f8c37fffffff +{ + 20.561384659 157.449897451 + 20.651290125 157.441398286 + 20.692877024 157.352642500 + 20.644496226 157.272526244 + 20.554648498 157.281185349 + 20.513123714 157.369800911 +} +85e85c13fffffff +{ + -56.988096745 -85.737397351 + -56.908344398 -85.650342778 + -56.828946405 -85.726977752 + -56.829143908 -85.890437762 + -56.908794821 -85.977900016 + -56.988349742 -85.901496445 +} +857cd543fffffff +{ + 6.689678195 -19.346004470 + 6.761673698 -19.306035322 + 6.839295888 -19.347955238 + 6.844998411 -19.429909319 + 6.772994963 -19.469959946 + 6.695296886 -19.427975055 +} +85bd66b3fffffff +{ + -42.608032077 28.943628165 + -42.534068799 28.949629380 + -42.493622427 28.852897743 + -42.527132879 28.750128452 + -42.601095090 28.744035761 + -42.641548010 28.840803793 +} +85bc8297fffffff +{ + -27.041682718 37.915412075 + -26.950622122 37.917067289 + -26.906636344 37.827942299 + -26.953724245 37.737083830 + -27.044819838 37.735350622 + -27.088792612 37.824553904 +} +85bc815bfffffff +{ + -27.196480646 36.557836645 + -27.105280139 36.560082030 + -27.060392671 36.470631887 + -27.106715568 36.378864438 + -27.197945646 36.376540290 + -27.242823340 36.466062372 +} +85e19013fffffff +{ + -56.127356276 79.014116488 + -56.035888521 78.977123313 + -56.009986120 78.818284843 + -56.075379817 78.695859333 + -56.166896598 78.732131234 + -56.192971144 78.891551130 +} +853f19d7fffffff +{ + 32.660812972 19.933335359 + 32.564036900 19.931994621 + 32.514925776 20.030911422 + 32.562536413 20.131273918 + 32.659323745 20.132804550 + 32.708489317 20.033782780 +} +85045017fffffff +{ + 73.908924051 168.154195367 + 73.812213300 168.135936570 + 73.759602824 168.424945669 + 73.803238725 168.733542745 + 73.899863618 168.755311430 + 73.952940976 168.464978269 +} +85259483fffffff +{ + 42.322881297 87.308480351 + 42.231771515 87.342505446 + 42.209556167 87.464891968 + 42.278335758 87.553538395 + 42.369475903 87.519856014 + 42.391806314 87.397184031 +} +85ef365bfffffff +{ + -86.266670839 -11.325066158 + -86.176787395 -10.879113198 + -86.107764403 -11.818488827 + -86.126663558 -13.197897466 + -86.215324145 -13.692182084 + -86.286332561 -12.760146723 +} +85008b37fffffff +{ + 80.679795626 87.076588895 + 80.656631093 87.631695162 + 80.724355180 88.032360486 + 80.816039903 87.877321345 + 80.839527543 87.313049330 + 80.771002959 86.913074870 +} +8508e933fffffff +{ + 69.739598021 21.460084583 + 69.793514279 21.599107283 + 69.864007659 21.503717744 + 69.880297066 21.268114775 + 69.826040465 21.129566091 + 69.755835115 21.226138723 +} +85e72c67fffffff +{ + -72.434768751 35.025476464 + -72.352877415 34.886034849 + -72.344748046 34.590718930 + -72.418534179 34.432129280 + -72.500821067 34.570082090 + -72.508926275 34.868129890 +} +85c6cc27fffffff +{ + -30.953994473 -131.282015356 + -30.864561172 -131.270432328 + -30.810560632 -131.348003967 + -30.845960132 -131.437299424 + -30.935469493 -131.449059412 + -30.989503347 -131.371346907 +} +854ef30ffffffff +{ + 26.792090763 149.203871464 + 26.882397662 149.186758638 + 26.917588544 149.093579199 + 26.862457298 149.017698799 + 26.772250897 149.034960176 + 26.737075199 149.127953662 +} +85f00d27fffffff +{ + -78.622340408 53.375142157 + -78.557038973 53.045541759 + -78.578594231 52.613676016 + -78.665856788 52.506077224 + -78.731804144 52.836066858 + -78.709839435 53.273304400 +} +853f0d83fffffff +{ + 35.800271009 22.452369793 + 35.704553057 22.448511864 + 35.654046055 22.549518314 + 35.699199994 22.654474486 + 35.794915647 22.658534404 + 35.845479804 22.557436200 +} +85d30b13fffffff +{ + -49.972855714 -113.902979654 + -49.914592767 -113.783171249 + -49.818464594 -113.802189798 + -49.780579955 -113.940531302 + -49.838703727 -114.060176554 + -49.934850995 -114.041643846 +} +850b98dbfffffff +{ + 56.335333863 90.291009496 + 56.244278330 90.329093786 + 56.214538998 90.486746098 + 56.275726165 90.606762263 + 56.366796451 90.569292732 + 56.396665163 90.411191491 +} +855d5c27fffffff +{ + 16.390567085 -144.743593095 + 16.300080409 -144.778309314 + 16.225422482 -144.714206120 + 16.241231228 -144.615430648 + 16.331678166 -144.580681608 + 16.406356125 -144.644740699 +} +8505586ffffffff +{ + 79.311051481 163.828061524 + 79.214310695 163.838747558 + 79.166903757 164.289085193 + 79.215611822 164.732718989 + 79.312347702 164.729936926 + 79.360386094 164.275616510 +} +85a575d7fffffff +{ + -13.162484538 -22.314507376 + -13.082083773 -22.271294108 + -13.006864776 -22.315883309 + -13.012019743 -22.403748249 + -13.092473708 -22.447043208 + -13.167719488 -22.402391603 +} +85b42447fffffff +{ + -32.274315260 -156.901235955 + -32.182963527 -156.862656686 + -32.109077307 -156.937047923 + -32.126473865 -157.049988214 + -32.217781248 -157.088713220 + -32.291736494 -157.014352529 +} +85d1869bfffffff +{ + -44.094139019 0.118539772 + -44.185954859 0.087417095 + -44.249207493 0.182130541 + -44.220559615 0.307886168 + -44.128740147 0.338709415 + -44.065572020 0.244076791 +} +85200607fffffff +{ + 45.576425423 70.100852903 + 45.490471004 70.166388462 + 45.487118098 70.305291330 + 45.569713899 70.379078764 + 45.655794264 70.313773355 + 45.659152905 70.174449317 +} +8520093bfffffff +{ + 46.830102152 77.869062700 + 46.740314182 77.923237989 + 46.727469983 78.063338047 + 46.804353639 78.149676662 + 46.894230259 78.095835514 + 46.907134719 77.955320628 +} +8579344bfffffff +{ + 10.528094687 -138.607198665 + 10.439380689 -138.642195925 + 10.365475281 -138.583531967 + 10.380258682 -138.489940501 + 10.468904102 -138.454934936 + 10.542834697 -138.513529004 +} +85da9423fffffff +{ + -43.032539797 172.474436306 + -42.949355328 172.423616584 + -42.943104055 172.300884222 + -43.020085825 172.228679092 + -43.103373557 172.279388855 + -43.109576243 172.402414310 +} +850414b3fffffff +{ + 73.335525225 136.764699184 + 73.249003972 136.919822367 + 73.243881732 137.256844932 + 73.325241450 137.442069528 + 73.412162877 137.288892027 + 73.417324743 136.948521865 +} +85031277fffffff +{ + 83.860090214 -147.511434840 + 83.795537678 -148.136746776 + 83.703404649 -147.943978116 + 83.675377473 -147.146014180 + 83.738771085 -146.523207122 + 83.831338136 -146.695638203 +} +85897497fffffff +{ + -15.837184064 -157.429161225 + -15.749688282 -157.395545710 + -15.678731589 -157.459259625 + -15.695176346 -157.556563417 + -15.782609038 -157.590284842 + -15.853660124 -157.526596779 +} +853a2baffffffff +{ + 29.773608088 -46.421335564 + 29.690410237 -46.462143569 + 29.614534119 -46.401550949 + 29.621739361 -46.300134030 + 29.704914090 -46.259137430 + 29.780906810 -46.319746091 +} +8582a223fffffff +{ + -0.275946212 14.671695017 + -0.186425210 14.681516456 + -0.137626575 14.609614190 + -0.178273697 14.527928766 + -0.267727224 14.518063030 + -0.316601143 14.589926944 +} +85e71a43fffffff +{ + -65.755541013 32.350575402 + -65.675545406 32.259682142 + -65.661712245 32.048628620 + -65.727865690 31.927090142 + -65.808147253 32.017119604 + -65.821989520 32.229557265 +} +85f1348ffffffff +{ + -81.671431024 144.025114624 + -81.731976417 143.607621391 + -81.810448011 143.796232157 + -81.827834525 144.411633854 + -81.766371455 144.827935879 + -81.688444331 144.630140977 +} +85509b73fffffff +{ + 28.752392895 -122.611852446 + 28.837080350 -122.563611761 + 28.915859087 -122.620627989 + 28.909877055 -122.725881383 + 28.825182230 -122.773979349 + 28.746476763 -122.716966879 +} +85ef300ffffffff +{ + -85.560666945 -33.730775006 + -85.488031285 -32.948391572 + -85.399868029 -33.372475179 + -85.383247166 -34.546551506 + -85.454202963 -35.335888811 + -85.543443667 -34.945081729 +} +85036147fffffff +{ + 81.075485960 -45.891016123 + 81.071971266 -46.448904703 + 80.995108239 -46.666490827 + 80.922268408 -46.331503704 + 80.925681931 -45.782361476 + 81.002035406 -45.559553864 +} +853ea067fffffff +{ + 23.785522174 17.897375702 + 23.688967336 17.897923088 + 23.640572476 17.989471864 + 23.688670835 18.080574195 + 23.785248127 18.080186419 + 23.833704729 17.988536663 +} +855a556ffffffff +{ + 15.593208318 166.233911556 + 15.680134233 166.234057040 + 15.724853920 166.151394514 + 15.682552260 166.068673608 + 15.595635105 166.068685268 + 15.551010701 166.151260707 +} +850453affffffff +{ + 72.829683144 171.073689069 + 72.733653820 171.040552402 + 72.677569619 171.301937370 + 72.717061977 171.597330916 + 72.812960807 171.633486400 + 72.869499872 171.371236639 +} +852da9c7fffffff +{ + 37.742401355 38.381355703 + 37.651585454 38.362327418 + 37.590093388 38.451049933 + 37.619351766 38.558755857 + 37.710093386 38.577945392 + 37.771650987 38.489268062 +} +85025ba7fffffff +{ + 70.882971270 -87.111079454 + 70.817558092 -87.323013691 + 70.726175788 -87.256971117 + 70.700034211 -86.980937859 + 70.765100286 -86.769055558 + 70.856653947 -86.833146283 +} +853e992bfffffff +{ + 17.876392642 20.450677291 + 17.782183356 20.449076738 + 17.733185214 20.535276391 + 17.778318480 20.623153790 + 17.872534600 20.624899148 + 17.921610746 20.538622301 +} +850154b7fffffff +{ + 76.124595425 14.906240856 + 76.190771190 15.083113164 + 76.263401255 14.900712819 + 76.269365919 14.539413720 + 76.202744520 14.364467854 + 76.130603920 14.548866163 +} +853c417bfffffff +{ + 30.610078806 95.900601301 + 30.692415082 95.873430000 + 30.714464040 95.771143748 + 30.654182076 95.696080325 + 30.571842421 95.723301242 + 30.549788043 95.825536105 +} +8584753bfffffff +{ + -2.307243168 69.198772680 + -2.389129642 69.215150276 + -2.415777687 69.300200324 + -2.360476425 69.368798956 + -2.278616075 69.352322883 + -2.252030759 69.267346575 +} +85eb29d7fffffff +{ + -64.776921512 -154.190287164 + -64.776372518 -154.020495984 + -64.704189826 -153.948148193 + -64.632719686 -154.045273812 + -64.633346173 -154.214196564 + -64.705365406 -154.286859303 +} +85902063fffffff +{ + -11.446119202 -123.257722056 + -11.372987361 -123.255055561 + -11.321777875 -123.314654430 + -11.343644678 -123.377023742 + -11.416837109 -123.379788573 + -11.468102199 -123.320085672 +} +850436c3fffffff +{ + 73.859323440 127.934378689 + 73.780472351 128.137758882 + 73.789642601 128.482964537 + 73.877781010 128.628253413 + 73.957111124 128.425958637 + 73.947822953 128.077266118 +} +85426c2bfffffff +{ + 33.178445430 71.155537617 + 33.096159094 71.207670518 + 33.091724888 71.320920890 + 33.169563809 71.382317041 + 33.251971585 71.330345942 + 33.256419030 71.216816326 +} +85f0c1cffffffff +{ + -72.284603763 55.379338633 + -72.195662106 55.425464043 + -72.136485209 55.213222447 + -72.165919743 54.954748215 + -72.254668989 54.906549400 + -72.314177137 55.118889598 +} +85c1030bfffffff +{ + -27.793664849 -12.351844854 + -27.883474894 -12.390866975 + -27.957857785 -12.321822077 + -27.942325716 -12.213706471 + -27.852439094 -12.174833933 + -27.778161051 -12.243927063 +} +8594e177fffffff +{ + -14.844749466 129.687207783 + -14.929950014 129.703337382 + -14.963374267 129.790843732 + -14.911607359 129.862260792 + -14.826364560 129.846138263 + -14.792930863 129.758591537 +} +85ee9d0ffffffff +{ + -68.282866524 -11.876843014 + -68.193169343 -11.793980215 + -68.120720076 -11.963185730 + -68.137585301 -12.215041190 + -68.227068013 -12.299476476 + -68.299900841 -12.130492004 +} +858b6cbbfffffff +{ + -12.773242936 -73.084340163 + -12.852275060 -73.139311021 + -12.938341996 -73.098125992 + -12.945331669 -73.001978351 + -12.866301849 -72.947073779 + -12.780280058 -72.988250424 +} +8552e5c3fffffff +{ + 16.032090296 46.282623463 + 15.946870779 46.262322136 + 15.893233187 46.324812656 + 15.924718468 46.407538150 + 16.009830729 46.427913881 + 16.063564950 46.365489890 } -85ef80d3fffffff +85eda397fffffff +{ + -62.604860727 157.528097890 + -62.591033234 157.353701213 + -62.658557486 157.251707451 + -62.740099902 157.324545845 + -62.753883082 157.499917449 + -62.686168216 157.601472224 +} +85029b87fffffff +{ + 70.303680384 -128.502049984 + 70.214683149 -128.537234390 + 70.158791880 -128.345015747 + 70.191636550 -128.116939354 + 70.280639086 -128.079896986 + 70.336792762 -128.272786784 +} +85dc0137fffffff +{ + -54.527552893 -19.016095159 + -54.604080021 -19.081427481 + -54.676254720 -18.991104965 + -54.671821192 -18.835240662 + -54.595208041 -18.770132409 + -54.523114407 -18.860663233 +} +85cd1a23fffffff +{ + -44.673287256 88.481915271 + -44.591653515 88.434988082 + -44.581290795 88.307360454 + -44.652476397 88.226244296 + -44.734224133 88.272821062 + -44.744672489 88.400865346 +} +85210833fffffff +{ + 50.972568006 65.761551130 + 50.890289963 65.841083929 + 50.892770899 65.994331590 + 50.977554870 66.068558628 + 51.059975034 65.989235602 + 51.057469054 65.835474361 +} +85f29bcbfffffff +{ + -87.367231694 -54.487517180 + -87.320923712 -52.730386444 + -87.227720923 -52.786741382 + -87.180771308 -54.483328612 + -87.224670772 -56.179619813 + -87.317845581 -56.239995857 +} +85c40b0ffffffff +{ + -43.116592424 -34.370978601 + -43.190260314 -34.437170612 + -43.273422137 -34.385193510 + -43.282905812 -34.266764210 + -43.209136555 -34.200565158 + -43.125985080 -34.252802007 +} +852ee947fffffff +{ + 42.155251485 134.182093449 + 42.235410886 134.147165964 + 42.248862451 134.046593765 + 42.182229987 133.981210311 + 42.102195603 134.016231208 + 42.088668721 134.116542588 +} +85f0cc4ffffffff +{ + -71.640971184 52.165591042 + -71.553358053 52.224147327 + -71.491500492 52.031722555 + -71.516943519 51.780879542 + -71.604337203 51.720535503 + -71.666508064 51.912813276 +} +85bec507fffffff +{ + -29.445222336 147.197599603 + -29.350600769 147.178814763 + -29.318198821 147.075425683 + -29.380329428 146.990682157 + -29.474959188 147.009258902 + -29.507450297 147.112787411 +} +85ecd14ffffffff +{ + -68.048674582 123.896417850 + -67.991985564 123.697955770 + -68.029278558 123.465414105 + -68.123504259 123.430218924 + -68.180474158 123.629261069 + -68.142936366 123.862920619 +} +8550a13bfffffff +{ + 22.282964199 -125.693254372 + 22.366432706 -125.650736973 + 22.444613753 -125.705370726 + 22.439238152 -125.802501134 + 22.355762449 -125.844881242 + 22.277669478 -125.790268404 +} +85a6c3affffffff +{ + -19.708677482 107.127594823 + -19.640068119 107.108225611 + -19.626199372 107.025303635 + -19.680988408 106.961760605 + -19.749590643 106.981184766 + -19.763411044 107.064097054 +} +85af961bfffffff +{ + -31.159660349 83.577310160 + -31.249843330 83.608334151 + -31.269997865 83.714664289 + -31.199991740 83.789803617 + -31.109877776 83.758683782 + -31.089700877 83.652520184 +} +851f8b8bfffffff +{ + 46.930792257 11.492830844 + 46.844684572 11.500551078 + 46.810275017 11.617790724 + 46.861951689 11.727526502 + 46.948100522 11.720049121 + 46.982531683 11.602592857 +} +85b68b8bfffffff +{ + -22.562944419 -87.653403133 + -22.635783276 -87.715493247 + -22.721637471 -87.675852128 + -22.734665542 -87.574067763 + -22.661824560 -87.511972750 + -22.575957660 -87.551666841 +} +85f09dc7fffffff +{ + -70.471264773 78.707923629 + -70.379233582 78.647907138 + -70.348426878 78.385242251 + -70.409420272 78.181016331 + -70.501539636 78.239034851 + -70.532578656 78.503282593 +} +85ef980ffffffff +{ + -75.332144035 -2.120087166 + -75.237060877 -2.059981903 + -75.175629003 -2.349387342 + -75.208765950 -2.699841637 + -75.303711706 -2.763962609 + -75.365660664 -2.473627351 +} +8517a8a3fffffff +{ + 56.709245290 153.684628070 + 56.623391614 153.716698414 + 56.595793506 153.875199529 + 56.653874004 154.002272235 + 56.739821570 153.970972490 + 56.767595325 153.811827992 +} +853eec6bfffffff +{ + 23.223380032 29.138319456 + 23.127420760 29.129158617 + 23.072849273 29.214786968 + 23.114147982 29.309603699 + 23.210066261 29.318914867 + 23.264726935 29.233259091 +} +85ed5b8bfffffff +{ + -74.816962077 155.886852384 + -74.808090758 155.575602430 + -74.880394318 155.384403810 + -74.961890036 155.505668802 + -74.970759435 155.820017882 + -74.898134770 156.009983054 +} +85b98593fffffff +{ + -31.098815414 138.447464982 + -31.004829410 138.438586397 + -30.965964531 138.341285251 + -31.020970913 138.252781470 + -31.114913496 138.261443506 + -31.153893253 138.358825839 +} +85c452abfffffff +{ + -44.730012599 -32.866623265 + -44.804057664 -32.933618018 + -44.886835529 -32.877832196 + -44.895551356 -32.754785511 + -44.821406208 -32.687799519 + -44.738645401 -32.743850938 +} +85c42cb7fffffff +{ + -37.903864664 -32.092331137 + -37.981873468 -32.152836718 + -38.064650126 -32.100933765 + -38.069392068 -31.988308581 + -37.991272129 -31.927817177 + -37.908521468 -31.979936380 +} +859219b3fffffff +{ + -13.775990323 -105.261242212 + -13.843770847 -105.317842940 + -13.929800557 -105.288680758 + -13.948111948 -105.202827577 + -13.880306633 -105.146147987 + -13.794214724 -105.175400405 +} +8500ca23fffffff +{ + 86.816210774 119.383369557 + 86.749805091 120.548395278 + 86.771590080 122.186399539 + 86.860792301 122.734940480 + 86.929595950 121.574876862 + 86.906759977 119.859029543 +} +85514857fffffff +{ + 17.669428690 -138.787851011 + 17.581737676 -138.823896144 + 17.506449756 -138.763303540 + 17.518844985 -138.666739108 + 17.606480655 -138.630684453 + 17.681776454 -138.691203600 +} +85079e17fffffff +{ + 78.149127700 -37.916971906 + 78.156238215 -38.336470050 + 78.082787630 -38.549253390 + 78.002680319 -38.344372636 + 77.995654294 -37.929914515 + 78.068651833 -37.715337915 +} +851d88d7fffffff +{ + 52.267714757 -148.880555603 + 52.212572301 -148.972584055 + 52.148251097 -148.941337513 + 52.138990725 -148.818514934 + 52.193921432 -148.726516922 + 52.258323897 -148.757310203 +} +85b36ea7fffffff +{ + -21.829990798 -61.134074250 + -21.906676728 -61.181429219 + -21.980579959 -61.140701130 + -21.977758525 -61.052668824 + -21.901117705 -61.005419880 + -21.827253227 -61.046097145 +} +85068d43fffffff +{ + 70.584001480 -50.947262885 + 70.568325553 -51.218702041 + 70.480505329 -51.306520701 + 70.408603275 -51.124434130 + 70.424206841 -50.855022425 + 70.511784264 -50.765680033 +} +85c91da7fffffff +{ + -42.151517584 116.750837191 + -42.088866840 116.662791383 + -42.109142994 116.545024965 + -42.192190855 116.514977929 + -42.255032804 116.603062445 + -42.234635402 116.721155855 +} +855ce027fffffff +{ + 7.966546636 -148.485110987 + 7.875357718 -148.517580984 + 7.802338638 -148.453946420 + 7.820464821 -148.357863968 + 7.911615393 -148.325349991 + 7.984678165 -148.388962303 +} +8500510bfffffff +{ + 85.093193231 10.744658671 + 85.171414796 11.205506205 + 85.247294305 10.590009378 + 85.243480203 9.500117015 + 85.164115308 9.061125284 + 85.089701550 9.689428981 +} +85b014d7fffffff +{ + -28.295776283 -114.373098354 + -28.241341547 -114.289301721 + -28.154276494 -114.301888626 + -28.121626141 -114.398035629 + -28.175925674 -114.481749191 + -28.263010558 -114.469398944 +} +85f1622ffffffff +{ + -86.881236684 29.136702530 + -86.794124276 28.517096487 + -86.780280907 26.895846672 + -86.852872825 25.813317605 + -86.941549900 26.368346209 + -86.956097330 28.073177040 +} +8513a403fffffff +{ + 64.613850503 -135.027044299 + 64.527453328 -135.031822775 + 64.477462585 -134.874306488 + 64.513695409 -134.711396968 + 64.600170993 -134.705518517 + 64.650335982 -134.863650016 +} +85e3619bfffffff +{ + -58.114776551 -153.208699919 + -58.108221417 -153.068961216 + -58.031516300 -153.011328003 + -57.961527854 -153.093202494 + -57.968163207 -153.232354344 + -58.044706876 -153.290216981 +} +85f1646ffffffff +{ + -88.259342764 3.038681174 + -88.166199468 3.249292922 + -88.114773145 0.889721918 + -88.152675214 -1.770795297 + -88.244903885 -2.243689590 + -88.300324556 0.201538185 +} +8500eb3bfffffff +{ + 88.040512180 55.153364901 + 88.068834652 57.699205283 + 88.160120116 58.353367732 + 88.224624406 56.244894862 + 88.193913033 53.505969770 + 88.101225853 53.076333736 +} +859692cffffffff +{ + -3.510451343 36.899503526 + -3.416772746 36.901399849 + -3.366415342 36.820561904 + -3.409703445 36.737767436 + -3.503413792 36.735806826 + -3.553804362 36.816704985 +} +8502021bfffffff +{ + 78.704642834 -112.581166544 + 78.688394660 -113.028285290 + 78.604696102 -113.202484584 + 78.537753972 -112.933981448 + 78.553904438 -112.492910504 + 78.637093417 -112.314348086 +} +858d833bfffffff +{ + -6.134917174 111.668557794 + -6.051672299 111.650232921 + -6.031367976 111.566892745 + -6.094387068 111.501875920 + -6.177657319 111.520265239 + -6.197883174 111.603606966 +} +854b75d7fffffff +{ + 32.051289098 129.894167882 + 31.977378093 129.911462037 + 31.956447175 130.005432711 + 32.009456585 130.082154977 + 32.083375880 130.064869371 + 32.104277547 129.970852868 +} +85054dcbfffffff +{ + 82.620049306 -179.089025687 + 82.528206093 -179.284633189 + 82.458998741 -178.776478853 + 82.480628094 -178.073657154 + 82.571895816 -177.864785079 + 82.642116767 -178.371816942 +} +8507a227fffffff +{ + 77.184233348 -18.855423645 + 77.216830750 -19.195177552 + 77.161871535 -19.471488282 + 77.074701091 -19.406828991 + 77.042440042 -19.069909058 + 77.097015401 -18.794824535 +} +85d83577fffffff +{ + -51.785123906 138.845233298 + -51.697416226 138.832795288 + -51.655194787 138.702739715 + -51.700589583 138.584973259 + -51.788265031 138.597026562 + -51.830578132 138.727230965 +} +85d705a7fffffff +{ + -56.105061214 34.208802653 + -56.035608515 34.142514230 + -56.022432710 33.998247710 + -56.078713754 33.919623274 + -56.148377128 33.985545341 + -56.161548763 34.130460109 +} +854a249bfffffff +{ + 27.578359117 127.901882076 + 27.499285201 127.919126552 + 27.477180029 128.011448649 + 27.534188314 128.086577055 + 27.613279346 128.069337224 + 27.635345047 127.976964263 +} +8518b1bbfffffff +{ + 52.324349874 -24.226499340 + 52.253728245 -24.316502209 + 52.172531705 -24.255958384 + 52.161892901 -24.105687757 + 52.232425187 -24.015583241 + 52.313685532 -24.075850034 +} +85f29017fffffff +{ + -89.098395580 152.417245586 + -89.171916818 148.787026697 + -89.254258772 151.540658157 + -89.255342294 158.746749863 + -89.173612444 161.784755601 + -89.099056289 158.369997790 +} +851ae59bfffffff +{ + 46.614797046 -41.422924533 + 46.531206848 -41.482073297 + 46.457027516 -41.409335719 + 46.466344080 -41.277483054 + 46.549902606 -41.218068341 + 46.624176320 -41.290771605 +} +85f1955bfffffff +{ + -74.133366525 111.189274282 + -74.064992981 110.963277002 + -74.083681661 110.625447689 + -74.170910287 110.510747947 + -74.239694098 110.736409016 + -74.220837796 111.077122847 +} +85f1918ffffffff +{ + -74.483999036 107.154610235 + -74.411736060 106.940072555 + -74.424114101 106.591141191 + -74.508868755 106.453602784 + -74.581541403 106.667329389 + -74.569048856 107.019425670 +} +8550d52bfffffff +{ + 28.367014335 -129.349584161 + 28.451357047 -129.309033959 + 28.525161390 -129.366845761 + 28.514549241 -129.465163566 + 28.430224902 -129.505553767 + 28.356494285 -129.447786315 +} +85016053fffffff +{ + 74.274611352 5.204410949 + 74.343680592 5.310084999 + 74.405853525 5.108335758 + 74.398484571 4.800330747 + 74.329131918 4.696853688 + 74.267430492 4.899168555 +} +8597b23bfffffff +{ + -13.458153035 40.829656090 + -13.362644635 40.830033288 + -13.314497181 40.746904747 + -13.361857154 40.663318310 + -13.457419867 40.662873893 + -13.505568349 40.746083169 +} +853edd27fffffff +{ + 18.655641977 28.715559359 + 18.561512056 28.707105886 + 18.508812136 28.789616278 + 18.550147443 28.880608213 + 18.644238943 28.889201064 + 18.697033667 28.806662699 +} +85ef26a7fffffff +{ + -85.464557542 -71.362487299 + -85.443653200 -70.207712776 + -85.352940466 -69.896967408 + -85.284022750 -70.706519690 + -85.304214853 -71.824366701 + -85.394018957 -72.168836380 +} +85dc50dbfffffff +{ + -51.476591767 -22.794374460 + -51.553531418 -22.860473871 + -51.630091015 -22.780714620 + -51.629646977 -22.634619303 + -51.552616038 -22.568670476 + -51.476120434 -22.648665419 +} +85e6c40ffffffff +{ + -59.241758535 12.360073440 + -59.157497587 12.344654293 + -59.116675586 12.189047165 + -59.159923926 12.048260251 + -59.244267722 12.062802316 + -59.285280972 12.219009338 +} +853a458bfffffff +{ + 27.603078061 -41.266347300 + 27.520960646 -41.312869566 + 27.441455344 -41.255982186 + 27.443949098 -41.152594331 + 27.526016216 -41.105909543 + 27.605639964 -41.162774825 +} +8575a127fffffff +{ + 7.072865532 -7.411122254 + 7.015339123 -7.469040787 + 6.947650548 -7.449868613 + 6.937465378 -7.372902008 + 6.994888669 -7.315031028 + 7.062600123 -7.334079045 +} +856b63d7fffffff +{ + 16.000125620 30.523159507 + 15.908010823 30.513487459 + 15.856080467 30.592758915 + 15.896165275 30.681718317 + 15.988233194 30.691519702 + 16.040263286 30.612232457 +} +8507a12ffffffff +{ + 75.471362321 -18.076115429 + 75.503981172 -18.374262333 + 75.448961051 -18.621229158 + 75.361659904 -18.569008909 + 75.329357034 -18.273011115 + 75.384041169 -18.027090580 +} +85d05397fffffff +{ + -48.027960506 20.408318913 + -48.114062712 20.406301411 + -48.153225188 20.507532024 + -48.106274323 20.610506251 + -48.020262997 20.612226834 + -47.981111560 20.511269752 +} +85004863fffffff +{ + 84.683936660 -36.097091366 + 84.764040402 -36.447322097 + 84.776707172 -37.438589668 + 84.708833424 -38.051838252 + 84.629707754 -37.680738345 + 84.617468934 -36.716754765 +} +854952d7fffffff +{ + 21.169769978 -111.508967997 + 21.251917153 -111.453864052 + 21.337689675 -111.502821562 + 21.341247167 -111.606946054 + 21.259042282 -111.661975818 + 21.173337614 -111.612955532 +} +8509100bfffffff +{ + 62.848912963 -1.670770265 + 62.810246518 -1.800566893 + 62.735026035 -1.770160431 + 62.698481629 -1.610565136 + 62.737069364 -1.481107601 + 62.812279917 -1.510906223 +} +850702a3fffffff +{ + 71.855099277 -11.827818462 + 71.892440221 -12.048721403 + 71.843192758 -12.259176983 + 71.756834268 -12.247667914 + 71.719797104 -12.027748579 + 71.768815809 -11.818354280 +} +85754aa3fffffff +{ + -0.590388101 0.005755141 + -0.509385497 0.018740233 + -0.464983319 -0.037230300 + -0.501507418 -0.106111021 + -0.582407132 -0.119111576 + -0.626885590 -0.063216007 +} +857a126ffffffff +{ + 3.034722261 47.828997912 + 3.119508825 47.826805724 + 3.167037057 47.752868356 + 3.129801576 47.681036192 + 3.044950285 47.683177596 + 2.997399159 47.757201999 +} +85c941b3fffffff +{ + -48.606828271 110.893495996 + -48.535588287 110.799791445 + -48.551545691 110.659031082 + -48.638835788 110.611477781 + -48.710286474 110.705122436 + -48.694236101 110.846381497 +} +85e4c213fffffff +{ + -55.027425315 90.181298080 + -54.939499234 90.116691657 + -54.928382750 89.951378403 + -55.005105857 89.849966873 + -55.093172778 89.914019205 + -55.104376018 90.080039265 +} +8506f103fffffff +{ + 67.611739177 -46.171078790 + 67.601946089 -46.408284030 + 67.516013122 -46.501355139 + 67.440125986 -46.358187600 + 67.449916803 -46.122576867 + 67.535596875 -46.028546468 +} +85169693fffffff +{ + 46.520718068 153.059643390 + 46.610953235 153.042218581 + 46.642061810 152.920139356 + 46.582918482 152.815781193 + 46.492758984 152.833484140 + 46.461667006 152.955267604 +} +85d319affffffff +{ + -50.341642961 -111.439438947 + -50.280859457 -111.321324076 + -50.185132818 -111.345188685 + -50.150152815 -111.486685529 + -50.210791244 -111.604678062 + -50.306554443 -111.581296653 +} +850336affffffff +{ + 87.295204843 170.786051737 + 87.202450556 170.597161094 + 87.145661503 172.144539219 + 87.179051991 173.910182936 + 87.271099763 174.208369780 + 87.330537310 172.633416025 +} +85e716a3fffffff +{ + -66.782586351 40.751075433 + -66.708812833 40.629123525 + -66.706997394 40.411736675 + -66.779047189 40.314835823 + -66.853154118 40.436245235 + -66.854877472 40.655104488 +} +85971223fffffff +{ + -17.448576852 35.824706308 + -17.352262843 35.827162227 + -17.302710707 35.741381867 + -17.349466391 35.653082899 + -17.445810996 35.650554484 + -17.495369395 35.736397544 +} +852f7343fffffff +{ + 32.965405936 143.945674717 + 33.054248685 143.922359614 + 33.082651013 143.825067448 + 33.022232174 143.751310880 + 32.933508926 143.774765094 + 32.905085017 143.871837112 +} +857896a3fffffff +{ + -5.477574214 -144.002855752 + -5.560026791 -144.034741665 + -5.624546212 -143.976548651 + -5.606673884 -143.886509598 + -5.524282934 -143.854598693 + -5.459702664 -143.912751711 +} +857873cbfffffff +{ + -1.451932445 -130.340921997 + -1.532952947 -130.374290801 + -1.596567511 -130.325307833 + -1.579203178 -130.243042356 + -1.498277517 -130.209691508 + -1.434621399 -130.258588099 +} +8504ea07fffffff +{ + 69.715314047 167.758006567 + 69.619569715 167.745319952 + 69.568682374 167.976644489 + 69.613159317 168.221529610 + 69.708835791 168.236444302 + 69.760104801 168.004248088 +} +85ed8b6bfffffff +{ + -64.669017028 146.266960745 + -64.641100060 146.074257205 + -64.702444324 145.926978515 + -64.791961908 145.972491294 + -64.819947293 146.166296270 + -64.758346259 146.313483187 +} +85f0342bfffffff +{ + -80.177815365 91.509928207 + -80.097534824 91.294557729 + -80.084802705 90.768254185 + -80.152188650 90.450123647 + -80.232926490 90.660030491 + -80.245823058 91.193601583 +} +85400823fffffff +{ + 27.311968509 105.590620742 + 27.398321746 105.567355268 + 27.427867562 105.469633628 + 27.371037707 105.395196007 + 27.284649934 105.418533580 + 27.255126497 105.516236759 +} +85ad4e87fffffff +{ + -30.187587630 3.494498427 + -30.279867412 3.472541110 + -30.344194614 3.552984042 + -30.316146314 3.655301657 + -30.223875866 3.677044281 + -30.159644243 3.596684105 +} +8534a01bfffffff +{ + 33.755143996 -33.494626096 + 33.672387813 -33.554548600 + 33.587452344 -33.498830958 + 33.585173634 -33.383283596 + 33.667857137 -33.323221682 + 33.752892051 -33.378846076 +} +851a4137fffffff +{ + 46.177441841 -32.303756905 + 46.097403670 -32.375857266 + 46.016074859 -32.311518999 + 46.014699240 -32.175222645 + 46.094669775 -32.102942141 + 46.176083568 -32.167137370 +} +854e224bfffffff +{ + 18.924231274 153.898510789 + 19.011513158 153.886915945 + 19.050716551 153.800264575 + 19.002588621 153.725354442 + 18.915379035 153.737092041 + 18.876224992 153.823597185 +} +85f2a32bfffffff +{ + -85.330224409 -148.115682215 + -85.411169373 -147.639638851 + -85.413502610 -146.513290526 + -85.334614167 -145.901767138 + -85.254863702 -146.400487006 + -85.252801886 -147.488905727 +} +85412a27fffffff +{ + 19.730022655 112.671014673 + 19.819980050 112.651600494 + 19.852297670 112.562033322 + 19.794604378 112.491875518 + 19.704583910 112.511366402 + 19.672319783 112.600938415 +} +854d192bfffffff +{ + 25.886187544 -65.020618991 + 25.812534304 -65.034867116 + 25.753590263 -64.977453622 + 25.768214862 -64.905693550 + 25.841912098 -64.891290163 + 25.900940828 -64.948802151 +} +85761c83fffffff +{ + -0.695171024 158.600562857 + -0.784355867 158.611828789 + -0.815868370 158.690407232 + -0.758275232 158.757676021 + -0.669166776 158.746450564 + -0.637575060 158.667915838 +} +852cf15bfffffff +{ + 36.328498287 50.824878770 + 36.258373350 50.899797911 + 36.273113514 51.008614255 + 36.358090907 51.042746511 + 36.428364443 50.967791929 + 36.413511794 50.858740178 +} +85ed0553fffffff +{ + -66.737085364 167.772548684 + -66.738727974 167.578756932 + -66.813102177 167.497319016 + -66.885963301 167.610592013 + -66.884179943 167.805587991 + -66.809676645 167.886102094 +} +85007063fffffff +{ + 82.204604940 12.512547355 + 82.278972536 12.815213022 + 82.354604284 12.453555107 + 82.354966125 11.783299967 + 82.279845651 11.488221724 + 82.205114658 11.855633107 +} +85b31c4bfffffff +{ + -20.851063441 -72.005333128 + -20.928948016 -72.061077256 + -21.010550541 -72.018810121 + -21.014238724 -71.920811979 + -20.936374194 -71.865142181 + -20.854801456 -71.907396052 +} +85498bcbfffffff +{ + 23.121682939 -102.217962096 + 23.200431845 -102.156503722 + 23.288799759 -102.199526658 + 23.298386224 -102.304122400 + 23.219564870 -102.365564032 + 23.131229549 -102.322426906 +} +850a3007fffffff +{ + 62.347242503 85.875398351 + 62.260500484 85.931627684 + 62.235619738 86.122077868 + 62.297369273 86.257003364 + 62.384172201 86.201574671 + 62.409165099 86.010417958 +} +850231abfffffff +{ + 80.828896283 -111.582407255 + 80.814700231 -112.137512974 + 80.730441845 -112.361128160 + 80.661009484 -112.036184942 + 80.675103832 -111.490404036 + 80.758730465 -111.260344016 +} +85e826a3fffffff +{ + -65.510606541 -98.070470866 + -65.443173371 -97.926189493 + -65.362392612 -97.996135388 + -65.348907982 -98.209602163 + -65.416152193 -98.354138347 + -65.497069714 -98.284956664 +} +853eb643fffffff +{ + 21.865092018 13.537754925 + 21.769985878 13.541996704 + 21.724420851 13.632376135 + 21.773912576 13.718633316 + 21.869064564 13.714539706 + 21.914679084 13.624040655 +} +8577b59bfffffff +{ + 1.511360343 148.185821786 + 1.416907350 148.199761301 + 1.382743295 148.287467180 + 1.442983395 148.361216453 + 1.537394993 148.347312055 + 1.571607936 148.259623226 +} +85b11137fffffff +{ + -32.645548956 -118.678151938 + -32.592598935 -118.586152669 + -32.501860648 -118.593453449 + -32.464081881 -118.692481804 + -32.516907288 -118.784348382 + -32.607635858 -118.777319323 +} +85147073fffffff +{ + 58.348922131 133.868786626 + 58.271150605 133.957635596 + 58.269758146 134.134458892 + 58.346148246 134.223349797 + 58.424172303 134.134950170 + 58.425553694 133.957207060 +} +85eb45dbfffffff +{ + -68.811690347 -156.629848670 + -68.878621483 -156.566990476 + -68.886922498 -156.348637453 + -68.828111870 -156.194539874 + -68.761349961 -156.258662410 + -68.753228652 -156.475623705 +} +85e7720bfffffff +{ + -70.835038655 24.758561607 + -70.746791702 24.675043696 + -70.722932267 24.406504191 + -70.787194378 24.219341173 + -70.875720257 24.300974509 + -70.899705969 24.571666205 +} +85652b2bfffffff +{ + 2.494057714 99.055431068 + 2.586672660 99.031562049 + 2.611966404 98.938609704 + 2.544611946 98.869560939 + 2.452005694 98.893478973 + 2.426745143 98.986396853 +} +85429a13fffffff +{ + 16.685173676 65.184798480 + 16.620923628 65.230978250 + 16.619842773 65.318883264 + 16.683027406 65.360776862 + 16.747393238 65.314662480 + 16.748458618 65.226588849 +} +850075dbfffffff +{ + 80.930808283 8.728888510 + 81.006219514 8.953244789 + 81.077437398 8.613529347 + 81.072433036 8.046369079 + 80.996447398 7.828499329 + 80.926038077 8.171198376 +} +858b4c53fffffff +{ + -9.936110914 -71.136638614 + -10.014602868 -71.189912959 + -10.100423181 -71.149125466 + -10.107695864 -71.055079124 + -10.029203445 -71.001877296 + -9.943438803 -71.042649168 +} +8563619bfffffff +{ + 15.115481954 65.380338127 + 15.192956096 65.353819366 + 15.203823413 65.279722477 + 15.137316303 65.232212840 + 15.059925263 65.258696574 + 15.048958257 65.332725006 +} +85d7454ffffffff +{ + -51.579467212 26.808382783 + -51.660377258 26.815788402 + -51.689678022 26.919464685 + -51.638086964 27.015408448 + -51.557280342 27.007721700 + -51.527961296 26.904371760 +} +85d8f21bfffffff +{ + -43.556154535 134.508353997 + -43.464062876 134.503307312 + -43.418345161 134.394586150 + -43.464615429 134.290841265 + -43.556643277 134.295600806 + -43.602464812 134.404392199 +} +85033287fffffff +{ + 86.982910883 -175.428378094 + 86.894816891 -175.996796825 + 86.822184959 -174.878126013 + 86.835310869 -173.207993655 + 86.921801010 -172.572773342 + 86.996797598 -173.671644455 +} +8531094bfffffff +{ + 42.696361856 123.790426974 + 42.641618142 123.860897504 + 42.649026524 123.969052272 + 42.711247279 124.007068199 + 42.766172541 123.936653017 + 42.758695315 123.828165896 +} +85739bcbfffffff +{ + -0.685119121 131.113924207 + -0.779829977 131.130308104 + -0.813867626 131.220147920 + -0.753185361 131.293641827 + -0.658435738 131.277267790 + -0.624407096 131.187389915 +} +85015023fffffff +{ + 77.505566321 16.046674846 + 77.572549398 16.251899305 + 77.647372263 16.054522836 + 77.654678778 15.649202555 + 77.587187099 15.446231700 + 77.512897521 15.646287420 +} +856049b3fffffff +{ + 7.585319646 65.080023044 + 7.664463282 65.054277340 + 7.680718109 64.982555263 + 7.617921554 64.936643402 + 7.538876899 64.962355539 + 7.522529878 65.034013135 +} +85d792bbfffffff +{ + -49.683335679 49.260427188 + -49.760514898 49.264200042 + -49.807053626 49.371419702 + -49.776365822 49.474873449 + -49.699137937 49.470880831 + -49.652646412 49.363654450 +} +85317127fffffff +{ + 43.132076787 128.523935131 + 43.206781276 128.484729855 + 43.214260910 128.390061921 + 43.147131088 128.334838861 + 43.072547796 128.374091670 + 43.064973210 128.468520374 +} +85841143fffffff +{ + -7.260112138 62.735419638 + -7.346561380 62.747813678 + -7.376166350 62.832874449 + -7.319237163 62.905487299 + -7.232783670 62.892980456 + -7.203263503 62.807973532 +} +852109abfffffff +{ + 51.657406326 67.139501199 + 51.574338263 67.217971630 + 51.575072424 67.373672528 + 51.658889712 67.451432108 + 51.742096514 67.373201825 + 51.741347263 67.216970336 +} +85a89113fffffff +{ + -19.800402875 -40.182921107 + -19.722216875 -40.131577057 + -19.643259913 -40.180033913 + -19.642501937 -40.279830325 + -19.720708770 -40.331193842 + -19.799652740 -40.282741634 +} +8536b173fffffff +{ + 30.175664387 -156.183557201 + 30.090189569 -156.215956312 + 30.026032814 -156.143860382 + 30.047346955 -156.039343219 + 30.132835923 -156.006861897 + 30.196996655 -156.078979793 +} +85cf0d83fffffff +{ + -51.678462811 -82.409358782 + -51.597205269 -82.339371946 + -51.518022883 -82.411513082 + -51.519940630 -82.553517959 + -51.601121559 -82.623863695 + -51.680461476 -82.551846851 +} +85e2e15bfffffff +{ + -55.134322122 -130.684274629 + -55.098118756 -130.541180134 + -55.005996521 -130.527025624 + -54.950169466 -130.655421032 + -54.986308211 -130.798036987 + -55.078338349 -130.812735161 +} +85df30d7fffffff +{ + -65.134614683 -60.677237650 + -65.094808132 -60.472410844 + -65.001980985 -60.449462732 + -64.949059423 -60.629903315 + -64.988631569 -60.833708249 + -65.081358654 -60.858092157 +} +8514b1dbfffffff +{ + 48.070204185 124.828098247 + 48.008815283 124.908402072 + 48.016846965 125.034693226 + 48.086343632 125.081135910 + 48.147945821 125.000924600 + 48.139837833 124.874177009 +} +8506cbb3fffffff +{ + 61.893607306 -50.084750209 + 61.875865753 -50.277847362 + 61.786142286 -50.343000800 + 61.714364165 -50.215808894 + 61.732074209 -50.023746630 + 61.821593654 -49.957845125 +} +85f1960bfffffff +{ + -72.651651200 112.625890618 + -72.583915531 112.412526915 + -72.604905684 112.102715032 + -72.693804574 112.003887046 + -72.761919682 112.217102733 + -72.740755309 112.529306825 +} +85bd9c4ffffffff +{ + -31.539952697 41.920927780 + -31.453842619 41.920861812 + -31.415997684 41.831105421 + -31.464287720 41.741315537 + -31.550441129 41.741303513 + -31.588261246 41.831159417 +} +85aa7087fffffff +{ + -21.861267585 77.047087149 + -21.955500804 77.071805766 + -21.982980891 77.171871974 + -21.916210359 77.247090166 + -21.822030959 77.222261897 + -21.794568204 77.122324892 +} +8595ab63fffffff +{ + -11.449499654 119.658852728 + -11.534748357 119.675007494 + -11.570147036 119.756372894 + -11.520277876 119.821644508 + -11.434952860 119.805480944 + -11.399573311 119.724054514 +} +85e4811bfffffff +{ + -52.763336358 100.673705245 + -52.682256514 100.589402043 + -52.685557019 100.430245215 + -52.769946212 100.354724722 + -52.851223335 100.438724017 + -52.847913951 100.598549729 +} +850ca8a7fffffff +{ + 61.239486154 -166.267819410 + 61.161228831 -166.355185585 + 61.091256685 -166.258463316 + 61.099296059 -166.074867392 + 61.177285705 -165.986967958 + 61.247503598 -166.083193880 +} +85f2d043fffffff +{ + -82.922861383 -87.628458547 + -82.927749296 -86.872167156 + -82.847308050 -86.473969252 + -82.762943183 -86.825088729 + -82.758200326 -87.564412627 + -82.837679511 -87.969329884 +} +852b2bd7fffffff +{ + 44.648519108 -61.125115872 + 44.614286934 -61.245761318 + 44.526433319 -61.267104075 + 44.472904633 -61.168208538 + 44.507030167 -61.047919909 + 44.594790752 -61.026170623 +} +85eeb62bfffffff +{ + -72.245398160 0.594917801 + -72.150666853 0.630217272 + -72.092583520 0.382311108 + -72.128813357 0.098198392 + -72.223478529 0.060085415 + -72.281982005 0.308893269 +} +85241393fffffff +{ + 42.487934258 99.319741284 + 42.398080557 99.332666494 + 42.364956834 99.439906834 + 42.421531595 99.534379631 + 42.511337344 99.521800994 + 42.544616493 99.414403017 +} +8503a217fffffff +{ + 81.575511649 -160.821047035 + 81.496277530 -161.171591810 + 81.410848084 -160.892634300 + 81.403999028 -160.270774822 + 81.482400505 -159.916101738 + 81.568481357 -160.187267447 +} +852adea3fffffff +{ + 32.927249656 -77.463026668 + 32.883742612 -77.547699512 + 32.807429674 -77.539281376 + 32.774596701 -77.446464634 + 32.817948972 -77.361890032 + 32.894288737 -77.370033799 +} +85b369bbfffffff +{ + -23.019472649 -59.470692781 + -22.953160608 -59.421450796 + -22.874860782 -59.463708331 + -22.862930919 -59.555130450 + -22.929246898 -59.604309852 + -23.007488824 -59.562129801 +} +85034137fffffff +{ + 79.571025860 -59.143951684 + 79.546988992 -59.617349111 + 79.462122135 -59.712084678 + 79.401546629 -59.339379434 + 79.425249002 -58.871593862 + 79.509858093 -58.770942841 +} +8502ce23fffffff +{ + 69.623235599 -103.391859533 + 69.542692477 -103.533401850 + 69.460576718 -103.411249378 + 69.458715301 -103.148476713 + 69.538998561 -103.005932169 + 69.621403153 -103.127152678 +} +851326a3fffffff +{ + 69.941331874 -124.996061749 + 69.852451868 -125.046185010 + 69.792241120 -124.863774296 + 69.820631874 -124.630790526 + 69.909476675 -124.578891154 + 69.969966975 -124.761747951 +} +85cc12b7fffffff +{ + -40.408760547 84.545281281 + -40.492215004 84.579721035 + -40.507420219 84.695119169 + -40.439194995 84.775877809 + -40.355797867 84.741330425 + -40.340568577 84.626131668 +} +8533a44bfffffff +{ + 30.221035041 -179.485329941 + 30.315705069 -179.469553182 + 30.373818209 -179.555637347 + 30.337150340 -179.657495381 + 30.242409155 -179.673082260 + 30.184406886 -179.587001234 +} +85ef5573fffffff +{ + -76.698639622 -59.528640054 + -76.657450230 -59.150466307 + -76.560875521 -59.117162775 + -76.505617983 -59.457017242 + -76.546377001 -59.831814362 + -76.642820433 -59.870121217 +} +85390523fffffff +{ + 40.706864514 -5.762991603 + 40.645276851 -5.849457173 + 40.554214411 -5.823286608 + 40.524770741 -5.710925578 + 40.586283184 -5.624579678 + 40.677314381 -5.650475008 +} +852d9d4ffffffff +{ + 33.079637818 40.730739069 + 32.988048728 40.710753621 + 32.925853084 40.792300940 + 32.955174955 40.893776058 + 33.046675505 40.913896038 + 33.108942770 40.832406649 +} +85c0803bfffffff +{ + -39.890449161 -18.788912633 + -39.977424826 -18.840915714 + -40.056287485 -18.768433225 + -40.048098143 -18.643815967 + -39.961032558 -18.591958011 + -39.882246214 -18.664571597 +} +85e88adbfffffff +{ + -65.648773018 -70.004248045 + -65.622322109 -69.785864808 + -65.532512782 -69.727426983 + -65.469359956 -69.886086914 + -65.495672748 -70.103128606 + -65.585275779 -70.162846798 +} +851d2aabfffffff +{ + 54.165735986 -136.678887079 + 54.087580244 -136.678291490 + 54.038405622 -136.567188938 + 54.067251925 -136.456360021 + 54.145476972 -136.456428100 + 54.194786735 -136.567852885 +} +855ca637fffffff +{ + 11.103624461 -157.569992653 + 11.011428194 -157.599137101 + 10.940059140 -157.532714591 + 10.960845322 -157.437121630 + 11.053045283 -157.407903947 + 11.124455422 -157.474352347 +} +85c84933fffffff +{ + -45.645637457 95.480295281 + -45.565804549 95.418593342 + -45.563137149 95.284866839 + -45.640269108 95.212372297 + -45.720258917 95.273785567 + -45.722959954 95.407983234 +} +85252e2bfffffff +{ + 53.102645356 96.420183349 + 53.010693703 96.442370171 + 52.974984224 96.579777192 + 53.031077285 96.695287150 + 53.122996887 96.673636913 + 53.158855782 96.535939976 +} +85487407fffffff +{ + 25.267807864 -113.928765647 + 25.351093460 -113.873764422 + 25.435878779 -113.925712697 + 25.437311182 -114.032714242 + 25.353982212 -114.087621877 + 25.269264201 -114.035621838 +} +85354db7fffffff +{ + 35.211728710 -12.513098534 + 35.141913582 -12.591711516 + 35.050328237 -12.558375245 + 35.028549803 -12.446655274 + 35.098267975 -12.368090600 + 35.189861407 -12.401197324 +} +85aad0a7fffffff +{ + -32.597818938 76.378383589 + -32.690255324 76.404884281 + -32.716378323 76.514195731 + -32.650054453 76.596854521 + -32.557658658 76.570220184 + -32.531546056 76.461060452 +} +850e9caffffffff { - -78.929740695 0.957745437 - -78.833969658 1.010778752 - -78.777146564 0.615647319 - -78.815450431 0.165126354 - -78.911104968 0.104955932 - -78.968577110 0.502422618 + 57.217359201 -94.937542297 + 57.144720061 -95.050179656 + 57.054366332 -94.990344310 + 57.036470577 -94.818459400 + 57.108886896 -94.705616360 + 57.199421584 -94.764861385 } -850f21c3fffffff -{ - 68.703923189 -59.878040713 - 68.674141114 -60.123787013 - 68.581093836 -60.171317966 - 68.517978236 -59.974739764 - 68.547597227 -59.730498807 - 68.640493962 -59.681336318 -} -85a41dd3fffffff -{ - -21.935576591 -28.263377828 - -22.015170343 -28.311498742 - -22.089614735 -28.263867142 - -22.084397177 -28.167980181 - -22.004679280 -28.119893060 - -21.930303166 -28.167658844 -} -855a407bfffffff -{ - 14.575979519 164.763395263 - 14.661685271 164.762157914 - 14.705328879 164.679939538 - 14.663175533 164.599051115 - 14.577485534 164.600441221 - 14.533932982 164.682567028 -} -85e28977fffffff -{ - -56.860238947 -121.349791965 - -56.813192230 -121.204253448 - -56.719755079 -121.209823129 - -56.673394203 -121.360275073 - -56.720319914 -121.505438210 - -56.813727099 -121.500524606 -} -85ee2577fffffff -{ - -77.518148754 -46.650797790 - -77.458863614 -46.296191747 - -77.362562693 -46.357114571 - -77.325395715 -46.767017357 - -77.384078449 -47.120034044 - -77.480526642 -47.064755970 -} -85e336cffffffff -{ - -69.197142674 -145.157415947 - -69.188855652 -144.945436596 - -69.114080660 -144.882285791 - -69.047747596 -145.030308085 - -69.056029640 -145.241003519 - -69.130649544 -145.304955494 -} -85d8448ffffffff -{ - -50.701893930 124.283875603 - -50.643373307 124.167949454 - -50.675587497 124.033273107 - -50.766503085 124.014153760 - -50.825216244 124.130284880 - -50.792820850 124.265330786 -} -85a4b347fffffff -{ - -23.562195068 -37.398968475 - -23.486292954 -37.347932807 - -23.411619349 -37.396745833 - -23.412859746 -37.496602610 - -23.488790386 -37.547670790 - -23.563452092 -37.498849833 -} -85ba9857fffffff -{ - -26.905964396 -171.620730405 - -26.820830611 -171.574136781 - -26.741989719 -171.631086371 - -26.748236910 -171.734505735 - -26.833273321 -171.781143116 - -26.912159882 -171.724317665 -} -85056273fffffff -{ - 84.253364299 143.224789970 - 84.164763583 143.565739589 - 84.148924910 144.497291212 - 84.221248105 145.112705329 - 84.310719128 144.792126825 - 84.327005999 143.835319453 +85028c93fffffff +{ + 74.029998805 -123.734440457 + 73.941427974 -123.803558266 + 73.881924803 -123.580596321 + 73.910648665 -123.287943381 + 73.999140284 -123.216114021 + 74.058988806 -123.439640920 +} +85f0204ffffffff +{ + -81.444107876 80.132555196 + -81.414964392 79.558001226 + -81.472310089 79.127335919 + -81.559660868 79.270552325 + -81.589212232 79.854504139 + -81.530999291 80.285752447 +} +85a285a3fffffff +{ + -25.802609455 46.795863630 + -25.713637702 46.793787462 + -25.675559791 46.709155855 + -25.726489915 46.626490884 + -25.815529522 46.628499891 + -25.853571192 46.713241099 +} +8575a35bfffffff +{ + 7.160937301 -9.084775025 + 7.102642115 -9.142602123 + 7.034326975 -9.121741697 + 7.024278705 -9.043178263 + 7.082469114 -8.985391998 + 7.150812447 -9.006128263 +} +856b0163fffffff +{ + 13.735184909 23.663639003 + 13.643895936 23.659522967 + 13.595115262 23.741425655 + 13.637533843 23.827498936 + 13.728811809 23.831748848 + 13.777682327 23.749791636 +} +85dba2affffffff +{ + -50.281197630 -178.623473331 + -50.210358337 -178.687137092 + -50.217419797 -178.814781510 + -50.295399734 -178.879086929 + -50.366334174 -178.815449783 + -50.359193462 -178.687479967 +} +852146cffffffff +{ + 53.559731277 69.805086637 + 53.475519149 69.882157420 + 53.472801215 70.044403144 + 53.554291039 70.130151579 + 53.638634736 70.053390093 + 53.641357066 69.890569205 +} +85eca04bfffffff +{ + -63.701637843 142.847856422 + -63.668591909 142.662357120 + -63.726490769 142.510252222 + -63.817694331 142.543593580 + -63.850839289 142.730069673 + -63.792681153 142.882224632 +} +8501353bfffffff +{ + 70.335266801 29.284251985 + 70.383706232 29.455328890 + 70.459390475 29.388232612 + 70.486408007 29.148437283 + 70.437588844 28.977374233 + 70.362132721 29.046085941 +} +855d439bfffffff +{ + 17.967646526 -144.413098482 + 17.877702584 -144.448130279 + 17.803069600 -144.383781505 + 17.818364551 -144.284447210 + 17.908270295 -144.249383465 + 17.982919317 -144.313685799 +} +85f2b30bfffffff +{ + -87.534730061 171.440009311 + -87.621563154 170.842661586 + -87.683204382 172.429157837 + -87.654793903 174.608189049 + -87.566459095 175.076855047 + -87.507959614 173.499204821 +} +85f2f64bfffffff +{ + -83.853910919 -115.240112288 + -83.900618587 -114.507654734 + -83.852430635 -113.769489081 + -83.758520167 -113.775353696 + -83.712864795 -114.497195830 + -83.760082859 -115.223802982 +} +85f0ca8bfffffff +{ + -70.437632467 52.703433249 + -70.349535036 52.756377251 + -70.288636830 52.573174701 + -70.315536189 52.337115242 + -70.403425061 52.282563440 + -70.464623824 52.465671579 +} +855cc163fffffff +{ + 4.433323565 -148.408209178 + 4.343448381 -148.440241862 + 4.271715474 -148.377541589 + 4.289806839 -148.282830501 + 4.379639230 -148.250755335 + 4.451423088 -148.313433601 +} +850d201bfffffff +{ + 74.860123684 -151.837973520 + 74.789851891 -152.075028064 + 74.702054307 -151.971976253 + 74.684295035 -151.634999670 + 74.754061457 -151.397793659 + 74.842090676 -151.497695956 +} +85df1d1bfffffff +{ + -60.107348179 -58.141337841 + -60.065071046 -57.974972427 + -59.975574761 -57.963796730 + -59.928414798 -58.117983085 + -59.970470580 -58.283714541 + -60.059906910 -58.295892758 +} +8513812bfffffff +{ + 60.423799657 -130.731454274 + 60.338740238 -130.748367069 + 60.282671062 -130.616699840 + 60.311475488 -130.467759632 + 60.396571597 -130.450011718 + 60.452827116 -130.582038810 +} +8594ce0bfffffff +{ + -18.131750366 131.212129129 + -18.213563448 131.228094133 + -18.245686604 131.315701145 + -18.196012739 131.387378989 + -18.114165020 131.371423513 + -18.082025740 131.283780599 +} +85dacd53fffffff +{ + -48.629790107 154.821569459 + -48.541010434 154.786721930 + -48.516033693 154.649495915 + -48.579791325 154.546820147 + -48.668614353 154.581361979 + -48.693636559 154.718885865 +} +8507744bfffffff +{ + 67.345295412 -11.945926585 + 67.379129868 -12.123014239 + 67.328189811 -12.291432490 + 67.243608338 -12.282084462 + 67.210038381 -12.105631394 + 67.260786148 -11.937891570 +} +8511a2b7fffffff +{ + 54.780136743 33.155422879 + 54.732966897 33.270434753 + 54.773508900 33.393519773 + 54.861381292 33.401763533 + 54.908626870 33.286399053 + 54.867924092 33.163143805 +} +8527332bfffffff +{ + 52.023302216 -98.492351065 + 51.950742453 -98.582737633 + 51.864202333 -98.523524021 + 51.850035754 -98.374307090 + 51.922401669 -98.283693313 + 52.009127950 -98.342521937 +} +8521a1abfffffff +{ + 44.943417828 60.017524702 + 44.864589974 60.095715722 + 44.873167413 60.230014880 + 44.960637521 60.286510032 + 45.039616070 60.208403359 + 45.030973686 60.073716296 +} +8512338bfffffff +{ + 60.058507005 -123.476542498 + 59.972969088 -123.515260976 + 59.908373685 -123.393128137 + 59.929095512 -123.232109937 + 60.014605605 -123.192576737 + 60.079422215 -123.314875078 +} +85bfb417fffffff +{ + -32.942259541 168.332227855 + -32.853515522 168.290790871 + -32.839170250 168.180665927 + -32.913594368 168.111749056 + -33.002444994 168.153069504 + -33.016764899 168.263423786 +} +85dc8a87fffffff +{ + -48.313843095 -9.197334918 + -48.400960762 -9.243978003 + -48.470142576 -9.150575002 + -48.452116450 -9.010490801 + -48.364947600 -8.964130489 + -48.295855930 -9.057570891 +} +859a8103fffffff +{ + -9.307970101 -168.165799313 + -9.228328552 -168.127596504 + -9.161345194 -168.179451877 + -9.173921242 -168.269433528 + -9.253465154 -168.307684503 + -9.320530635 -168.255905853 +} +85513417fffffff +{ + 9.403168376 -127.618603617 + 9.320695066 -127.653291204 + 9.249876589 -127.604631391 + 9.261522290 -127.521383741 + 9.343903859 -127.486723607 + 9.414731421 -127.535283592 +} +850a0ccbfffffff +{ + 65.955522756 90.577684025 + 65.924388674 90.788119604 + 65.980707904 90.950448677 + 66.068504633 90.902415646 + 66.099793834 90.690722161 + 66.043130422 90.528324007 +} +853945d3fffffff +{ + 42.193195883 2.601521381 + 42.106377650 2.617375519 + 42.078446495 2.724994774 + 42.137351537 2.816991891 + 42.224248200 2.801312508 + 42.252161466 2.693460910 +} +8514004bfffffff +{ + 54.724912590 126.810523971 + 54.655647683 126.904557125 + 54.663093449 127.059684458 + 54.739879921 127.121473072 + 54.809397060 127.027627402 + 54.801875243 126.871803560 +} +85ee4617fffffff +{ + -69.728959463 -50.575853044 + -69.674780213 -50.344875953 + -69.578842214 -50.363985670 + -69.537048622 -50.611834336 + -69.590858992 -50.841908374 + -69.686830184 -50.825038868 +} +853242d3fffffff +{ + 35.314366085 160.622674365 + 35.410933711 160.616239010 + 35.454510239 160.511148592 + 35.401461750 160.412671967 + 35.304939968 160.419343077 + 35.261420679 160.524255227 +} +85df55a3fffffff +{ + -55.915426517 -64.344996102 + -55.882179069 -64.195300608 + -55.798382500 -64.168890694 + -55.747941866 -64.291471571 + -55.781036457 -64.440580699 + -55.864724041 -64.467694060 +} +858cad2ffffffff +{ + -5.023644607 104.925560248 + -4.936976084 104.904312735 + -4.914563061 104.815790784 + -4.978877501 104.748533261 + -5.065551196 104.769838474 + -5.087905353 104.858343575 +} +85b02e2ffffffff +{ + -26.094686953 -119.510730505 + -26.044834962 -119.427127508 + -25.960507247 -119.432647810 + -25.926040560 -119.521549027 + -25.975772570 -119.605037776 + -26.060091049 -119.599739559 +} +85467663fffffff +{ + 25.081718797 -164.942248479 + 24.992875280 -164.968972159 + 24.930843052 -164.899245297 + 24.957649005 -164.802726003 + 25.046538425 -164.775903786 + 25.108576026 -164.845699324 +} +850d26d7fffffff +{ + 75.902955340 -154.894903207 + 75.829260194 -155.135437862 + 75.742170232 -155.005033954 + 75.728472528 -154.637461804 + 75.801628416 -154.396295570 + 75.889019516 -154.523305198 +} +85e34cd7fffffff +{ + -56.321175984 -148.944549736 + -56.308427656 -148.806503206 + -56.227536776 -148.757927306 + -56.159553009 -148.847108329 + -56.172357289 -148.984593871 + -56.253089414 -149.033457898 +} +85d415a3fffffff +{ + -48.715632389 -159.341995094 + -48.636119991 -159.293038328 + -48.569111280 -159.380276484 + -48.581557467 -159.516398265 + -48.661024441 -159.565545762 + -48.728090728 -159.478381357 +} +85d55037fffffff +{ + -51.905748818 -167.511772442 + -51.834342192 -167.452838728 + -51.764819897 -167.534426642 + -51.766658019 -167.674769803 + -51.838003159 -167.733827185 + -51.907571676 -167.652418463 +} +85f1649bfffffff +{ + -88.831443098 -34.135734390 + -88.759894221 -31.302855377 + -88.674520814 -32.860880916 + -88.656853099 -36.851975850 + -88.722336979 -39.747113512 + -88.811329786 -38.626890835 } -85baed4bfffffff -{ - -26.726579700 176.276545633 - -26.644004890 176.232932531 - -26.633912806 176.135922775 - -26.706456336 176.082340246 - -26.789158016 176.125906396 - -26.799189221 176.223102322 -} -857ab173fffffff -{ - 5.196595874 50.394301145 - 5.277980335 50.391267910 - 5.324805238 50.319910776 - 5.290268679 50.251498141 - 5.208817604 50.254485311 - 5.161969667 50.325931235 -} -85006ec7fffffff -{ - 81.803269070 -14.570128893 - 81.886285790 -14.566011589 - 81.930568386 -15.115882122 - 81.891030322 -15.664192048 - 81.808033738 -15.656610559 - 81.764546711 -15.112421516 -} -850711dbfffffff -{ - 73.526227497 -12.745637671 - 73.563736728 -12.991992530 - 73.514098475 -13.221865522 - 73.427210264 -13.204163197 - 73.390021161 -12.959075148 - 73.439401564 -12.730422745 -} -85c00487fffffff -{ - -33.095972026 -10.799228071 - -33.187477585 -10.839062127 - -33.262098100 -10.764212412 - -33.245112949 -10.649488133 - -33.153542313 -10.609833021 - -33.079021820 -10.684722833 -} -8500c693fffffff -{ - 83.730024882 70.565350637 - 83.733934717 71.400419696 - 83.817018380 71.792307020 - 83.897105492 71.336073123 - 83.893008454 70.478810153 - 83.809014571 70.100356105 -} -85143143fffffff -{ - 54.665546730 123.529745060 - 54.599168101 123.629956156 - 54.610725966 123.782867522 - 54.688766918 123.836230125 - 54.755401742 123.736124652 - 54.743739078 123.582549082 -} -85ec1a2bfffffff -{ - -68.597989332 138.520369748 - -68.561177564 138.297544030 - -68.616556462 138.098394282 - -68.709046098 138.121729978 - -68.746027376 138.345864956 - -68.690348552 138.545351053 -} -85256c6ffffffff -{ - 54.115911399 109.064106581 - 54.027726606 109.059734394 - 53.980344990 109.175262457 - 54.020991090 109.295236989 - 54.100830189 109.310330632 - 54.152508739 109.189586795 - 54.143060360 109.144350257 -} -85ef03affffffff -{ - -81.611614688 -46.410387224 - -81.552826833 -45.890584440 - -81.457575330 -45.984274627 - -81.420874927 -46.585680353 - -81.478781338 -47.102145324 - -81.574261254 -47.020603162 -} -85e0011bfffffff -{ - -59.015792000 59.125443674 - -58.926253743 59.142375995 - -58.877562731 59.008957362 - -58.918172841 58.858462980 - -59.007585528 58.840761317 - -59.056514088 58.974322031 -} -859cde4bfffffff -{ - -5.826638936 140.605499482 - -5.919509523 140.620720427 - -5.952328647 140.710542628 - -5.892309646 140.785151530 - -5.799439727 140.769955720 - -5.766588071 140.680125813 -} -858ad267fffffff -{ - 1.455793561 -58.681441237 - 1.535230455 -58.633666270 - 1.615709998 -58.674835264 - 1.616733423 -58.763709064 - 1.537352187 -58.811428187 - 1.456891898 -58.770329433 -} -85c28457fffffff -{ - -38.331989156 -50.772179342 - -38.391703846 -50.835965371 - -38.470754246 -50.813707171 - -38.490147745 -50.727441569 - -38.430359070 -50.663540379 - -38.351250955 -50.686019958 -} -85ae30bbfffffff -{ - -25.214958541 91.727199301 - -25.302051128 91.760642571 - -25.318211245 91.856529324 - -25.247335198 91.918820486 - -25.160341956 91.885331618 - -25.144125438 91.789596962 -} -85d21a1bfffffff -{ - -43.489609013 -104.048497008 - -43.421927799 -103.952836804 - -43.327800773 -103.985934333 - -43.301270638 -104.114360068 - -43.368803200 -104.210030243 - -43.463014363 -104.177265386 -} -852b8ac3fffffff -{ - 44.029635213 -76.377968895 - 43.979700458 -76.486053859 - 43.890305542 -76.477515341 - 43.850821136 -76.361331101 - 43.900572788 -76.253418347 - 43.989991589 -76.261517421 -} -851342bbfffffff -{ - 63.231754442 -108.269949986 - 63.148665195 -108.364485935 - 63.068627355 -108.257456565 - 63.071422079 -108.056263592 - 63.154339599 -107.960971299 - 63.234634377 -108.067623976 -} -852743a7fffffff -{ - 44.297532842 -86.782621105 - 44.238479231 -86.877727634 - 44.151002680 -86.849013982 - 44.122477874 -86.725584908 - 44.181331990 -86.630493305 - 44.268910149 -86.658815123 -} -853e04c3fffffff -{ - 29.425849123 21.825739322 - 29.328480346 21.822693197 - 29.277492081 21.917854219 - 29.323808212 22.016146868 - 29.421177691 22.019371438 - 29.472230469 21.924124934 -} -852844b3fffffff -{ - 41.179699610 -133.614648348 - 41.260808613 -133.574459047 - 41.322024603 -133.639721595 - 41.302091878 -133.745089280 - 41.221024034 -133.785068421 - 41.159847714 -133.719890170 -} -85d4533bfffffff -{ - -43.588964817 -168.271435491 - -43.509477600 -168.218083849 - -43.433607125 -168.290264556 - -43.437187376 -168.415647153 - -43.516608497 -168.469091330 - -43.592515473 -168.397060892 +852116cffffffff +{ + 46.117078616 57.785722235 + 46.040244452 57.868101224 + 46.051707370 58.003759003 + 46.140083617 58.057427848 + 46.217069846 57.975102830 + 46.205527603 57.839054117 } -85056677fffffff +85dec89bfffffff { - 84.975557058 134.624267416 - 84.893376030 135.153441106 - 84.891447753 136.229909047 - 84.971626804 136.811429726 - 85.055095089 136.301115989 - 85.057098803 135.189663671 + -47.029061889 -49.002854762 + -46.983399438 -48.900659417 + -46.908749255 -48.912336260 + -46.879730342 -49.025756646 + -46.925196609 -49.127791773 + -46.999877575 -49.116567013 } -850246a7fffffff -{ - 75.153141227 -81.920329132 - 75.095437606 -82.206822502 - 75.005399248 -82.151407758 - 74.972926222 -81.812829565 - 75.030201852 -81.527054523 - 75.120376426 -81.579128221 -} -8539b0bbfffffff -{ - 32.450732925 -12.749832323 - 32.380288222 -12.825768531 - 32.289170229 -12.793228721 - 32.268484766 -12.684966584 - 32.338828015 -12.609073573 - 32.429958054 -12.641399256 -} -853aab83fffffff -{ - 25.800206909 -53.177658741 - 25.720944129 -53.207556846 - 25.651015936 -53.148439729 - 25.660236715 -53.059369267 - 25.739499084 -53.029292747 - 25.809541211 -53.088464990 -} -85e710d3fffffff -{ - -66.923235586 40.118953547 - -66.848795151 39.998106242 - -66.846158275 39.778839059 - -66.918046676 39.678925796 - -66.992820653 39.799191079 - -66.995372350 40.019958341 -} -85c783cbfffffff -{ - -46.384141149 -130.694192894 - -46.344051554 -130.574802141 - -46.250385357 -130.562930639 - -46.196902877 -130.670070776 - -46.236931683 -130.789128127 - -46.330503564 -130.801378213 -} -8503b5c3fffffff -{ - 80.732108384 -169.895573377 - 80.645213069 -170.137519717 - 80.566892926 -169.803346311 - 80.574729207 -169.230922106 - 80.660973610 -168.982728129 - 80.740034041 -169.313089969 -} -858cb21bfffffff -{ - -0.762194416 110.896509448 - -0.674239093 110.877513925 - -0.650636958 110.792045542 - -0.715068063 110.725573201 - -0.803057342 110.744634901 - -0.826581621 110.830102800 -} -85272db3fffffff -{ - 51.294940353 -88.455513769 - 51.230243679 -88.564444415 - 51.138542463 -88.526955054 - 51.111412652 -88.381057116 - 51.175892019 -88.272111202 - 51.267718204 -88.309077203 -} -85f2b107fffffff -{ - -86.509851010 -170.763975056 - -86.599560082 -170.709468576 - -86.637049757 -169.332871412 - -86.583033350 -168.054715087 - -86.493534217 -168.177844034 - -86.457793929 -169.510987676 -} -855f9513fffffff -{ - 7.512180449 -46.779174221 - 7.592236659 -46.729317474 - 7.672996431 -46.774906983 - 7.673720929 -46.870322154 - 7.593708331 -46.920168376 - 7.512927639 -46.874610083 -} -85e49053fffffff -{ - -48.952858429 103.750743902 - -48.875756535 103.668218452 - -48.882977421 103.523478276 - -48.967335161 103.460715881 - -49.044635806 103.543044295 - -49.037379854 103.688333629 -} -855716d7fffffff -{ - 23.211068383 -39.056914957 - 23.131889247 -39.103824515 - 23.052313646 -39.050841796 - 23.051798127 -38.950984347 - 23.130911246 -38.903936577 - 23.210605977 -38.956884181 -} -85b81837fffffff -{ - -27.272845709 128.994352963 - -27.184185378 128.996178049 - -27.143098110 128.915242133 - -27.190543821 128.832471819 - -27.279119202 128.830475767 - -27.320333891 128.911420831 -} -857984affffffff -{ - 3.720973514 -141.588475539 - 3.632781991 -141.622083573 - 3.561795657 -141.563038165 - 3.578955567 -141.470438552 - 3.667079854 -141.436812130 - 3.738111473 -141.495803575 -} -850db433fffffff -{ - 70.372447193 177.028120525 - 70.278896818 176.970951386 - 70.216667436 177.180527883 - 70.247574035 177.447461019 - 70.340923038 177.506761102 - 70.403568130 177.297005388 -} -85032e2bfffffff +8542162bfffffff { - 87.111996188 -66.732813194 - 87.165634227 -68.164472970 - 87.127975677 -69.870975812 - 87.038499719 -70.076848653 - 86.987364963 -68.671378813 - 87.023265778 -67.032566639 + 23.137112779 61.481570827 + 23.067415345 61.535656070 + 23.069308667 61.631205944 + 23.140939457 61.672867629 + 23.210772817 61.618834928 + 23.208839377 61.523087674 } -85c696c3fffffff +85e9ab73fffffff { - -42.520912531 -121.274582613 - -42.469430855 -121.165246836 - -42.373745826 -121.169500015 - -42.329575307 -121.282717998 - -42.380945116 -121.391842450 - -42.476597059 -121.387960173 + -69.303416099 -93.874074411 + -69.313116706 -93.621696052 + -69.239888531 -93.461557206 + -69.157347047 -93.553435847 + -69.147814986 -93.803940218 + -69.220656674 -93.964430992 } -851a606bfffffff +852b0b23fffffff { - 49.286802911 -33.217630371 - 49.208003018 -33.291910448 - 49.129548772 -33.223499989 - 49.129808238 -33.080954079 - 49.208542111 -33.006465396 - 49.287082550 -33.074730354 + 42.245648258 -64.681060933 + 42.208105183 -64.794021030 + 42.121497079 -64.807796092 + 42.072496116 -64.708998063 + 42.109913226 -64.596330011 + 42.196456966 -64.582168331 } -858099b7fffffff +8500512ffffffff +{ + 85.445213329 5.211804117 + 85.527039868 5.607334249 + 85.597567564 4.848330733 + 85.584597398 3.685838558 + 85.501769193 3.321431780 + 85.432897804 4.087569438 +} +85c0db7bfffffff +{ + -47.213452315 -9.518487289 + -47.301215289 -9.564787060 + -47.371310033 -9.473258623 + -47.353551986 -9.335389152 + -47.265736743 -9.289360205 + -47.195731693 -9.380929217 +} +85d543bbfffffff +{ + -51.748051328 -171.707999168 + -51.679289009 -171.646035574 + -51.607519710 -171.721566208 + -51.604479224 -171.858841050 + -51.673177454 -171.920880677 + -51.744980244 -171.845570105 +} +85ce454bfffffff +{ + -41.329593167 -87.889881642 + -41.253529889 -87.822590393 + -41.168753339 -87.876122810 + -41.159888731 -87.996799197 + -41.235844295 -88.064288632 + -41.320772236 -88.010904244 +} +850acc0bfffffff +{ + 66.296227120 110.618584009 + 66.237963296 110.803580589 + 66.271076558 111.018051005 + 66.362730217 111.048623870 + 66.421325924 110.863148448 + 66.387934928 110.647576512 +} +85bf3087fffffff +{ + -40.506614902 165.815878715 + -40.417893843 165.772678285 + -40.403399581 165.650482761 + -40.477639635 165.571212113 + -40.566451659 165.614249061 + -40.580932707 165.736720704 +} +8514f45bfffffff +{ + 51.400418403 131.766830399 + 51.330481724 131.842488676 + 51.331217121 131.984384680 + 51.401915933 132.051211643 + 51.472071108 131.975803724 + 51.471308891 131.833316823 +} +85ac632ffffffff +{ + -25.034822589 1.668619021 + -25.124718616 1.645824495 + -25.190048509 1.721116900 + -25.165376258 1.819142818 + -25.075473299 1.841748444 + -25.010249382 1.766517185 +} +85f21c03fffffff +{ + -80.736976019 -136.489328048 + -80.805719516 -136.154697845 + -80.789004909 -135.602587956 + -80.703695171 -135.394372120 + -80.635699159 -135.731355284 + -80.652267708 -136.274300043 +} +85a165b7fffffff +{ + -29.079855059 -143.147803484 + -28.987020203 -143.123798089 + -28.922011754 -143.201608890 + -28.949770214 -143.303500848 + -29.042624930 -143.327686780 + -29.107701429 -143.249800327 +} +85006363fffffff +{ + 82.233006523 -8.779627332 + 82.316151116 -8.709296717 + 82.368346492 -9.254814669 + 82.336467580 -9.866766097 + 82.253155774 -9.924233543 + 82.201881113 -9.382669184 +} +85e11813fffffff +{ + -63.022091829 67.456863853 + -62.928922642 67.449492680 + -62.886173468 67.276041162 + -62.936346577 67.109462532 + -63.029457904 67.115717208 + -63.072454696 67.289666626 +} +85c725d7fffffff +{ + -47.276123297 -147.852375070 + -47.191581985 -147.817180676 + -47.132865407 -147.910788915 + -47.158634401 -148.039654452 + -47.243171149 -148.075104702 + -47.301943598 -147.981433899 +} +859e600ffffffff +{ + -21.361120866 160.343489854 + -21.272692440 160.313522025 + -21.250489241 160.215018421 + -21.316684799 160.146314699 + -21.405194401 160.176150030 + -21.427427338 160.274821847 +} +85875663fffffff +{ + -11.718396006 85.038982471 + -11.805969004 85.066245043 + -11.830418062 85.156567836 + -11.767300460 85.219504759 + -11.679816651 85.192177787 + -11.655361244 85.101978118 +} +8514dd63fffffff +{ + 50.219805762 141.386084872 + 50.145534659 141.439777902 + 50.134802095 141.576664317 + 50.198285389 141.660397366 + 50.272724011 141.607093473 + 50.283511989 141.469665970 +} +857d21cffffffff +{ + -10.997552742 -22.860824187 + -10.916764011 -22.817399249 + -10.839899537 -22.862075634 + -10.843791398 -22.950237637 + -10.924628521 -22.993742646 + -11.001525379 -22.949005651 +} +856a9123fffffff +{ + -0.886511972 20.954754600 + -0.794589405 20.962604200 + -0.744381665 20.885986011 + -0.786028801 20.801530275 + -0.877908254 20.793626085 + -0.928183754 20.870232165 +} +856c3087fffffff +{ + 9.961157134 -96.769322672 + 10.034221597 -96.712220088 + 10.115723601 -96.746686032 + 10.124129119 -96.838364549 + 10.050968807 -96.895482456 + 9.969498911 -96.860906663 +} +850322d7fffffff { - 2.711010072 -35.330469875 - 2.792280057 -35.281917235 - 2.875898023 -35.328821089 - 2.878287020 -35.424293609 - 2.797027558 -35.472884845 - 2.713368565 -35.425965096 + 89.513746803 -149.069428948 + 89.446070979 -155.868486444 + 89.357098018 -152.908054154 + 89.329446726 -145.215402558 + 89.384753690 -138.714403147 + 89.478641783 -139.345724744 +} +85d94903fffffff +{ + -55.171112027 122.262435771 + -55.109813701 122.134644352 + -55.141672703 121.980497233 + -55.235011901 121.953633613 + -55.296522540 122.081635279 + -55.264481160 122.236291141 +} +851f0eabfffffff +{ + 53.980060922 14.951962108 + 53.901484196 14.956331174 + 53.868137813 15.085746069 + 53.913323765 15.211023106 + 53.991921817 15.206963385 + 54.025312775 15.077317062 +} +85600c0ffffffff +{ + 10.150840319 72.929271596 + 10.235833919 72.901851641 + 10.253193717 72.819368791 + 10.185639997 72.764379109 + 10.100734270 72.791778376 + 10.083294418 72.874188084 +} +856c4343fffffff +{ + 1.950086856 -90.003733636 + 1.875354904 -90.061397304 + 1.790233397 -90.025541548 + 1.779860881 -89.931969021 + 1.854648572 -89.874290122 + 1.939752992 -89.910198863 +} +85118d0bfffffff +{ + 56.589657421 40.026778992 + 56.535596672 40.145328684 + 56.570657881 40.288371827 + 56.659933308 40.313188443 + 56.714107306 40.194349719 + 56.678892310 40.050983275 +} +8511a8c3fffffff +{ + 56.687816876 35.736369973 + 56.638817268 35.856596027 + 56.678068566 35.991273699 + 56.766478755 36.005964776 + 56.815569521 35.885383441 + 56.776158654 35.750466550 +} +8500cab3fffffff +{ + 87.049488635 109.375920285 + 86.995419204 110.828065941 + 87.032418637 112.504687787 + 87.125267964 112.797993082 + 87.181822897 111.316462762 + 87.142975503 109.569719224 +} +855c56cbfffffff +{ + 9.994638755 -147.668211519 + 9.903153178 -147.701208728 + 9.829537867 -147.637381379 + 9.847369813 -147.540583585 + 9.938816593 -147.507544566 + 10.012470259 -147.571345003 +} +85c6c8a3fffffff +{ + -30.454788133 -130.881725850 + -30.365582216 -130.870629253 + -30.311714649 -130.947637780 + -30.347019845 -131.035883539 + -30.436303079 -131.047154188 + -30.490203851 -130.970004946 +} +85f2dc43fffffff +{ + -80.614126862 -86.934695673 + -80.617263031 -86.362369522 + -80.535865568 -86.064757017 + -80.452066849 -86.335310749 + -80.449038268 -86.897859186 + -80.529701951 -87.199520007 +} +850e91c7fffffff +{ + 58.378250647 -97.573483994 + 58.303191673 -97.683330420 + 58.214377464 -97.615073737 + 58.200422838 -97.437535530 + 58.275264677 -97.327393612 + 58.364278142 -97.395082494 +} +85051293fffffff +{ + 74.549427155 112.023337462 + 74.488790065 112.302378102 + 74.522745853 112.635713527 + 74.617710302 112.692752076 + 74.678839514 112.412773875 + 74.644509599 112.076683559 +} +85a0cd1bfffffff +{ + -11.143674357 -141.879647501 + -11.061162832 -141.860429753 + -10.998568066 -141.926499351 + -11.018390627 -142.011847121 + -11.100902000 -142.031195382 + -11.163591083 -141.965065414 +} +851761a7fffffff +{ + 64.779412833 174.721358158 + 64.687799777 174.685347375 + 64.630990131 174.854330741 + 64.665457017 175.059553015 + 64.756929074 175.096899917 + 64.814076137 174.927691695 +} +85d0330ffffffff +{ + -45.730267380 9.632691698 + -45.820914567 9.614988738 + -45.873501904 9.714812260 + -45.835384541 9.832152431 + -45.744783557 9.849534452 + -45.692253574 9.749897235 +} +85ec58cbfffffff +{ + -75.976534728 130.686408878 + -75.933137014 130.370266526 + -75.979748981 130.042423322 + -76.070147930 130.028956523 + -76.113910934 130.347216442 + -76.066907215 130.676823580 +} +85a46a53fffffff +{ + -23.241341797 -18.935321530 + -23.326612841 -18.978100727 + -23.401076955 -18.918793177 + -23.390173550 -18.816616842 + -23.304798499 -18.773934318 + -23.230430857 -18.833331131 +} +857413d3fffffff +{ + 1.319149373 -7.384880297 + 1.386519560 -7.354061497 + 1.456496148 -7.388893735 + 1.459174569 -7.454618467 + 1.391768942 -7.485519851 + 1.321720296 -7.450613902 +} +8529068bfffffff +{ + 31.590159811 -122.930308688 + 31.674623295 -122.881217918 + 31.751903712 -122.939734565 + 31.744653128 -123.047336099 + 31.660187261 -123.096275712 + 31.582974321 -123.037765201 +} +85eee3bbfffffff +{ + -68.581544737 -34.830463130 + -68.508835487 -34.656917261 + -68.417903533 -34.743220384 + -68.399440562 -35.001468046 + -68.471762033 -35.175288714 + -68.562933417 -35.090595821 +} +859f69c7fffffff +{ + -27.186723237 162.802039167 + -27.096170820 162.767839751 + -27.075887374 162.663062039 + -27.146145239 162.592287617 + -27.236788418 162.626350211 + -27.257083021 162.731324388 +} +85b49207fffffff +{ + -20.652973896 -146.437897931 + -20.562235825 -146.412524468 + -20.494439089 -146.483941047 + -20.517292073 -146.580776332 + -20.608023345 -146.606299939 + -20.675908540 -146.534838249 +} +85d02543fffffff +{ + -42.199168173 12.646185254 + -42.290305811 12.633650837 + -42.341921419 12.728350203 + -42.302350356 12.835393808 + -42.211276456 12.847645748 + -42.159709754 12.753136466 +} +85992d4bfffffff +{ + -5.944399164 -6.148568655 + -6.014838007 -6.174079852 + -6.071645654 -6.116127734 + -6.057909492 -6.032666151 + -5.987417659 -6.007265843 + -5.930714883 -6.065216092 +} +850a2887fffffff +{ + 67.162660195 85.358087981 + 67.139099049 85.583132071 + 67.201173969 85.737602733 + 67.287156760 85.666813304 + 67.310816586 85.440251931 + 67.248394377 85.286003697 +} +85f0f197fffffff +{ + -74.103324139 62.790656401 + -74.012715171 62.803406470 + -73.960805551 62.537612939 + -73.999144739 62.258201451 + -74.089643326 62.242577934 + -74.141914823 62.509233231 +} +8520c8d7fffffff +{ + 41.410515132 84.109775583 + 41.320096277 84.148739069 + 41.301448510 84.272108429 + 41.373121809 84.356817078 + 41.463592254 84.318171942 + 41.482338005 84.194499250 +} +851052b3fffffff +{ + 62.138485433 56.288981028 + 62.070901634 56.409165985 + 62.087689619 56.601758786 + 62.172146974 56.674945238 + 62.239905322 56.554826118 + 62.223031461 56.361452277 +} +85ab03c3fffffff +{ + -19.023114385 66.275799067 + -19.117930774 66.292165907 + -19.151252374 66.387499571 + -19.089689582 66.466384331 + -18.994874769 66.449885476 + -18.961621067 66.354633790 +} +85d70417fffffff +{ + -56.785543371 36.370783244 + -56.716953475 36.298319160 + -56.706496012 36.151334697 + -56.764651691 36.076141895 + -56.833464105 36.148268924 + -56.843898239 36.295927841 +} +85136487fffffff +{ + 67.992559979 -103.573826010 + 67.911752186 -103.705078750 + 67.829041031 -103.590663282 + 67.826862530 -103.345786692 + 67.907428901 -103.213654140 + 67.990415261 -103.327270031 } -85f29993fffffff +85f1688ffffffff +{ + -84.827061942 -1.485215654 + -84.733010848 -1.330913015 + -84.674870963 -2.130107431 + -84.709392507 -3.091124301 + -84.803013090 -3.276174007 + -84.862563112 -2.469747543 +} +85261857fffffff +{ + 40.930034335 -99.496020987 + 40.998970872 -99.422920847 + 41.082217359 -99.470493544 + 41.096519655 -99.591338326 + 41.027536731 -99.664440090 + 40.944297959 -99.616695799 +} +851a528bfffffff +{ + 45.991700565 -39.982422537 + 45.908290722 -40.043263898 + 45.832488379 -39.972238750 + 45.840001261 -39.840422520 + 45.923373119 -39.779330576 + 45.999270150 -39.850304792 +} +85ef5dd3fffffff +{ + -74.300380903 -61.854108131 + -74.262358355 -61.527600116 + -74.166371013 -61.485107733 + -74.108561733 -61.765571588 + -74.146247615 -62.089426741 + -74.242077029 -62.135460337 +} +855cc04ffffffff +{ + 4.916107116 -149.829826417 + 4.825876550 -149.861452163 + 4.754008692 -149.798115034 + 4.772320294 -149.703166877 + 4.862514052 -149.671493742 + 4.934433058 -149.734816015 +} +85a01b33fffffff +{ + -15.213621030 -137.035552423 + -15.128969824 -137.020208756 + -15.067843135 -137.088356426 + -15.091285472 -137.171933735 + -15.175964605 -137.187416384 + -15.237173581 -137.119182748 +} +850eea57fffffff +{ + 52.321528644 -80.444863235 + 52.264029366 -80.570273076 + 52.169343392 -80.550228973 + 52.132094005 -80.405402731 + 52.189378308 -80.280158168 + 52.284126524 -80.299573814 +} +850113a7fffffff +{ + 73.120685897 37.293517534 + 73.164168300 37.525926283 + 73.246241141 37.487441941 + 73.284673041 37.213930816 + 73.240747128 36.980794689 + 73.158834536 37.021891117 +} +85f02317fffffff +{ + -81.166492149 74.109218108 + -81.128468930 73.572559749 + -81.178847565 73.115196756 + -81.268067696 73.191697692 + -81.306630203 73.735806274 + -81.255426680 74.195915928 +} +8503262bfffffff { - -86.783319791 -88.516550798 - -86.790189638 -86.864001199 - -86.711029781 -86.004174437 - -86.627065966 -86.764072117 - -86.620473261 -88.337760311 - -86.697577968 -89.227865149 -} -8575949bfffffff -{ - 7.006911377 -12.101061415 - 6.947606089 -12.158249220 - 6.878747839 -12.134453359 - 6.869156599 -12.053591138 - 6.928355467 -11.996430689 - 6.997251879 -12.020105007 -} -85d12b0bfffffff -{ - -38.136189750 12.111256680 - -38.227990222 12.098688962 - -38.282294161 12.188282299 - -38.244740826 12.290276596 - -38.153001921 12.302590335 - -38.098754666 12.213163690 -} -85bd45abfffffff -{ - -40.675798932 26.325738610 - -40.599306966 26.332847040 - -40.555259502 26.238091251 - -40.587697803 26.136208842 - -40.664183113 26.129013602 - -40.708236873 26.223787519 -} -85254637fffffff -{ - 51.872931704 105.414567297 - 51.783087148 105.417615748 - 51.739655828 105.534927195 - 51.785909260 105.649316542 - 51.875664686 105.646733313 - 51.919256023 105.529295937 -} -85696563fffffff -{ - 18.329752936 118.988389880 - 18.245422285 119.005236411 - 18.223201783 119.089665129 - 18.285382374 119.157314882 - 18.369768743 119.140457721 - 18.391918841 119.055961381 -} -85df0173fffffff -{ - -60.691523580 -61.340676760 - -60.653310060 -61.167246366 - -60.563971214 -61.145680671 - -60.512940101 -61.296529340 - -60.550954285 -61.469215954 - -60.640198180 -61.491796164 -} -854c912bfffffff -{ - 21.275361654 -74.978497111 - 21.334353762 -74.920126391 - 21.414752481 -74.935603494 - 21.436228463 -75.009580967 - 21.377185147 -75.068056317 - 21.296717089 -75.052449512 -} -85393617fffffff -{ - 39.840962641 -11.879669023 - 39.773178066 -11.963317323 - 39.681727529 -11.928838347 - 39.658059537 -11.810970793 - 39.725754638 -11.727383183 - 39.817207071 -11.761602138 -} -85e4423bfffffff -{ - -62.984429543 87.010728894 - -62.893603513 86.938924306 - -62.876250677 86.732380217 - -62.949596991 86.596563448 - -63.040561332 86.667398641 - -63.058041551 86.875023830 -} -855843cffffffff -{ - 13.367042314 14.473382619 - 13.276937712 14.476585918 - 13.231749012 14.560386955 - 13.276600019 14.641083741 - 13.366740559 14.638009272 - 13.411994267 14.554109122 -} -85238583fffffff -{ - 41.985361977 -159.121104163 - 42.066475878 -159.082621554 - 42.135996727 -159.149629707 - 42.124354778 -159.255296492 - 42.043118760 -159.293686089 - 41.973646855 -159.226502383 -} -8509106ffffffff -{ - 62.852314379 -0.803201798 - 62.814557811 -0.933130425 - 62.739371187 -0.904545648 - 62.701954825 -0.746638101 - 62.739636228 -0.617062865 - 62.814808863 -0.645041821 -} -85e259bbfffffff -{ - -50.384206874 -136.371498778 - -50.352635619 -136.243252460 - -50.261794971 -136.220360552 - -50.202648926 -136.325328734 - -50.234195994 -136.453149236 - -50.324913154 -136.476426480 -} -8502eca7fffffff -{ - 73.163314200 -95.198229063 - 73.090333970 -95.403641190 - 73.004523337 -95.292584639 - 72.991418974 -94.978069052 - 73.064032635 -94.771946240 - 73.150116515 -94.881034078 -} -857c4223fffffff -{ - 4.084831762 -27.218370946 - 4.162793601 -27.173361219 - 4.244221896 -27.218626176 - 4.247748946 -27.308946595 - 4.169784174 -27.354022590 - 4.088295255 -27.308711989 -} -856a9c2ffffffff -{ - -1.089489778 22.156340226 - -0.997172765 22.163781609 - -0.946736943 22.086426737 - -0.988552383 22.001637092 - -1.080831419 21.994139458 - -1.131333065 22.071487667 -} -85024baffffffff -{ - 70.362579848 -78.479683582 - 70.307347628 -78.711605154 - 70.213215348 -78.683368746 - 70.174246114 -78.425293167 - 70.229154430 -78.194052792 - 70.323354508 -78.220203459 -} -85f0c46bfffffff -{ - -72.900411053 59.364238570 - -72.810210743 59.392884712 - -72.754836391 59.157443118 - -72.789318798 58.892895299 - -72.879368055 58.861856902 - -72.935087295 59.097751300 -} -8506ec67fffffff -{ - 64.086869535 -41.830343829 - 64.081811184 -42.034959306 - 63.998390727 -42.128059611 - 63.920279092 -42.017115895 - 63.925387450 -41.813704049 - 64.008557526 -41.720037099 -} -8576d943fffffff -{ - -7.566091192 164.468725773 - -7.492434468 164.440031909 - -7.473015506 164.355986084 - -7.527232904 164.300505508 - -7.600971624 164.329117347 - -7.620410985 164.413291967 -} -85e25d43fffffff -{ - -51.500392525 -136.417206121 - -51.469451252 -136.285920025 - -51.378813483 -136.262409291 - -51.319240313 -136.369780360 - -51.350157549 -136.500619947 - -51.440671842 -136.524534017 -} -85c22c4bfffffff -{ - -38.423029513 -60.165288670 - -38.490160824 -60.214978506 - -38.545484117 -60.171729039 - -38.533673922 -60.078850622 - -38.466585157 -60.029283622 - -38.411264059 -60.072472124 -} -8598686bfffffff -{ - -15.573582005 2.678657791 - -15.655063668 2.659208039 - -15.716307965 2.727168747 - -15.695960550 2.814524329 - -15.614464727 2.833820484 - -15.553330338 2.765914738 -} -85229a6ffffffff -{ - 53.940358657 -157.458014448 - 54.012312215 -157.409443348 - 54.047495252 -157.448542519 - 54.080248215 -157.475690402 - 54.081039993 -157.614827855 - 54.008986879 -157.663281347 - 53.938662585 -157.584737423 -} -85d8f443fffffff -{ - -45.207439663 134.819954409 - -45.116003835 134.814354215 - -45.070253956 134.702543182 - -45.115838764 134.596255095 - -45.207213901 134.601552929 - -45.253065074 134.713441030 -} -855543d3fffffff -{ - 18.675074726 -6.271455671 - 18.611358419 -6.337673689 - 18.529957175 -6.317064560 - 18.512272000 -6.230399100 - 18.575880504 -6.164248836 - 18.657281848 -6.184696212 -} -8504741bfffffff -{ - 77.848452710 162.378415590 - 77.751506395 162.399076594 - 77.706268307 162.802684727 - 77.757436920 163.189008286 - 77.854410579 163.174503697 - 77.900192708 162.767514335 -} -8500ea83fffffff -{ - 86.473627039 54.389267583 - 86.503236239 55.786478777 - 86.594860505 56.087948756 - 86.657582230 54.926135119 - 86.626588161 53.473581165 - 86.534300036 53.239321368 -} -85ee239bfffffff -{ - -76.990737825 -40.878400532 - -76.924089459 -40.564408238 - -76.829388601 -40.663643277 - -76.801074261 -41.072044628 - -76.867118909 -41.385626584 - -76.962078556 -41.291246018 -} -850d7633fffffff -{ - 70.099650480 -145.277910131 - 70.037894838 -145.476046207 - 69.951832361 -145.428552297 - 69.927436126 -145.184891057 - 69.988813216 -144.987142671 - 70.074963717 -145.032662466 -} -8514506ffffffff + 89.937684450 -172.280549352 + 89.849268168 174.220594178 + 89.777325492 -166.737429823 + 89.759257469 -144.190238597 + 89.803886032 -123.073483968 + 89.893928397 -112.334903952 +} +85e8589bfffffff { - 55.967267843 137.826432469 - 55.888863676 137.899180855 - 55.882079049 138.062785179 - 55.953669620 138.154421946 - 56.032290611 138.082150132 - 56.039104315 137.917762451 + -56.582434866 -84.497442035 + -56.502045037 -84.414192364 + -56.423434592 -84.491890399 + -56.425056240 -84.652639570 + -56.505352386 -84.736307992 + -56.584120667 -84.658810259 } -8548194ffffffff -{ - 28.158663377 -107.430954427 - 28.239397649 -107.369804318 - 28.326388617 -107.418797351 - 28.332601129 -107.529036368 - 28.251811996 -107.590131076 - 28.164865236 -107.541042472 -} -85e87273fffffff -{ - -60.210644879 -88.933026736 - -60.133539437 -88.830449456 - -60.053873567 -88.908160373 - -60.051157655 -89.088097566 - -60.128136205 -89.191089439 - -60.207957568 -89.113732010 -} -85082393fffffff -{ - 65.902306413 7.730047895 - 65.949522508 7.620794397 - 65.922360431 7.454427234 - 65.848003227 7.398247485 - 65.801012684 7.507683064 - 65.828153919 7.673119476 -} -8541126bfffffff -{ - 24.479481927 116.773617629 - 24.565389479 116.755984309 - 24.600271234 116.669370991 - 24.549196849 116.600373972 - 24.463216468 116.618087800 - 24.428383290 116.704718143 -} -858a9547fffffff -{ - -4.127324491 -53.820431778 - -4.046348886 -53.770733799 - -3.962165371 -53.814637495 - -3.958978858 -53.908181341 - -4.039918874 -53.957839216 - -4.124080979 -53.913993458 -} -85022d8ffffffff -{ - 80.189317843 -84.611105334 - 80.131088367 -85.014907636 - 80.046631854 -84.912010269 - 80.020152360 -84.412135563 - 80.077741413 -84.009174574 - 80.162446387 -84.105203454 -} -8530d80bfffffff -{ - 33.074074198 128.671719833 - 33.001985985 128.689106742 - 32.982647601 128.782725286 - 33.035427566 128.859006507 - 33.107525098 128.841625820 - 33.126833415 128.747957608 -} -8516ccb7fffffff -{ - 48.926696559 174.159226050 - 49.017676523 174.170739583 - 49.070852303 174.052649263 - 49.032958378 173.923139184 - 48.941948230 173.911970893 - 48.888861975 174.029967145 -} -850144cbfffffff -{ - 75.598308969 7.749897310 - 75.667952765 7.880713292 - 75.733805312 7.669959672 - 75.729502631 7.327369165 - 75.659513537 7.199020138 - 75.594171345 7.410771564 -} -850ca497fffffff -{ - 64.599848627 -171.635619046 - 64.515294691 -171.718493567 - 64.445947323 -171.590538024 - 64.460848501 -171.380127138 - 64.545136298 -171.296342797 - 64.614789294 -171.423873608 -} -85f29ed3fffffff -{ - -89.389706931 -78.294144221 - -89.375402828 -69.804975439 - -89.286542879 -67.856012763 - -89.218393521 -72.858258706 - -89.229209733 -79.647023052 - -89.311112682 -82.888992682 +859add77fffffff +{ + -4.866153461 -173.972391460 + -4.792858178 -173.933530944 + -4.731681121 -173.977736148 + -4.743727486 -174.060712222 + -4.816920539 -174.099591823 + -4.878169404 -174.055476410 } -85005c07fffffff -{ - 85.418461380 -5.259297083 - 85.504341887 -5.067539659 - 85.562559471 -5.976490839 - 85.533248683 -7.069961992 - 85.446899456 -7.224076127 - 85.390304620 -6.322798171 -} -85002d67fffffff -{ - 79.636934706 17.655633163 - 79.705020213 17.918231794 - 79.782930714 17.689520077 - 79.792134563 17.193792356 - 79.723414692 16.934199310 - 79.646125835 17.167255695 -} -850f28d7fffffff -{ - 66.709177783 -60.413099118 - 66.677936798 -60.639290220 - 66.583916052 -60.681297105 - 66.521274058 -60.498518466 - 66.552360329 -60.273592680 - 66.646242486 -60.230184470 -} -8548750bfffffff -{ - 25.864355709 -114.722502066 - 25.947855932 -114.667903476 - 26.032175094 -114.720518831 - 26.032925965 -114.827780208 - 25.949385858 -114.882279759 - 25.865134748 -114.829617254 -} -85e4b44bfffffff -{ - -51.229562474 108.687172181 - -51.155320688 108.591062015 - -51.169039443 108.439899231 - -51.257078161 108.384263327 - -51.331535651 108.480257580 - -51.317738483 108.632005229 -} -85b89617fffffff -{ - -21.108844435 137.335228713 - -21.020758854 137.328473944 - -20.986924402 137.242856735 - -21.041055319 137.163936448 - -21.129103635 137.170520612 - -21.163058430 137.256195629 -} -85f0355bfffffff -{ - -80.285843381 89.801818055 - -80.204659724 89.597584659 - -80.189297764 89.068877701 - -80.254921070 88.737206348 - -80.336538331 88.935558918 - -80.352101086 89.471532593 -} -85b0d863fffffff -{ - -17.515127897 -111.638606547 - -17.575939495 -111.691992135 - -17.658499022 -111.666951954 - -17.680328767 -111.588433579 - -17.619508095 -111.534954829 - -17.536866727 -111.560087622 -} -8556b143fffffff -{ - 13.063931168 -43.063318057 - 13.139907944 -43.013955648 - 13.217147523 -43.059905023 - 13.218446182 -43.155200947 - 13.142511136 -43.204568832 - 13.065235709 -43.158635452 -} -85703697fffffff -{ - 7.349601624 -173.597253241 - 7.263927063 -173.616645251 - 7.199791745 -173.555700004 - 7.221289103 -173.475276641 - 7.307021253 -173.455796644 - 7.371198492 -173.516827997 -} -853d88d3fffffff -{ - 26.041513066 80.408791010 - 25.963054927 80.444267735 - 25.952582764 80.543315586 - 26.020503627 80.607089556 - 26.099040304 80.571795189 - 26.109577708 80.472544166 -} -85048d47fffffff -{ - 67.635575997 149.586120977 - 67.543042681 149.651488366 - 67.518160382 149.895407524 - 67.585615494 150.075566343 - 67.678330236 150.011839680 - 67.703409464 149.766306938 -} -852a1b17fffffff -{ - 37.402135950 -73.471817835 - 37.358493575 -73.568224332 - 37.276195997 -73.565795202 - 37.237538637 -73.467292982 - 37.281024041 -73.371046849 - 37.363323478 -73.373142547 -} -8589562ffffffff -{ - -11.296772733 -156.245110967 - -11.212689068 -156.213682458 - -11.144905290 -156.275613242 - -11.161106711 -156.368955665 - -11.245130014 -156.400486350 - -11.313012327 -156.338572619 -} -85bf8913fffffff -{ - -32.471782753 158.895876163 - -32.378565015 158.863391782 - -32.355476230 158.751814678 - -32.425576013 158.672510993 - -32.518863981 158.704816711 - -32.541982026 158.816605146 -} -85a74cc7fffffff -{ - -25.883648522 105.905325536 - -25.958949152 105.941922760 - -25.965085688 106.021759086 - -25.896023856 106.064880713 - -25.820827688 106.028302582 - -25.814588962 105.948583625 -} -858d0847fffffff -{ - -13.452832850 107.677344439 - -13.376005376 107.657760927 - -13.358779106 107.573332535 - -13.418440644 107.508496397 - -13.495269340 107.528137982 - -13.512435357 107.612557679 -} -85a763bbfffffff -{ - -28.371080747 106.277835285 - -28.445363184 106.315313565 - -28.449419761 106.396506127 - -28.379298355 106.440098764 - -28.305114673 106.402641916 - -28.300953703 106.321570890 -} -85e66d6ffffffff -{ - -66.588272193 -4.631615448 - -66.497132112 -4.583696305 - -66.433231551 -4.759810706 - -66.460119530 -4.984079639 - -66.551145594 -5.033541078 - -66.615398769 -4.857195576 -} -8500d923fffffff -{ - 85.707760521 123.174971764 - 85.636729255 123.988292097 - 85.653205825 125.226435464 - 85.741291076 125.695361547 - 85.814077762 124.890398905 - 85.797006872 123.607094852 -} -85b9747bfffffff -{ - -38.272929885 129.399686249 - -38.181544022 129.401295034 - -38.134108372 129.307700541 - -38.177945432 129.212481578 - -38.269241205 129.210645232 - -38.316790090 129.304255167 -} -85302077fffffff -{ - 40.865346850 122.717412827 - 40.813458130 122.785738896 - 40.821210935 122.888039725 - 40.880921979 122.922308955 - 40.932981613 122.854020799 - 40.925159106 122.751424953 -} -85522b0ffffffff -{ - 19.488559525 46.499778861 - 19.401624856 46.478681203 - 19.345116732 46.542954034 - 19.375451917 46.628252793 - 19.462275593 46.649428881 - 19.518875057 46.585227974 -} -85f1509bfffffff -{ - -84.338761614 65.423516919 - -84.288518896 64.642616944 - -84.329400695 63.842716451 - -84.421627236 63.809275659 - -84.472982033 64.602130803 - -84.430979997 65.416512954 -} -85f29537fffffff -{ - -88.339087870 -157.271228949 - -88.426849723 -156.375256311 - -88.442490739 -153.102520789 - -88.368502139 -151.034771523 - -88.283386290 -152.172193181 - -88.269497303 -155.153170249 -} -85291907fffffff +85de335bfffffff { - 35.796448884 -124.525359384 - 35.879978794 -124.476185905 - 35.953467272 -124.537379968 - 35.943366566 -124.647729546 - 35.859843848 -124.696733525 - 35.786414605 -124.635557689 + -57.300554377 -49.849600322 + -57.249198611 -49.709089900 + -57.161898497 -49.722657107 + -57.125924918 -49.875893986 + -57.177028186 -50.016084146 + -57.264356857 -50.003358275 } -851d91b3fffffff -{ - 53.270264496 -153.149333278 - 53.210232649 -153.238484383 - 53.144983664 -153.195937441 - 53.139651868 -153.064692713 - 53.199458775 -152.975492536 - 53.264822088 -153.017584955 -} -85f312d7fffffff -{ - -77.349543852 -179.080122432 - -77.428854618 -179.123181151 - -77.471071683 -178.802044469 - -77.433403414 -178.439445132 - -77.353948704 -178.400994123 - -77.312303011 -178.720525207 -} -859b2d1bfffffff -{ - -23.295374879 -177.143470127 - -23.214012097 -177.096373546 - -23.136666591 -177.144923425 - -23.140649494 -177.240433210 - -23.221902990 -177.287537918 - -23.299282798 -177.239124927 -} -85f2ecc3fffffff -{ - -77.685475636 -111.770314413 - -77.724550576 -111.394324571 - -77.671328486 -111.039529821 - -77.579558136 -111.063073668 - -77.541009557 -111.435913032 - -77.593708804 -111.788353113 -} -85055117fffffff -{ - 80.832155913 151.969820587 - 80.737980533 152.101916133 - 80.708316412 152.674383144 - 80.772331175 153.123333765 - 80.866846138 153.001063340 - 80.897013020 152.419942086 -} -8500cb0ffffffff -{ - 87.328897784 132.069896420 - 87.250028419 133.116778051 - 87.250929608 135.098793005 - 87.330704973 136.151023050 - 87.412063738 135.163995762 - 87.411156674 133.059945771 -} -8531ab17fffffff -{ - 40.245213481 117.841590052 - 40.166633890 117.825839390 - 40.125455799 117.896074593 - 40.162715731 117.982023162 - 40.241172359 117.997975700 - 40.282492027 117.927778185 -} -853a336bfffffff -{ - 30.441439582 -52.532229427 - 30.358894054 -52.564790616 - 30.288265075 -52.502286329 - 30.300073022 -52.407162851 - 30.382625409 -52.374401807 - 30.453363109 -52.436963948 -} -85c6d11bfffffff -{ - -33.562190844 -127.577274712 - -33.516932623 -127.481544079 - -33.427540977 -127.476256157 - -33.383472801 -127.566440696 - -33.428643924 -127.661972025 - -33.517970149 -127.667517909 -} -85e260abfffffff -{ - -54.023704419 -143.523566514 - -54.002946410 -143.388448819 - -53.917295153 -143.351059358 - -53.852550451 -143.448440068 - -53.873330819 -143.583042468 - -53.958833481 -143.620778171 -} -85f164dbfffffff -{ - -89.163803427 -18.887777348 - -89.079438357 -16.351202252 - -89.005338013 -19.607787461 - -89.008271595 -25.053816210 - -89.085600151 -28.153884618 - -89.167086475 -25.364734202 -} -85038eb3fffffff -{ - 79.772350746 -138.961695667 - 79.717965616 -139.383735625 - 79.625268978 -139.345925193 - 79.586921232 -138.893992862 - 79.640670255 -138.475110908 - 79.733397642 -138.504988848 -} -85efae7bfffffff -{ - -79.918200923 -8.812048482 - -79.825156119 -8.664061187 - -79.756390609 -9.041594806 - -79.779912063 -9.567064606 - -79.872576003 -9.722600010 - -79.942103723 -9.345186391 -} -851f5127fffffff -{ - 53.007266408 23.501914673 - 52.927022527 23.495885275 - 52.883711530 23.619829652 - 52.920583628 23.749929800 - 53.000820501 23.756265654 - 53.044192474 23.632195016 -} -855b1583fffffff -{ - 8.242324150 177.627381685 - 8.319539729 177.637352160 - 8.361878952 177.567675509 - 8.326894295 177.488045104 - 8.249638583 177.478197515 - 8.207407545 177.547857348 -} -85300557fffffff -{ - 39.519074462 122.991359404 - 39.589194249 122.951923635 - 39.581933974 122.852977439 - 39.524202003 122.820019322 - 39.507408626 122.841954226 - 39.460735547 122.868241434 - 39.454852207 122.949431016 -} -85ef666bfffffff -{ - -77.812884394 -75.721403458 - -77.797202017 -75.279261285 - -77.707123191 -75.123559973 - -77.633175707 -75.405634317 - -77.648705123 -75.842063230 - -77.738333290 -76.002082659 -} -85172a6bfffffff -{ - 62.003105703 158.120538456 - 61.911752610 158.144042521 - 61.876370016 158.328141073 - 61.932102016 158.489530153 - 62.023512620 158.467184051 - 62.059134593 158.282289419 -} -85c55017fffffff -{ - -36.316010233 -31.345653878 - -36.395094837 -31.404538960 - -36.477508307 -31.352572248 - -36.480805653 -31.241515722 - -36.401607377 -31.182650768 - -36.319225511 -31.234821822 -} -85e46387fffffff -{ - -66.513520088 89.109305187 - -66.424043416 89.020224572 - -66.409105201 88.783570394 - -66.483528921 88.634561468 - -66.573181832 88.722455813 - -66.588235324 88.960551417 -} -85bcb4dbfffffff -{ - -29.332621699 41.652690248 - -29.244396996 41.652740232 - -29.204751604 41.563847496 - -29.253354909 41.474808518 - -29.341625424 41.474681940 - -29.381246894 41.563670984 -} -853e8d93fffffff -{ - 21.702639932 21.870512394 - 21.606492103 21.867635714 - 21.555936621 21.956285854 - 21.601452353 22.047886661 - 21.697599728 22.050918237 - 21.748231952 21.962194127 -} -858c2ac3fffffff -{ - -10.322607901 104.278124298 - -10.241012625 104.256989776 - -10.220908380 104.169621950 - -10.282454038 104.103406738 - -10.364045321 104.124596060 - -10.384095017 104.211945859 -} -85025533fffffff -{ - 74.860000989 -87.484311680 - 74.795633782 -87.744430239 - 74.707196682 -87.660788650 - 74.682916017 -87.319964571 - 74.746856800 -87.059882689 - 74.835503055 -87.140572306 -} -85000603fffffff -{ - 78.244303151 41.228476343 - 78.287550805 41.589194536 - 78.375460977 41.564040249 - 78.419992089 41.172296951 - 78.376137701 40.809221995 - 78.288362933 40.840238285 -} -85a45c73fffffff -{ - -25.527087518 -21.689821161 - -25.612084161 -21.735825005 - -25.688571826 -21.678071655 - -25.679976837 -21.574202457 - -25.594868974 -21.528281609 - -25.518467343 -21.586146616 -} -85f11cc7fffffff -{ - -82.225053561 108.614911896 - -82.239563779 107.970559070 - -82.319441373 107.771839083 - -82.385330610 108.228192633 - -82.370360471 108.884708192 - -82.289966968 109.072563959 -} -856a6c47fffffff -{ - 9.448775329 35.549873301 - 9.363648932 35.537198180 - 9.315626838 35.607794964 - 9.352625857 35.691054659 - 9.437688919 35.703832661 - 9.485816374 35.633248213 -} -85b965a3fffffff -{ - -40.645542522 124.866142438 - -40.556854939 124.873299208 - -40.506042230 124.784308183 - -40.531235991 124.720224289 - -40.540188158 124.684928200 - -40.621608885 124.671020602 - -40.676161933 124.763299079 - -40.658146105 124.834020417 -} -85df2aaffffffff -{ - -60.379001456 -64.672247472 - -60.345308106 -64.497740945 - -60.257227269 -64.466084202 - -60.202966594 -64.607984364 - -60.236491489 -64.781690382 - -60.324444870 -64.814294716 -} -85065b43fffffff -{ - 61.275687178 -41.286892347 - 61.270111675 -41.472149314 - 61.186927408 -41.557958188 - 61.109557636 -41.458962483 - 61.115188881 -41.274693600 - 61.198134266 -41.188435914 -} -85dd610bfffffff -{ - -60.927330148 -32.945068871 - -60.856316835 -32.822362346 - -60.770608320 -32.891422777 - -60.755708950 -33.082371353 - -60.826422844 -33.205298083 - -60.912335130 -33.137059772 -} -853819a3fffffff -{ - 31.501143785 2.014927194 - 31.409797919 2.029493412 - 31.376085405 2.124878068 - 31.433733715 2.205881085 - 31.525175209 2.191450270 - 31.558872798 2.095880790 -} -85c10c03fffffff -{ - -27.343173936 -9.949384183 - -27.433479146 -9.985783896 - -27.506524427 -9.915059258 - -27.489156332 -9.807906399 - -27.398785315 -9.771667741 - -27.325848112 -9.842420559 -} -85044657fffffff -{ - 75.578270066 171.868219188 - 75.482116531 171.823768440 - 75.424359395 172.130367096 - 75.462225346 172.482522746 - 75.558215480 172.531188381 - 75.616505941 172.223496726 -} -85cd2143fffffff -{ - -50.612353708 92.635687218 - -50.527719819 92.572534967 - -50.520755338 92.423485520 - -50.598363761 92.337009050 - -50.683146913 92.399753078 - -50.690172551 92.549383401 -} -855eeccffffffff -{ - 16.822812330 -57.764354433 - 16.895998795 -57.717337975 - 16.963815313 -57.758047313 - 16.958462333 -57.845708198 - 16.885342424 -57.892674014 - 16.817508985 -57.852029666 -} -85ad0183fffffff -{ - -32.671786158 12.987713407 - -32.762489536 12.977098902 - -32.817964740 13.060463217 - -32.782673074 13.154292817 - -32.692032117 13.164688975 - -32.636620298 13.081473810 -} -85e468c7fffffff -{ - -66.887613696 84.153720554 - -66.796113920 84.081637561 - -66.773803909 83.847460112 - -66.842829586 83.684016504 - -66.934458490 83.754734335 - -66.956933351 83.990266028 -} -851f5163fffffff -{ - 52.782253365 22.723265709 - 52.701681878 22.718194699 - 52.659026521 22.842226628 - 52.696883392 22.971464795 - 52.777450592 22.976841080 - 52.820165399 22.852674005 -} -85a2c3d3fffffff -{ - -27.311880208 54.118185584 - -27.405292250 54.125277154 - -27.447033867 54.216470261 - -27.395275721 54.300548908 - -27.301799373 54.293308082 - -27.260145409 54.202137926 -} -85f2900ffffffff -{ - -89.306013437 139.308212854 - -89.363799715 133.149502851 - -89.453606206 134.407125967 - -89.480442881 144.078133565 - -89.410091459 150.198824407 - -89.326602108 146.973553492 -} -85895bb3fffffff -{ - -8.808583554 -159.858033055 - -8.727269479 -159.824752311 - -8.660878537 -159.883100171 - -8.675706070 -159.974692983 - -8.756946611 -160.008058109 - -8.823433199 -159.949746228 -} -856cde8ffffffff -{ - -1.810802197 -98.807097510 - -1.884438191 -98.864158451 - -1.969501641 -98.832178386 - -1.980947645 -98.743061255 - -1.907255499 -98.685947066 - -1.822173553 -98.718003182 -} -85028e37fffffff -{ - 72.551212067 -124.548879729 - 72.462363171 -124.608341810 - 72.402942739 -124.401267848 - 72.432056820 -124.134181932 - 72.520849761 -124.072412481 - 72.580585917 -124.280030474 -} -856c2c6ffffffff -{ - 8.356184870 -92.728409102 - 8.285220143 -92.784816659 - 8.206228860 -92.750818932 - 8.198220887 -92.660355141 - 8.269250353 -92.603921125 - 8.348222995 -92.637977258 -} -856cb607fffffff -{ - 6.933862824 -105.109131385 - 7.007481907 -105.056078503 - 7.086903732 -105.096128289 - 7.092642628 -105.189309493 - 7.018934869 -105.242334378 - 6.939576930 -105.202206235 -} -853da347fffffff -{ - 27.121487333 76.902161380 - 27.042438851 76.942769766 - 27.034087575 77.044964419 - 27.104737813 77.106772279 - 27.183881440 77.066334837 - 27.192279779 76.963918203 -} -85395633fffffff -{ - 38.662289660 -0.473270972 - 38.604980337 -0.557548828 - 38.514942451 -0.539508929 - 38.482271539 -0.437445801 - 38.539518853 -0.353318853 - 38.629498977 -0.371104142 -} -85e2e4abfffffff -{ - -56.544292793 -132.189536148 - -56.510801041 -132.041616031 - -56.419899992 -132.023859671 - -56.362590139 -132.153458827 - -56.396024831 -132.300851796 - -56.486826156 -132.319171643 -} -859c9b2bfffffff -{ - -4.046785791 146.033774521 - -4.139717420 146.048058354 - -4.172108801 146.136248722 - -4.111617532 146.210145155 - -4.018711732 146.195893645 - -3.986271308 146.107713332 -} -850126affffffff -{ - 70.107169154 25.674153976 - 70.158359969 25.830882624 - 70.231860264 25.749983595 - 70.253910845 25.510920549 - 70.202354705 25.354432665 - 70.129113911 25.436759660 -} -85cc711bfffffff -{ - -45.858646505 74.791145265 - -45.940611667 74.819936123 - -45.963970158 74.944296262 - -45.905346465 75.039676650 - -45.823408251 75.010704321 - -45.800066670 74.886532729 -} -85ece283fffffff -{ - -70.681661691 134.900258037 - -70.640894540 134.658922916 - -70.692586064 134.427808499 - -70.785361832 134.437353965 - -70.826355633 134.680101573 - -70.774345721 134.911887905 -} -8581a313fffffff -{ - -10.724736348 -35.904180971 - -10.641728730 -35.854530272 - -10.558756681 -35.902361989 - -10.558780526 -35.999858609 - -10.641805435 -36.049546985 - -10.724789203 -36.001701204 +85e15e6ffffffff +{ + -61.969375885 53.514512416 + -61.881501363 53.549614257 + -61.826130013 53.417818690 + -61.858392465 53.250937516 + -61.946094962 53.215014068 + -62.001707368 53.346790905 +} +85dad007fffffff +{ + -45.446566643 161.369619389 + -45.358084608 161.328305513 + -45.340049440 161.196523431 + -45.410484066 161.105750566 + -45.499037435 161.146835470 + -45.517084943 161.278922863 +} +85ec0c67fffffff +{ + -71.867342653 146.246878247 + -71.843151610 145.982391878 + -71.907021729 145.779694339 + -71.995408666 145.841640570 + -72.019708465 146.108204462 + -71.955511715 146.310734653 } -858e646bfffffff +85409b1bfffffff { - -11.116377948 -76.004634665 - -11.195371285 -76.060929364 - -11.282927482 -76.020086428 - -11.291449434 -75.922945346 - -11.212448715 -75.866703867 - -11.124933436 -75.907550103 + 36.526774435 109.904595602 + 36.602942379 109.882514898 + 36.634288825 109.784490203 + 36.589450821 109.708550450 + 36.513248724 109.730715468 + 36.481918726 109.828735985 +} +85eda58ffffffff +{ + -62.814365207 160.656766386 + -62.804659957 160.483633058 + -62.873736785 160.390982634 + -62.952689410 160.471988928 + -62.962322418 160.646089712 + -62.893075206 160.738213278 +} +856785affffffff +{ + 13.705322671 -79.777058187 + 13.640641150 -79.830705676 + 13.565015242 -79.793354850 + 13.554122834 -79.702340440 + 13.618857198 -79.648723358 + 13.694431111 -79.686090157 +} +8552403bfffffff +{ + 17.732934347 50.934385252 + 17.649998899 50.911406606 + 17.595286516 50.968520930 + 17.623423318 51.048529465 + 17.706240769 51.071564181 + 17.761039362 51.014534465 +} +8584058bfffffff +{ + -3.765412877 64.050848087 + -3.848404910 64.063845504 + -3.875983628 64.147449405 + -3.820491188 64.217999602 + -3.737504095 64.204895920 + -3.710004389 64.121348264 +} +853ecd5bfffffff +{ + 20.405177704 30.202842059 + 20.310483421 30.193043492 + 20.256493367 30.275725334 + 20.297103103 30.368225004 + 20.391750846 30.378164167 + 20.445835498 30.295463184 +} +85f19583fffffff +{ + -74.908639923 111.792402461 + -74.841418280 111.553565300 + -74.860974050 111.200834049 + -74.947932573 111.083829054 + -75.015584227 111.322369144 + -74.995845960 111.678230130 +} +8507ae37fffffff +{ + 75.201217884 -20.967780832 + 75.230153698 -21.269934356 + 75.171672927 -21.504509125 + 75.084607889 -21.436222876 + 75.055961310 -21.136396504 + 75.114092252 -20.902538043 +} +856b4673fffffff +{ + 13.587590774 29.440620286 + 13.497068661 29.431977677 + 13.446800994 29.510380374 + 13.486955572 29.597447178 + 13.577437350 29.606215932 + 13.627804994 29.527791829 +} +85ab6047fffffff +{ + -14.150481857 73.022122987 + -14.242806805 73.042762533 + -14.272192377 73.136877299 + -14.209208203 73.210249712 + -14.116922711 73.189500741 + -14.087581849 73.095488645 +} +85054243fffffff +{ + 81.432376084 152.212270430 + 81.338316339 152.350715615 + 81.308261702 152.960845663 + 81.371730742 153.442240226 + 81.466145379 153.315049048 + 81.496743294 152.695119723 +} +859c2383fffffff +{ + -17.260990554 145.854349269 + -17.174547395 145.839273959 + -17.146150029 145.749770018 + -17.204100645 145.675241631 + -17.290554763 145.690156687 + -17.319047450 145.779760462 +} +85e6e877fffffff +{ + -59.953493504 6.958739251 + -59.867388224 6.959490321 + -59.819587914 6.805620884 + -59.857659407 6.650502701 + -59.943794929 6.648790922 + -59.991829461 6.803158143 +} +850fae83fffffff +{ + 67.727808011 -82.472340455 + 67.666963405 -82.669749556 + 67.572390233 -82.629482484 + 67.538554414 -82.393402089 + 67.599095739 -82.196306095 + 67.693775151 -82.234973453 +} +859c9367fffffff +{ + -4.369361325 149.054452671 + -4.461236809 149.068084516 + -4.492855276 149.154527669 + -4.432657088 149.227319549 + -4.340819316 149.213723048 + -4.309141962 149.127299286 +} +850e2d07fffffff +{ + 59.415521526 -68.769072622 + 59.371080078 -68.938524927 + 59.274025061 -68.947794504 + 59.221456571 -68.788557196 + 59.265710590 -68.619695196 + 59.362719867 -68.609480917 +} +857a1c2ffffffff +{ + 2.065324468 44.959259417 + 2.152315600 44.958080366 + 2.200505671 44.882053292 + 2.161730955 44.807123208 + 2.074682220 44.808247306 + 2.026465751 44.884356484 +} +8584e477fffffff +{ + -7.396044374 67.246551903 + -7.483252761 67.262218458 + -7.512308033 67.349903088 + -7.454084195 67.421848662 + -7.366891554 67.406072707 + -7.337906896 67.318460504 +} +8536b463fffffff +{ + 31.352860692 -157.663922618 + 31.268259095 -157.695738769 + 31.206018982 -157.623109317 + 31.228377913 -157.518632068 + 31.312998248 -157.486728098 + 31.375240969 -157.559389047 +} +857ea4abfffffff +{ + -1.432467049 178.533624743 + -1.506487945 178.519981769 + -1.566321198 178.573135224 + -1.552188370 178.640019512 + -1.478116890 178.653736069 + -1.418228778 178.600494722 +} +8589757bfffffff +{ + -14.569239504 -158.115996075 + -14.482738948 -158.082240801 + -14.412346699 -158.144810335 + -14.428360172 -158.241105919 + -14.514794172 -158.274961986 + -14.585281314 -158.212421887 +} +852c40cbfffffff +{ + 44.636794619 50.873540900 + 44.566178828 50.959945576 + 44.584742492 51.085571872 + 44.674039397 51.125107070 + 44.744802225 51.038656080 + 44.726120895 50.912715659 +} +85b0db43fffffff +{ + -16.859820477 -111.261188603 + -16.921380726 -111.314715235 + -17.004223789 -111.289459162 + -17.025587119 -111.210584064 + -16.964015469 -111.156965148 + -16.881091867 -111.182313619 +} +85960153fffffff +{ + -13.099958611 28.332907264 + -13.002647204 28.338354583 + -12.949388378 28.254610739 + -12.993408215 28.165395221 + -13.090712141 28.159879489 + -13.144003791 28.243647656 +} +85341163fffffff +{ + 33.061489473 -28.653421882 + 32.980800550 -28.718185669 + 32.893339147 -28.667260078 + 32.886480728 -28.551701092 + 32.967081231 -28.486838578 + 33.054628551 -28.537633316 +} +85669137fffffff +{ + 5.037484060 -83.751190745 + 4.964419862 -83.807549734 + 4.880819491 -83.769980113 + 4.870323668 -83.676020042 + 4.943440199 -83.619675108 + 5.027000193 -83.657276057 +} +85e66e43fffffff +{ + -66.295553271 1.065341464 + -66.203814849 1.089862717 + -66.146931705 0.903323714 + -66.181462978 0.691729645 + -66.273161468 0.665631417 + -66.330369785 0.852702182 +} +85092a0ffffffff +{ + 67.029536257 -1.997704636 + 67.071763982 -2.143642605 + 67.033029246 -2.317547262 + 66.952175497 -2.344590180 + 66.910212118 -2.198837115 + 66.948838630 -2.025853722 +} +852d5247fffffff +{ + 42.837092554 41.568937133 + 42.751304365 41.545962542 + 42.688583661 41.635555167 + 42.711597085 41.748043663 + 42.797309421 41.771179634 + 42.860084258 41.681666122 +} +85bf750ffffffff +{ + -43.579930186 154.792252459 + -43.487828081 154.759906202 + -43.461839356 154.632389994 + -43.527907388 154.536963444 + -43.620053034 154.569045632 + -43.646087256 154.696818911 +} +856f9367fffffff +{ + 2.817725354 -106.544860591 + 2.887997595 -106.494148603 + 2.963347713 -106.533870541 + 2.968356613 -106.624372726 + 2.897998021 -106.675051543 + 2.822716911 -106.635261513 +} +85018b23fffffff +{ + 76.384626908 55.079193618 + 76.408515795 55.433865334 + 76.494767558 55.506182327 + 76.557280438 55.219692086 + 76.533001862 54.861529285 + 76.446602845 54.793366231 +} +8598cb6bfffffff +{ + -24.752293445 -2.904049678 + -24.842205297 -2.931937816 + -24.910461840 -2.858724720 + -24.888694980 -2.757651034 + -24.798751172 -2.729941621 + -24.730606051 -2.803126960 +} +850da2dbfffffff +{ + 70.203428844 -178.855965970 + 70.111780337 -178.931411509 + 70.045270510 -178.738318621 + 70.070002468 -178.469924989 + 70.161399938 -178.392563998 + 70.228317497 -178.585502152 +} +85f2ab53fffffff +{ + -84.633545738 -123.829686413 + -84.691459510 -123.080033611 + -84.655705821 -122.170687523 + -84.562895964 -122.032872063 + -84.506302548 -122.776636224 + -84.541216098 -123.664367541 +} +859331dbfffffff +{ + -0.891221495 -104.719787695 + -0.962231155 -104.774331883 + -1.044015995 -104.746019584 + -1.054824139 -104.663080416 + -0.983754944 -104.608465037 + -0.901937191 -104.636859982 +} +851dabd3fffffff +{ + 53.494223104 -147.034601598 + 53.439798283 -147.132873624 + 53.373585559 -147.104759267 + 53.361727794 -146.978873269 + 53.415936156 -146.880668757 + 53.482218335 -146.908281901 +} +85e0ca4bfffffff +{ + -50.269066052 53.901640500 + -50.187966757 53.925464212 + -50.142962569 53.832299063 + -50.178858754 53.715311620 + -50.259825672 53.691079988 + -50.305028951 53.784242876 +} +855a2597fffffff +{ + 10.015402097 172.374580169 + 10.095710156 172.380197236 + 10.138826125 172.305364133 + 10.101529106 172.224959940 + 10.021200672 172.219479704 + 9.978189493 172.294266777 +} +85b3181bfffffff +{ + -21.741387349 -71.637924313 + -21.818986657 -71.693596987 + -21.899759204 -71.651211060 + -21.902903945 -71.553167153 + -21.825326678 -71.497570745 + -21.744582650 -71.539941833 +} +85151c13fffffff +{ + 56.404193216 115.920433007 + 56.343957044 116.040233641 + 56.365594720 116.194960573 + 56.447640374 116.230514306 + 56.508139789 116.110622097 + 56.486329762 115.955266270 +} +8517005bfffffff +{ + 60.968213726 153.774855909 + 60.878473003 153.811615586 + 60.849234714 153.994595546 + 60.909540075 154.141670013 + 60.999384461 154.105940990 + 61.028820567 153.922104633 +} +85d16b1bfffffff +{ + -38.453152987 21.037830177 + -38.540983981 21.036876656 + -38.585930828 21.124074549 + -38.543026954 21.212019771 + -38.455295748 21.212754737 + -38.410368579 21.125762797 +} +8502911bfffffff +{ + 71.818030097 -135.085112633 + 71.768904890 -135.328580773 + 71.681348909 -135.327997055 + 71.642972997 -135.086394612 + 71.691762000 -134.844187181 + 71.779261387 -134.842321847 +} +85268983fffffff +{ + 37.842241567 -103.224404064 + 37.916223952 -103.155230117 + 38.000556471 -103.204950444 + 38.010886060 -103.323985953 + 37.936856359 -103.393129726 + 37.852544431 -103.343268527 +} +8598a90ffffffff +{ + -18.269041150 -9.621651394 + -18.353509571 -9.654268613 + -18.421863223 -9.590063697 + -18.405633788 -9.493220424 + -18.321096401 -9.460736303 + -18.252857329 -9.524962118 +} +85cf2923fffffff +{ + -52.658175677 -84.151699887 + -52.577438267 -84.076320126 + -52.497123071 -84.147832832 + -52.497388700 -84.294565440 + -52.578039073 -84.370299786 + -52.658510954 -84.298948279 +} +85719da7fffffff +{ + 5.060403039 -176.236612437 + 4.977609555 -176.254101633 + 4.914740205 -176.195399995 + 4.934619087 -176.119120064 + 5.017471791 -176.101546242 + 5.080386428 -176.160336992 +} +85589da3fffffff +{ + 6.428721599 4.831470598 + 6.348816602 4.841188306 + 6.308879929 4.917775757 + 6.348805880 4.984757238 + 6.428775272 4.975132148 + 6.468754385 4.898432847 +} +85ed1347fffffff +{ + -64.692671451 159.386794464 + -64.682428399 159.199585634 + -64.752327993 159.095551911 + -64.832658310 159.179294137 + -64.842838723 159.367632279 + -64.772751575 159.471094505 +} +85576653fffffff +{ + 21.859416218 -27.634300543 + 21.783257527 -27.692318260 + 21.699297717 -27.648293217 + 21.691405015 -27.546357865 + 21.767460505 -27.488270106 + 21.851511871 -27.532187427 +} +85e0b457fffffff +{ + -53.546992751 73.548580466 + -53.456746715 73.527873257 + -53.425787399 73.387543491 + -53.484881413 73.267516533 + -53.575127317 73.287582182 + -53.606279799 73.428316788 +} +85e2332bfffffff +{ + -61.941939669 -132.800286809 + -61.912610146 -132.629977351 + -61.825357605 -132.608138163 + -61.767533305 -132.755869609 + -61.796795545 -132.925472535 + -61.883949002 -132.948048789 +} +8546eba7fffffff +{ + 18.345137167 -163.419030713 + 18.253680526 -163.445868210 + 18.186791230 -163.377866068 + 18.211337132 -163.282968673 + 18.302831038 -163.256040675 + 18.369741819 -163.324100490 +} +85635267fffffff +{ + 12.023069861 60.461158848 + 12.097104515 60.436316825 + 12.108401254 60.370323724 + 12.045765538 60.329231640 + 11.971820503 60.354034721 + 11.960421614 60.419968839 +} +85f29c13fffffff +{ + -88.227182968 -110.255866315 + -88.267273935 -107.541723898 + -88.210225549 -105.199293376 + -88.117000970 -105.645827687 + -88.079841038 -108.189514214 + -88.133142140 -110.452558441 +} +85be8db7fffffff +{ + -27.863853425 152.672938391 + -27.770178710 152.648489839 + -27.742115225 152.543998110 + -27.807661058 152.463790032 + -27.901376395 152.488051248 + -27.929505406 152.592708112 +} +8585b063fffffff +{ + -6.178134371 53.753597786 + -6.260625845 53.759314398 + -6.289958131 53.835835307 + -6.236695154 53.906624891 + -6.154164992 53.900802622 + -6.124936401 53.824296465 +} +85e6eabbfffffff +{ + -59.595467370 8.031037271 + -59.509889012 8.028502805 + -59.463532607 7.875333753 + -59.502530473 7.724186420 + -59.588149647 7.725789133 + -59.634730858 7.879471221 +} +855d897bfffffff +{ + 13.242203395 -155.624745666 + 13.149675352 -155.655078572 + 13.077733319 -155.588219702 + 13.098283683 -155.491011866 + 13.190810171 -155.460609691 + 13.262787902 -155.527484494 +} +854d0e6ffffffff +{ + 26.284682747 -63.749968793 + 26.209905012 -63.765919603 + 26.149718876 -63.707773796 + 26.164222689 -63.633580392 + 26.239041704 -63.617468328 + 26.299315720 -63.675710951 +} +85e608b7fffffff +{ + -64.296240075 13.994261581 + -64.207658506 13.969733033 + -64.168118503 13.779371328 + -64.216953488 13.612609185 + -64.305650686 13.635871114 + -64.345398143 13.827163939 +} +8507a2cbfffffff +{ + 78.044316149 -16.812099382 + 78.079829529 -17.167418576 + 78.027734175 -17.469728561 + 77.940521015 -17.415022716 + 77.905378905 -17.062670675 + 77.957081374 -16.762065736 +} +8590ac7bfffffff +{ + -8.995533724 -118.587486625 + -9.055568172 -118.633843676 + -9.131985152 -118.614582167 + -9.148446264 -118.548884620 + -9.088381888 -118.502438216 + -9.011886310 -118.521778747 +} +85c50817fffffff +{ + -33.991231881 -33.489573794 + -34.068971064 -33.547725795 + -34.150766587 -33.500455814 + -34.154797651 -33.394833193 + -34.076941504 -33.336682647 + -33.995171353 -33.384152947 +} +850793a3fffffff +{ + 78.977413913 -37.167407498 + 78.985968502 -37.615359736 + 78.913789462 -37.847222928 + 78.833542268 -37.633095662 + 78.825085372 -37.190882498 + 78.896778946 -36.957106908 +} +85c4207bfffffff +{ + -37.085956306 -35.343897828 + -37.161379524 -35.405185071 + -37.244078816 -35.358884254 + -37.251343242 -35.251073182 + -37.175809187 -35.189771727 + -37.093121642 -35.236295234 +} +8562d313fffffff +{ + 3.906655634 60.860573031 + 3.834253802 60.870642755 + 3.811751285 60.947176067 + 3.861726217 61.013601388 + 3.934126385 61.003437158 + 3.956553392 60.926942100 +} +8500c5b3fffffff +{ + 85.697930432 57.984193519 + 85.721966591 59.151647460 + 85.812245794 59.470579392 + 85.879251840 58.580570719 + 85.854250837 57.372719162 + 85.763233584 57.096077468 +} +85976ed3fffffff +{ + -22.352107518 23.468388941 + -22.257820659 23.476010916 + -22.203369275 23.390805672 + -22.243183395 23.297979156 + -22.337443352 23.290288225 + -22.391916171 23.375492703 +} +853d7223fffffff +{ + 34.905644731 84.698249658 + 34.818741676 84.732379752 + 34.801826682 84.842855441 + 34.871717420 84.919442079 + 34.958672368 84.885571536 + 34.975684868 84.774854413 +} +8582c987fffffff +{ + 2.427624873 3.711377390 + 2.509247448 3.723629970 + 2.552297722 3.663859853 + 2.513806708 3.591905051 + 2.432276414 3.579630315 + 2.389144873 3.639332471 +} +85176983fffffff +{ + 63.580251652 179.410125183 + 63.491299530 179.359703752 + 63.430480252 179.508518841 + 63.458289712 179.707752624 + 63.547057888 179.759284869 + 63.608201192 179.610476326 +} +85ea8d73fffffff +{ + -65.615450987 178.586296040 + -65.628542798 178.419649707 + -65.703084429 178.381356585 + -65.764562332 178.510686152 + -65.751264437 178.678148707 + -65.676695318 178.715463418 +} +855231bbfffffff +{ + 20.584767994 42.332170719 + 20.494817452 42.313390979 + 20.437739116 42.383749449 + 20.470516365 42.472833900 + 20.560367275 42.491712570 + 20.617540582 42.421408058 +} +85e79333fffffff +{ + -59.569492502 36.076696362 + -59.497780880 35.997078830 + -59.487558140 35.834076934 + -59.549072543 35.749865585 + -59.621028812 35.829060668 + -59.631225946 35.992892320 +} +8505a223fffffff +{ + 71.439100756 115.307298100 + 71.374312794 115.530113242 + 71.402621269 115.814620143 + 71.496001324 115.878421675 + 71.561220323 115.655249330 + 71.532626571 115.368623795 +} +85f133d3fffffff +{ + -81.650948322 131.255437016 + -81.612269784 130.740759401 + -81.658564913 130.210334493 + -81.744159423 130.190025151 + -81.783455800 130.710416770 + -81.736533345 131.245392752 +} +85132057fffffff +{ + 69.425969121 -123.787692939 + 69.337238173 -123.841870355 + 69.275395233 -123.666170630 + 69.302004013 -123.435933798 + 69.390687891 -123.380076184 + 69.452811044 -123.556131633 +} +8579a02ffffffff +{ + 5.152326803 -140.955353300 + 5.063767576 -140.989265086 + 4.992046125 -140.930277078 + 5.008842453 -140.837434472 + 5.097333631 -140.803506360 + 5.169096534 -140.862437044 +} +851160abfffffff +{ + 68.048749451 34.045526185 + 68.010709235 34.216530750 + 68.055046934 34.402720109 + 68.137596876 34.418321957 + 68.175754412 34.246558354 + 68.131244097 34.059953004 +} +85a2ea53fffffff +{ + -25.681387388 55.303689237 + -25.775263812 55.311687240 + -25.815864979 55.402974608 + -25.762500648 55.486234935 + -25.668565615 55.478089910 + -25.628053448 55.386831625 +} +8502b34ffffffff +{ + 73.164132386 -139.061658526 + 73.109611819 -139.315563605 + 73.020708935 -139.293080034 + 72.986319483 -139.019574184 + 73.040442479 -138.766808104 + 73.129350452 -138.786405600 +} +85f071b7fffffff +{ + -78.999114214 38.226727091 + -78.918121822 37.980083802 + -78.917066940 37.507240346 + -78.997090707 37.274058328 + -79.078707744 37.517504008 + -79.079675777 37.997397865 +} +8522c583fffffff +{ + 51.994123390 -171.418749816 + 52.077218983 -171.386716290 + 52.141417043 -171.489970742 + 52.122438488 -171.625370812 + 52.039257899 -171.657131139 + 51.975140751 -171.553765410 +} +857c355bfffffff +{ + -3.595322317 -19.964790212 + -3.516921268 -19.923763514 + -3.438869831 -19.966644190 + -3.439163782 -20.050617446 + -3.517601624 -20.091727377 + -3.595708736 -20.048780867 +} +85c10607fffffff +{ + -26.188497159 -13.455324470 + -26.277307216 -13.494705731 + -26.351571261 -13.427889707 + -26.336920186 -13.321636949 + -26.248027671 -13.282393669 + -26.173868632 -13.349264822 +} +852848abfffffff +{ + 43.889382115 -136.270766332 + 43.968637018 -136.233017329 + 44.024775378 -136.299928436 + 44.001628759 -136.404483487 + 43.922421684 -136.442009020 + 43.866313357 -136.375203064 +} +85bc6133fffffff +{ + -36.022220293 21.928474395 + -35.940407532 21.937250940 + -35.890154521 21.847127483 + -35.921707719 21.748237970 + -36.003500226 21.739385230 + -36.053759880 21.829498112 +} +854d3147fffffff +{ + 29.816642324 -62.895754130 + 29.738688572 -62.913623861 + 29.677893899 -62.852439587 + 29.694968868 -62.773281657 + 29.772970650 -62.755231948 + 29.833849524 -62.816520169 +} +8515709bfffffff +{ + 61.819428902 117.904155667 + 61.754124462 118.044633940 + 61.775530412 118.233906811 + 61.862423386 118.283665551 + 61.928037097 118.143133796 + 61.906447862 117.952893821 +} +8581452ffffffff +{ + -8.570387213 -50.546659787 + -8.489341441 -50.496004977 + -8.404335136 -50.541484783 + -8.400396526 -50.637572186 + -8.481423108 -50.688199575 + -8.566407486 -50.642767111 +} +85de2a6ffffffff +{ + -54.121030217 -55.091941780 + -54.077263092 -54.958552009 + -53.993550408 -54.957164704 + -53.953626161 -55.088480173 + -53.997185365 -55.221499391 + -54.080876171 -55.223573552 +} +850a935bfffffff +{ + 55.079419617 102.765879786 + 54.989072562 102.774930617 + 54.946428872 102.906657093 + 54.993973535 103.029529527 + 55.084248380 103.021037975 + 55.127051054 102.889115048 +} +85e8f16ffffffff +{ + -61.755327415 -76.920068322 + -61.738531602 -76.730982388 + -61.655352023 -76.659863505 + -61.589204910 -76.777069671 + -61.605953393 -76.965095569 + -61.688896089 -77.036971430 +} +854a313bfffffff +{ + 24.526881720 128.462976275 + 24.444074149 128.480112875 + 24.419797054 128.572240274 + 24.478368306 128.647279787 + 24.561195864 128.630148831 + 24.585432255 128.537972640 +} +8508e463fffffff +{ + 66.427934296 16.976490201 + 66.408040331 17.133772090 + 66.464919926 17.256333667 + 66.516198653 17.233081292 + 66.537354130 17.202099423 + 66.548238677 17.005233143 + 66.495659979 16.902295120 + 66.453526760 16.964648190 +} +85c78847fffffff +{ + -43.917460023 -131.803315258 + -43.877859522 -131.689323658 + -43.785023802 -131.676196258 + -43.731888020 -131.776722395 + -43.771433059 -131.890403019 + -43.864169178 -131.903867985 +} +85032d63fffffff +{ + 85.937934658 -48.603049980 + 86.010214200 -49.314650962 + 86.002274507 -50.632027450 + 85.922297658 -51.187888825 + 85.851744945 -50.458356627 + 85.859449620 -49.189660157 +} +8550a64bfffffff +{ + 21.183804545 -122.825785327 + 21.267122053 -122.780668450 + 21.347261994 -122.834297756 + 21.343995708 -122.933039606 + 21.260657901 -122.978029756 + 21.180606620 -122.924404980 +} +850db467fffffff +{ + 69.966412627 176.539761530 + 69.872817269 176.485978513 + 69.811307591 176.692988469 + 69.842985967 176.953999941 + 69.936389399 177.009846821 + 69.998307676 176.802625911 +} +855e62affffffff +{ + 12.771302531 -62.192123999 + 12.846126106 -62.146653664 + 12.915821298 -62.185108429 + 12.910697153 -62.268959113 + 12.835946956 -62.314366473 + 12.766247583 -62.275986176 +} +853124c3fffffff +{ + 48.034140414 119.827026280 + 47.976829457 119.914629630 + 47.990185153 120.037605244 + 48.060961859 120.073392561 + 48.118486920 119.985797870 + 48.105020865 119.862406331 +} +859b6a23fffffff +{ + -18.258684432 177.760967627 + -18.182001033 177.806826825 + -18.109184594 177.766733055 + -18.113023039 177.680913951 + -18.189590974 177.635072363 + -18.262435827 177.675032134 +} +85b405abfffffff +{ + -29.058808366 -158.254675655 + -28.967417403 -158.216113664 + -28.892482748 -158.287270969 + -28.908866083 -158.396951240 + -29.000203421 -158.435643195 + -29.075211110 -158.364525227 +} +8503658bfffffff +{ + 81.453182850 -36.333690217 + 81.529617014 -36.548061503 + 81.541810322 -37.147957666 + 81.477296881 -37.523274916 + 81.397954888 -37.252056087 + 81.387745465 -36.686743444 + 81.410788445 -36.586108562 +} +858103d7fffffff +{ + -12.084927150 -41.972994665 + -12.002887929 -41.921965866 + -11.919000468 -41.969714729 + -11.917157626 -42.068480127 + -11.999202503 -42.119519802 + -12.083084562 -42.071783352 +} +85aec457fffffff +{ + -29.584919826 99.958798505 + -29.664519202 99.996021839 + -29.672030344 100.086795921 + -29.600031528 100.140199406 + -29.520531173 100.102970272 + -29.512930658 100.012343270 +} +85bb1193fffffff +{ + -40.987569343 -178.491958686 + -40.913567806 -178.434913393 + -40.833660412 -178.491263234 + -40.827753584 -178.604455581 + -40.901679338 -178.661501521 + -40.981587663 -178.605354813 +} +85056533fffffff +{ + 86.840075255 153.472059567 + 86.748292422 153.799124697 + 86.715805950 155.371589852 + 86.773579322 156.679893715 + 86.866146533 156.433918863 + 86.900209681 154.797187019 +} +85eb954bfffffff +{ + -57.328410626 -172.887300149 + -57.267476616 -172.818601160 + -57.200434893 -172.899383320 + -57.194283394 -173.048589073 + -57.255151051 -173.117363154 + -57.322236520 -173.036857249 +} +85111883fffffff +{ + 59.879971519 35.180210232 + 59.833847657 35.311112610 + 59.874942784 35.456366136 + 59.962321657 35.470987839 + 60.008537956 35.339656324 + 59.967282608 35.194132609 +} +85027247fffffff +{ + 76.805263960 -91.799025635 + 76.737188567 -92.073026523 + 76.652375912 -91.953220592 + 76.635345365 -91.562805307 + 76.702944804 -91.288201303 + 76.788049179 -91.404587936 +} +85cd86cbfffffff +{ + -39.896248827 94.228966450 + -39.821223855 94.176635546 + -39.818081062 94.058995090 + -39.889925120 93.993322891 + -39.965090007 94.045417119 + -39.968271018 94.163421022 +} +853b0b0ffffffff +{ + 34.561936464 -48.664684816 + 34.476958180 -48.704687448 + 34.403461633 -48.639694560 + 34.414836066 -48.534662871 + 34.499810094 -48.494442860 + 34.573414055 -48.559471661 +} +85e8b547fffffff +{ + -70.450133942 -77.045169407 + -70.434875378 -76.768508625 + -70.346810681 -76.664454084 + -70.274323434 -76.835437691 + -70.289514852 -77.109834004 + -70.377260147 -77.215498972 +} +857580c7fffffff +{ + 6.087345032 -9.883041537 + 6.029649160 -9.940043497 + 5.962621365 -9.918659501 + 5.953257718 -9.840394219 + 6.010850059 -9.783428756 + 6.077909460 -9.804692004 +} +8578c1b3fffffff +{ + -6.994954196 -132.488670784 + -7.073029799 -132.521353598 + -7.131962172 -132.471664905 + -7.112871650 -132.389371158 + -7.034882863 -132.356699644 + -6.975897817 -132.406310489 +} +857ae97bfffffff +{ + 5.345448357 38.493135904 + 5.431591542 38.494360875 + 5.479725381 38.416795317 + 5.441759783 38.337943273 + 5.355586888 38.336659320 + 5.307409217 38.414286412 +} +85a12597fffffff +{ + -30.751267891 -134.094374473 + -30.660652283 -134.079784996 + -30.603970241 -134.158146854 + -30.637861396 -134.251227674 + -30.728541371 -134.265999760 + -30.785265895 -134.187508380 +} +8545a96bfffffff +{ + 21.425198525 -82.891258721 + 21.490994251 -82.829354623 + 21.575879921 -82.853083893 + 21.595015015 -82.938862560 + 21.529151713 -83.000853600 + 21.444220958 -82.976979050 +} +85a81917fffffff +{ + -21.026454855 -49.776215061 + -20.952703802 -49.724519210 + -20.872727724 -49.771108846 + -20.866537932 -49.869348345 + -20.940296102 -49.921019139 + -21.020236953 -49.874475629 +} +8501b287fffffff +{ + 69.513525821 54.695662049 + 69.454448714 54.852326304 + 69.474045480 55.096318585 + 69.552819335 55.184881048 + 69.612116639 55.028246504 + 69.592419361 54.783015052 +} +8559b523fffffff +{ + 15.314639306 -2.992853578 + 15.230997885 -2.977275320 + 15.195110758 -2.899074399 + 15.242865776 -2.836315318 + 15.326611416 -2.851813978 + 15.362497809 -2.930151475 +} +8505220ffffffff +{ + 78.615735126 101.259248096 + 78.570542433 101.680016511 + 78.620606897 102.086671028 + 78.716483284 102.075448458 + 78.762209119 101.650642095 + 78.711520569 101.241105902 +} +85c80d67fffffff +{ + -41.713919220 105.927863409 + -41.643259190 105.854423776 + -41.652255846 105.731821625 + -41.731960527 105.682269592 + -41.802806557 105.755596454 + -41.793761781 105.878589001 +} +85586abbfffffff +{ + 15.551353020 16.078220212 + 15.459208634 16.080199670 + 15.412809817 16.165545074 + 15.458487852 16.249006890 + 15.550661635 16.247163534 + 15.597128103 16.161722208 +} +850fb04ffffffff +{ + 69.406213163 -94.205805392 + 69.333156625 -94.380492965 + 69.244486240 -94.291663880 + 69.228642958 -94.029552947 + 69.301388407 -93.854434834 + 69.390287672 -93.941849338 +} +85f14ca3fffffff +{ + -83.530520826 14.030883802 + -83.436105368 13.933565286 + -83.398968596 13.185459340 + -83.455448095 12.520374094 + -83.550155306 12.597605688 + -83.588104777 13.360134338 +} +85065e77fffffff +{ + 62.519510565 -39.363749002 + 62.517164063 -39.555352683 + 62.435682508 -39.649388931 + 62.356796364 -39.552244997 + 62.359217067 -39.361699829 + 62.440449897 -39.267244028 +} +852c58affffffff +{ + 43.407821048 54.911324301 + 43.333320095 54.992554814 + 43.347140054 55.119448590 + 43.435556871 55.165445829 + 43.510209684 55.084224657 + 43.496293638 54.956996241 +} +85cb85cbfffffff +{ + -38.897050440 45.918124757 + -38.982601637 45.918429801 + -39.031448638 46.008108721 + -38.994681440 46.097509457 + -38.909046897 46.097044838 + -38.860262854 46.007339246 +} +85ec411bfffffff +{ + -77.904030268 139.969680526 + -77.874643360 139.588539576 + -77.932351683 139.255877536 + -78.019921863 139.303585640 + -78.049607139 139.688671414 + -77.991421186 140.022082413 +} +85b5a6abfffffff +{ + -34.151014320 -147.168527158 + -34.058451894 -147.138918553 + -33.991915964 -147.219832790 + -34.017877938 -147.330408054 + -34.110443159 -147.360208628 + -34.177043716 -147.279242174 +} +85018b53fffffff +{ + 75.641859126 56.098857663 + 75.663895190 56.436902762 + 75.749335664 56.511737221 + 75.812899407 56.244872872 + 75.790504958 55.903609865 + 75.704907553 55.832446067 +} +85a58a27fffffff +{ + -19.957697400 -33.501893908 + -19.878551071 -33.452381488 + -19.802319991 -33.500639617 + -19.805236929 -33.598435074 + -19.884418327 -33.647996248 + -19.960647703 -33.599713348 +} +851311dbfffffff +{ + 65.221223206 -127.873951970 + 65.133374642 -127.904429176 + 65.074833317 -127.751151244 + 65.103916252 -127.566985554 + 65.191774267 -127.535315392 + 65.250540626 -127.689002598 +} +85e74d37fffffff +{ + -71.583114687 2.139771760 + -71.488504533 2.165839978 + -71.432450561 1.922663858 + -71.470612168 1.652444123 + -71.565183909 1.623740989 + -71.621634357 1.867888939 +} +85cadd03fffffff +{ + -47.959622022 63.058702243 + -48.040989305 63.076734685 + -48.076032407 63.198505328 + -48.029663062 63.302130606 + -47.948285788 63.283868612 + -47.913287708 63.162210785 +} +85ddb367fffffff +{ + -57.667410696 0.751068923 + -57.583372050 0.769666941 + -57.529108344 0.635490672 + -57.558631640 0.482446134 + -57.642636509 0.463029151 + -57.697152512 0.597474866 +} +85e0d6a7fffffff +{ + -51.003267524 60.249282518 + -50.918275654 60.260284698 + -50.876835974 60.152185980 + -50.920178702 60.032974029 + -51.005071676 60.021476843 + -51.046721108 60.129686004 +} +850d86abfffffff +{ + 68.083034320 -178.196519464 + 67.992596404 -178.267291722 + 67.926564411 -178.095165194 + 67.950598265 -177.852426470 + 68.040797193 -177.780119426 + 68.107202038 -177.952078402 +} +851e19dbfffffff +{ + 46.217637155 19.812751492 + 46.129541529 19.811328844 + 46.085810115 19.926157684 + 46.130127978 20.042551547 + 46.218232265 20.044229909 + 46.262010199 19.929258673 +} +850d136bfffffff +{ + 70.004735689 -166.640503416 + 69.921208688 -166.766681942 + 69.844263443 -166.623812455 + 69.850507431 -166.355790938 + 69.933674654 -166.228451713 + 70.010957650 -166.370282760 +} +85d85a67fffffff +{ + -45.241223046 124.158235034 + -45.184066088 124.056535879 + -45.213186170 123.938142428 + -45.299629133 123.921162095 + -45.356966908 124.023017713 + -45.327680546 124.141697484 +} +850ac34bfffffff +{ + 63.966881316 110.131821353 + 63.909801058 110.300721797 + 63.942468562 110.494564786 + 64.032476708 110.520394678 + 64.089861638 110.351077656 + 64.056932769 110.156345602 +} +85021907fffffff +{ + 75.991699893 -106.760719072 + 75.910596702 -106.941114842 + 75.835357007 -106.753466091 + 75.840819235 -106.386839189 + 75.921584744 -106.204102882 + 75.997226180 -106.390307278 +} +85ab00a3fffffff +{ + -17.859867609 66.253824522 + -17.954244783 66.270028337 + -17.987274826 66.364499356 + -17.925858421 66.442686061 + -17.831483679 66.426352545 + -17.798522805 66.331961942 +} +85c174c7fffffff +{ + -25.982363443 -6.960514872 + -26.072624263 -6.993242618 + -26.143631537 -6.921407075 + -26.124266748 -6.816840059 + -26.033953853 -6.784282027 + -25.963057714 -6.856121020 +} +85e28cc3fffffff +{ + -59.497865022 -121.347929549 + -59.452249269 -121.192636333 + -59.360499208 -121.198605863 + -59.314391784 -121.359121533 + -59.359879233 -121.513987462 + -59.451601952 -121.508764791 +} +8588da43fffffff +{ + 3.867079934 -153.896698431 + 3.777306704 -153.926641499 + 3.706246043 -153.862534509 + 3.724903099 -153.768478296 + 3.814654332 -153.738475784 + 3.885770563 -153.802588807 +} +85f2d357fffffff +{ + -82.262480578 -81.130135288 + -82.256678585 -80.434490001 + -82.170836585 -80.135978501 + -82.091581378 -80.524452407 + -82.097302244 -81.205758038 + -82.182357951 -81.512731300 +} +85381967fffffff +{ + 30.803784861 2.035957530 + 30.712327662 2.050404676 + 30.678249838 2.145129476 + 30.735643101 2.225589087 + 30.827196422 2.211275539 + 30.861260391 2.116368544 +} +850a5bc3fffffff +{ + 70.252461583 107.464156102 + 70.197767574 107.694447952 + 70.236817338 107.945253143 + 70.330907482 107.967156250 + 70.385968870 107.735936132 + 70.346571045 107.483738929 +} +85120193fffffff +{ + 59.247343887 -117.423852349 + 59.162798872 -117.479732139 + 59.091505591 -117.369303859 + 59.104521723 -117.203006884 + 59.188985682 -117.146398459 + 59.260514998 -117.256813580 +} +85f2ce2bfffffff +{ + -78.159298143 -91.261173342 + -78.168526187 -90.811805946 + -78.091045776 -90.547010753 + -78.004960321 -90.729867738 + -77.995926883 -91.173250326 + -78.072786012 -91.439708415 +} +853ede17fffffff +{ + 18.086462660 26.311783168 + 17.992299202 26.305323808 + 17.940726206 26.388989616 + 17.983225339 26.479157533 + 18.077363355 26.485758741 + 18.129027800 26.402050254 +} +852a666bfffffff +{ + 36.179011131 -64.263962446 + 36.143939573 -64.363431370 + 36.064377744 -64.376239793 + 36.019944826 -64.289876721 + 36.054902037 -64.190636388 + 36.134406268 -64.177530811 +} +85477313fffffff +{ + 31.474811137 -165.435118315 + 31.562133703 -165.406161958 + 31.625807228 -165.474353200 + 31.602068145 -165.571602912 + 31.514621324 -165.600446277 + 31.451037866 -165.532153266 +} +85e20acffffffff +{ + -57.874327271 -132.756382643 + -57.842352337 -132.603596497 + -57.752377748 -132.584055001 + -57.694479715 -132.716704410 + -57.726398778 -132.868922134 + -57.816271456 -132.889057605 +} +85e40163fffffff +{ + -60.744000836 100.339843166 + -60.661031616 100.235440368 + -60.663571357 100.036690900 + -60.749087079 99.941303553 + -60.832280208 100.045219792 + -60.829733665 100.245013877 +} +854ceac7fffffff +{ + 17.896964608 -65.935723026 + 17.967405174 -65.892578126 + 18.028991320 -65.928307882 + 18.020149332 -66.007105102 + 17.949784470 -66.050181217 + 17.888185953 -66.014528927 +} +854f8b0ffffffff +{ + 22.562632134 156.480460757 + 22.653716410 156.470829375 + 22.694830167 156.380134188 + 22.644803937 156.299220882 + 22.553784136 156.309016455 + 22.512725981 156.399561306 +} +85071a8bfffffff +{ + 72.848288634 -19.436799257 + 72.877746680 -19.694383564 + 72.819842999 -19.901576643 + 72.732781607 -19.850530680 + 72.703600171 -19.594594597 + 72.761204846 -19.388060941 +} +850f6d27fffffff +{ + 57.642482538 -53.443107155 + 57.618733160 -53.612528647 + 57.527288027 -53.661594031 + 57.459762996 -53.541887377 + 57.483454995 -53.373241602 + 57.574729135 -53.323529117 +} +85ef1a97fffffff +{ + -80.442501310 -30.024292404 + -80.364478429 -29.680524397 + -80.276197902 -29.913595683 + -80.265343889 -30.483877302 + -80.342592797 -30.830519690 + -80.431467363 -30.604111961 +} +85030c4bfffffff +{ + 85.599948048 -90.925437588 + 85.619068301 -92.067921909 + 85.550844050 -92.884950131 + 85.465163540 -92.561923956 + 85.446897277 -91.456130409 + 85.513477337 -90.637404157 +} +852a4bd3fffffff +{ + 31.291747019 -66.290600503 + 31.257317815 -66.379740647 + 31.183968924 -66.388362276 + 31.145087096 -66.308093128 + 31.179402423 -66.219128210 + 31.252713230 -66.210257374 +} +85be907bfffffff +{ + -23.541732563 158.666323050 + -23.451434077 158.637164139 + -23.428055155 158.536285976 + -23.494937688 158.464394859 + -23.585309616 158.493406709 + -23.608725653 158.594457008 +} +85009e87fffffff +{ + 76.246299976 85.088705400 + 76.224990865 85.467243573 + 76.293240800 85.726796587 + 76.383343166 85.607184132 + 76.404820130 85.224327670 + 76.336025219 84.965432877 +} +85990383fffffff +{ + -7.780578946 -8.745393415 + -7.853521657 -8.773707225 + -7.912648667 -8.715976225 + -7.898725465 -8.629919317 + -7.825720103 -8.601713865 + -7.766700510 -8.659456799 +} +85d44c6bfffffff +{ + -43.912243608 -174.196620716 + -43.837224222 -174.139425116 + -43.759310392 -174.204037326 + -43.756398935 -174.325650369 + -43.831347333 -174.382884907 + -43.909278154 -174.318467923 +} +858315d7fffffff +{ + -11.454051608 14.725128425 + -11.360060641 14.735404261 + -11.304876135 14.660010060 + -11.343628088 14.574381847 + -11.437547547 14.564057265 + -11.492786592 14.639409560 +} +85e4f6b3fffffff +{ + -55.702296956 96.980190543 + -55.617750227 96.897696503 + -55.615824726 96.726260158 + -55.698420296 96.636543610 + -55.783154192 96.718596758 + -55.785105427 96.890809868 } -85f394a7fffffff +8541111bfffffff +{ + 22.881737496 115.586617463 + 22.969078229 115.568468764 + 23.003172909 115.480993790 + 22.949875698 115.411653986 + 22.862463995 115.429882204 + 22.828420458 115.517370720 +} +857ae837fffffff +{ + 4.921473760 39.035153707 + 5.007903722 39.036176327 + 5.056165043 38.958614137 + 5.018038680 38.879965772 + 4.931576483 38.878884265 + 4.883272803 38.956510033 +} +85f00d57fffffff +{ + -78.810492589 57.249403601 + -78.749837209 56.894310074 + -78.776985737 56.466444330 + -78.865268236 56.388720908 + -78.926559770 56.745103892 + -78.898928481 57.177950335 +} +85a309c7fffffff +{ + -14.314992839 49.294382513 + -14.223294050 49.291476961 + -14.180070274 49.212873206 + -14.228569720 49.137071350 + -14.320355720 49.139920316 + -14.363555070 49.218627792 +} +85f35187fffffff +{ + -73.741176023 -143.166311779 + -73.808387554 -143.013062583 + -73.800107464 -142.706761882 + -73.724578045 -142.556616619 + -73.657747576 -142.711229271 + -73.666065363 -143.014641717 +} +852d5a63fffffff +{ + 44.140818298 45.238119021 + 44.075821148 45.327174970 + 44.099697213 45.444614899 + 44.188710932 45.473248626 + 44.253841572 45.384077052 + 44.229824778 45.266387091 +} +853e8e63fffffff +{ + 19.729475074 20.216843262 + 19.634258478 20.215413944 + 19.584953126 20.303108426 + 19.630789541 20.392313316 + 19.726014693 20.393892214 + 19.775395001 20.306116636 +} +8535945bfffffff +{ + 39.449816795 -39.059702931 + 39.365135241 -39.116581612 + 39.285143156 -39.052333871 + 39.289731247 -38.931258661 + 39.374368543 -38.874176795 + 39.454462067 -38.938372812 +} +8589125bfffffff +{ + -12.949569202 -147.852429365 + -12.864120299 -147.827483623 + -12.798022424 -147.893840040 + -12.817274941 -147.985173897 + -12.902700319 -148.010248205 + -12.968896816 -147.943860211 +} +85af5207fffffff +{ + -21.436941994 94.519589843 + -21.522261438 94.552939860 + -21.538404103 94.643319108 + -21.469290773 94.700208897 + -21.384080267 94.666829387 + -21.367874201 94.576589394 +} +85021a1bfffffff +{ + 75.850408909 -115.507336067 + 75.764612748 -115.634838066 + 75.697434032 -115.412973499 + 75.715640483 -115.063901593 + 75.801214628 -114.933380919 + 75.868805735 -115.154930413 +} +852d0c77fffffff +{ + 43.020138001 36.537734418 + 42.932145859 36.519241121 + 42.872515343 36.615797492 + 42.900816481 36.730813977 + 42.988748227 36.749499358 + 43.048439338 36.652976517 +} +85d01e4bfffffff +{ + -48.919075401 10.697915085 + -49.007828674 10.680980406 + -49.056975163 10.785956128 + -49.017315432 10.907650385 + -48.928609825 10.924232779 + -48.879516111 10.819473150 +} +8552c013fffffff +{ + 12.456069195 45.737010154 + 12.373060474 45.717669115 + 12.322670479 45.778782375 + 12.355188703 45.859176637 + 12.438096766 45.878589438 + 12.488587259 45.817536375 +} +8568144ffffffff +{ + 5.696443746 114.723937572 + 5.786050164 114.706370064 + 5.812991288 114.622820570 + 5.750241693 114.556828702 + 5.660575873 114.574467040 + 5.633719018 114.658026432 +} +85014b73fffffff +{ + 79.453740407 -7.134310039 + 79.533273206 -7.070099287 + 79.585926692 -7.454628107 + 79.558355742 -7.901746514 + 79.478661113 -7.959344887 + 79.426694680 -7.576464359 +} +853263c7fffffff +{ + 32.374579128 159.828279904 + 32.470796211 159.821179374 + 32.514135116 159.719655290 + 32.461199536 159.625402719 + 32.365033050 159.632720667 + 32.321751406 159.734073935 +} +85d2748bfffffff +{ + -44.052160794 -115.056598948 + -43.994358332 -114.948255405 + -43.897992561 -114.963309150 + -43.859418599 -115.086313968 + -43.917086651 -115.194510910 + -44.013462803 -115.179849859 +} +856b894bfffffff +{ + 6.314872259 21.886705939 + 6.400658930 21.894010723 + 6.446257553 21.819161753 + 6.406140448 21.737015360 + 6.320387902 21.729658031 + 6.274718256 21.804499590 +} +8504ebd7fffffff +{ + 69.968134231 169.733662283 + 69.872611729 169.711497787 + 69.819137256 169.940052927 + 69.860792388 170.191519772 + 69.956217426 170.215937349 + 70.010086403 169.986638650 +} +85ecaaaffffffff +{ + -65.977379767 137.313181203 + -65.937680327 137.113918108 + -65.991003859 136.931777570 + -66.084303683 136.948568661 + -66.124165696 137.148852388 + -66.070564509 137.331321872 +} +85f1151bfffffff +{ + -81.738652295 121.121338443 + -81.687271939 120.648440764 + -81.719597228 120.062748759 + -81.803790604 119.942347444 + -81.855911999 120.417680257 + -81.823092902 121.011033087 +} +8536aa77fffffff +{ + 29.170570507 -152.298947776 + 29.084918180 -152.333008433 + 29.017718577 -152.261992904 + 29.036166785 -152.156919222 + 29.121820515 -152.122790701 + 29.189024687 -152.193803549 +} +85f29157fffffff +{ + -89.429041889 -142.755279581 + -89.506520285 -137.386565225 + -89.487095086 -127.220566257 + -89.395126186 -125.207930190 + -89.329652716 -131.038812694 + -89.344992193 -138.819740870 +} +8566649bfffffff +{ + 8.426932352 -67.401572514 + 8.361460612 -67.449334467 + 8.282609124 -67.411189806 + 8.269310426 -67.325308707 + 8.334818703 -67.277621969 + 8.413589180 -67.315741028 +} +852372d3fffffff +{ + 39.040716149 -169.696715030 + 39.130526628 -169.668667790 + 39.196158721 -169.750903406 + 39.171893334 -169.861277251 + 39.081975212 -169.889152809 + 39.016430083 -169.806826666 +} +85c94c23fffffff +{ + -48.990409697 108.804928607 + -48.917215073 108.713669635 + -48.930708563 108.570498719 + -49.017473496 108.518064000 + -49.090877910 108.609221357 + -49.077307382 108.752916385 +} +85e851b7fffffff +{ + -57.624172200 -86.280457580 + -57.544817016 -86.190727034 + -57.465380392 -86.267726257 + -57.465142222 -86.434207080 + -57.544391648 -86.524348998 + -57.623985069 -86.447600694 +} +85172cd3fffffff +{ + 64.699685465 156.180708865 + 64.606773728 156.214048930 + 64.573068962 156.421224740 + 64.632033779 156.596109217 + 64.725031949 156.564172577 + 64.758979893 156.355945392 +} +85c95e87fffffff +{ + -45.215512924 110.156867105 + -45.145464591 110.071211297 + -45.159769781 109.940582824 + -45.244206149 109.895179251 + -45.314455782 109.980771906 + -45.300067528 110.111832272 +} +85c6050bfffffff +{ + -39.590017918 -136.853491842 + -39.500375258 -136.834168045 + -39.446175790 -136.920925764 + -39.481584192 -137.027147783 + -39.571278222 -137.046696861 + -39.625512578 -136.959798648 +} +857d1197fffffff +{ + -7.891220586 -19.786964998 + -7.811830553 -19.745798318 + -7.735338351 -19.788867912 + -7.738192068 -19.873171273 + -7.817630037 -19.914422508 + -7.894166349 -19.871285875 +} +854b608bfffffff +{ + 33.177029478 131.685476002 + 33.104174156 131.702690266 + 33.082491312 131.797490105 + 33.133688078 131.875115951 + 33.206547903 131.857913736 + 33.228206530 131.763073544 +} +8532056bfffffff +{ + 34.244460393 168.616474796 + 34.341883229 168.619451705 + 34.392689789 168.518699714 + 34.345985778 168.415083613 + 34.248561107 168.412346178 + 34.197842112 168.512985342 +} +85425b0ffffffff +{ + 27.036330610 73.784519411 + 26.958114193 73.828936993 + 26.952013781 73.931838271 + 27.024101090 73.990550161 + 27.102425844 73.946284513 + 27.108555012 73.843154628 +} +850064a3fffffff +{ + 79.769670207 -5.561379478 + 79.849301189 -5.481739233 + 79.904079360 -5.870670532 + 79.878502993 -6.337908492 + 79.798667549 -6.410599984 + 79.744608216 -6.023037644 +} +8578c613fffffff +{ + -6.577825911 -134.733215118 + -6.657097492 -134.765991462 + -6.717464800 -134.714327289 + -6.698614755 -134.629959214 + -6.619426454 -134.597187703 + -6.559004944 -134.648779336 +} +8572510bfffffff +{ + 3.507258690 145.129874663 + 3.411746155 145.144491372 + 3.376933522 145.234039544 + 3.437597930 145.308963649 + 3.533080806 145.294378888 + 3.567928991 145.204838024 +} +85606eb3fffffff +{ + 5.850884681 68.019554772 + 5.932520228 67.993304162 + 5.950863280 67.918008054 + 5.887655255 67.869029931 + 5.806119646 67.895251390 + 5.787692182 67.970480166 +} +8505219bfffffff +{ + 80.570565738 96.828133126 + 80.532401301 97.351386482 + 80.588598658 97.815244038 + 80.683733731 97.758622525 + 80.722455559 97.228343377 + 80.665478366 96.761754216 +} +8564db77fffffff +{ + 19.344781766 87.673300219 + 19.434245492 87.645317480 + 19.454250102 87.548386909 + 19.384823708 87.479506342 + 19.295393223 87.507509892 + 19.275355844 87.604373331 +} +85354497fffffff +{ + 39.094594052 -15.665337813 + 39.023236177 -15.746231798 + 38.932048416 -15.706975005 + 38.912196019 -15.587065093 + 38.983459515 -15.506192387 + 39.074669665 -15.545207927 +} +85dcab63fffffff +{ + -50.066407912 -11.113773251 + -50.151383233 -11.164370426 + -50.221009146 -11.070447321 + -50.205569859 -10.925858254 + -50.120534799 -10.875542020 + -50.050998649 -10.969533086 +} +85b1b4affffffff +{ + -35.944854672 -111.317110280 + -35.884900915 -111.225278036 + -35.791850636 -111.244003951 + -35.758716267 -111.354269906 + -35.818526266 -111.446029384 + -35.911614175 -111.427595943 +} +85115a17fffffff +{ + 64.941738482 46.269634019 + 64.887009403 46.414236074 + 64.917254303 46.608525427 + 65.002366114 46.658911859 + 65.057260395 46.514035539 + 65.026877152 46.319045587 +} +85e0298bfffffff +{ + -60.956232332 54.505230182 + -60.868153350 54.536391452 + -60.814273968 54.406428414 + -60.848235070 54.245288608 + -60.936151428 54.213340409 + -60.990269648 54.343316789 +} +85032dc7fffffff +{ + 86.236055743 -40.385134996 + 86.314988928 -40.982944482 + 86.320334743 -42.415697234 + 86.246446516 -43.191696119 + 86.169110806 -42.558600556 + 86.164057454 -41.183210380 +} +8512868ffffffff +{ + 54.558390988 -129.691668142 + 54.477659619 -129.708342216 + 54.420326399 -129.599712217 + 54.443549570 -129.474176194 + 54.524302164 -129.456923130 + 54.581810760 -129.565784807 +} +8503b647fffffff { - -80.826091627 158.701920345 - -80.898930411 158.438627899 - -80.966962941 158.737041093 - -80.961406852 159.302664890 - -80.887877198 159.560579533 - -80.820593664 159.258350026 + 78.689334162 -171.842391455 + 78.600778241 -172.027076121 + 78.524513853 -171.738511772 + 78.536176707 -171.267336356 + 78.624216021 -171.078044602 + 78.701110508 -171.364472267 } -85db23c7fffffff -{ - -57.587995546 -179.295258099 - -57.523784811 -179.367841205 - -57.533722307 -179.515352768 - -57.607930106 -179.590714872 - -57.672231254 -179.518177804 - -57.662234105 -179.370231604 +850912b7fffffff +{ + 62.626065172 -1.005374144 + 62.587856832 -1.134532760 + 62.512396601 -1.105690586 + 62.475158303 -0.948289254 + 62.513291537 -0.819476754 + 62.588737883 -0.847719485 +} +85ba6a27fffffff +{ + -28.492280022 169.678022022 + -28.404858309 169.637686755 + -28.390325103 169.533863068 + -28.463242676 169.470169056 + -28.550778024 169.510408712 + -28.565282147 169.614438350 +} +85390917fffffff +{ + 39.619332282 -1.643534313 + 39.561313386 -1.728987534 + 39.470956750 -1.709052392 + 39.438671203 -1.603927689 + 39.496625773 -1.518621693 + 39.586930098 -1.538293163 +} +8522d943fffffff +{ + 56.372728151 -171.200127874 + 56.295276869 -171.262404700 + 56.233396011 -171.168861417 + 56.248727784 -171.013280482 + 56.325969669 -170.950515411 + 56.388089287 -171.043817270 +} +8509947bfffffff +{ + 56.965310885 4.959619647 + 56.927724937 4.846679288 + 56.847381150 4.861054782 + 56.804681694 4.987933220 + 56.842234222 5.100544695 + 56.922519441 5.086606277 +} +850204abfffffff +{ + 80.388037917 -105.726370149 + 80.382700026 -106.256943114 + 80.303059053 -106.519443214 + 80.229443811 -106.255871891 + 80.234841392 -105.733906382 + 80.313794748 -105.466997302 +} +856a28affffffff +{ + 9.338699735 28.880637995 + 9.252009029 28.872728114 + 9.204602793 28.948628607 + 9.243787486 29.032461943 + 9.330443120 29.040489827 + 9.377949244 28.964566451 +} +85c4db67fffffff +{ + -50.977979663 -39.629135098 + -50.920549410 -39.528208786 + -50.842113398 -39.563296658 + -50.820997347 -39.698800396 + -50.878191494 -39.799709004 + -50.956737426 -39.765132673 +} +8521692bfffffff +{ + 57.368090052 76.939977629 + 57.281555880 77.009393483 + 57.269064884 77.184227263 + 57.343052985 77.290293502 + 57.429691497 77.221380912 + 57.442237753 77.045896875 +} +8519763bfffffff +{ + 56.906534785 -2.479178363 + 56.860897822 -2.592465149 + 56.779292380 -2.564431609 + 56.743349340 -2.423576542 + 56.788921965 -2.310538204 + 56.870501744 -2.338106405 +} +8506b41bfffffff +{ + 77.310270165 -46.955695896 + 77.303549193 -47.357089932 + 77.222698982 -47.508795258 + 77.148937975 -47.261981799 + 77.155589982 -46.865114552 + 77.236071294 -46.710568801 +} +854419dbfffffff +{ + 28.109106471 -84.005698245 + 28.173548828 -83.939802306 + 28.260590208 -83.966170657 + 28.283240962 -84.058598997 + 28.218746154 -84.124588078 + 28.131653096 -84.098055715 +} +85f284b7fffffff +{ + -85.781671628 -152.351286329 + -85.865436207 -151.909323295 + -85.874542594 -150.665882844 + -85.799330565 -149.910895360 + -85.716722294 -150.385863919 + -85.708156585 -151.583906532 } -8503228ffffffff +85a856b3fffffff { - 89.484621891 -112.532313658 - 89.464692599 -122.256377936 - 89.372703570 -124.181533300 - 89.307362476 -118.537228884 - 89.323225380 -111.014605949 - 89.407683490 -107.288292446 -} -85c4ce77fffffff -{ - -49.060984467 -36.327859276 - -49.128727394 -36.401400990 - -49.210777865 -36.348015551 - -49.225084295 -36.220767461 - -49.157250722 -36.147194052 - -49.075201468 -36.200899919 -} -85b29ed3fffffff -{ - -31.620268127 -81.491394345 - -31.688853646 -81.554107223 - -31.765108935 -81.511255193 - -31.772780517 -81.405660780 - -31.704205959 -81.342978882 - -31.627948888 -81.385860226 -} -853ae60ffffffff -{ - 25.604261933 -49.384756654 - 25.524143854 -49.419682304 - 25.451079680 -49.361218025 - 25.458014572 -49.267794556 - 25.538115072 -49.232693066 - 25.611298384 -49.291190712 -} -858cabc3fffffff -{ - -3.353399685 105.433254849 - -3.265484745 105.412095690 - -3.242413274 105.323395864 - -3.307317466 105.255870857 - -3.395241942 105.277089086 - -3.418252762 105.365773314 -} -85f01843fffffff -{ - -76.198356203 70.393179720 - -76.108164211 70.361523100 - -76.065220406 70.027889098 - -76.112099944 69.723841115 - -76.202298427 69.751582940 - -76.245613355 70.087289129 -} -85cd960ffffffff -{ - -37.518768398 94.938583934 - -37.446597111 94.887656692 - -37.445573740 94.831592956 - -37.442141127 94.779574452 - -37.514591326 94.714016861 - -37.586901073 94.764736174 - -37.589005141 94.877185388 -} -850e1e57fffffff -{ - 59.264542051 -83.348811371 - 59.202353201 -83.494703568 - 59.106507109 -83.462245113 - 59.072753207 -83.284776947 - 59.134697355 -83.139030737 - 59.230639535 -83.170604923 -} -85488843fffffff -{ - 30.446839710 -101.359061357 - 30.523589562 -101.293429123 - 30.611717071 -101.338338500 - 30.623075704 -101.449013329 - 30.546266490 -101.514633094 - 30.458158057 -101.469590780 -} -850645a3fffffff -{ - 61.099288402 -30.775149488 - 61.107492692 -30.947947280 - 61.034194213 -31.054874556 - 60.952935909 -30.989105918 - 60.944876138 -30.817151193 - 61.017930561 -30.710124651 -} -8507a31bfffffff -{ - 76.780763551 -18.888112527 - 76.813110919 -19.217904489 - 76.757880082 -19.485981965 - 76.670677120 -19.423124784 - 76.638658963 -19.096004966 - 76.693516740 -18.829079447 -} -85b92ab7fffffff -{ - -38.153215014 132.179182926 - -38.060604676 132.177397296 - -38.014850558 132.079706421 - -38.061593469 131.983761256 - -38.154125973 131.985307526 - -38.199993505 132.083038130 -} -850eb6cffffffff -{ - 62.476276215 -98.864913285 - 62.399194119 -98.985990299 - 62.311357906 -98.904929983 - 62.300382838 -98.703480063 - 62.377234645 -98.581975548 - 62.465291680 -98.662344149 -} -85df90cbfffffff -{ - -62.016163565 -37.050444569 - -61.948435556 -36.912283932 - -61.860010059 -36.970992263 - -61.839140053 -37.166872304 - -61.906553190 -37.305102733 - -61.995150609 -37.247386972 -} -85e51463fffffff -{ - -60.000059405 121.055744626 - -59.937567971 120.910680658 - -59.969463563 120.731678657 - -60.064038644 120.697037716 - -60.126765308 120.842339632 - -60.094681029 121.022046010 -} -85a24537fffffff -{ - -18.251237544 58.557731373 - -18.344491676 58.567874132 - -18.380664958 58.657038887 - -18.323491095 58.736018406 - -18.230199501 58.725742293 - -18.194119139 58.636620018 -} -85f29113fffffff -{ - -89.104985141 -142.909381139 - -89.183305394 -139.685208771 - -89.170456498 -133.397298953 - -89.081186085 -131.466647427 - -89.010398778 -134.993812111 - -89.021585338 -140.264279349 -} -85f1a57bfffffff -{ - -78.781957483 119.046478013 - -78.725752991 118.699241846 - -78.755757660 118.253078801 - -78.842311474 118.149590390 - -78.899073332 118.497805664 - -78.868720720 118.948557837 -} -8592c057fffffff -{ - -18.104735819 -106.720941433 - -18.168908456 -106.777579899 - -18.253916991 -106.748987207 - -18.274823688 -106.663662375 - -18.210639650 -106.606939009 - -18.125560308 -106.635625349 -} -85dea3b3fffffff -{ - -55.542026047 -42.874623756 - -55.484145138 -42.752858471 - -55.399638025 -42.784528187 - -55.372917339 -42.937254829 - -55.430536472 -43.058910668 - -55.515137532 -43.027950633 -} -8503268bfffffff -{ - 89.269757262 89.225352913 - 89.241870054 95.940113913 - 89.297059128 101.931998149 - 89.389706931 101.705855779 - 89.425118467 93.539517935 - 89.359179498 87.197968832 + -20.399740968 -53.121242694 + -20.327116541 -53.070180779 + -20.246587726 -53.115447136 + -20.238726438 -53.211717135 + -20.311353557 -53.262739796 + -20.391839282 -53.217531834 } -85f18387fffffff +855e96c7fffffff { - -76.393592136 104.059776385 - -76.319741556 103.832952590 - -76.327067117 103.437755150 - -76.408320182 103.265291809 - -76.482618353 103.490644593 - -76.475215200 103.889962306 + 15.049228358 -44.443734979 + 15.123725890 -44.394435895 + 15.198815342 -44.440024069 + 15.199441812 -44.534890033 + 15.124989347 -44.584188684 + 15.049865357 -44.538621936 } -8556c32ffffffff +85c84137fffffff { - 5.793088473 -34.445393974 - 5.872471320 -34.397340048 - 5.954895544 -34.443961864 - 5.957984662 -34.538657033 - 5.878616886 -34.586752674 - 5.796144906 -34.540111556 -} -85f0055bfffffff -{ - -79.837488548 72.994626201 - -79.797869734 72.533676361 - -79.846046855 72.132309812 - -79.934553163 72.189530271 - -79.974659035 72.655845045 - -79.925766474 73.059547717 -} -85571007fffffff -{ - 22.166488300 -37.677580986 - 22.088167547 -37.725540957 - 22.008293396 -37.673951522 - 22.006622592 -37.574445439 - 22.084870743 -37.526356562 - 22.164862365 -37.577902385 -} -85eb4377fffffff -{ - -69.052568480 -162.619371388 - -69.121014806 -162.579318752 - -69.136927764 -162.366153908 - -69.084156370 -162.194281405 - -69.015815038 -162.235765247 - -69.000139086 -162.447694364 -} -8517368bfffffff -{ - 61.494737895 145.530308830 - 61.407525978 145.594432116 - 61.389569502 145.788565232 - 61.458705497 145.919633130 - 61.546106254 145.856423737 - 61.564182678 145.661228800 -} -8502f4a7fffffff -{ - 74.814088360 -112.352916123 - 74.729369098 -112.489934590 - 74.658344575 -112.293611247 - 74.671651613 -111.960877702 - 74.756125798 -111.821408876 - 74.827538994 -112.017105093 -} -85e6262bfffffff -{ - -66.597960032 26.053195038 - -66.513094255 25.980642355 - -66.490474814 25.761900047 - -66.552634268 25.614275513 - -66.637749077 25.685634693 - -66.660455890 25.905817911 -} -856592d7fffffff -{ - 15.235863156 106.930769304 - 15.328814181 106.908995267 - 15.358199841 106.816004389 - 15.294587490 106.744800409 - 15.201596627 106.766643040 - 15.172257908 106.859621123 + -45.178799778 99.502060298 + -45.101429051 99.433651948 + -45.103473762 99.300641741 + -45.182888289 99.235573721 + -45.260433754 99.303753378 + -45.258389952 99.437230927 } -85980a47fffffff +857c6c07fffffff { - -16.557819657 -6.143097315 - -16.641014739 -6.171800832 - -16.706905694 -6.106579041 - -16.689485522 -6.012655988 - -16.606236431 -5.984092934 - -16.540461412 -6.049312276 + 1.695996382 -30.942245552 + 1.776624545 -30.895274811 + 1.859611691 -30.941635632 + 1.862019915 -31.035000385 + 1.781390376 -31.082026201 + 1.698353971 -31.035632302 } -859c8287fffffff +85d41687fffffff { - -7.276821827 148.508640741 - -7.367035033 148.522337049 - -7.397363008 148.608762571 - -7.337536964 148.681474147 - -7.247355088 148.667812394 - -7.216967862 148.581404472 + -48.610642791 -156.217409507 + -48.529703396 -156.171808769 + -48.464968573 -156.261737123 + -48.481113172 -156.397230819 + -48.562016287 -156.443046970 + -48.626811180 -156.353154573 } -85468c97fffffff +8500c417fffffff { - 19.721450167 -172.357087345 - 19.633009605 -172.378411963 - 19.572811070 -172.313320138 - 19.601044778 -172.226810844 - 19.689556440 -172.205387704 - 19.749763304 -172.270572370 + 84.484089196 64.402013570 + 84.497909874 65.336979931 + 84.584982352 65.686647034 + 84.659069997 65.079938337 + 84.644758014 64.117729465 + 84.556859671 63.789969064 } -85396147fffffff +85ef3647fffffff +{ + -86.157662501 -15.994177102 + -86.070331195 -15.455864768 + -85.996446560 -16.290275137 + -86.008036886 -17.648651242 + -86.093948978 -18.226589542 + -86.169704246 -17.408004415 +} +8517b51bfffffff +{ + 55.208793505 145.278111506 + 55.127226982 145.330695121 + 55.110791232 145.488098786 + 55.175823325 145.593615705 + 55.257552129 145.541626463 + 55.274086896 145.383523917 +} +8516c4c7fffffff +{ + 49.820786030 168.839108910 + 49.911562069 168.843115806 + 49.958888806 168.718591386 + 49.915358835 168.590230096 + 49.824579783 168.586589659 + 49.777333481 168.710943989 +} +85b7746bfffffff +{ + -34.039405094 -100.694007724 + -33.973247518 -100.616002366 + -33.884063375 -100.648803154 + -33.860936019 -100.759386538 + -33.926947327 -100.837434084 + -34.016232148 -100.804856542 +} +85a4cccbfffffff +{ + -28.733479449 -26.252535600 + -28.816656082 -26.303413912 + -28.895684711 -26.249220303 + -28.891471381 -26.144000824 + -28.808176027 -26.093177341 + -28.729212785 -26.147518153 +} +859a5d77fffffff +{ + -9.002840391 -179.981163449 + -8.929201563 -179.939429164 + -8.864907970 -179.978728991 + -8.874199410 179.940346577 + -8.947725205 179.898618113 + -9.012072501 179.937808138 +} +85266e07fffffff +{ + 38.800950423 -87.067581601 + 38.746090169 -87.151674804 + 38.664229071 -87.125709138 + 38.637134461 -87.015957079 + 38.691810799 -86.931872105 + 38.773765449 -86.957530442 +} +85eeb2b7fffffff +{ + -71.865758065 -1.400753739 + -71.771417921 -1.355741662 + -71.710770823 -1.592838083 + -71.744041948 -1.875636736 + -71.838285893 -1.923308910 + -71.899356780 -1.685529054 +} +85223657fffffff +{ + 43.610091560 -162.480687136 + 43.693206513 -162.443944267 + 43.762368396 -162.518915792 + 43.748356692 -162.630794206 + 43.665125201 -162.667407796 + 43.596021966 -162.592272795 +} +8503309bfffffff +{ + 87.849624634 172.256918705 + 87.757497259 171.961802568 + 87.698827366 173.843666916 + 87.729044095 176.056697553 + 87.820092024 176.518381078 + 87.882112067 174.604695512 +} +85d059dbfffffff +{ + -48.225381905 23.913238003 + -48.309623374 23.916234749 + -48.344809594 24.015848171 + -48.295759312 24.112178743 + -48.211619767 24.108908922 + -48.176428518 24.009581176 +} +8520718bfffffff +{ + 49.844572039 79.161027582 + 49.754462186 79.215977417 + 49.739636938 79.363578018 + 49.814852840 79.456683816 + 49.905044864 79.402122884 + 49.919938992 79.254066135 +} +85aad993fffffff +{ + -32.404854353 80.481796596 + -32.495882650 80.511168434 + -32.518358735 80.619736380 + -32.449814707 80.698768273 + -32.358843173 80.669282330 + -32.336358839 80.560878321 +} +85955307fffffff +{ + -7.454500440 126.059110117 + -7.544926105 126.075519909 + -7.579497966 126.162180994 + -7.523631505 126.232482461 + -7.433146015 126.216073750 + -7.398586778 126.129362426 +} +8519a377fffffff +{ + 58.745049535 -19.641450689 + 58.684284148 -19.748427664 + 58.607621542 -19.687657505 + 58.591665300 -19.520321560 + 58.652325888 -19.413306223 + 58.729047353 -19.473663986 +} +855c624ffffffff +{ + 12.530195714 -143.918823170 + 12.439483275 -143.953187159 + 12.365015752 -143.890555577 + 12.381232614 -143.793606691 + 12.471896215 -143.759214042 + 12.546391814 -143.821798784 +} +8501496bfffffff +{ + 78.934548907 -10.321747268 + 79.013825411 -10.285615260 + 79.062167115 -10.665434777 + 79.030598394 -11.079263157 + 78.951239044 -11.109300573 + 78.903526913 -10.731618453 +} +858ca203fffffff +{ + -3.218721380 109.017456107 + -3.131852725 108.997778163 + -3.109301124 108.911452558 + -3.173690489 108.844810526 + -3.260581813 108.864552008 + -3.283061174 108.950872028 +} +859a75c3fffffff +{ + -13.959077397 -178.917733346 + -13.881719535 -178.874178995 + -13.811877897 -178.916621358 + -13.819345627 -179.002499451 + -13.896587656 -179.046052258 + -13.966477698 -179.003728665 +} +8531b5cbfffffff +{ + 40.993703160 112.182202177 + 40.910660408 112.174153322 + 40.870784805 112.256358036 + 40.913797664 112.346623560 + 40.996731681 112.354927689 + 41.036761649 112.272711379 +} +85ad74a7fffffff +{ + -33.883091727 8.266400844 + -33.975564459 8.249580912 + -34.035148717 8.334479862 + -34.002183055 8.436072820 + -33.909749631 8.452658557 + -33.850242428 8.367885560 +} +8578a3c3fffffff { - 43.550767210 2.765359565 - 43.464909784 2.781326126 - 43.437729034 2.890826879 - 43.496422216 2.984600394 - 43.582355015 2.968815422 - 43.609519341 2.859074987 -} -85dced83fffffff -{ - -49.305754313 -23.819706821 - -49.383830470 -23.884496668 - -49.462139074 -23.809147606 - -49.462313519 -23.668777137 - -49.384144265 -23.604114286 - -49.305893682 -23.679694054 -} -850b5dc3fffffff -{ - 69.888289140 79.420559792 - 69.873947835 79.678856095 - 69.943090955 79.832126768 - 70.026931795 79.726403786 - 70.041300990 79.466038455 - 69.971801177 79.313475907 -} -85dc13affffffff -{ - -53.271164101 -12.736181197 - -53.352507874 -12.791871406 - -53.421115627 -12.694755583 - -53.408287768 -12.541846420 - -53.326876159 -12.486450874 - -53.258360137 -12.583668817 -} -856ce14ffffffff -{ - 1.768342658 -94.954667590 - 1.694366526 -95.011982374 - 1.610330083 -94.978326457 - 1.600270837 -94.887289147 - 1.674307087 -94.829937244 - 1.758342408 -94.863659674 -} -850c206ffffffff -{ - 66.579221210 -156.447671192 - 66.506409483 -156.586421771 - 66.426446024 -156.503042725 - 66.419091185 -156.282060031 - 66.491555338 -156.142999909 - 66.571721285 -156.225225811 -} -850460d7fffffff -{ - 78.939316104 176.537605033 - 78.844756735 176.441261489 - 78.780746676 176.811467460 - 78.810606775 177.278698152 - 78.904857677 177.381663716 - 78.969561050 177.010820598 -} -8583b0b3fffffff -{ - -7.021832262 19.765630673 - -6.927002953 19.774091958 - -6.873746669 19.696263516 - -6.915260157 19.609992050 - -7.010039057 19.601475115 - -7.063354937 19.679285231 -} -85f11c97fffffff -{ - -82.661145909 109.457564990 - -82.677086409 108.775392093 - -82.757773897 108.573574658 - -82.823051118 109.066277974 - -82.806598209 109.761990156 - -82.725387542 109.951293452 -} -857da053fffffff -{ - -7.352392642 -15.749127027 - -7.275195886 -15.710966728 - -7.201213282 -15.751828645 - -7.204379150 -15.830924132 - -7.281629093 -15.869172576 - -7.355659978 -15.828237410 -} -8503318ffffffff -{ - 88.498335956 -148.834967018 - 88.432942188 -151.247050909 - 88.342037336 -150.347002275 - 88.314386827 -147.325641432 - 88.375257112 -144.942675321 - 88.468117931 -145.538236087 -} -85f2a38ffffffff -{ - -84.965535500 -153.940676208 - -85.049528000 -153.600233550 - -85.061050214 -152.569358001 - -84.988020391 -151.910626746 - -84.904923768 -152.275509449 - -84.893949905 -153.275292892 -} -8504f1cffffffff -{ - 69.478087362 156.264043881 - 69.382852652 156.304752918 - 69.347782103 156.559855167 - 69.407658773 156.775835233 - 69.502995557 156.737263194 - 69.538355116 156.480569212 -} -856845d3fffffff -{ - 10.614870959 124.445595140 - 10.523048002 124.462436359 - 10.493680231 124.550322042 - 10.556186075 124.621422987 - 10.648064146 124.604580116 - 10.677381297 124.516637885 -} -85105e43fffffff -{ - 62.651264119 60.050347099 - 62.580570197 60.166053707 - 62.592209526 60.364970903 - 62.674604314 60.449031152 - 62.745474747 60.333512812 - 62.733773653 60.133743052 -} -850d53b7fffffff -{ - 66.214862036 -147.946955663 - 66.151313503 -148.105044185 - 66.069271794 -148.055541607 - 66.050672183 -147.849262904 - 66.113887649 -147.691309334 - 66.196034874 -147.739495675 -} -85d7251bfffffff -{ - -58.381716227 33.507306890 - -58.309271740 33.436962043 - -58.295578307 33.280153845 - -58.354329759 33.192927828 - -58.426999994 33.262823629 - -58.440693032 33.420396937 -} -856a126ffffffff -{ - 4.293062808 23.389437661 - 4.381135077 23.396289282 - 4.428475941 23.320037152 - 4.387812963 23.236934281 - 4.299770636 23.230027462 - 4.252361263 23.306278667 -} -85b70d7bfffffff -{ - -33.568132451 -98.122796719 - -33.500984932 -98.048661713 - -33.413186241 -98.084456525 - -33.392422224 -98.194185255 - -33.459427386 -98.268387253 - -33.547338845 -98.232794033 -} -85ef22b7fffffff -{ - -84.753298930 -63.526594181 - -84.719971305 -62.563325012 - -84.626253302 -62.422930712 - -84.566302212 -63.216297370 - -84.598693594 -64.156169178 - -84.691953082 -64.325768818 -} -858188cbfffffff -{ - -6.714945278 -36.443008325 - -6.631439392 -36.393479290 - -6.547154387 -36.441069863 - -6.546356013 -36.538201238 - -6.629869732 -36.587765277 - -6.714173991 -36.540163075 -} -859d50c7fffffff -{ - -20.036627081 144.692696961 - -19.947777496 144.678363591 - -19.917520568 144.586963257 - -19.976012778 144.509796706 - -20.064864621 144.523959060 - -20.095222142 144.615459049 -} -85a85087fffffff -{ - -19.867866645 -53.967593130 - -19.795230302 -53.916775117 - -19.714392729 -53.961635231 - -19.706236484 -54.057252316 - -19.778873819 -54.108027751 - -19.859666419 -54.063228795 -} -8576824bfffffff -{ - -7.926483223 154.989664727 - -8.013542070 155.001783263 - -8.041411213 155.083129257 - -7.982298305 155.152321600 - -7.895291556 155.140241838 - -7.867345570 155.058930943 -} -85dd66b3fffffff -{ - -62.549505174 -30.402684423 - -62.475245811 -30.279520305 - -62.389820899 -30.360886751 - -62.378420218 -30.564573097 - -62.452373677 -30.688090872 - -62.538033399 -30.607573378 -} -85a20c7bfffffff -{ - -20.351345569 51.734282190 - -20.442848565 51.739060241 - -20.482194405 51.822367012 - -20.429934592 51.900887580 - -20.338360829 51.895980851 - -20.299117590 51.812682306 -} -8577b52ffffffff -{ - 0.921898477 149.014529509 - 0.827840008 149.028272793 - 0.793956209 149.115390840 - 0.854078538 149.188745999 - 0.948092716 149.175038556 - 0.982028906 149.087940075 -} -852e0c6ffffffff -{ - 39.440720997 140.844316572 - 39.526985981 140.816059139 - 39.548860643 140.712595882 - 39.484514972 140.637649386 - 39.398372023 140.666047157 - 39.376452723 140.769251531 -} -850af40bfffffff -{ - 62.809544178 99.955338889 - 62.765766728 100.131789008 - 62.809999369 100.297009974 - 62.898310598 100.286214149 - 62.942314889 100.109024990 - 62.897780253 99.943371750 -} -8526b033fffffff -{ - 42.578228182 -109.030533143 - 42.652247179 -108.962002459 - 42.730445794 -109.019186810 - 42.734589267 -109.145013969 - 42.660532564 -109.213458131 - 42.582370115 -109.156162113 -} -85a0c977fffffff -{ - -9.800926057 -142.447708262 - -9.719650584 -142.428212152 - -9.657409109 -142.493473048 - -9.676347615 -142.578286514 - -9.757618397 -142.597909819 - -9.819955483 -142.532592521 -} -85c6013bfffffff -{ - -38.424022876 -136.121723670 - -38.334061309 -136.103510526 - -38.279772986 -136.189021656 - -38.315412099 -136.292887225 - -38.405429051 -136.311318953 - -38.459751595 -136.225666520 -} -852a5433fffffff -{ - 35.474476993 -68.182725923 - 35.436341180 -68.278909253 - 35.356925647 -68.285232595 - 35.315677825 -68.195674107 - 35.353682124 -68.099684623 - 35.433065491 -68.093059929 -} -853809c7fffffff -{ - 33.538043645 3.627624652 - 33.446271785 3.641182855 - 33.412109298 3.739497905 - 33.469729016 3.824444050 - 33.561588969 3.811034902 - 33.595741164 3.712530304 -} -856ca29bfffffff -{ - 6.754900264 -102.330064373 - 6.827809421 -102.275914737 - 6.907002499 -102.313935079 - 6.913231245 -102.406193633 - 6.840229597 -102.460329699 - 6.761091752 -102.422220947 -} -8509a043fffffff -{ - 60.211558258 0.246983893 - 60.172150425 0.125064324 - 60.094089208 0.149786978 - 60.055463727 0.295899320 - 60.094809961 0.417493612 - 60.172843022 0.393300736 -} -853cb63bfffffff -{ - 20.560577667 80.219297807 - 20.645774510 80.190548173 - 20.660799177 80.097850665 - 20.590688111 80.033980387 - 20.505542559 80.062727548 - 20.490456752 80.155347574 -} -85984e1bfffffff -{ - -17.492403073 1.454075261 - -17.576112113 1.432899760 - -17.638989722 1.502032015 - -17.618046693 1.592289522 - -17.534320109 1.613305700 - -17.471553957 1.544223802 -} -85ef5213fffffff -{ - -77.017623589 -50.702695788 - -76.963746001 -50.344815147 - -76.866805487 -50.374307782 - -76.823683606 -50.756335247 - -76.877012368 -51.112035768 - -76.974007996 -51.087896260 -} -8587587bfffffff -{ - -11.678332200 81.098703589 - -11.767347905 81.123933711 - -11.793372936 81.215759629 - -11.730371047 81.282236558 - -11.641430588 81.256926718 - -11.615416731 81.165219497 -} -852b308ffffffff -{ - 49.414338956 -63.993522683 - 49.376183564 -64.126890212 - 49.283773180 -64.144545812 - 49.229596939 -64.029365232 - 49.267620761 -63.896410642 - 49.359952022 -63.878224373 -} -85ae732ffffffff -{ - -23.510487612 100.320847347 - -23.591192597 100.356156629 - -23.602438839 100.441677332 - -23.533066373 100.491757721 - -23.452472185 100.456444792 - -23.441139735 100.371054969 -} -85d6e023fffffff -{ - -47.397567761 31.794904170 - -47.477004986 31.808073790 - -47.504554365 31.899931327 - -47.452704910 31.978342380 - -47.373387097 31.964974758 - -47.345799341 31.873393619 -} -853e660ffffffff -{ - 30.675101046 30.675778856 - 30.578988419 30.664586248 - 30.522141037 30.755069959 - 30.561328140 30.856765792 - 30.657393666 30.868126981 - 30.714319300 30.777623922 -} -859d7493fffffff -{ - -24.057742944 146.543802123 - -23.965738094 146.526819687 - -23.934656821 146.429921927 - -23.995486370 146.349886864 - -24.087499906 146.366684052 - -24.118675353 146.463701661 -} -850e4c23fffffff -{ - 51.005670933 -67.610826145 - 50.962981141 -67.746921979 - 50.868805175 -67.757050823 - 50.817369523 -67.631680400 - 50.859901806 -67.495978644 - 50.954026813 -67.485253700 -} -85f1662bfffffff -{ - -88.113666183 28.317651838 - -88.026419225 27.348703577 - -88.010451809 24.736297282 - -88.080376133 22.883199804 - -88.169971159 23.667362959 - -88.187381615 26.500755818 -} -8592030bfffffff -{ - -11.819652223 -105.445401130 - -11.888218263 -105.501542162 - -11.974023109 -105.472690110 - -11.991321598 -105.387607805 - -11.922725071 -105.331388450 - -11.836860553 -105.360329689 -} -85114ccffffffff -{ - 68.358771856 42.839435070 - 68.311007368 43.006250762 - 68.345792097 43.217684008 - 68.428497382 43.263069924 - 68.476434071 43.095769163 - 68.441492609 42.883566381 -} -852fa867fffffff -{ - 39.146993446 150.582949572 - 39.239378459 150.564482401 - 39.271534271 150.455229149 - 39.211300017 150.364692652 - 39.119008582 150.383370831 - 39.086857740 150.492374895 -} -850c1b2bfffffff -{ - 60.489224169 -161.404367153 - 60.415557447 -161.501311497 - 60.343824585 -161.421484015 - 60.345551570 -161.245303995 - 60.418941172 -161.148009299 - 60.490880665 -161.227241634 -} -859ee0b7fffffff -{ - -14.632567181 161.954177173 - -14.550266466 161.925039117 - -14.529321335 161.833628457 - -14.590650513 161.771208096 - -14.673035558 161.800238606 - -14.694007150 161.891797244 -} -852b3013fffffff -{ - 49.430348995 -64.242632296 - 49.391893231 -64.375907998 - 49.299405676 -64.393030745 - 49.245450681 -64.277411306 - 49.283773180 -64.144545812 - 49.376183564 -64.126890212 -} -858b9b1bfffffff -{ - -8.356053701 -55.095805717 - -8.276708406 -55.046146241 - -8.192448595 -55.089735402 - -8.187567800 -55.182921533 - -8.266886031 -55.232535646 - -8.351112119 -55.189009095 -} -853b48a3fffffff -{ - 32.552720103 -39.944990028 - 32.468617504 -39.996044213 - 32.387835468 -39.936523100 - 32.391044442 -39.825983429 - 32.475098575 -39.774753284 - 32.555992274 -39.834238385 -} -85ed482bfffffff -{ - -76.951472078 163.941337243 - -76.954969578 163.590351467 - -77.032564015 163.419409128 - -77.106945146 163.601994096 - -77.103329581 163.956982051 - -77.025451601 164.125353939 -} -8532584bfffffff -{ - 37.973371557 158.861635669 - 38.069213686 158.852875417 - 38.110404391 158.744012236 - 38.055706054 158.644112016 - 37.959918806 158.653118417 - 37.918774867 158.761779117 -} -853529abfffffff + -2.885491112 -140.258429672 + -2.969396240 -140.291327392 + -3.035250251 -140.234727560 + -3.017254184 -140.145286223 + -2.933421950 -140.112375566 + -2.867512890 -140.168919062 +} +854f3157fffffff +{ + 13.454058781 158.686647278 + 13.365037093 158.698128635 + 13.326697306 158.778285129 + 13.377330923 158.846914487 + 13.466268508 158.835475357 + 13.504656574 158.755364638 +} +85b6cba3fffffff +{ + -17.241046829 -94.787002404 + -17.313393761 -94.847840709 + -17.401869546 -94.812045413 + -17.418030499 -94.715337275 + -17.345666917 -94.654457981 + -17.257159056 -94.690327699 +} +85cf6667fffffff +{ + -51.862163383 -88.312280968 + -51.783270428 -88.229246157 + -51.699250983 -88.294009236 + -51.693973714 -88.441580430 + -51.772758445 -88.524904529 + -51.856928701 -88.460369518 +} +850565b3fffffff +{ + 87.232192919 150.070190744 + 87.141872748 150.548737328 + 87.114375062 152.367880419 + 87.175692314 153.797015566 + 87.267183093 153.419408770 + 87.296248828 151.509109736 +} +85220c0bfffffff +{ + 46.509919149 -170.045433322 + 46.596551113 -170.014603933 + 46.662648187 -170.106721765 + 46.642034712 -170.229777891 + 46.555306042 -170.260391351 + 46.489287481 -170.168165249 +} +85f1230ffffffff +{ + -84.528116564 132.230751679 + -84.577092973 131.454557249 + -84.662715583 131.552118983 + -84.699047815 132.453071618 + -84.648713425 133.237694364 + -84.563423409 133.113104546 +} +85682b63fffffff +{ + 8.879457779 119.686647679 + 8.789366382 119.703296046 + 8.760971662 119.787166162 + 8.822731913 119.854452619 + 8.912896538 119.837794955 + 8.941227697 119.753860077 +} +85e50913fffffff +{ + -65.334486860 111.556885640 + -65.262406128 111.404058281 + -65.281741795 111.177450656 + -65.373285411 111.102386494 + -65.445650902 111.255086331 + -65.426187421 111.482982837 +} +85408077fffffff +{ + 33.557404101 111.601573850 + 33.636816324 111.580605546 + 33.669686689 111.485324977 + 33.623122426 111.411011001 + 33.543666059 111.432063339 + 33.510818049 111.527345664 +} +85a78677fffffff +{ + -23.650922147 120.061888722 + -23.570370255 120.071914342 + -23.530609818 120.007972575 + -23.571280285 119.934043047 + -23.651727222 119.923901289 + -23.691608645 119.987805008 +} +85d95e17fffffff +{ + -53.908473485 130.147284190 + -53.856540223 130.016044067 + -53.896709680 129.879124580 + -53.989023720 129.873133407 + -54.041127980 130.004732204 + -54.000746731 130.141963393 +} +85051963fffffff +{ + 77.193020744 129.672459429 + 77.112708316 129.916993497 + 77.119316421 130.350920239 + 77.206337101 130.545820063 + 77.287227134 130.303332719 + 77.280517949 129.863851242 +} +85961ccffffffff +{ + -11.259932919 29.554836437 + -11.162716226 29.559759233 + -11.109894133 29.476372248 + -11.154254580 29.388032364 + -11.251469611 29.383041462 + -11.304325939 29.466458525 +} +85ef0ab7fffffff +{ + -79.767881702 -49.253242580 + -79.712478956 -48.809457908 + -79.616149451 -48.860491008 + -79.575104377 -49.346892951 + -79.629803767 -49.787612689 + -79.726245620 -49.745016753 +} +85290897fffffff +{ + 33.907030725 -126.817971102 + 33.991205674 -126.772312079 + 34.064134476 -126.832851652 + 34.052825990 -126.939017422 + 33.968665964 -126.984505508 + 33.895799456 -126.923998977 +} +85f20c3bfffffff +{ + -77.829816772 -132.397741917 + -77.892548798 -132.121047919 + -77.869089123 -131.709322190 + -77.783085315 -131.579327387 + -77.720950100 -131.856629364 + -77.744223866 -132.263356240 +} +85a4b11bfffffff +{ + -22.787757851 -36.193086433 + -22.710978709 -36.142449728 + -22.636078339 -36.191163321 + -22.637966484 -36.290527062 + -22.714776298 -36.341201555 + -22.789667284 -36.292474667 +} +850320d7fffffff +{ + 89.332652521 4.205374692 + 89.417603050 7.145778092 + 89.488614811 0.713339406 + 89.460988775 -8.877757835 + 89.370672789 -9.754330065 + 89.312103614 -3.382062558 +} +8520e493fffffff +{ + 44.995983309 76.494088884 + 44.906860198 76.548808085 + 44.895880164 76.684953463 + 44.973972487 76.766773851 + 45.063191684 76.712353810 + 45.074222593 76.575813297 +} +850ead73fffffff +{ + 58.761389777 -85.489848718 + 58.696999360 -85.629276770 + 58.601888880 -85.591429198 + 58.571054047 -85.414980998 + 58.635200500 -85.275625815 + 58.730425241 -85.312643967 +} +85e39ca3fffffff +{ + -66.351171278 -124.667631312 + -66.314282038 -124.475152895 + -66.228920916 -124.473006414 + -66.180490657 -124.662245243 + -66.217236312 -124.853984183 + -66.302555178 -124.857222636 +} +85724b83fffffff +{ + 4.777177869 149.604582406 + 4.682719587 149.618265350 + 4.647535974 149.705467769 + 4.706762977 149.778965629 + 4.801170877 149.765319449 + 4.836402199 149.678138609 +} +850a548bfffffff +{ + 68.526757354 94.849634273 + 68.489613688 95.082183461 + 68.543332799 95.278672146 + 68.634573421 95.242990175 + 68.671940550 95.009001034 + 68.617842410 94.812138396 +} +8516d023fffffff +{ + 46.659030152 167.144501946 + 46.752259605 167.145973605 + 46.799123448 167.026256014 + 46.752682894 166.905240959 + 46.659459750 166.904102019 + 46.612670634 167.023645428 +} +85eeb61bfffffff +{ + -72.587152700 2.121811331 + -72.492183598 2.149470382 + -72.436111551 1.892454415 + -72.474593755 1.606691601 + -72.569520396 1.576086845 + -72.626009409 1.834186359 +} +8595050ffffffff +{ + -4.559880213 119.964899958 + -4.649409254 119.981240343 + -4.683468439 120.063728682 + -4.627962827 120.129938473 + -4.538352382 120.113589549 + -4.504328954 120.031039319 +} +851a484ffffffff +{ + 44.471957837 -32.183509214 + 44.391218623 -32.254026784 + 44.308767702 -32.191362014 + 44.306970434 -32.058316489 + 44.387641563 -31.987628590 + 44.470178048 -32.050155834 +} +8507a647fffffff +{ + 77.968834353 -13.809645305 + 78.007821470 -14.150088178 + 77.959215664 -14.459765222 + 77.871986739 -14.426896721 + 77.833392109 -14.088963485 + 77.881636574 -13.781391620 +} +85e8d693fffffff +{ + -63.249528043 -72.379763754 + -63.226411627 -72.180522328 + -63.139415111 -72.119641417 + -63.075747197 -72.257008044 + -63.098762485 -72.455107361 + -63.185546337 -72.516977986 +} +85265d13fffffff +{ + 36.270759871 -90.179846842 + 36.335702735 -90.108074415 + 36.422598810 -90.143644563 + 36.444582558 -90.251174790 + 36.379594778 -90.323019333 + 36.292668230 -90.287261689 +} +853f4ea3fffffff +{ + 34.157077413 30.694826497 + 34.061848528 30.683225892 + 34.004898106 30.776847356 + 34.043104302 30.882090145 + 34.138287992 30.893871237 + 34.195310798 30.800229237 +} +853f982ffffffff +{ + 24.915364181 14.949007280 + 24.819042399 14.952145596 + 24.772681596 15.045037946 + 24.822593043 15.134911274 + 24.918953776 15.131932184 + 24.965364225 15.038920459 +} +85db346bfffffff +{ + -55.412803134 -175.723331684 + -55.349339269 -175.795139049 + -55.362141253 -175.931153868 + -55.438484781 -175.995729210 + -55.502034910 -175.923913166 + -55.489155151 -175.787529740 +} +85ce6d97fffffff +{ + -42.082242741 -93.041908144 + -42.007924012 -92.964828471 + -41.919471818 -93.012835339 + -41.905201097 -93.137710491 + -41.979392260 -93.214940095 + -42.067981690 -93.167145422 +} +85864c13fffffff +{ + -9.688321326 74.662271592 + -9.777350463 74.683295158 + -9.805423416 74.774449223 + -9.744425754 74.844478689 + -9.655444975 74.823357119 + -9.627413418 74.732303953 +} +859d2997fffffff +{ + -23.874667449 147.606294840 + -23.782736226 147.588208285 + -23.752332709 147.490799430 + -23.813770517 147.411351844 + -23.905716568 147.429255310 + -23.936210127 147.526789576 +} +85ca7003fffffff +{ + -38.921786243 61.347134190 + -39.011960152 61.361893145 + -39.050435266 61.471021980 + -38.998681629 61.565310995 + -38.908481023 61.550361699 + -38.870060634 61.441313682 +} +85dc21abfffffff +{ + -57.554873335 -19.933457941 + -57.476954525 -19.856500813 + -57.402451895 -19.950925457 + -57.405607473 -20.121979724 + -57.483311020 -20.199464009 + -57.558074412 -20.105369763 +} +85e9a40ffffffff +{ + -72.361059895 -105.585543146 + -72.388750848 -105.309962725 + -72.327996089 -105.081412302 + -72.239967580 -105.129044419 + -72.212610368 -105.402664385 + -72.272949707 -105.630605792 +} +850a23bbfffffff +{ + 65.239020028 84.554398338 + 65.155058292 84.619513501 + 65.131883473 84.829013774 + 65.192562062 84.974266639 + 65.276605683 84.910085481 + 65.299889293 84.699714781 +} +85640da3fffffff +{ + 8.579846995 92.531014857 + 8.673597969 92.504877039 + 8.698148038 92.409850421 + 8.628949342 92.341014577 + 8.535228446 92.367186090 + 8.510676121 92.462159871 +} +850ba6a7fffffff { - 42.033099949 -18.991607800 - 41.960166569 -19.073370007 - 41.870433603 -19.028079395 - 41.853595824 -18.901268112 - 41.926437168 -18.819491073 - 42.016208217 -18.864539633 + 56.619736654 79.137632205 + 56.531792625 79.201148852 + 56.516339906 79.371624498 + 56.588761943 79.479190560 + 56.676796109 79.416192942 + 56.692318322 79.245108511 } -85724673fffffff -{ - 5.384052028 144.926460571 - 5.288424443 144.941155488 - 5.253246863 145.031026994 - 5.313665303 145.106196860 - 5.409262696 145.091533809 - 5.444471899 145.001668974 -} -85ef06cbfffffff -{ - -84.162514609 -37.053177762 - -84.093004624 -36.413469291 - -84.002251386 -36.689525625 - -83.980286821 -37.584385775 - -84.048495047 -38.225396004 - -84.139957831 -37.970599414 -} -850e662ffffffff -{ - 55.826142759 -66.117570174 - 55.785034602 -66.272990031 - 55.689091174 -66.288265993 - 55.634323375 -66.148876823 - 55.675273170 -65.993991062 - 55.771148603 -65.977961234 -} -852b5a2ffffffff -{ - 37.668180333 -64.790789659 - 37.632051660 -64.893185877 - 37.550517191 -64.905515166 - 37.505167879 -64.815767032 - 37.541176996 -64.713610272 - 37.622654720 -64.700962474 -} -8501b43bfffffff -{ - 69.313228983 51.012073645 - 69.257636917 51.174046999 - 69.282194278 51.410369386 - 69.362465505 51.485832308 - 69.418268998 51.323707322 - 69.393589221 51.086267345 -} -8566917bfffffff -{ - 5.037395033 -84.464898505 - 4.964274332 -84.521412944 - 4.880719260 -84.484034076 - 4.870323113 -84.390106790 - 4.943497039 -84.333603084 - 5.027013855 -84.371015799 -} -85cc3657fffffff -{ - -42.734609853 88.336504100 - -42.654809564 88.291825192 - -42.644912453 88.169649290 - -42.714732510 88.091771709 - -42.794643756 88.136127962 - -42.804624195 88.258685271 -} -85d72347fffffff -{ - -56.975428773 35.474481257 - -56.905950318 35.403402350 - -56.894446111 35.255046847 - -56.952436360 35.177085606 - -57.022136248 35.247802678 - -57.033624397 35.396844912 -} -851d1bdbfffffff -{ - 53.432875195 -143.083856321 - 53.382445013 -143.186560458 - 53.316344970 -143.167940920 - 53.300635129 -143.047127485 - 53.350861001 -142.944560316 - 53.417000596 -142.962669077 -} -855ca87bfffffff -{ - 8.639798395 -154.619164101 - 8.548038662 -154.649380650 - 8.475924140 -154.583900485 - 8.495523296 -154.488193566 - 8.587270588 -154.457913123 - 8.659431220 -154.523403367 -} -85986007fffffff -{ - -13.555360742 0.472589522 - -13.634941202 0.451326176 - -13.696060022 0.517221853 - -13.677486412 0.604340175 - -13.597879698 0.625458582 - -13.536872715 0.559603711 -} -859784a3fffffff -{ - -14.873003028 37.776621848 - -14.776684156 37.778248079 - -14.727420652 37.693722069 - -14.774469748 37.607500039 - -14.870828776 37.605803638 - -14.920098620 37.690399458 -} -850db403fffffff -{ - 70.431759560 176.065238689 - 70.337824908 176.012406357 - 70.276644558 176.225943670 - 70.308983673 176.492581113 - 70.402729303 176.547594113 - 70.464326225 176.333796841 -} -855c401bfffffff -{ - 10.600027091 -143.294064117 - 10.509561093 -143.328296560 - 10.435486458 -143.266516555 - 10.451845946 -143.170553083 - 10.542258064 -143.136294774 - 10.616364592 -143.198025654 -} -85053173fffffff -{ - 77.469132699 104.471280437 - 77.419105528 104.843579518 - 77.464548268 105.226673484 - 77.560557483 105.240425019 - 77.611111629 104.865318730 - 77.565125485 104.479266960 -} -855b4817fffffff -{ - 8.883890729 165.762819068 - 8.962741010 165.762538232 - 9.003629367 165.685631834 - 8.965576700 165.609083483 - 8.886734623 165.609499615 - 8.845936870 165.686328820 -} -8536339bfffffff -{ - 35.110225308 -150.277290278 - 35.030944161 -150.313234510 - 34.967259151 -150.240726787 - 34.982854291 -150.132291079 - 35.062132721 -150.096283157 - 35.125818782 -150.168774432 -} -85bad533fffffff -{ - -25.880130659 -178.580309759 - -25.799812317 -178.531638748 - -25.721284522 -178.579581138 - -25.723051687 -178.676046792 - -25.803263764 -178.724717804 - -25.881814869 -178.676923374 -} -85975dd7fffffff -{ - -18.339779044 23.608070583 - -18.243780596 23.615508156 - -18.188979046 23.531695266 - -18.230146438 23.440444729 - -18.326116059 23.432940367 - -18.380947190 23.516753271 -} -85aedc2bfffffff -{ - -31.703571287 102.205038169 - -31.780294480 102.243396795 - -31.784697736 102.333053583 - -31.712473403 102.384206050 - -31.635843748 102.345852420 - -31.631344929 102.256341161 -} -85de080bfffffff -{ - -52.721709127 -53.664131695 - -52.677045807 -53.537884983 - -52.594895118 -53.540088244 - -52.557415089 -53.667905371 - -52.601870334 -53.793837930 - -52.684013151 -53.792267528 -} -85f3862ffffffff -{ - -81.012231724 169.133314165 - -81.091733645 168.957799898 - -81.150378431 169.344837860 - -81.128674731 169.908042708 - -81.048674021 170.075469820 - -80.990871531 169.687863917 -} -85f0842bfffffff -{ - -72.663777706 84.217239784 - -72.574401201 84.123421279 - -72.551234622 83.819652475 - -72.617250541 83.607430827 - -72.706803223 83.698947834 - -72.730165052 84.004999128 -} -8556a88ffffffff -{ - 12.191165000 -38.502291847 - 12.266902478 -38.453553184 - 12.345515329 -38.499922903 - 12.348435441 -38.595034084 - 12.272730810 -38.643797569 - 12.194073214 -38.597425184 -} -8510220ffffffff -{ - 60.439778797 41.338692689 - 60.386899798 41.469010377 - 60.421912491 41.629875309 - 60.509954913 41.660848668 - 60.562960448 41.530205473 - 60.527796630 41.368914076 -} -8587b1a3fffffff -{ - -6.527478332 93.723795416 - -6.440714028 93.699109264 - -6.416786202 93.608259710 - -6.479642262 93.542141984 - -6.566369574 93.566861931 - -6.590277872 93.657665912 -} -85ee5063fffffff -{ - -69.052200822 -42.663343153 - -68.988102583 -42.460862279 - -68.893839359 -42.514894800 - -68.863528752 -42.769447414 - -68.927233442 -42.971638051 - -69.021640957 -42.919572530 -} -85ac442bfffffff -{ - -24.275455000 2.675084946 - -24.364726666 2.653637218 - -24.429205487 2.728566411 - -24.404307344 2.824876621 - -24.315033200 2.846137656 - -24.250659535 2.771275288 -} -85a41987fffffff -{ - -23.143639655 -27.683853624 - -23.224160037 -27.732344390 - -23.299602515 -27.683316617 - -23.294456016 -27.585662185 - -23.213812195 -27.537210021 - -23.138438389 -27.586373408 -} -854173affffffff -{ - 19.766956090 108.706438563 - 19.857972415 108.685138846 - 19.888806809 108.592075941 - 19.828581079 108.520320279 - 19.737516291 108.541693061 - 19.706725657 108.634748497 -} -85e0c24bfffffff -{ - -51.247580555 57.492660807 - -51.163685335 57.509677114 - -51.120038589 57.406451266 - -51.160078868 57.286147248 - -51.243857619 57.268657927 - -51.287712804 57.371944873 -} -851a4523fffffff -{ - 47.223294366 -32.460459241 - 47.143707416 -32.533467853 - 47.063190940 -32.467965292 - 47.062176443 -32.329598980 - 47.141696031 -32.256402842 - 47.222297481 -32.321759742 -} -852d537bfffffff -{ - 43.501592262 42.686129501 - 43.439171488 42.775188715 - 43.464969014 42.887600333 - 43.553335301 42.911168308 - 43.615881345 42.821968706 - 43.589935614 42.709341349 -} -85a3505bfffffff -{ - -15.625379719 50.722419676 - -15.534601427 50.718977830 - -15.492908283 50.641053545 - -15.542024681 50.566464130 - -15.632894125 50.569851241 - -15.674556018 50.647882572 -} -85e86007fffffff -{ - -57.037940767 -94.323586659 - -56.963391737 -94.216921811 - -56.877718380 -94.279355236 - -56.866457851 -94.448044369 - -56.940865876 -94.554953975 - -57.026675334 -94.492931647 -} -859ce597fffffff -{ - -13.546732717 140.894096114 - -13.633315048 140.909103202 - -13.663288803 140.997870045 - -13.606718625 141.071636349 - -13.520132480 141.056654247 - -13.490120248 140.967880797 -} -855a0a53fffffff -{ - 15.997391699 170.890986917 - 16.084758706 170.895580293 - 16.131486372 170.814742030 - 16.090740225 170.729371815 - 16.003357827 170.724936074 - 15.956736820 170.805712867 -} -85137203fffffff -{ - 65.164672531 -113.597139037 - 65.078896505 -113.679534050 - 65.004436570 -113.552212858 - 65.015481728 -113.342684348 - 65.101123248 -113.259272586 - 65.175854600 -113.386401509 -} -852fa553fffffff -{ - 37.334742772 154.583850374 - 37.429263045 154.570216303 - 37.466322754 154.462435180 - 37.408835208 154.368511107 - 37.314392028 154.382368866 - 37.277359188 154.489927320 -} -857165cbfffffff -{ - 14.182882405 -164.442086485 - 14.091446054 -164.467854861 - 14.023646084 -164.401270245 - 14.047251118 -164.308856943 - 14.138724341 -164.282999708 - 14.206555703 -164.349644564 -} -856bb28ffffffff -{ - 8.100466602 14.971607828 - 8.015371433 14.974292425 - 7.971637416 15.054257907 - 8.012928101 15.131627150 - 8.098052055 15.129060539 - 8.141856655 15.049006647 -} -8512a933fffffff -{ - 54.772248152 -122.040815558 - 54.690413761 -122.077507147 - 54.624443080 -121.975214949 - 54.640098931 -121.836139657 - 54.721894404 -121.798863744 - 54.788073346 -121.901246470 -} -8500a093fffffff -{ - 76.129153425 60.546775334 - 76.145140601 60.907166159 - 76.229738135 61.014349074 - 76.298594598 60.757498858 - 76.282306036 60.393253349 - 76.197464551 60.289737705 -} -8540e67bfffffff -{ - 30.410030696 105.909766367 - 30.493424204 105.886375062 - 30.522892854 105.787738029 - 30.468949196 105.712510160 - 30.385522740 105.735975803 - 30.356072832 105.834595062 -} -85f19a9bfffffff -{ - -73.511983819 100.641129972 - -73.433204169 100.464995081 - -73.435393969 100.132177459 - -73.516381040 99.972574190 - -73.595515657 100.147355041 - -73.593308101 100.483111793 -} -8569243bfffffff -{ - 17.110347824 110.581925613 - 17.201911576 110.561677758 - 17.232888871 110.470964137 - 17.172248204 110.400499933 - 17.080629135 110.420821589 - 17.049706017 110.511533692 -} -85947257fffffff -{ - -11.112259899 128.585471792 - -11.200686451 128.601737391 - -11.234885739 128.689260739 - -11.180659654 128.760562105 - -11.092184338 128.744301793 - -11.057983823 128.656734761 -} -85e08e6bfffffff -{ - -50.994665470 64.996616041 - -50.907886528 64.997073621 - -50.870288052 64.879966062 - -50.919261052 64.762201835 - -51.005973823 64.761211397 - -51.043780124 64.878517738 -} -8578e017fffffff -{ - -4.252137958 -133.085570205 - -4.332625187 -133.118675392 - -4.394694531 -133.067856405 - -4.376326359 -132.984010503 - -4.295927731 -132.950915173 - -4.233808711 -133.001655795 -} -85b101b3fffffff -{ - -32.336260231 -122.311436841 - -32.286456394 -122.218469154 - -32.196555014 -122.220586285 - -32.156489763 -122.315406651 - -32.206182413 -122.408215090 - -32.296051294 -122.406362341 -} -85b6f54ffffffff -{ - -23.677971290 -91.694986198 - -23.747973418 -91.757443962 - -23.833530404 -91.719349472 - -23.849111511 -91.618729005 - -23.779106652 -91.556244302 - -23.693523443 -91.594406863 -} -85efac73fffffff -{ - -80.808341104 -14.798101723 - -80.718439713 -14.577857432 - -80.643361340 -14.947421927 - -80.657371040 -15.535020687 - -80.746709418 -15.763002768 - -80.822604417 -15.395761082 -} -85dc4cbbfffffff -{ - -50.431741057 -31.284029876 - -50.502880880 -31.356297498 - -50.583427302 -31.292374213 - -50.592806995 -31.155874911 - -50.521572258 -31.083638617 - -50.441052825 -31.147869572 -} -8534c15bfffffff -{ - 25.680525113 -26.324526601 - 25.602844944 -26.386198197 - 25.516374535 -26.341504951 - 25.507499922 -26.235265026 - 25.585077370 -26.173526941 - 25.671632113 -26.218094920 -} -85aaee2ffffffff -{ - -28.375186664 79.336073671 - -28.468195569 79.363698819 - -28.492848978 79.468858640 - -28.424493877 79.546242847 - -28.331542298 79.518505871 - -28.306888432 79.413496271 -} -858006cffffffff -{ - -5.398741696 -40.668816719 - -5.315217525 -40.618443042 - -5.230033172 -40.665873721 - -5.228361547 -40.763671667 - -5.311880463 -40.814061864 - -5.397076257 -40.766637740 -} -85c85d4bfffffff -{ - -42.783760733 98.877350021 - -42.708016276 98.813507977 - -42.709451938 98.687364112 - -42.786626691 98.624642933 - -42.862538090 98.688271348 - -42.861107806 98.814835577 -} -85604e03fffffff -{ - 8.678582509 66.827212883 - 8.759106999 66.800958015 - 8.775199448 66.726531235 - 8.710858875 66.678426639 - 8.630431021 66.704649987 - 8.614247156 66.779009491 -} -85866267fffffff -{ - -10.381747529 78.044236772 - -10.470697516 78.067473621 - -10.497801528 78.159009273 - -10.435929208 78.227197288 - -10.347042082 78.203871668 - -10.319964354 78.112446649 -} -8570c333fffffff -{ - -3.618336319 -167.904668227 - -3.698599435 -167.926601553 - -3.763916947 -167.865862976 - -3.749038255 -167.783127251 - -3.668760164 -167.761114461 - -3.603375661 -167.821916825 -} -856ad0d7fffffff -{ - -0.789451872 27.101476241 - -0.696725456 27.107119935 - -0.646199206 27.027795750 - -0.688341349 26.942811527 - -0.781052313 26.937106763 - -0.831636672 27.016447260 -} -8519b493fffffff -{ - 61.413759939 -23.631819649 - 61.430705557 -23.795028242 - 61.365101181 -23.914732298 - 61.282778661 -23.871105519 - 61.266023373 -23.708603507 - 61.331400792 -23.589023368 -} -8596406bfffffff -{ - -12.150275648 20.740045883 - -12.054143928 20.748343256 - -11.999253780 20.668235776 - -12.040447968 20.579845216 - -12.136534395 20.571488295 - -12.191471988 20.651581416 -} -85eee04bfffffff -{ - -69.556038907 -32.836408225 - -69.481045158 -32.661833224 - -69.390874995 -32.760875688 - -69.375426128 -33.032837253 - -69.450021833 -33.207865828 - -69.540463686 -33.110490127 -} -85324c97fffffff -{ - 33.767901970 156.647320387 - 33.863324241 156.636534282 - 33.903483033 156.533217903 - 33.848178539 156.440882112 - 33.752824133 156.451881821 - 33.712706234 156.555003955 -} -856b1017fffffff -{ - 12.480959388 20.112160327 - 12.390807287 20.110902205 - 12.343729551 20.193218183 - 12.386721883 20.276864225 - 12.476881126 20.278254011 - 12.524041023 20.195866086 -} -85e20dcbfffffff -{ - -57.600948877 -136.575887324 - -57.573724352 -136.424818409 - -57.485340108 -136.397483655 - -57.424301542 -136.520684640 - -57.451497033 -136.671161283 - -57.539759907 -136.699027748 -} -85f12d97fffffff -{ - -87.481052256 142.290533456 - -87.543880780 140.789101681 - -87.629681548 141.360991073 - -87.650977838 143.555688859 - -87.585009916 145.048764142 - -87.500948796 144.360149236 -} -856e60b3fffffff -{ - 6.006496445 -123.927415065 - 6.078460579 -123.888394140 - 6.152821808 -123.936171095 - 6.155116522 -124.022960636 - 6.083106913 -124.061879175 - 6.008847986 -124.014110689 -} -85a9a5d7fffffff -{ - -31.212930773 -44.535382165 - -31.147340317 -44.482584825 - -31.078220641 -44.531386535 - -31.074713952 -44.632960745 - -31.140321880 -44.685757128 - -31.209419020 -44.636980420 -} -850f11bbfffffff -{ - 67.743440872 -73.155938565 - 67.694457778 -73.374337595 - 67.598569420 -73.369608857 - 67.551663129 -73.148179218 - 67.600379434 -72.930613430 - 67.696267658 -72.933643888 -} -852c6163fffffff -{ - 47.287256761 49.635865279 - 47.218375898 49.727596827 - 47.239369950 49.858123126 - 47.329368401 49.897250840 - 47.398393340 49.805450007 - 47.377275520 49.674590172 -} -85f184a3fffffff -{ - -77.212123220 112.071672349 - -77.146837790 111.792733472 - -77.166572560 111.382934924 - -77.251803751 111.247882720 - -77.317591369 111.526455736 - -77.297643721 111.940476216 -} -85baa12bfffffff -{ - -31.780101012 -175.170156591 - -31.698359469 -175.119704114 - -31.618085115 -175.175013431 - -31.619528162 -175.280621704 - -31.701176138 -175.331097267 - -31.781474591 -175.275941768 -} -856655dbfffffff -{ - 5.179393212 -70.825185769 - 5.109393905 -70.875805301 - 5.027324795 -70.836915112 - 5.015329894 -70.747420539 - 5.085364443 -70.696867992 - 5.167358677 -70.735742926 -} -85efa657fffffff -{ - -81.574468835 9.116831353 - -81.478859255 9.095643557 - -81.434014476 8.537497347 - -81.484066345 7.993525523 - -81.579766797 8.002399015 - -81.625333141 8.567578133 -} -8506196ffffffff -{ - 68.145646515 -40.167485354 - 68.144861999 -40.406010074 - 68.063846567 -40.520081273 - 67.983896787 -40.396325296 - 67.984746228 -40.159438054 - 68.065480706 -40.044676922 -} -85052d6bfffffff -{ - 82.302560182 111.262471890 - 82.244494088 111.819417249 - 82.280469212 112.477462512 - 82.375207517 112.589208527 - 82.434230118 112.028334918 - 82.397547967 111.359560621 -} -85002bdbfffffff -{ - 80.134954427 25.611373343 - 80.196716606 25.946856624 - 80.280346988 25.773676171 - 80.301698736 25.258393743 - 80.239197639 24.924063909 - 80.156086579 25.103789551 -} -85c7b463fffffff -{ - -50.534609009 -132.017877716 - -50.497776218 -131.888383024 - -50.404844382 -131.873112100 - -50.348846765 -131.986901565 - -50.385627210 -132.115993407 - -50.478457408 -132.131697895 -} -8566c2b3fffffff -{ - 1.269801639 -76.159102441 - 1.195309659 -76.213376298 - 1.109813447 -76.174066003 - 1.098868659 -76.080478077 - 1.173396461 -76.026252905 - 1.258833231 -76.065566842 -} -8529b633fffffff -{ - 34.084153429 -112.716969860 - 34.165375791 -112.656679750 - 34.247837942 -112.711904592 - 34.249027315 -112.827488799 - 34.167771054 -112.887678569 - 34.085359319 -112.832384827 -} -8592f113fffffff -{ - -16.228590782 -107.035243229 - -16.293754958 -107.091340633 - -16.378884353 -107.063147199 - -16.398919603 -106.978763787 - -16.333738843 -106.922581847 - -16.248539411 -106.950867833 -} -85ee104bfffffff -{ - -74.510227247 -20.433057727 - -74.423655380 -20.268362531 - -74.342008039 -20.464464703 - -74.346456701 -20.823751457 - -74.432618666 -20.990717631 - -74.514742356 -20.796153201 -} -85bed3b3fffffff -{ - -25.501962012 148.959712895 - -25.409071650 148.939833391 - -25.378966952 148.839829465 - -25.441668845 148.759567530 - -25.534580464 148.779259649 - -25.564769074 148.879401244 -} -850b8543fffffff -{ - 57.542105560 84.232808909 - 57.452792890 84.286209160 - 57.430476744 84.456011289 - 57.497373248 84.572985689 - 57.586745257 84.520192098 - 57.609161734 84.349816004 -} -85d584abfffffff -{ - -52.148019527 -150.361857439 - -52.069135842 -150.321001171 - -52.012632079 -150.419788921 - -52.034948678 -150.559472208 - -52.113811545 -150.600608027 - -52.170378768 -150.501781506 -} -85ae40cbfffffff -{ - -22.807169556 101.288002245 - -22.887091172 101.323235904 - -22.898186745 101.407027893 - -22.829448834 101.455459649 - -22.749639139 101.420226458 - -22.738455508 101.336560903 -} -8502c233fffffff -{ - 70.857569331 -109.074455305 - 70.773657912 -109.199709945 - 70.697099250 -109.051315119 - 70.704132247 -108.778299089 - 70.787819848 -108.651600642 - 70.864698726 -108.799351205 -} -85178373fffffff -{ - 53.158321906 151.561596165 - 53.076827817 151.595601448 - 53.053202004 151.739321250 - 53.110926111 151.849580299 - 53.192524684 151.816173689 - 53.216295110 151.671908135 -} -855f240bfffffff -{ - -0.108577410 -56.719764220 - -0.028349649 -56.671180404 - 0.053676016 -56.713474129 - 0.055454997 -56.804286061 - -0.024723277 -56.852819974 - -0.106729995 -56.810591948 -} -859ccd27fffffff -{ - -9.787823725 136.132641200 - -9.878120485 136.148375728 - -9.910866944 136.238011227 - -9.853338377 136.311934187 - -9.763021365 136.296217647 - -9.730253103 136.206560093 -} -852e11d3fffffff -{ - 41.498519416 145.191504557 - 41.587159778 145.166622628 - 41.612337055 145.056680420 - 41.548898153 144.971896812 - 41.460367261 144.996963507 - 41.435165763 145.106629528 -} -8529a05bfffffff -{ - 33.904334251 -116.506331588 - 33.986961464 -116.449556353 - 34.067335571 -116.506808161 - 34.065024952 -116.620876290 - 33.982374898 -116.677526867 - 33.902058288 -116.620234308 -} -8580b49bfffffff -{ - -4.647869195 -32.813919877 - -4.564857349 -32.765753710 - -4.481223419 -32.812857939 - -4.480569163 -32.908154904 - -4.563593113 -32.956370336 - -4.647259220 -32.909239662 -} -85c0294bfffffff -{ - -34.129233355 -6.622770130 - -34.221924683 -6.658338690 - -34.293829035 -6.579144608 - -34.272940985 -6.464380765 - -34.180206281 -6.429018837 - -34.108402887 -6.508213759 -} -85382e5bfffffff -{ - 35.465283237 -0.228721050 - 35.375671016 -0.211854448 - 35.346274400 -0.113926557 - 35.405868506 -0.032777622 - 35.494928104 -0.049624959 - 35.524295740 -0.147756638 - 35.494466048 -0.188318575 -} -852d904ffffffff -{ - 30.483444730 38.216190298 - 30.390037796 38.198661881 - 30.329433201 38.281200823 - 30.362156285 38.381230727 - 30.455481428 38.398898800 - 30.516165337 38.316397558 -} -85264c63fffffff -{ - 36.353404037 -87.979560209 - 36.416340314 -87.907800160 - 36.502976616 -87.940887872 - 36.526716204 -88.045926317 - 36.463738693 -88.117772764 - 36.377062889 -88.084494486 -} -85f14b3bfffffff -{ - -81.115726503 22.312375492 - -81.023844279 22.156541489 - -80.998608305 21.583075771 - -81.064883393 21.155895716 - -81.157224124 21.302284596 - -81.182836459 21.885396067 -} -85df8c17fffffff -{ - -59.704858255 -47.358766711 - -59.649474767 -47.210618422 - -59.560111145 -47.233120951 - -59.526073201 -47.402796329 - -59.581177477 -47.550648639 - -59.670598154 -47.529122761 -} -85b906c3fffffff -{ - -36.773976212 136.523847822 - -36.679805046 136.516740456 - -36.637429722 136.414844415 - -36.689114042 136.319979368 - -36.783228954 136.326841947 - -36.825715933 136.428814272 -} -8590ad53fffffff -{ - -8.713469746 -119.146982622 - -8.773160679 -119.192804555 - -8.848997669 -119.173972293 - -8.865222100 -119.109240246 - -8.805500877 -119.063329485 - -8.729585496 -119.082239636 -} -854b0633fffffff -{ - 28.888798214 123.965092983 - 28.812935116 123.982423401 - 28.794551507 124.072542444 - 28.852078144 124.145391980 - 28.927963857 124.128058950 - 28.946300384 124.037878922 -} -859f417bfffffff -{ - -24.116922875 164.110321309 - -24.028244387 164.076174229 - -24.008607697 163.975200639 - -24.077642787 163.908189234 - -24.166417940 163.942215946 - -24.186061372 164.043374741 -} -851a1333fffffff -{ - 48.045997873 -48.042747529 - 48.027100166 -48.173578642 - 47.943216860 -48.221697905 - 47.878405089 -48.139304388 - 47.897293072 -48.008955373 - 47.981002506 -47.960518982 -} -85ccd1bbfffffff -{ - -36.326279297 75.916461698 - -36.416668848 75.943502075 - -36.442198922 76.056519065 - -36.377328587 76.142335079 - -36.286974426 76.115149778 - -36.261455117 76.002293115 -} -85d0332ffffffff -{ - -45.901524942 10.148945509 - -45.991997860 10.131971571 - -46.043918173 10.232076748 - -46.005310034 10.348964018 - -45.914885772 10.365616323 - -45.863020837 10.265702965 -} -85559233fffffff -{ - 20.711070813 -23.767813962 - 20.636969134 -23.828237059 - 20.552853195 -23.788266064 - 20.542761445 -23.687997320 - 20.616752214 -23.627531943 - 20.700945581 -23.667377306 +858bb507fffffff +{ + -14.953572108 -55.628422592 + -14.877999082 -55.578438835 + -14.795000432 -55.622194388 + -14.787620267 -55.715868362 + -14.863182169 -55.765803910 + -14.946135371 -55.722113796 +} +85f036cbfffffff +{ + -79.048589127 96.549548650 + -78.970688769 96.320483158 + -78.965897800 95.839000179 + -79.038954078 95.580467155 + -79.117332559 95.805888399 + -79.122177247 96.293543296 +} +85749e87fffffff +{ + -2.715487316 -11.198815647 + -2.642867893 -11.164561788 + -2.570623898 -11.202290189 + -2.570936620 -11.274347711 + -2.643601724 -11.308688430 + -2.715908443 -11.270884765 +} +8568b113fffffff +{ + 0.937775947 113.085811869 + 1.025870134 113.067728246 + 1.050186853 112.983799745 + 0.986325797 112.917949492 + 0.898186723 112.936101307 + 0.873953541 113.020035207 +} +85ee5d2ffffffff +{ + -66.095837577 -49.316079061 + -66.040611477 -49.122827252 + -65.946417083 -49.143906252 + -65.907403567 -49.356633661 + -65.962301162 -49.549300560 + -66.056539579 -49.529826714 +} +857a8e8ffffffff +{ + 6.682740582 47.375532614 + 6.764188159 47.373531196 + 6.811333853 47.300485665 + 6.777062551 47.229358089 + 6.695559380 47.231309738 + 6.648383052 47.304438780 +} +8566f563fffffff +{ + 4.026948069 -76.463776143 + 3.954319476 -76.517732768 + 3.870334737 -76.478782378 + 3.859039185 -76.385870532 + 3.931708925 -76.331960517 + 4.015633071 -76.370915610 +} +85732c1bfffffff +{ + 14.123192309 133.667869277 + 14.030206213 133.684397302 + 13.998415255 133.776791574 + 14.059632227 133.852689458 + 14.152632845 133.836176331 + 14.184402036 133.743750347 +} +8546889bfffffff +{ + 18.594255508 -172.310191074 + 18.505643660 -172.331438176 + 18.444748559 -172.266653258 + 18.472453886 -172.180529463 + 18.561136052 -172.159184837 + 18.622042586 -172.224061520 +} +8500537bfffffff +{ + 85.774509537 24.830945208 + 85.841478728 25.626027973 + 85.928513118 25.196762683 + 85.947374361 23.934301862 + 85.878684240 23.147695204 + 85.792869585 23.614003450 +} +8588194bfffffff +{ + -4.061050456 -154.067854607 + -4.144871829 -154.096766648 + -4.211803825 -154.034689523 + -4.194980362 -153.943693770 + -4.111188647 -153.914725583 + -4.044190675 -153.976809185 +} +85ef7317fffffff +{ + -77.717834311 -64.680052537 + -77.684672565 -64.257819235 + -77.589410383 -64.183362093 + -77.527554733 -64.525593029 + -77.560339644 -64.943173000 + -77.655353484 -65.023146956 +} +8551591bfffffff +{ + 18.951873398 -137.063678933 + 18.865562479 -137.100106733 + 18.790208535 -137.040518011 + 18.801163715 -136.944582871 + 18.887417794 -136.908152225 + 18.962773545 -136.967659417 +} +85541c27fffffff +{ + 14.954059344 -14.395482722 + 14.887633640 -14.457277968 + 14.808486335 -14.428848373 + 14.795723262 -14.338764738 + 14.862032984 -14.276989140 + 14.941221640 -14.305277374 +} +856c602bfffffff +{ + 5.337441703 -87.984672068 + 5.264394038 -88.041638829 + 5.181499078 -88.005402461 + 5.171679816 -87.912153586 + 5.244785190 -87.855181158 + 5.327652072 -87.891463149 +} +85d2462bfffffff +{ + -40.209732609 -114.515376205 + -40.151575140 -114.414305565 + -40.056226370 -114.429265527 + -40.019019936 -114.544952630 + -40.077041014 -114.645901000 + -40.172404669 -114.631284744 +} +85495e83fffffff +{ + 22.411404059 -113.979428886 + 22.494373429 -113.925703612 + 22.579254883 -113.976511914 + 22.581094651 -114.081094917 + 22.498076903 -114.134730483 + 22.413267751 -114.083873017 +} +85dac84bfffffff +{ + -47.286824684 155.183242318 + -47.197145741 155.148615877 + -47.172296100 155.014024778 + -47.237082026 154.913772127 + -47.326805856 154.948107461 + -47.351699029 155.082987120 +} +852e14c3fffffff +{ + 41.055707666 147.371576822 + 41.145814959 147.349113834 + 41.173581294 147.238514851 + 41.111253086 147.150649588 + 41.021249200 147.173311857 + 40.993470056 147.283640570 +} +850c8ddbfffffff +{ + 59.450108726 -167.987135701 + 59.372006217 -168.064660578 + 59.304877451 -167.969345143 + 59.315607704 -167.796891113 + 59.393464090 -167.718849884 + 59.460836357 -167.813775886 +} +85d683bbfffffff +{ + -44.617633977 40.509061024 + -44.695936553 40.504433580 + -44.747789362 40.590508196 + -44.721296393 40.681274710 + -44.642912458 40.685747991 + -44.591102813 40.599609188 +} +8558209bfffffff +{ + 17.338263193 5.127589226 + 17.248544595 5.138120986 + 17.208020715 5.222935617 + 17.257190514 5.297354527 + 17.346991018 5.286937049 + 17.387539869 5.201986230 +} +85762d4ffffffff +{ + 3.581868898 160.507152678 + 3.492713763 160.517946222 + 3.458975824 160.594880202 + 3.514317592 160.660972897 + 3.603385508 160.650220353 + 3.637198865 160.573334116 +} +852762dbfffffff +{ + 48.112203916 -86.493718419 + 48.050906675 -86.597909641 + 47.960346326 -86.567174642 + 47.930977286 -86.432716203 + 47.992064970 -86.328548142 + 48.082730951 -86.358814429 +} +850c9153fffffff +{ + 58.773827972 -177.074145746 + 58.690571827 -177.126171854 + 58.630531169 -177.009791068 + 58.653471380 -176.841494459 + 58.736540528 -176.788757015 + 58.796856806 -176.905024953 +} +85076803fffffff +{ + 62.056967939 -16.238234315 + 62.082304049 -16.390503673 + 62.025261895 -16.522313830 + 61.970465990 -16.508433398 + 61.945837782 -16.488635900 + 61.926171858 -16.310982046 + 61.980294772 -16.192306170 + 62.029576089 -16.231580242 +} +85014507fffffff +{ + 76.198540925 1.445402999 + 76.271621165 1.545223567 + 76.331687525 1.294466822 + 76.318127807 0.943627077 + 76.244780310 0.847036375 + 76.185257870 1.098034030 +} +85e2a603fffffff +{ + -63.802040858 -122.468980538 + -63.760545950 -122.293074762 + -63.672426101 -122.296874265 + -63.625830526 -122.475636122 + -63.667184648 -122.650969213 + -63.755274567 -122.648112623 +} +851a3677fffffff +{ + 52.086306328 -49.496344406 + 52.066497680 -49.641528744 + 51.979312411 -49.691873800 + 51.912114545 -49.597449972 + 51.931903565 -49.452853845 + 52.018909981 -49.402094945 +} +85b636abfffffff +{ + -31.664450487 -91.425929030 + -31.596304464 -91.363218593 + -31.513287513 -91.405423376 + -31.498280747 -91.510201328 + -31.566301548 -91.573031192 + -31.649454351 -91.530964159 +} +85023027fffffff +{ + 80.823017716 -116.700839828 + 80.800983447 -117.249250527 + 80.713586183 -117.425561249 + 80.648754131 -117.061179800 + 80.670548253 -116.521635003 + 80.757411156 -116.337696312 +} +8503208bfffffff +{ + 89.223093143 -4.727229134 + 89.312103614 -3.382062558 + 89.370672789 -9.754330065 + 89.329315206 -16.998318140 + 89.238736439 -16.754073240 + 89.189975166 -10.919500933 +} +852d03a3fffffff +{ + 41.632694503 35.713960158 + 41.543278958 35.696532045 + 41.483879167 35.792529607 + 41.513832534 35.905930889 + 41.603188698 35.923549169 + 41.662650984 35.827576319 +} +8526b14ffffffff +{ + 41.953498220 -108.701070545 + 42.027838699 -108.632722117 + 42.106760602 -108.689279603 + 42.111306590 -108.814298813 + 42.036927858 -108.882564724 + 41.958041413 -108.825894389 +} +8504e5affffffff +{ + 72.899826537 163.138198848 + 72.802960131 163.148798040 + 72.757365678 163.436475898 + 72.808232124 163.715228035 + 72.905101667 163.707789811 + 72.951103936 163.418437411 +} +85551a23fffffff +{ + 20.987521809 -14.160220887 + 20.917953654 -14.226344746 + 20.833013653 -14.196224353 + 20.817607868 -14.100141868 + 20.887060457 -14.034042017 + 20.972034271 -14.064000458 +} +85ed30abfffffff +{ + -64.252424590 167.793109003 + -64.252408127 167.618440403 + -64.324864022 167.545184744 + -64.397456696 167.647345164 + -64.397339877 167.822991359 + -64.324764048 167.895496137 +} +85d3ae23fffffff +{ + -52.286895221 -103.646075197 + -52.218891070 -103.533800131 + -52.125953807 -103.573632642 + -52.100932499 -103.725282343 + -52.168784414 -103.837579175 + -52.261809632 -103.798205667 +} +854e2233fffffff +{ + 18.555544879 153.065119112 + 18.466879492 153.078226435 + 18.428501500 153.164535730 + 18.478762879 153.237704886 + 18.567365803 153.224638480 + 18.605769842 153.138361976 +} +8502ab57fffffff +{ + 74.198261114 -121.945803614 + 74.110044121 -122.025513488 + 74.048626552 -121.805271494 + 74.075070140 -121.504908392 + 74.163180977 -121.422478086 + 74.224955901 -121.643121280 +} +85b3a8c7fffffff +{ + -22.008666749 -74.793305376 + -22.085825206 -74.850940511 + -22.167997701 -74.808565549 + -22.172989597 -74.708556973 + -22.095847013 -74.650984590 + -22.013696684 -74.693357873 +} +850aae53fffffff +{ + 59.787608022 96.921742007 + 59.698028000 96.946530476 + 59.659906944 97.106881857 + 59.711214282 97.242832326 + 59.800767760 97.218782988 + 59.839040854 97.058043859 +} +8548e073fffffff +{ + 29.993293929 -108.810604258 + 30.074234765 -108.749443003 + 30.160264558 -108.800194975 + 30.165307615 -108.912198455 + 30.084317847 -108.973292737 + 29.998333971 -108.922450834 +} +858f9aa7fffffff +{ + -8.139416797 -92.409265626 + -8.215491555 -92.468663171 + -8.304685096 -92.432731413 + -8.317813508 -92.337338210 + -8.241701038 -92.277912860 + -8.152497905 -92.313908399 +} +850174a3fffffff +{ + 73.855169880 12.268581526 + 73.920186503 12.405688242 + 73.988394840 12.239530186 + 73.991151615 11.935052379 + 73.925778974 11.799532643 + 73.858005164 11.966886767 +} +85605a03fffffff +{ + 11.739256205 67.295832414 + 11.819569797 67.269194937 + 11.833705914 67.193333331 + 11.767622950 67.144178532 + 11.687399893 67.170784511 + 11.673169304 67.246576829 +} +851a9b8bfffffff +{ + 41.619253458 -53.523062532 + 41.533803416 -53.559192522 + 41.467630145 -53.486598704 + 41.486821143 -53.377788996 + 41.572298523 -53.341390219 + 41.638557672 -53.414069735 +} +8500f037fffffff +{ + 82.644475139 67.836379829 + 82.652313744 68.543808195 + 82.736939877 68.843301376 + 82.814433020 68.424680058 + 82.806325689 67.701509240 + 82.720997807 67.412926896 +} +85be494ffffffff +{ + -35.005210859 139.623682838 + -34.910308490 139.612928814 + -34.870731859 139.509590873 + -34.925949539 139.416907921 + -35.020812939 139.427422329 + -35.060497771 139.530859293 +} +85481873fffffff +{ + 27.522169112 -106.652071555 + 27.602658270 -106.590754627 + 27.690010898 -106.638913546 + 27.696831872 -106.748488791 + 27.616285233 -106.809756312 + 27.528975129 -106.761498292 +} +85326e93fffffff +{ + 31.864881574 158.405659773 + 31.960635081 158.397031752 + 32.002779924 158.296025607 + 31.949119593 158.203824369 + 31.853424606 158.212662782 + 31.811331299 158.313492232 +} +857a152bfffffff +{ + 1.047341667 46.698873782 + 1.134374255 46.697061897 + 1.182252814 46.621735368 + 1.143119491 46.548134256 + 1.056021820 46.549892904 + 1.008122512 46.625305950 +} +85ef61d3fffffff +{ + -76.107317137 -80.390809709 + -76.098666919 -80.000872460 + -76.011793870 -79.835292323 + -75.934031039 -80.056851717 + -75.942643785 -80.442249194 + -76.029056321 -80.610591820 } -853f69c3fffffff +85f29387fffffff { - 36.868638214 32.277261430 - 36.775017811 32.263849699 - 36.717193986 32.358603602 - 36.752921630 32.466777112 - 36.846491466 32.480374220 - 36.904384341 32.385612666 + -89.915696433 -140.297307936 + -89.949985838 -57.757362933 + -89.858736589 -55.603769920 + -89.793429041 -78.463827775 + -89.780266586 -103.227958204 + -89.826299528 -126.505360119 } -8509ab53fffffff +85dc4357fffffff { - 61.725031390 5.190167968 - 61.692411566 5.064293805 - 61.616717297 5.079879796 - 61.573687133 5.220797975 - 61.606262741 5.346260931 - 61.681912486 5.331216430 + -50.475005699 -27.553134572 + -50.549222605 -27.622578178 + -50.628528528 -27.552028750 + -50.633573653 -27.411757217 + -50.559261321 -27.342395104 + -50.479999344 -27.413222199 } -85f31ea7fffffff +85a326abfffffff { - -77.136575746 -166.187909787 - -77.216331449 -166.142985780 - -77.242122249 -165.783692031 - -77.187713132 -165.472631919 - -77.108066456 -165.521966764 - -77.082716795 -165.877965457 + -10.483827817 44.173198926 + -10.389867331 44.172258291 + -10.342498758 44.091655089 + -10.389091956 44.011903378 + -10.483120578 44.012781914 + -10.530487904 44.093474308 } -85f29d53fffffff +85126957fffffff { - -87.548282396 -96.236314696 - -87.567343416 -94.111042809 - -87.495164021 -92.770891697 - -87.406830515 -93.532544989 - -87.388831158 -95.532722288 - -87.458154356 -96.891532193 -} -8548a16bfffffff -{ - 26.227913823 -102.029433189 - 26.306246910 -101.966344218 - 26.394821567 -102.010288763 - 26.405036034 -102.117443428 - 26.326636281 -102.180516112 - 26.238088776 -102.136450678 -} -856fa203fffffff -{ - -0.924833100 -109.604290607 - -0.858383314 -109.556669193 - -0.787222916 -109.596989986 - -0.782586729 -109.684984798 - -0.849116071 -109.732561462 - -0.920202034 -109.692188221 -} -8512d3c3fffffff -{ - 50.023015674 -120.920429926 - 49.945515981 -120.955239706 - 49.879571094 -120.866541430 - 49.890928554 -120.742980851 - 49.968379170 -120.707724255 - 50.034521736 -120.796474325 -} -856a2583fffffff -{ - 11.586946805 26.292211392 - 11.497712742 26.286125311 - 11.449331727 26.365165434 - 11.490088982 26.450329907 - 11.579299059 26.456542567 - 11.627775988 26.377464234 -} -85efa44bfffffff -{ - -82.299530807 6.246827478 - -82.203897852 6.258364597 - -82.155203964 5.664702042 - -82.201307058 5.052366293 - -82.296933739 5.026071323 - -82.346474009 5.626863856 -} -8526a60ffffffff -{ - 43.539255312 -106.666119347 - 43.610994015 -106.595115027 - 43.689459100 -106.650900805 - 43.696154801 -106.777824125 - 43.624374784 -106.848761970 - 43.545940414 -106.792843431 -} -85bc915bfffffff -{ - -25.232935210 39.103954381 - -25.140852654 39.105086483 - -25.096687394 39.017007798 - -25.144619202 38.927714763 - -25.236743030 38.926506728 - -25.280893851 39.014667694 -} -85e06573fffffff -{ - -61.396630601 45.672217706 - -61.313960540 45.727419455 - -61.253865512 45.620679890 - -61.276232406 45.458984562 - -61.358692255 45.403185781 - -61.418995491 45.509676577 -} -85056167fffffff -{ - 85.484717056 163.259565542 - 85.390389129 163.295594071 - 85.343757964 164.330840126 - 85.390042325 165.351312834 - 85.484389833 165.357562037 - 85.532463438 164.301055319 -} -85aac537fffffff -{ - -29.224357770 78.900739319 - -29.317284486 78.928265389 - -29.342079665 79.034250128 - -29.273947084 79.112557376 - -29.181074952 79.084915909 - -29.156280749 78.979082343 -} -857d8817fffffff -{ - -2.582739257 -17.144743308 - -2.506277313 -17.105807913 - -2.429750769 -17.147159567 - -2.429625489 -17.227517055 - -2.506125837 -17.266538449 - -2.582713080 -17.225116387 -} -85e11a93fffffff -{ - -62.424273878 68.754875625 - -62.330999856 68.743474016 - -62.290000880 68.570658243 - -62.342035494 68.408720349 - -62.435264339 68.419042251 - -62.476504447 68.592381668 -} -85efa427fffffff -{ - -82.516733260 -1.364616401 - -82.421900539 -1.258222750 - -82.363061905 -1.819302972 - -82.398088219 -2.490586587 - -82.492644834 -2.612006540 - -82.552461350 -2.047210383 -} -85d7a8b7fffffff -{ - -53.081298920 41.007249545 - -53.007086169 41.057818659 - -52.953347131 40.987145415 - -52.973661537 40.866112997 - -53.047689198 40.815271802 - -53.101587468 40.885733879 -} -85610e4bfffffff -{ - 6.417197679 79.008361967 - 6.506118422 78.980892699 - 6.527403415 78.893335170 - 6.459823098 78.833318380 - 6.370982883 78.860782133 - 6.349642467 78.948268287 -} -85105ba7fffffff -{ - 63.708713739 65.131318613 - 63.634577209 65.240768841 - 63.639070456 65.448927983 - 63.717726240 65.548581461 - 63.792036351 65.439500943 - 63.787516998 65.230393725 -} -85050adbfffffff -{ - 78.426182220 124.846811222 - 78.350908122 125.147302012 - 78.365442893 125.620866030 - 78.455470430 125.800377279 - 78.531408956 125.501283913 - 78.516653236 125.021223616 -} -8502cb4bfffffff -{ - 68.070960384 -103.194164761 - 67.990415261 -103.327270031 - 67.907428901 -103.213654140 - 67.904713435 -102.967750073 - 67.985013567 -102.833777484 - 68.068274198 -102.946568227 -} -85f2b22ffffffff -{ - -87.470516814 158.266212930 - -87.549005825 157.234962320 - -87.624228422 158.376550995 - -87.618126590 160.610321584 - -87.537099805 161.559936989 - -87.464697414 160.363246089 -} -851e2cd7fffffff -{ - 51.704546897 20.285576172 - 51.622594219 20.283482244 - 51.581780159 20.406887228 - 51.622865689 20.532545713 - 51.704823014 20.534936221 - 51.745690349 20.411371654 -} -859a883bfffffff -{ - -7.718306322 -169.388614974 - -7.640510550 -169.350406031 - -7.575268838 -169.400382771 - -7.587742506 -169.488489243 - -7.665439485 -169.526739362 - -7.730761563 -169.476842013 -} -852b02d3fffffff -{ - 47.005323655 -65.632558870 - 46.965609406 -65.757650527 - 46.874510046 -65.770986863 - 46.823187935 -65.659715746 - 46.862763620 -65.534974417 - 46.953799621 -65.521154354 -} -8534d12bfffffff -{ - 24.886491872 -28.955979503 - 24.808202176 -29.014722462 - 24.723006411 -28.968043391 - 24.716005852 -28.862727746 - 24.794198054 -28.803900625 - 24.879488293 -28.850472963 -} -85038c5bfffffff -{ - 80.033971782 -139.974887882 - 79.978272033 -140.403098724 - 79.885532398 -140.354810306 - 79.848427285 -139.886619115 - 79.903462570 -139.461466611 - 79.996261694 -139.501426713 -} -85ae442ffffffff -{ - -22.065013231 101.354472298 - -22.144902467 101.389485348 - -22.156436615 101.472648864 - -22.088168785 101.520674597 - -22.008392498 101.485662278 - -21.996771168 101.402623358 -} -851b30a7fffffff -{ - 59.903308016 -49.095629614 - 59.886290685 -49.276601795 - 59.797233253 -49.340265131 - 59.725395903 -49.223592162 - 59.742394325 -49.043535284 - 59.831248845 -48.979239206 -} -85dc98dbfffffff -{ - -47.813017593 -5.226525920 - -47.901780887 -5.267270322 - -47.967835000 -5.170928135 - -47.945035734 -5.033859337 - -47.856239647 -4.993422583 - -47.790275461 -5.089746398 -} -85f1a9b3fffffff -{ - -80.263195061 99.584396917 - -80.188685947 99.307161608 - -80.188504589 98.769283013 - -80.262838562 98.500992752 - -80.337920995 98.774370337 - -80.338096112 99.319975202 -} -8500ce17fffffff -{ - 86.691398244 91.816777655 - 86.662407581 93.329163165 - 86.723995938 94.571953022 - 86.816772977 94.314200191 - 86.847153619 92.736555947 - 86.783319791 91.483449202 -} -859b1d87fffffff -{ - -19.981547584 -173.631205008 - -19.898446483 -173.586689492 - -19.822884353 -173.637859845 - -19.830370111 -173.733428683 - -19.913362431 -173.777971273 - -19.988977716 -173.726918176 -} -8586a5c7fffffff -{ - -3.939068677 87.706807659 - -3.850928515 87.680782065 - -3.826210320 87.590599962 - -3.889626925 87.526501589 - -3.977709017 87.552545304 - -4.002432603 87.642669378 -} -852f1c77fffffff -{ - 35.822932880 149.259287218 - 35.915106400 149.240234318 - 35.947382089 149.136158401 - 35.887482910 149.051367493 - 35.795410426 149.070605881 - 35.763136026 149.174450051 -} -855d1b27fffffff -{ - 16.826934600 -152.395452007 - 16.734838588 -152.427662395 - 16.662225498 -152.360397257 - 16.681682368 -152.260923415 - 16.773768216 -152.228651851 - 16.846407406 -152.295915155 -} -85e31553fffffff -{ - -67.028611012 -141.778940467 - -67.014498818 -141.581387096 - -66.935749012 -141.531669798 - -66.871251926 -141.678718057 - -66.885342741 -141.875191154 - -66.963951770 -141.925692423 -} -85ef344ffffffff -{ - -86.665097173 -29.654277751 - -86.588792729 -28.710920105 - -86.503929360 -29.369399875 - -86.493713843 -30.922496367 - -86.567866185 -31.887701828 - -86.654368295 -31.280194978 -} -85330ad7fffffff -{ - 29.190128271 171.551513557 - 29.286516995 171.557556336 - 29.338980820 171.464431933 - 29.294954697 171.365341819 - 29.198545794 171.359509407 - 29.146183035 171.452556658 -} -859d9aabfffffff -{ - -10.119107643 152.162792861 - -10.205711276 152.175584709 - -10.233188125 152.259085783 - -10.174131247 152.329767195 - -10.087566663 152.317012443 - -10.060019847 152.233539158 -} -85bd532bfffffff -{ - -37.128843990 29.256930201 - -37.047419757 29.262602965 - -37.003172499 29.168837013 - -37.040347958 29.069362117 - -37.121772383 29.063603313 - -37.166021255 29.157405409 -} -85af868ffffffff -{ - -28.238875216 85.496547962 - -28.329109980 85.527898689 - -28.348763799 85.630685783 - -28.278212943 85.701961277 - -28.188057542 85.670529211 - -28.168373608 85.567902730 -} -8526dcdbfffffff -{ - 34.751722368 -100.618464787 - 34.825897463 -100.549992509 - 34.912657205 -100.595926155 - 34.925229369 -100.710479494 - 34.851001494 -100.778944267 - 34.764254287 -100.732863513 -} -85701c93fffffff -{ - 3.610066656 -170.881037639 - 3.525152094 -170.901833567 - 3.459375905 -170.840445810 - 3.478460815 -170.758185250 - 3.563416178 -170.737303740 - 3.629245886 -170.798768353 -} -85452087fffffff -{ - 15.012787139 -88.707705516 - 15.083150457 -88.647877136 - 15.166641320 -88.676147682 - 15.179777684 -88.764378460 - 15.109325704 -88.824263677 - 15.025826115 -88.795861354 -} -85795e67fffffff -{ - 2.082940696 -130.337396918 - 2.000214105 -130.371286180 - 1.933467653 -130.321542254 - 1.949414148 -130.237998082 - 2.032045774 -130.204127353 - 2.098825819 -130.253782177 -} -85f39b07fffffff -{ - -84.611819583 176.790483559 - -84.698145063 176.614646844 - -84.751294304 177.370646763 - -84.716708377 178.296498565 - -84.629893363 178.445219164 - -84.578136041 177.695447423 -} -8504186bfffffff -{ - 71.616980283 150.605552958 - 71.522791805 150.679739124 - 71.495817109 150.974090101 - 71.562786100 151.196566670 - 71.657173722 151.124846665 - 71.684394765 150.828172946 + 55.426466286 -100.260596809 + 55.350850802 -100.355174160 + 55.264414535 -100.286655070 + 55.253390596 -100.123977889 + 55.328811352 -100.029088863 + 55.415450748 -100.097186401 } -85f2944bfffffff +854b9883fffffff { - -88.095455836 132.943824501 - -88.146748729 130.648111973 - -88.236040106 130.907877629 - -88.273105841 133.713697579 - -88.217745481 136.078038054 - -88.129553602 135.573293216 + 20.151328559 123.037357139 + 20.066400052 123.054423008 + 20.042994596 123.142559419 + 20.104576237 123.213691065 + 20.189546649 123.196621055 + 20.212893570 123.108423472 } -8548f683fffffff -{ - 29.056981600 -104.526863366 - 29.136046550 -104.463532180 - 29.223745673 -104.510624577 - 29.232347048 -104.621162160 - 29.153223812 -104.684458032 - 29.065557525 -104.637251932 -} -85253187fffffff -{ - 52.328757946 91.677531756 - 52.236478500 91.709428174 - 52.206134927 91.851774445 - 52.267936442 91.962579070 - 52.360216302 91.931200549 - 52.390694531 91.788499006 -} -85c558c3fffffff -{ - -38.389628086 -29.543264471 - -38.469588690 -29.602735667 - -38.552107888 -29.546586046 - -38.554629451 -29.430758096 - -38.474558804 -29.371325068 - -38.392076708 -29.427681365 -} -850ac3a3fffffff -{ - 64.951335824 109.832348996 - 64.894363153 110.008707344 - 64.927900145 110.209917278 - 65.018680485 110.235718551 - 65.075966197 110.058895236 - 65.042157470 109.856733773 -} -850c81cffffffff -{ - 59.995897195 -171.559388051 - 59.914834972 -171.629039130 - 59.849491808 -171.522005152 - 59.864945443 -171.345616704 - 59.945776308 -171.275328378 - 60.011385054 -171.382062477 -} -85250807fffffff -{ - 50.660582862 99.279939207 - 50.568890899 99.295162853 - 50.531359612 99.420845360 - 50.585364979 99.531521047 - 50.677004827 99.516773343 - 50.714691684 99.390874056 -} -85002a2ffffffff -{ - 80.356456627 27.497830266 - 80.416593748 27.854854547 - 80.501432556 27.694660008 - 80.525645865 27.170140918 - 80.464743698 26.813754527 - 80.380396797 26.981175534 -} -85ae5b77fffffff -{ - -25.678486414 104.331282127 - -25.755310716 104.367743062 - -25.762561942 104.449646203 - -25.693087772 104.494965524 - -25.616369546 104.458517685 - -25.609019484 104.376737308 -} -85ad3677fffffff -{ - -33.615816580 18.427384388 - -33.532171482 18.437418321 - -33.478612221 18.350825286 - -33.508689942 18.254229276 - -33.592302467 18.244127511 - -33.645869925 18.330689488 -} -85f29a97fffffff -{ - -88.192394148 -59.708511900 - -88.153384266 -57.053723713 - -88.060828986 -56.929035417 - -88.007826873 -59.221242693 - -88.043785525 -61.718313037 - -88.135635591 -62.076943959 -} -855c74cffffffff -{ - 13.779488000 -146.099694100 - 13.688206153 -146.133673053 - 13.613834840 -146.069568440 - 13.630717613 -145.971520835 - 13.721960329 -145.937504613 - 13.796359435 -146.001573109 -} -856b6327fffffff -{ - 15.520393870 31.400663506 - 15.428824800 31.390358565 - 15.376954663 31.468601763 - 15.416552662 31.557160441 - 15.508070778 31.567591616 - 15.560041946 31.489337995 -} -85c7161bfffffff -{ - -48.292979954 -138.492027147 - -48.262925870 -138.369949596 - -48.173163341 -138.344580804 - -48.113587289 -138.440958279 - -48.143630473 -138.562638235 - -48.233260517 -138.588337481 -} -8552e14ffffffff -{ - 14.538719406 46.596868222 - 14.454688066 46.576683962 - 14.402419018 46.637893330 - 14.434083502 46.719221285 - 14.518008849 46.739476570 - 14.570375690 46.678333043 -} -85f2a1affffffff -{ - -83.829249181 -148.150632015 - -83.909147893 -147.794074546 - -83.911324469 -146.949594729 - -83.833368056 -146.483522240 - -83.754360883 -146.853129072 - -83.752415229 -147.676121981 -} -856f8053fffffff -{ - 0.938005213 -109.102837417 - 1.006492217 -109.054217614 - 1.079772031 -109.094863961 - 1.084490180 -109.184186347 - 1.015921654 -109.232762279 - 0.942716515 -109.192059860 -} -85c8a973fffffff -{ - -36.016073042 106.565682761 - -35.950996879 106.499695416 - -35.959657419 106.391078050 - -36.033441351 106.348143310 - -36.098688061 106.414048930 - -36.089980176 106.522971623 -} -85038583fffffff +8503266bfffffff { - 81.458195758 -149.485757035 - 81.390848981 -149.922758313 - 81.299706025 -149.764055067 - 81.275545468 -149.178547473 - 81.342040621 -148.742048116 - 81.433541773 -148.890458879 -} -85df4987fffffff -{ - -51.577971865 -67.336374532 - -51.549451224 -67.204188003 - -51.471808981 -67.174260370 - -51.422803905 -67.276010933 - -51.451208672 -67.407719578 - -51.528734050 -67.438154519 -} -8509487bfffffff -{ - 70.311547151 16.885537558 - 70.369232413 17.012413506 - 70.437231088 16.896485604 - 70.447216691 16.652649009 - 70.389208064 16.526542144 - 70.321537224 16.643494017 -} -85b03597fffffff -{ - -29.470252812 -117.910968916 - -29.417789816 -117.823695094 - -29.329761743 -117.831689138 - -29.294198974 -117.926710211 - -29.346535432 -118.013869456 - -29.434560985 -118.006122247 -} -85aedc63fffffff -{ - -31.920395644 102.050455841 - -31.997151656 102.088871854 - -32.001515978 102.178923710 - -31.929219424 102.230412699 - -31.852556463 102.192000966 - -31.848097046 102.102095794 -} -85288287fffffff -{ - 44.574042701 -115.020923372 - 44.649486157 -114.956366673 - 44.722267453 -115.019050929 - 44.719559575 -115.146356081 - 44.644090611 -115.210770578 - 44.571355022 -115.148022597 -} -856b0207fffffff -{ - 13.245699288 21.964899935 - 13.154805588 21.962154341 - 13.106792267 22.044411508 - 13.149586495 22.129477548 - 13.240477990 22.132356584 - 13.288577589 22.050036152 -} -85370457fffffff -{ - 41.618815735 -149.997238330 - 41.547685040 -150.034643122 - 41.490166155 -149.959531235 - 41.503772740 -149.847034068 - 41.574898223 -149.809562024 - 41.632422383 -149.884654173 -} -8505a65bfffffff -{ - 70.855647411 110.354465002 - 70.797128128 110.584676010 - 70.832408605 110.850346334 - 70.926537867 110.887485250 - 70.985454072 110.656518466 - 70.949842346 110.389163926 -} -85db0d27fffffff -{ - -58.020256824 172.886775385 - -57.950518456 172.820893856 - -57.951373172 172.663212334 - -58.021992189 172.570928510 - -58.091823079 172.636633888 - -58.090942418 172.794800522 -} -859d0a63fffffff -{ - -18.936896919 147.795984032 - -18.848735906 147.778654642 - -18.820362370 147.686240449 - -18.880060898 147.611042191 - -18.968241561 147.628207481 - -18.996704187 147.720735238 -} -85eea20ffffffff -{ - -72.833086490 -8.803805723 - -72.740439487 -8.715757918 - -72.670797767 -8.940879822 - -72.693336593 -9.254039147 - -72.785762568 -9.344765190 - -72.855872358 -9.119668037 -} -857a8e27fffffff -{ - 7.094210342 46.861541660 - 7.175462011 46.859721101 - 7.222588930 46.786479744 - 7.188496228 46.714976675 - 7.107191248 46.716746976 - 7.060032224 46.790070650 -} -855859bbfffffff -{ - 11.743438720 16.158688801 - 11.654434725 16.160540270 - 11.609021694 16.243062437 - 11.652541052 16.323822449 - 11.741571504 16.322098329 - 11.787056259 16.239486803 -} -851b316bfffffff -{ - 58.883642279 -48.503414448 - 58.867109966 -48.678657622 - 58.778544974 -48.741806447 - 58.706714910 -48.630294471 - 58.723234931 -48.455912813 - 58.811597179 -48.392184486 -} -85b2b11bfffffff -{ - -28.451568932 -79.810346634 - -28.523520051 -79.871712050 - -28.602392205 -79.829003869 - -28.609310111 -79.724909074 - -28.537371615 -79.663583273 - -28.458502620 -79.706312470 -} -8589597bfffffff -{ - -8.853066866 -160.133202006 - -8.771752709 -160.099725725 - -8.705296765 -160.157907579 - -8.720059693 -160.249528429 - -8.801299381 -160.283088054 - -8.867850653 -160.224943673 -} -854ab64ffffffff -{ - 16.482617904 123.012577281 - 16.394742506 123.029546070 - 16.369137598 123.117164846 - 16.431467145 123.187875299 - 16.519391967 123.170902373 - 16.544937863 123.083223064 -} -85574527fffffff -{ - 18.461106182 -25.991104574 - 18.387754005 -26.048379030 - 18.305846339 -26.007359685 - 18.297204134 -25.909174344 - 18.370448296 -25.851845181 - 18.452442635 -25.892755790 -} -85f1658ffffffff -{ - -87.488045670 -25.151067063 - -87.408017981 -24.047194031 - -87.327042339 -25.047625327 - -87.323663759 -27.083774596 - -87.401009198 -28.242849426 - -87.484403904 -27.315907559 -} -85cf742bfffffff -{ - -52.007666847 -85.447953019 - -51.927474841 -85.370787485 - -51.845806724 -85.439647468 - -51.844175315 -85.585494757 - -51.924273590 -85.662989555 - -52.006097086 -85.594309122 -} -854594d7fffffff -{ - 18.737469672 -77.430463136 - 18.799198060 -77.372108795 - 18.879769487 -77.389710311 - 18.898669303 -77.465796132 - 18.836877530 -77.524247029 - 18.756249379 -77.506515517 -} -85150b0bfffffff -{ - 58.360199862 120.583178970 - 58.293975808 120.702255486 - 58.310537770 120.872277205 - 58.393466603 120.924022337 - 58.459973804 120.804987590 - 58.443268522 120.634163567 -} -85b6450ffffffff -{ - -23.527591677 -101.595285576 - -23.591367935 -101.655505837 - -23.676150871 -101.622925819 - -23.697215142 -101.530033023 - -23.633437455 -101.469740430 - -23.548596931 -101.502412896 -} -85467543fffffff -{ - 25.860411409 -163.274958411 - 25.771763473 -163.302798662 - 25.709115995 -163.232448053 - 25.735110884 -163.134196168 - 25.823798506 -163.106259393 - 25.886451595 -163.176670936 -} -85d0d073fffffff -{ - -54.317658624 13.630741015 - -54.401867485 13.617152989 - -54.443291229 13.732441180 - -54.400460950 13.861025154 - -54.316303088 13.874198317 - -54.274924307 13.759202150 -} -85052c37fffffff -{ - 82.074043526 105.068977173 - 82.024321621 105.649097654 - 82.069425524 106.255624742 - 82.165056547 106.289697057 - 82.215622865 105.702980169 - 82.169703681 105.088774366 -} -85f2b33bfffffff -{ - -87.588177281 178.798074483 - -87.677660343 178.468617820 - -87.730058946 -179.711708162 - -87.689821919 -177.608498276 - -87.599581388 -177.425599944 - -87.550235484 -179.197398503 -} -8589035bfffffff -{ - -13.742140897 -151.750383209 - -13.655765573 -151.721891691 - -13.587762052 -151.787405204 - -13.606034932 -151.881419676 - -13.692370137 -151.910032541 - -13.760472676 -151.844509749 -} -85647147fffffff -{ - 7.508845645 90.286243264 - 7.602083122 90.259720316 - 7.626151713 90.165446121 - 7.556993704 90.097752383 - 7.463796915 90.124302352 - 7.439717408 90.218519158 -} -85811d3bfffffff -{ - -10.247689154 -42.232597163 - -10.165081937 -42.181671053 - -10.080538800 -42.229264719 - -10.078605481 -42.327771163 - -10.161214143 -42.378706908 - -10.245754675 -42.331126722 -} -85ef314bfffffff -{ - -84.913802822 -37.395562186 - -84.844942870 -36.659992620 - -84.754453861 -36.970640997 - -84.732013753 -37.989412918 - -84.799384570 -38.726249752 - -84.890668951 -38.443567474 -} -85a0d097fffffff -{ - -11.305641032 -136.567677770 - -11.224849085 -136.553309045 - -11.164980953 -136.618945390 - -11.185818931 -136.699032036 - -11.266632205 -136.713529592 - -11.326586285 -136.647811671 -} -85d01da3fffffff -{ - -47.424360199 14.261838318 - -47.513091539 14.250735458 - -47.559466893 14.352951511 - -47.517072321 14.466035706 - -47.428407642 14.476814184 - -47.382070732 14.374832673 -} -85647347fffffff -{ - 8.646722469 90.575998312 - 8.740091201 90.549439424 - 8.764082779 90.454764307 - 8.694716640 90.386705383 - 8.601386043 90.413292329 - 8.577383409 90.507910261 -} -85030bb7fffffff -{ - 83.525369702 -86.175297405 - 83.550731150 -86.925156562 - 83.489261876 -87.528594515 - 83.403552749 -87.379832511 - 83.378947125 -86.645004591 - 83.439306157 -86.044075030 -} -85f2860ffffffff -{ - -87.500397277 -158.844542498 - -87.588317477 -158.319530457 - -87.607476726 -156.212009975 - -87.537226907 -154.756457361 - -87.450828138 -155.394454263 - -87.433096297 -157.379542221 -} -855f5663fffffff -{ - 7.995307317 -58.276874699 - 8.073482918 -58.229402552 - 8.149746339 -58.270397116 - 8.147832498 -58.358795917 - 8.069722035 -58.406214475 - 7.993460318 -58.365287899 -} -85063267fffffff -{ - 72.828538692 -30.748402882 - 72.843384754 -31.033083992 - 72.773175670 -31.208724359 - 72.688463145 -31.099967377 - 72.673791501 -30.817567842 - 72.743658884 -30.641655348 -} -85716a6ffffffff -{ - 10.094384362 -163.119158312 - 10.003348017 -163.145247442 - 9.934141146 -163.079515474 - 9.955928112 -162.987641826 - 10.046989890 -162.961468743 - 10.116239325 -163.027253186 -} -858f8883fffffff -{ - -7.034968066 -88.592660898 - -7.112157166 -88.651871290 - -7.201491481 -88.614463633 - -7.213630403 -88.517794155 - -7.136404739 -88.458574629 - -7.047076753 -88.496033579 -} -854f511bfffffff -{ - 15.405660767 150.021108879 - 15.314083279 150.034904835 - 15.276750138 150.123163812 - 15.330967775 150.197603252 - 15.422491229 150.183845574 - 15.459851121 150.095610142 -} -85f211d3fffffff -{ - -81.419892921 -145.834003385 - -81.496374535 -145.558184621 - -81.494321646 -144.956816022 - -81.415668527 -144.642419436 - -81.339863865 -144.924232394 - -81.342034386 -145.514581694 -} -85045547fffffff -{ - 74.468438440 169.513379322 - 74.371874241 169.486240318 - 74.317363058 169.780440327 - 74.358929561 170.103034726 - 74.455381186 170.133900375 - 74.510381509 169.838452522 -} -85db5d53fffffff -{ - -58.343644554 164.008033803 - -58.268741355 163.952810069 - -58.258453065 163.789065062 - -58.323052303 163.680058393 - -58.398035094 163.734962987 - -58.408339158 163.899194712 -} -85376cb3fffffff -{ - 39.927205089 -136.880228233 - 40.008297743 -136.844925375 - 40.067610894 -136.908826050 - 40.045795759 -137.007930442 - 39.964756624 -137.043029076 - 39.905479072 -136.979227612 -} -85b61603fffffff -{ - -29.099775569 -89.739111046 - -29.166411093 -89.802780972 - -29.247486807 -89.763072561 - -29.261947908 -89.659630456 - -29.195316553 -89.595943473 - -29.114219958 -89.635715490 + 89.517700173 177.670813230 + 89.427937607 175.669081478 + 89.362239135 -177.917877872 + 89.374030167 -169.590420233 + 89.455436391 -165.468875525 + 89.534373259 -171.316059084 } -85668b43fffffff +85a4b36ffffffff { - 2.628234493 -80.877555884 - 2.553880856 -80.933528424 - 2.468589069 -80.895024297 - 2.457697755 -80.800526240 - 2.532096600 -80.744581356 - 2.617341535 -80.783106736 + -23.935376289 -37.254667491 + -23.859758681 -37.203639349 + -23.785506773 -37.252479062 + -23.786884463 -37.352355659 + -23.862530951 -37.403417001 + -23.936770859 -37.354568699 } -85b6f203fffffff +85c88edbfffffff { - -23.064799592 -89.899010458 - -23.136204017 -89.961353974 - -23.222019343 -89.922542886 - -23.236450445 -89.821326576 - -23.165043125 -89.758965837 - -23.079207625 -89.797838479 + -33.169910939 106.881727028 + -33.107979763 106.819099348 + -33.116347075 106.716724517 + -33.186691616 106.676707131 + -33.248784343 106.739265206 + -33.240370868 106.841910778 } -85199277fffffff +85ea9d8ffffffff { - 56.796977239 -28.954501565 - 56.726848548 -29.045709503 - 56.652749943 -28.973227071 - 56.648695902 -28.809793105 - 56.718734796 -28.718382749 - 56.792917488 -28.790607473 + -63.857200735 175.025611917 + -63.865131448 174.864666240 + -63.938098105 174.817215597 + -64.003191969 174.931529439 + -63.995082914 175.093268046 + -63.922058838 175.139897667 } -85f293b3fffffff +8548f46ffffffff { - -89.780266586 -103.227958204 - -89.793429041 -78.463827775 - -89.707564517 -71.154607567 - -89.633062761 -81.228829101 - -89.624196871 -95.449071077 - -89.687406930 -106.498092600 -} -8538505bfffffff -{ - 32.350035727 5.472501451 - 32.257054552 5.484360687 - 32.220591723 5.582356104 - 32.277110912 5.668672319 - 32.370174327 5.656966738 - 32.406636376 5.558791061 -} -85aae9d7fffffff -{ - -27.419256779 80.797636530 - -27.511921626 80.825995537 - -27.535648929 80.929988711 - -27.466718099 81.005471278 - -27.374117495 80.977008852 - -27.350383424 80.873167032 -} -850a028bfffffff -{ - 63.599405071 90.392314772 - 63.512641964 90.438187321 - 63.481823067 90.629026079 - 63.537632767 90.774647321 - 63.624427910 90.729679107 - 63.655381811 90.538183939 -} -85ed8b17fffffff -{ - -64.945193109 147.672465543 - -64.919340819 147.477766488 - -64.981967934 147.333362420 - -65.070700740 147.383806307 - -65.096607944 147.579646639 - -65.033727057 147.723897663 -} -851dad27fffffff -{ - 53.852475483 -144.394695701 - 53.800392716 -144.497397310 - 53.733630153 -144.475341242 - 53.718900251 -144.351105810 - 53.770771471 -144.248521980 - 53.837583707 -144.270055141 -} -85ec948bfffffff -{ - -60.597624315 138.348425997 - -60.557340840 138.183102049 - -60.609450519 138.035080185 - -60.702090660 138.052191645 - -60.742503653 138.218233478 - -60.690146463 138.366444382 -} -85f170d7fffffff -{ - -87.079978103 77.401706854 - -87.046758809 75.726748924 - -87.103155092 74.354733646 - -87.195217914 74.637523013 - -87.229980658 76.390680359 - -87.171076468 77.780973646 -} -85005947fffffff -{ - 86.653544759 -24.976476489 - 86.740358786 -25.251057680 - 86.770436810 -26.793419258 - 86.712253270 -28.001261989 - 86.626322609 -27.657374942 - 86.597647607 -26.173673651 -} -8543290ffffffff -{ - 32.895934941 56.726955719 - 32.822246176 56.793831764 - 32.830498317 56.901804793 - 32.912517388 56.943147032 - 32.986357458 56.876294988 - 32.978027004 56.768076273 -} -859d54c3fffffff -{ - -20.844693131 145.612724539 - -20.755071363 145.597300998 - -20.724849982 145.504406302 - -20.784152878 145.426828635 - -20.873781057 145.442078692 - -20.904100076 145.535079983 -} -85271387fffffff -{ - 50.087721169 -100.159034431 - 50.015519507 -100.241604701 - 49.931035800 -100.182132717 - 49.918565743 -100.040410169 - 49.990585212 -99.957605130 - 50.075256919 -100.016755895 -} -85e4230ffffffff -{ - -62.032671044 105.105054627 - -61.953692016 104.983826390 - -61.963283969 104.777643196 - -62.051911085 104.691581582 - -62.131140069 104.812456591 - -62.121491735 105.019750697 -} -8570f54ffffffff -{ - -0.379527812 -170.326284075 - -0.461644349 -170.347064288 - -0.527133181 -170.286470201 - -0.510567065 -170.205023105 - -0.428421045 -170.184160280 - -0.362870555 -170.244827143 -} -85f10273fffffff -{ - -82.402512537 113.105655479 - -82.423779898 112.458516948 - -82.505547622 112.305804953 - -82.566450751 112.812621782 - -82.544582614 113.471421565 - -82.462419983 113.611620783 -} -8583128ffffffff -{ - -9.555948773 15.743169943 - -9.461798526 15.753049188 - -9.407416338 15.677389882 - -9.447126139 15.591888204 - -9.541208577 15.581959052 - -9.595649060 15.657581407 -} -85f0e98ffffffff -{ - -73.430997234 45.694668410 - -73.358543677 45.499873828 - -73.366525070 45.194806996 - -73.447153119 45.081698999 - -73.520068366 45.275886761 - -73.511892745 45.583806281 -} -85f3b05bfffffff -{ - -79.322748542 158.424370581 - -79.320192371 157.990029037 - -79.394673420 157.739258892 - -79.472137612 157.925664921 - -79.474681324 158.366118017 - -79.399773151 158.613998448 -} -85a489b7fffffff -{ - -26.712881966 -31.567997183 - -26.791888460 -31.620430787 - -26.869879122 -31.574544683 - -26.868816108 -31.476062551 - -26.789684445 -31.423643259 - -26.711741065 -31.469691516 -} -85338c0bfffffff -{ - 34.402849755 176.591969276 - 34.499242657 176.604200152 - 34.556131204 176.509520391 - 34.516523655 176.402649887 - 34.420081560 176.390644571 - 34.363296063 176.485283984 -} -85ba0dcffffffff -{ - -32.056207436 176.703700506 - -31.973236728 176.656967108 - -31.965951576 176.553939901 - -32.041706293 176.497436154 - -32.124800449 176.544119400 - -32.132016371 176.647356898 -} -85ed63b3fffffff -{ - -73.875019743 174.618767726 - -73.890057723 174.353209067 - -73.970256167 174.272278639 - -74.035516838 174.459108551 - -74.020243031 174.726841708 - -73.939945517 174.805560290 -} -851144a7fffffff -{ - 67.452059902 37.643605020 - 67.409331308 37.809017331 - 67.449880315 38.000769622 - 67.533324362 38.027642235 - 67.576189738 37.861604370 - 67.535473683 37.669319639 -} -853b1d5bfffffff -{ - 35.467419884 -51.692909034 - 35.382562123 -51.728869934 - 35.312051316 -51.662391810 - 35.326297036 -51.559892857 - 35.411166670 -51.523705375 - 35.481778822 -51.590243231 -} -85f1223bfffffff -{ - -83.712382459 135.668164482 - -83.765112178 135.026003569 - -83.849072263 135.161014125 - -83.879890413 135.957837301 - -83.825948904 136.603863530 - -83.742413876 136.449366928 -} -85f2b273fffffff -{ - -87.226534142 149.480147633 - -87.296974176 148.299487872 - -87.378600177 149.059721074 - -87.387711076 151.080960322 - -87.314563386 152.226155797 - -87.235037617 151.389822204 -} -850e5a37fffffff -{ - 51.032872674 -74.736248695 - 50.981915965 -74.865330029 - 50.887231185 -74.859041688 - 50.843491203 -74.724282024 - 50.894254054 -74.595470632 - 50.988950279 -74.601148785 -} -85dd2ca7fffffff -{ - -64.781614864 -21.913913583 - -64.699443195 -21.807148648 - -64.618772517 -21.923710445 - -64.619963322 -22.146391919 - -64.701855313 -22.253964965 - -64.782836304 -22.138054885 + 29.536317874 -105.317774025 + 29.615670236 -105.254631512 + 29.703037691 -105.302553341 + 29.711017767 -105.413728184 + 29.631609145 -105.476829307 + 29.544276742 -105.428797283 } -85f27423fffffff +854b01c7fffffff { - -74.910651947 -130.469041946 - -74.969076835 -130.239277446 - -74.942382813 -129.912699955 - -74.857442690 -129.819010313 - -74.799511037 -130.048939885 - -74.826027719 -130.372412117 + 29.405390562 125.661965991 + 29.329463962 125.679312804 + 29.310150664 125.770655395 + 29.366806404 125.844708194 + 29.442751842 125.827361861 + 29.462022771 125.735962174 } -857b09b3fffffff +85149a87fffffff { - -6.167375800 45.304840301 - -6.075232210 45.303489534 - -6.027410161 45.224956082 - -6.071725201 45.147684563 - -6.163938700 45.148976834 - -6.211767285 45.227599169 + 46.012462115 130.995511283 + 45.949032159 131.061642167 + 45.950013719 131.183092838 + 46.014452591 131.238843680 + 46.078072562 131.172885414 + 46.077063564 131.051002652 } -850796d3fffffff +8550c0b7fffffff { - 81.064562824 -30.625030901 - 81.143274483 -30.776559140 - 81.164103661 -31.337677040 - 81.105810823 -31.738738396 - 81.027546208 -31.578963628 - 81.007122662 -31.026294011 + 27.535500682 -131.745126448 + 27.619267935 -131.707680304 + 27.691419258 -131.765035308 + 27.679729460 -131.859780577 + 27.595988464 -131.897066225 + 27.523910954 -131.839767215 } -85e6f1d3fffffff +85f286affffffff { - -59.550759462 15.566946157 - -59.467174381 15.541870021 - -59.430384583 15.381944210 - -59.477013764 15.246418500 - -59.560712568 15.270634855 - -59.597669056 15.431238165 + -87.136577094 -154.029491118 + -87.222108866 -153.421441607 + -87.233700906 -151.567297527 + -87.158861841 -150.423268683 + -87.074977512 -151.106525424 + -87.064252592 -152.862066966 } -85f024affffffff -{ - -82.893979883 82.552125630 - -82.868579157 81.849296026 - -82.929472195 81.348333891 - -83.016796395 81.550514663 - -83.042618236 82.267817882 - -82.980687456 82.768286537 -} -8572d4abfffffff -{ - -3.089354915 140.582733365 - -3.183683989 140.598016366 - -3.217216295 140.688188184 - -3.156448668 140.763084779 - -3.062122437 140.747827074 - -3.028560922 140.657647416 -} -85e10857fffffff -{ - -64.714849454 62.926122012 - -64.622512264 62.933920180 - -64.574041561 62.761167149 - -64.617644047 62.580243509 - -64.709878952 62.571237925 - -64.758614373 62.744361791 -} -8504c13bfffffff -{ - 68.578464869 166.251578831 - 68.483005246 166.246233900 - 68.434459977 166.469245037 - 68.481018559 166.698482939 - 68.576433987 166.705841006 - 68.625336513 166.481949165 -} -853990a3fffffff -{ - 29.812227389 -10.961879925 - 29.743056913 -11.036137952 - 29.652860676 -11.006802020 - 29.631829268 -10.903412853 - 29.700896463 -10.829209268 - 29.791098214 -10.858340218 -} -8503b577fffffff -{ - 80.685750934 -165.510355967 - 80.602228568 -165.789230032 - 80.520269776 -165.494454112 - 80.521159250 -164.925798414 - 80.603970796 -164.642033073 - 80.686603451 -164.931698837 -} -85f272c3fffffff -{ - -76.524748057 -128.208240920 - -76.582352064 -127.937700815 - -76.552478804 -127.573057958 - -76.465245028 -127.482756488 - -76.408194874 -127.753149665 - -76.437826788 -128.114014342 -} -85a3b50ffffffff -{ - -18.758938830 39.352060876 - -18.663770879 39.353057923 - -18.616632830 39.267540002 - -18.664668503 39.180946353 - -18.759883061 39.179877780 - -18.807015402 39.265474413 -} -85f2b6cbfffffff -{ - -85.689307494 148.370430993 - -85.757625507 147.606014755 - -85.838285681 148.067078556 - -85.849363483 149.325540751 - -85.779298451 150.077995505 - -85.699914911 149.584988457 -} -8566460bfffffff -{ - 5.092203964 -69.617309633 - 5.022583846 -69.667151465 - 4.940815011 -69.628335703 - 4.928743777 -69.539697252 - 4.998397348 -69.489926182 - 5.080088731 -69.528722699 -} -85d32dcbfffffff -{ - -53.580655686 -119.446782602 - -53.529805266 -119.312882586 - -53.434649067 -119.321955395 - -53.390361862 -119.464358578 - -53.441088647 -119.597966624 - -53.536225909 -119.589463475 -} -85240ecffffffff -{ - 44.217299129 103.224968809 - 44.128036465 103.231375099 - 44.090854046 103.335581786 - 44.142774152 103.433501666 - 44.231964097 103.427448085 - 44.269306839 103.323122103 -} -85ccd323fffffff -{ - -34.884384133 75.908878194 - -34.975710574 75.935560492 - -35.001661232 76.047104933 - -34.936274068 76.131810671 - -34.844984199 76.104987159 - -34.819044831 75.993598862 -} -8587247bfffffff -{ - -15.678302190 92.272427057 - -15.763980360 92.303544471 - -15.784005964 92.391776091 - -15.718397817 92.448760532 - -15.632828313 92.417606480 - -15.612758332 92.329504451 -} -85eb6447fffffff -{ - -67.902724364 -150.695612632 - -67.900322992 -150.500225567 - -67.827943529 -150.426851035 - -67.758130562 -150.548333660 - -67.760576606 -150.742587881 - -67.832790954 -150.816488076 -} -85cb5ec3fffffff -{ - -36.065888877 58.326836764 - -36.157571371 58.338405007 - -36.198502301 58.441761191 - -36.147686217 58.533493317 - -36.055961599 58.521745271 - -36.015095085 58.418444910 -} -850ee423fffffff -{ - 55.929021596 -78.547998922 - 55.872678405 -78.688834934 - 55.776320568 -78.671705811 - 55.736257332 -78.514510850 - 55.792379079 -78.373924696 - 55.888784957 -78.390282884 -} -8554d007fffffff -{ - 9.566637205 -17.726341313 - 9.503183273 -17.783244318 - 9.430093110 -17.753250857 - 9.420400077 -17.666472435 - 9.483743012 -17.609569196 - 9.556889881 -17.639444455 -} -850542a3fffffff -{ - 82.118967890 156.070482400 - 82.024029053 156.175839289 - 81.988001103 156.820762444 - 82.046233316 157.370478629 - 82.141430947 157.278976101 - 82.178147027 156.623824698 -} -85a01bd3fffffff -{ - -15.653587415 -136.322577994 - -15.568855727 -136.307851814 - -15.508113937 -136.376138006 - -15.532023764 -136.459239691 - -15.616787252 -136.474105264 - -15.677609217 -136.405729757 -} -8594c1cbfffffff -{ - -17.247836128 130.066467554 - -17.330532640 130.082518970 - -17.363314142 130.169847961 - -17.313412025 130.241164556 - -17.230676672 130.225120788 - -17.197882218 130.137752712 -} -85ea9267fffffff -{ - -60.973593258 172.545925341 - -60.907215881 172.476028615 - -60.908837199 172.307462684 - -60.976852494 172.208241598 - -61.043324542 172.277931140 - -61.041686609 172.447050516 -} -85f2956ffffffff -{ - -88.953243707 -165.932283166 - -89.044158025 -165.272980316 - -89.072247608 -160.014277972 - -89.004609351 -156.138580505 - -88.916483409 -157.533569061 - -88.892753547 -162.120974102 -} -8558744ffffffff -{ - 15.772383013 10.394357314 - 15.681548392 10.400832906 - 15.637969604 10.486089420 - 15.685177756 10.564989073 - 15.776070004 10.558639772 - 15.819696564 10.473264419 -} -8500e56bfffffff -{ - 84.182584958 42.078528125 - 84.228618341 42.831307293 - 84.320620615 42.799234861 - 84.366418920 41.989014420 - 84.319205759 41.225415524 - 84.227391359 41.282798319 -} -8510ebd3fffffff -{ - 60.387496500 61.637278020 - 60.313587774 61.743330516 - 60.322758642 61.931324178 - 60.405889511 62.014029136 - 60.479964800 61.908187040 - 60.470742489 61.719427080 -} -851d99abfffffff -{ - 50.920992734 -150.686817935 - 50.989634765 -150.636136004 - 51.061244476 -150.695488892 - 51.064208794 -150.805799790 - 50.995466731 -150.856452381 - 50.923860444 -150.796823929 -} -8596aad7fffffff -{ - -7.593136273 32.111019202 - -7.496864384 32.114859902 - -7.445003962 32.032385647 - -7.489379295 31.946029361 - -7.585661621 31.942121680 - -7.637558260 32.024637257 -} -851a3507fffffff -{ - 52.713762581 -46.268366586 - 52.698250908 -46.414900376 - 52.612993005 -46.472455281 - 52.543441040 -46.383846186 - 52.558960634 -46.237922288 - 52.644024253 -46.179999320 -} -85a4d5cffffffff -{ - -27.802760420 -30.413659789 - -27.882847045 -30.466250593 - -27.961588797 -30.418181565 - -27.960193880 -30.317359057 - -27.879983410 -30.264791236 - -27.801291793 -30.313022642 -} -85914577fffffff -{ - -8.413878172 -128.136552128 - -8.488808608 -128.168640687 - -8.543972351 -128.123231754 - -8.524256197 -128.045818615 - -8.449416447 -128.013752260 - -8.394202218 -128.059076776 -} -85f18a0bfffffff -{ - -75.866984819 95.209764545 - -75.785623398 95.035353933 - -75.779032516 94.654596876 - -75.853738030 94.444437383 - -75.935459656 94.616432995 - -75.942116116 95.001030661 -} -85a0810bfffffff -{ - -13.452796152 -132.623491755 - -13.371743583 -132.612504640 - -13.313775139 -132.678350117 - -13.336784056 -132.755279474 - -13.417877417 -132.766394808 - -13.475921163 -132.700452530 +85c09903fffffff +{ + -43.118945879 -18.567455977 + -43.204672888 -18.621542815 + -43.282747347 -18.545547585 + -43.275020062 -18.415324209 + -43.189206674 -18.361397951 + -43.111206923 -18.437533816 +} +850312cbfffffff +{ + 83.954702639 -154.014195262 + 83.882829565 -154.579979820 + 83.793326039 -154.289201104 + 83.774999526 -153.450857931 + 83.845681610 -152.882539653 + 83.935871781 -153.154768953 +} +85dd8d6bfffffff +{ + -56.360039450 -8.624238767 + -56.278726959 -8.580451285 + -56.215230541 -8.694123190 + -56.232779946 -8.851586117 + -56.313971815 -8.896053735 + -56.377735380 -8.782380085 +} +850a7447fffffff +{ + 68.832735213 88.305588734 + 68.805100968 88.547661607 + 68.865771406 88.725474377 + 68.954454939 88.661158623 + 68.982234587 88.417375974 + 68.921184436 88.239626186 +} +856d9e27fffffff +{ + 9.248840869 -103.627735913 + 9.323772146 -103.573067858 + 9.405216184 -103.612780771 + 9.411671616 -103.707248957 + 9.336650482 -103.761895940 + 9.255263823 -103.722095992 +} +85ec71a3fffffff +{ + -76.061877666 147.941739744 + -76.042585314 147.602264802 + -76.108547219 147.350721754 + -76.194202791 147.439119571 + -76.213628063 147.782084945 + -76.147263570 148.033139859 +} +85cf5d6bfffffff +{ + -46.167995349 -87.344844331 + -46.089673020 -87.272482313 + -46.005103134 -87.331543914 + -45.998702919 -87.462799847 + -46.076922404 -87.535403528 + -46.161645004 -87.476510578 +} +85a2694ffffffff +{ + -17.403415884 60.681306428 + -17.496824498 60.693076157 + -17.531890046 60.783478544 + -17.473458799 60.862058490 + -17.380024209 60.850156528 + -17.345046741 60.759806834 +} +85e99b07fffffff +{ + -70.855949749 -80.749945124 + -70.846489319 -80.467144725 + -70.760916427 -80.344844697 + -70.685160291 -80.503901919 + -70.694608199 -80.784304250 + -70.779824566 -80.908033883 +} +8562f45bfffffff +{ + 6.900051396 58.599561726 + 6.832682733 58.607877923 + 6.812803795 58.680766221 + 6.860365991 58.745309862 + 6.927735303 58.736904584 + 6.947541869 58.664044748 +} +85206913fffffff +{ + 52.329282753 86.681425206 + 52.237509075 86.723865560 + 52.212975166 86.872477090 + 52.280102631 86.979072467 + 52.371911590 86.937129569 + 52.396558080 86.788092980 +} +858bb163fffffff +{ + -13.541243924 -55.291410972 + -13.464576595 -55.241432543 + -13.381091485 -55.285258279 + -13.374316565 -55.378998394 + -13.450969712 -55.428930048 + -13.534411970 -55.385168467 +} +85ef2167fffffff +{ + -83.298235949 -69.508673382 + -83.273941917 -68.727167863 + -83.181643089 -68.533627782 + -83.114206654 -69.104917776 + -83.137964303 -69.869623744 + -83.229685444 -70.079615531 +} +8510ca23fffffff +{ + 57.811577213 65.746135453 + 57.732490001 65.838546019 + 57.735646467 66.016556654 + 57.817913640 66.102847870 + 57.897152592 66.010720714 + 57.893972568 65.832016732 +} +85c0584bfffffff +{ + -40.474073043 -2.057330973 + -40.566922491 -2.089882883 + -40.633833789 -2.000938447 + -40.607804846 -1.879491656 + -40.514940086 -1.847203785 + -40.448119433 -1.936098323 +} +855634dbfffffff +{ + 18.799715759 -37.169422931 + 18.724211981 -37.216194681 + 18.646007070 -37.166773757 + 18.643189401 -37.070624492 + 18.718615285 -37.023735258 + 18.796936792 -37.073112510 +} +85d52d73fffffff +{ + -56.637303430 -165.739677778 + -56.570779593 -165.677788696 + -56.506927126 -165.768206440 + -56.509536667 -165.920328869 + -56.575997401 -165.982384178 + -56.639911718 -165.892151748 +} +856f9e3bfffffff +{ + 3.169106405 -107.610987212 + 3.239788305 -107.560684474 + 3.315494680 -107.601173308 + 3.320447364 -107.692029276 + 3.249680694 -107.742293570 + 3.174046134 -107.701740512 +} +857b9d27fffffff +{ + 1.552292328 51.022691505 + 1.636576779 51.019399974 + 1.683303042 50.947368232 + 1.645758387 50.878535686 + 1.561397501 50.881780623 + 1.514657683 50.953904757 +} +85ef2dabfffffff +{ + -81.123715340 -76.998669908 + -81.110927704 -76.393260005 + -81.022027895 -76.170354858 + -80.946532593 -76.545044691 + -80.959133860 -77.139724552 + -81.047414060 -77.370318869 +} +85e24ab3fffffff +{ + -50.148886535 -138.216087040 + -50.119437959 -138.089152392 + -50.029613643 -138.063266230 + -49.969369207 -138.163953869 + -49.998805669 -138.290460288 + -50.088498572 -138.316706372 } 85d831b7fffffff { @@ -31115,4078 +35066,4510 @@ -51.533917624 137.330947510 -51.576995055 137.458056304 } -85f20c53fffffff -{ - -78.254105836 -134.658569636 - -78.319247259 -134.385521478 - -78.299274792 -133.955681870 - -78.214308058 -133.804462695 - -78.149771750 -134.078615635 - -78.169598772 -134.502928471 +8532316ffffffff +{ + 34.160423176 171.267347852 + 34.257708978 171.273422274 + 34.310649619 171.174499122 + 34.266209778 171.069590750 + 34.168906002 171.063753098 + 34.116059875 171.162586954 +} +8532ce67fffffff +{ + 43.144537041 161.398538582 + 43.239227136 161.392415911 + 43.281298484 161.276215838 + 43.228624824 161.166350803 + 43.133973446 161.172764908 + 43.091956828 161.288752819 +} +857b54abfffffff +{ + -5.864506862 44.206120751 + -5.772006124 44.205185680 + -5.723732733 44.126146490 + -5.767950075 44.047956525 + -5.860516185 44.048831898 + -5.908799623 44.127956981 +} +8564c09bfffffff +{ + 15.295627509 90.614825832 + 15.387932745 90.587723988 + 15.410684451 90.491076131 + 15.341148851 90.421589746 + 15.248872572 90.448720936 + 15.226102889 90.545309292 +} +85015447fffffff +{ + 76.325117928 18.173946358 + 76.389250915 18.371769873 + 76.464606467 18.204863279 + 76.475361660 17.837640249 + 76.410744457 17.641399171 + 76.335856596 17.810769048 +} +85a8d183fffffff +{ + -15.933544418 -47.550460336 + -15.854991776 -47.498964119 + -15.772107578 -47.545877893 + -15.767801590 -47.644251485 + -15.846356164 -47.695732943 + -15.929214795 -47.648855711 +} +855a0dcbfffffff +{ + 14.090534298 169.732499413 + 14.175898988 169.735917254 + 14.221101399 169.656124213 + 14.180835502 169.572978797 + 14.095461583 169.569712898 + 14.050362642 169.649440444 +} +85c51d27fffffff +{ + -34.379475172 -35.409851953 + -34.455489330 -35.469035866 + -34.537350456 -35.424441530 + -34.543181754 -35.320455334 + -34.467052287 -35.261257654 + -34.385206935 -35.306059650 +} +85094493fffffff +{ + 71.036194141 4.905775808 + 71.100886892 4.989863975 + 71.159570767 4.826046083 + 71.153176392 4.577779985 + 71.088254728 4.495135034 + 71.029955567 4.659304560 +} +851cc1a7fffffff +{ + 44.153589593 -139.995079974 + 44.090407922 -140.036165619 + 44.030112612 -139.965774717 + 44.033000280 -139.854387272 + 44.096166471 -139.813282939 + 44.156460501 -139.883584505 +} +8529b14ffffffff +{ + 35.313004009 -114.251470377 + 35.394291642 -114.191861531 + 35.475182155 -114.248623405 + 35.474733213 -114.365053410 + 35.393417127 -114.424549031 + 35.312578429 -114.367728234 +} +85d9287bfffffff +{ + -58.183660845 139.515958748 + -58.144243116 139.362240679 + -58.196089638 139.227725386 + -58.287590685 139.246798204 + -58.327122154 139.401151015 + -58.275038410 139.535794872 +} +85000313fffffff +{ + 79.966949553 40.154052887 + 80.012762496 40.573816625 + 80.101830848 40.534714244 + 80.144912317 40.067717356 + 80.098385816 39.644964449 + 80.009496872 39.692178326 +} +85362c5bfffffff +{ + 35.798858024 -145.246327665 + 35.722221487 -145.284175136 + 35.656440294 -145.213733236 + 35.667298698 -145.105493342 + 35.743922296 -145.067604247 + 35.809700476 -145.137996458 +} +85864963fffffff +{ + -8.595159013 72.477665410 + -8.683493518 72.497092932 + -8.711905822 72.587232929 + -8.651932549 72.657852649 + -8.563636842 72.638323246 + -8.535275518 72.548275886 +} +858121cbfffffff +{ + -15.333504347 -43.824867208 + -15.253405238 -43.773431363 + -15.170672747 -43.821136670 + -15.168054737 -43.920257298 + -15.248161495 -43.971695532 + -15.330878611 -43.924010898 +} +8510e4b3fffffff +{ + 60.667251769 52.747461438 + 60.602044828 52.867740494 + 60.623335747 53.048577919 + 60.709939410 53.109801067 + 60.775311566 52.989482039 + 60.753914503 52.807978047 +} +854365cffffffff +{ + 36.923749746 59.188964684 + 36.846655776 59.258044013 + 36.854003792 59.374826008 + 36.938513022 59.422820052 + 37.015758412 59.353795557 + 37.008343025 59.236721608 +} +85076e07fffffff +{ + 62.889491277 -15.546497986 + 62.916187400 -15.702039648 + 62.860043851 -15.838741802 + 62.777398481 -15.819521950 + 62.750931579 -15.664531122 + 62.806881393 -15.528209812 +} +85042237fffffff +{ + 76.588244085 139.303355190 + 76.499912223 139.479012108 + 76.490711816 139.894060694 + 76.569738511 140.138463808 + 76.658522444 139.966151675 + 76.667828623 139.546050545 +} +859451a7fffffff +{ + -12.186978305 131.812535023 + -12.274990278 131.828606367 + -12.308318896 131.917195822 + -12.253647129 131.989748733 + -12.165598546 131.973688107 + -12.132258280 131.885063784 +} +85a9510ffffffff +{ + -26.083092958 -54.944679739 + -26.017169376 -54.893609613 + -25.940932587 -54.938471284 + -25.930665622 -55.034337569 + -25.996598860 -55.085360382 + -26.072789419 -55.040564336 +} +85e13037fffffff +{ + -66.549554307 74.727647673 + -66.455990547 74.691865655 + -66.420732184 74.477209521 + -66.478803385 74.297362016 + -66.572390924 74.331677973 + -66.607884428 74.547309398 +} +85ab1acbfffffff +{ + -22.277740170 66.115193472 + -22.373363684 66.131851988 + -22.407473515 66.229546212 + -22.345895033 66.310496380 + -22.250269696 66.293698769 + -22.216224560 66.196089995 +} +85e50ea7fffffff +{ + -64.236549428 114.806156875 + -64.167684443 114.651820841 + -64.191708281 114.437292555 + -64.284751153 114.375987403 + -64.353891225 114.530355863 + -64.329712673 114.746000822 +} +85dc1acffffffff +{ + -51.946115456 -13.546717629 + -52.028304580 -13.602245709 + -52.098535605 -13.508345145 + -52.086488746 -13.358805444 + -52.004230090 -13.303549716 + -51.934087729 -13.397560378 +} +85f13033fffffff +{ + -82.084097791 134.064333855 + -82.133684459 133.549455076 + -82.216128308 133.638687621 + -82.248707028 134.255065111 + -82.198173163 134.773035070 + -82.116016035 134.671603356 +} +85ef4d87fffffff +{ + -72.207760235 -72.011081890 + -72.185034912 -71.709540762 + -72.093418100 -71.619815669 + -72.024813070 -71.829327604 + -72.047383132 -72.128269112 + -72.138712348 -72.220284052 +} +858d5d93fffffff +{ + -14.913139568 101.830963682 + -14.836410648 101.809278840 + -14.817578478 101.722165635 + -14.875519277 101.656761177 + -14.952233532 101.678495179 + -14.971021728 101.765584551 +} +85d96e3bfffffff +{ + -58.370962592 126.320648835 + -58.314633965 126.175707616 + -58.352609175 126.013433243 + -58.447124364 125.995593782 + -58.503658363 126.140899778 + -58.465471198 126.303680901 +} +85cb5677fffffff +{ + -35.623842942 55.566995404 + -35.715140360 55.575965739 + -35.757973605 55.675892303 + -35.709440379 55.766812109 + -35.618088604 55.757666320 + -35.575324321 55.657776234 +} +85f02097fffffff +{ + -82.404847557 80.234556077 + -82.375911351 79.584959492 + -82.434022492 79.098074924 + -82.522037719 79.259934336 + -82.551435556 79.921576336 + -82.492349301 80.409183829 +} +85255c47fffffff +{ + 49.730930021 106.147721634 + 49.641482133 106.149232097 + 49.598678903 106.259827122 + 49.645163392 106.369015916 + 49.734518477 106.367924215 + 49.777482061 106.257225357 +} +8516d14bfffffff +{ + 46.376562378 167.619030529 + 46.469991501 167.621150130 + 46.517466548 167.502224122 + 46.471436201 167.381345783 + 46.378010866 167.379556228 + 46.330611874 167.498314960 +} +85007037fffffff +{ + 82.043951280 8.713587337 + 82.120542471 8.971038517 + 82.192539205 8.580667643 + 82.187019726 7.928782056 + 82.109772786 7.679902135 + 82.038697860 8.074177921 +} +85b78263fffffff +{ + -32.514441824 -85.501613752 + -32.444347950 -85.447215586 + -32.364707729 -85.495633488 + -32.355011917 -85.598360778 + -32.425002834 -85.652921858 + -32.504792606 -85.604593195 +} +85c013b7fffffff +{ + -36.621159721 -13.529940081 + -36.711570482 -13.574528162 + -36.787849274 -13.499087360 + -36.773625426 -13.378986913 + -36.683140496 -13.334574582 + -36.606953518 -13.410086452 +} +85519c63fffffff +{ + 18.589358330 -122.110671072 + 18.671590871 -122.065767661 + 18.752023411 -122.118136508 + 18.750130986 -122.215408579 + 18.667870209 -122.260192668 + 18.587530033 -122.207824199 +} +852d9baffffffff +{ + 32.621743072 42.422535369 + 32.530966685 42.401367235 + 32.468249756 42.480295084 + 32.496238969 42.580322576 + 32.586920765 42.601615085 + 32.649707970 42.522756011 +} +85915697fffffff +{ + -11.317513786 -125.643917988 + -11.242804185 -125.639281454 + -11.189901889 -125.700369650 + -11.211647501 -125.766197469 + -11.286412272 -125.770939665 + -11.339376326 -125.709748304 +} +85083437fffffff +{ + 63.933066720 5.267637938 + 63.902787738 5.134295883 + 63.829543260 5.150657256 + 63.786614491 5.299753050 + 63.816841392 5.432632685 + 63.890048866 5.416878364 +} +851f9a4ffffffff +{ + 44.000776215 7.049701836 + 43.913390323 7.061649515 + 43.881907397 7.173732675 + 43.937808596 7.274094253 + 44.025255692 7.262353571 + 44.056740498 7.150044005 +} +8500eb6bfffffff +{ + 87.893168776 67.896640971 + 87.901726566 70.374237330 + 87.986037955 71.531787648 + 88.064507590 70.085617564 + 88.055264071 67.402977247 + 87.968277295 66.382148712 +} +85cb0827fffffff +{ + -34.565392320 53.961225725 + -34.656751663 53.968644012 + -34.700469775 54.065688813 + -34.652755765 54.155290312 + -34.561334439 54.147702641 + -34.517689026 54.050682931 +} +85f0b333fffffff +{ + -71.473548869 88.685493032 + -71.385589380 88.577058627 + -71.369306156 88.284585475 + -71.440846593 88.098360196 + -71.529021357 88.204949024 + -71.545441244 88.499620058 +} +85bb6dcffffffff +{ + -37.994071178 166.529697960 + -37.904930915 166.487213058 + -37.890396719 166.369190678 + -37.965019961 166.293394382 + -38.054256164 166.335732001 + -38.068773216 166.454013712 +} +85b0d477fffffff +{ + -20.964115960 -111.068855001 + -20.912684450 -110.995777838 + -20.834153181 -111.010990073 + -20.807014916 -111.099093976 + -20.858314782 -111.172126572 + -20.936884388 -111.157099973 +} +85ec0453fffffff +{ + -68.852047533 151.827939718 + -68.833983791 151.599753976 + -68.901582473 151.445430855 + -68.987510048 151.519729561 + -69.005596301 151.749540011 + -68.937732157 151.903419695 +} +8507a463fffffff +{ + 76.938225502 -12.299443916 + 76.978335677 -12.607239563 + 76.930963947 -12.896931971 + 76.843801831 -12.876862723 + 76.804069882 -12.571014258 + 76.851124061 -12.283287545 +} +859c2b1bfffffff +{ + -16.455015941 142.883892126 + -16.369824734 142.871922276 + -16.340824048 142.785435781 + -16.396910742 142.710836529 + -16.482098884 142.722647946 + -16.511203542 142.809217085 +} +850aab1bfffffff +{ + 60.974940014 99.870472431 + 60.931648324 100.035098426 + 60.974644414 100.188942079 + 61.061217223 100.178532979 + 61.104722932 100.013262158 + 61.061441059 99.859046134 +} +85054d87fffffff +{ + 82.838819198 -173.730317284 + 82.749931536 -173.996637354 + 82.675119035 -173.526651837 + 82.688195968 -172.794382630 + 82.776345315 -172.516054209 + 82.852160653 -172.981769517 +} +856f85affffffff +{ + 0.676189835 -110.857563293 + 0.744355293 -110.810079019 + 0.817261398 -110.851578580 + 0.821923684 -110.940611180 + 0.753679786 -110.988044102 + 0.680852045 -110.946495940 +} +85156d5bfffffff +{ + 66.286422258 125.217064005 + 66.211653160 125.364403976 + 66.223897155 125.598385286 + 66.311034754 125.686595752 + 66.386158174 125.539601571 + 66.373789078 125.304044164 +} +85f16e0bfffffff +{ + -85.714662927 9.848567631 + -85.620263743 9.792099864 + -85.577650612 8.713804261 + -85.628053252 7.665400263 + -85.722592341 7.675546078 + -85.766621232 8.780571943 +} +85416b23fffffff +{ + 18.055697647 103.626170838 + 18.148207637 103.602817646 + 18.176708897 103.507019969 + 18.112669032 103.434599206 + 18.020131457 103.458016550 + 17.991661278 103.553790593 +} +85be2a3bfffffff +{ + -35.732190215 152.132029626 + -35.637151156 152.105873366 + -35.607915617 151.991615307 + -35.673656771 151.903318792 + -35.768728648 151.929247908 + -35.798026695 152.043700979 } -85f29033fffffff +850561d7fffffff { - -89.329315206 163.001681860 - -89.411816463 159.324705007 - -89.484767088 164.956667778 - -89.461842117 174.865211364 - -89.371802403 176.658882492 - -89.311275774 170.761147991 + 86.135015602 154.336923219 + 86.042535566 154.586494319 + 86.008928769 155.877604618 + 86.066516493 156.960987228 + 86.159600894 156.766439490 + 86.194529984 155.432774061 } -8500eb77fffffff +850942b7fffffff { - 88.002731292 59.595480321 - 88.024268484 62.147979145 - 88.113617755 63.000593759 - 88.183474653 61.111943598 - 88.160120116 58.353367732 - 88.068834652 57.699205283 + 69.913912404 9.444021057 + 69.975097803 9.540130664 + 70.036677638 9.401294252 + 70.036719747 9.165771502 + 69.975276480 9.070748199 + 69.914048529 9.210153635 } -850066a3fffffff +852ec953fffffff { - 80.481260603 -1.454899395 - 80.560677339 -1.331619880 - 80.620780995 -1.726479197 - 80.600671539 -2.244300102 - 80.520932212 -2.359924155 - 80.461620130 -1.965443949 -} -85230853fffffff -{ - 39.940853415 -167.349682571 - 40.028903199 -167.319049470 - 40.095697594 -167.398483599 - 40.074362531 -167.508663710 - 39.986199677 -167.539139742 - 39.919484940 -167.459593216 -} -85f28eb7fffffff -{ - -85.684610486 -112.555188777 - -85.728210621 -111.477776425 - -85.676224469 -110.460118485 - -85.582141985 -110.538991297 - -85.539926895 -111.591027900 - -85.590439912 -112.589437865 -} -853a183bfffffff -{ - 27.067140633 -50.474296310 - 26.986207449 -50.508350610 - 26.913834407 -50.448653871 - 26.922278241 -50.354861398 - 27.003201813 -50.320623981 - 27.075691287 -50.380361990 -} -8504d273fffffff -{ - 65.105153572 155.832853056 - 65.012065211 155.868064853 - 64.978721808 156.079173828 - 65.038224598 156.256167301 - 65.131404865 156.222400938 - 65.164991484 156.010192782 -} -8595b5affffffff -{ - -10.460095710 115.193541330 - -10.543790810 115.209358546 - -10.579131213 115.286396489 - -10.530746809 115.347682658 - -10.446963588 115.331850877 - -10.411652910 115.254747454 -} -85869b4ffffffff -{ - 3.854730063 84.236688731 - 3.945571742 84.209634122 - 3.968963297 84.118986642 - 3.901544579 84.055459796 - 3.810770024 84.082523396 - 3.787347052 84.173104959 -} -85de102bfffffff -{ - -55.603847258 -47.840101580 - -55.551154355 -47.710021025 - -55.465778776 -47.728316184 - -55.433048384 -47.875945626 - -55.485491862 -48.005788495 - -55.570914555 -47.988240355 -} -85e216dbfffffff -{ - -63.205987926 -128.200548702 - -63.171489221 -128.024597408 - -63.083824093 -128.013515511 - -63.030727240 -128.177523041 - -63.065122202 -128.352791563 - -63.152717281 -128.364733948 -} -85612553fffffff -{ - 1.924757960 82.087386759 - 2.014212953 82.060356891 - 2.037723184 81.971636985 - 1.971814784 81.910014411 - 1.882435171 81.937047161 - 1.858888578 82.025699706 -} -8507a9abfffffff -{ - 73.329590924 -22.465720755 - 73.355613366 -22.739094296 - 73.294483312 -22.944399927 - 73.207655831 -22.875892989 - 73.181891463 -22.604468074 - 73.242697842 -22.399608790 -} -85115ecbfffffff -{ - 64.595603147 43.317148942 - 64.543856078 43.463021920 - 64.577594438 43.649352610 - 64.663227796 43.690413680 - 64.715125910 43.544181266 - 64.681239110 43.357246344 -} -85c566a7fffffff -{ - -32.432513196 -27.322746246 - -32.515235839 -27.376597145 - -32.596041697 -27.321426878 - -32.594069834 -27.212238625 - -32.511230753 -27.158438759 - -32.430480037 -27.213775719 -} -852449b3fffffff -{ - 44.812461205 115.941013600 - 44.729944049 115.926524489 - 44.685166283 116.007494486 - 44.722758766 116.102927279 - 44.805147990 116.117678005 - 44.850072698 116.036734827 -} -85b6cc63fffffff -{ - -19.100953831 -94.480375226 - -19.172442317 -94.541628344 - -19.260330864 -94.505458445 - -19.276763725 -94.407960834 - -19.205262930 -94.346667700 - -19.117341606 -94.382912074 -} -8568da47fffffff -{ - -2.347002561 122.588360420 - -2.438555353 122.604861033 - -2.472253805 122.689794478 - -2.414365591 122.758285344 - -2.322739592 122.741780136 - -2.289075002 122.656788598 -} -8520f413fffffff -{ - 41.807138680 75.029789224 - 41.719213381 75.083855494 - 41.710257172 75.213191055 - 41.789185814 75.288818877 - 41.877215031 75.235006650 - 41.886211782 75.105311747 -} -850f8433fffffff -{ - 67.761890302 -87.662628104 - 67.695154417 -87.846001170 - 67.602402675 -87.786409715 - 67.576225826 -87.544909849 - 67.642655126 -87.361543115 - 67.735567044 -87.419664230 -} -850d164bfffffff -{ - 71.896811441 -170.931338876 - 71.809445393 -171.051591905 - 71.734742795 -170.874138056 - 71.747003816 -170.577328550 - 71.834014018 -170.455317957 - 71.909119483 -170.631858643 -} -8545191bfffffff -{ - 20.960569565 -86.037514750 - 21.028965011 -85.975097725 - 21.114914561 -86.002010180 - 21.132500863 -86.091485529 - 21.064031657 -86.153977022 - 20.978049983 -86.126918753 + 44.420169429 132.767211377 + 44.498226293 132.729972486 + 44.508658606 132.627558043 + 44.441115175 132.562656222 + 44.363179469 132.599982290 + 44.352666091 132.702123472 } -8500727bfffffff +8502294bfffffff { - 82.570295581 20.677885172 - 82.638696461 21.081184690 - 82.721041026 20.791091847 - 82.734187229 20.087514057 - 82.664855517 19.688852840 - 82.583311161 19.988929687 -} -85ed6e2ffffffff -{ - -75.227528696 173.438720572 - -75.242110034 173.145946618 - -75.322686535 173.050415995 - -75.388810715 173.250235104 - -75.373994176 173.545681240 - -75.293289928 173.638621873 -} -85c8cea7fffffff -{ - -37.530238881 98.320032402 - -37.459386946 98.263768159 - -37.460510757 98.150964451 - -37.532478715 98.094089661 - -37.603483177 98.150177547 - -37.602367173 98.263317298 -} -85beb1bbfffffff -{ - -27.323385184 158.952253162 - -27.231366778 158.921571067 - -27.208102695 158.816367857 - -27.276824346 158.741659017 - -27.368916299 158.772182621 - -27.392213138 158.877573866 -} -8506b12bfffffff -{ - 75.080268823 -50.571457469 - 75.067094500 -50.917217879 - 74.982299188 -51.030439816 - 74.910971202 -50.800358720 - 74.924042059 -50.457889832 - 75.008543487 -50.342231662 -} -854d3063fffffff -{ - 30.516069480 -63.212877845 - 30.484325888 -63.301682382 - 30.412762275 -63.314594117 - 30.372994973 -63.238932956 - 30.404639551 -63.150314655 - 30.476150248 -63.137171494 -} -8522c04ffffffff -{ - 53.381339057 -169.690956673 - 53.462174756 -169.655943948 - 53.527054352 -169.758591473 - 53.511020852 -169.896393434 - 53.430097690 -169.931138572 - 53.365295394 -169.828350236 -} -8500030bfffffff -{ - 80.102934736 41.426159861 - 80.147275638 41.858774215 - 80.236661740 41.831167892 - 80.281564555 41.362521557 - 80.236511122 40.926475548 - 80.147273137 40.962493301 -} -85938a1bfffffff -{ - -8.498571726 -110.172793948 - -8.565227561 -110.225530998 - -8.647667974 -110.200224476 - -8.663517452 -110.122093199 - -8.596823483 -110.069270401 - -8.514318180 -110.094664625 -} -858b9c93fffffff -{ - -11.106778356 -55.479666682 - -11.028830347 -55.429920946 - -10.944868663 -55.473501022 - -10.938894696 -55.566762675 - -11.016822180 -55.616461283 - -11.100744160 -55.572945468 -} -85a5050ffffffff -{ - -12.277700133 -26.915026672 - -12.195921397 -26.869109394 - -12.117479228 -26.915358746 - -12.120791622 -27.007574323 - -12.202612037 -27.053561944 - -12.281078366 -27.007263741 -} -85e018a7fffffff -{ - -56.475266475 59.441561458 - -56.386836826 59.456429398 - -56.340282310 59.332274842 - -56.381929664 59.193121684 - -56.470241590 59.177591286 - -56.517024246 59.301875465 -} -85e6234ffffffff -{ - -65.822779643 22.708907610 - -65.736604836 22.650584846 - -65.709153135 22.440562539 - -65.767752777 22.287577485 - -65.854140589 22.344675095 - -65.881716383 22.555987751 -} -850173abfffffff -{ - 75.812410264 12.309183900 - 75.879842005 12.467635428 - 75.950008374 12.276065564 - 75.952246075 11.924423260 - 75.884406943 11.768083798 - 75.814736979 11.961248489 -} -8546dd8ffffffff -{ - 16.032006291 -166.399461402 - 15.941054707 -166.424249969 - 15.874994951 -166.357680068 - 15.899861785 -166.266252009 - 15.990860242 -166.241370792 - 16.056945030 -166.308010227 -} -85228bc7fffffff -{ - 53.020566444 -162.679736927 - 53.097268302 -162.636988724 - 53.166005165 -162.725058945 - 53.157986463 -162.856099557 - 53.081185253 -162.898668420 - 53.012502075 -162.810376884 -} -8557930bfffffff -{ - 17.264535419 -44.671922176 - 17.337008078 -44.622782380 - 17.409787807 -44.668173586 - 17.410130022 -44.762682539 - 17.337703002 -44.811820944 - 17.264888141 -44.766451916 -} -85ef3147fffffff -{ - -84.839364063 -40.510026942 - -84.774113236 -39.745383955 - -84.682223280 -39.999928257 - -84.654918060 -40.990694746 - -84.718703952 -41.753142438 - -84.811242243 -41.527439943 -} -85ec82b7fffffff -{ - -63.197157587 136.132989919 - -63.154752200 135.953897511 - -63.205797546 135.786573087 - -63.299506983 135.798025306 - -63.342070471 135.977920098 - -63.290765740 136.145558677 -} -85bc5e33fffffff -{ - -30.792925608 23.761941089 - -30.705005366 23.769746629 - -30.653286478 23.681003752 - -30.689479264 23.584454358 - -30.777380187 23.576573860 - -30.829107733 23.665317646 -} -85d19edbfffffff -{ - -47.285442019 -0.660157134 - -47.375474158 -0.693931902 - -47.437586192 -0.595122839 - -47.409581014 -0.462617433 - -47.319539456 -0.429168655 - -47.257512320 -0.527898887 -} -850943affffffff -{ - 70.135756285 12.212954729 - 70.195884022 12.320961016 - 70.260040980 12.189643033 - 70.263722788 11.949566505 - 70.203310040 11.842549831 - 70.139500213 11.974611731 -} -855f76cffffffff -{ - 4.710201113 -59.208972838 - 4.789022745 -59.161629816 - 4.867293033 -59.202313749 - 4.866729996 -59.290270034 - 4.787970603 -59.337556208 - 4.709712046 -59.296943020 -} -85dd148bfffffff -{ - -63.143762847 -7.455564157 - -63.055755350 -7.404041964 - -62.989774207 -7.550970780 - -63.011480300 -7.749478025 - -63.099355508 -7.802118694 - -63.165657668 -7.655137081 -} -855cc193fffffff -{ - 5.460385854 -148.307602522 - 5.370074518 -148.339800710 - 5.297905681 -148.276878111 - 5.315999377 -148.181779887 - 5.406268650 -148.149539204 - 5.478486327 -148.212439100 -} -8519132ffffffff -{ - 58.408136646 -13.810079528 - 58.352420233 -13.921706071 - 58.273460819 -13.871572751 - 58.250184668 -13.710273827 - 58.305802262 -13.598722343 - 58.384794611 -13.648393862 -} -8582c99bfffffff -{ - 2.418251701 3.975759176 - 2.500058200 3.987966659 - 2.543224002 3.927878672 - 2.504664629 3.855650642 - 2.422949984 3.843420480 - 2.379702877 3.903440960 -} -85e38043fffffff -{ - -67.411701662 -126.881891953 - -67.378451707 -126.680806507 - -67.294569701 -126.672053529 - -67.243993795 -126.863234837 - -67.277106752 -127.063459098 - -67.360931968 -127.073361450 -} -85f06d2ffffffff -{ - -76.929975964 17.464875772 - -76.836275223 17.391854968 - -76.802615270 17.007770780 - -76.862325486 16.692685195 - -76.956275528 16.760920172 - -76.990269057 17.149049655 -} -85291503fffffff -{ - 32.552151252 -121.840001534 - 32.636316823 -121.789305700 - 32.713875520 -121.848007936 - 32.707203529 -121.957407663 - 32.623032493 -122.007954299 - 32.545538877 -121.949250679 -} -855a0e4ffffffff -{ - 15.329866760 171.268811176 - 15.416512297 171.273727504 - 15.462972888 171.193697181 - 15.422680591 171.108808833 - 15.336017867 171.104047526 - 15.289664482 171.184019497 -} -85e08107fffffff -{ - -52.408544715 65.601351838 - -52.320496300 65.600402381 - -52.282360107 65.477710441 - -52.332061034 65.355741366 - -52.420045229 65.356112562 - -52.458393104 65.479030798 -} -85afa35bfffffff -{ - -26.681200142 85.720126337 - -26.771687081 85.751191164 - -26.791760626 85.852527086 - -26.721377309 85.922641275 - -26.630972664 85.891498334 - -26.610869021 85.790319068 -} -85f3a5a7fffffff -{ - -77.335605406 179.565429441 - -77.414589496 179.513245163 - -77.458367581 179.828378920 - -77.422580751 -179.805680971 - -77.343426907 -179.758043256 - -77.300226542 179.928212902 -} -854e5c97fffffff -{ - 20.920868050 143.625043790 - 20.832210192 143.640326126 - 20.797569393 143.732770556 - 20.851584996 143.809930164 - 20.940215254 143.794679423 - 20.974857576 143.702237419 -} -855e10b3fffffff -{ - 11.799143271 -52.982687666 - 11.876418283 -52.933919916 - 11.951746989 -52.977182248 - 11.949816159 -53.069159678 - 11.872600287 -53.117892187 - 11.797256140 -53.074682614 -} -859e2b07fffffff -{ - -18.437709707 164.204178327 - -18.352768957 164.172025567 - -18.332814434 164.077186344 - -18.397788527 164.014336593 - -18.482824720 164.046383631 - -18.502791410 164.141386400 -} -850604b7fffffff -{ - 69.653915800 -27.156529023 - 69.671834223 -27.392096406 - 69.603973699 -27.550933847 - 69.518490108 -27.474182491 - 69.500768841 -27.240140341 - 69.568334832 -27.081330254 -} -85d12963fffffff -{ - -37.522946886 13.055000749 - -37.614425890 13.043789474 - -37.668052985 13.132532861 - -37.630146825 13.232317989 - -37.538733872 13.243282011 - -37.485160917 13.154708072 -} -85069a17fffffff -{ - 72.534455583 -64.342472119 - 72.499541598 -64.631039654 - 72.407286050 -64.666832179 - 72.350057195 -64.416559449 - 72.384720585 -64.129903218 - 72.476861858 -64.091615040 -} -85499e6ffffffff -{ - 22.369683257 -98.235097350 - 22.446282209 -98.172579831 - 22.534808862 -98.211887188 - 22.546719361 -98.313840775 - 22.470043237 -98.376367613 - 22.381533851 -98.336931747 -} -851091bbfffffff -{ - 50.858008263 49.459234155 - 50.790474162 49.557847165 - 50.813083244 49.697748787 - 50.903350382 49.739419022 - 50.971028288 49.640723351 - 50.948294996 49.500439408 -} -8535a40ffffffff -{ - 42.841908156 -33.041703805 - 42.760146964 -33.109544144 - 42.677380688 -33.047443954 - 42.676286993 -32.917625121 - 42.757982424 -32.849613583 - 42.840837322 -32.911591416 -} -850e4c0bfffffff -{ - 51.443234852 -67.960503191 - 51.400066580 -68.097787269 - 51.305591978 -68.107213503 - 51.254333482 -67.979966865 - 51.297341262 -67.843079851 - 51.391767580 -67.833042862 -} -85054ec3fffffff -{ - 82.046959332 167.631669973 - 81.951162043 167.601557888 - 81.898396408 168.176129196 - 81.940548221 168.786184867 - 82.036214721 168.830175178 - 82.089869975 168.250269482 -} -8570c977fffffff -{ - -4.871779031 -165.075959979 - -4.951965152 -165.099392615 - -5.017410215 -165.038092734 - -5.002737634 -164.953306518 - -4.922547197 -164.929797494 - -4.857033575 -164.991151023 -} -85020643fffffff -{ - 79.560252697 -114.624647818 - 79.541101288 -115.107798247 - 79.455592626 -115.279962567 - 79.389746986 -114.974549775 - 79.408740624 -114.498384705 - 79.493735576 -114.320711951 -} -8524e267fffffff -{ - 40.284020494 105.454296859 - 40.197663617 105.456656106 - 40.161856241 105.549848381 - 40.212246254 105.640760953 - 40.298524442 105.638695311 - 40.334491455 105.545423703 -} -85026313fffffff -{ - 75.734329517 -74.646253092 - 75.686276397 -74.968064827 - 75.595583182 -74.951864951 - 75.552911415 -74.617625341 - 75.600557249 -74.297494831 - 75.691279644 -74.309920107 -} -8522f377fffffff -{ - 52.671129628 -167.044974287 - 52.751064264 -167.007263720 - 52.817749335 -167.103560124 - 52.804430755 -167.237738604 - 52.724402136 -167.275218976 - 52.657786014 -167.178751941 -} -85d95c93fffffff -{ - -55.274734028 129.507246074 - -55.222065940 129.371562724 - -55.262285144 129.228316670 - -55.355385999 129.220402861 - -55.408232137 129.356459784 - -55.367798864 129.500056898 -} -85b49373fffffff -{ - -20.108484456 -147.369790779 - -20.017949571 -147.343660720 - -19.949702837 -147.414501798 - -19.971900963 -147.511511954 - -20.062423680 -147.537788981 - -20.130760546 -147.466909025 -} -850a9597fffffff -{ - 56.733010544 98.940296617 - 56.642312329 98.958537651 - 56.602802891 99.103238450 - 56.653837243 99.229989809 - 56.744489821 99.212375779 - 56.784154024 99.067383426 -} -857a5e97fffffff -{ - 2.592529807 38.374913083 - 2.681350521 38.376197594 - 2.730329481 38.297689361 - 2.690528148 38.217834062 - 2.601674912 38.216489107 - 2.552655451 38.295059915 -} -85be080ffffffff -{ - -33.945301293 150.404926579 - -33.849999382 150.381330245 - -33.819325439 150.270350227 - -33.883881595 150.182790439 - -33.979207536 150.206163395 - -34.009953436 150.317319757 -} -850785cbfffffff -{ - 76.882190571 -22.712702870 - 76.909791597 -23.058016537 - 76.850324791 -23.315404013 - 76.763659613 -23.226826509 - 76.736352241 -22.884628913 - 76.795418469 -22.627907761 -} -85e90d6bfffffff -{ - -64.169149888 -104.542880145 - -64.107010926 -104.390382246 - -64.021878925 -104.441647836 - -63.998788183 -104.644570349 - -64.060737019 -104.797074853 - -64.145966297 -104.746652849 -} -85ee214bfffffff -{ - -76.776848534 -42.603816931 - -76.712294193 -42.286555902 - -76.616977996 -42.372291600 - -76.585991892 -42.770484814 - -76.649955953 -43.087038524 - -76.745493235 -43.006130320 -} -853ad107fffffff -{ - 21.348395721 -50.495286724 - 21.272163914 -50.527091477 - 21.201109995 -50.471287092 - 21.206167351 -50.383641632 - 21.282377442 -50.351676876 - 21.353552022 -50.407517450 -} -853788bbfffffff -{ - 34.837663610 -153.419519227 - 34.757232735 -153.454045694 - 34.695225725 -153.380712461 - 34.713647662 -153.272847911 - 34.794083696 -153.238245274 - 34.856092692 -153.311583171 -} -85cb6ecbfffffff -{ - -31.196881685 59.632604026 - -31.291032262 59.644837214 - -31.330615426 59.745010395 - -31.275977355 59.832891002 - -31.181788399 59.820492528 - -31.142275795 59.720378722 -} -85e5481bfffffff -{ - -69.195281889 96.562646731 - -69.111151904 96.434510253 - -69.107294430 96.165184054 - -69.187531213 96.022083216 - -69.271923745 96.149098927 - -69.275817136 96.420346038 -} -850f7533fffffff -{ - 62.668547081 -57.972811537 - 62.639673865 -58.169727759 - 62.545744470 -58.213601361 - 62.480837604 -58.061559815 - 62.509599172 -57.865638355 - 62.603378711 -57.820766844 -} -85679ad3fffffff -{ - 11.099671395 -83.714430595 - 11.031463432 -83.769701998 - 10.953375446 -83.732842412 - 10.943538937 -83.640681280 - 11.011803362 -83.585423560 - 11.089847805 -83.622313164 -} -854a338bfffffff -{ - 23.820039775 127.566674386 - 23.736789440 127.583821502 - 23.712709343 127.675394261 - 23.771923288 127.749870969 - 23.855196994 127.732727817 - 23.879233453 127.641103917 -} -85c34e73fffffff -{ - -35.327875288 -63.069935465 - -35.397680045 -63.121653972 - -35.459061134 -63.078202741 - -35.450629549 -62.983083310 - -35.380866100 -62.931478671 - -35.319492951 -62.974879495 -} -8529926ffffffff -{ - 38.414710732 -110.769778246 - 38.492754695 -110.705387092 - 38.573471170 -110.761536350 - 38.576102060 -110.882166900 - 38.498022871 -110.946464411 - 38.417348028 -110.890225421 -} -859b899bfffffff -{ - -15.311630469 -169.607949339 - -15.228323586 -169.566942234 - -15.156042705 -169.620222821 - -15.166995897 -169.714418763 - -15.250199693 -169.755471883 - -15.322553351 -169.702283265 -} -85004eb3fffffff -{ - 84.158206146 -24.489057969 - 84.242572191 -24.634948800 - 84.273323983 -25.489086693 - 84.218859157 -26.179160440 - 84.134952446 -26.010993297 - 84.105036588 -25.174822893 -} -85404503fffffff -{ - 24.318412129 100.519351608 - 24.407254815 100.494310888 - 24.433921174 100.395197263 - 24.371732634 100.321159331 - 24.282872566 100.346259934 - 24.256218359 100.445338697 -} -85b4014bfffffff -{ - -27.577818405 -157.537206824 - -27.486194998 -157.499773770 - -27.411640006 -157.570471918 - -27.428632043 -157.678570629 - -27.520203174 -157.716133796 - -27.594834606 -157.645468433 -} -85dbabd3fffffff -{ - -51.198300908 177.013399234 - -51.124593180 176.951829977 - -51.127309036 176.816944295 - -51.203792165 176.743267684 - -51.277595924 176.804754129 - -51.274820481 176.940000789 -} -85c856d7fffffff -{ - -41.062706912 104.354396451 - -40.991584987 104.284280830 - -40.998843420 104.163007362 - -41.077259743 104.111465924 - -41.148562402 104.181451187 - -41.141267911 104.303109115 -} -85a8b297fffffff -{ - -22.818217502 -39.487675805 - -22.742198110 -39.436221484 - -22.666019683 -39.484944268 - -22.665875276 -39.585119996 - -22.741919021 -39.636597205 - -22.818082812 -39.587875954 -} -85e61503fffffff -{ - -63.244064893 24.221937106 - -63.160835003 24.164790289 - -63.135349246 23.975716413 - -63.192996427 23.842732794 - -63.276434032 23.898933685 - -63.302017183 24.089067818 -} -857f7657fffffff -{ - -6.504703467 171.307265708 - -6.434706772 171.274944519 - -6.416989861 171.194823699 - -6.469272230 171.146900265 - -6.539363007 171.179170486 - -6.557077320 171.259415277 -} -85d5991bfffffff -{ - -48.210466637 -151.278036043 - -48.127539414 -151.238273329 - -48.066563793 -151.331258557 - -48.088455949 -151.464030852 - -48.171364243 -151.504039136 - -48.232399432 -151.411030002 -} -851ee907fffffff -{ - 43.892141352 28.683959036 - 43.802529042 28.673136727 - 43.749239556 28.779101283 - 43.785501969 28.895934574 - 43.875084893 28.906986777 - 43.928434942 28.800976002 -} -858d0507fffffff -{ - -14.750636375 109.906870827 - -14.676315747 109.888306915 - -14.660778204 109.805900151 - -14.719624617 109.742060242 - -14.793949565 109.760683776 - -14.809423861 109.843087632 -} -8508ab83fffffff -{ - 62.521206129 18.149057755 - 62.496878465 18.286814579 - 62.551429542 18.396917930 - 62.630442201 18.369144565 - 62.654757007 18.230725264 - 62.600071915 18.120743653 -} -85430663fffffff -{ - 28.690189387 54.338846889 - 28.620482786 54.403148300 - 28.628896269 54.502544338 - 28.707100965 54.537842748 - 28.776955320 54.473542077 - 28.768457066 54.373941942 -} -8504b53bfffffff -{ - 67.582492779 134.174962964 - 67.499210497 134.300339037 - 67.497950171 134.552098251 - 67.579980553 134.680340684 - 67.663593922 134.555899045 - 67.664845802 134.302271172 -} -850af26bfffffff -{ - 61.689403394 104.379064816 - 61.640161904 104.542606935 - 61.678619402 104.709871566 - 61.766593571 104.714148763 - 61.816086698 104.550060191 - 61.777353175 104.382240846 -} -850269abfffffff -{ - 72.512110852 -67.917706631 - 72.472015209 -68.199994519 - 72.379088160 -68.218836768 - 72.326322806 -67.957967833 - 72.366132769 -67.677355181 - 72.458992079 -67.655940146 -} -85d42ddbfffffff -{ - -50.458243537 -166.492164679 - -50.384516264 -166.435286648 - -50.314319813 -166.516505078 - -50.317804214 -166.654441131 - -50.391471380 -166.711448610 - -50.461714275 -166.630391274 -} -85f30d8ffffffff -{ - -73.826689176 -155.944002529 - -73.900121787 -155.855042747 - -73.910027446 -155.557413339 - -73.846269770 -155.351354812 - -73.773070941 -155.442601311 - -73.763394670 -155.737633860 + 78.969096234 -90.621893675 + 78.903431346 -90.951667974 + 78.820083686 -90.818184681 + 78.802076310 -90.359784590 + 78.867172421 -90.029422381 + 78.950842315 -90.158004640 } -85e56527fffffff +853eb0b3fffffff { - -71.980509688 110.254497467 - -71.909860192 110.056166621 - -71.927234361 109.754038527 - -72.015398180 109.647931777 - -72.086412960 109.845916945 - -72.068897721 110.150366829 + 22.615117667 15.381328660 + 22.519325511 15.384033023 + 22.472573153 15.474974013 + 22.521558069 15.563322890 + 22.617386402 15.560771886 + 22.664193757 15.469718574 } -85ec4897fffffff -{ - -79.399155070 134.368849658 - -79.363036747 133.948987586 - -79.413873890 133.541190387 - -79.501348432 133.551027122 - -79.537904702 133.975100756 - -79.486544491 134.385110408 -} -854f1823fffffff -{ - 16.981037390 155.442407840 - 16.892239452 155.454855980 - 16.853478535 155.538800614 - 16.903481680 155.610258178 - 16.992208000 155.597851942 - 17.031002810 155.513946223 -} -85d293cffffffff -{ - -42.979666200 -92.427694761 - -42.904687451 -92.350443535 - -42.816510171 -92.400004672 - -42.803172175 -92.526606105 - -42.878025793 -92.604019144 - -42.966342524 -92.554669783 -} -856cd563fffffff -{ - -0.197474468 -98.823463270 - -0.270861947 -98.880230686 - -0.354914377 -98.848421533 - -0.365594244 -98.759769580 - -0.292147443 -98.702949395 - -0.208080152 -98.734833859 -} -85d39c53fffffff -{ - -50.654901459 -96.883984850 - -50.581223784 -96.786492720 - -50.491018495 -96.836695040 - -50.474368064 -96.984042969 - -50.547905974 -97.081677546 - -50.638233964 -97.031822997 -} -85c01557fffffff -{ - -35.015226306 -13.640423667 - -35.105730621 -13.684256651 - -35.182093314 -13.610402489 - -35.167858033 -13.492645492 - -35.077277663 -13.448980658 - -35.001008566 -13.522904201 -} -85126d67fffffff -{ - 56.042241734 -99.654738047 - 55.966705241 -99.752437339 - 55.879692306 -99.684037867 - 55.868013481 -99.518386854 - 55.943350457 -99.420379121 - 56.030565726 -99.488328434 -} -85c69407fffffff -{ - -41.992348358 -123.059243461 - -41.942705229 -122.950183536 - -41.847490006 -122.951456339 - -41.801962685 -123.061429116 - -41.851501860 -123.170263815 - -41.946672070 -123.169350818 -} -85189133fffffff -{ - 49.413527277 -26.285416488 - 49.339174106 -26.368908684 - 49.256591501 -26.308477835 - 49.248293442 -26.164783857 - 49.322562894 -26.081170689 - 49.405214064 -26.141371604 -} -8512aed7fffffff -{ - 55.830558317 -126.352197475 - 55.748150564 -126.378396508 - 55.686869847 -126.268395907 - 55.707802571 -126.132008630 - 55.790206848 -126.105179683 - 55.851682309 -126.215367290 -} -85b124a7fffffff -{ - -35.980345932 -124.999197929 - -35.932517244 -124.900011714 - -35.840605089 -124.898278538 - -35.796574520 -124.995442417 - -35.844305252 -125.094429829 - -35.936164308 -125.096452000 -} -85008c9bfffffff -{ - 79.101080848 72.666479534 - 79.100056050 73.147299891 - 79.180138802 73.384640771 - 79.261794097 73.137253601 - 79.262732082 72.649140561 - 79.182102186 72.415779489 -} -8585816ffffffff -{ - -6.563638336 57.583992351 - -6.648006375 57.592534307 - -6.677570237 57.673068145 - -6.622668749 57.745028870 - -6.538275769 57.736376386 - -6.508809114 57.655873715 -} -8523ab5bfffffff -{ - 43.257593683 -160.864370403 - 43.339605759 -160.826491608 - 43.409113863 -160.898074282 - 43.396556575 -161.007708585 - 43.314425708 -161.045474525 - 43.244970949 -160.973719538 -} -852b607bfffffff -{ - 40.978197507 -57.540479400 - 40.948345840 -57.652500780 - 40.865419823 -57.678359110 - 40.812453009 -57.592516372 - 40.842224510 -57.480819553 - 40.925042799 -57.454641508 -} -850e34abfffffff -{ - 64.478231450 -77.341559269 - 64.423146375 -77.527112752 - 64.326467923 -77.508792469 - 64.284829770 -77.306230498 - 64.339654844 -77.121152580 - 64.436377174 -77.138159740 -} -85da0b5bfffffff -{ - -51.832907267 162.988939698 - -51.750360665 162.941274476 - -51.736356348 162.795991854 - -51.804889417 162.697996703 - -51.887510434 162.745400212 - -51.901524066 162.891061490 -} -85da1543fffffff -{ - -50.779125562 170.669435719 - -50.700276461 170.613995878 - -50.695337723 170.474523030 - -50.769278660 170.390116495 - -50.848219664 170.445394038 - -50.853127844 170.585241294 -} -85d3a0c7fffffff -{ - -54.889845478 -102.309399036 - -54.821224376 -102.192930912 - -54.729995310 -102.237662167 - -54.707290106 -102.398366825 - -54.775756258 -102.514888796 - -54.867082321 -102.470653671 -} -85da4b3bfffffff -{ - -54.118681719 149.337000914 - -54.033569168 149.307228520 - -54.003353296 149.160177239 - -54.058181324 149.042598199 - -54.143315687 149.071968145 - -54.173600437 149.219320092 -} -859a5167fffffff -{ - -9.642908866 -178.263855747 - -9.567786478 -178.222148498 - -9.502244070 -178.263647197 - -9.511766570 -178.346744901 - -9.586776067 -178.388453549 - -9.652375870 -178.347063230 -} -85ae2423fffffff -{ - -22.225030785 92.695189058 - -22.311656025 92.728160818 - -22.328594539 92.820847504 - -22.258964994 92.880418549 - -22.172444889 92.847408113 - -22.155449229 92.754865106 -} -85c7944ffffffff -{ - -49.070557448 -128.152221211 - -49.028415680 -128.026636391 - -48.933840326 -128.018715659 - -48.881485789 -128.135940043 - -48.923551956 -128.261177039 - -49.018048015 -128.269536974 -} -85016147fffffff -{ - 74.806709603 0.912069000 - 74.878103172 0.998894449 - 74.936408603 0.771490316 - 74.922827378 0.457106674 - 74.851199708 0.372918131 - 74.793385754 0.600461073 -} -856dac63fffffff -{ - 12.767255343 -98.785954039 - 12.842413379 -98.728074878 - 12.926388668 -98.765022888 - 12.935170565 -98.859959288 - 12.859920321 -98.917843457 - 12.775980462 -98.880786385 -} -853a0923fffffff -{ - 27.308073228 -46.270765785 - 27.226282136 -46.310602847 - 27.150484815 -46.251799647 - 27.156359123 -46.153145042 - 27.238121864 -46.113130408 - 27.314038761 -46.171947718 -} -85b49083fffffff -{ - -21.929312072 -147.165326352 - -21.837908017 -147.138960247 - -21.769520452 -147.211025073 - -21.792450063 -147.309497639 - -21.883845337 -147.336016018 - -21.952319887 -147.263909702 -} -85ef50abfffffff -{ - -76.741089574 -56.626063037 - -76.695610747 -56.255130108 - -76.598659905 -56.242162100 - -76.547255623 -56.594997817 - -76.592262434 -56.962930233 - -76.689141879 -56.981021152 -} -852b1c3bfffffff -{ - 45.275964527 -66.686162202 - 45.235468245 -66.805783447 - 45.145569529 -66.816522647 - 45.096220033 -66.708093127 - 45.136574183 -66.588784053 - 45.226419611 -66.577592692 -} -859f1e07fffffff -{ - -18.875966697 172.227687431 - -18.794534699 172.189954432 - -18.779085524 172.098335104 - -18.845096495 172.044285996 - -18.926646731 172.081956707 - -18.942067716 172.173739065 -} -853c5653fffffff -{ - 27.858221533 91.129157234 - 27.942145475 91.101010369 - 27.961416810 91.000118112 - 27.896784337 90.927436310 - 27.812871665 90.955616761 - 27.793580133 91.056445572 -} -85c4902bfffffff -{ - -42.443388064 -48.038427844 - -42.503981674 -48.106715924 - -42.585229570 -48.078436982 - -42.605936766 -47.981609606 - -42.545269772 -47.913204921 - -42.463969048 -47.941744161 -} -8532162bfffffff -{ - 36.827981413 173.441428570 - 36.924862776 173.450310830 - 36.979612413 173.349835727 - 36.937384810 173.240552398 - 36.840473024 173.231918796 - 36.785819098 173.332319706 -} -85c5264bfffffff -{ - -28.622331806 -35.927299327 - -28.698152564 -35.982528520 - -28.776969380 -35.941772064 - -28.779940916 -35.845605421 - -28.703997412 -35.790360834 - -28.625205233 -35.831298061 -} -85d50da3fffffff -{ - -54.567344211 -165.504722997 - -54.497979015 -165.445133587 - -54.432149886 -165.532818406 - -54.435629157 -165.679923376 - -54.504933639 -165.739670814 - -54.570819591 -165.652156082 -} -85c6d1bbfffffff -{ - -33.430017884 -128.032689588 - -33.385189983 -127.937141094 - -33.296064041 -127.931234637 - -33.251833622 -128.020621518 - -33.296576561 -128.115969132 - -33.385634714 -128.122130527 -} -85f2f0abfffffff -{ - -82.014711545 -112.159729039 - -82.056489944 -111.578482906 - -82.003973885 -111.027991614 - -81.910484738 -111.064429434 - -81.869485813 -111.638225853 - -81.921205644 -112.183014111 -} -850a4157fffffff -{ - 72.267923957 97.777757313 - 72.226784096 98.055608666 - 72.279180169 98.305184556 - 72.373152895 98.277758774 - 72.414598361 97.997970892 - 72.361763596 97.747551116 -} -85b27323fffffff -{ - -29.529149746 -65.683494493 - -29.603120885 -65.736251770 - -29.673091874 -65.693273300 - -29.669073665 -65.597576710 - -29.595142252 -65.544921412 - -29.525189348 -65.587860611 -} -85c40c87fffffff -{ - -40.458370417 -33.796055360 - -40.533909038 -33.859534460 - -40.617070064 -33.808548737 - -40.624677485 -33.693844721 - -40.549032653 -33.630364482 - -40.465886702 -33.681588991 -} -85564a2ffffffff -{ - 7.682188363 -26.686562612 - 7.757349769 -26.642073237 - 7.837472339 -26.686936882 - 7.842499404 -26.776336809 - 7.767342974 -26.820893200 - 7.687154466 -26.775982735 -} -8518900bfffffff -{ - 50.142568982 -28.377247633 - 50.067274733 -28.459126999 - 49.986433366 -28.395354797 - 49.980810949 -28.249913157 - 50.056025118 -28.167881243 - 50.136941743 -28.231442601 -} -855f1487fffffff -{ - 2.851973305 -53.157928525 - 2.932971308 -53.108562875 - 3.014814292 -53.152317449 - 3.015655840 -53.245383071 - 2.934707036 -53.294711885 - 2.852867511 -53.251012022 -} -85251a37fffffff -{ - 47.435243179 96.253431278 - 47.343224666 96.273499055 - 47.310035404 96.396066327 - 47.368715377 96.498797753 - 47.460701902 96.479155176 - 47.494040692 96.356355852 -} -85430e87fffffff -{ - 30.103201127 56.862777971 - 30.030890039 56.926713844 - 30.038018122 57.030195640 - 30.117531229 57.069967046 - 30.189991606 57.006054356 - 30.182789445 56.902346696 -} -85244977fffffff -{ - 44.197325294 115.745922643 - 44.114951080 115.731903532 - 44.070784466 115.812256993 - 44.108844608 115.906605834 - 44.191092511 115.920881895 - 44.235406618 115.840552646 -} -85986bbbfffffff -{ - -15.878850402 3.348508060 - -15.960528862 3.329695875 - -16.021576573 3.398022845 - -16.000836710 3.485103147 - -15.919147563 3.503760346 - -15.858208824 3.435492306 -} -85e0492ffffffff -{ - -56.167277929 41.946063213 - -56.090131247 41.999921344 - -56.033310848 41.919727387 - -56.053465200 41.785914464 - -56.130414154 41.731708031 - -56.187406426 41.811661176 -} -8570f167fffffff -{ - -1.558379084 -169.621994614 - -1.639798915 -169.643096371 - -1.705258406 -169.582500144 - -1.689361821 -169.500732042 - -1.607917381 -169.479548667 - -1.542394061 -169.540214988 -} -85f2833bfffffff -{ - -87.099919385 -114.893218534 - -87.146939516 -113.320340603 - -87.097582157 -111.774792473 - -87.003385504 -111.849701679 - -86.958475884 -113.372228432 - -87.005719867 -114.870113843 +85f2939bfffffff +{ + -89.718092729 109.472925507 + -89.722562839 90.522944647 + -89.790452443 76.048158603 + -89.881742454 84.142735302 + -89.867510404 126.833332400 + -89.776440832 126.320987469 } -85f1a627fffffff -{ - -77.589113064 119.879569379 - -77.533009904 119.559948386 - -77.564435084 119.155769506 - -77.652290598 119.067524734 - -77.708895332 119.388106092 - -77.677140166 119.795991074 -} -85bd9bc3fffffff -{ - -30.295096694 40.845673944 - -30.207497432 40.846073732 - -30.167876346 40.756439318 - -30.215876622 40.666311241 - -30.303517666 40.665833299 - -30.343116728 40.755561634 -} -85f172d3fffffff -{ - -85.975638620 84.444116812 - -85.953283630 83.183248569 - -86.017680911 82.307213429 - -86.106238188 82.695357544 - -86.129279755 84.004236404 - -86.063055841 84.875842218 -} -85b8d22bfffffff -{ - -20.679688241 128.744767577 - -20.595747414 128.746695928 - -20.559843293 128.672174321 - -20.607751891 128.595717754 - -20.691619121 128.593644047 - -20.727651425 128.668172130 -} -85f21ba7fffffff -{ - -80.708105233 -122.616133629 - -80.762548858 -122.179526711 - -80.724787459 -121.661299939 - -80.633081926 -121.586715222 - -80.579416009 -122.021095134 - -80.616683816 -122.532332853 -} -85c77687fffffff -{ - -42.514429065 -145.701792648 - -42.425758102 -145.671098784 - -42.365238226 -145.760144413 - -42.393336418 -145.879960844 - -42.482016423 -145.910888987 - -42.542589315 -145.821766654 -} -855845abfffffff -{ - 15.414840663 14.987029523 - 15.323008618 14.989881519 - 15.277152281 15.075198521 - 15.323063826 15.157764023 - 15.414930786 15.155046376 - 15.460851400 15.069628815 -} -857a58a7fffffff -{ - 2.950498581 36.790711252 - 3.039371777 36.792599148 - 3.088342900 36.713876695 - 3.048484865 36.633209680 - 2.959585891 36.631260809 - 2.910570644 36.710039941 -} -850a5c87fffffff -{ - 70.898096014 100.649093415 - 70.852759245 100.901851583 - 70.900976562 101.142266656 - 70.994930057 101.130887341 - 71.040583568 100.876642862 - 70.991965106 100.635266617 -} -85b4e607fffffff -{ - -23.547517464 -157.994840768 - -23.456584915 -157.958392825 - -23.382377524 -158.026216985 - -23.399019768 -158.130455674 - -23.489893544 -158.167022320 - -23.564183909 -158.099231841 -} -8597964bfffffff -{ - -11.174530701 41.497463757 - -11.079417425 41.497571500 - -11.031001809 41.415488750 - -11.077695117 41.333216799 - -11.172865359 41.333043709 - -11.221285379 41.415207954 -} -8506d68bfffffff -{ - 69.034192006 -54.064929503 - 69.013203072 -54.317445923 - 68.922897472 -54.387895486 - 68.853787001 -54.207300177 - 68.874675345 -53.956492472 - 68.964774084 -53.884578990 -} -85e62477fffffff -{ - -67.594593853 25.893966321 - -67.508934718 25.818613576 - -67.486222810 25.589684157 - -67.549077399 25.434537571 - -67.634993264 25.508575026 - -67.657798361 25.739081213 -} -85031373fffffff -{ - 84.003440187 -138.595526282 - 83.950198859 -139.317301421 - 83.856329761 -139.254339548 - 83.815610895 -138.492439379 - 83.867784835 -137.780049685 - 83.961729290 -137.820112116 -} -85554357fffffff -{ - 18.240186777 -6.407895361 - 18.176543435 -6.473778827 - 18.095537678 -6.453118252 - 18.078173599 -6.366734336 - 18.141708721 -6.300917289 - 18.222716003 -6.321417673 -} -85b13227fffffff -{ - -35.443544609 -119.052290433 - -35.390254805 -118.955989894 - -35.297524919 -118.963064582 - -35.258098765 -119.066143511 - -35.311265567 -119.162295865 - -35.403981298 -119.155517495 -} -85c6c5cbfffffff -{ - -33.791858865 -131.279061806 - -33.750071037 -131.183105485 - -33.661990704 -131.172735658 - -33.615783677 -131.258080015 - -33.657503330 -131.353818194 - -33.745498048 -131.364429871 -} -85158e4ffffffff -{ - 50.783365044 120.519851855 - 50.722937955 120.613718737 - 50.736685369 120.747521981 - 50.810975127 120.787953122 - 50.871633740 120.694110160 - 50.857770731 120.559810986 -} -851041affffffff -{ - 66.528153695 60.119476359 - 66.460932497 60.249866127 - 66.472798258 60.474347628 - 66.551946476 60.569522040 - 66.619365176 60.439375843 - 66.607437873 60.213807481 -} -85341513fffffff -{ - 34.817619877 -28.327347703 - 34.736978638 -28.393817241 - 34.649361265 -28.342140553 - 34.642302185 -28.224132875 - 34.722856382 -28.157563296 - 34.810556674 -28.209100947 -} -8519ac93fffffff -{ - 59.076823076 -15.597088321 - 59.020098797 -15.708805616 - 58.942388002 -15.654715430 - 58.921358389 -15.489367165 - 58.977979513 -15.377692044 - 59.055733199 -15.431322002 -} -8572592ffffffff -{ - 2.902958272 148.724781299 - 2.808405946 148.738628224 - 2.773803970 148.826173706 - 2.833706035 148.899853438 - 2.928213298 148.886042287 - 2.962863606 148.798515591 -} -850320dbfffffff -{ - 89.580321368 16.546660983 - 89.654567570 24.471028640 - 89.740561900 17.249948165 - 89.730608804 -2.712692205 - 89.641181002 -5.797779471 - 89.575388809 4.033882512 +858fa22bfffffff +{ + -2.980085083 -90.097978576 + -3.056412261 -90.156520040 + -3.144304246 -90.120157426 + -3.155860819 -90.025198321 + -3.079486549 -89.966640713 + -2.991602839 -90.003058229 +} +85369c53fffffff +{ + 27.225741513 -155.748336680 + 27.137993855 -155.780501000 + 27.071442393 -155.709456741 + 27.092631347 -155.606229297 + 27.180391253 -155.573986412 + 27.246950010 -155.645049384 +} +8598f337fffffff +{ + -20.792569733 -7.548720469 + -20.879399019 -7.580210468 + -20.948468160 -7.512770217 + -20.930592943 -7.413832433 + -20.843705053 -7.382491510 + -20.774750881 -7.449939056 +} +8500e9d3fffffff +{ + 87.158861841 29.576731317 + 87.221522304 30.887888441 + 87.311756100 30.409551069 + 87.337919854 28.521853931 + 87.272621079 27.212159440 + 87.183848530 27.785625674 +} +85135eaffffffff +{ + 61.246719932 -109.825744774 + 61.163519520 -109.909358924 + 61.084673456 -109.805938448 + 61.088779054 -109.619176071 + 61.171828650 -109.534864448 + 61.250923749 -109.638009248 +} +8502e3c7fffffff +{ + 73.570712357 -104.258885026 + 73.490428038 -104.426989470 + 73.411342437 -104.274769545 + 73.412198843 -103.955732906 + 73.492172435 -103.786074732 + 73.571600484 -103.936989259 +} +854e4e47fffffff +{ + 20.594623302 142.032971413 + 20.505617331 142.048534499 + 20.471677989 142.141446123 + 20.526746845 142.218797812 + 20.615730951 142.203264005 + 20.649668135 142.110349167 +} +85f28653fffffff +{ + -87.590871161 -169.836919192 + -87.681377132 -169.720069793 + -87.717617571 -167.665353908 + -87.660827203 -165.828505935 + -87.570810370 -166.090469119 + -87.536995327 -168.046189402 +} +850af12ffffffff +{ + 64.091908080 104.472939840 + 64.041959458 104.652372887 + 64.081791600 104.836293795 + 64.171868038 104.841455427 + 64.222088396 104.661367383 + 64.181959578 104.476772634 +} +8525430ffffffff +{ + 50.812992934 107.251250785 + 50.723927747 107.250657516 + 50.679679522 107.361598677 + 50.724337060 107.473224999 + 50.813303349 107.474247756 + 50.857711177 107.363215181 +} +85b693bbfffffff +{ + -24.630685659 -82.782582815 + -24.704254813 -82.844141356 + -24.787536387 -82.802667957 + -24.797249210 -82.699602330 + -24.723685789 -82.638066120 + -24.640403842 -82.679573032 +} +85986047fffffff +{ + -13.708869466 0.102094218 + -13.788682124 0.080418895 + -13.850065398 0.146316601 + -13.831523619 0.233850840 + -13.751683222 0.255381173 + -13.690412208 0.189522367 +} +85e54b4bfffffff +{ + -68.065704825 93.939099818 + -67.979390648 93.826341008 + -67.971581697 93.570738332 + -68.050021607 93.426182764 + -68.136566592 93.537798363 + -68.144441192 93.795120958 +} +852e7217fffffff +{ + 38.218585282 138.709749082 + 38.303460289 138.680176988 + 38.323968181 138.580431935 + 38.259654548 138.510505702 + 38.174906326 138.540196661 + 38.154344989 138.639695400 +} +8504283bfffffff +{ + 77.474418230 153.470537102 + 77.379002864 153.557177306 + 77.347105991 153.977308320 + 77.410228507 154.315319091 + 77.505865789 154.234136398 + 77.538162246 153.809458271 } -8580d4c7fffffff +850d6267fffffff { - 2.705486889 -38.644018972 - 2.787314160 -38.594584925 - 2.871230329 -38.641584277 - 2.873352102 -38.738019953 - 2.791542783 -38.787478897 - 2.707593737 -38.740477405 + 68.517439002 -139.634808609 + 68.463045771 -139.830179728 + 68.378135899 -139.810555856 + 68.347609977 -139.597288940 + 68.401680545 -139.402569888 + 68.486598437 -139.420463910 } -85c5aed3fffffff +85539177fffffff { - -33.596929856 -41.338522428 - -33.667616780 -41.398516260 - -33.748165620 -41.363430471 - -33.758037715 -41.268140654 - -33.687242186 -41.208092017 - -33.606683279 -41.243387839 + 18.071865934 34.259748329 + 17.979504376 34.247014507 + 17.925455832 34.324522653 + 17.963668197 34.414758074 + 18.055963836 34.427616038 + 18.110113108 34.350114588 } -858f8a27fffffff +8500403bfffffff { - -8.357945300 -89.504891279 - -8.434913092 -89.564385534 - -8.524429905 -89.527182482 - -8.536978333 -89.430430259 - -8.459976062 -89.370922255 - -8.370459876 -89.408180089 -} -85f29383fffffff + 83.766084723 -8.641392346 + 83.850926927 -8.550736139 + 83.904054159 -9.238431048 + 83.871173783 -10.010623798 + 83.786119218 -10.080876629 + 83.734143207 -9.399452855 +} +85ed56abfffffff +{ + -71.007660391 162.055719155 + -71.004811575 161.810294323 + -71.079572304 161.683986559 + -71.157393069 161.804236629 + -71.160149775 162.051612243 + -71.085178100 162.176777101 +} +85d72d9bfffffff +{ + -56.539642072 30.343901575 + -56.467011100 30.285040950 + -56.449182032 30.137640069 + -56.503955360 30.048432569 + -56.576785021 30.106834996 + -56.594642758 30.254905094 +} +850374cbfffffff +{ + 84.829947712 -54.141663360 + 84.896165099 -54.772491108 + 84.879831614 -55.783731467 + 84.797721962 -56.135290584 + 84.732932866 -55.498809974 + 84.748834971 -54.515895238 +} +85c0591bfffffff +{ + -40.389598458 -0.133971755 + -40.482655350 -0.163895033 + -40.547877779 -0.074002546 + -40.519955133 0.045743185 + -40.426893523 0.075396683 + -40.361759123 -0.014425483 +} +8500cd87fffffff +{ + 88.540007301 65.266943456 + 88.552128368 68.831629695 + 88.637402858 70.444620468 + 88.714329658 68.202877072 + 88.700807694 64.202137418 + 88.611882418 62.911515307 +} +85389017fffffff +{ + 24.223282606 -5.194699336 + 24.158972150 -5.265310164 + 24.073059097 -5.244638986 + 24.051471883 -5.153540140 + 24.115681546 -5.083012142 + 24.201579082 -5.103500097 +} +85594063fffffff +{ + 20.607995552 9.782988811 + 20.514561931 9.790242225 + 20.471383453 9.879167012 + 20.521601513 9.960970037 + 20.615099352 9.953852775 + 20.658314997 9.864796207 +} +85dca31bfffffff +{ + -52.284668316 -7.209497291 + -52.369265064 -7.256301083 + -52.433965242 -7.154618745 + -52.413974792 -7.006121352 + -52.329332605 -6.959657200 + -52.264726148 -7.061350002 +} +85dad54ffffffff +{ + -46.028732575 161.395468714 + -45.940645808 161.353775357 + -45.922809380 161.220881719 + -45.993047371 161.129371517 + -46.081205234 161.170832231 + -46.099054110 161.304036459 +} +85140583fffffff +{ + 56.559472471 126.125126398 + 56.489315519 126.226263609 + 56.498078213 126.390355370 + 56.577084176 126.454084526 + 56.647507029 126.353139343 + 56.638657719 126.188270544 +} +85a08e5bfffffff +{ + -12.450240770 -132.634241841 + -12.370149592 -132.623349134 + -12.312359820 -132.688573825 + -12.334584621 -132.764786136 + -12.414714035 -132.775804659 + -12.472580509 -132.710485021 +} +85ec8997fffffff +{ + -66.931250573 131.882093120 + -66.884554778 131.680479255 + -66.931944405 131.476455777 + -67.026303867 131.473407644 + -67.073216315 131.675922142 + -67.025551656 131.880583153 +} +85e5695bfffffff +{ + -71.660873644 99.981230611 + -71.580494490 99.823798477 + -71.581792231 99.521388487 + -71.663476177 99.373998456 + -71.744173802 99.530266242 + -71.742868952 99.835102358 +} +85030533fffffff +{ + 87.226166077 -84.439222777 + 87.255389511 -86.207457900 + 87.193262176 -87.643209126 + 87.104515197 -87.295859814 + 87.077046395 -85.607894300 + 87.136632979 -84.189001991 +} +85bea193fffffff +{ + -30.090395866 157.482689868 + -29.997094794 157.452516302 + -29.972671734 157.344093996 + -30.041511021 157.265650468 + -30.134876935 157.295647628 + -30.159338819 157.404265047 +} +850a5e27fffffff +{ + 70.037142012 104.557445353 + 69.986373995 104.791647323 + 70.029202040 105.032379538 + 70.123162194 105.040071637 + 70.174271167 104.804759201 + 70.131077375 104.562864883 +} +8500d327fffffff +{ + 83.073154361 101.917927741 + 83.028220208 102.599488661 + 83.077713056 103.270627822 + 83.173109215 103.268504773 + 83.218945624 102.576608359 + 83.168470568 101.897198731 +} +85ad5b5bfffffff +{ + -26.873630214 5.532961251 + -26.964027005 5.514253866 + -27.026716650 5.592037644 + -26.998913369 5.688438871 + -26.908533067 5.706946958 + -26.845939417 5.629253187 +} +85381463fffffff +{ + 31.911412057 -3.250762623 + 31.849061157 -3.328164867 + 31.759454980 -3.308046483 + 31.732237537 -3.210744077 + 31.794505021 -3.133453307 + 31.884073244 -3.153353428 +} +85ba7093fffffff +{ + -32.244849199 174.011847783 + -32.159860715 173.966626543 + -32.150352055 173.861050405 + -32.225887774 173.800477347 + -32.310996194 173.845627460 + -32.320448911 173.951422142 +} +85f332dbfffffff +{ + -74.989244551 179.173755205 + -75.065062603 179.128330973 + -75.107104890 179.387886239 + -75.072841433 179.691966251 + -74.996873662 179.734279622 + -74.955316940 179.475631125 +} +85396c87fffffff +{ + 44.455043037 4.401660680 + 44.369157642 4.416260892 + 44.340839509 4.527870669 + 44.398415677 4.625119814 + 44.484369984 4.610714881 + 44.512679308 4.498865172 +} +8511134ffffffff +{ + 57.530968473 34.056136705 + 57.484504669 34.179257640 + 57.525647716 34.313171937 + 57.613414656 34.324180185 + 57.659960960 34.200665770 + 57.618657542 34.066536987 +} +85f06d6bfffffff +{ + -77.118483790 19.821841978 + -77.025674246 19.731172935 + -76.995620063 19.337269977 + -77.058082827 19.029660703 + -77.151188575 19.115596667 + -77.181538145 19.513903397 +} +85f0e46ffffffff +{ + -75.777827934 59.783045019 + -75.688721315 59.814678264 + -75.633157172 59.533093895 + -75.666302215 59.219178016 + -75.752480381 59.176679874 + -75.809855741 59.462745409 + -75.800138087 59.572079029 +} +85519233fffffff +{ + 17.800442167 -119.440778145 + 17.882383273 -119.393616882 + 17.964140926 -119.444900399 + 17.963867251 -119.543359967 + 17.881886945 -119.590412964 + 17.800219466 -119.539114867 +} +8527637bfffffff +{ + 46.548119667 -85.499321069 + 46.488595454 -85.601369718 + 46.398837151 -85.573700872 + 46.368506664 -85.444427067 + 46.427825521 -85.342417143 + 46.517679922 -85.369641514 +} +85b19123fffffff +{ + -31.526255766 -109.141377225 + -31.466629358 -109.057446105 + -31.376990872 -109.077921543 + -31.346926937 -109.182079753 + -31.406407582 -109.265968174 + -31.496097735 -109.245741356 +} +850306c7fffffff +{ + 87.407649901 -136.044153780 + 87.358300261 -137.742299546 + 87.264113287 -137.655233208 + 87.219185862 -135.987845969 + 87.266215031 -134.347089449 + 87.360410930 -134.316223788 +} +85ccce47fffffff +{ + -37.301172411 72.923102149 + -37.391687434 72.947961690 + -37.419843999 73.061680789 + -37.357463116 73.150390596 + -37.266970912 73.125370985 + -37.238836665 73.011801396 +} +855a4da3fffffff +{ + 13.946170988 160.989887065 + 14.030598199 160.985174386 + 14.072402364 160.902789484 + 14.029699671 160.825225469 + 13.945305979 160.830083925 + 13.903581327 160.912360696 +} +85ee35bbfffffff +{ + -78.220562367 -33.851525836 + -78.146059211 -33.546490065 + -78.054839150 -33.708915144 + -78.037696103 -34.171392743 + -78.111543604 -34.477513877 + -78.203187402 -34.320124717 +} +85589003fffffff +{ + 6.182181111 1.626248644 + 6.104115314 1.637930219 + 6.065413549 1.712672007 + 6.104744189 1.775846511 + 6.182882875 1.764247255 + 6.221618078 1.689391057 +} +852116dbfffffff +{ + 46.081416072 57.379162137 + 46.004933724 57.461921920 + 46.016857170 57.597181364 + 46.105344646 57.650067769 + 46.181979139 57.567355694 + 46.169973846 57.431708643 +} +85cf3287fffffff +{ + -54.394996207 -73.347038846 + -54.311731130 -73.294419175 + -54.242404542 -73.380651061 + -54.256195208 -73.519533809 + -54.339439238 -73.572631078 + -54.408913868 -73.486368918 +} +85153133fffffff +{ + 57.268664468 110.686748910 + 57.213617267 110.818294818 + 57.241965286 110.970873275 + 57.325571622 110.992461680 + 57.380872335 110.860673969 + 57.352312564 110.707538761 +} +856a7377fffffff +{ + 6.901205076 31.965190585 + 6.986815295 31.968862924 + 7.033912903 31.891184236 + 6.995456369 31.809797118 + 6.909842183 31.806065374 + 6.862688403 31.883780144 +} +85ec81dbfffffff +{ + -64.163830847 136.805404872 + -64.122695788 136.619576676 + -64.174834922 136.448127194 + -64.268373848 136.462195811 + -64.309665894 136.648901576 + -64.257261315 136.820659215 +} +858325d3fffffff +{ + -16.184510388 12.631383433 + -16.091739465 12.642506229 + -16.034845160 12.567521532 + -16.070678580 12.481466409 + -16.163373142 12.470297244 + -16.220310668 12.545229480 +} +855070c3fffffff +{ + 21.181726591 -135.188387205 + 21.097566564 -135.225298940 + 21.022277373 -135.166692976 + 21.031154844 -135.071265594 + 21.115259199 -135.034358280 + 21.190541767 -135.092873785 +} +8572318bfffffff +{ + 5.544459541 135.748716515 + 5.448439587 135.764835432 + 5.414372651 135.856388962 + 5.476327915 135.931847778 + 5.572360840 135.915746989 + 5.606425593 135.824169185 +} +85c846cffffffff +{ + -43.577093667 103.137035851 + -43.503143208 103.064951724 + -43.509302154 102.936708515 + -43.589439441 102.880118768 + -43.663573754 102.952039950 + -43.657386850 103.080714863 +} +8537b3cbfffffff +{ + 36.780562323 -159.617492606 + 36.701299679 -159.649120571 + 36.645475209 -159.574391637 + 36.668913416 -159.467988679 + 36.748196490 -159.436261910 + 36.804020986 -159.511036758 +} +851321affffffff +{ + 69.245466564 -119.122001274 + 69.157537470 -119.195822984 + 69.090365522 -119.031597620 + 69.110827241 -118.793471330 + 69.198656205 -118.718074537 + 69.266124438 -118.882373398 +} +8503a4d7fffffff +{ + 83.203708113 -171.809200125 + 83.116155271 -172.113302367 + 83.039498449 -171.639897010 + 83.049367476 -170.868026907 + 83.136096531 -170.551562088 + 83.213784195 -171.019048034 +} +854d0e5bfffffff +{ + 26.870382575 -63.695964751 + 26.795089638 -63.712109366 + 26.734857538 -63.653495946 + 26.749831373 -63.578639748 + 26.825167077 -63.562331188 + 26.885486273 -63.621042801 +} +85032ac7fffffff +{ + 86.863521995 -76.245522462 + 86.904487119 -77.709460914 + 86.853447131 -79.136515066 + 86.763546747 -79.064383519 + 86.724580603 -77.646346299 + 86.773572888 -76.254835711 +} +85e8e5d3fffffff +{ + -61.204407765 -84.410104680 + -61.125196572 -84.316563314 + -61.049918429 -84.404229223 + -61.053688069 -84.585186946 + -61.132793975 -84.679261163 + -61.208235641 -84.591847325 +} +85f0337bfffffff +{ + -78.520453656 83.995293917 + -78.434909579 83.860181164 + -78.410886143 83.418609668 + -78.472139488 83.107364092 + -78.557956035 83.237544520 + -78.582249384 83.683936759 +} +85c1914bfffffff +{ + -33.017324108 -22.807366967 + -33.103083609 -22.858440154 + -33.183082697 -22.796844631 + -33.177250678 -22.684034608 + -33.091383196 -22.633051025 + -33.011455740 -22.694787418 +} +85d14acffffffff +{ + -41.220792529 20.182032235 + -41.308994524 20.179920453 + -41.353207291 20.271080739 + -41.309199414 20.364131918 + -41.221093933 20.366002096 + -41.176899752 20.275062445 +} +85234dbbfffffff +{ + 40.635215986 -179.043385257 + 40.729181453 -179.024909586 + 40.789676335 -179.122348296 + 40.756108746 -179.238263664 + 40.662074290 -179.256495728 + 40.601676280 -179.159056408 +} +8504b3dbfffffff +{ + 65.684981702 134.513708689 + 65.602188932 134.628150914 + 65.600298374 134.860255699 + 65.681204771 134.979498118 + 65.764305618 134.865864888 + 65.766191991 134.632172912 +} +85ce80cffffffff +{ + -41.046369124 -70.498949714 + -40.969291026 -70.464364568 + -40.900136650 -70.531327639 + -40.907915044 -70.632921553 + -40.984977130 -70.667785316 + -41.054277024 -70.600776861 +} +850e365bfffffff +{ + 64.689490673 -81.938073046 + 64.628829430 -82.115274120 + 64.533088385 -82.081229557 + 64.497915201 -81.871261313 + 64.558301544 -81.694333803 + 64.654135143 -81.727098324 +} +850f9ad7fffffff +{ + 64.299317771 -95.747803925 + 64.224530152 -95.886215559 + 64.134924553 -95.808959132 + 64.119895823 -95.594181670 + 64.194427224 -95.455414602 + 64.284243276 -95.531775426 +} +85f03053fffffff +{ + -79.394941176 90.478819181 + -79.313353330 90.285560725 + -79.299097502 89.796718632 + -79.366257912 89.494958547 + -79.448253498 89.683325818 + -79.462682849 90.178399501 +} +857a2997fffffff +{ + -2.345606340 42.218083019 + -2.254208333 42.217911706 + -2.205141835 42.139082055 + -2.247450334 42.060345831 + -2.338902122 42.060457084 + -2.387991688 42.139364657 +} +8503200ffffffff { - -89.867510404 126.833332400 - -89.881742454 84.142735302 - -89.921669732 33.715499682 - -89.949985838 -57.757362933 - -89.915696433 -140.297307936 - -89.880377542 170.215354173 -} -85520e8bfffffff -{ - 18.262922318 44.880467076 - 18.175545071 44.860534889 - 18.120010436 44.926191179 - 18.151757448 45.011716342 - 18.239028767 45.031732335 - 18.294658995 44.966139548 -} -85892d0bfffffff -{ - -16.695700194 -155.744235818 - -16.607398730 -155.711681691 - -16.536512840 -155.776906003 - -16.553833608 -155.874669067 - -16.642079721 -155.907337439 - -16.713060490 -155.842128711 -} -853963b7fffffff -{ - 43.292965268 2.813164823 - 43.206878788 2.829037139 - 43.179470102 2.938220068 - 43.238164371 3.031768369 - 43.324326588 3.016076778 - 43.351718881 2.906655805 -} -856bb017fffffff -{ - 8.861446826 15.581982835 - 8.775412386 15.584224753 - 8.731205151 15.664709274 - 8.772960553 15.743039065 - 8.859021794 15.740917508 - 8.903300950 15.660345751 -} -853a23c7fffffff -{ - 32.060102288 -49.519903379 - 31.976153568 -49.557457977 - 31.902992841 -49.494237469 - 31.913670364 -49.393422242 - 31.997614829 -49.355662041 - 32.070886141 -49.418922454 -} -85322d6ffffffff -{ - 32.228230106 165.568985153 - 32.325373190 165.568398959 - 32.373666853 165.468540942 - 32.324737033 165.369400669 - 32.227610616 165.370214309 - 32.179397189 165.469940820 -} -85d50ea3fffffff -{ - -54.452279656 -162.400561538 - -54.381015840 -162.344108036 - -54.317118891 -162.435490262 - -54.324423143 -162.583197571 - -54.395630853 -162.639843842 - -54.459590471 -162.548590850 -} -855716cbfffffff -{ - 23.053482841 -39.350040648 - 22.974408088 -39.396521789 - 22.895071386 -39.343472046 - 22.894689961 -39.243973858 - 22.973699633 -39.197353729 - 23.053155888 -39.250370492 -} -8576cec3fffffff -{ - -5.472217190 163.913237937 - -5.555480475 163.922894059 - -5.582045764 163.994656681 - -5.525439822 164.056712070 - -5.442255650 164.047095093 - -5.415598304 163.975383592 -} -851924dbfffffff -{ - 62.554665345 -5.070648766 - 62.512154258 -5.198594146 - 62.436642173 -5.161329243 - 62.403635677 -4.996719270 - 62.446056419 -4.869048009 - 62.521573704 -4.905712248 -} -8506d3affffffff -{ - 66.530840650 -55.423536384 - 66.506898806 -55.650952386 - 66.414955105 -55.710015978 - 66.347136073 -55.542906884 - 66.370975861 -55.316858271 - 66.462736134 -55.256556718 -} -85f12cabfffffff -{ - -86.564885316 139.055997858 - -86.623505727 137.909377246 - -86.709567982 138.243096044 - -86.736014693 139.790378530 - -86.675113537 140.941554591 - -86.590086344 140.542355110 -} -85311ea7fffffff -{ - 42.806649274 119.360825283 - 42.727686771 119.342188552 - 42.683613563 119.413048529 - 42.718365293 119.502491107 - 42.797195835 119.521337235 - 42.841406599 119.450531850 -} -85ca4a63fffffff -{ - -41.526073576 68.662043801 - -41.613869845 68.684132406 - -41.645130028 68.801164849 - -41.588558995 68.895971592 - -41.500767919 68.873694378 - -41.469542559 68.756798831 -} -85f199d3fffffff -{ - -74.947345069 97.565495815 - -74.867054802 97.389062274 - -74.864258091 97.028244907 - -74.941724561 96.840425523 - -75.022376072 97.014937428 - -75.025200082 97.379214072 -} -856e1097fffffff -{ - 4.873527929 -113.434769546 - 4.945923598 -113.387428536 - 5.022660911 -113.431586721 - 5.026916470 -113.523126209 - 4.954447433 -113.570401012 - 4.877796189 -113.526202711 -} -85a42daffffffff -{ - -18.904580204 -23.591776230 - -18.985019558 -23.635719061 - -19.056757636 -23.584197310 - -19.047969121 -23.488626632 - -18.967414143 -23.444743832 - -18.895763345 -23.496371410 -} -85cab52ffffffff -{ - -44.611990320 48.447563668 - -44.694181236 48.450317842 - -44.741958883 48.549857546 - -44.707492446 48.646655328 - -44.625237690 48.643709916 - -44.577513126 48.544158154 -} -85035c37fffffff -{ - 79.864225284 -71.501133153 - 79.822588358 -71.953545808 - 79.735804543 -71.955064934 - 79.690675091 -71.511224004 - 79.731780411 -71.062623441 - 79.818542199 -71.054056398 -} -85e20ca3fffffff -{ - -57.980165494 -136.840147436 - -57.953517803 -136.687709534 - -57.865467335 -136.659575020 - -57.804186691 -136.783339099 - -57.830806481 -136.935171624 - -57.918734600 -136.963843925 -} -853a02cbfffffff -{ - 29.622191698 -51.499518813 - 29.539862693 -51.533202247 - 29.468273922 -51.471463369 - 29.478902621 -51.375990505 - 29.561232039 -51.342111573 - 29.632932467 -51.403900843 -} -85ee2ca3fffffff -{ - -75.691386493 -50.019339712 - -75.636423564 -49.696213999 - -75.539492575 -49.727323285 - -75.497459121 -50.077143734 - -75.551914840 -50.398561213 - -75.648908048 -50.371873202 -} -8592e30ffffffff -{ - -16.948908794 -105.295454621 - -17.014869948 -105.352641736 - -17.100683270 -105.323191452 - -17.120601420 -105.236461821 - -17.054624676 -105.179194061 - -16.968745371 -105.208736540 -} -851af5bbfffffff -{ - 45.429322964 -45.009644261 - 45.344511995 -45.062060437 - 45.272622258 -44.988379008 - 45.285449629 -44.862272609 - 45.370246321 -44.809578513 - 45.442230018 -44.883268226 -} -85e356b3fffffff -{ - -60.747400685 -144.394074463 - -60.732188021 -144.234187976 - -60.650161961 -144.188095638 - -60.583497075 -144.301418051 - -60.598729698 -144.460577761 - -60.680607156 -144.507139679 -} -85080383fffffff -{ - 64.949447036 11.441603064 - 64.934316379 11.585524957 - 64.992876644 11.683562981 - 65.042082424 11.652801232 - 65.061239672 11.619159451 - 65.065401559 11.438004783 - 65.012138832 11.358585551 - 64.973999153 11.426080254 -} -85810a17fffffff -{ - -9.975194631 -43.261598045 - -9.892683768 -43.210593997 - -9.807938973 -43.258026507 - -9.805709809 -43.356445282 - -9.888219263 -43.407454259 - -9.972959287 -43.360039679 -} -85ab21c3fffffff -{ - -15.077482920 65.610062441 - -15.170451971 65.625435826 - -15.202884538 65.717568818 - -15.142274040 65.794254197 - -15.049306521 65.778755773 - -15.016947862 65.686696937 -} -85d30e57fffffff -{ - -51.942961162 -112.952304001 - -51.884165638 -112.828655676 - -51.788660214 -112.850328582 - -51.751923435 -112.995128057 - -51.810575674 -113.118617408 - -51.906107643 -113.097466768 -} -85a6e9d7fffffff -{ - -22.748242575 106.280366375 - -22.823611102 106.315917878 - -22.831815849 106.392936798 - -22.764751421 106.434294750 - -22.689492531 106.398762526 - -22.681188516 106.321852978 -} -850364a3fffffff -{ - 82.014674581 -35.610568749 - 82.092148297 -35.833601402 - 82.105514896 -36.477465802 - 82.041094841 -36.886592375 - 81.964250006 -36.654393153 - 81.951192212 -36.022095806 -} -8505648bfffffff -{ - 86.399204052 125.716757244 - 86.325834129 126.631925668 - 86.337815680 128.109758768 - 86.423657394 128.736317369 - 86.499072593 127.839418923 - 86.486583272 126.295783925 -} -850ba953fffffff -{ - 60.436331505 83.190005659 - 60.349060240 83.250019660 - 60.327883001 83.433775041 - 60.393881548 83.558195138 - 60.481226307 83.498870294 - 60.502499362 83.314434288 -} -858f2b07fffffff -{ - -2.663920676 -79.853669324 - -2.740938745 -79.910192729 - -2.828678056 -79.870872690 - -2.839355610 -79.775011103 - -2.762303786 -79.718521071 - -2.674608177 -79.757859111 -} -85f2ab07fffffff -{ - -84.098637269 -121.408926891 - -84.153384746 -120.703435047 - -84.114051737 -119.891388078 - -84.020824499 -119.801522337 - -83.967261310 -120.500249671 - -84.005756391 -121.295757492 -} -8592d03bfffffff -{ - -18.270458692 -109.122560845 - -18.332705509 -109.177786281 - -18.416541207 -109.150862858 - -18.438206987 -109.068619950 - -18.375951116 -109.013304533 - -18.292038502 -109.040321995 -} -857ec267fffffff -{ - 3.635737726 172.224557656 - 3.707137918 172.229658455 - 3.745072104 172.159977518 - 3.711512496 172.085236227 - 3.640096202 172.080253930 - 3.602255494 172.149894381 -} -855641b3fffffff -{ - 10.513990770 -26.560028579 - 10.586679967 -26.515795166 - 10.665443450 -26.560429692 - 10.671585771 -26.649344527 - 10.598907737 -26.693644725 - 10.520076179 -26.648963388 -} -85e58c57fffffff -{ - -56.533132974 112.091563533 - -56.460794800 111.974790756 - -56.479899960 111.803562367 - -56.571456634 111.748377914 - -56.644030171 111.865094495 - -56.624811289 112.037053834 -} -8514064bfffffff -{ - 54.126623501 125.325063611 - 54.059118792 125.420237485 - 54.068283053 125.571708147 - 54.145039552 125.628662084 - 54.212794994 125.533633350 - 54.203542918 125.381503653 -} -8502ab7bfffffff -{ - 73.898745219 -121.667141328 - 73.810533024 -121.746971095 - 73.748621259 -121.531353620 - 73.774570332 -121.235535653 - 73.862675678 -121.153087717 - 73.924940257 -121.369066179 -} -85b8d397fffffff -{ - -21.493023778 127.967623076 - -21.408839011 127.970319810 - -21.372086446 127.896174236 - -21.419390283 127.819329526 - -21.503496867 127.816487601 - -21.540377866 127.890635434 -} -85660c0ffffffff -{ - 7.618154104 -73.078774643 - 7.549560046 -73.130357944 - 7.468659327 -73.091708436 - 7.456422432 -73.001482905 - 7.525058417 -72.949957991 - 7.605889385 -72.988600106 -} -856c6693fffffff -{ - 6.906109344 -88.761693023 - 6.834074331 -88.818431239 - 6.752686849 -88.782653118 - 6.743361943 -88.690089051 - 6.815456887 -88.633341675 - 6.896816760 -88.669167408 -} -8580b62bfffffff -{ - -3.157056734 -31.950687761 - -3.074474034 -31.902966554 - -2.990954862 -31.949833974 - -2.989981036 -32.044452422 - -3.072574442 -32.092225875 - -3.156130976 -32.045328755 -} -85f39427fffffff -{ - -81.185637676 157.920864250 - -81.258272341 157.639249297 - -81.327329770 157.944013987 - -81.322981219 158.534912655 - -81.249614538 158.810893929 - -81.181327792 158.501726569 -} -851f22abfffffff -{ - 56.094021503 10.228139726 - 56.019226134 10.238522974 - 55.992826681 10.372524798 - 56.041187347 10.496437862 - 56.116015655 10.486366309 - 56.142450529 10.352069575 + 89.170256753 -39.703447393 + 89.251494928 -42.617927243 + 89.249816362 -49.783439939 + 89.166977455 -52.634620737 + 89.093727707 -49.121805392 + 89.095349301 -43.197345295 } -85129d1bfffffff +8516c64ffffffff { - 52.155734239 -127.189662900 - 52.076768810 -127.211202724 - 52.016984130 -127.111608676 - 52.035984030 -126.990309816 - 52.114948601 -126.968261215 - 52.174914500 -127.068019850 + 48.322834866 167.911425588 + 48.414850414 167.914023245 + 48.461846711 167.791749111 + 48.416749947 167.667051120 + 48.324736366 167.664803425 + 48.277817356 167.786903740 } -85c85d57fffffff +85cea2b7fffffff { - -43.090469312 98.880446199 - -43.014459956 98.816172054 - -43.015884835 98.689184651 - -43.093313649 98.626046407 - -43.169490634 98.690104081 - -43.168071188 98.817517497 + -43.186447077 -70.980837653 + -43.107724641 -70.943871224 + -43.038005815 -71.013378782 + -43.046863410 -71.119897437 + -43.125570850 -71.157165831 + -43.195435883 -71.087613976 } -858d5613fffffff +8502f0c7fffffff { - -13.453214265 105.908314860 - -13.375780989 105.888023301 - -13.357857787 105.802464175 - -13.417423838 105.737210008 - -13.494853959 105.757557523 - -13.512721264 105.843103304 + 73.845656288 -114.410878332 + 73.759733078 -114.529419279 + 73.690087840 -114.336901625 + 73.705997367 -114.026181089 + 73.791717450 -113.905337276 + 73.861732166 -114.097502118 } -85034e33fffffff +852e85c7fffffff { - 78.927797926 -63.213626134 - 78.897450409 -63.653793276 - 78.810772956 -63.714911986 - 78.754615414 -63.341534604 - 78.784583682 -62.905900516 - 78.871085318 -62.839136491 + 45.815888936 146.643380449 + 45.903383117 146.618482901 + 45.927562127 146.500399559 + 45.864263483 146.407526015 + 45.776868518 146.432646042 + 45.752672908 146.550417710 } -850335cbfffffff +85f14193fffffff { - 88.427404942 162.949704195 - 88.334992585 163.065434294 - 88.287998666 165.856955585 - 88.329500294 168.683175572 - 88.421754562 168.894561745 - 88.472896971 165.954299155 -} -85b570b3fffffff -{ - -35.733539027 -162.076025872 - -35.645355752 -162.031604858 - -35.569376648 -162.104244319 - -35.581524100 -162.221227127 - -35.669647249 -162.265771274 - -35.745683114 -162.193209883 -} -859f33d3fffffff -{ - -20.906205016 175.663611512 - -20.825630449 175.623146084 - -20.812794018 175.531968413 - -20.880579877 175.481092325 - -20.961279863 175.521513141 - -20.974068499 175.612854903 -} -850b2d03fffffff -{ - 64.877056297 66.669203268 - 64.802762667 66.779264325 - 64.805106821 66.995468240 - 64.881759056 67.102631452 - 64.956228218 66.993020615 - 64.953869556 66.775792385 -} -850e11cbfffffff -{ - 60.657211704 -82.617048401 - 60.595702605 -82.770732938 - 60.499611377 -82.739002449 - 60.464937059 -82.554557383 - 60.526195600 -82.401057961 - 60.622378385 -82.431816594 -} -850b1d5bfffffff -{ - 62.495763386 77.982108861 - 62.412180954 78.058820438 - 62.398146289 78.257803934 - 62.467629449 78.380909897 - 62.551325361 78.304877544 - 62.565424895 78.105057194 -} -85ecad0ffffffff -{ - -67.387903012 140.232088651 - -67.352887226 140.019315048 - -67.409723111 139.835405411 - -67.501862509 139.864055930 - -67.537021443 140.078062348 - -67.479897033 140.262181551 -} -85f283cffffffff -{ - -87.486329269 -124.028569259 - -87.545266208 -122.408855520 - -87.508679726 -120.462957522 - -87.415125450 -120.234093908 - -87.358938242 -121.823638348 - -87.393636602 -123.674526183 -} -85eaaa67fffffff -{ - -64.286428047 179.223086525 - -64.299087940 179.066846411 - -64.372323766 179.032862725 - -64.432921888 179.155992899 - -64.420061209 179.312943843 - -64.346803739 179.346052161 -} -8560ee33fffffff -{ - 13.406182829 68.992259285 - 13.487368199 68.965130263 - 13.501034485 68.886571201 - 13.433608053 68.835213149 - 13.352508390 68.862313123 - 13.338749479 68.940800249 -} -85042573fffffff -{ - 78.458419587 138.672863364 - 78.370811436 138.880621599 - 78.362654654 139.360976019 - 78.441997879 139.640301546 - 78.530134230 139.436921072 - 78.538400367 138.949773059 -} -85d38363fffffff -{ - -50.495190254 -98.903521997 - -50.423008298 -98.802829899 - -50.331657597 -98.849512468 - -50.312375488 -98.996516015 - -50.384413080 -99.097314471 - -50.475876993 -99.051004212 -} -85f39877fffffff -{ - -83.883013053 172.867928860 - -83.967224129 172.657247457 - -84.024430892 173.279609820 - -83.996168038 174.111149305 - -83.911367603 174.302139859 - -83.855407509 173.681512382 -} -8503263bfffffff + -84.950879776 22.506645422 + -84.859710386 22.232297874 + -84.835673428 21.236708381 + -84.902120040 20.486623396 + -84.994035749 20.731947521 + -85.018774829 21.756894644 +} +85aaadc7fffffff +{ + -28.600561070 70.969290418 + -28.695675688 70.990797680 + -28.726952568 71.095710439 + -28.663077289 71.178996184 + -28.567981693 71.157345487 + -28.536742254 71.052552310 +} +85683187fffffff +{ + 8.701686778 115.545304842 + 8.791727800 115.527973802 + 8.820313826 115.444496678 + 8.758776561 115.378338379 + 8.668668772 115.395741760 + 8.640164995 115.479231109 +} +85329267fffffff +{ + 44.567791645 179.237334790 + 44.660532932 179.254690342 + 44.719439771 179.149621851 + 44.685511724 179.027217727 + 44.592712731 179.010143655 + 44.533899329 179.115191829 +} +858870dbfffffff +{ + -7.127637885 -158.329537433 + -7.047843252 -158.297774409 + -6.983085655 -158.356247994 + -6.998025757 -158.446457847 + -7.077752538 -158.478308530 + -7.142607124 -158.419861874 +} +8505562bfffffff +{ + 79.767975446 140.899100606 + 79.679131160 141.114057234 + 79.667311269 141.651586401 + 79.744153701 141.982515518 + 79.833548633 141.773609490 + 79.845552733 141.227635871 +} +8500800ffffffff +{ + 77.147852697 75.288489306 + 77.142041681 75.696682194 + 77.219245023 75.914102956 + 77.302756478 75.720927575 + 77.308540636 75.307494034 + 77.230840162 75.092520481 +} +85be8103fffffff +{ + -26.792667602 155.578701455 + -26.699956533 155.551534146 + -26.674170673 155.447397649 + -26.741044599 155.370254668 + -26.833812561 155.397249865 + -26.859649813 155.501560421 +} +855a081bfffffff +{ + 14.983826821 170.015253780 + 15.070165007 170.018971905 + 15.115992412 169.938542578 + 15.075377013 169.854460271 + 14.989028092 169.850896937 + 14.943305158 169.931261086 +} +85a30523fffffff +{ + -12.717253736 46.595360722 + -12.624143499 46.593478513 + -12.578712758 46.513530002 + -12.626405562 46.435366705 + -12.719593808 46.437188887 + -12.765011265 46.517234451 +} +85f20163fffffff +{ + -78.861203120 -136.268355843 + -78.928256904 -135.990575555 + -78.910845538 -135.534737960 + -78.826500626 -135.362998395 + -78.760072412 -135.642360507 + -78.777365108 -136.091936056 +} +85762033fffffff +{ + 3.602737408 157.906190401 + 3.512032570 157.917722392 + 3.477903218 157.997544381 + 3.534407980 158.065791491 + 3.625032951 158.054300410 + 3.659233032 157.974521302 +} +857642cffffffff +{ + 0.916552100 164.694379946 + 0.830897288 164.703898693 + 0.799766696 164.775365179 + 0.854205072 164.837259947 + 0.939766778 164.827780824 + 0.970983189 164.756367323 +} +857511c3fffffff +{ + 7.820498177 -5.257447862 + 7.763377859 -5.315920047 + 7.695382007 -5.298747412 + 7.684491340 -5.223228256 + 7.741509920 -5.164812641 + 7.809520777 -5.181859577 +} +8540b4a7fffffff +{ + 31.622286628 115.292344494 + 31.702870973 115.273436679 + 31.737930151 115.182717371 + 31.692375518 115.110892339 + 31.611733893 115.129884981 + 31.576704147 115.220617844 +} +85f025d3fffffff +{ + -83.077487104 81.035703806 + -83.049800004 80.318747217 + -83.109202027 79.789781235 + -83.197350961 79.977176581 + -83.225522781 80.708963033 + -83.165052502 81.238343630 +} +850e0d23fffffff +{ + 57.117609983 -73.320368310 + 57.067325308 -73.473563752 + 56.970291859 -73.469969278 + 56.923543531 -73.314018220 + 56.973623112 -73.161230164 + 57.070655508 -73.163985703 +} +8512286ffffffff +{ + 59.452960579 -114.372017376 + 59.368974680 -114.437453609 + 59.294510935 -114.331370532 + 59.303792260 -114.159954323 + 59.387670347 -114.093818714 + 59.462375300 -114.199796230 +} +852c194ffffffff { - 89.851412983 96.359003907 - 89.799258488 121.429000141 - 89.798933506 148.511147329 - 89.849268168 174.220594178 - 89.937684450 -172.280549352 - 89.941929081 85.085528952 + 38.198097964 48.234739155 + 38.129997503 48.313516508 + 38.147929922 48.422892195 + 38.234088260 48.453719328 + 38.302332495 48.374877269 + 38.284274413 48.265272477 +} +85f2f187fffffff +{ + -81.017318011 -110.869286016 + -81.056875731 -110.346484761 + -81.002558748 -109.864068517 + -80.909417003 -109.908539122 + -80.870540692 -110.425082294 + -80.924131869 -110.903390994 +} +8540b63bfffffff +{ + 32.868284113 115.821593850 + 32.947454079 115.802871892 + 32.982794585 115.712297770 + 32.938938013 115.640430308 + 32.859712150 115.659238062 + 32.824398720 115.749827494 +} +85e39337fffffff +{ + -67.063015381 -120.149711313 + -67.020897277 -119.956504714 + -66.935940008 -119.967627861 + -66.893107753 -120.170783416 + -66.935052324 -120.363362304 + -67.020001985 -120.353413221 +} +8502862ffffffff +{ + 73.432528545 -132.928513236 + 73.386180124 -133.201752643 + 73.297635954 -133.212877359 + 73.255532077 -132.953708808 + 73.301536853 -132.682176269 + 73.389987116 -132.668107980 +} +85d44e87fffffff +{ + -44.153376585 -173.634149341 + -44.078145274 -173.577081310 + -44.000516905 -173.642672592 + -43.998100759 -173.765139586 + -44.073261606 -173.822251946 + -44.150909043 -173.756853456 +} +851e8d87fffffff +{ + 42.694099384 17.545256730 + 42.602980078 17.546290199 + 42.559673294 17.657080865 + 42.607446411 17.766988468 + 42.698585924 17.766188040 + 42.741932271 17.655246891 +} +856976d7fffffff +{ + 15.442934759 115.492361837 + 15.533088761 115.474619810 + 15.564796345 115.389232368 + 15.506280711 115.321574339 + 15.416054245 115.339391943 + 15.384415867 115.424792010 +} +8525322ffffffff +{ + 50.393720696 90.275428130 + 50.301268072 90.308932900 + 50.273083145 90.447538434 + 50.337221923 90.552985793 + 50.429683695 90.519955644 + 50.457997820 90.381002979 +} +85108913fffffff +{ + 54.790231815 54.469678982 + 54.719432594 54.571864863 + 54.737238591 54.730265333 + 54.825941296 54.786998522 + 54.896895595 54.684818557 + 54.878991865 54.525898207 +} +8507128bfffffff +{ + 74.955715797 -13.282489692 + 74.993552376 -13.553928612 + 74.943951393 -13.804092154 + 74.856801237 -13.781405739 + 74.819302380 -13.511534097 + 74.868617666 -13.262782313 +} +85d0a43bfffffff +{ + -48.279153836 5.265388809 + -48.368879571 5.240178509 + -48.424319037 5.343206351 + -48.389961317 5.471289377 + -48.300256410 5.496149807 + -48.244888209 5.393277257 +} +85eade57fffffff +{ + -69.203176113 175.124865700 + -69.215308813 174.920697546 + -69.292733275 174.860640723 + -69.358093241 175.006074063 + -69.345752712 175.211518854 + -69.268260781 175.270249153 +} +851a1377fffffff +{ + 47.840152706 -48.399947914 + 47.820788364 -48.530239736 + 47.736809024 -48.577498230 + 47.672365810 -48.494785269 + 47.691717485 -48.364970612 + 47.775524990 -48.317392935 +} +85e82a2bfffffff +{ + -62.578896899 -91.384118393 + -62.504432933 -91.268220576 + -62.424962380 -91.346414013 + -62.419801656 -91.540037088 + -62.494117535 -91.656343755 + -62.573742168 -91.578621553 +} +85ef1aaffffffff +{ + -79.843930224 -30.473564202 + -79.766224924 -30.146049983 + -79.677464725 -30.362059848 + -79.665854705 -30.899650924 + -79.742826209 -31.229595281 + -79.832139323 -31.019606482 +} +85cb696ffffffff +{ + -31.448188707 63.126549211 + -31.542702303 63.141903435 + -31.579877544 63.245225009 + -31.522477693 63.333110815 + -31.427942804 63.317591458 + -31.390828952 63.214351362 +} +85c0a84ffffffff +{ + -39.057232206 -15.709913850 + -39.146134933 -15.758248111 + -39.223455801 -15.682858282 + -39.211788989 -15.559035533 + -39.122805709 -15.510870363 + -39.045569745 -15.586358289 +} +8520f467fffffff +{ + 41.418160487 75.759559578 + 41.330045767 75.812145693 + 41.320323896 75.940402399 + 41.398671332 76.016424273 + 41.486886319 75.964095740 + 41.496653707 75.835486970 +} +85e84a23fffffff +{ + -54.268307523 -85.109766943 + -54.187955190 -85.029471685 + -54.107560929 -85.102276351 + -54.107362914 -85.255186117 + -54.187621453 -85.335849342 + -54.268171886 -85.263236358 +} +855f0e8bfffffff +{ + 5.116970827 -56.652082909 + 5.196527850 -56.603840800 + 5.275689551 -56.645851626 + 5.275288559 -56.736040112 + 5.195790494 -56.784233287 + 5.116634498 -56.742287000 +} +85e1610bfffffff +{ + -67.681223806 48.552024451 + -67.595311078 48.613104185 + -67.532529170 48.466105979 + -67.555402431 48.258298940 + -67.641090219 48.196124239 + -67.704130009 48.342845933 +} +850ae463fffffff +{ + 65.617411289 98.960831066 + 65.574589337 99.159999658 + 65.621839640 99.342887436 + 65.712244426 99.327103532 + 65.755306216 99.126968248 + 65.707722342 98.943585372 +} +8500c9b3fffffff +{ + 88.982634800 120.814880822 + 88.914685613 124.191856769 + 88.927932490 129.159296378 + 89.010933987 131.491234027 + 89.086243951 128.315084411 + 89.070940105 122.522677034 +} +859c2a2ffffffff +{ + -16.117613112 143.330678148 + -16.032689084 143.318305560 + -16.004030164 143.231777267 + -16.060193037 143.157537203 + -16.145116584 143.169752513 + -16.173877883 143.256365206 +} +85f29273fffffff +{ + -88.667192909 67.436308144 + -88.618708032 64.115882914 + -88.659293442 60.691554649 + -88.752680721 60.304215522 + -88.806132957 63.844424777 + -88.760881852 67.557089363 +} +853cd497fffffff +{ + 22.208745410 89.515028240 + 22.296988856 89.487097276 + 22.317120715 89.388576643 + 22.249035276 89.318051785 + 22.160814704 89.346009907 + 22.140656642 89.444465867 +} +85af8267fffffff +{ + -29.593298038 86.940604865 + -29.682296096 86.973095691 + -29.700192513 87.076232316 + -29.629128467 87.146712558 + -29.540211737 87.114146287 + -29.522277705 87.011174950 +} +85118a4bfffffff +{ + 54.145197456 41.302278206 + 54.088200896 41.413587371 + 54.120936857 41.550848404 + 54.210820600 41.577109885 + 54.267934284 41.465562526 + 54.235046813 41.327991669 +} +85e3754bfffffff +{ + -60.692108171 -149.749035194 + -60.683398617 -149.594509553 + -60.605157989 -149.538432962 + -60.535785925 -149.636533539 + -60.544551999 -149.790353296 + -60.622633638 -149.846776271 +} +85de1d7bfffffff +{ + -53.342268645 -50.521709784 + -53.293816881 -50.396850170 + -53.210855362 -50.407076980 + -53.176324573 -50.541507190 + -53.224550639 -50.666103393 + -53.307532643 -50.656533133 +} +85198643fffffff +{ + 58.313588238 -24.152679837 + 58.248573767 -24.253379647 + 58.173475002 -24.185814066 + 58.163316670 -24.017894600 + 58.228229536 -23.917069345 + 58.303402232 -23.984287658 +} +8576666bfffffff +{ + 3.919072651 163.670196588 + 3.831996500 163.680066199 + 3.798614544 163.753185922 + 3.852229696 163.816383705 + 3.939210955 163.806554474 + 3.972671928 163.733487091 +} +85f18ccbfffffff +{ + -77.443751287 101.268704386 + -77.368253616 101.039757884 + -77.371061686 100.613735346 + -77.449401454 100.411874044 + -77.525362116 100.638676783 + -77.522519709 101.069523656 +} +85a14b73fffffff +{ + -21.837899622 -144.681703280 + -21.746794314 -144.657762209 + -21.679960889 -144.730285884 + -21.704148396 -144.826807739 + -21.795257332 -144.850904867 + -21.862175241 -144.778324195 +} +85aec6a3fffffff +{ + -30.061575048 100.182658322 + -30.140795680 100.220089697 + -30.147821924 100.310983679 + -30.075717673 100.364298409 + -29.996594974 100.326862281 + -29.989478637 100.236115994 +} +85cba483fffffff +{ + -35.704470375 44.535253678 + -35.791030076 44.534366836 + -35.839730350 44.619025121 + -35.801801081 44.704603142 + -35.715148812 44.705345811 + -35.666518357 44.620654814 +} +85570e73fffffff +{ + 20.786275948 -33.781912118 + 20.709430610 -33.833369741 + 20.628412700 -33.785045378 + 20.624130170 -33.685330763 + 20.700888114 -33.633767526 + 20.782016013 -33.682024220 } -8518817bfffffff -{ - 49.535543460 -22.547534073 - 49.464099171 -22.635321053 - 49.379815121 -22.579754294 - 49.366920152 -22.436669429 - 49.438275833 -22.348813326 - 49.522614992 -22.404110403 -} -85ce5edbfffffff -{ - -39.316195556 -84.244354125 - -39.240401108 -84.185713799 - -39.158872020 -84.241101181 - -39.152981060 -84.355031668 - -39.228683269 -84.413884837 - -39.310368779 -84.358595302 -} -85b49bc3fffffff -{ - -18.857793464 -149.719216718 - -18.767843147 -149.691221346 - -18.698637773 -149.760555206 - -18.719289524 -149.857907881 - -18.809214546 -149.886041729 - -18.878513214 -149.816684589 -} -85b2991bfffffff -{ - -33.133146779 -79.296614494 - -33.201268412 -79.358855679 - -33.274915185 -79.315294514 - -33.280438880 -79.209472633 - -33.212330520 -79.147275392 - -33.138685221 -79.190855896 -} -85f00a43fffffff -{ - -77.096942171 63.612649666 - -77.007753417 63.622865296 - -76.956331998 63.296388766 - -76.981281003 63.071165944 - -76.992795393 62.955353843 - -77.080220334 62.934888102 - -77.132961783 63.265901100 - -77.109552206 63.499164016 -} -85004d5bfffffff -{ - 83.716616143 -32.614912753 - 83.797499564 -32.862141282 - 83.815674210 -33.684831726 - 83.752457510 -34.241613211 - 83.672287525 -33.977976984 - 83.654612230 -33.173699160 -} -850343cffffffff -{ - 80.466351304 -67.158453114 - 80.431110880 -67.652708439 - 80.345291501 -67.689941054 - 80.294823543 -67.240677833 - 80.329558514 -66.751639770 - 80.415261986 -66.706671278 -} -85e62473fffffff -{ - -67.553351208 26.277410826 - -67.467951799 26.200763677 - -67.445787365 25.972150003 - -67.508934718 25.818613576 - -67.594593853 25.893966321 - -67.616846434 26.124156784 -} -85e0e977fffffff -{ - -53.666377931 50.380053465 - -53.584731842 50.413708846 - -53.534357901 50.319409242 - -53.565429656 50.191522824 - -53.646915042 50.157427591 - -53.697489498 50.251657385 -} -85310baffffffff -{ - 42.346551313 123.888187902 - 42.292144154 123.957858261 - 42.299349055 124.065027655 - 42.361028256 124.102852569 - 42.415614808 124.033237683 - 42.408342585 123.925741763 -} -8540267bfffffff -{ - 24.672649855 111.651717499 - 24.760118492 111.631465227 - 24.792905780 111.539375565 - 24.738184206 111.467536403 - 24.650658627 111.487867302 - 24.617911531 111.579958776 -} -855c8d3bfffffff -{ - 6.519931710 -153.718928872 - 6.428893896 -153.749270543 - 6.356997896 -153.684502605 - 6.376089459 -153.589387634 - 6.467108090 -153.558985748 - 6.539054394 -153.623758922 -} -8526482bfffffff -{ - 35.230892776 -87.935831432 - 35.294607097 -87.864839338 - 35.381660021 -87.897525103 - 35.405038493 -88.001389635 - 35.341280920 -88.072466559 - 35.254188186 -88.039594233 -} -85b705a7fffffff -{ - -36.319970962 -97.387350806 - -36.250721636 -97.310953584 - -36.161705305 -97.349277259 - -36.141820411 -97.463784958 - -36.210928777 -97.540262940 - -36.300062923 -97.502153044 -} -85c94a07fffffff -{ - -47.411499639 107.367857997 - -47.337960431 107.282176054 - -47.349448582 107.143567492 - -47.434539747 107.090146578 - -47.508282444 107.175708494 - -47.496730308 107.314812598 -} -85dd965bfffffff -{ - -56.278885253 4.243672914 - -56.196522246 4.251781232 - -56.146323318 4.134210886 - -56.179187320 3.985707132 - -56.206912647 3.975316472 - -56.261832241 3.969405282 - -56.311654138 4.102273445 -} -85daaea3fffffff -{ - -47.674409854 169.401953926 - -47.592111012 169.350422755 - -47.584354778 169.216907968 - -47.658925814 169.134585105 - -47.741317093 169.185955068 - -47.749044924 169.319809868 -} -851d4497fffffff -{ - 49.889960889 -132.852323416 - 49.964966112 -132.806628852 - 50.017726285 -132.879063643 - 49.995448602 -132.997095133 - 49.920468024 -133.042531939 - 49.867740414 -132.970195216 -} -85f06637fffffff -{ - -80.264600422 33.548248637 - -80.179669565 33.307525858 - -80.171724541 32.771902510 - -80.248671581 32.468074471 - -80.334240607 32.703405288 - -80.342225292 33.248055040 -} -85a31eb3fffffff -{ - -16.106194359 45.373704490 - -16.012639298 45.372268559 - -15.967935254 45.290389331 - -16.016803863 45.209849203 - -16.110431755 45.211221574 - -16.155118238 45.293197689 -} -85d88b17fffffff -{ - -41.738047257 135.557928957 - -41.645003870 135.551623142 - -41.600485177 135.444162130 - -41.648904354 135.342929568 - -41.741887768 135.348959116 - -41.786512120 135.456497359 -} -85f156cbfffffff -{ - -83.845009262 77.830233018 - -83.812542287 77.035929921 - -83.868808213 76.406073139 - -83.958724136 76.567232498 - -83.991858809 77.379015568 - -83.934397339 78.011950829 -} -85e0e453fffffff -{ - -56.022459758 57.307764369 - -55.935271565 57.327686563 - -55.887365456 57.210013277 - -55.926423356 57.072341337 - -56.013480511 57.051802379 - -56.061611111 57.169550961 -} -85be69cffffffff -{ - -38.361337214 140.851494101 - -38.266392234 140.838700934 - -38.226853478 140.729544176 - -38.282158545 140.633061867 - -38.377070921 140.645593160 - -38.416710990 140.754868656 -} -85d122bbfffffff -{ - -36.259668599 7.920518428 - -36.352526120 7.902728021 - -36.411718002 7.990187384 - -36.377978099 8.095305929 - -36.285159577 8.112847329 - -36.226041824 8.025519229 -} -85350183fffffff -{ - 42.348204279 -23.261037269 - 42.272154526 -23.339461438 - 42.183987769 -23.288517902 - 42.171813392 -23.159362816 - 42.247774222 -23.080874255 - 42.335998272 -23.131604569 -} -85aef0d3fffffff -{ - -30.212393095 97.497190343 - -30.293792783 97.534060970 - -30.302752764 97.628315659 - -30.230394552 97.685543888 - -30.149091754 97.648654901 - -30.140050313 97.554555836 -} -8582f213fffffff -{ - 1.540823128 10.072712824 - 1.626904131 10.083686365 - 1.673047352 10.016613821 - 1.633189385 9.938621022 - 1.547188080 9.927612491 - 1.500965028 9.994631676 -} -85ef20dbfffffff +8585410ffffffff { - -85.352940466 -69.896967408 - -85.329688808 -68.775864458 - -85.238304871 -68.499329069 - -85.170976179 -69.309992518 - -85.193461110 -70.396738387 - -85.284022750 -70.706519690 -} -8525a91bfffffff -{ - 46.261480202 94.796439580 - 46.169467093 94.818812695 - 46.138212149 94.940791147 - 46.198825060 95.040636941 - 46.290816301 95.018671861 - 46.322216746 94.896452765 -} -85eea867fffffff -{ - -71.213837813 -19.594217376 - -71.127309323 -19.461722888 - -71.046646179 -19.627543123 - -71.052103667 -19.924893005 - -71.138296200 -20.059006871 - -71.219367634 -19.894166728 -} -85c932b7fffffff -{ - -40.489541139 122.655060144 - -40.433131021 122.564726465 - -40.458053509 122.456618628 - -40.539532267 122.438597207 - -40.596116825 122.529040247 - -40.571047880 122.637395616 -} -85966c43fffffff -{ - -15.330990265 19.005083097 - -15.235488052 19.014107753 - -15.179644528 18.934080197 - -15.219261375 18.845051311 - -15.314711876 18.835968313 - -15.370597298 18.915972468 -} -85056e03fffffff -{ - 84.911739306 167.187830769 - 84.817167571 167.149416224 - 84.765083028 168.035753411 - 84.806226917 168.973495123 - 84.900618917 169.045030081 - 84.954070048 168.145838034 -} -85ec8083fffffff -{ - -63.699958860 137.963510816 - -63.660224753 137.780029219 - -63.713391167 137.614452543 - -63.806554244 137.632105268 - -63.846432853 137.816464263 - -63.793003223 137.982291043 -} -854f5adbfffffff -{ - 17.108453061 149.013166247 - 17.017650216 149.027232994 - 16.980524917 149.116399518 - 17.034181666 149.191478755 - 17.124935098 149.177449555 - 17.162081240 149.088303530 -} -851d4d83fffffff -{ - 46.483630052 -133.591767899 - 46.561429153 -133.549035590 - 46.617334507 -133.618377506 - 46.595407946 -133.730356866 - 46.517643255 -133.772851963 - 46.461770659 -133.703605073 -} -8555a353fffffff -{ - 23.204803560 -18.743785551 - 23.131756018 -18.809272588 - 23.045188197 -18.773350222 - 23.031614401 -18.672096099 - 23.104547687 -18.606601341 - 23.191168925 -18.642368167 -} -851b495bfffffff -{ - 51.906229189 -30.420921022 - 51.830893277 -30.502439985 - 51.752815631 -30.434279761 - 51.749992448 -30.284796275 - 51.825251390 -30.203087107 - 51.903410467 -30.271050624 -} -85bcf543fffffff -{ - -29.052777300 31.162502791 - -28.962612830 31.167125711 - -28.914895808 31.076799539 - -28.957343050 30.981806145 - -29.047515034 30.977103001 - -29.095232355 31.067473457 -} -85002e13fffffff -{ - 78.704830263 27.002731726 - 78.763959092 27.302008168 - 78.847171552 27.162348711 - 78.870824919 26.718254805 - 78.811043582 26.419537791 - 78.728263802 26.564309704 -} -85f12b2bfffffff -{ - -86.009281443 98.159129053 - -86.008495234 96.853286705 - -86.085332992 96.220318441 - -86.164492211 96.920885338 - -86.165079578 98.280615900 - -86.086710419 98.884443784 -} -85ba9353fffffff -{ - -27.983914563 -169.166540338 - -27.897370879 -169.120738574 - -27.818644137 -169.181048976 - -27.826409745 -169.287047976 - -27.912862597 -169.332910621 - -27.991640656 -169.272713697 -} -85b9015bfffffff -{ - -36.450816829 133.868454542 - -36.357491867 133.864652598 - -36.313477309 133.766703287 - -36.362672754 133.672503226 - -36.455927904 133.676070032 - -36.500057535 133.774071891 -} -85ada003fffffff -{ - -29.461063933 19.726839482 - -29.372847161 19.736180212 - -29.318378909 19.650428169 - -29.352115005 19.555357835 - -29.440297394 19.545949581 - -29.494778150 19.631679098 -} -854f9bd7fffffff -{ - 24.209133312 159.223349980 - 24.302114942 159.216273610 - 24.345241498 159.123820148 - 24.295321091 159.038587577 - 24.202390920 159.045842606 - 24.159329569 159.138151681 + 1.728316286 67.699508023 + 1.651633210 67.714391568 + 1.626967300 67.796207669 + 1.679048356 67.863075890 + 1.755709999 67.848098029 + 1.780312124 67.766346202 } -85032623fffffff +859923abfffffff { - 89.900796050 20.229380089 - 89.941929081 85.085528952 - 89.937684450 -172.280549352 - 89.893928397 -112.334903952 - 89.869343407 -68.541640464 - 89.872827683 -25.830927255 + -5.676756452 -8.168692757 + -5.746875791 -8.195855370 + -5.803731077 -8.139154673 + -5.790363035 -8.055282775 + -5.720184603 -8.028225114 + -5.663433222 -8.084934250 } -85179367fffffff -{ - 50.766638510 149.336493454 - 50.852020721 149.312923624 - 50.876180057 149.183596346 - 50.814955181 149.078196909 - 50.729656249 149.102053374 - 50.705498789 149.231023332 -} -85030ba3fffffff -{ - 83.489261876 -87.528594515 - 83.512626804 -88.280146791 - 83.449560532 -88.867365307 - 83.364252113 -88.701602288 - 83.341598534 -87.965439873 - 83.403552749 -87.379832511 -} -85116e23fffffff -{ - 68.939441576 38.891938021 - 68.896668960 39.066142306 - 68.936023707 39.272525338 - 69.018319479 39.305352619 - 69.061247077 39.130490896 - 69.021723233 38.923459206 -} -85ed26b7fffffff -{ - -65.325881516 172.342997920 - -65.331932716 172.167362765 - -65.406040884 172.107229996 - -65.474181688 172.223625893 - -65.467961151 172.400226780 - -65.393769655 172.459462889 -} -8580d66ffffffff -{ - 4.086018328 -37.613806729 - 4.167060375 -37.564706909 - 4.250432211 -37.611619915 - 4.252799735 -37.707639315 - 4.171776102 -37.756768274 - 4.088366524 -37.709848830 -} -85f0ce4bfffffff -{ - -70.861796261 54.704910605 - -70.772819086 54.750627640 - -70.713528091 54.555863632 - -70.742903960 54.315336250 - -70.831688388 54.267855442 - -70.891290534 54.462658633 -} -85065c67fffffff -{ - 61.890984645 -37.676032159 - 61.890630895 -37.861967067 - 61.810630566 -37.957801464 - 61.731232648 -37.868048046 - 61.731675760 -37.683109712 - 61.811427664 -37.586931801 -} -85f00e4ffffffff -{ - -77.841070554 65.650405719 - -77.791397143 65.290630784 - -77.829212361 64.926807091 - -77.917249564 64.919862869 - -77.967431748 65.282231797 - -77.929064128 65.648953229 -} -85005e2ffffffff -{ - 86.511110507 1.988022338 - 86.595461894 2.429127027 - 86.662945874 1.356721685 - 86.643852879 -0.162196400 - 86.558396913 -0.544240081 - 86.493105365 0.531924274 -} -85d1845bfffffff -{ - -43.887161273 0.649966380 - -43.979109765 0.619692811 - -44.041965416 0.714398358 - -44.012788746 0.839291348 - -43.920839575 0.869265682 - -43.858067588 0.774646566 -} -85c754bbfffffff -{ - -40.737109313 -143.500107554 - -40.647260426 -143.472599408 - -40.587514058 -143.560357411 - -40.617566390 -143.675716991 - -40.707435521 -143.703454580 - -40.767232192 -143.615603313 -} -855c8837fffffff -{ - 5.807140691 -154.310008794 - 5.716421021 -154.340013164 - 5.644817293 -154.275329295 - 5.663881271 -154.180632672 - 5.754583202 -154.150566732 - 5.826238951 -154.215258861 -} -85004b77fffffff -{ - 85.117893628 -46.534451887 - 85.191202753 -47.089797483 - 85.186964857 -48.180994509 - 85.109495628 -48.682387660 - 85.037574636 -48.112250365 - 85.041736983 -47.054794528 -} -85506833fffffff -{ - 22.738949802 -141.254568680 - 22.652466737 -141.291032561 - 22.578025846 -141.227306745 - 22.590066363 -141.127181885 - 22.676510431 -141.090697845 - 22.750953010 -141.154358653 -} -85c65217fffffff -{ - -33.995951824 -134.818290553 - -33.905213126 -134.802390895 - -33.849469434 -134.883624818 - -33.884426714 -134.980893457 - -33.975227709 -134.996989779 - -34.031009203 -134.915620769 -} -856a5a0bfffffff -{ - 3.249490661 33.830071368 - 3.338608624 33.833089778 - 3.387526710 33.754169911 - 3.347376912 33.672186647 - 3.258245606 33.669106829 - 3.209277351 33.748071682 -} -85f39c23fffffff -{ - -82.819182025 172.562245705 - -82.902191800 172.380559850 - -82.958835899 172.903141077 - -82.931400961 173.606529619 - -82.847875027 173.774237977 - -82.792291856 173.252678334 -} -85066043fffffff -{ - 62.626971771 -27.585523041 - 62.640061190 -27.762837835 - 62.570177315 -27.881388680 - 62.487449700 -27.822625341 - 62.474531066 -27.646178951 - 62.544169766 -27.527630072 -} -85554a3bfffffff -{ - 16.270376800 -5.672799596 - 16.208025307 -5.737262040 - 16.129322821 -5.717866516 - 16.112969655 -5.634161483 - 16.175213674 -5.569765951 - 16.253918195 -5.589008487 -} -85a3a057fffffff -{ - -17.748546588 40.812362760 - -17.653537188 40.812753971 - -17.606850700 40.728094176 - -17.655181566 40.642959555 - -17.750244415 40.642498620 - -17.796923005 40.727242069 -} -850d847bfffffff -{ - 68.424675116 -177.236340238 - 68.334592306 -177.312164560 - 68.267439446 -177.140608854 - 68.289995090 -176.893457664 - 68.379825937 -176.816090346 - 68.447353848 -176.987409094 -} -85d28c03fffffff -{ - -42.422752365 -99.592966361 - -42.352088677 -99.505158078 - -42.259960942 -99.544382083 - -42.238387854 -99.671131992 - -42.308907363 -99.759010301 - -42.401144018 -99.720069424 -} -8594b077fffffff -{ - -17.506779868 119.360473180 - -17.586378666 119.376455164 - -17.622076285 119.456771263 - -17.578169497 119.521165570 - -17.498504422 119.505174546 - -17.462812393 119.424798207 -} -85041433fffffff -{ - 72.982907507 137.707812784 - 72.895709061 137.855147470 - 72.889056307 138.185121920 - 72.969547495 138.370942621 - 73.057129457 138.225560641 - 73.063837147 137.892384374 -} -85cb6427fffffff -{ - -29.466213730 58.018035251 - -29.560494458 58.028672356 - -29.600785136 58.125819357 - -29.546717926 58.212281568 - -29.452390894 58.201484798 - -29.412177286 58.104385495 -} -85a02987fffffff -{ - -20.632535573 -140.169003660 - -20.542993442 -140.149753518 - -20.479222415 -140.221743168 - -20.504914180 -140.313063565 - -20.594480327 -140.332468986 - -20.658330799 -140.260398778 -} -851a6807fffffff -{ - 47.413563487 -29.729274882 - 47.335661049 -29.806089712 - 47.253550618 -29.743384421 - 47.249264134 -29.604042045 - 47.327091243 -29.527070423 - 47.409280141 -29.589597157 -} -85e8609bfffffff -{ - -57.385185898 -95.205195179 - -57.311390931 -95.095767626 - -57.225385717 -95.157093125 - -57.213042264 -95.327413056 - -57.286692396 -95.437069830 - -57.372830693 -95.376179440 -} -850e4e8bfffffff -{ - 51.761764625 -69.268215188 - 51.716981579 -69.405443766 - 51.622152587 -69.411885935 - 51.572143281 -69.281725778 - 51.616757492 -69.144878669 - 51.711549379 -69.137810588 -} -85bcaa0bfffffff -{ - -28.292521421 35.435302110 - -28.202032945 35.438049291 - -28.156952713 35.347993962 - -28.202369002 35.255124424 - -28.292881897 35.252297312 - -28.337954172 35.342419680 -} -858166b7fffffff -{ - -12.154084145 -49.932892977 - -12.074283701 -49.881894642 - -11.989880330 -49.927820515 - -11.985303975 -50.024699335 - -12.065094603 -50.075672592 - -12.149471402 -50.029792239 -} -85da256ffffffff -{ - -55.498399463 170.373659221 - -55.424065674 170.313704507 - -55.420752308 170.161836976 - -55.491793006 170.069482206 - -55.566216554 170.129240464 - -55.569509666 170.281551083 -} -85ac3497fffffff -{ - -28.311255764 14.192155637 - -28.224055592 14.203407240 - -28.166921149 14.122650978 - -28.196972415 14.030694308 - -28.284119235 14.019387304 - -28.341268199 14.100092266 -} -85a42dc7fffffff -{ - -18.653106241 -24.176461600 - -18.733080439 -24.220634819 - -18.804611634 -24.169920809 - -18.796082960 -24.074925347 - -18.715992086 -24.030808274 - -18.644546610 -24.081630253 -} -85ef244bfffffff -{ - -85.839466738 -74.109283000 - -85.823005496 -72.840921332 - -85.733747862 -72.448420366 - -85.662048680 -73.286088034 - -85.677885414 -74.509084046 - -85.766028545 -74.938715330 -} -85ef1ccffffffff -{ - -81.783845761 -34.164454609 - -81.710404687 -33.729501669 - -81.620049071 -33.957026322 - -81.602542621 -34.609443625 - -81.675058171 -35.046403491 - -81.766000749 -34.829086925 -} -85c8a477fffffff -{ - -35.042109020 111.913992257 - -34.981289009 111.843074387 - -34.994336221 111.738756102 - -35.068281642 111.705085036 - -35.129273721 111.775980934 - -35.116148127 111.880570349 -} -8548323bfffffff -{ - 22.684101155 -105.112522909 - 22.764217601 -105.052673139 - 22.852024074 -105.097856661 - 22.859669690 -105.202989895 - 22.779484118 -105.262803976 - 22.691722092 -105.217520768 -} -8546056bfffffff -{ - 25.648868116 -168.512322373 - 25.561094308 -168.536832367 - 25.502097659 -168.468091768 - 25.530874846 -168.374756437 - 25.618707080 -168.350143494 - 25.677703728 -168.418968786 -} -85eea66ffffffff -{ - -73.525660692 -7.663379338 - -73.432432403 -7.578135736 - -73.364109068 -7.816861786 - -73.388531969 -8.140952175 - -73.481548135 -8.229161555 - -73.550355362 -7.990330003 -} -8532333bfffffff -{ - 34.716333545 171.918584312 - 34.813560824 171.925462830 - 34.867040669 171.826354914 - 34.823197784 171.720452916 - 34.725948687 171.713813394 - 34.672564126 171.812836763 -} -855a5c37fffffff -{ - 16.005762701 164.163658736 - 16.092924513 164.161831221 - 16.136937799 164.078146235 - 16.093699882 163.996387333 - 16.006557675 163.998371915 - 15.962633636 164.081958375 -} -858eeb5bfffffff -{ - -18.819003426 -82.376861099 - -18.895790694 -82.437131334 - -18.982693670 -82.396345019 - -18.992801328 -82.295257745 - -18.916011728 -82.235011161 - -18.829116829 -82.275828034 -} -85e0126ffffffff -{ - -55.618401067 65.638798108 - -55.528263052 65.637664164 - -55.487889145 65.503554929 - -55.537431450 65.370308424 - -55.627500607 65.370751705 - -55.668096765 65.505131770 -} -8546dabbfffffff -{ - 14.373348273 -167.848057715 - 14.282927057 -167.871775244 - 14.217131899 -167.806172637 - 14.241729812 -167.716778318 - 14.332201475 -167.692968189 - 14.398024814 -167.758644936 -} -85d1144bfffffff -{ - -39.505803434 4.342596752 - -39.599019264 4.319107051 - -39.660412199 4.409680134 - -39.628509541 4.523630810 - -39.535313926 4.546849119 - -39.474000602 4.456388292 -} -859e26c3fffffff -{ - -18.836932914 169.826092273 - -18.754219109 169.789828308 - -18.737418676 169.696809625 - -18.803348633 169.639889698 - -18.886175250 169.676077693 - -18.902959078 169.769261845 -} -856ccd6ffffffff -{ - -2.621796152 -94.343697151 - -2.697021126 -94.401891401 - -2.783927814 -94.367471958 - -2.795615299 -94.274791328 - -2.720338587 -94.216561571 - -2.633426177 -94.251047848 -} -8580e317fffffff -{ - 1.794582142 -43.015560562 - 1.877024134 -42.965402413 - 1.961236826 -43.012103183 - 1.963027501 -43.108945921 - 1.880611582 -43.159109932 - 1.796378921 -43.112425484 -} -85470903fffffff -{ - 30.803696385 -167.438597979 - 30.892289314 -167.411456845 - 30.955162652 -167.482150589 - 30.929346799 -167.580074016 - 30.840634410 -167.607090661 - 30.777857340 -167.536308709 -} -85488b77fffffff -{ - 31.896215603 -101.684584678 - 31.972571069 -101.618277738 - 32.060217941 -101.664042897 - 32.071490542 -101.776249938 - 31.995078493 -101.842541599 - 31.907450475 -101.796641793 -} -85982563fffffff -{ - -11.035856154 -6.353268674 - -11.112942957 -6.380472897 - -11.174611609 -6.319211290 - -11.159080846 -6.230746238 - -11.081938493 -6.203665816 - -11.020382351 -6.264926481 -} -85f1419bfffffff -{ - -84.903044957 24.247780167 - -84.812689874 23.946024942 - -84.791322593 22.952885822 - -84.859710386 22.232297874 - -84.950879776 22.506645422 - -84.972861455 23.529531082 -} -8529a1bbfffffff +8527a14ffffffff { - 34.246714564 -118.725679709 - 34.329820855 -118.670923781 - 34.408563579 -118.729374387 - 34.404140327 -118.842605641 - 34.321018920 -118.897223314 - 34.242335856 -118.838748308 + 49.822225361 -104.230564162 + 49.748239202 -104.303709499 + 49.666915295 -104.237596188 + 49.659377408 -104.098581761 + 49.733202286 -104.025141948 + 49.814726417 -104.091009588 } -8545b46bfffffff +85dd1817fffffff { - 17.408061420 -78.520723549 - 17.347934611 -78.573218723 - 17.276548130 -78.536165564 - 17.265339609 -78.446605820 - 17.325517141 -78.394145341 - 17.396852458 -78.431209794 + -60.058731536 -13.429596251 + -59.975372625 -13.365182227 + -59.904825422 -13.483619011 + -59.917343028 -13.666305433 + -60.000524289 -13.731503787 + -60.071366034 -13.613234616 } -854009affffffff +85038597fffffff { - 26.855423997 104.454763162 - 26.942231497 104.431051797 - 26.971102716 104.332819611 - 26.913146110 104.258321148 - 26.826307659 104.282102242 - 26.797456708 104.380312161 -} -85cc302ffffffff + 81.616454891 -149.197068561 + 81.549470445 -149.644377733 + 81.458195758 -149.485757035 + 81.433541773 -148.890458879 + 81.499660316 -148.443791320 + 81.591292260 -148.591681117 +} +85ba6273fffffff +{ + -31.253826427 172.194069067 + -31.167601559 172.150588043 + -31.156113994 172.044927057 + -31.230896793 171.982530648 + -31.317239279 172.025928500 + -31.328681312 172.131806318 +} +8544d037fffffff +{ + 32.806289449 -80.455580832 + 32.864801904 -80.387911542 + 32.950363380 -80.411370593 + 32.977480600 -80.502673497 + 32.918935339 -80.570458618 + 32.833305696 -80.546824995 +} +85b49db3fffffff +{ + -20.833399446 -151.086105023 + -20.742428337 -151.056368818 + -20.672038398 -151.126398771 + -20.692528930 -151.226180088 + -20.783470388 -151.256055863 + -20.853951060 -151.186010938 +} +85492967fffffff +{ + 16.875499925 -112.868864714 + 16.956513289 -112.816547335 + 17.040820734 -112.864653968 + 17.044037004 -112.965129521 + 16.962962185 -113.017370259 + 16.878732539 -112.969212318 +} +8583248bfffffff +{ + -16.288834385 13.440955871 + -16.195690500 13.451841534 + -16.138836690 13.376053674 + -16.175084005 13.289429241 + -16.268154493 13.278495448 + -16.325051091 13.354234129 +} +859b264bfffffff +{ + -25.072762498 -172.498963360 + -24.988160870 -172.452770153 + -24.909895383 -172.507739826 + -24.916185019 -172.608778986 + -25.000685149 -172.655008980 + -25.078997098 -172.600163293 +} +85bb734ffffffff +{ + -38.259596264 174.092894541 + -38.175582172 174.044060997 + -38.168844826 173.930247373 + -38.246180190 173.865013669 + -38.330306742 173.913765106 + -38.336985434 174.027832835 +} +85d86453fffffff +{ + -53.324425111 125.355333183 + -53.266802589 125.230298787 + -53.301480597 125.087857205 + -53.393973525 125.070048858 + -53.451790493 125.195339578 + -53.416919610 125.338182710 +} +8503810ffffffff +{ + 80.094520685 -143.243006508 + 80.034597227 -143.656795380 + 79.942219850 -143.577768563 + 79.909614322 -143.093190899 + 79.968835829 -142.681593047 + 80.061359251 -142.752346233 +} +853cf463fffffff +{ + 23.900185911 88.417462669 + 23.986738360 88.389174014 + 24.005529809 88.290466499 + 23.937799155 88.220115510 + 23.851270486 88.248428052 + 23.832448635 88.347067836 +} +85ead9bbfffffff +{ + -71.481224488 177.736540858 + -71.498082627 177.512453525 + -71.577252884 177.457082141 + -71.639613313 177.627521669 + -71.622513385 177.853104195 + -71.543295779 177.906746725 +} +855f7017fffffff +{ + 5.324783991 -60.492107654 + 5.403001082 -60.445340713 + 5.480197789 -60.485256974 + 5.479165022 -60.571867016 + 5.401012869 -60.618573704 + 5.323828587 -60.578730668 +} +85f29037fffffff { - -43.282010914 85.948134894 - -43.201119703 85.907539681 - -43.188545211 85.785547470 - -43.256762007 85.703777956 - -43.337749135 85.744024838 - -43.350423793 85.866390330 + -89.371802403 176.658882492 + -89.461842117 174.865211364 + -89.516068792 -176.934508937 + -89.466540720 -167.935812057 + -89.374920706 -168.651351032 + -89.332652521 -175.794625308 +} +85ec4517fffffff +{ + -77.914757064 145.085801922 + -77.892574110 144.698827266 + -77.955743855 144.393801550 + -78.041565723 144.475865031 + -78.063963188 144.867236946 + -78.000322184 145.172118199 +} +858b8a83fffffff +{ + -9.687729093 -57.370508353 + -9.610025845 -57.321474135 + -9.526375430 -57.364017242 + -9.520470328 -57.455525385 + -9.598147029 -57.504506121 + -9.681755382 -57.462032286 +} +8502806bfffffff +{ + 73.172582855 -130.865680545 + 73.129081686 -131.138741305 + 73.041157959 -131.160843993 + 72.996858366 -130.912697645 + 73.040044277 -130.641442014 + 73.127843138 -130.616531881 +} +855c8d17fffffff +{ + 6.846090350 -153.787912228 + 6.754925170 -153.818265072 + 6.682963438 -153.753398727 + 6.702117286 -153.658173803 + 6.793264018 -153.627760382 + 6.865275404 -153.692632335 +} +85de9547fffffff +{ + -54.536350154 -35.906668685 + -54.472646192 -35.801378940 + -54.391378914 -35.849899159 + -54.373664812 -36.003126030 + -54.437111030 -36.108486981 + -54.518528738 -36.060551658 +} +850475c7fffffff +{ + 77.991690007 167.578703293 + 77.894912861 167.558913632 + 77.842404435 167.945434296 + 77.886075025 168.354198331 + 77.982759695 168.380221835 + 78.035870679 167.991258123 +} +857d2a53fffffff +{ + -8.699087991 -22.747238866 + -8.618369334 -22.704034628 + -8.540421005 -22.748510992 + -8.543152386 -22.836252150 + -8.623915066 -22.879536143 + -8.701902337 -22.834999290 +} +850b2cd3fffffff +{ + 63.343901411 66.086991499 + 63.268686642 66.193290624 + 63.271778290 66.399537616 + 63.350103956 66.500413676 + 63.425488174 66.394506386 + 63.422377209 66.187327769 +} +8531a0affffffff +{ + 41.989445039 115.044512334 + 41.907730368 115.032099472 + 41.865802634 115.110347285 + 41.905440575 115.200992688 + 41.987035236 115.213646819 + 42.029112007 115.135414693 +} +853382dbfffffff +{ + 34.694792596 -179.207228033 + 34.789896920 -179.190280809 + 34.849547304 -179.280781957 + 34.813988481 -179.388229688 + 34.718812514 -179.404966861 + 34.659266897 -179.314466652 +} +8509346ffffffff +{ + 63.448707870 -8.429235602 + 63.401394438 -8.575066736 + 63.374384358 -8.576394160 + 63.324999197 -8.546228651 + 63.295897438 -8.372321314 + 63.340777064 -8.243290779 + 63.414863086 -8.287950170 +} +85ef9a6bfffffff +{ + -73.996506892 1.073408152 + -73.901215810 1.109688166 + -73.843818299 0.833567901 + -73.881256356 0.520001394 + -73.976479849 0.480256441 + -74.034335332 0.757536147 +} +85e723d3fffffff +{ + -71.115817291 40.901705729 + -71.039660843 40.749204788 + -71.039723429 40.478461525 + -71.116052156 40.357944595 + -71.192609300 40.509609700 + -71.192436498 40.782640137 +} +85a15ec3fffffff +{ + -22.364872156 -140.023377484 + -22.274481465 -140.003963477 + -22.210826489 -140.077108329 + -22.237486477 -140.169751160 + -22.327904612 -140.189325487 + -22.391635419 -140.116096710 +} +85429d2ffffffff +{ + 18.428605654 65.800654347 + 18.362093607 65.847527410 + 18.360911046 65.937909774 + 18.426254439 65.981597182 + 18.492885458 65.934796847 + 18.494054081 65.844236089 +} +85d42267fffffff +{ + -50.422643441 -161.231111654 + -50.345914084 -161.179082128 + -50.279025515 -161.266429134 + -50.288809328 -161.405705808 + -50.365487908 -161.457917668 + -50.432433515 -161.370671193 +} +853c9abbfffffff +{ + 17.629416267 85.422066175 + 17.718920083 85.393938809 + 17.738300036 85.298615720 + 17.668217389 85.231490299 + 17.578756971 85.259631162 + 17.559335764 85.354884075 +} +85e4c9dbfffffff +{ + -56.480100564 83.286574119 + -56.389263154 83.237623717 + -56.368620677 83.071892801 + -56.438671750 82.954442763 + -56.529596704 83.002694293 + -56.550383480 83.169096477 +} +85069e27fffffff +{ + 72.857871133 -62.248838849 + 72.826169522 -62.545269735 + 72.734679176 -62.591636563 + 72.675030956 -62.344092585 + 72.706500458 -62.049763525 + 72.797848770 -62.000885121 +} +8502342bfffffff +{ + 81.818164792 -119.998207110 + 81.791322202 -120.607245627 + 81.701787314 -120.769322924 + 81.639599898 -120.332914928 + 81.666073115 -119.734494482 + 81.755097585 -119.561976260 +} +858e945bfffffff +{ + -11.857451037 -95.139184889 + -11.931773643 -95.198936927 + -12.020912373 -95.163926852 + -12.035754541 -95.069091795 + -11.961401741 -95.009298545 + -11.872236999 -95.044381456 +} +850ac89bfffffff +{ + 66.340910968 112.066086261 + 66.280841811 112.248293314 + 66.312013997 112.465811918 + 66.403520363 112.502288474 + 66.463928733 112.319678841 + 66.432490384 112.100992176 +} +85060387fffffff +{ + 69.180608940 -32.475791161 + 69.191170073 -32.715661182 + 69.117635264 -32.857547885 + 69.033838691 -32.759863374 + 69.023424359 -32.521628628 + 69.096660394 -32.379450335 +} +852513b7fffffff +{ + 48.508617015 93.380546917 + 48.416173653 93.406702973 + 48.385341657 93.536114185 + 48.446812295 93.639650766 + 48.539242929 93.613939793 + 48.570215920 93.484246861 +} +85466833fffffff +{ + 24.835800045 -157.732057545 + 24.746355659 -157.762874665 + 24.679461437 -157.692442082 + 24.702001051 -157.591162217 + 24.791464087 -157.560262319 + 24.858368909 -157.630724929 +} +85aa83cffffffff +{ + -33.157403976 69.107066926 + -33.251095736 69.127865366 + -33.283492052 69.236247855 + -33.222156798 69.323712328 + -33.128472608 69.302753748 + -33.096115993 69.194490670 +} +85a1012bfffffff +{ + -25.910474992 -134.858750991 + -25.820434585 -134.844055674 + -25.761368857 -134.918932830 + -25.792287774 -135.008619874 + -25.882384620 -135.023482273 + -25.941506189 -134.948490525 +} +85375287fffffff +{ + 37.160153625 -144.560499685 + 37.085436126 -144.598828296 + 37.020495935 -144.528260846 + 37.030276529 -144.419419387 + 37.104980633 -144.381051779 + 37.169917582 -144.451564410 +} +85ec656bfffffff +{ + -77.666794232 154.960815673 + -77.658391617 154.580298891 + -77.730335213 154.340312092 + -77.811082949 154.482508178 + -77.819521652 154.867646635 + -77.747175931 155.105931424 +} +8506ca0bfffffff +{ + 63.235506101 -51.881009194 + 63.215631985 -52.083180544 + 63.124909164 -52.146153722 + 63.054257653 -52.007834094 + 63.074079054 -51.806781545 + 63.164604351 -51.742933967 +} +85068d2ffffffff +{ + 69.783835646 -50.499682166 + 69.768500880 -50.761265110 + 69.680558127 -50.847622161 + 69.608189921 -50.673798041 + 69.623462424 -50.414104778 + 69.711164910 -50.326355159 +} +85ce3517fffffff +{ + -47.846413580 -77.037800700 + -47.765025695 -76.984340952 + -47.689744440 -77.056224081 + -47.695695485 -77.181539955 + -47.777038071 -77.235343691 + -47.852475084 -77.163488320 +} +85e43347fffffff +{ + -58.715188322 106.717448190 + -58.637588885 106.604347449 + -58.649424897 106.418748280 + -58.738928674 106.345359949 + -58.816765788 106.458223861 + -58.804861188 106.644715965 +} +85068273fffffff +{ + 73.925049938 -56.869845627 + 73.901839023 -57.189938383 + 73.813025251 -57.265717594 + 73.747634984 -57.023970335 + 73.770666207 -56.706534102 + 73.859266065 -56.628202736 +} +85f1131bfffffff +{ + -80.543381515 112.259211864 + -80.480973017 111.889941866 + -80.500429595 111.349020880 + -80.582570462 111.170061244 + -80.645650335 111.538707152 + -80.625914701 112.087004622 +} +85bc76d3fffffff +{ + -34.978209298 28.348863280 + -34.894223613 28.354870495 + -34.847866082 28.262409317 + -34.885492124 28.163911185 + -34.969475335 28.157820568 + -35.015835074 28.250311442 +} +85738117fffffff +{ + 3.548295350 130.971849355 + 3.452980962 130.988339008 + 3.419475602 131.078662548 + 3.481301646 131.152535283 + 3.576652642 131.136055357 + 3.610141037 131.045692897 +} +85d14a87fffffff +{ + -40.825081088 20.647922697 + -40.913075679 20.646430433 + -40.957040477 20.736841717 + -40.912993446 20.828525581 + -40.825097163 20.829781661 + -40.781149545 20.739589802 +} +85ef5477fffffff +{ + -77.604667714 -57.555353056 + -77.560691078 -57.156224082 + -77.463891817 -57.135581494 + -77.411159770 -57.508244140 + -77.454646186 -57.903803971 + -77.551350741 -57.930260178 +} +85ee05cbfffffff +{ + -75.722469152 -37.487853002 + -75.651759346 -37.216708833 + -75.558378568 -37.328759937 + -75.535408818 -37.708181740 + -75.605562344 -37.979513334 + -75.699239733 -37.871261949 +} +850a3617fffffff +{ + 61.259316144 85.025463000 + 61.172028009 85.082179444 + 61.148340226 85.267982110 + 61.211834311 85.397746857 + 61.299185821 85.341774242 + 61.322980250 85.155291225 +} +85f11417fffffff +{ + -81.141883116 125.359645114 + -81.095226796 124.896329419 + -81.133732124 124.365384410 + -81.219415407 124.292092947 + -81.266726852 124.758859619 + -81.227694148 125.295488977 +} +850401cbfffffff +{ + 75.157774727 147.474523665 + 75.064556916 147.585189674 + 75.042190345 147.952944617 + 75.112798286 148.213767977 + 75.206309933 148.106629219 + 75.228921789 147.735115657 +} +8546a467fffffff +{ + 22.824498940 -174.733918338 + 22.913892287 -174.715097394 + 22.969675892 -174.788886196 + 22.935948845 -174.881526201 + 22.846464947 -174.900206641 + 22.790798586 -174.826387814 +} +85ae826ffffffff +{ + -34.631947724 93.661546532 + -34.714022227 93.698687858 + -34.723467619 93.801073703 + -34.650904597 93.866140809 + -34.568913881 93.828957253 + -34.559402403 93.726748548 +} +853758cffffffff +{ + 35.759301042 -141.453813771 + 35.684394976 -141.492616404 + 35.616916328 -141.424591160 + 35.624351991 -141.317835730 + 35.699239166 -141.279009301 + 35.766709610 -141.346961891 +} +854f5877fffffff +{ + 16.423192870 147.779031464 + 16.331683833 147.793361879 + 16.294948831 147.883200664 + 16.349703720 147.958692518 + 16.441167734 147.944398328 + 16.477921933 147.854576015 +} +85a4d6cffffffff +{ + -27.816766805 -32.506068858 + -27.895267095 -32.559585968 + -27.973939875 -32.514397845 + -27.974071259 -32.415522981 + -27.895446442 -32.362013935 + -27.816814873 -32.407371421 +} +85c93573fffffff +{ + -41.736607271 123.327230021 + -41.680162762 123.233862155 + -41.706429105 123.123500748 + -41.789292550 123.106253531 + -41.845912592 123.199745124 + -41.819493338 123.310360467 +} +85ea2c73fffffff +{ + -66.363664676 -166.265446684 + -66.428362326 -166.243259927 + -66.446720645 -166.064064463 + -66.400151445 -165.907876704 + -66.335509941 -165.931172414 + -66.317380658 -166.109548705 +} +8505b447fffffff +{ + 69.144581869 110.239585203 + 69.086344439 110.451139321 + 69.121156286 110.694638294 + 69.214514590 110.727989336 + 69.273119819 110.515789721 + 69.237997459 110.270881075 +} +857a1c93fffffff +{ + 1.243829433 45.573743460 + 1.331232532 45.572337066 + 1.379361055 45.496390684 + 1.340109893 45.421766683 + 1.252645728 45.423118482 + 1.204493742 45.499148924 +} +859a0b17fffffff +{ + -11.363457102 -175.690565546 + -11.285683063 -175.648786400 + -11.217670787 -175.693855025 + -11.227370486 -175.780596850 + -11.305032405 -175.822389297 + -11.373106672 -175.777426781 +} +8510858ffffffff +{ + 54.024100731 47.977291127 + 53.959617772 48.084070130 + 53.985061614 48.231731100 + 54.075118005 48.273028704 + 54.139742580 48.166127078 + 54.114168858 48.018049729 +} +85f2821bfffffff +{ + -88.135109784 -143.050601899 + -88.213761010 -141.585910217 + -88.206236444 -138.681184730 + -88.120426585 -137.494568072 + -88.045262178 -139.053632383 + -88.052448424 -141.718460249 +} +851456a7fffffff +{ + 56.331986891 135.872696139 + 56.254502735 135.951075050 + 56.250312587 136.116701810 + 56.323596908 136.204752773 + 56.401310816 136.126816092 + 56.405510691 135.960383568 +} +858ad5affffffff +{ + -0.021557772 -60.987512831 + 0.056884377 -60.940595778 + 0.137043541 -60.980533966 + 0.138732675 -61.067313947 + 0.060346075 -61.114168497 + -0.019785181 -61.074305633 +} +8502750bfffffff +{ + 77.364367581 -81.243629533 + 77.308588668 -81.578225539 + 77.220344752 -81.518068484 + 77.187731810 -81.127811653 + 77.243015858 -80.794288883 + 77.331404904 -80.849933652 +} +85e2e803fffffff +{ + -52.858465519 -131.128393127 + -52.821640185 -130.992360101 + -52.728869961 -130.978035326 + -52.673020701 -131.099255661 + -52.709786791 -131.234852087 + -52.802461137 -131.249663968 +} +8566e627fffffff +{ + 4.384533391 -74.886715395 + 4.312576841 -74.939827161 + 4.229077460 -74.900817794 + 4.217599573 -74.808697609 + 4.289595621 -74.755638658 + 4.373030067 -74.794646953 +} +85c5a20ffffffff +{ + -32.964376871 -42.943622426 + -33.033621459 -43.003265788 + -33.113384608 -42.970920440 + -33.123919078 -42.878725739 + -33.054568009 -42.819018990 + -32.974789062 -42.851570201 +} +85187037fffffff +{ + 49.354459690 -4.747180331 + 49.299631068 -4.845638925 + 49.211966789 -4.817536840 + 49.179161705 -4.691331442 + 49.233924996 -4.593038454 + 49.321558534 -4.620785109 +} +85955babfffffff +{ + -7.878356772 129.059020057 + -7.969279891 129.075344507 + -8.003579178 129.163494583 + -7.946952352 129.235363017 + -7.855980816 129.219044712 + -7.821684477 129.130851761 +} +8500d083fffffff +{ + 82.460269737 86.998712554 + 82.437749867 87.683834605 + 82.505832951 88.179546867 + 82.597414068 87.989263641 + 82.620343949 87.290127404 + 82.551275928 86.795463724 +} +8554d437fffffff +{ + 10.361608133 -17.300544026 + 10.297576188 -17.358142581 + 10.223523300 -17.328290077 + 10.213447108 -17.240960258 + 10.277366904 -17.183363807 + 10.351474941 -17.213094911 +} +85144413fffffff +{ + 59.687490806 137.206826238 + 59.606359215 137.290818794 + 59.600352957 137.475930344 + 59.675453166 137.578050497 + 59.756827593 137.494650842 + 59.762859085 137.308534455 +} +850fa137fffffff +{ + 68.087574919 -81.266898523 + 68.028255889 -81.470317028 + 67.933527722 -81.434059008 + 67.898023478 -81.196049767 + 67.957037883 -80.993026144 + 68.051860082 -81.027613241 +} +85cf212ffffffff +{ + -54.675793505 -81.002547967 + -54.593942634 -80.931102545 + -54.517346798 -81.009918618 + -54.522444064 -81.160067267 + -54.604224679 -81.231938136 + -54.680978432 -81.153236304 +} +85022653fffffff +{ + 82.572715057 -110.791493514 + 82.560189550 -111.480909122 + 82.475588622 -111.765039051 + 82.404292508 -111.369544063 + 82.416707732 -110.694486822 + 82.500526917 -110.400762825 +} +853baa33fffffff +{ + 33.051748384 -55.587711671 + 32.968746896 -55.616896230 + 32.901334256 -55.552085126 + 32.916825329 -55.458008910 + 32.999852808 -55.428611964 + 33.067363333 -55.493503520 +} +85321a93fffffff +{ + 38.162396913 169.706970308 + 38.259431780 169.711437074 + 38.310964970 169.606389679 + 38.265376903 169.496989354 + 38.168333931 169.492785732 + 38.116886951 169.597719227 } -85281b27fffffff +856b440ffffffff +{ + 14.636138091 30.213092655 + 14.544944302 30.203774089 + 14.493875343 30.282333618 + 14.533899923 30.370229060 + 14.625049035 30.379674553 + 14.676218349 30.301097779 +} +85e059abfffffff +{ + -55.379546382 46.151551876 + -55.299651925 46.195872544 + -55.245407568 46.107082217 + -55.270867918 45.974128181 + -55.350579076 45.929396448 + -55.405013219 46.018028282 +} +85b6547bfffffff +{ + -24.279339332 -97.292942333 + -24.345454594 -97.354717190 + -24.430511976 -97.319446307 + -24.449498348 -97.222315904 + -24.383381194 -97.160486174 + -24.298279577 -97.195841614 +} +85c0422bfffffff +{ + -38.275603971 -1.856952357 + -38.368904342 -1.888324797 + -38.436374970 -1.801777362 + -38.410452209 -1.683906328 + -38.317136934 -1.652783931 + -38.249759182 -1.739282215 +} +85068933fffffff +{ + 69.259293884 -52.210381930 + 69.241176240 -52.465801017 + 69.151983888 -52.543884900 + 69.081132145 -52.367968116 + 69.099169741 -52.114327045 + 69.188138560 -52.034833016 +} +855a0687fffffff +{ + 13.555533946 173.675026024 + 13.639996869 173.682058697 + 13.685997618 173.605089861 + 13.647424906 173.521130523 + 13.562933652 173.514244079 + 13.517043303 173.591170670 +} +855ccc33fffffff +{ + 4.380157991 -146.927529951 + 4.290501552 -146.960001194 + 4.218778224 -146.897928808 + 4.236661627 -146.803414422 + 4.326269691 -146.770905774 + 4.398042759 -146.832948778 +} +851cd633fffffff +{ + 44.125436377 -146.347975017 + 44.059182233 -146.387361734 + 44.002147762 -146.312763439 + 44.011360882 -146.198825220 + 44.077603709 -146.159387009 + 44.134644774 -146.233938266 +} +859c6497fffffff +{ + -20.344395471 139.104732038 + -20.256417111 139.096194171 + -20.223721452 139.009452552 + -20.278887913 138.931181246 + -20.366839012 138.939548896 + -20.399651048 139.026358055 +} +85461107fffffff +{ + 23.568207412 -170.502679377 + 23.655870572 -170.480143655 + 23.713095773 -170.549162610 + 23.682545700 -170.640774756 + 23.594775483 -170.663189000 + 23.537662377 -170.594112836 +} +8583921bfffffff +{ + -2.676617971 20.557304434 + -2.583636351 20.565348204 + -2.532461430 20.488401082 + -2.574202243 20.403424232 + -2.667138161 20.395325616 + -2.718379033 20.472258635 +} +85f2e69bfffffff +{ + -80.304845029 -121.794777254 + -80.358079064 -121.371554759 + -80.319078149 -120.877990991 + -80.227337812 -120.813934558 + -80.174847537 -121.234873144 + -80.213359369 -121.722188959 +} +856d553bfffffff +{ + 10.539131701 -90.202022472 + 10.469727077 -90.258139426 + 10.392288989 -90.223323579 + 10.384282855 -90.132339917 + 10.453750413 -90.076207667 + 10.531161119 -90.111074265 +} +85a843d7fffffff +{ + -19.173630618 -56.505089209 + -19.101823217 -56.455058530 + -19.020794036 -56.498659801 + -19.011623175 -56.592222986 + -19.083428218 -56.642201653 + -19.164406496 -56.598669247 +} +85e8c80ffffffff +{ + -57.455069318 -75.307711912 + -57.435811269 -75.145730829 + -57.355444137 -75.088727612 + -57.294533515 -75.193111870 + -57.308015990 -75.345620255 + -57.391073525 -75.407571253 + -57.414292125 -75.377233454 +} +8570029bfffffff +{ + 4.561445786 -171.268971303 + 4.476105765 -171.289608885 + 4.410496389 -171.228157836 + 4.430176032 -171.145990662 + 4.515560284 -171.125266774 + 4.581220715 -171.186796350 +} +85ce18c7fffffff +{ + -42.533536072 -77.265141869 + -42.454854293 -77.216425961 + -42.378961036 -77.281171040 + -42.381592583 -77.394607400 + -42.460222564 -77.443602910 + -42.536272963 -77.378883021 +} +85ee3407fffffff +{ + -78.703434789 -28.280131785 + -78.623433663 -27.999623452 + -78.535893148 -28.210670123 + -78.527816552 -28.697797467 + -78.607171668 -28.980799678 + -78.695248155 -28.774247716 +} +85e8a63bfffffff +{ + -69.635312998 -80.595544949 + -69.625316060 -80.329932879 + -69.540065577 -80.215588095 + -69.465149996 -80.365573409 + -69.475134371 -80.629069762 + -69.560046711 -80.744685300 +} +851a1a7bfffffff +{ + 46.357487898 -47.266570391 + 46.272678072 -47.315979073 + 46.203490976 -47.240124596 + 46.219023364 -47.114826755 + 46.303829814 -47.065122138 + 46.373107360 -47.141010835 +} +858e8c47fffffff +{ + -14.543466335 -90.048973454 + -14.619154699 -90.109625997 + -14.708515604 -90.071931452 + -14.722199808 -89.973525459 + -14.646491200 -89.912855844 + -14.557118661 -89.950609155 +} +8539369bfffffff +{ + 40.026302745 -12.388610782 + 39.958138097 -12.472234853 + 39.866746949 -12.436966422 + 39.843515728 -12.318333372 + 39.911590406 -12.234765168 + 40.002986140 -12.269773831 +} +8504480bfffffff +{ + 73.597860608 -173.622582444 + 73.508313354 -173.741416137 + 73.435209827 -173.532689282 + 73.451196780 -173.205931249 + 73.540387052 -173.084721232 + 73.613948229 -173.292625225 +} +85c2c267fffffff +{ + -32.751082379 -56.274340195 + -32.693963911 -56.223057898 + -32.624287079 -56.267802770 + -32.611769088 -56.363758605 + -32.668901370 -56.414987279 + -32.738537832 -56.370313850 +} +8520114bfffffff +{ + 43.105072836 70.991066519 + 43.018820197 71.052517915 + 43.014387715 71.185492282 + 43.096195806 71.257399614 + 43.182570734 71.196169666 + 43.187015318 71.062810025 +} +853db11bfffffff +{ + 25.873350337 75.508792481 + 25.795864601 75.550371266 + 25.788727851 75.651110747 + 25.859038708 75.710488450 + 25.936625005 75.669066657 + 25.943799963 75.568109789 +} +855f53c7fffffff +{ + 8.971050409 -59.158138887 + 9.048589145 -59.111074110 + 9.123587764 -59.151529745 + 9.121046897 -59.238980484 + 9.043575527 -59.285989272 + 8.968577705 -59.245603384 +} +85dc886bfffffff +{ + -48.157540815 -9.894885425 + -48.244499102 -9.942362258 + -48.314348705 -9.849903744 + -48.297150215 -9.709920653 + -48.210137837 -9.662719289 + -48.140377918 -9.755224820 +} +851f249bfffffff +{ + 57.786025721 9.176344826 + 57.713856316 9.188355998 + 57.689959927 9.326201736 + 57.738195953 9.452358143 + 57.810398828 9.440671589 + 57.834332377 9.302503512 +} +852f6d27fffffff { - 44.146428252 -124.337273808 - 44.225286516 -124.283524521 - 44.291655348 -124.350072007 - 44.279118275 -124.470349088 - 44.200264201 -124.523898462 - 44.133942964 -124.457371009 + 29.095165981 138.402444434 + 29.015509242 138.418803308 + 28.986648110 138.513660655 + 29.037458454 138.592175611 + 29.117106306 138.575840920 + 29.145952778 138.480967015 +} +859a63a3fffffff +{ + -12.928360722 178.700131363 + -12.853135371 178.743619848 + -12.785014141 178.704395223 + -12.792074929 178.621802033 + -12.867184064 178.578325530 + -12.935348526 178.617430110 +} +85e7a3d7fffffff +{ + -63.965971629 39.423130356 + -63.893091943 39.319071446 + -63.888471345 39.126492937 + -63.956798708 39.036820401 + -64.029975061 39.140406476 + -64.034527136 39.334142468 +} +85770ab7fffffff +{ + 5.787415061 156.634569806 + 5.695854354 156.646490113 + 5.660518188 156.727881277 + 5.716679073 156.797311714 + 5.808162180 156.785432316 + 5.843562010 156.704081562 +} +856d5c77fffffff +{ + 8.833024427 -89.613950620 + 8.762334078 -89.670372697 + 8.682975163 -89.635133800 + 8.674333839 -89.543423117 + 8.745086113 -89.486988181 + 8.824417736 -89.522276674 +} +854cd833fffffff +{ + 15.821687940 -68.426457354 + 15.764077002 -68.473727629 + 15.691556307 -68.436414780 + 15.676717452 -68.351852981 + 15.734373151 -68.304651669 + 15.806822968 -68.341943107 +} +85dca9d7fffffff +{ + -51.525752786 -12.288914466 + -51.608940322 -12.342356679 + -51.678495540 -12.247555586 + -51.664773222 -12.099221978 + -51.581520755 -12.046062149 + -51.512055428 -12.140952630 +} +85210ca7fffffff +{ + 51.849505413 64.090737590 + 51.768790343 64.174241177 + 51.773561166 64.329676247 + 51.859083670 64.402133330 + 51.939945470 64.318816609 + 51.935137954 64.162854490 +} +85f160a3fffffff +{ + -87.541105398 -1.445944437 + -87.448305370 -1.131531258 + -87.391236077 -2.753639801 + -87.424104172 -4.719731346 + -87.515892301 -5.163541763 + -87.575908879 -3.514609773 +} +859f6353fffffff +{ + -25.780147022 166.472092819 + -25.691812847 166.435383360 + -25.674125534 166.333259531 + -25.744780626 166.267651456 + -25.833219729 166.304250444 + -25.850898825 166.406568310 +} +85b00983fffffff +{ + -23.281701609 -118.853442469 + -23.232860568 -118.773542712 + -23.151743822 -118.779646404 + -23.119470971 -118.865445321 + -23.168192495 -118.945244071 + -23.249306196 -118.939344925 +} +85be45c7fffffff +{ + -37.177274329 144.215567391 + -37.081852922 144.198713486 + -37.045365836 144.087849949 + -37.104207110 143.993696677 + -37.199615291 144.010296495 + -37.236195585 144.121303783 +} +857f2987fffffff +{ + -7.512157617 170.677899760 + -7.440705855 170.645520407 + -7.422880325 170.564092055 + -7.476508565 170.514915696 + -7.548055918 170.547240038 + -7.565879429 170.628795925 +} +85335ccffffffff +{ + 29.610303623 164.813440860 + 29.706788812 164.812034186 + 29.754418155 164.714890601 + 29.705481443 164.619282736 + 29.609017249 164.620902710 + 29.561468615 164.717917303 +} +850895affffffff +{ + 59.057592818 18.264226531 + 58.985832245 18.264574450 + 58.952677236 18.404733560 + 58.991216004 18.544776285 + 59.062983885 18.544804202 + 59.096205898 18.404413439 +} +85e533dbfffffff +{ + -60.938887806 123.625542009 + -60.879637763 123.472325339 + -60.915126254 123.292037415 + -61.010071383 123.264292378 + -61.069551031 123.417848696 + -61.033855258 123.598811504 +} +85934e9bfffffff +{ + -9.283271291 -97.190115541 + -9.357267894 -97.248966666 + -9.445708233 -97.215322575 + -9.460180816 -97.122750810 + -9.386146516 -97.063850344 + -9.297677366 -97.097570893 +} +85b8768bfffffff +{ + -31.312422918 126.030487377 + -31.223732377 126.035591365 + -31.178771862 125.955153581 + -31.222379714 125.869622026 + -31.310969403 125.864343505 + -31.356052132 125.944770850 +} +85a520cffffffff +{ + -9.708294129 -27.196239888 + -9.626187108 -27.150342612 + -9.546284646 -27.196505369 + -9.548458782 -27.288613059 + -9.630602165 -27.334579341 + -9.710535044 -27.288369025 +} +851c1c33fffffff +{ + 48.861417720 -144.044075072 + 48.803173046 -144.085535156 + 48.750247622 -144.009823796 + 48.755552796 -143.892719566 + 48.813781656 -143.851217070 + 48.866721182 -143.926860944 +} +850ae58ffffffff +{ + 66.838582046 98.515085871 + 66.796285428 98.725762543 + 66.844823875 98.917534297 + 66.936007035 98.899158274 + 66.978550122 98.687387870 + 66.929662442 98.495089516 +} +850ea047fffffff +{ + 61.431342556 -90.607937254 + 61.361459628 -90.747050490 + 61.268506316 -90.691124101 + 61.245272722 -90.496952892 + 61.314902316 -90.357732611 + 61.408018405 -90.412787303 +} +85a39413fffffff +{ + -21.465873997 38.537813617 + -21.371528143 38.539165105 + -21.325052097 38.452407371 + -21.372930023 38.364221019 + -21.467317557 38.362795741 + -21.513785554 38.449630633 +} +850322c7fffffff +{ + 89.384753690 -138.714403147 + 89.329446726 -145.215402558 + 89.236554384 -143.988627063 + 89.196796737 -137.894643345 + 89.242858638 -132.088984912 + 89.336778042 -131.646338196 } -85f164abfffffff +85eecebbfffffff +{ + -65.162812086 -33.238911673 + -65.089779940 -33.093918363 + -65.001205388 -33.174014963 + -64.985434309 -33.397966418 + -65.058126075 -33.543247604 + -65.146928751 -33.464295467 +} +850759cffffffff +{ + 64.005364846 -24.427172604 + 64.023156796 -24.608102437 + 63.956875632 -24.738339491 + 63.873045898 -24.687528740 + 63.855449279 -24.507475327 + 63.921487656 -24.377358633 +} +8516b49bfffffff +{ + 50.103187345 152.196265220 + 50.190417232 152.176676446 + 50.218394712 152.047725586 + 50.159126765 151.938700231 + 50.071971266 151.958593598 + 50.044009176 152.087208332 +} +85c81127fffffff +{ + -38.175811861 108.843402449 + -38.110101516 108.771434006 + -38.121330305 108.658634333 + -38.198333990 108.617478825 + -38.264224671 108.689385040 + -38.252931173 108.802509645 +} +85a5668bfffffff +{ + -12.633516937 -21.272264562 + -12.553409488 -21.229777060 + -12.478516925 -21.273865869 + -12.483702658 -21.360507047 + -12.563864583 -21.403078018 + -12.638786281 -21.358924401 +} +85b1a21bfffffff +{ + -34.530205480 -112.508172972 + -34.471673406 -112.417387853 + -34.379415461 -112.433969810 + -34.345659368 -112.541054279 + -34.404049994 -112.631757570 + -34.496337943 -112.615458438 +} +8500a21bfffffff +{ + 75.775391634 66.908532375 + 75.781839723 67.269964158 + 75.863473790 67.414702477 + 75.939001671 67.195093060 + 75.932366299 66.829613585 + 75.850391602 66.687820302 +} +85037507fffffff +{ + 83.220058917 -52.129402954 + 83.286740377 -52.583604589 + 83.274084815 -53.350304910 + 83.194997691 -53.645980472 + 83.129384431 -53.187236699 + 83.141794417 -52.437118255 +} +85d69c73fffffff +{ + -43.421732524 41.372137915 + -43.501524370 41.368328726 + -43.552951432 41.454734445 + -43.524539509 41.545007224 + -43.444664534 41.548662057 + -43.393284574 41.462198720 +} +85056d57fffffff +{ + 85.427046229 -173.520196441 + 85.339285537 -173.935882981 + 85.264469197 -173.214182165 + 85.275874304 -172.086782801 + 85.362494545 -171.642805340 + 85.438860682 -172.353642972 +} +85c3718ffffffff +{ + -38.408988965 -65.607835703 + -38.335523687 -65.583640022 + -38.271721556 -65.648919134 + -38.281253122 -65.738472586 + -38.354722300 -65.762916342 + -38.418656193 -65.697558710 +} +85239d63fffffff +{ + 45.496711395 -158.300013371 + 45.575507301 -158.258773496 + 45.645934861 -158.327883126 + 45.637526227 -158.438433288 + 45.558614326 -158.479577645 + 45.488227093 -158.410267898 +} +850f1e4ffffffff +{ + 66.678268159 -76.719157204 + 66.624342028 -76.921669481 + 66.528245529 -76.904038254 + 66.486034270 -76.685441942 + 66.539685189 -76.483520560 + 66.635821527 -76.499603133 +} +852152abfffffff +{ + 50.459843854 70.350437990 + 50.374287869 70.421856891 + 50.370740794 70.574103778 + 50.452741882 70.655436282 + 50.538424514 70.584298083 + 50.541979443 70.431545302 +} +85429173fffffff +{ + 17.337638077 63.567197378 + 17.273159982 63.615162737 + 17.272859163 63.703487364 + 17.337059657 63.744016081 + 17.401657767 63.696107619 + 17.401935316 63.607613280 +} +8586335bfffffff +{ + -6.627114687 87.027316372 + -6.541145854 87.001421274 + -6.516343971 86.912284321 + -6.577507149 86.849100657 + -6.663416193 86.875011727 + -6.688221875 86.964090593 +} +85788313fffffff +{ + -5.750349670 -140.488449799 + -5.831960364 -140.520915604 + -5.895262970 -140.464856007 + -5.877013195 -140.376384590 + -5.795473518 -140.343905407 + -5.732112595 -140.399910902 +} +85f2939bfffffff { - -88.368524380 -21.089156620 - -88.285613636 -19.616525192 - -88.208700038 -21.295482090 - -88.210781453 -24.327114868 - -88.289875529 -25.956293481 - -88.370714866 -24.415823569 + -89.718092729 109.472925507 + -89.722562839 90.522944647 + -89.790452443 76.048158603 + -89.881742454 84.142735302 + -89.867510404 126.833332400 + -89.776440832 126.320987469 } -850c4637fffffff +85554ea3fffffff +{ + 17.495162258 -5.008209255 + 17.432730016 -5.073590808 + 17.352931312 -5.054662584 + 17.335567887 -4.970509751 + 17.397894103 -4.905200055 + 17.477689632 -4.923971288 +} +85f2f18bfffffff +{ + -81.297051670 -110.762548855 + -81.336588613 -110.222190830 + -81.282145611 -109.724902989 + -81.188923714 -109.772281077 + -81.150085937 -110.305933611 + -81.203778498 -110.798888556 +} +85f14997fffffff +{ + -81.975828537 12.135172025 + -81.880707686 12.078077968 + -81.840349907 11.478966437 + -81.894428729 10.928156934 + -81.989740202 10.971909467 + -82.030791382 11.579863441 +} +85b600cbfffffff +{ + -28.888920373 -93.539506418 + -28.823849482 -93.476499273 + -28.741752216 -93.514798911 + -28.724600299 -93.615963738 + -28.789540408 -93.679065303 + -28.871763202 -93.640908047 +} +852696affffffff +{ + 40.554846443 -111.578320807 + 40.631835027 -111.513260024 + 40.710433383 -111.571164316 + 40.712001189 -111.694216860 + 40.634979905 -111.759173409 + 40.556423522 -111.701182078 +} +85f2b033fffffff +{ + -86.457754089 173.744775505 + -86.544686454 173.394258028 + -86.602851643 174.517240880 + -86.571887412 175.983306947 + -86.484034652 176.271314941 + -86.428027512 175.156912407 +} +85f2f0cbfffffff +{ + -82.726830398 -113.829849492 + -82.771186775 -113.202252680 + -82.720997807 -112.587073104 + -82.627307764 -112.607136889 + -82.583829224 -113.226518370 + -82.633173845 -113.834044368 +} +856aa44ffffffff +{ + 4.530121179 20.785070386 + 4.617496664 20.792800543 + 4.664138639 20.717996815 + 4.623477174 20.635475169 + 4.536141520 20.627693060 + 4.489427428 20.702484495 +} +8514d58bfffffff +{ + 50.433231696 136.195628041 + 50.361488123 136.260471235 + 50.356873875 136.398877004 + 50.423991472 136.473000040 + 50.495930697 136.408470335 + 50.500556709 136.269502563 +} +856a738ffffffff +{ + 7.422100208 31.828414404 + 7.507142020 31.832129596 + 7.553939127 31.754633361 + 7.515750914 31.673386565 + 7.430705857 31.669612259 + 7.383852163 31.747143853 +} +85348833fffffff +{ + 28.191278322 -31.993451101 + 28.110522519 -32.051271003 + 28.025413629 -32.000227553 + 28.020959186 -31.891456937 + 28.101629975 -31.833524560 + 28.186840232 -31.884474887 +} +852e2a77fffffff +{ + 38.413366443 141.841801775 + 38.500564112 141.814824718 + 38.524059610 141.711974914 + 38.460396417 141.636355394 + 38.373319949 141.663476663 + 38.349785480 141.766073668 +} +855d04dbfffffff +{ + 22.798450857 -153.555146483 + 22.708272796 -153.587688944 + 22.638055170 -153.518413015 + 22.658001566 -153.416589477 + 22.748180977 -153.383978626 + 22.818412692 -153.453259547 +} +858e954ffffffff +{ + -12.853262676 -94.119075982 + -12.927756094 -94.179169367 + -13.017037210 -94.143533049 + -13.031848839 -94.047732650 + -12.957328261 -93.987602490 + -12.868023243 -94.023309390 +} +854408c7fffffff +{ + 27.713595413 -86.485561783 + 27.780354572 -86.419396843 + 27.868144371 -86.448378799 + 27.889216359 -86.543689238 + 27.822399332 -86.609935538 + 27.734568245 -86.580790112 +} +854b186bfffffff +{ + 26.294025291 126.006534912 + 26.214140373 126.023784636 + 26.192609594 126.114847532 + 26.251009463 126.188716259 + 26.330917552 126.171467641 + 26.352402671 126.080349115 +} +8511024bfffffff +{ + 59.248501558 32.265583156 + 59.205351760 32.394644990 + 59.248809033 32.530638827 + 59.335576411 32.537765675 + 59.378800227 32.408248788 + 59.335182357 32.272060727 +} +85eb164bfffffff +{ + -59.115261308 -162.738202472 + -59.050441156 -162.676661100 + -58.991317632 -162.775239524 + -58.996938530 -162.935203218 + -59.061695270 -162.996966431 + -59.120894573 -162.898545150 +} +85232157fffffff +{ + 35.660780111 -166.246761437 + 35.748860277 -166.216885793 + 35.814551400 -166.290147112 + 35.792078048 -166.393392388 + 35.703877687 -166.423136139 + 35.638270882 -166.349766913 +} +8545006ffffffff +{ + 18.339162771 -86.629695143 + 18.408258985 -86.568507573 + 18.493125800 -86.595447452 + 18.508920745 -86.683714636 + 18.439744193 -86.744971147 + 18.354853116 -86.717891591 +} +85d79147fffffff +{ + -49.879660078 47.500581872 + -49.956015040 47.502542741 + -50.003724237 47.607174113 + -49.975033138 47.709866435 + -49.898625773 47.707692004 + -49.850961808 47.603039066 +} +85338eb7fffffff +{ + 34.827747575 176.748323489 + 34.924100495 176.760795504 + 34.981161119 176.665779097 + 34.941766025 176.558329735 + 34.845363150 176.546085092 + 34.788405179 176.641062218 +} +85f0084ffffffff +{ + -77.718177427 60.604276966 + -77.661897523 60.267298956 + -77.693037103 59.889127953 + -77.780944306 59.844319111 + -77.837780320 60.182978841 + -77.806149355 60.564779988 +} +85ca53d7fffffff +{ + -42.319507218 62.999131329 + -42.406885777 63.016013483 + -42.443420301 63.130353711 + -42.392528238 63.227712630 + -42.305132823 63.210627814 + -42.268646200 63.096386653 +} +85051873fffffff +{ + 76.555905121 124.843337928 + 76.480337227 125.103125258 + 76.494743725 125.512386028 + 76.584913100 125.666662952 + 76.661059567 125.407905821 + 76.646456356 124.993804114 +} +85c55373fffffff +{ + -37.756455254 -31.746904073 + -37.834803262 -31.807115006 + -37.917527026 -31.754780707 + -37.921875072 -31.642021136 + -37.843415652 -31.581827454 + -37.760719682 -31.634375686 +} +85016287fffffff +{ + 74.557441933 5.945831824 + 74.626570269 6.057541832 + 74.689729446 5.854767188 + 74.683279939 5.539598179 + 74.613853132 5.430127068 + 74.551173189 5.633568582 +} +8514c4dbfffffff +{ + 52.137263453 135.868539228 + 52.063864653 135.937411289 + 52.059640954 136.082931625 + 52.128806973 136.160199761 + 52.202411975 136.091668426 + 52.206644786 135.945526433 +} +85b214a7fffffff +{ + -26.150110870 -73.375691478 + -26.225398664 -73.433322116 + -26.303452941 -73.390283304 + -26.306202096 -73.289621605 + -26.230936956 -73.232062079 + -26.152900033 -73.275092981 +} +850275abfffffff +{ + 77.282418171 -79.339785421 + 77.228986148 -79.680048739 + 77.140263245 -79.632184904 + 77.104856602 -79.248585762 + 77.157804840 -78.909683229 + 77.246640614 -78.953006669 +} +8539943bfffffff +{ + 30.159674945 -11.855470890 + 30.089809957 -11.929726460 + 29.999423577 -11.899159021 + 29.978892175 -11.794540726 + 30.048653262 -11.720333136 + 30.139049522 -11.750695651 +} +85bd2c4bfffffff +{ + -41.979226701 35.341054955 + -41.904483854 35.344054728 + -41.869101122 35.247161504 + -41.908463278 35.147191524 + -41.983218367 35.144099208 + -42.018599153 35.241069427 +} +85e4096bfffffff +{ + -61.107086820 94.020764946 + -61.019816441 93.932569737 + -61.013002619 93.733108648 + -61.093402038 93.620800436 + -61.180859919 93.708304785 + -61.187731092 93.908812105 +} +85ef8cabfffffff +{ + -78.071421729 -13.907630594 + -77.980643231 -13.743190525 + -77.905790846 -14.035699436 + -77.921075868 -14.491509861 + -78.011435976 -14.660757288 + -78.086931679 -14.369438351 +} +85840a33fffffff +{ + -6.299293517 66.642002287 + -6.385367168 66.657111386 + -6.414025678 66.743782173 + -6.356537964 66.815274908 + -6.270478116 66.800057515 + -6.241892068 66.713455614 +} +850244d7fffffff +{ + 75.924956075 -79.373151614 + 75.870800664 -79.683277223 + 75.780854168 -79.639593323 + 75.744956953 -79.289549492 + 75.798672201 -78.980550801 + 75.888722412 -79.020459579 +} +85099ac7fffffff +{ + 58.192961247 10.054606059 + 58.121152831 10.065599462 + 58.096570500 10.204616144 + 58.143755280 10.332958063 + 58.215594444 10.322299305 + 58.240218257 10.182963506 +} +85e70a57fffffff { - 60.589543225 -147.984583067 - 60.528923995 -148.109733654 - 60.453203621 -148.070476132 - 60.438012529 -147.906891804 - 60.498356806 -147.781824436 - 60.574166512 -147.820256260 + -68.343505361 29.209550101 + -68.259473535 29.118720171 + -68.241693946 28.880719896 + -68.307893871 28.731817951 + -68.392218038 28.821388641 + -68.410050309 29.061128717 } -857b5c93fffffff +8598d3b3fffffff { - -5.239549805 41.824328331 - -5.146395122 41.824306929 - -5.097260576 41.744353946 - -5.141263267 41.664343790 - -5.234473003 41.664303289 - -5.283625052 41.744334884 + -23.263339815 -8.080263200 + -23.351854901 -8.113166496 + -23.422400674 -8.044228075 + -23.404318029 -7.942374400 + -23.315743270 -7.909626358 + -23.245310730 -7.978576471 } -855e99cbfffffff +853e5ebbfffffff { - 18.113272691 -48.034832967 - 18.185431876 -47.985822452 - 18.256194149 -48.030367214 - 18.254827552 -48.123887691 - 18.182719090 -48.172882848 - 18.111926523 -48.128373008 + 24.923671570 31.421268136 + 24.827853483 31.410040040 + 24.771734046 31.495140300 + 24.811343815 31.591480949 + 24.907109038 31.602858382 + 24.963317455 31.517745978 } -856b6317fffffff +851b80cbfffffff { - 15.832195618 30.928790631 - 15.740291622 30.918819717 - 15.688353181 30.997656563 - 15.728218525 31.086477742 - 15.820073714 31.096576695 - 15.872112468 31.017726541 + 52.573157340 -56.940540705 + 52.543825157 -57.087660469 + 52.452249800 -57.122824737 + 52.390142996 -57.011412628 + 52.419392834 -56.864856375 + 52.510831536 -56.829150099 } -8553822ffffffff +8542f547fffffff { - 18.951498107 35.322392251 - 18.859035590 35.308759469 - 18.804223599 35.385853389 - 18.841774127 35.476566958 - 18.934165441 35.490322461 - 18.989077501 35.413241833 + 22.938732283 67.134630336 + 22.866792847 67.183483071 + 22.865246523 67.280400811 + 22.935649276 67.328670775 + 23.007713761 67.279910549 + 23.009250422 67.182787494 } -8500de97fffffff +858c45abfffffff { - 83.906423939 98.644788565 - 83.866519283 99.438403014 - 83.920373893 100.172793158 - 84.015280123 100.121868360 - 84.056124342 99.312774136 - 84.001106504 98.570197200 + -12.149384242 97.169181700 + -12.068488758 97.145825918 + -12.046835035 97.056712568 + -12.106109560 96.990991169 + -12.186978487 97.014387623 + -12.208599513 97.103464894 } -8550a987fffffff +85554e33fffffff { - 23.829732241 -128.008114566 - 23.913378164 -127.967598534 - 23.989646541 -128.023162129 - 23.982184074 -128.119207795 - 23.898543040 -128.159577936 - 23.822359519 -128.104048453 + 17.307809108 -5.204212155 + 17.245321232 -5.269451713 + 17.165654775 -5.250346182 + 17.148478019 -5.166157473 + 17.210859452 -5.100988579 + 17.290523946 -5.119937681 } -85032407fffffff +8542731bfffffff { - 88.738268502 28.426743913 - 88.802251073 31.418010310 - 88.893152397 30.295478470 - 88.916626299 25.632495548 - 88.846493728 22.692332807 - 88.759292816 24.320127030 -} -85597537fffffff -{ - 22.888888970 7.605677214 - 22.795429888 7.614835456 - 22.754064819 7.705054648 - 22.806134821 7.786259966 - 22.899669262 7.777237032 - 22.941058410 7.686873316 -} -85e50dc7fffffff -{ - -65.559070526 114.538224484 - -65.490278526 114.376982459 - -65.514034242 114.151660048 - -65.606738168 114.086347865 - -65.675816089 114.247611472 - -65.651903445 114.474170106 -} -8526cc17fffffff -{ - 34.448541974 -96.345621421 - 34.519778874 -96.275880931 - 34.607349324 -96.317468866 - 34.623687372 -96.428962448 - 34.552396900 -96.498728899 - 34.464822014 -96.456976056 -} -85eccc57fffffff -{ - -72.141740061 122.924356300 - -72.085865887 122.687252120 - -72.122064179 122.404230607 - -72.214409323 122.356618933 - -72.270625623 122.594484371 - -72.234153081 122.879205013 -} -85f12ea7fffffff -{ - -85.978113455 129.020232369 - -86.023649044 127.912365213 - -86.111214035 127.966108710 - -86.153034763 129.180386690 - -86.105712667 130.309888719 - -86.018393315 130.203689714 -} -856794a3fffffff -{ - 14.272125836 -83.587261666 - 14.207020903 -83.641922987 - 14.132414204 -83.605419288 - 14.122955980 -83.514225184 - 14.188117045 -83.459577814 - 14.262680171 -83.496110477 -} -85f28293fffffff -{ - -87.645042107 -149.714118468 - -87.728375410 -148.806016988 - -87.732588966 -146.517224138 - -87.652909701 -145.294463961 - -87.571936796 -146.295231743 - -87.568260039 -148.432855470 -} -853b10b3fffffff -{ - 36.981987492 -54.228825648 - 36.897229565 -54.261639582 - 36.829629265 -54.193466840 - 36.846693735 -54.092399715 - 36.931477854 -54.059349377 - 36.999171416 -54.127602418 -} -85e01507fffffff -{ - -58.106651896 63.662930948 - -58.015836874 63.667160839 - -57.971907593 63.527145075 - -58.018560297 63.382639803 - -58.109286871 63.377628250 - -58.153449669 63.517902900 -} -850309bbfffffff -{ - 83.788514148 -78.577000006 - 83.824792187 -79.316733304 - 83.772833415 -80.015321928 - 83.685677165 -79.966330889 - 83.650391754 -79.239099895 - 83.701284250 -78.548423472 -} -85f38ba7fffffff -{ - -82.323244633 -161.324641150 - -82.407758839 -161.189873832 - -82.429638438 -160.546407961 - -82.366395178 -160.049226033 - -82.282238778 -160.196300552 - -82.260960119 -160.828367732 -} -8513153bfffffff -{ - 65.836722607 -127.116556052 - 65.748625248 -127.150603605 - 65.689361244 -126.994626441 - 65.717962188 -126.804200234 - 65.806060353 -126.768900788 - 65.865557531 -126.925277856 -} -854d2eb3fffffff -{ - 27.304782588 -60.633010474 - 27.227446381 -60.653302148 - 27.164252425 -60.593571074 - 27.178299586 -60.513457916 - 27.255669249 -60.492991460 - 27.318958401 -60.552812937 -} -8505304ffffffff -{ - 76.176076452 101.979211609 - 76.129363246 102.324589367 - 76.177877608 102.662637406 - 76.273621302 102.657369601 - 76.320783347 102.309332994 - 76.271749522 101.969227183 -} -857d6a77fffffff -{ - -4.412910959 -29.839327783 - -4.330552185 -29.792451488 - -4.247882976 -29.838973753 - -4.247533662 -29.932410149 - -4.329911034 -29.979346233 - -4.412619128 -29.932786242 -} -85bc834ffffffff -{ - -26.094637198 36.944951402 - -26.002681310 36.947018120 - -25.957458024 36.858087783 - -26.004200448 36.767017679 - -26.096188260 36.764873158 - -26.141401804 36.853876563 -} -8504646ffffffff -{ - 79.097642763 176.255863600 - 79.003007866 176.160512715 - 78.939316104 176.537605033 - 78.969561050 177.010820598 - 79.063889915 177.113014618 - 79.128284135 176.735195019 -} -85a0aac3fffffff -{ - -14.503365024 -132.990715337 - -14.421159034 -132.979275759 - -14.362787908 -133.045910532 - -14.386548301 -133.124082640 - -14.468796361 -133.135653720 - -14.527242052 -133.068921158 -} -85d54a3bfffffff -{ - -49.870362935 -173.080246012 - -49.800453429 -173.019061319 - -49.726607319 -173.090586119 - -49.722644929 -173.223076461 - -49.792489541 -173.284318524 - -49.866361416 -173.213013477 -} -8500c223fffffff -{ - 84.719185823 88.080841102 - 84.695599316 89.051401913 - 84.762425032 89.777098941 - 84.854231002 89.532025790 - 84.878484178 88.533478781 - 84.810249575 87.808473455 -} -850d1b4bfffffff -{ - 68.151130316 -162.038138140 - 68.072273804 -162.169406408 - 67.993697319 -162.057004594 - 67.993704055 -161.814424266 - 68.072204353 -161.682456411 - 68.151053779 -161.793759691 -} -85f29a73fffffff -{ - -87.723663959 -39.893047278 - -87.658520263 -38.221715154 - -87.568980282 -38.828128965 - -87.543030300 -40.972216299 - -87.604934539 -42.634692493 - -87.695944102 -42.166476506 -} -85e90a27fffffff -{ - -65.026742294 -101.457020880 - -64.962109864 -101.307059037 - -64.879140230 -101.367586634 - -64.860684961 -101.577254952 - -64.925124725 -101.727339651 - -65.008212056 -101.667636400 -} -85244a2bfffffff -{ - 43.367970263 113.941367944 - 43.284761970 113.930253404 - 43.242051148 114.012867744 - 43.282397078 114.106591471 - 43.365486016 114.117970730 - 43.408348436 114.035361980 -} -8502c15bfffffff -{ - 71.077439431 -105.745910107 - 70.995542155 -105.887199797 - 70.916149643 -105.748285938 - 70.918340793 -105.468971491 - 70.999979959 -105.326391248 - 71.079686314 -105.464404188 -} -85eead9bfffffff -{ - -72.844249043 -22.692329534 - -72.759577572 -22.532029509 - -72.676005772 -22.699241133 - -72.676685500 -23.025292080 - -72.760960889 -23.187251821 - -72.844952766 -23.021521299 -} -85c0d617fffffff -{ - -43.275118309 -14.181172660 - -43.363143340 -14.230570193 - -43.438501904 -14.149011436 - -43.425750573 -14.017962372 - -43.337653684 -13.968768232 - -43.262379914 -14.050419111 -} -8556284ffffffff -{ - 15.306788941 -32.187003359 - 15.234881454 -32.237020615 - 15.157340797 -32.192569643 - 15.151602957 -32.098170235 - 15.223415863 -32.048067167 - 15.301061205 -32.092449065 -} -85164ba7fffffff -{ - 52.625833361 -176.898494862 - 52.710896210 -176.873351479 - 52.770759339 -176.986956920 - 52.745468260 -177.125740175 - 52.660338716 -177.150550808 - 52.600566777 -177.036911655 -} -85e4f647fffffff -{ - -54.866538139 97.011961380 - -54.782275235 96.931217102 - -54.780476633 96.763561866 - -54.862915861 96.675910437 - -54.947363749 96.756233895 - -54.949187496 96.924631961 -} -85896e2bfffffff -{ - -13.399912565 -161.856949668 - -13.315058896 -161.820953207 - -13.244746688 -161.880222625 - -13.259197197 -161.975438345 - -13.343970056 -162.011517369 - -13.414373245 -161.952298326 -} -85b88d5bfffffff -{ - -23.188554032 131.131155651 - -23.101374480 131.130742477 - -23.064016303 131.050709274 - -23.113709570 130.971067932 - -23.200819728 130.971318290 - -23.238306103 131.051372685 -} -85ef2c13fffffff -{ - -82.600964705 -75.450720574 - -82.586038603 -74.728564446 - -82.496524112 -74.481667278 - -82.422623267 -74.945135836 - -82.437263040 -75.652207143 - -82.526085188 -75.910687750 -} -8500cd27fffffff -{ - 88.997646604 93.120755664 - 88.965192728 97.943480168 - 89.018738899 102.354468119 - 89.111572550 102.242978161 - 89.149824657 96.752290344 - 89.088816796 92.080237473 + 28.856390307 68.054101252 + 28.778610950 68.106460445 + 28.776758863 68.212438818 + 28.852692527 68.266303052 + 28.930601684 68.214061748 + 28.932447366 68.107837854 } -85c0061bfffffff +85f2916ffffffff { - -34.170558314 -12.362122937 - -34.261577485 -12.404165465 - -34.337180347 -12.329803433 - -34.321667280 -12.213342426 - -34.230576818 -12.171473404 - -34.155070641 -12.245891440 + -89.305016120 -90.532312149 + -89.311112682 -82.888992682 + -89.229209733 -79.647023052 + -89.149824657 -83.247709656 + -89.144364250 -89.452325664 + -89.217779659 -93.297808356 +} +8597ac17fffffff +{ + -16.721162536 35.582620724 + -16.624651427 35.585169635 + -16.574776952 35.499623977 + -16.621405326 35.411468206 + -16.717945934 35.408847180 + -16.767828743 35.494454049 +} +859f1413fffffff +{ + -19.887044323 175.322957061 + -19.806843951 175.283128065 + -19.793449115 175.192732718 + -19.860298826 175.142005530 + -19.940623464 175.181788967 + -19.953974056 175.272345391 +} +854ce5dbfffffff +{ + 20.714230116 -66.008721049 + 20.782535772 -65.965829888 + 20.840612424 -66.001334531 + 20.830401025 -66.079653605 + 20.762168127 -66.122476551 + 20.704073928 -66.087048667 +} +85e4a3d7fffffff +{ + -53.941143069 104.700037978 + -53.862663673 104.604795923 + -53.871407069 104.441338659 + -53.958675648 104.372427154 + -54.037370128 104.467439100 + -54.028580790 104.631594784 +} +85eb5e13fffffff +{ + -67.768107680 -164.825774026 + -67.834872727 -164.796578935 + -67.852571471 -164.601255444 + -67.803266921 -164.436130163 + -67.736576945 -164.466596977 + -67.719115511 -164.660919970 +} +8554655bfffffff +{ + 14.960735362 -5.825258763 + 14.898907367 -5.888762355 + 14.821625080 -5.869489332 + 14.806165540 -5.786861216 + 14.867885820 -5.723421895 + 14.945173217 -5.742546367 +} +85f15667fffffff +{ + -83.511622831 70.982164218 + -83.469130591 70.264804326 + -83.516983385 69.609646016 + -83.608392840 69.664378210 + -83.651720845 70.394109752 + -83.602790286 71.056667324 +} +85b192c3fffffff +{ + -32.918769714 -106.521287487 + -32.856697122 -106.438070238 + -32.766474281 -106.462606421 + -32.738256063 -106.570111524 + -32.800180420 -106.653310756 + -32.890471056 -106.629023254 +} +85c2d267fffffff +{ + -32.663553836 -53.190641507 + -32.604387875 -53.138517840 + -32.534920898 -53.184709507 + -32.524654801 -53.282963831 + -32.583834177 -53.335046271 + -32.653266236 -53.288915743 +} +85251e2bfffffff +{ + 48.006229296 95.068560887 + 47.913976779 95.091163932 + 47.881666236 95.216886783 + 47.941462185 95.320259955 + 48.033690523 95.298093039 + 48.066147349 95.172116630 +} +85b8c293fffffff +{ + -23.326210345 126.988447662 + -23.241177093 126.992156972 + -23.202664447 126.917804010 + -23.249056715 126.839744807 + -23.334004474 126.835887892 + -23.372645514 126.910237625 +} +856c9bc7fffffff +{ + 1.057894818 -104.131700081 + 0.986819560 -104.186183295 + 0.906112654 -104.157676241 + 0.896454665 -104.074604726 + 0.967593240 -104.020052697 + 1.048326430 -104.048640959 +} +8528a093fffffff +{ + 41.102045207 -117.442520053 + 41.181183429 -117.382706302 + 41.255655292 -117.444483381 + 41.250939280 -117.566113304 + 41.171784074 -117.625777790 + 41.097361845 -117.563962020 +} +85aa5a6ffffffff +{ + -26.984003089 81.915023743 + -27.076284043 81.943978853 + -27.099248682 82.047258759 + -27.029944186 82.121430796 + -26.937732246 82.092378260 + -26.914755743 81.989250867 +} +8510b31bfffffff +{ + 51.003645491 46.078088602 + 50.939771305 46.179453259 + 50.966157585 46.315098694 + 51.056555759 46.349718473 + 51.120564360 46.248215637 + 51.094040106 46.112230715 +} +852e8337fffffff +{ + 47.579784101 145.101998344 + 47.665266956 145.074643678 + 47.686574243 144.954286121 + 47.622422001 144.861615264 + 47.537039682 144.889190624 + 47.515709005 145.009216784 } -8585410ffffffff +85d8b117fffffff { - 1.728316286 67.699508023 - 1.651633210 67.714391568 - 1.626967300 67.796207669 - 1.679048356 67.863075890 - 1.755709999 67.848098029 - 1.780312124 67.766346202 + -44.367063537 142.761029524 + -44.273904164 142.744507196 + -44.235322196 142.624056021 + -44.289809877 142.519968064 + -44.382948996 142.536182085 + -44.421620871 142.656792464 } -85701163fffffff -{ - 2.979247050 -171.880382449 - 2.895290495 -171.900495457 - 2.830023547 -171.839771254 - 2.848659025 -171.758855027 - 2.932657858 -171.738656913 - 2.997978991 -171.799460120 -} -85f27353fffffff -{ - -75.853352938 -124.366495421 - -75.906423171 -124.091341572 - -75.870874003 -123.751149246 - -75.782548868 -123.689253122 - -75.730009099 -123.963735527 - -75.765266324 -124.300800786 -} -85cf928ffffffff -{ - -46.739457137 -64.880185080 - -46.659830231 -64.853128067 - -46.596916527 -64.930357453 - -46.613504486 -65.034760174 - -46.693156396 -65.062160889 - -46.756195533 -64.984815381 -} -8500e14ffffffff -{ - 84.852945102 47.820246396 - 84.891538884 48.725143177 - 84.983917141 48.798489194 - 85.037817115 47.934462672 - 84.998034829 47.009845613 - 84.905563411 46.969099583 -} -856a1377fffffff -{ - 4.509604649 24.527290302 - 4.597613900 24.533736711 - 4.645018057 24.457051226 - 4.604479819 24.373915160 - 4.516495867 24.367412480 - 4.469024769 24.444102096 -} -85ef6043fffffff -{ - -77.032804937 -77.543202236 - -77.019846586 -77.126325034 - -76.930929815 -76.967640810 - -76.855423167 -77.222215402 - -76.868277937 -77.633961693 - -76.956741786 -77.796222547 -} -85f2aa2ffffffff -{ - -84.910325333 -124.361657312 - -84.968987306 -123.577034003 - -84.934014490 -122.614459193 - -84.841267372 -122.461209995 - -84.783999122 -123.239817989 - -84.818103411 -124.178013562 -} -852a6237fffffff -{ - 35.221494610 -64.234502636 - 35.186838206 -64.332020900 - 35.108515951 -64.344626824 - 35.064905991 -64.260000186 - 35.099449844 -64.162701785 - 35.177715970 -64.149810421 -} -85df9e93fffffff -{ - -60.333768886 -39.471991158 - -60.269429265 -39.336441406 - -60.181375550 -39.384244348 - -60.157520100 -39.566675177 - -60.221559126 -39.702198158 - -60.309753583 -39.655319773 -} -85f355c3fffffff -{ - -73.736548049 -147.262968076 - -73.806137619 -147.130098166 - -73.803767951 -146.825627655 - -73.731706317 -146.656886314 - -73.662456362 -146.791451006 - -73.664927896 -147.093079736 -} -859e8c9bfffffff -{ - -10.713207217 166.258938949 - -10.636409497 166.228009128 - -10.617311163 166.141502594 - -10.674999839 166.085787155 - -10.751890191 166.116636961 - -10.770999255 166.203282424 -} -85054ea3fffffff -{ - 82.114089060 173.124753786 - 82.019269550 173.030269519 - 81.959291263 173.570386115 - 81.993196759 174.207897641 - 82.087705022 174.315816243 - 82.148627935 173.772879994 -} -85dcd9c7fffffff -{ - -44.495389992 -18.179161940 - -44.580600124 -18.233893505 - -44.658014401 -18.155900773 - -44.650143225 -18.023033907 - -44.564848806 -17.968473316 - -44.487509816 -18.046607905 -} -85239c83fffffff -{ - 44.291835667 -157.263873918 - 44.370372386 -157.222662628 - 44.440736307 -157.288466391 - 44.432525630 -157.395679757 - 44.353870503 -157.436808888 - 44.283544511 -157.370807305 -} -850a68a3fffffff -{ - 74.783826780 92.193245998 - 74.751315787 92.527196156 - 74.811399109 92.794834462 - 74.904503413 92.728946395 - 74.937284703 92.391890761 - 74.876689250 92.123844848 -} -85169357fffffff -{ - 45.129274642 155.602324658 - 45.221333539 155.588453029 - 45.256096463 155.468463343 - 45.198771725 155.362614902 - 45.106779028 155.376769053 - 45.072044715 155.496489525 -} -851b92bbfffffff -{ - 50.327930516 -61.237556413 - 50.293072786 -61.375292271 - 50.200947168 -61.399378121 - 50.143780634 -61.286260149 - 50.178524978 -61.148988253 - 50.270548900 -61.124371285 -} -85e76897fffffff +853ef1bbfffffff +{ + 22.290073963 25.428974750 + 22.193859088 25.423022281 + 22.141320311 25.510393968 + 22.184912262 25.603770015 + 22.281106562 25.609876470 + 22.333729609 25.522452958 +} +85c546affffffff +{ + -35.385139523 -28.647642285 + -35.466576993 -28.704323873 + -35.548459008 -28.649006089 + -35.548858610 -28.536819630 + -35.467307238 -28.480181220 + -35.385470235 -28.535685671 +} +85c36417fffffff +{ + -38.109490168 -68.508455910 + -38.035383425 -68.479266361 + -37.968651028 -68.543411028 + -37.975885164 -68.636802146 + -38.049980658 -68.666240966 + -38.116853452 -68.602039609 +} +851b8c43fffffff +{ + 51.752536963 -53.269305007 + 51.727829120 -53.413715809 + 51.638532221 -53.455971076 + 51.574101105 -53.354284735 + 51.598757555 -53.210438863 + 51.687896323 -53.167715867 +} +853b4233fffffff +{ + 33.856540129 -43.688691160 + 33.771684387 -43.735439132 + 33.693860609 -43.672931430 + 33.700781169 -43.563680297 + 33.785607511 -43.516733297 + 33.863542788 -43.579236114 +} +85a38003fffffff +{ + -20.566932365 41.657300461 + -20.473106172 41.657346561 + -20.428208616 41.571977314 + -20.477152598 41.486473153 + -20.571034254 41.486356416 + -20.615916521 41.571814521 +} +85026103fffffff +{ + 75.592588127 -70.372195090 + 75.550345655 -70.702881112 + 75.459531521 -70.711102228 + 75.410995083 -70.392337627 + 75.452869262 -70.063778535 + 75.543645738 -70.051860443 +} +85590b47fffffff +{ + 18.559158919 5.064220036 + 18.468754070 5.074916653 + 18.428414246 5.160658638 + 18.478457070 5.235843247 + 18.568945316 5.225263285 + 18.609307391 5.139381904 +} +8525301bfffffff +{ + 51.622498037 89.684417567 + 51.530214727 89.720009626 + 51.502332142 89.862904091 + 51.566606526 89.970579156 + 51.658903746 89.935484303 + 51.686912960 89.792216561 +} +85e51667fffffff +{ + -59.023420176 120.088911021 + -58.959693355 119.949524243 + -58.990061112 119.774405215 + -59.084334621 119.737987812 + -59.148295353 119.877568942 + -59.117748076 120.053374622 +} +85c380b7fffffff +{ + -43.820642869 -54.032934586 + -43.781993636 -53.934858499 + -43.712180005 -53.935800131 + -43.681020503 -54.034438412 + -43.719507566 -54.132321931 + -43.789315957 -54.131759727 +} +85252e93fffffff +{ + 53.865798822 95.440050557 + 53.773904063 95.464764087 + 53.738964958 95.606133629 + 53.795774086 95.723106272 + 53.887644150 95.698948990 + 53.922730097 95.557262572 +} +851b847bfffffff +{ + 53.156420616 -56.986425744 + 53.127090916 -57.135769259 + 53.035229923 -57.171357679 + 52.972835823 -57.058163232 + 53.002082240 -56.909400022 + 53.093805745 -56.873252394 +} +858e0c13fffffff +{ + -11.043469183 -81.936905482 + -11.122002679 -81.995598372 + -11.211115553 -81.955687741 + -11.221672229 -81.857056710 + -11.143120613 -81.798388570 + -11.054030463 -81.838326556 +} +8560900bfffffff +{ + 21.058900489 78.048446139 + 21.142475361 78.019647612 + 21.155911560 77.928688850 + 21.085841135 77.866607668 + 21.002320743 77.895397340 + 20.988816269 77.986277155 +} +85ea83a7fffffff +{ + -63.776630688 176.958152413 + -63.716984591 176.877974802 + -63.725058069 176.702076813 + -63.792805052 176.605744003 + -63.852550171 176.685778776 + -63.844449199 176.862290955 +} +85f2b163fffffff +{ + -86.919743227 -171.965957761 + -87.009812874 -171.940544520 + -87.049154072 -170.386393176 + -86.996329227 -168.911808769 + -86.906416414 -169.026369278 + -86.869109453 -170.526908361 +} +85a6a6abfffffff +{ + -20.765812226 116.672100910 + -20.840713841 116.687792157 + -20.876782157 116.765075177 + -20.837947064 116.826729182 + -20.762981943 116.811025563 + -20.726915403 116.733680270 +} +8578b157fffffff +{ + -3.562759369 -142.096497509 + -3.646548560 -142.129015528 + -3.712292049 -142.071425945 + -3.694303894 -141.981366931 + -3.610582319 -141.948829897 + -3.544781273 -142.006370768 +} +8564ad1bfffffff +{ + 14.166565808 96.513671644 + 14.260290639 96.488137204 + 14.285785824 96.391388341 + 14.217547515 96.320218353 + 14.123828848 96.345798901 + 14.098342271 96.442503445 +} +852a41affffffff +{ + 32.936312384 -65.123703781 + 32.901942871 -65.216389144 + 32.826497209 -65.227076888 + 32.785467953 -65.145342359 + 32.819725035 -65.052851771 + 32.895123576 -65.041901143 +} +857ab157fffffff +{ + 5.056175860 50.608199118 + 5.137576065 50.605093937 + 5.184365471 50.533859676 + 5.149777032 50.465641526 + 5.068309373 50.468700915 + 5.021497573 50.540024300 +} +85e50667fffffff +{ + -62.114357797 120.072619870 + -62.051054962 119.919143957 + -62.082141100 119.726225507 + -62.176718496 119.685950791 + -62.240271020 119.839661246 + -62.208995762 120.033413883 +} +85eb8293fffffff +{ + -58.460021971 -171.170796271 + -58.399417027 -171.101991365 + -58.334413244 -171.187239827 + -58.329961345 -171.341025569 + -58.390498351 -171.409932801 + -58.455555163 -171.324952916 +} +856b907bfffffff +{ + 5.593998064 16.152484848 + 5.679063370 16.161633179 + 5.723644198 16.090326443 + 5.683237133 16.009902268 + 5.598226646 16.000709324 + 5.553568351 16.071985103 +} +85d84e0ffffffff +{ + -47.978125936 121.304458069 + -47.917086773 121.198837773 + -47.944745214 121.069188707 + -48.033602306 121.044793580 + -48.094837843 121.150544306 + -48.067019533 121.280560270 +} +85f2d9cbfffffff +{ + -79.042869127 -82.936372107 + -79.039118661 -82.443239177 + -78.954214198 -82.215912263 + -78.873657400 -82.477769488 + -78.877411237 -82.963628105 + -78.961718309 -83.194831969 +} +859608d3fffffff +{ + -12.419225522 26.640950587 + -12.322043041 26.647047178 + -12.268339170 26.564034426 + -12.311780253 26.474909491 + -12.408946450 26.468746165 + -12.462687927 26.551774468 +} +85686a23fffffff +{ + 10.610125785 126.524132089 + 10.517460722 126.540962837 + 10.487279589 126.630154102 + 10.549807074 126.702566312 + 10.642519653 126.685737523 + 10.672657276 126.596494496 +} +85ee211bfffffff +{ + -76.867567376 -44.784222988 + -76.805775584 -44.454844426 + -76.709838208 -44.525891888 + -76.675510756 -44.921312728 + -76.736717428 -45.249581824 + -76.832833255 -45.183559618 +} +850063a7fffffff +{ + 81.654448943 -11.909192071 + 81.737224466 -11.877043258 + 81.785022170 -12.401434318 + 81.749216835 -12.953463402 + 81.666380053 -12.974391640 + 81.619401869 -12.454534212 +} +85c74503fffffff +{ + -38.202710804 -146.721521306 + -38.111590776 -146.691133634 + -38.047384712 -146.775680202 + -38.074240491 -146.890675417 + -38.165366352 -146.921273209 + -38.229630712 -146.836665889 +} +85124077fffffff +{ + 55.362214560 -106.597186843 + 55.283261078 -106.675636711 + 55.201889922 -106.594765473 + 55.199250206 -106.435713683 + 55.278045983 -106.356827090 + 55.359639333 -106.437426847 +} +85cc0673fffffff +{ + -42.808412507 83.780895073 + -42.889975842 83.815684141 + -42.897426051 83.875019788 + -42.904647469 83.934846531 + -42.838164630 84.018011015 + -42.756653642 83.983103819 + -42.741768310 83.864649724 +} +85f256b3fffffff +{ + -77.010993184 -121.194931918 + -77.061378388 -120.878872869 + -77.021294035 -120.514380472 + -76.931198379 -120.469347650 + -76.881379469 -120.784070604 + -76.921092999 -121.145176665 +} +85a096abfffffff +{ + -12.888178904 -128.840539467 + -12.809808218 -128.833036085 + -12.754479725 -128.896893192 + -12.777454835 -128.968356823 + -12.855876945 -128.975978450 + -12.911272599 -128.912018139 +} +852af533fffffff +{ + 36.280333744 -74.109744511 + 36.236872512 -74.203422216 + 36.155972038 -74.199987201 + 36.118526201 -74.103192678 + 36.161831372 -74.009661838 + 36.242738153 -74.012778611 +} +85371b93fffffff +{ + 37.812255293 -149.624448552 + 37.736347835 -149.661184987 + 37.674751330 -149.587858263 + 37.689060720 -149.477816329 + 37.764963857 -149.441017186 + 37.826561977 -149.514322472 +} +8500e9c3fffffff +{ + 87.311756100 30.409551069 + 87.373528795 31.817754413 + 87.464199560 31.343715845 + 87.491684625 29.349377718 + 87.427116873 27.939219274 + 87.337919854 28.521853931 +} +851513cbfffffff +{ + 54.357317712 114.963645122 + 54.299403954 115.077284416 + 54.321158212 115.221134745 + 54.400994740 115.251880361 + 54.459155848 115.138138050 + 54.437232576 114.993752035 +} +85635d3bfffffff +{ + 10.720069338 63.324658538 + 10.797159722 63.299086284 + 10.810523642 63.229104180 + 10.746895997 63.184757641 + 10.669899064 63.210293627 + 10.656436376 63.280212442 +} +85776067fffffff +{ + 10.256628707 160.645780485 + 10.167754593 160.656642639 + 10.130598101 160.734190708 + 10.182255952 160.800827675 + 10.271039493 160.790007342 + 10.308255739 160.712508223 +} +85e6035bfffffff +{ + -63.305542684 20.465837717 + -63.220326718 20.420622435 + -63.189686867 20.232739393 + -63.244126205 20.089067942 + -63.329518204 20.133237682 + -63.360295428 20.322127592 +} +85b00b1bfffffff +{ + -22.995587334 -117.287895364 + -22.945973024 -117.208985994 + -22.865024381 -117.217001431 + -22.833684278 -117.303722974 + -22.883175298 -117.382541978 + -22.964129521 -117.374729847 +} +857c5ed7fffffff +{ + 4.980327735 -25.875779639 + 5.057111572 -25.831562364 + 5.137874183 -25.876338307 + 5.141917241 -25.965381256 + 5.065130364 -26.009668191 + 4.984303435 -25.964842601 +} +85232423fffffff +{ + 34.458407636 -165.431724437 + 34.545952972 -165.401646150 + 34.611283630 -165.472469462 + 34.588984600 -165.573481239 + 34.501316344 -165.603437637 + 34.436070057 -165.532504534 +} +85d5750ffffffff +{ + -54.867339121 -169.423679372 + -54.800825273 -169.360389944 + -54.733023566 -169.443073847 + -54.731688261 -169.588829635 + -54.798137967 -169.652231086 + -54.865987114 -169.569765539 +} +85f174d7fffffff { - -74.250411543 7.332086679 - -74.155015285 7.331301270 - -74.106159918 7.032896773 - -74.152295223 6.733384487 - -74.247735865 6.730561866 - -74.296999398 7.030860647 -} -853e152bfffffff -{ - 26.952903179 21.276858743 - 26.855550502 21.274377081 - 26.804875887 21.367587920 - 26.851487124 21.463365768 - 26.948843399 21.466017908 - 26.999584968 21.372721733 -} -85e026abfffffff -{ - -62.087876717 63.291148643 - -61.995839658 63.297114508 - -61.949124668 63.138901751 - -61.994196832 62.974401194 - -62.086137430 62.967429826 - -62.133102927 63.125963374 -} -85e469dbfffffff -{ - -67.111278745 82.148124279 - -67.019173382 82.083010529 - -66.993932243 81.849754732 - -67.060613667 81.680304503 - -67.152827879 81.743982963 - -67.178252659 81.978551557 -} -8500e64ffffffff -{ - 82.747861320 55.676190054 - 82.774256027 56.355393416 - 82.864361183 56.506062934 - 82.928412728 55.962562922 - 82.901353119 55.270309892 - 82.810916414 55.134743210 -} -85132043fffffff -{ - 69.310098329 -124.071534076 - 69.221350967 -124.124197080 - 69.159785677 -123.948865664 - 69.186691079 -123.720499151 - 69.275395233 -123.666170630 - 69.337238173 -123.841870355 + -87.813934038 97.025372487 + -87.811035666 94.626369171 + -87.887294990 93.362237958 + -87.969418260 94.579954434 + -87.972191257 97.167631550 + -87.892967210 98.339437207 +} +85924837fffffff +{ + -18.695728657 -97.240213549 + -18.765872847 -97.300846071 + -18.853580296 -97.266205005 + -18.871185513 -97.170850012 + -18.801027758 -97.110164878 + -18.713278369 -97.144887249 +} +85cd7597fffffff +{ + -52.569690973 84.312936519 + -52.480987182 84.266344158 + -52.463032313 84.115997885 + -52.533652341 84.011686867 + -52.622447377 84.057721773 + -52.640531499 84.208626508 +} +85eeb04ffffffff +{ + -72.020584258 -1.205430506 + -71.926159772 -1.161064468 + -71.865758065 -1.400753739 + -71.899356780 -1.685529054 + -71.993687231 -1.732605187 + -72.054514907 -1.492202642 +} +855a8107fffffff +{ + 20.301730836 175.989112471 + 20.392392444 175.998941191 + 20.443548913 175.917862956 + 20.403928181 175.826989136 + 20.313222528 175.817325250 + 20.262181520 175.898370226 +} +851b41cffffffff +{ + 54.191339613 -33.013133476 + 54.116252111 -33.094091554 + 54.042081833 -33.020055314 + 54.042910758 -32.865234553 + 54.117925077 -32.784033482 + 54.192183667 -32.857895044 +} +85f10577fffffff +{ + -84.491355223 119.013744808 + -84.522186891 118.140923568 + -84.607651798 118.018676971 + -84.662594928 118.795564081 + -84.630727207 119.687628890 + -84.544970617 119.783366979 +} +8552d057fffffff +{ + 10.709885644 43.146906592 + 10.626880248 43.129293924 + 10.577924099 43.192567164 + 10.611869675 43.273404901 + 10.694784219 43.291096975 + 10.743844058 43.227872059 +} +8511524ffffffff +{ + 62.848987748 41.275209173 + 62.798082735 41.414930880 + 62.833801335 41.587249978 + 62.920576986 41.620335644 + 62.971615806 41.480238586 + 62.935744712 41.307430790 +} +8500c1abfffffff +{ + 86.436509026 74.728803200 + 86.434398963 76.201680160 + 86.514160910 77.010867596 + 86.597857298 76.316386138 + 86.600027905 74.772917249 + 86.518438958 73.996693630 +} +85946b0ffffffff +{ + -9.268493477 134.951586405 + -9.359169471 134.967458955 + -9.392308696 135.057062408 + -9.334789358 135.130819027 + -9.244088472 135.114962560 + -9.210931749 135.025333325 +} +855f069bfffffff +{ + 2.704890532 -54.829758642 + 2.785485550 -54.780800103 + 2.866838162 -54.823831766 + 2.867588113 -54.915762179 + 2.787045023 -54.964677708 + 2.705700082 -54.921705935 +} +852ed86bfffffff +{ + 47.420425645 134.680148223 + 47.353069964 134.742424923 + 47.350171754 134.869356203 + 47.414629708 134.934482789 + 47.482171450 134.872448150 + 47.485069173 134.745043671 +} +85d224cffffffff +{ + -49.923348704 -111.674293175 + -49.862726412 -111.556888239 + -49.766868926 -111.580113208 + -49.731598627 -111.720267216 + -49.792076606 -111.837547696 + -49.887968892 -111.814799158 +} +85b810a7fffffff +{ + -28.349275798 131.925128155 + -28.258631707 131.923825363 + -28.217898017 131.837687944 + -28.267682629 131.752823759 + -28.358252873 131.753939869 + -28.399112443 131.840106711 +} +85b462cbfffffff +{ + -27.747232127 -164.648776729 + -27.658288235 -164.605859294 + -27.580799314 -164.670691244 + -27.592190378 -164.778356228 + -27.681055353 -164.821363369 + -27.758608196 -164.756616143 +} +856f1aabfffffff +{ + 0.792796467 -114.450750205 + 0.860802923 -114.405607502 + 0.933443683 -114.448812026 + 0.937992431 -114.537192601 + 0.869914193 -114.582269246 + 0.797358969 -114.539031530 +} +85ecde9bfffffff +{ + -68.421493946 122.647285084 + -68.363394172 122.448163801 + -68.399008426 122.209408590 + -68.492960198 122.168563107 + -68.551351174 122.368209876 + -68.515498051 122.608179598 +} +85ab492ffffffff +{ + -16.874527581 79.341919771 + -16.966814919 79.367138955 + -16.993369290 79.463125373 + -16.927623869 79.533767259 + -16.835403818 79.508454883 + -16.808861849 79.412593628 +} +85e75333fffffff +{ + -68.543605711 17.137499858 + -68.453028915 17.094521216 + -68.417776967 16.861289308 + -68.472895427 16.669559749 + -68.563643633 16.710773063 + -68.599103086 16.945486345 +} +853b92d7fffffff +{ + 31.402991024 -61.434901053 + 31.323254040 -61.455182938 + 31.261252932 -61.392335091 + 31.278903451 -61.309101797 + 31.358687104 -61.288627617 + 31.420773661 -61.351579030 +} +851f2207fffffff +{ + 55.970621360 10.115005759 + 55.895685385 10.125505076 + 55.869320608 10.259212231 + 55.917857300 10.382714314 + 55.992826681 10.372524798 + 56.019226134 10.238522974 } -8500532bfffffff -{ - 85.919735901 19.363119629 - 85.991946104 20.089114837 - 86.075504620 19.522794333 - 86.085355965 18.196737818 - 86.011471502 17.489538132 - 85.929416981 18.088269284 -} -856a310bfffffff -{ - 8.366976150 24.389984304 - 8.280845034 24.385505736 - 8.234764704 24.463307977 - 8.274723008 24.545634766 - 8.360840067 24.550234688 - 8.407013004 24.472386503 -} -85389587fffffff -{ - 25.537009910 -4.902474537 - 25.472799777 -4.974180835 - 25.386037404 -4.953545922 - 25.363504414 -4.861393383 - 25.427616168 -4.789774088 - 25.514359160 -4.810220268 -} -8579b693fffffff -{ - 5.453971493 -145.212993103 - 5.364177800 -145.246068574 - 5.291981953 -145.184539183 - 5.309533965 -145.089972228 - 5.399274144 -145.056865072 - 5.471515849 -145.118356414 -} -858f736bfffffff -{ - -5.568007198 -78.547176147 - -5.646000588 -78.603684609 - -5.734243350 -78.563810470 - -5.744449364 -78.467414549 - -5.666430851 -78.410946165 - -5.578231457 -78.450833479 -} -85602613fffffff -{ - 8.415666223 77.498335965 - 8.503770169 77.470724903 - 8.523696088 77.383969225 - 8.455581779 77.324897506 - 8.367559564 77.352498994 - 8.347569942 77.439181865 -} -859f6507fffffff -{ - -27.964537493 166.717821704 - -27.875586367 166.679994339 - -27.858531366 166.575405546 - -27.930439422 166.508440492 - -28.019495581 166.546153381 - -28.036538662 166.650946158 -} -85968257fffffff -{ - -5.249763284 34.459963885 - -5.154717373 34.462840209 - -5.103648203 34.381140996 - -5.147589555 34.296514499 - -5.242656655 34.293572364 - -5.293761295 34.375322540 -} -850a620bfffffff -{ - 71.057791604 89.704675289 - 71.028389045 89.974904426 - 71.089163316 90.179803127 - 71.179759658 90.114524636 - 71.209344603 89.842196497 - 71.148149623 89.637255520 -} -85016b13fffffff -{ - 76.555049647 -6.365535322 - 76.630650565 -6.311453350 - 76.682237916 -6.603089486 - 76.657683189 -6.947967787 - 76.581942134 -6.998185820 - 76.530893251 -6.707402996 -} -85d498b3fffffff +85d954dbfffffff +{ + -55.941262107 135.076393158 + -55.895637855 134.934306815 + -55.941953531 134.799010065 + -56.034120865 134.805573973 + -56.079888386 134.948152225 + -56.033344845 135.083673957 +} +85214ba7fffffff +{ + 54.264398296 79.530620107 + 54.175264774 79.590051156 + 54.159472213 79.751475856 + 54.232741817 79.854012144 + 54.321959318 79.795052705 + 54.337823446 79.633083919 +} +85e8e333fffffff +{ + -60.273809238 -80.172078772 + -60.194147067 -80.095408395 + -60.171754670 -80.129329834 + -60.123540733 -80.190489129 + -60.132372232 -80.362079978 + -60.213588052 -80.442582616 + -60.286048129 -80.350922273 +} +85f1b317fffffff +{ + -75.123012181 114.794572820 + -75.059238142 114.541221752 + -75.083366047 114.188595359 + -75.171490659 114.086304396 + -75.235699818 114.339724499 + -75.211347554 114.695383483 +} +853f2993fffffff +{ + 37.944222520 22.435806893 + 37.849587159 22.431878484 + 37.799686415 22.535172424 + 37.844366317 22.642490879 + 37.938999553 22.646630512 + 37.988955160 22.543240506 +} +85e46887fffffff +{ + -67.255256324 83.565776442 + -67.163631477 83.494874976 + -67.140395713 83.258125135 + -67.208613925 83.090906481 + -67.300363736 83.160387950 + -67.323771175 83.398513211 +} +85a2d633fffffff +{ + -28.704466260 50.813080639 + -28.796383151 50.817420943 + -28.840111847 50.905593594 + -28.791835703 50.989421820 + -28.699840767 50.984935665 + -28.656199969 50.896767236 +} +85032623fffffff { - -41.442408582 -152.914867564 - -41.354151147 -152.876491575 - -41.286747014 -152.961166199 - -41.307540517 -153.084220884 - -41.395775866 -153.122796957 - -41.463239898 -153.038118640 -} -85f393d3fffffff -{ - -82.401153104 153.048086884 - -82.471037374 152.669974388 - -82.545080986 152.976412515 - -82.548429137 153.669195194 - -82.477615711 154.041630439 - -82.404384862 153.727145959 -} -8521accffffffff -{ - 45.159959633 60.805778394 - 45.080504262 60.883356762 - 45.088214709 61.018641342 - 45.175440152 61.076741650 - 45.255045370 60.999259903 - 45.247275176 60.863580306 -} -8548ad7bfffffff -{ - 27.430412388 -104.188926332 - 27.509689141 -104.126260469 - 27.597736241 -104.172451484 - 27.606472818 -104.281421127 - 27.527134355 -104.344055014 - 27.439121064 -104.297751518 -} -85b54e37fffffff -{ - -31.523362054 -166.334497339 - -31.435840418 -166.288855377 - -31.357494255 -166.354346926 - -31.366616618 -166.465377782 - -31.454059745 -166.511104674 - -31.532459028 -166.445716138 -} -85a75ac7fffffff -{ - -24.146792819 109.190934120 - -24.219171631 109.226853371 - -24.224735055 109.300575423 - -24.158025077 109.338277312 - -24.085750199 109.302387122 - -24.080081446 109.228765912 -} -8556289bfffffff -{ - 15.956787163 -31.732937131 - 15.884317330 -31.783738345 - 15.806067285 -31.739293704 - 15.800183164 -31.644120217 - 15.872557312 -31.593234353 - 15.950911277 -31.637606366 -} -85aa4e0ffffffff -{ - -23.201050322 82.624912892 - -23.293369714 82.653409993 - -23.316852677 82.753321252 - -23.248027843 82.824590591 - -23.155784409 82.796005067 - -23.132289817 82.696238400 -} -85061033fffffff -{ - 71.841414384 -35.748808674 - 71.848763347 -36.026990759 - 71.773234176 -36.177723565 - 71.690684021 -36.050920883 - 71.683449954 -35.774957983 - 71.758651682 -35.623590343 -} -8514747bfffffff -{ - 58.733590387 131.982459443 - 58.656946544 132.077224547 - 58.658190321 132.256020859 - 58.736109132 132.340988229 - 58.813016666 132.246628409 - 58.811741586 132.066892605 -} -854b6eb7fffffff -{ - 32.908580891 134.262865797 - 32.834719974 134.279844455 - 32.810847117 134.375189004 - 32.860855163 134.453586449 - 32.934716203 134.436624753 - 32.958569147 134.341248568 -} -8558764ffffffff -{ - 14.810123444 9.892970419 - 14.720169561 9.899771665 - 14.676923905 9.984198046 - 14.723584764 10.061941463 - 14.813597573 10.055263130 - 14.856890685 9.970718359 -} -8508815bfffffff -{ - 60.554609971 19.123344574 - 60.485075435 19.122517773 - 60.452176453 19.266387181 - 60.488738304 19.411315893 - 60.558276840 19.412541894 - 60.591249738 19.268439902 -} -85e834c3fffffff -{ - -67.897011255 -96.865084125 - -67.910303830 -96.633224127 - -67.840770320 -96.474937913 - -67.758310090 -96.548379414 - -67.745211594 -96.778689537 - -67.814380121 -96.937101576 -} -85d164a3fffffff -{ - -35.247086072 17.379632421 - -35.336489736 17.374243599 - -35.386751828 17.459259806 - -35.347568873 17.549486184 - -35.258249651 17.554657528 - -35.208028866 17.469819813 -} -8537ac8ffffffff -{ - 38.462960410 -153.419115236 - 38.386734609 -153.454328591 - 38.328187692 -153.379537149 - 38.345863545 -153.269527316 - 38.422092744 -153.234234738 - 38.480642749 -153.309031018 -} -85442587fffffff -{ - 22.260530024 -88.169204349 - 22.330338494 -88.105811039 - 22.417475659 -88.135231929 - 22.434830364 -88.228194725 - 22.364948388 -88.291654531 - 22.277785287 -88.262085128 + 89.900796050 20.229380089 + 89.941929081 85.085528952 + 89.937684450 -172.280549352 + 89.893928397 -112.334903952 + 89.869343407 -68.541640464 + 89.872827683 -25.830927255 } 8503263bfffffff { @@ -35197,9840 +39580,5461 @@ 89.937684450 -172.280549352 89.941929081 85.085528952 } -8502a137fffffff -{ - 76.432428507 -125.517340715 - 76.396580005 -125.870790973 - 76.307794407 -125.933511298 - 76.255096527 -125.646922551 - 76.290637796 -125.296834150 - 76.379181638 -125.229989495 -} -85f0a6a7fffffff -{ - -74.717025753 90.593716357 - -74.631938643 90.454693683 - -74.618247289 90.104211878 - -74.689515062 89.889576886 - -74.774886352 90.026118242 - -74.788706668 90.379796212 -} -85da740ffffffff -{ - -55.900949140 162.474820125 - -55.822378167 162.424263817 - -55.809194188 162.267965792 - -55.874563326 162.161789612 - -55.953208150 162.212036606 - -55.966410102 162.368770210 -} -8566a5d3fffffff -{ - 9.630943976 -79.962738448 - 9.562185802 -80.017179708 - 9.482399927 -79.979353012 - 9.471425001 -79.887067858 - 9.540235032 -79.832657037 - 9.619968118 -79.870500804 -} -85a4e0d3fffffff -{ - -24.611225825 -27.231923560 - -24.692628994 -27.280990210 - -24.769172339 -27.230554750 - -24.764244427 -27.130914050 - -24.682718719 -27.081890449 - -24.606243535 -27.132464200 -} -85f2929bfffffff -{ - -88.606834474 98.062970956 - -88.604741580 94.287894231 - -88.680962592 92.237454954 - -88.764005857 94.167619327 - -88.765849717 98.431720482 - -88.684907419 100.237156673 -} -850f4133fffffff -{ - 58.709673279 -59.632439610 - 58.677568367 -59.805587560 - 58.582998796 -59.839954576 - 58.520661476 -59.701981746 - 58.552651463 -59.529585437 - 58.647093225 -59.494412311 -} -85479b93fffffff -{ - 23.098674015 -176.917948228 - 23.189190111 -176.901018455 - 23.244563881 -176.977589024 - 23.209303440 -177.071105027 - 23.118706068 -177.087883649 - 23.063450332 -177.011297638 -} -85cd6bd7fffffff -{ - -52.658007292 76.250452410 - -52.568247414 76.223567676 - -52.540752373 76.082522102 - -52.602839179 75.967926314 - -52.692622410 75.994202396 - -52.720295921 76.135683579 -} -856b9463fffffff -{ - 6.571157181 15.641339606 - 6.487660645 15.643492081 - 6.444377609 15.722342540 - 6.484518399 15.799123996 - 6.568039357 15.797087117 - 6.611395221 15.718153142 -} -85c694cffffffff -{ - -42.415026484 -122.722579863 - -42.365068675 -122.612844187 - -42.269664925 -122.614684883 - -42.224261663 -122.725895056 - -42.274114107 -122.835405484 - -42.369474933 -122.833930854 -} -8522b26bfffffff -{ - 49.360033304 -155.219907206 - 49.433803378 -155.173569719 - 49.505049091 -155.240832795 - 49.502501020 -155.354678415 - 49.428623266 -155.400941061 - 49.357401308 -155.333433516 -} -8532a433fffffff -{ - 37.398367275 175.718382668 - 37.494732604 175.730044527 - 37.551275446 175.630927138 - 37.511354480 175.520200012 - 37.414945830 175.508784028 - 37.358501309 175.607849075 -} -85e5053bfffffff -{ - -64.290007227 119.685360574 - -64.226773047 119.520821072 - -64.257729363 119.312454648 - -64.352113743 119.267649758 - -64.415613139 119.432443502 - -64.384462148 119.641790510 -} -85ca8003fffffff -{ - -46.219517770 50.718789114 - -46.300939457 50.723863815 - -46.347046074 50.828762872 - -46.311678873 50.928582031 - -46.230203654 50.923300694 - -46.184149065 50.818407004 -} -8543652bfffffff -{ - 37.057907153 60.057997312 - 36.980132131 60.126384632 - 36.986676403 60.243927434 - 37.071057586 60.293379393 - 37.148983228 60.225056913 - 37.142376948 60.107217038 -} -850e532ffffffff -{ - 52.877997510 -75.274443791 - 52.825983715 -75.408912341 - 52.730393694 -75.401013290 - 52.686800396 -75.259313405 - 52.738613403 -75.125129359 - 52.834219996 -75.132360433 -} -85980e93fffffff -{ - -14.785495514 -6.140286563 - -14.866868695 -6.168435076 - -14.931499981 -6.104467147 - -14.914642582 -6.012352886 - -14.833214889 -5.984339488 - -14.768699000 -6.048305052 -} -85c0da13fffffff -{ - -46.308218337 -10.826376274 - -46.396048583 -10.873764408 - -46.467672748 -10.784807901 - -46.451377919 -10.648405739 - -46.363489939 -10.601270347 - -46.291954413 -10.690283686 -} -851ce6abfffffff -{ - 47.038331199 -142.276933982 - 46.978179855 -142.318329003 - 46.922163877 -142.244813404 - 46.926291440 -142.129980520 - 46.986427548 -142.088553729 - 47.042451354 -142.161991335 -} -85024a6bfffffff -{ - 71.154325006 -83.123812936 - 71.093597459 -83.351219282 - 71.000994305 -83.301481480 - 70.968990071 -83.026471275 - 71.029368840 -82.799436382 - 71.122099301 -82.847033702 -} -851361b7fffffff -{ - 66.044925605 -100.661805978 - 65.966156508 -100.793247057 - 65.880444295 -100.695816351 - 65.873252804 -100.467752963 - 65.951777634 -100.335681032 - 66.037738137 -100.432296993 -} -855aa273fffffff -{ - 18.504696558 178.331070724 - 18.593285239 178.342898635 - 18.644070383 178.265429164 - 18.606148744 178.176148195 - 18.517505259 178.164472717 - 18.466838100 178.241925630 -} -85cf86b3fffffff -{ - -48.821592508 -68.165054244 - -48.740134802 -68.129743029 - -48.674142760 -68.209127952 - -48.689473170 -68.323914873 - -48.770940154 -68.359606313 - -48.837067653 -68.280130990 -} -852a9a6bfffffff -{ - 37.232182284 -84.521523968 - 37.180358557 -84.606166697 - 37.099588897 -84.585167032 - 37.070567491 -84.479826473 - 37.122212579 -84.395220887 - 37.203057477 -84.415918315 -} -850764a7fffffff -{ - 63.798193981 -10.314581968 - 63.830612289 -10.463151919 - 63.780892024 -10.609720928 - 63.698916992 -10.607175461 - 63.666742842 -10.459021454 - 63.716300109 -10.312996548 -} -85a08cd7fffffff -{ - -13.625794810 -133.464615323 - -13.544153724 -133.452831082 - -13.485604696 -133.519073463 - -13.508619898 -133.597194964 - -13.590299213 -133.609109387 - -13.648925193 -133.542772098 -} -857a8e5bfffffff -{ - 7.130548099 47.793935386 - 7.211314785 47.791794910 - 7.258321383 47.719175405 - 7.224591977 47.648612569 - 7.143769645 47.650704040 - 7.096732312 47.723407398 -} -85e93083fffffff -{ - -68.994829702 -114.297542170 - -68.947038121 -114.098458163 - -68.864646617 -114.128925623 - -68.830003728 -114.357143960 - -68.877581138 -114.555761974 - -68.960014837 -114.526629293 -} -85954a7bfffffff -{ - -6.391702424 129.615901379 - -6.483665029 129.632236241 - -6.517930699 129.720809297 - -6.460229856 129.793089005 - -6.368220793 129.776761270 - -6.333958984 129.688146632 -} -8510c14ffffffff -{ - 58.204587593 61.146499243 - 58.129571716 61.247625872 - 58.139160230 61.425173748 - 58.223819760 61.502274960 - 58.298996659 61.401324058 - 58.289352841 61.223094121 -} -8579ad97fffffff -{ - 4.954351241 -137.947741830 - 4.866936124 -137.982005521 - 4.795816619 -137.925166228 - 4.812074403 -137.834132335 - 4.899412532 -137.799863027 - 4.970569853 -137.856633102 -} -85006a47fffffff -{ - 83.055606034 -19.667035224 - 83.139710317 -19.727404081 - 83.177316572 -20.414457968 - 83.129976363 -21.030567612 - 83.046083826 -20.953901915 - 83.009308358 -20.277362598 -} -85608817fffffff -{ - 18.087303208 73.620633593 - 18.169840056 73.592396083 - 18.182577778 73.506891345 - 18.112861232 73.449701622 - 18.030393470 73.477918926 - 18.017573164 73.563346241 -} -8504347bfffffff -{ - 74.747695893 129.804394565 - 74.667058741 130.010053144 - 74.673292285 130.376195390 - 74.760250130 130.540598115 - 74.841379967 130.336401808 - 74.835058607 129.966311988 -} -850e7197fffffff -{ - 55.766189276 -68.357884751 - 55.722196881 -68.511035416 - 55.625867974 -68.520503013 - 55.573578493 -68.377586320 - 55.617397858 -68.224923982 - 55.713679188 -68.214690589 -} -85e920d7fffffff -{ - -66.644092586 -116.460004041 - -66.597106158 -116.273961578 - -66.511801731 -116.295657467 - -66.473463465 -116.502257585 - -66.520263476 -116.687823270 - -66.605587492 -116.667266381 -} -856c1dcffffffff -{ - 5.596794851 -96.153126872 - 5.524656721 -96.209530713 - 5.444168593 -96.176879161 - 5.435823631 -96.087756120 - 5.508027516 -96.031311284 - 5.588510545 -96.064030398 -} -85e85093fffffff -{ - -59.283241169 -86.682160298 - -59.204534544 -86.587588019 - -59.125920055 -86.667225740 - -59.125854163 -86.841155316 - -59.204448619 -86.936167294 - -59.283221195 -86.856812248 -} -85569a63fffffff -{ - 7.802454572 -43.898662168 - 7.882250998 -43.848862932 - 7.963364052 -43.895033998 - 7.964708774 -43.990984768 - 7.884950414 -44.040785929 - 7.803809278 -43.994634532 -} -8572541bfffffff -{ - 4.370457355 143.134081712 - 4.274564352 143.149092439 - 4.239668711 143.239524003 - 4.300638992 143.314944131 - 4.396510878 143.299962866 - 4.431433660 143.209531954 -} -85076a63fffffff -{ - 62.849201446 -18.256722595 - 62.873086036 -18.417902350 - 62.813738015 -18.551308119 - 62.730714926 -18.523230781 - 62.707050648 -18.362682087 - 62.766189726 -18.229580652 -} -85f12147fffffff -{ - -85.082950509 139.577588927 - -85.141289330 138.793904223 - -85.225551858 139.038059864 - -85.250756419 140.097092274 - -85.190837142 140.882430651 - -85.107312299 140.607570132 -} -85f0527bfffffff +859e2133fffffff { - -75.358544773 52.232928578 - -75.292587426 51.983181600 - -75.310862344 51.647818776 - -75.395408098 51.558951449 - -75.461878089 51.808790316 - -75.443287586 52.147423344 + -19.613328834 166.944599202 + -19.528654011 166.909980053 + -19.510330011 166.814801748 + -19.576684086 166.754073603 + -19.661464213 166.788599093 + -19.679784967 166.883946658 } -85f3181bfffffff +85bb1457fffffff { - -77.284397403 -164.021389611 - -77.364047525 -163.960984389 - -77.386996189 -163.591315505 - -77.329875231 -163.285699134 - -77.250377686 -163.350529767 - -77.227845514 -163.716570368 + -42.144545046 -176.758146818 + -42.070035861 -176.700979461 + -41.990767603 -176.760627232 + -41.986001125 -176.877241770 + -42.060436272 -176.934424345 + -42.139711903 -176.874977553 } -85808d93fffffff +85bed6c3fffffff { - 0.609771968 -37.949601455 - 0.692291872 -37.900181472 - 0.776727596 -37.947324272 - 0.778674213 -38.043892279 - 0.696166277 -38.093340265 - 0.611699753 -38.046192378 + -25.698711742 151.739078878 + -25.605893538 151.716190874 + -25.577563983 151.614565644 + -25.641981514 151.535675749 + -25.734836468 151.558382400 + -25.763237272 151.660160501 } -851e9323fffffff +85deb56bfffffff { - 38.951534640 11.392142113 - 38.858995282 11.399265272 - 38.820012965 11.505936636 - 38.873551279 11.605664621 - 38.966141468 11.598742159 - 39.005142634 11.491890823 + -56.597348047 -38.575629996 + -56.534501980 -38.457827844 + -56.450134014 -38.502409968 + -56.428475932 -38.664089076 + -56.491049235 -38.781896126 + -56.575552911 -38.738021110 } -856e260bfffffff +854d6c23fffffff { - 1.927828775 -115.901815217 - 1.996928371 -115.857330494 - 2.070455847 -115.901502959 - 2.074794553 -115.990187588 - 2.005626187 -116.034599574 - 1.932187855 -115.990399827 + 19.897538126 -58.922070147 + 19.968032886 -58.875720229 + 20.031543721 -58.915610813 + 20.024579968 -59.001784502 + 19.954150815 -59.048080982 + 19.890619854 -59.008257282 } -8500ec43fffffff +859ab343fffffff { - 85.700541402 40.066432003 - 85.749926617 41.067300258 - 85.842421570 40.983811116 - 85.885203358 39.852477395 - 85.834182016 38.834619604 - 85.742046482 38.964809319 -} -85061827fffffff -{ - 68.867074023 -39.100272095 - 68.868171054 -39.345349042 - 68.788335232 -39.466302017 - 68.707692302 -39.342859235 - 68.706671608 -39.099511490 - 68.786217755 -38.977885559 -} -8593869bfffffff -{ - -4.731100590 -111.033320847 - -4.798182443 -111.084816591 - -4.878445716 -111.060431494 - -4.891684553 -110.984465536 - -4.824554133 -110.932885146 - -4.744233466 -110.957355364 -} -85375337fffffff -{ - 36.288284754 -143.038702480 - 36.213221995 -143.077252808 - 36.146832801 -143.007961461 - 36.155512058 -142.900183265 - 36.230558604 -142.861601490 - 36.296942149 -142.930829146 -} -85aa4ac7fffffff -{ - -23.824330207 83.097081471 - -23.916434770 83.125994035 - -23.939416103 83.226222529 - -23.870307481 83.297391485 - -23.778279963 83.268391808 - -23.755283989 83.168310056 -} -85b464c7fffffff -{ - -29.638997920 -165.893480340 - -29.550854334 -165.848949847 - -29.472737008 -165.913710273 - -29.482705794 -166.022905164 - -29.570769334 -166.067520476 - -29.648944143 -166.002856418 -} -8503211bfffffff -{ - 88.305240823 -38.165045410 - 88.387304864 -39.432583176 - 88.393882024 -42.744744697 - 88.317630679 -44.480509509 - 88.239085233 -43.029915119 - 88.233225290 -40.008615171 -} -859a0513fffffff -{ - -14.982264332 -174.520554565 - -14.901685035 -174.477722450 - -14.830036935 -174.525630048 - -14.838908337 -174.616260025 - -14.919375694 -174.659112292 - -14.991083522 -174.611314619 -} -85cdb077fffffff -{ - -40.000272428 95.819778090 - -39.925758406 95.764643483 - -39.924205406 95.646296261 - -39.997139572 95.582715363 - -40.071801276 95.637627883 - -40.073381200 95.756344212 -} -858d8873fffffff -{ - -6.543759240 109.774130553 - -6.460103697 109.754988374 - -6.439564216 109.670164753 - -6.502753457 109.604486784 - -6.586427817 109.623691856 - -6.606894194 109.708512043 -} -8547584bfffffff -{ - 27.839550636 -164.001464314 - 27.752224977 -164.029121228 - 27.691580466 -163.958260243 - 27.718259877 -163.859676454 - 27.805627322 -163.831919916 - 27.866273612 -163.902846704 -} -85935c83fffffff -{ - -9.080494345 -98.991702108 - -9.153670232 -99.050020810 - -9.241552004 -99.017410908 - -9.256292528 -98.926402295 - -9.183077881 -98.868027160 - -9.095161504 -98.900716992 -} -85ee124bfffffff -{ - -73.842417719 -16.885247411 - -73.753576970 -16.746369801 - -73.675280853 -16.951052369 - -73.685347470 -17.293630312 - -73.773836430 -17.434929051 - -73.852611475 -17.231251474 -} -854ca9bbfffffff -{ - 21.569897425 -69.744146182 - 21.518947436 -69.791276564 - 21.452869954 -69.754624803 - 21.437799729 -69.670859349 - 21.488794172 -69.623791680 - 21.554814394 -69.660426666 -} -8500e867fffffff -{ - 87.237833424 45.563973685 - 87.280284669 47.232862501 - 87.373606499 47.320147999 - 87.424569420 45.620510386 - 87.379791270 43.888280483 - 87.286458483 43.919319090 -} -857d9e97fffffff -{ - -2.951956337 -13.970574725 - -2.877310845 -13.934060393 - -2.803048926 -13.973581857 - -2.803371032 -14.049691617 - -2.878060108 -14.086293403 - -2.952383511 -14.046697986 -} -85d8e603fffffff -{ - -46.394117550 132.141959510 - -46.304124361 132.140005314 - -46.256093298 132.030342003 - -46.297955209 131.922583028 - -46.387876804 131.924235387 - -46.436008222 132.033948285 -} -85136a0ffffffff -{ - 63.446670142 -102.408264629 - 63.366920290 -102.522447010 - 63.281903546 -102.429151746 - 63.276395010 -102.222279351 - 63.355929416 -102.107512360 - 63.441187820 -102.200197597 -} -85f236a7fffffff -{ - -79.566621166 -161.490272048 - -79.648366805 -161.394129792 - -79.669087310 -160.929365496 - -79.607601785 -160.566736761 - -79.526106003 -160.669392080 - -79.505841712 -161.128207094 -} -85be1ca3fffffff -{ - -32.790161590 153.407119301 - -32.695414091 153.380426943 - -32.667446370 153.269589602 - -32.734167845 153.185256106 - -32.828956956 153.211741571 - -32.856983109 153.322767714 -} -85128b4bfffffff -{ - 51.257356192 -124.552336737 - 51.178888074 -124.579594000 - 51.116420024 -124.484538019 - 51.132230960 -124.362108121 - 51.210677684 -124.334366268 - 51.273335225 -124.429538350 -} -85030917fffffff -{ - 83.772833415 -80.015321928 - 83.807110235 -80.762230046 - 83.753261177 -81.446819674 - 83.666235666 -81.377665953 - 83.632914471 -80.643995234 - 83.685677165 -79.966330889 -} -8572234ffffffff -{ - 6.109792130 137.373029176 - 6.013705358 137.388966549 - 5.979393517 137.480636781 - 6.041165462 137.556388495 - 6.137257073 137.540472001 - 6.171571963 137.448782845 -} -85c360d7fffffff -{ - -37.900724815 -67.709604286 - -37.827044652 -67.681944289 - -37.761165757 -67.746084459 - -37.768829069 -67.837947071 - -37.842501586 -67.865853669 - -37.908518622 -67.801651243 -} -85442bb7fffffff -{ - 26.516199475 -88.571848925 - 26.585157561 -88.506123446 - 26.673366250 -88.537038199 - 26.692647953 -88.633837730 - 26.623626020 -88.699632527 - 26.535386298 -88.668558573 -} -85e544d3fffffff -{ - -68.979154980 109.113888534 - -68.905846463 108.944616756 - -68.921548400 108.680628522 - -69.010672238 108.584135312 - -69.084299952 108.753072498 - -69.068483992 109.018845877 -} -85b5018bfffffff -{ - -36.263693007 -156.358364068 - -36.173500927 -156.318718358 - -36.101040889 -156.396543521 - -36.118709319 -156.513986590 - -36.208862946 -156.553793293 - -36.281386674 -156.475996301 -} -85f12143fffffff -{ - -84.940204116 140.085822806 - -84.999035244 139.331267532 - -85.082950509 139.577588927 - -85.107312299 140.607570132 - -85.046945423 141.363104650 - -84.963769562 141.088137497 -} -857948c7fffffff -{ - 3.372438025 -127.076152727 - 3.291240723 -127.109851398 - 3.224843883 -127.063010862 - 3.239618851 -126.982566942 - 3.320717468 -126.948895643 - 3.387139739 -126.995640823 -} -85db3377fffffff -{ - -54.944885705 -178.629761435 - -54.878418002 -178.699049083 - -54.887859622 -178.837999706 - -54.963837743 -178.908047544 - -55.030395956 -178.838791681 - -55.020885460 -178.699455376 -} -8512ce57fffffff -{ - 50.099059306 -115.474465347 - 50.021722578 -115.522146248 - 49.950242329 -115.439261396 - 49.955890587 -115.308736529 - 50.033138534 -115.260634547 - 50.104827291 -115.343477458 -} -8582280bfffffff -{ - -6.394096950 7.496410537 - -6.305026028 7.508386206 - -6.253377721 7.441753274 - -6.290732243 7.363209422 - -6.379708005 7.351201716 - -6.431424391 7.417769820 -} -85f1118bfffffff -{ - -81.723528966 115.112063650 - -81.665222310 114.675444520 - -81.688708339 114.070250054 - -81.770872209 113.892779876 - -81.829943587 114.329626614 - -81.806081484 114.943802193 -} -852d08cffffffff -{ - 42.628947071 37.324664452 - 42.540963236 37.305523811 - 42.480719011 37.400648547 - 42.508398504 37.514873601 - 42.596318742 37.534200285 - 42.656623186 37.439116224 -} -8508e3d3fffffff -{ - 66.611729332 19.448170392 - 66.589236944 19.608234713 - 66.644824277 19.739938131 - 66.723048982 19.711456662 - 66.745545246 19.550510118 - 66.689812725 19.418930056 -} -856e65d7fffffff -{ - 5.362741816 -124.275968286 - 5.433919493 -124.237473222 - 5.507682985 -124.285053682 - 5.510166433 -124.371119433 - 5.438943348 -124.409512414 - 5.365282142 -124.361941853 -} -8533995bfffffff -{ - 37.458855685 178.260086743 - 37.554551287 178.274736018 - 37.612974161 178.178157095 - 37.575600908 178.066955212 - 37.479848065 178.052542731 - 37.421525573 178.149095060 -} -858708c7fffffff -{ - -12.665721889 87.400529506 - -12.752770328 87.429068550 - -12.776047826 87.518752442 - -12.712295137 87.579771292 - -12.625343360 87.551176723 - -12.602047618 87.461618651 -} -8502cb23fffffff -{ - 67.869617145 -100.997103868 - 67.790636025 -101.137170469 - 67.705846656 -101.031368895 - 67.699775875 -100.786417585 - 67.778498683 -100.645605555 - 67.863550498 -100.750482377 -} -85f3abcffffffff -{ - -80.131468813 -171.656131574 - -80.214973157 -171.645823532 - -80.250096958 -171.189564105 - -80.201056181 -170.748254301 - -80.117561736 -170.766565904 - -80.083092496 -171.218195033 -} -8584302ffffffff -{ - -4.733104788 61.507504353 - -4.816652790 61.518771668 - -4.844886358 61.601327277 - -4.789485214 61.672568845 - -4.705930821 61.661192843 - -4.677783850 61.578683939 -} -850e1eaffffffff -{ - 58.925838655 -82.080003198 - 58.865085311 -82.226897947 - 58.768914789 -82.198296112 - 58.733413098 -82.023679605 - 58.793925068 -81.876968872 - 58.890179518 -81.904689088 -} -851a9d67fffffff -{ - 42.655860417 -52.561473673 - 42.570324625 -52.599719036 - 42.503792547 -52.526208901 - 42.522710145 -52.414372982 - 42.608269048 -52.375851154 - 42.674887350 -52.449441471 -} -85e456abfffffff -{ - -61.203655542 92.192923897 - -61.115339263 92.109743409 - -61.105838512 91.910680389 - -61.184578875 91.793766193 - -61.273069633 91.876202525 - -61.282645831 92.076301008 -} -8573906bfffffff -{ - 0.250322813 127.949350327 - 0.156160441 127.965903688 - 0.122490341 128.054555982 - 0.183004626 128.126701610 - 0.277218893 128.110152606 - 0.310867019 128.021453547 -} -85242227fffffff -{ - 46.727262719 100.434758230 - 46.636298873 100.446657780 - 46.599751532 100.560880881 - 46.654010526 100.663373981 - 46.744915890 100.651876454 - 46.781620964 100.537483895 -} -85f10b3bfffffff -{ - -83.637608211 80.993232001 - -83.609891247 80.212071556 - -83.669577803 79.634091740 - -83.758132872 79.836480344 - -83.786383567 80.635260460 - -83.725535340 81.213798877 -} -85bc2d6bfffffff -{ - -36.010287673 29.044835005 - -35.927491880 29.050567568 - -35.882326368 28.957417996 - -35.919955238 28.858501437 - -36.002750670 28.852684019 - -36.047917691 28.945867978 -} -8558cc6bfffffff -{ - 7.369517346 12.818107164 - 7.285725395 12.822362671 - 7.242896008 12.901749405 - 7.283793754 12.976975409 - 7.367622787 12.972833137 - 7.410517100 12.893351558 -} -85d93047fffffff -{ - -56.812684991 148.049800855 - -56.730298220 148.020621396 - -56.699286960 147.867087842 - -56.750587741 147.742418686 - -56.832994182 147.771146714 - -56.864080424 147.924995845 -} -85e9b597fffffff -{ - -73.848307194 -103.025037645 - -73.873287581 -102.716881381 - -73.809156655 -102.475395031 - -73.720510373 -102.542501807 - -73.695859088 -102.848104625 - -73.759526979 -103.089142466 -} -85ef750bfffffff -{ - -78.360045600 -72.422756156 - -78.339216004 -71.963517615 - -78.247276482 -71.825471075 - -78.176576687 -72.141387321 - -78.197170039 -72.594605064 - -78.288696850 -72.737876863 -} -85dbac37fffffff -{ - -52.423599410 178.352641157 - -52.352116806 178.288683803 - -52.356952504 178.152384433 - -52.433333568 178.079673396 - -52.504910779 178.143562225 - -52.500012267 178.280231422 -} -85f14acbfffffff -{ - -82.451378372 31.543233325 - -82.365017730 31.255325313 - -82.354528401 30.567366291 - -82.430259259 30.152659318 - -82.517380747 30.430695709 - -82.528013260 31.133517898 -} -85d62387fffffff -{ - -51.351007052 34.974406891 - -51.287788965 34.916718356 - -51.274902577 34.794329808 - -51.325238208 34.729164207 - -51.388634543 34.786600111 - -51.401516968 34.909455416 -} -85495453fffffff -{ - 19.771084400 -112.331497858 - 19.853069494 -112.277595019 - 19.938321214 -112.326490996 - 19.941515544 -112.429346799 - 19.859472493 -112.483172449 - 19.774293062 -112.434219736 -} -85bf765bfffffff -{ - -41.872389973 157.462439845 - -41.780337446 157.427604039 - -41.757017802 157.302351036 - -41.825718264 157.211674035 - -41.917827761 157.246274081 - -41.941179949 157.371787388 -} -85996db7fffffff -{ - -7.347205866 1.695263766 - -7.261877819 1.708412735 - -7.211071166 1.648475908 - -7.245528675 1.575467691 - -7.330749160 1.562298784 - -7.381619649 1.622157960 -} -85c60c03fffffff -{ - -37.680591154 -136.645035222 - -37.590221128 -136.626362836 - -37.534935092 -136.711255336 - -37.569982332 -136.814956110 - -37.660405835 -136.833844120 - -37.715728712 -136.748815735 -} -85ce131bfffffff -{ - -43.366660986 -74.774202516 - -43.287464872 -74.729632854 - -43.213944954 -74.797162133 - -43.219467466 -74.909264782 - -43.298627094 -74.954131648 - -43.372300879 -74.886599167 -} -85005e93fffffff -{ - 85.537003803 6.760215350 - 85.618064708 7.193869577 - 85.690267811 6.444580071 - 85.679721045 5.251003819 - 85.597567564 4.848330733 - 85.527039868 5.607334249 + -10.322004499 -164.720413171 + -10.240381711 -164.683662591 + -10.172358696 -164.739059487 + -10.185870278 -164.831144873 + -10.267403713 -164.867960797 + -10.335514925 -164.812626194 } -85ef824bfffffff -{ - -77.243051198 4.018601831 - -77.147067778 4.042130098 - -77.094035185 3.686365845 - -77.136451966 3.304751868 - -77.232406199 3.275749541 - -77.285976730 3.633828976 -} -85d81b0bfffffff -{ - -46.292129015 133.781488515 - -46.201557336 133.777254667 - -46.154823386 133.665191449 - -46.198560963 133.557294021 - -46.289068322 133.561219624 - -46.335902577 133.673350678 -} -85ef6887fffffff -{ - -73.714855874 -78.010787457 - -73.701822697 -77.678203317 - -73.613541189 -77.548612037 - -73.538672155 -77.749347980 - -73.551637410 -78.078651015 - -73.639538972 -78.210477795 -} -85af4daffffffff -{ - -16.644449453 98.992141046 - -16.725630182 99.025212891 - -16.741706002 99.107369263 - -16.676671394 99.156334001 - -16.601691895 99.133916276 - -16.582501081 99.046519892 - -16.601116838 99.024868482 -} -85db0253fffffff -{ - -54.928709563 179.268681074 - -54.860462143 179.200966556 - -54.867543909 179.059322464 - -54.942933883 178.984993689 - -55.011273648 179.052646277 - -55.004131029 179.194690466 -} -8500cd4bfffffff -{ - 87.984565822 91.345919392 - 87.956130300 93.814828990 - 88.016610241 95.877025299 - 88.109111202 95.507778800 - 88.139919011 92.861047824 - 88.075721471 90.768162206 -} -85ccca2bfffffff -{ - -36.558946414 71.357463485 - -36.650313523 71.380842306 - -36.680138326 71.493397270 - -36.618567363 71.582433748 - -36.527216814 71.558891498 - -36.497420559 71.446475984 -} -85312ecbfffffff -{ - 45.871690090 121.761561686 - 45.814959072 121.841358245 - 45.825452484 121.958283864 - 45.892767311 121.995794801 - 45.949699674 121.916034340 - 45.939115616 121.798726046 -} -85c01b17fffffff -{ - -38.777690571 -11.036325466 - -38.868704737 -11.079320650 - -38.943143795 -10.999273855 - -38.926475727 -10.876182766 - -38.835399933 -10.833391756 - -38.761053745 -10.913487152 -} -85811203fffffff -{ - -11.716119973 -37.972535503 - -11.633449388 -37.922253557 - -11.550289902 -37.970213323 - -11.549796014 -38.068460341 - -11.632480751 -38.118771164 - -11.715645219 -38.070806238 -} -85481b13fffffff -{ - 28.287260034 -106.757730833 - 28.367651861 -106.696092645 - 28.454841267 -106.744634875 - 28.461597105 -106.854915332 - 28.381149341 -106.916502740 - 28.294001704 -106.867860774 -} -85bd9ad3fffffff -{ - -30.355224451 42.187455249 - -30.268076919 42.187274814 - -30.229586418 42.098165247 - -30.278269044 42.009136786 - -30.365462595 42.009240452 - -30.403927572 42.098449402 -} -85294903fffffff -{ - 37.339229086 -135.765181348 - 37.421461747 -135.729365348 - 37.484010753 -135.791771431 - 37.464283630 -135.889904804 - 37.382101213 -135.925526746 - 37.319595640 -135.863209455 -} -8518c8b3fffffff -{ - 42.831101013 -11.694511898 - 42.764918143 -11.781683036 - 42.674181043 -11.746050696 - 42.649626073 -11.623529287 - 42.715723160 -11.536425940 - 42.806460857 -11.571775879 -} -8592567bfffffff -{ - -15.298624695 -103.362275227 - -15.366874060 -103.420088301 - -15.453636756 -103.389526349 - -15.472208681 -103.301061698 - -15.403938125 -103.243174413 - -15.317116843 -103.273825939 +858ead43fffffff +{ + -12.392812099 -87.805477781 + -12.469845886 -87.865601057 + -12.559474315 -87.827280548 + -12.572069126 -87.728786420 + -12.495012282 -87.668657761 + -12.405383715 -87.707028467 } -850330d3fffffff +85f168dbfffffff { - 87.572894193 171.438289224 - 87.480430742 171.205065568 - 87.422802641 172.903848040 - 87.454766772 174.868648321 - 87.546367183 175.235423606 - 87.606955614 173.506543433 + -85.290642798 2.670572769 + -85.196101543 2.758859372 + -85.143520552 1.839878517 + -85.184029723 0.818526496 + -85.278314287 0.692082473 + -85.332372822 1.624943736 } -8520c367fffffff +85f10bc3fffffff { - 40.155857350 82.248162712 - 40.066268762 82.289380415 - 40.049901527 82.411577056 - 40.123036189 82.492859325 - 40.212688551 82.451936697 - 40.229142653 82.329436145 + -83.730598193 87.136508175 + -83.712303950 86.324514717 + -83.778335686 85.802904257 + -83.863801623 86.096971708 + -83.882402197 86.929030046 + -83.815223956 87.446641590 } -850f080ffffffff +855f2ed7fffffff +{ + 2.245291091 -57.576278662 + 2.325078470 -57.528150667 + 2.405609133 -57.569863090 + 2.406337581 -57.659636146 + 2.326605767 -57.707711812 + 2.246089971 -57.666066836 +} +859d05c3fffffff +{ + -21.844960213 150.817171871 + -21.754456962 150.796165895 + -21.726546811 150.699146975 + -21.789063270 150.622997976 + -21.879600449 150.643834979 + -21.907587374 150.740990119 +} +85cbb257fffffff +{ + -39.722295986 42.021675319 + -39.645633316 42.021560648 + -39.614412674 41.927754988 + -39.659873069 41.833954839 + -39.736565089 41.833984359 + -39.767767449 41.927899240 +} +85c42c6bfffffff +{ + -38.497165660 -33.141141212 + -38.574071117 -33.202643434 + -38.657008311 -33.151970331 + -38.663019810 -33.039570671 + -38.586004497 -32.978073262 + -38.503087631 -33.028970312 +} +85a58697fffffff +{ + -15.803228746 -35.666443843 + -15.721957996 -35.616501154 + -15.641710966 -35.664669483 + -15.642732766 -35.762795939 + -15.724029569 -35.812777870 + -15.804278510 -35.764594244 +} +85ef0087fffffff +{ + -83.106462431 -50.289315577 + -83.053312202 -49.630406900 + -82.958006508 -49.694098245 + -82.915704993 -50.398566075 + -82.967840292 -51.050284077 + -83.063279181 -51.004776548 +} +85aa3477fffffff +{ + -23.358553489 67.695320133 + -23.454324233 67.713386704 + -23.487690551 67.812724060 + -23.425228741 67.893899943 + -23.329463764 67.875694398 + -23.296154726 67.776451831 +} +85c085bbfffffff +{ + -38.785775630 -17.436277491 + -38.873854981 -17.486211784 + -38.952149985 -17.413107124 + -38.942284553 -17.289953106 + -38.854118416 -17.240171883 + -38.775904465 -17.313391042 +} +85a28b0bfffffff +{ + -28.874054216 49.200085833 + -28.965181985 49.203069727 + -29.009628667 49.289205335 + -28.962859323 49.372361962 + -28.871647447 49.369236101 + -28.827288984 49.283095697 +} +8596e09bfffffff +{ + -9.458158657 25.971236963 + -9.361438995 25.977517103 + -9.308017468 25.895733344 + -9.351270510 25.807657568 + -9.447969807 25.801312877 + -9.501436505 25.883108470 +} +8506369bfffffff +{ + 73.441836857 -24.605819134 + 73.465197592 -24.886602336 + 73.401752357 -25.087328375 + 73.315283034 -25.007014503 + 73.292162542 -24.728342406 + 73.355272418 -24.527882079 +} +85365a57fffffff +{ + 27.684631484 -141.029369998 + 27.601792745 -141.066711465 + 27.529061200 -141.001683263 + 27.539174249 -140.899382614 + 27.621982376 -140.862021041 + 27.694708102 -140.926980041 +} +85066cb3fffffff +{ + 59.881163230 -27.347949739 + 59.892772684 -27.508868449 + 59.823103817 -27.617119137 + 59.742057948 -27.564444283 + 59.730612676 -27.404239634 + 59.800049533 -27.295997687 +} +85c563c3fffffff +{ + -33.821766602 -27.145056950 + -33.904541135 -27.199717658 + -33.985768887 -27.143353688 + -33.984168450 -27.032157140 + -33.901279394 -26.977550759 + -33.820105359 -27.034086183 +} +85d90eabfffffff +{ + -55.847897824 139.448167554 + -55.807857916 139.304703635 + -55.858141114 139.179030993 + -55.948692673 139.196707689 + -55.988842790 139.340723735 + -55.938330765 139.466509829 +} +8510ea27fffffff +{ + 60.007673483 61.977031722 + 59.933187567 62.081454129 + 59.941840844 62.267794854 + 60.025029097 62.350464464 + 60.099679949 62.246257553 + 60.090977453 62.059163086 +} +8568c867fffffff +{ + 0.943818785 125.202126781 + 0.850448327 125.218739204 + 0.817290335 125.305916555 + 0.877535491 125.376534805 + 0.970968516 125.359922039 + 1.004093844 125.272691300 +} +858ac493fffffff +{ + -1.720905466 -62.615012813 + -1.643450913 -62.568742919 + -1.563335843 -62.607783401 + -1.560710984 -62.693015370 + -1.638112194 -62.739218497 + -1.718191585 -62.700256476 +} +85988ca7fffffff +{ + -19.430442196 -10.899480043 + -19.515674826 -10.933716287 + -19.585259862 -10.869640706 + -19.569498948 -10.771298402 + -19.484192058 -10.737193134 + -19.414720266 -10.801298936 +} +850ca323fffffff +{ + 61.714864036 -170.867188615 + 61.632869401 -170.943383654 + 61.565426088 -170.831343410 + 61.579701802 -170.643468756 + 61.661448511 -170.566571792 + 61.729167583 -170.678247421 +} +85e4a507fffffff +{ + -55.642915258 105.768735310 + -55.564886779 105.666897196 + -55.575195249 105.496259536 + -55.663588880 105.426704473 + -55.741840861 105.528318587 + -55.731475511 105.699714151 +} +85a274b7fffffff +{ + -17.346590210 54.309979378 + -17.437982801 54.316667613 + -17.474921300 54.400928254 + -17.420364586 54.478480288 + -17.328915754 54.471664959 + -17.292079802 54.387424736 +} +85e52387fffffff +{ + -64.712113633 123.581750064 + -64.653767059 123.407786701 + -64.690107676 123.202849701 + -64.785016994 123.171003739 + -64.843616411 123.345402708 + -64.807052800 123.551213670 +} +85f01ac7fffffff +{ + -75.634918773 72.067975123 + -75.544457097 72.027593228 + -75.503770348 71.700261263 + -75.553199593 71.411206035 + -75.643691054 71.447952422 + -75.684725782 71.777393204 +} +85b788b3fffffff +{ + -31.111564771 -89.298634663 + -31.043409475 -89.239613244 + -30.962079811 -89.283551001 + -30.948764814 -89.386392983 + -31.016802013 -89.445546880 + -31.098272346 -89.401726779 +} +85e5712ffffffff +{ + -68.432263164 108.469201639 + -68.358077434 108.305701845 + -68.372794927 108.047237494 + -68.461802481 107.950562686 + -68.536299694 108.113702871 + -68.521477294 108.373885450 +} +85f1707bfffffff +{ + -86.418096037 71.452654490 + -86.376253997 70.145926243 + -86.425377536 68.948091831 + -86.518230533 69.031486954 + -86.561617940 70.379774697 + -86.510561915 71.602681130 +} +85956457fffffff +{ + -0.813064710 125.028649402 + -0.906024416 125.045220485 + -0.939597939 125.132069382 + -0.880182057 125.202400631 + -0.787158338 125.185828916 + -0.753614489 125.098926519 +} +850056abfffffff { - 64.473102055 -67.193327550 - 64.431539478 -67.394984430 - 64.335091292 -67.411127393 - 64.280270076 -67.226911256 - 64.321632042 -67.026128101 - 64.418014964 -67.008688975 + 83.777458951 25.539466376 + 83.842324240 26.080726982 + 83.928541411 25.801304842 + 83.949090654 24.963266669 + 83.883055333 24.425161759 + 83.797648372 24.721626272 +} +850b29b7fffffff +{ + 65.789455438 67.983641248 + 65.715027048 68.093902380 + 65.715512090 68.316747108 + 65.790429877 68.430414693 + 65.865034918 68.320677759 + 65.864545506 68.096744696 +} +85796babfffffff +{ + 4.765840616 -125.891363883 + 4.835873902 -125.854582344 + 4.908496431 -125.902105130 + 4.910982614 -125.986392964 + 4.875933746 -126.004738663 + 4.835503099 -126.021613544 + 4.768387917 -125.975564180 +} +852f4b27fffffff +{ + 33.190100961 136.847050066 + 33.273594742 136.818080965 + 33.295393908 136.726734484 + 33.233753544 136.664567826 + 33.150392143 136.693627717 + 33.128538791 136.784763799 +} +850071d7fffffff +{ + 81.939119142 5.939221274 + 82.017116647 6.164564434 + 82.086275236 5.754513178 + 82.076503800 5.116354006 + 81.997925110 4.900174926 + 81.929694772 5.312848384 +} +85cc945bfffffff +{ + -33.654133294 88.089957991 + -33.740549775 88.124244658 + -33.755549977 88.230378070 + -33.684176928 88.302046595 + -33.597837338 88.267685621 + -33.582793882 88.161730133 +} +856e850ffffffff +{ + 7.988348298 -110.120493628 + 8.063449975 -110.069769956 + 8.143368658 -110.113281903 + 8.148107749 -110.207575578 + 8.072927044 -110.258245288 + 7.993086282 -110.214675478 +} +85dc91cbfffffff +{ + -49.021164685 -3.229691002 + -49.109569110 -3.268259551 + -49.172986039 -3.168509817 + -49.147909641 -3.030238526 + -49.059481377 -2.992001530 + -48.996153178 -3.091703731 +} +852ba28bfffffff +{ + 48.792979966 -73.847776737 + 48.743654699 -73.971091364 + 48.650337237 -73.967092008 + 48.606341003 -73.840326701 + 48.655481356 -73.717269722 + 48.748802428 -73.720720319 +} +8581315bfffffff +{ + -14.579662821 -40.535561113 + -14.498430815 -40.484552861 + -14.415973862 -40.532611664 + -14.414755206 -40.631672731 + -14.496000452 -40.682698544 + -14.578451109 -40.634645880 +} +85cf21c3fffffff +{ + -55.429040328 -80.048456952 + -55.346925455 -79.978056441 + -55.271602388 -80.059425354 + -55.278236541 -80.211097206 + -55.360286243 -80.281948601 + -55.435767126 -80.200678680 +} +85a4ed9bfffffff +{ + -26.082319199 -23.683878638 + -26.166412862 -23.731580000 + -26.243588841 -23.675835715 + -26.236592425 -23.572264847 + -26.152383050 -23.524633413 + -26.075285844 -23.580502576 +} +85be18abfffffff +{ + -31.767642691 152.511492710 + -31.672868819 152.486112399 + -31.644205598 152.376936327 + -31.710252741 152.292961218 + -31.805063891 152.318136145 + -31.833790753 152.427491829 +} +85b62677fffffff +{ + -31.427633392 -94.467124760 + -31.360617506 -94.400301525 + -31.276065130 -94.439119817 + -31.258402929 -94.544600478 + -31.325284853 -94.611518216 + -31.409962913 -94.572861268 +} +856ec8a3fffffff +{ + 14.706052419 -118.497413357 + 14.786263211 -118.450528103 + 14.867607607 -118.500282845 + 14.868648714 -118.596942068 + 14.788389839 -118.643727750 + 14.707137892 -118.593953981 +} +85c64397fffffff +{ + -31.786315911 -138.623059292 + -31.694280615 -138.603342230 + -31.633988706 -138.683345271 + -31.665679364 -138.783174412 + -31.757758847 -138.803083316 + -31.818103578 -138.722971274 +} +85f06583fffffff +{ + -80.637673319 23.070229703 + -80.546135373 22.915060449 + -80.521944162 22.368850686 + -80.588960472 21.969080565 + -80.680955379 22.115886477 + -80.705481471 22.670912288 +} +85eea33bfffffff +{ + -72.414189420 -13.053532573 + -72.323512007 -12.945303780 + -72.249189648 -13.149196675 + -72.265089471 -13.460873500 + -72.355490513 -13.571417078 + -72.430269276 -13.367985065 +} +85e2b247fffffff +{ + -63.689266616 -114.226013033 + -63.637533416 -114.059491798 + -63.549445214 -114.085107010 + -63.513059494 -114.276309504 + -63.564618029 -114.442506668 + -63.652736387 -114.417826389 +} +853f5823fffffff +{ + 31.826313841 29.136612064 + 31.730053186 29.126685624 + 31.674096773 29.219481806 + 31.714326406 29.322236748 + 31.810548418 29.332339748 + 31.866579559 29.239511395 +} +85f17667fffffff +{ + -86.282877435 83.527424402 + -86.259090163 82.166947268 + -86.322570796 81.198831995 + -86.411797369 81.592853612 + -86.436396796 83.008901155 + -86.370930181 83.973987966 +} +85051903fffffff +{ + 77.502332572 128.218404784 + 77.423464136 128.477603819 + 77.432464197 128.920822023 + 77.520466368 129.110563417 + 77.599935884 128.853231084 + 77.590800862 128.404240599 +} +857a6587fffffff +{ + -3.963228690 37.627390142 + -3.869464015 37.629003612 + -3.819216187 37.548157078 + -3.862702566 37.465633833 + -3.956502670 37.463956150 + -4.006781039 37.544865943 } -85f174c3fffffff +85d0e35bfffffff +{ + -50.709820480 16.638224061 + -50.795919852 16.630266145 + -50.837090410 16.737683430 + -50.792133131 16.852779321 + -50.706105418 16.860387490 + -50.664963180 16.753249220 +} +85704c4bfffffff +{ + 1.512265360 -161.460567287 + 1.425185951 -161.486638935 + 1.356361426 -161.422947436 + 1.374555260 -161.333142378 + 1.461638611 -161.306995151 + 1.530524258 -161.370728482 +} +8507b56bfffffff +{ + 78.811996987 -17.999780360 + 78.846453730 -18.383927497 + 78.793455373 -18.702028328 + 78.706433397 -18.634260727 + 78.672354777 -18.253673546 + 78.724923037 -17.937307051 +} +8532cab3fffffff +{ + 43.247462741 160.598590716 + 43.341940706 160.591423530 + 43.383108639 160.474880821 + 43.329747056 160.365724994 + 43.235312020 160.373181912 + 43.194195459 160.489505157 +} +85dbb4bbfffffff +{ + -49.264713820 -175.663206133 + -49.196103934 -175.601085068 + -49.120911301 -175.668152119 + -49.114312858 -175.797106160 + -49.182857746 -175.859256696 + -49.258066041 -175.792424257 +} +85888e37fffffff +{ + -0.923759095 -149.703930347 + -1.010449578 -149.734853802 + -1.079302726 -149.673048829 + -1.061525880 -149.580335045 + -0.974877986 -149.549366795 + -0.905964304 -149.611156997 +} +8506a583fffffff +{ + 73.932223406 -37.238825249 + 73.938432199 -37.553064431 + 73.862695678 -37.716229113 + 73.781106598 -37.566116579 + 73.774994518 -37.254712473 + 73.850375327 -37.090602971 +} +85f29127fffffff +{ + -88.790615868 -108.434480908 + -88.827240977 -104.359577461 + -88.765954286 -101.109196128 + -88.673939916 -102.028281583 + -88.641127324 -105.711270414 + -88.696844392 -108.847278986 +} +854a1837fffffff +{ + 21.599747438 131.758620613 + 21.512927578 131.775493249 + 21.485023363 131.868462565 + 21.543971240 131.944597737 + 21.630805036 131.927736817 + 21.658677092 131.834728932 +} +855b9827fffffff +{ + 16.403288989 179.774553500 + 16.489503827 179.787400860 + 16.539102562 179.713037973 + 16.502367928 179.625834373 + 16.416093533 179.613128339 + 16.366613221 179.687484429 +} +8502da03fffffff +{ + 68.087147176 -111.995602828 + 68.001656374 -112.094621866 + 67.926578998 -111.955676323 + 67.936698688 -111.718039954 + 68.022021251 -111.617788556 + 68.097392880 -111.756399010 +} +85169e63fffffff +{ + 45.034268644 157.683130915 + 45.127048972 157.671953955 + 45.164210101 157.552072897 + 45.108552344 157.443623365 + 45.015828495 157.455092955 + 44.978705755 157.574719790 +} +85543083fffffff +{ + 19.548790350 -14.640194517 + 19.479601273 -14.705090344 + 19.395866413 -14.674921956 + 19.381282709 -14.580013354 + 19.450355444 -14.515137687 + 19.534128102 -14.545150279 +} +8508c933fffffff +{ + 69.495111078 28.984862966 + 69.542872410 29.147020571 + 69.617383031 29.081837866 + 69.643912158 28.853033773 + 69.595787990 28.690906404 + 69.521498278 28.757546993 +} +857805bbfffffff +{ + 0.994378661 -133.602048096 + 0.910457919 -133.635924893 + 0.843377931 -133.583486916 + 0.860178010 -133.497252704 + 0.944009453 -133.463384636 + 1.011130079 -133.515741948 +} +85d2608ffffffff +{ + -42.115541252 -118.616876598 + -42.061285711 -118.509680068 + -41.965403691 -118.518314765 + -41.923791408 -118.633776946 + -41.977924156 -118.740793932 + -42.073791722 -118.732528327 +} +853ea54ffffffff +{ + 24.800787116 17.983811139 + 24.703981247 17.984287441 + 24.655522198 18.076665675 + 24.703808742 18.168669918 + 24.800636721 18.168356272 + 24.849156169 18.075875688 +} +850f1bcffffffff +{ + 64.962905596 -75.639047099 + 64.910059708 -75.831107378 + 64.813328698 -75.818335039 + 64.769416672 -75.614870982 + 64.822006243 -75.423378795 + 64.918763216 -75.434781695 +} +85ecb157fffffff +{ + -62.183291635 140.329194175 + -62.146211898 140.154080921 + -62.201030170 140.003168168 + -62.293181894 140.027229556 + -62.330378932 140.203178883 + -62.275306416 140.354228571 +} +85500023fffffff +{ + 20.511399569 -130.718362064 + 20.429754461 -130.755125853 + 20.354737642 -130.700824463 + 20.361380444 -130.609862952 + 20.442961588 -130.573119683 + 20.517963894 -130.627317291 +} +85c53637fffffff +{ + -29.158083522 -37.988362431 + -29.232160857 -38.044480948 + -29.310950732 -38.006450769 + -29.315649015 -37.912115883 + -29.241451389 -37.855968349 + -29.162675891 -37.894184524 +} +850d34bbfffffff +{ + 75.804355069 -161.208223084 + 75.724351618 -161.415548500 + 75.640703263 -161.246758182 + 75.636663243 -160.873336224 + 75.716149870 -160.664465908 + 75.800192508 -160.830530423 +} +8532dd0bfffffff +{ + 43.905200519 162.609825937 + 43.999713088 162.605228943 + 44.042794101 162.488129775 + 43.991302961 162.375833685 + 43.896822199 162.380731704 + 43.853800577 162.497624960 +} +85f290a7fffffff +{ + -89.099846065 179.872774124 + -89.190679942 179.042192950 + -89.240974851 -175.431633186 + -89.191675152 -169.594870172 + -89.100089857 -169.922211678 + -89.057744112 -174.917975175 +} +85669dcbfffffff +{ + 4.282266581 -82.697049583 + 4.208791573 -82.753278750 + 4.124587365 -82.715359938 + 4.113901006 -82.621184137 + 4.187426070 -82.564973996 + 4.271587413 -82.602920496 +} +85e89497fffffff +{ + -70.399872777 -70.616849989 + -70.374738020 -70.344181679 + -70.282950277 -70.268879678 + -70.216546972 -70.464278654 + -70.241521342 -70.734846281 + -70.333058363 -70.812105487 +} +85034e23fffffff { - -87.655850541 96.902446675 - -87.652837447 94.666479340 - -87.729050033 93.492469341 - -87.811035666 94.626369171 - -87.813934038 97.025372487 - -87.734962037 98.119822753 -} -85f0ab97fffffff -{ - -74.062497370 74.565414662 - -73.971378817 74.515324168 - -73.934243286 74.210341211 - -73.987924920 73.953493483 - -74.079100222 74.000601532 - -74.116539015 74.307545012 -} -851e5197fffffff -{ - 47.266972324 28.060205241 - 47.180506322 28.049600808 - 47.129286841 28.160636551 - 47.164473504 28.282334186 - 47.250914573 28.293190471 - 47.302194076 28.182097489 -} -8596cda7fffffff -{ - -5.985051781 21.345155940 - -5.890213659 21.353034850 - -5.837423644 21.274568831 - -5.879412354 21.188234638 - -5.974207428 21.180298264 - -6.027056905 21.258753488 -} -85cc1b03fffffff -{ - -40.214019202 79.660620904 - -40.299971061 79.691596163 - -40.320353493 79.808520094 - -40.254788190 79.894281431 - -40.168881081 79.863169661 - -40.148494442 79.746432726 -} -85b4dcbbfffffff -{ - -18.491636744 -157.997988214 - -18.402666129 -157.963141150 - -18.330198847 -158.027980617 - -18.346611539 -158.127636595 - -18.435518570 -158.162592147 - -18.508076551 -158.097783464 -} -85df5353fffffff -{ - -55.601083774 -60.108648107 - -55.562668778 -59.963768486 - -55.478060400 -59.948819796 - -55.431936915 -60.078021381 - -55.470168376 -60.222395478 - -55.554706293 -60.238072748 -} -858ab483fffffff -{ - -8.146431854 -54.385639846 - -8.066702988 -54.335801500 - -7.982284401 -54.379704570 - -7.977626126 -54.473385697 - -8.057328437 -54.523181336 - -8.141715574 -54.479338662 -} -85661e2ffffffff -{ - 6.723079252 -76.763713985 - 6.652547618 -76.817353688 - 6.570422898 -76.778758940 - 6.558890576 -76.686518648 - 6.629467582 -76.632923550 - 6.711531538 -76.671524013 -} -8500c25bfffffff -{ - 83.806957945 87.267585599 - 83.784401898 88.099232698 - 83.852229950 88.707407498 - 83.943802362 88.482995481 - 83.966883083 87.630685332 - 83.897856360 87.023761739 -} -8592f18ffffffff -{ - -16.183245597 -106.894698770 - -16.248539411 -106.950867833 - -16.333738843 -106.922581847 - -16.353714076 -106.838034293 - -16.288403454 -106.781781039 - -16.203134402 -106.810159506 -} -85de64c7fffffff -{ - -51.977872937 -63.443376895 - -51.944681840 -63.311600330 - -51.865211515 -63.290315680 - -51.819021219 -63.400249143 - -51.852066883 -63.531578022 - -51.931447858 -63.553420320 -} -85ab75c3fffffff -{ - -15.101882214 71.122407529 - -15.194915861 71.141861680 - -15.225237898 71.236262998 - -15.162474125 71.311112745 - -15.069470055 71.291542864 - -15.039200086 71.197238842 -} -85cb02a7fffffff -{ - -34.180027223 50.007373439 - -34.270049520 50.011217818 - -34.315896738 50.102757197 - -34.271646032 50.190452643 - -34.181546163 50.186449487 - -34.135774518 50.094909787 -} -858482cffffffff -{ - -13.130478715 60.071709224 - -13.221265002 60.082625730 - -13.254474549 60.169595308 - -13.196805236 60.245601952 - -13.105995037 60.234561754 - -13.072877961 60.147638593 -} -8505422ffffffff -{ - 81.569442646 157.797619239 - 81.473931898 157.877435806 - 81.435293308 158.474245632 - 81.491492226 158.999616868 - 81.587191675 158.932114463 - 81.626512076 158.326875889 -} -85833313fffffff -{ - -12.334135346 14.956075781 - -12.239992701 14.966318101 - -12.184480167 14.890443631 - -12.223058045 14.804367994 - -12.317130408 14.794076114 - -12.372695208 14.869909348 -} -85425227fffffff -{ - 26.383365677 69.877042036 - 26.307020676 69.925529481 - 26.303762624 70.027772793 - 26.376844348 70.081756350 - 26.453311230 70.033391656 - 26.456574519 69.930920237 -} -85e7330ffffffff -{ - -68.403089417 41.068646997 - -68.328569520 40.935795094 - -68.327814391 40.701040946 - -68.401680545 40.597430112 - -68.476557029 40.729665453 - -68.477210339 40.966136354 + 78.810772956 -63.714911986 + 78.779635628 -64.149722569 + 78.692726865 -64.206751964 + 78.637117551 -63.834566288 + 78.667872178 -63.404135701 + 78.754615414 -63.341534604 } -85d8b117fffffff +85b76ecffffffff +{ + -31.460757868 -104.754434697 + -31.398461451 -104.674865387 + -31.309789688 -104.701197209 + -31.283336712 -104.806869243 + -31.345485212 -104.886438523 + -31.434234452 -104.860336163 +} +85d00967fffffff +{ + -47.176503236 17.877570433 + -47.264088306 17.871900403 + -47.306681904 17.972766190 + -47.261667540 18.079047002 + -47.174164983 18.084412812 + -47.131594165 17.983801750 +} +85100a3bfffffff +{ + 60.574446038 51.368509748 + 60.510598816 51.490191761 + 60.533659421 51.668741588 + 60.620680204 51.726247362 + 60.684689711 51.604487450 + 60.661515794 51.425298046 +} +850320d7fffffff +{ + 89.332652521 4.205374692 + 89.417603050 7.145778092 + 89.488614811 0.713339406 + 89.460988775 -8.877757835 + 89.370672789 -9.754330065 + 89.312103614 -3.382062558 +} +85c3006ffffffff +{ + -43.303735448 -62.076519178 + -43.227423855 -62.056595829 + -43.167146104 -62.129105566 + -43.183062878 -62.221660615 + -43.259406912 -62.241874177 + -43.319801902 -62.169242550 +} +852db48ffffffff +{ + 32.730039951 33.293208430 + 32.635130676 33.279452517 + 32.576601578 33.369298212 + 32.612905773 33.472898879 + 32.707756437 33.486821592 + 32.766361615 33.396977050 +} +857f480bfffffff +{ + -1.065368095 168.515753545 + -1.147267296 168.524090169 + -1.175807653 168.590150680 + -1.122540435 168.647819213 + -1.040736353 168.639519857 + -1.012104404 168.573514721 +} +850511a7fffffff +{ + 76.859605393 116.139900073 + 76.794027408 116.449093756 + 76.822210855 116.851278599 + 76.916332674 116.948548279 + 76.982503012 116.638821437 + 76.953956081 116.232331513 +} +857d82affffffff +{ + -4.008386367 -14.871193459 + -3.932726580 -14.833909560 + -3.858117661 -14.874043441 + -3.859110267 -14.951534655 + -3.934815589 -14.988906127 + -4.009482783 -14.948698828 +} +855a3177fffffff +{ + 13.280190614 174.134518117 + 13.364278800 174.141946845 + 13.410196124 174.065528522 + 13.371914265 173.981720708 + 13.287795744 173.974436612 + 13.241989282 174.050815618 +} +85cc983bfffffff +{ + -33.283937693 82.804385445 + -33.373460564 82.835510178 + -33.393492051 82.944163410 + -33.324019853 83.021520056 + -33.234560377 82.990291636 + -33.214509651 82.881809963 +} +857d8417fffffff +{ + -5.753471195 -15.423465062 + -5.676878219 -15.385650239 + -5.602469601 -15.426220866 + -5.604600843 -15.504679586 + -5.681243393 -15.542582264 + -5.755705131 -15.501938387 +} +85f0608ffffffff +{ + -80.106269450 29.571670891 + -80.018504051 29.367982966 + -80.004290611 28.842505505 + -80.077699444 28.512245867 + -80.166030335 28.709758167 + -80.180389002 29.243795280 +} +85890eb3fffffff +{ + -13.810134466 -153.807040285 + -13.723745300 -153.776835162 + -13.655010729 -153.841456163 + -13.672566872 -153.936279378 + -13.758906977 -153.966599790 + -13.827740083 -153.901981877 +} +855b2b3bfffffff +{ + 7.279303456 173.013553855 + 7.355899308 173.019547849 + 7.396958019 172.947363488 + 7.361319117 172.869225139 + 7.284701910 172.863359118 + 7.243744828 172.935503419 +} +850331bbfffffff +{ + 88.526538829 -142.838081803 + 88.468117931 -145.538236087 + 88.375257112 -144.942675321 + 88.339487961 -141.975537958 + 88.393492942 -139.372758964 + 88.487459296 -139.631473164 +} +859743cbfffffff +{ + -19.119217494 24.343836948 + -19.023344792 24.351013985 + -18.968856237 24.266573826 + -19.010213607 24.174952589 + -19.106061366 24.167707411 + -19.160576775 24.252151554 +} +853da297fffffff +{ + 27.452957076 75.543380303 + 27.373882964 75.585906732 + 27.366445853 75.689036655 + 27.438043551 75.749867535 + 27.517218928 75.707505899 + 27.524695424 75.604148182 +} +85e4cc63fffffff +{ + -56.547977705 85.361890625 + -56.457689623 85.307267515 + -56.439741332 85.139029476 + -56.511952797 85.024709811 + -56.602346408 85.078656304 + -56.620423425 85.247601049 +} +85f3320bfffffff +{ + -75.237031546 -179.250949697 + -75.313556198 -179.288234208 + -75.354068951 -179.018195753 + -75.317566959 -178.711984964 + -75.240915527 -178.677974095 + -75.200890586 -178.946894404 +} +85375acffffffff +{ + 35.175001449 -142.472972529 + 35.098911738 -142.511428528 + 35.031381223 -142.442920104 + 35.039947280 -142.336021763 + 35.116019018 -142.297537337 + 35.183542714 -142.365979472 +} +85e56527fffffff { - -44.367063537 142.761029524 - -44.273904164 142.744507196 - -44.235322196 142.624056021 - -44.289809877 142.519968064 - -44.382948996 142.536182085 - -44.421620871 142.656792464 + -71.980509688 110.254497467 + -71.909860192 110.056166621 + -71.927234361 109.754038527 + -72.015398180 109.647931777 + -72.086412960 109.845916945 + -72.068897721 110.150366829 } -85b170b3fffffff -{ - -29.687737515 -125.501204170 - -29.641206751 -125.411312833 - -29.554489937 -125.409063067 - -29.514351656 -125.496468984 - -29.560783961 -125.586194477 - -29.647452825 -125.588679764 -} -8503a693fffffff -{ - 82.381668643 -171.034978667 - 82.294378689 -171.315565541 - 82.216993900 -170.899564996 - 82.225989640 -170.207858763 - 82.312522840 -169.917668558 - 82.390819726 -170.328584129 -} -857796affffffff -{ - -2.790127941 148.327585872 - -2.883046474 148.341410168 - -2.915527577 148.428501622 - -2.855145173 148.501751464 - -2.762263594 148.487961997 - -2.729727408 148.400887820 -} -85ac0b67fffffff -{ - -22.295911465 7.465960064 - -22.382673094 7.450397442 - -22.443354332 7.524359184 - -22.417176506 7.613792051 - -22.330434261 7.629176100 - -22.269850320 7.555305885 -} -85d94b3bfffffff -{ - -54.110085039 123.113585580 - -54.049820996 122.988374565 - -54.082273043 122.839709498 - -54.175172855 122.815792150 - -54.235642844 122.941221164 - -54.203006585 123.090350189 -} -85c70b53fffffff -{ - -42.325639568 -140.896341425 - -42.236888389 -140.871461288 - -42.180750040 -140.961165596 - -42.213319678 -141.075869314 - -42.302101772 -141.100990458 - -42.358283430 -141.011166987 -} -85f38227fffffff -{ - -81.877027412 171.568041797 - -81.958616516 171.398055097 - -82.015511659 171.848737189 - -81.989874498 172.469167378 - -81.907799206 172.628583381 - -81.851841154 172.178243138 -} -859ea837fffffff -{ - -12.171900813 166.127714136 - -12.093479993 166.096365716 - -12.074320258 166.008396989 - -12.133571630 165.951633404 - -12.212087154 165.982898543 - -12.231256621 166.071010759 -} -854441bbfffffff -{ - 31.330561973 -92.749929902 - 31.400750172 -92.681468848 - 31.489336409 -92.718218041 - 31.507752474 -92.823594885 - 31.437506911 -92.892105432 - 31.348902711 -92.855189819 -} -85539d07fffffff -{ - 18.112380528 36.632762212 - 18.020872515 36.618274977 - 17.966292543 36.693472125 - 18.003119393 36.783135863 - 18.094550851 36.797739589 - 18.149232076 36.722563250 -} -850d314bfffffff -{ - 73.760011856 -161.138636977 - 73.680307752 -161.320188411 - 73.597571185 -161.173038368 - 73.594192025 -160.846402724 - 73.673435616 -160.663675943 - 73.756518212 -160.808738772 -} -856850b3fffffff -{ - 7.431758722 122.902972393 - 7.339624660 122.919713964 - 7.309358767 123.006088966 - 7.371278632 123.075781486 - 7.463477741 123.059035706 - 7.493691962 122.972601551 -} -8560dd2ffffffff -{ - 16.947932647 67.640448158 - 17.026470335 67.613244740 - 17.036996125 67.535508790 - 16.969080644 67.485048592 - 16.890620463 67.512219890 - 16.879998270 67.589883554 -} -856ca25bfffffff -{ - 6.336379844 -102.929887335 - 6.409115556 -102.876141598 - 6.487940045 -102.914478474 - 6.493971422 -103.006647008 - 6.421143891 -103.060376182 - 6.342376857 -103.021953552 -} -85ced30bfffffff -{ - -35.861028118 -75.785442804 - -35.787639584 -75.744749649 - -35.714458430 -75.803164441 - -35.714512141 -75.902266346 - -35.787847543 -75.943184080 - -35.861182535 -75.884775691 -} -85f34923fffffff -{ - -70.257703781 -131.009603193 - -70.312132915 -130.839541189 - -70.285906669 -130.594546764 - -70.205379152 -130.521383519 - -70.151331253 -130.691580621 - -70.177430395 -130.934813683 -} -8596563bfffffff -{ - -10.802095244 24.171028605 - -10.705370738 24.178026677 - -10.651351944 24.096532515 - -10.694012272 24.008037369 - -10.790707678 24.000975900 - -10.844771930 24.082472923 -} -85dd7103fffffff -{ - -60.773341500 -27.048978221 - -60.697498874 -26.942588305 - -60.615389815 -27.028582203 - -60.608876054 -27.220322222 - -60.684441348 -27.327141657 - -60.766797600 -27.241795633 -} -8570c897fffffff -{ - -3.740579427 -166.034275526 - -3.821534108 -166.057280897 - -3.887291934 -165.995949458 - -3.872162497 -165.911555030 - -3.791198481 -165.888471607 - -3.725373156 -165.949860618 -} -850233b3fffffff -{ - 80.365974715 -116.180774319 - 80.344633741 -116.703389395 - 80.257764603 -116.876102874 - 80.192755745 -116.533088939 - 80.213882856 -116.018560475 - 80.300229748 -115.839038755 -} -850b466ffffffff -{ - 68.450872523 75.755386153 - 68.441492477 75.994922283 - 68.511984991 76.123289040 - 68.592167141 76.011311196 - 68.601523296 75.769980707 - 68.530721221 75.642431223 -} -85c54a8bfffffff -{ - -38.416988910 -26.741355027 - -38.499124863 -26.799011612 - -38.581057017 -26.738678079 - -38.580804006 -26.620497472 - -38.498560191 -26.562905829 - -38.416677301 -26.623429350 -} -8526de07fffffff -{ - 33.755843295 -101.274280296 - 33.831020249 -101.206699420 - 33.918069598 -101.252837341 - 33.929926345 -101.366697662 - 33.854695497 -101.434265993 - 33.767661845 -101.387986854 -} -8594d86bfffffff -{ - -20.390215610 130.654736355 - -20.305515277 130.654805441 - -20.270256545 130.577952621 - -20.319570609 130.501013459 - -20.404205202 130.500793333 - -20.439591562 130.577663294 -} -85997457fffffff -{ - -6.973017892 -4.701352412 - -7.044789414 -4.725874728 - -7.102318760 -4.666546461 - -7.087969702 -4.582705190 - -7.016149500 -4.558299742 - -6.958726932 -4.617618566 -} -85729237fffffff -{ - -6.439866993 133.117334895 - -6.532348458 133.133440942 - -6.566237888 133.223100708 - -6.507653475 133.296685965 - -6.415140001 133.280593044 - -6.381242890 133.190901671 -} -8558958ffffffff -{ - 7.249787561 1.955012244 - 7.170371259 1.966614210 - 7.131426734 2.042312370 - 7.171865830 2.106524996 - 7.251356772 2.095008121 - 7.290334023 2.019193406 -} -852c194bfffffff -{ - 38.093882307 48.095249031 - 38.025925343 48.173960499 - 38.043919983 48.282980837 - 38.129997503 48.313516508 - 38.198097964 48.234739155 - 38.179977203 48.125491717 +85311057fffffff +{ + 43.409434583 116.989677300 + 43.328343119 116.974091027 + 43.284426791 117.050664754 + 43.321457607 117.142790088 + 43.402420959 117.158613671 + 43.446481626 117.082075079 +} +85ed0db7fffffff +{ + -70.084715852 167.617323741 + -70.088454164 167.390484395 + -70.164949576 167.294380643 + -70.237856435 167.426367310 + -70.233968807 167.654859296 + -70.157324175 167.749704485 +} +85aaa617fffffff +{ + -29.352415314 66.061194261 + -29.447686222 66.078788292 + -29.482624892 66.182208667 + -29.422237289 66.267939366 + -29.326960267 66.250189307 + -29.292076855 66.146864470 +} +85e2d9cbfffffff +{ + -51.612977638 -123.321164374 + -51.565987674 -123.190457246 + -51.470641381 -123.191508612 + -51.422331754 -123.322752229 + -51.469218352 -123.453132957 + -51.564517624 -123.452596199 +} +85f286d3fffffff +{ + -87.190167143 -171.884763879 + -87.280450912 -171.854063771 + -87.319722966 -170.139724549 + -87.266418803 -168.522281726 + -87.176332115 -168.660503479 + -87.139277637 -170.309413995 +} +85f00bcbfffffff +{ + -77.140406558 59.461571592 + -77.082767913 59.144707766 + -77.112027672 58.780603798 + -77.199380338 58.729930049 + -77.257559990 59.048138901 + -77.227842679 59.415691141 +} +859f114ffffffff +{ + -19.056543038 173.324201730 + -18.975629525 173.285779019 + -18.960841456 173.194724083 + -19.027000460 173.141930122 + -19.108034434 173.180296627 + -19.122788892 173.271513545 +} +8500cd63fffffff +{ + 88.445419118 96.790035730 + 88.408565143 99.857370008 + 88.460552904 102.741335835 + 88.553720589 102.697523729 + 88.594465293 99.387193971 + 88.537892506 96.370439676 +} +8500580ffffffff +{ + 86.536243028 -10.051607360 + 86.624120141 -9.921391724 + 86.676337408 -11.223655040 + 86.638589349 -12.630784391 + 86.550460321 -12.691171494 + 86.500282272 -11.414738884 +} +8518180ffffffff +{ + 50.300162132 -14.169811440 + 50.236634900 -14.265817733 + 50.150236528 -14.222043445 + 50.127346950 -14.082603651 + 50.190787162 -13.986648017 + 50.277203810 -14.030080951 +} +85d5b16ffffffff +{ + -51.792985305 -148.280508878 + -51.713226837 -148.242508265 + -51.658280763 -148.341905936 + -51.683032543 -148.479369957 + -51.762778224 -148.517658236 + -51.817785058 -148.418195253 +} +850f962bfffffff +{ + 67.146182599 -98.970145904 + 67.068724670 -99.113238772 + 66.982159007 -99.016837692 + 66.972804861 -98.778303439 + 67.049999039 -98.634605982 + 67.136810920 -98.730040204 +} +8515b5affffffff +{ + 51.021514140 113.439681189 + 50.967511034 113.544235349 + 50.989119757 113.672458029 + 51.064893027 113.696540624 + 51.119118805 113.591873617 + 51.097348205 113.463236162 +} +85d11b57fffffff +{ + -42.762498410 9.021813778 + -42.854370240 9.003985546 + -42.909453716 9.099529322 + -42.872603477 9.212735587 + -42.780776772 9.230268628 + -42.725755031 9.134890610 +} +85b90ed7fffffff +{ + -36.052835464 132.992705969 + -35.959843376 132.989986751 + -35.915458214 132.893756833 + -35.963948972 132.800201432 + -36.056867024 132.802690932 + -36.101368460 132.898965391 +} +8505901bfffffff +{ + 67.489140596 119.798834187 + 67.419720108 119.970381886 + 67.440300182 120.211270419 + 67.530496423 120.282207201 + 67.600290669 120.110698570 + 67.579513951 119.868207478 +} +85f10403fffffff +{ + -83.650157197 127.728509270 + -83.692706684 127.029707927 + -83.777852361 127.050337491 + -83.820358384 127.790028537 + -83.776709129 128.498000685 + -83.691667993 128.457138137 +} +85631eabfffffff +{ + 14.299957965 56.108855865 + 14.223204622 56.084701146 + 14.172975002 56.132585961 + 14.199418506 56.204536470 + 14.276054205 56.228722492 + 14.326363966 56.180926832 +} +855776d3fffffff +{ + 21.906747148 -30.707323545 + 21.829700287 -30.762525437 + 21.746755309 -30.715913395 + 21.740755649 -30.614188320 + 21.817706952 -30.558896404 + 21.900753474 -30.605419269 +} +85011b83fffffff +{ + 75.204540881 34.694572430 + 75.252690238 34.952150560 + 75.336079393 34.892303402 + 75.371098611 34.571506920 + 75.322440511 34.313284597 + 75.239274017 34.376490848 +} +85954b3bfffffff +{ + -5.900407943 131.019761320 + -5.992915568 131.036031466 + -6.027067814 131.125184458 + -5.968712226 131.198105007 + -5.876163879 131.181844413 + -5.842011791 131.092653649 +} +8525aed7fffffff +{ + 46.040756037 91.369789885 + 45.948540996 91.398530497 + 45.920755781 91.524613679 + 45.985052171 91.622236569 + 46.077268623 91.593899037 + 46.105187524 91.467535174 +} +857b1173fffffff +{ + -4.647688076 50.249553247 + -4.558859031 50.246434795 + -4.512695651 50.171786402 + -4.555362634 50.100159831 + -4.644276644 50.103227783 + -4.690438715 50.177972866 +} +85dfa057fffffff +{ + -63.761958976 -47.906318059 + -63.705620301 -47.733293081 + -63.613014838 -47.757502986 + -63.576689548 -47.953420360 + -63.632717074 -48.126022593 + -63.725380047 -48.103131930 +} +8500408ffffffff +{ + 83.349722862 -7.003657442 + 83.433829353 -6.897064915 + 83.488875765 -7.525582004 + 83.458705871 -8.256362311 + 83.374337962 -8.345370231 + 83.320389336 -7.721298421 +} +85870e8ffffffff +{ + -12.573222400 88.268659278 + -12.659783993 88.297542735 + -12.682700333 88.386610998 + -12.619076853 88.446670007 + -12.532614295 88.417734763 + -12.509676197 88.328792122 +} +850c4103fffffff +{ + 59.582158729 -145.840164307 + 59.524489003 -145.964110958 + 59.449845024 -145.932687802 + 59.432802934 -145.778097505 + 59.490212767 -145.654288793 + 59.564923980 -145.684931016 +} +857cb59bfffffff +{ + -0.340335993 -14.594768162 + -0.266569436 -14.557911503 + -0.191347219 -14.597651882 + -0.189823901 -14.674321774 + -0.263625470 -14.711265081 + -0.338915375 -14.671451864 +} +85964447fffffff +{ + -13.511423240 21.391498978 + -13.415106437 21.399608053 + -13.360045029 21.318655932 + -13.401256980 21.229605933 + -13.497532048 21.221435670 + -13.552636963 21.302376529 +} +85b10eabfffffff +{ + -31.208944510 -121.408998111 + -31.158652319 -121.317924564 + -31.069530533 -121.321254463 + -31.030726454 -121.415400906 + -31.080903783 -121.506326971 + -31.169999846 -121.503254030 +} +85e4ec73fffffff +{ + -59.291187307 88.557988357 + -59.201328006 88.489705237 + -59.187001644 88.304568696 + -59.262428247 88.186839999 + -59.352426361 88.254385135 + -59.366859427 88.440399818 +} +85913387fffffff +{ + -17.181373058 -124.528777933 + -17.102080030 -124.524845965 + -17.049922829 -124.588929820 + -17.077011470 -124.657062275 + -17.156379211 -124.661109382 + -17.208583636 -124.596908799 +} +85f286a7fffffff +{ + -86.979115924 -153.454194146 + -87.064252592 -152.862066966 + -87.074977512 -151.106525424 + -86.999753269 -150.034961558 + -86.916206349 -150.693470706 + -86.906266455 -152.360137768 } -85e4c237fffffff +85f1940bfffffff { - -55.122250917 89.148579538 - -55.033854536 89.086398753 - -55.021334540 88.921388177 - -55.097115560 88.817860452 - -55.185645231 88.879467851 - -55.198260886 89.045178415 + -73.742183508 113.501423354 + -73.676069125 113.272094719 + -73.698335688 112.944789502 + -73.786909070 112.844179031 + -73.853425483 113.073432091 + -73.830965128 113.403385413 } -85176b87fffffff +85f2a9c7fffffff { - 62.723193579 178.048251414 - 62.634272983 178.003948501 - 62.575381048 178.151469347 - 62.605093407 178.343347597 - 62.693847795 178.388721073 - 62.753056686 178.241148947 -} -85ef16bbfffffff -{ - -83.581621162 -15.051161283 - -83.492654503 -14.735977548 - -83.418385311 -15.255710906 - -83.431939699 -16.085999204 - -83.520089567 -16.416503862 - -83.595508104 -15.901723064 -} -85ed2023fffffff -{ - -66.362546472 171.656914815 - -66.368562444 171.472148224 - -66.443433155 171.406658536 - -66.512380696 171.526901230 - -66.506195538 171.712741809 - -66.431232552 171.777261971 -} -85f12b5bfffffff -{ - -85.570643088 106.716418810 - -85.583260481 105.556978674 - -85.665292530 105.151380665 - -85.735749527 105.937655883 - -85.722448386 107.137783574 - -85.639390213 107.510046059 -} -859b425bfffffff -{ - -17.840509059 -178.679766426 - -17.761354662 -178.634651004 - -17.687996774 -178.678950221 - -17.693751992 -178.768237807 - -17.772791246 -178.813352750 - -17.846190336 -178.769180754 -} -8515502ffffffff -{ - 59.961242843 124.881189668 - 59.889860881 124.997508639 - 59.901137764 125.180720085 - 59.983904116 125.248572032 - 60.055579352 125.132451792 - 60.044194556 124.948277559 -} -85e94c97fffffff -{ - -57.493420205 -103.018954193 - -57.426315383 -102.894046871 - -57.336304239 -102.940075299 - -57.313302520 -103.110443292 - -57.380245961 -103.235393567 - -57.470352218 -103.189934536 -} -855b58c3fffffff -{ - 10.504560587 168.416126354 - 10.585640696 168.418228100 - 10.628219348 168.340915685 - 10.589619704 168.261568722 - 10.508536654 168.259607767 - 10.466056045 168.336852973 -} -853c1b77fffffff -{ - 25.128403848 88.756255955 - 25.214048136 88.727906815 - 25.232602710 88.628658005 - 25.165541918 88.557826080 - 25.079918687 88.586200426 - 25.061335134 88.685381632 -} -85e6dd57fffffff -{ - -56.611382133 9.595180278 - -56.529397991 9.588606667 - -56.485965965 9.448919141 - -56.524321360 9.315356692 - -56.606356155 9.321180379 - -56.649985486 9.461316844 -} -855014c7fffffff -{ - 19.464323980 -127.189090113 - 19.546318163 -127.149118470 - 19.623582990 -127.202673556 - 19.618759919 -127.296172756 - 19.536758083 -127.336010060 - 19.459586895 -127.282482647 -} -85f162bbfffffff -{ - -87.528543654 27.113020198 - -87.440453318 26.405905649 - -87.423225237 24.391805433 - -87.492997350 22.961515376 - -87.582850586 23.558810603 - -87.601222423 25.701202258 -} -85f28687fffffff -{ - -86.970831848 -161.346765766 - -87.059257722 -160.993052587 - -87.082542479 -159.290459324 - -87.015953807 -158.022235663 - -86.928563483 -158.457309772 - -86.906677587 -160.081433720 -} -85e9b673fffffff -{ - -75.917109250 -98.255063218 - -75.936171599 -97.889264380 - -75.866219112 -97.632363089 - -75.777745714 -97.741114969 - -75.758978913 -98.103113989 - -75.828392123 -98.360136734 -} -85249a4ffffffff -{ - 33.810703948 97.838584306 - 33.726198293 97.851956998 - 33.699976906 97.946346724 - 33.758116421 98.027493753 - 33.842596343 98.014381485 - 33.868962677 97.919861745 -} -85056d8ffffffff -{ - 85.710879100 -168.446310205 - 85.626597798 -168.986325522 - 85.547131292 -168.305591407 - 85.550415820 -167.103442711 - 85.633300900 -166.537698271 - 85.714301412 -167.198711877 -} -851fb3b7fffffff -{ - 48.050350941 4.196234053 - 47.967932673 4.211737504 - 47.942373169 4.328572775 - 47.999237441 4.430168377 - 48.081718348 4.414878075 - 48.107272453 4.297778615 -} -8580ae63fffffff -{ - -1.338554569 -36.670759673 - -1.255627162 -36.621535497 - -1.171052284 -36.668781243 - -1.169374640 -36.765261805 - -1.252297379 -36.814519523 - -1.336902433 -36.767263273 -} -85708a97fffffff -{ - -1.965884125 -173.653286078 - -2.044738696 -173.671862219 - -2.108506173 -173.613402875 - -2.093481306 -173.536287963 - -2.014592639 -173.517630801 - -1.950762868 -173.576169571 -} -85de84cbfffffff -{ - -55.521278144 -39.562188674 - -55.460149809 -39.446484828 - -55.376553479 -39.486956570 - -55.353961421 -39.642460941 - -55.414824614 -39.758143118 - -55.498544539 -39.718344252 -} -85f16edbfffffff -{ - -86.280128918 10.246781264 - -86.185999400 10.172304051 - -86.144072568 8.933495517 - -86.194695843 7.733742124 - -86.288994661 7.747137623 - -86.332543505 9.021622860 -} -85cc6313fffffff -{ - -47.274168177 72.857929702 - -47.188889216 72.841739621 - -47.161107622 72.722882825 - -47.218427925 72.619931244 - -47.303705703 72.635654337 - -47.331664724 72.754796229 -} -852b899bfffffff -{ - 43.187205363 -73.534704859 - 43.140401880 -73.643648099 - 43.051723055 -73.640756434 - 43.009845860 -73.529347638 - 43.056478165 -73.420608541 - 43.145158488 -73.423074057 -} -854b48bbfffffff -{ - 30.641415257 136.381861518 - 30.564045337 136.398532961 - 30.537367258 136.493689132 - 30.588077115 136.572197724 - 30.665443094 136.555547012 - 30.692103231 136.460366899 -} -85ef01d3fffffff -{ - -82.541081159 -51.881720891 - -82.489991316 -51.260800393 - -82.394295222 -51.299792546 - -82.349611968 -51.944041039 - -82.399786446 -52.558007468 - -82.495548377 -52.534701937 -} -8591225bfffffff -{ - -17.084386718 -125.669127757 - -17.004370411 -125.664192106 - -16.951301250 -125.728941218 - -16.978197811 -125.798741718 - -17.058285751 -125.803796115 - -17.111405543 -125.738931176 -} -85778437fffffff -{ - 0.494150645 150.791371091 - 0.400819039 150.804693930 - 0.367300816 150.890538462 - 0.427055865 150.963035321 - 0.520336385 150.949749768 - 0.553912985 150.863930038 -} -8523463bfffffff -{ - 40.172754503 -173.227732281 - 40.264259646 -173.202874922 - 40.328377940 -173.291799248 - 40.300898954 -173.405641905 - 40.209299397 -173.430295569 - 40.145273163 -173.341310731 -} -85032b2ffffffff -{ - 85.117193404 -69.897100522 - 85.165780951 -70.763857321 - 85.125179689 -71.740013617 - 85.037137301 -71.827917742 - 84.990004511 -70.972967643 - 85.029482106 -70.018132613 -} -85d36a6ffffffff -{ - -45.713504631 -122.309429652 - -45.663600707 -122.193246886 - -45.567539578 -122.195936024 - -45.521423057 -122.314395050 - -45.571220495 -122.430329228 - -45.667240672 -122.428052828 -} -85f0106ffffffff -{ - -76.615791571 80.361844209 - -76.527501459 80.266826770 - -76.498260244 79.891800794 - -76.557026350 79.608493820 - -76.645490096 79.699587634 - -76.675016386 80.077929375 -} -85de28cbfffffff -{ - -54.886957155 -57.278003017 - -54.845400346 -57.139045045 - -54.761070679 -57.131851589 - -54.718340279 -57.262902969 - -54.759698130 -57.401429099 - -54.843984765 -57.409335287 -} -85d221cffffffff -{ - -47.906036448 -112.140369754 - -47.845576893 -112.026931036 - -47.749349783 -112.048422540 - -47.713550823 -112.182910255 - -47.773868075 -112.296226250 - -47.870126300 -112.275177701 -} -85261187fffffff -{ - 42.878790932 -99.724867029 - 42.946197478 -99.650386011 - 43.027817898 -99.699158950 - 43.042022258 -99.822590607 - 42.974570244 -99.897071171 - 42.892959400 -99.848120907 -} -85dc7313fffffff -{ - -52.830795713 -24.896538771 - -52.904920367 -24.966356017 - -52.981674046 -24.888248747 - -52.984245014 -24.740050922 - -52.910026762 -24.670360992 - -52.833331173 -24.748740571 -} -853cb317fffffff -{ - 20.434385041 81.936132788 - 20.520597274 81.907456471 - 20.536724627 81.813470581 - 20.466694746 81.748237061 - 20.380530110 81.776916134 - 20.364347724 81.870826092 -} -85036277fffffff -{ - 82.240995580 -53.663407961 - 82.226798470 -54.320955514 - 82.200612293 -54.403050004 - 82.147276446 -54.519621402 - 82.082452398 -54.070385434 - 82.096835682 -53.447234068 - 82.176366512 -53.262756298 -} -8592ae33fffffff -{ - -12.633109868 -109.706425049 - -12.698347500 -109.760213736 - -12.782012359 -109.734219267 - -12.800511427 -109.654345767 - -12.735248091 -109.600469584 - -12.651511386 -109.626554392 -} -853e48a3fffffff -{ - 26.498952775 35.673981589 - 26.404337838 35.659092878 - 26.345924223 35.741329449 - 26.382037625 35.838437191 - 26.476579392 35.853465473 - 26.535080999 35.771246641 -} -85f25347fffffff -{ - -76.730839494 -112.285627245 - -76.770044671 -111.939224108 - -76.717523652 -111.608565116 - -76.626281687 -111.626407221 - -76.587574824 -111.970180007 - -76.639614919 -112.298737400 -} -85054eabfffffff -{ - 81.983556745 172.395360347 - 81.888516292 172.310699950 - 81.829463620 172.847740642 - 81.864534584 173.472598082 - 81.959291263 173.570386115 - 82.019269550 173.030269519 -} -85bf938bfffffff -{ - -28.884300914 164.742650972 - -28.794114553 164.706074993 - -28.775633889 164.599709673 - -28.847341113 164.529713780 - -28.937625080 164.566159779 - -28.956104249 164.672732018 -} -85012ed7fffffff -{ - 71.804188765 22.666405314 - 71.859721228 22.828303532 - 71.933413995 22.725655339 - 71.951261417 22.459515620 - 71.895341161 22.298137022 - 71.821961781 22.402367712 -} -85032d23fffffff -{ - 85.644461196 -44.792022902 - 85.719638292 -45.386480712 - 85.718037502 -46.617204317 - 85.641252119 -47.209657924 - 85.567588616 -46.594358900 - 85.569197241 -45.406421703 -} -850a25a3fffffff -{ - 65.802322855 80.112783624 - 65.720612881 80.191716705 - 65.703604442 80.409936437 - 65.768223791 80.550209712 - 65.850049013 80.472158694 - 65.867140012 80.252948813 -} -857cc4a3fffffff -{ - 5.632811940 -21.835225749 - 5.707083087 -21.793507914 - 5.786110967 -21.836665678 - 5.790939170 -21.921601469 - 5.716660368 -21.963397422 - 5.637560976 -21.920179524 -} -85935d83fffffff -{ - -9.800192640 -98.121392775 - -9.873633529 -98.180097183 - -9.961906835 -98.146916616 - -9.976772271 -98.054952922 - -9.903294738 -97.996195228 - -9.814988444 -98.029454430 -} -8512ced7fffffff -{ - 50.480893836 -115.365327329 - 50.403211557 -115.413740462 - 50.331473061 -115.330168558 - 50.337207326 -115.198227221 - 50.414799881 -115.149385400 - 50.486748183 -115.232912512 -} -859a0443fffffff -{ - -15.151385944 -173.137489877 - -15.069946779 -173.095070541 - -14.997990444 -173.144574661 - -15.007409773 -173.236392660 - -15.088739024 -173.278839363 - -15.160758803 -173.229440899 -} -85a01c8bfffffff -{ - -17.628100408 -135.867720919 - -17.542010394 -135.853163030 - -17.481358073 -135.922614476 - -17.506719942 -136.006718144 - -17.592847782 -136.021420103 - -17.653576025 -135.951874317 -} -85835c57fffffff -{ - -9.043157259 5.739000538 - -8.954496858 5.751501566 - -8.901440442 5.686121211 - -8.936982854 5.608310669 - -9.025543034 5.595780680 - -9.078660998 5.661090114 -} -85049a2ffffffff -{ - 63.018974017 145.887061672 - 62.930538682 145.953710920 - 62.911831171 146.158841072 - 62.981430129 146.298499997 - 63.070059240 146.232883953 - 63.088896189 146.026571391 -} -850ae017fffffff -{ - 65.901551748 100.457812386 - 65.856660298 100.657417505 - 65.902366492 100.846318886 - 65.993295209 100.836200826 - 66.038442598 100.635663365 - 65.992404235 100.446177667 -} -85eacd53fffffff -{ - -71.767407642 -175.394819896 - -71.839778360 -175.406689170 - -71.872791200 -175.184046766 - -71.833059592 -174.950485292 - -71.760638339 -174.940690805 - -71.727997716 -175.162382214 -} -85ab12cffffffff -{ - -21.699406523 63.025673629 - -21.794665272 63.039765909 - -21.830258649 63.135072390 - -21.770517005 63.216217669 - -21.675240519 63.201984585 - -21.639723311 63.106746975 -} -85e5b0dbfffffff -{ - -53.525468825 120.471712529 - -53.462291835 120.351580437 - -53.491368121 120.201773001 - -53.583789023 120.171600170 - -53.647179206 120.291884692 - -53.617934833 120.442190521 -} -85475e7bfffffff -{ - 28.005298514 -164.846867948 - 27.918190462 -164.874022118 - 27.858297220 -164.803303624 - 27.885511442 -164.705360757 - 27.972664165 -164.678105443 - 28.032558035 -164.748894059 -} -85229d33fffffff -{ - 52.479384783 -160.370267624 - 52.554878872 -160.325665465 - 52.624624392 -160.408024100 - 52.618831414 -160.535223738 - 52.543235479 -160.579678705 - 52.473534368 -160.497082040 -} -85451357fffffff -{ - 18.863315102 -83.528562838 - 18.930027425 -83.467796428 - 19.013926470 -83.491675516 - 19.031150451 -83.576460736 - 18.964363380 -83.637308321 - 18.880427152 -83.613289536 -} -859ea58ffffffff -{ - -13.349248148 169.346600455 - -13.270945023 169.312775202 - -13.253115142 169.225030940 - -13.313594144 169.170965435 - -13.392002154 169.204721083 - -13.409826265 169.292612058 + -83.266791315 -127.928131475 + -83.328734050 -127.372385894 + -83.299154943 -126.630827547 + -83.208170991 -126.460545329 + -83.147301654 -127.015268653 + -83.176352236 -127.741482296 } -85032577fffffff -{ - 88.289310026 -13.052204400 - 88.379074115 -12.946057050 - 88.426755717 -15.820873767 - 88.380570014 -18.649060152 - 88.290952388 -18.453468456 - 88.247160011 -15.731232479 -} -859e5827fffffff -{ - -16.295211403 156.957467450 - -16.210117604 156.932003083 - -16.186728670 156.838896504 - -16.248384406 156.771111878 - -16.333543368 156.796444158 - -16.356981525 156.889693353 -} -8542651bfffffff -{ - 33.258009217 68.091664860 - 33.177080197 68.147600570 - 33.175420002 68.260912191 - 33.254696108 68.318568247 - 33.335757373 68.262767727 - 33.337410276 68.149175391 -} -85e70057fffffff -{ - -69.246169035 36.807954745 - -69.167378051 36.684221838 - -69.160853063 36.436637259 - -69.233167722 36.310875516 - -69.312311639 36.433668501 - -69.318787804 36.683172901 -} -85236293fffffff -{ - 37.463184810 -173.422594139 - 37.555456645 -173.398810026 - 37.618967516 -173.484885413 - 37.590110093 -173.594799917 - 37.497742118 -173.618393112 - 37.434327636 -173.532263133 -} -8521b60ffffffff -{ - 40.261558323 56.678053327 - 40.185686455 56.753438276 - 40.196570586 56.875050111 - 40.283411019 56.921588067 - 40.359435547 56.846233152 - 40.348466822 56.724309631 -} -855c8993fffffff -{ - 6.194164717 -153.650119867 - 6.103259629 -153.680450236 - 6.031434884 -153.615780601 - 6.050464339 -153.520775605 - 6.141349516 -153.490385381 - 6.213225204 -153.555059881 -} -8573480ffffffff -{ - 11.541299736 144.051975058 - 11.446740065 144.066966979 - 11.411098816 144.157979798 - 11.469999744 144.233996824 - 11.564529945 144.219036201 - 11.600188747 144.128027199 -} -851319a3fffffff -{ - 63.550567832 -120.649394602 - 63.463554448 -120.702833788 - 63.396242268 -120.569558334 - 63.415696119 -120.382735132 - 63.502649629 -120.328282068 - 63.570209765 -120.461663516 -} -8500907bfffffff -{ - 74.457593514 83.227386877 - 74.438683676 83.563131865 - 74.507778023 83.783060002 - 74.596258543 83.666517877 - 74.615280619 83.327334767 - 74.545708897 83.108154347 -} -851023c7fffffff -{ - 61.212839612 41.914402096 - 61.159893527 42.047191363 - 61.194488212 42.212741181 - 61.282178518 42.245960585 - 61.335256013 42.112844605 - 61.300511377 41.946835483 -} -855ba8cbfffffff -{ - 11.914182111 178.496820731 - 11.995844476 178.507958472 - 12.041518868 178.436084887 - 12.005416634 178.353086784 - 11.923705806 178.342080357 - 11.878145560 178.413940601 -} -854b0bb3fffffff -{ - 28.627121956 128.812687552 - 28.549032295 128.829928678 - 28.526884742 128.922859421 - 28.582863008 128.998597426 - 28.660966510 128.981362688 - 28.683077977 128.888383478 -} -85f11b53fffffff -{ - -81.060587000 95.282528815 - -80.983585442 95.016489437 - -80.976597991 94.437156016 - -81.046519893 94.115024161 - -81.124085562 94.375409081 - -81.131166497 94.963678065 -} -85ed2167fffffff -{ - -67.245973980 171.427065002 - -67.252360629 171.234530546 - -67.327878793 171.165489144 - -67.397108151 171.290022507 - -67.390550200 171.483725141 - -67.314934748 171.551721981 -} -852c2117fffffff -{ - 42.242207822 41.833787913 - 42.156095087 41.810752152 - 42.093140886 41.899329932 - 42.116245155 42.010863661 - 42.202280259 42.034056835 - 42.265288794 41.945559254 -} -85a3624ffffffff -{ - -11.909650908 51.851087623 - -11.819594837 51.847308074 - -11.776711230 51.771600569 - -11.823908731 51.699567840 - -11.914059733 51.703296443 - -11.956918292 51.779108791 -} -8552d26ffffffff -{ - 9.485514103 42.741898313 - 9.403430089 42.724714366 - 9.379518555 42.756242101 - 9.356150343 42.793602832 - 9.389790333 42.867912977 - 9.471786950 42.885176034 - 9.519700870 42.822191576 -} -85b119a3fffffff -{ - -30.154757999 -119.701689025 - -30.103412047 -119.612703603 - -30.014957355 -119.618318481 - -29.977862554 -119.712667818 - -30.029087551 -119.801522631 - -30.117528094 -119.796158716 -} -85d0e2dbfffffff -{ - -50.333842896 15.004287648 - -50.420690811 14.993813905 - -50.463981166 15.100921888 - -50.420388051 15.218239484 - -50.333605514 15.228359614 - -50.290350558 15.121515532 -} -85dc2eb3fffffff -{ - -56.724109026 -20.278384847 - -56.647166040 -20.202593664 - -56.573056014 -20.293707094 - -56.575635140 -20.460292313 - -56.652365157 -20.536575201 - -56.726729158 -20.445783843 -} -85d3a2affffffff -{ - -54.107112554 -101.207547098 - -54.037317743 -101.094925729 - -53.946198136 -101.140982385 - -53.924770519 -101.299196732 - -53.994413024 -101.411893524 - -54.085635235 -101.366301940 -} -856c6997fffffff -{ - 3.110668178 -85.130277220 - 3.036317807 -85.187260054 - 2.951388674 -85.149846676 - 2.940844091 -85.055413734 - 3.015246092 -84.998438620 - 3.100141014 -85.035888595 -} -85ecf00bfffffff -{ - -68.470145617 133.364112356 - -68.426156321 133.147457663 - -68.475653063 132.934076473 - -68.569429805 132.936709367 - -68.613636737 133.154454226 - -68.563848194 133.368474198 -} -85830513fffffff -{ - -13.001200985 12.041076298 - -12.908417335 12.052217722 - -12.852590941 11.978822162 - -12.889496496 11.894338420 - -12.982199364 11.883153118 - -13.038077475 11.956495349 -} -85648ec3fffffff -{ - 18.295513546 96.912034113 - 18.387798158 96.886286505 - 18.413117566 96.788315504 - 18.346146714 96.716136576 - 18.253862276 96.741932589 - 18.228548458 96.839859244 -} -85e0258bfffffff -{ - -63.148613262 60.546185711 - -63.057251145 60.561158711 - -63.007223234 60.404117852 - -63.048301077 60.231861515 - -63.139541369 60.215847832 - -63.189826227 60.373129367 -} -852b104bfffffff -{ - 47.675704737 -68.928665352 - 47.632120620 -69.053365003 - 47.539918883 -69.059955147 - 47.491338335 -68.942359536 - 47.534763613 -68.817978323 - 47.626927880 -68.810874559 -} -85666a9bfffffff -{ - 4.690979691 -66.729640553 - 4.622201388 -66.777497365 - 4.541209142 -66.738980573 - 4.529078239 -66.652635121 - 4.597885319 -66.604857060 - 4.678794568 -66.643345612 -} -85f209bbfffffff -{ - -77.034606729 -125.677989574 - -77.089989062 -125.383231159 - -77.056428495 -125.008159912 - -76.967785134 -124.931739547 - -76.912978524 -125.225909493 - -76.946242198 -125.597110440 -} -85ce9a07fffffff -{ - -37.686425717 -69.612957881 - -37.612417321 -69.582032900 - -37.544656955 -69.645306113 - -37.550761942 -69.739551801 - -37.624752545 -69.770722795 - -37.692656140 -69.707402325 -} -85271a8ffffffff -{ - 48.256734113 -99.175999052 - 48.186473977 -99.257000670 - 48.102350729 -99.201823629 - 48.088308392 -99.065952932 - 48.158386002 -98.984751634 - 48.242688444 -99.039619391 -} -85052aa7fffffff -{ - 81.063496858 114.481199661 - 81.000914954 114.942467602 - 81.031996685 115.523382227 - 81.126199668 115.651785031 - 81.189630390 115.188800737 - 81.158002462 114.599056187 -} -850af66bfffffff -{ - 61.742382525 102.066571109 - 61.696078305 102.233450339 - 61.737215802 102.396436209 - 61.824942396 102.393018082 - 61.871482411 102.225518763 - 61.830059211 102.062058143 -} -8500e913fffffff -{ - 87.537226907 25.243542639 - 87.604704332 26.643585151 - 87.693025030 25.920871383 - 87.711835501 23.678346074 - 87.641359218 22.303901260 - 87.555120861 23.140646292 -} -85cb682bfffffff -{ - -31.280059751 61.939292841 - -31.374520588 61.953579518 - -31.412535355 62.055829109 - -31.356024303 62.143718046 - -31.261536320 62.129266022 - -31.223586431 62.027090359 -} -85f29573fffffff -{ - -88.691919668 -174.323081937 - -88.783288925 -174.438137470 - -88.825596034 -170.597216785 - -88.771284009 -166.957031749 - -88.680284315 -167.362993548 - -88.642863614 -170.895095162 -} -850da113fffffff -{ - 70.464088092 -171.725213222 - 70.376600123 -171.833225877 - 70.303329779 -171.665553059 - 70.317165930 -171.390578216 - 70.404326155 -171.281005457 - 70.477978414 -171.447955218 -} -85c04d37fffffff -{ - -37.951593651 3.685171458 - -38.045027282 3.661270153 - -38.107638461 3.749834329 - -38.076732566 3.862198019 - -37.983315099 3.885839274 - -37.920787215 3.797377046 -} -8502ccd3fffffff -{ - 70.990891802 -101.943023488 - 70.911620870 -102.099940827 - 70.829088250 -101.974971751 - 70.825530522 -101.694230824 - 70.904513199 -101.536268962 - 70.987341801 -101.660080597 +850c4c1bfffffff +{ + 59.029958974 -144.746450294 + 58.973827876 -144.869508750 + 58.899853841 -144.841904754 + 58.881953850 -144.691996314 + 58.937833345 -144.569099223 + 59.011863841 -144.595948011 +} +85b78b23fffffff +{ + -29.427859180 -88.997988155 + -29.494621976 -89.061699378 + -29.575263591 -89.021631691 + -29.589161272 -88.917791704 + -29.522403116 -88.854067609 + -29.441742670 -88.894196207 +} +8521004bfffffff +{ + 49.420937700 60.474292226 + 49.342432907 60.558720172 + 49.351440020 60.705016811 + 49.439013609 60.767345760 + 49.517669357 60.683025613 + 49.508600426 60.536267558 +} +8555843bfffffff +{ + 22.388098305 -19.358283724 + 22.315081140 -19.422823666 + 22.229130986 -19.386573373 + 22.216140833 -19.285933266 + 22.289043495 -19.221381303 + 22.375050716 -19.257481206 +} +85055ba7fffffff +{ + 79.141617651 168.727735515 + 79.045155479 168.696035617 + 78.991001091 169.116256758 + 79.032643037 169.570872523 + 79.128976867 169.610102162 + 79.183802384 169.187205254 +} +8581239bfffffff +{ + -15.022431327 -43.222606555 + -14.942004417 -43.171236964 + -14.859215272 -43.219018336 + -14.856866468 -43.318151428 + -14.937301700 -43.369526199 + -15.020077410 -43.321762848 +} +85354367fffffff +{ + 35.881198645 -16.815663573 + 35.808052443 -16.892676685 + 35.716816948 -16.853516830 + 35.698697027 -16.737561081 + 35.771744134 -16.660556504 + 35.863010142 -16.699498776 +} +85619d9bfffffff +{ + 14.432416540 81.006368536 + 14.521216143 80.978212868 + 14.539721640 80.886746918 + 14.469484604 80.823510573 + 14.380747370 80.851666157 + 14.362184787 80.943058281 +} +8520cd2bfffffff +{ + 42.207309937 85.511429948 + 42.116410629 85.548511703 + 42.096062901 85.672360195 + 42.166508838 85.759426596 + 42.257450352 85.722678921 + 42.277903932 85.598530237 +} +858514c7fffffff +{ + -0.919275980 56.648703758 + -0.996850295 56.656209020 + -1.022311265 56.732342520 + -0.970105718 56.800946001 + -0.892513105 56.793340497 + -0.867144231 56.717231769 +} +853421dbfffffff +{ + 37.069698261 -23.527287497 + 36.991978612 -23.600319602 + 36.902548193 -23.552420888 + 36.890775506 -23.431673791 + 36.968401436 -23.358582776 + 37.057893701 -23.406297275 +} +850b2103fffffff +{ + 62.735780589 66.721513703 + 62.659554018 66.824645213 + 62.661691830 67.027460112 + 62.740071108 67.128041358 + 62.816462665 67.025307040 + 62.814309909 66.821591016 +} +85f29d23fffffff +{ + -86.746928911 -93.407018871 + -86.761657663 -91.790595032 + -86.686979429 -90.825783284 + -86.599736471 -91.457878356 + -86.585648525 -92.999903027 + -86.658186141 -93.981965991 +} +85119d1bfffffff +{ + 53.720131406 39.926807693 + 53.664472081 40.037611561 + 53.698384740 40.171056491 + 53.788110966 40.193977741 + 53.843880966 40.082920042 + 53.809813786 39.949194821 +} +850e8c8ffffffff +{ + 57.498379510 -89.639534806 + 57.430197211 -89.765276718 + 57.336952766 -89.718061086 + 57.311744787 -89.545807016 + 57.379690698 -89.420008968 + 57.473080605 -89.466518906 +} +85f08b7bfffffff +{ + -70.237381370 71.453440273 + -70.144459933 71.426031953 + -70.103937167 71.183304377 + -70.156057051 70.966847723 + -70.248974602 70.992237373 + -70.289777448 71.236103568 +} +85a98457fffffff +{ + -29.006808269 -42.189645372 + -28.937698276 -42.137237880 + -28.866850805 -42.186226062 + -28.865133749 -42.287607813 + -28.934264509 -42.340025712 + -29.005091553 -42.291051615 +} +85aac403fffffff +{ + -29.644241102 77.045719545 + -29.737668907 77.072042181 + -29.763912482 77.178606505 + -29.696718770 77.258701422 + -29.603337346 77.232254462 + -29.577103175 77.125836671 +} +85a2e0cffffffff +{ + -23.742065705 52.838480522 + -23.834855723 52.844303141 + -23.875642209 52.931318617 + -23.823542648 53.012496913 + -23.730683851 53.006535959 + -23.689993333 52.919535113 +} +858890c3fffffff +{ + -1.667333860 -144.823766311 + -1.753053735 -144.855982574 + -1.820883982 -144.796419223 + -1.803052028 -144.704677120 + -1.717391534 -144.672432275 + -1.649503591 -144.731957984 +} +85f0cb43fffffff +{ + -69.697645010 50.578767439 + -69.610588328 50.638065669 + -69.548264238 50.469200086 + -69.572712529 50.241244375 + -69.659547562 50.180538822 + -69.722156477 50.349189258 +} +850cf2c7fffffff +{ + 58.924624326 -165.621442554 + 58.848762127 -165.703275523 + 58.780834745 -165.616162477 + 58.788543407 -165.447648354 + 58.864153736 -165.365382813 + 58.932307194 -165.452061008 +} +85ec7383fffffff +{ + -74.964703853 145.971034753 + -74.941948813 145.655623028 + -75.005990497 145.412091856 + -75.093169727 145.484158535 + -75.116071816 145.802518649 + -75.051646348 146.045846971 } -85f3832bfffffff +85032637fffffff { - -82.137875849 177.337276029 - -82.221868942 177.225168918 - -82.272420694 177.736134100 - -82.238021011 178.356314492 - -82.153696913 178.456067665 - -82.104095365 177.948066373 + 89.740561900 17.249948165 + 89.811256725 32.170528315 + 89.900796050 20.229380089 + 89.872827683 -25.830927255 + 89.782701969 -21.291239366 + 89.730608804 -2.712692205 } -8500cc87fffffff +852202bbfffffff +{ + 46.248501879 -166.490170135 + 46.333056573 -166.455722254 + 46.400958415 -166.541244901 + 46.384236690 -166.661359191 + 46.299576381 -166.695626720 + 46.231743377 -166.609960949 +} +854ca9c3fffffff +{ + 21.776451200 -70.236892680 + 21.725518817 -70.284298708 + 21.659658589 -70.247636349 + 21.644786892 -70.163583192 + 21.695763683 -70.116238454 + 21.761567769 -70.152885496 +} +85eee8a3fffffff +{ + -66.872272098 -39.649429924 + -66.805247463 -39.474257940 + -66.712897498 -39.535249963 + -66.687401320 -39.769879860 + -66.754058999 -39.944995814 + -66.846578831 -39.885543593 +} +8500ad5bfffffff +{ + 79.219356135 61.005627705 + 79.236209057 61.473696372 + 79.322723233 61.617637885 + 79.392718492 61.287456028 + 79.375504449 60.812834755 + 79.288659706 60.675003771 +} +850441affffffff +{ + 75.223679797 -176.332810388 + 75.132297546 -176.448689891 + 75.061226497 -176.203395095 + 75.081021762 -175.842836451 + 75.172050747 -175.723767861 + 75.243639204 -175.968421040 +} +85f2f15bfffffff +{ + -81.823685759 -108.311520176 + -81.860005508 -107.722775776 + -81.802362160 -107.209140260 + -81.709238086 -107.288098795 + -81.673611796 -107.868389470 + -81.730424506 -108.378124499 +} +85ef2267fffffff +{ + -84.546223764 -54.454736180 + -84.499334505 -53.590722905 + -84.404454025 -53.604594881 + -84.356467207 -54.453705793 + -84.402173566 -55.302759643 + -84.497029200 -55.317642452 +} +8566d55bfffffff +{ + 1.820344389 -78.098654492 + 1.745858784 -78.153717454 + 1.660341439 -78.114672500 + 1.649364083 -78.020553540 + 1.723889496 -77.965530853 + 1.809352452 -78.004586715 +} +853b296ffffffff +{ + 37.734039789 -46.998658737 + 37.648323037 -47.042841451 + 37.574254484 -46.975727422 + 37.585799106 -46.864405757 + 37.671507572 -46.819991460 + 37.745679805 -46.887130084 +} +85f12dabfffffff +{ + -87.562987193 131.312745534 + -87.612113343 129.500206246 + -87.701068528 129.654087315 + -87.740335620 131.770136231 + -87.688121677 133.632465430 + -87.599830821 133.330818753 +} +852f0103fffffff +{ + 33.453472408 148.604427679 + 33.545243783 148.585292431 + 33.577841265 148.484587557 + 33.518666293 148.403237765 + 33.426999306 148.422543842 + 33.394402856 148.523029217 +} +85f3204bfffffff +{ + -72.973989588 -170.686808996 + -73.048466417 -170.676311338 + -73.077000876 -170.423195395 + -73.030686049 -170.182045187 + -72.956223022 -170.194977372 + -72.928059239 -170.446627698 +} +85c01eaffffffff +{ + -37.321039352 -12.285635822 + -37.411858257 -12.329250586 + -37.487324991 -12.251880052 + -37.471879821 -12.130834562 + -37.380992640 -12.087407822 + -37.305618826 -12.164838051 +} +8503b603fffffff +{ + 79.018929157 -172.059426586 + 78.930263414 -172.247873170 + 78.854140751 -171.949317972 + 78.866035304 -171.464462307 + 78.954174093 -171.271093031 + 79.030946847 -171.567433509 +} +85e34253fffffff { - 87.405921189 69.007713634 - 87.412885128 71.022455750 - 87.496759271 71.976155434 - 87.575904707 70.835366237 - 87.568471320 68.686723304 - 87.482384046 67.818391229 + -58.802563814 -145.921043820 + -58.787897081 -145.770777195 + -58.705823755 -145.724262691 + -58.638569973 -145.827621995 + -58.653270714 -145.977238152 + -58.735191186 -146.024143635 } -854473abfffffff +85e24e53fffffff { - 29.227202156 -89.826222044 - 29.296062785 -89.758889010 - 29.384600990 -89.791884805 - 29.404307450 -89.892379256 - 29.335387825 -89.959777839 - 29.246820801 -89.926616546 + -51.406492138 -138.227938470 + -51.377725777 -138.097584772 + -51.288086153 -138.070987566 + -51.227344046 -138.174363633 + -51.256098373 -138.304265695 + -51.345606722 -138.331242325 } -85f293d7fffffff +85c03663fffffff { - -89.635134246 84.352593518 - -89.604161690 71.223218362 - -89.649238774 59.023138660 - -89.742297046 56.541211113 - -89.790452443 76.048158603 - -89.722562839 90.522944647 + -32.634146074 -15.103743205 + -32.723992440 -15.147806405 + -32.800903468 -15.077520062 + -32.787874154 -14.963091570 + -32.697943596 -14.919177008 + -32.621126498 -14.989541860 } -856a2597fffffff -{ - 11.717120945 26.383628022 - 11.627775988 26.377464234 - 11.579299059 26.456542567 - 11.620071166 26.541822540 - 11.709391644 26.548113087 - 11.757964613 26.468996962 -} -850f6587fffffff -{ - 61.290481781 -51.929371594 - 61.269896394 -52.118836799 - 61.179012546 -52.177767529 - 61.108904535 -52.048005844 - 61.129441115 -51.859523212 - 61.220134225 -51.799823100 -} -850d7133fffffff -{ - 68.528457347 -141.518321590 - 68.471713750 -141.709847789 - 68.386784051 -141.682163082 - 68.358564132 -141.464672736 - 68.414973037 -141.273695309 - 68.499935302 -141.299656848 -} -855e4607fffffff -{ - 14.353087842 -60.979350624 - 14.427349495 -60.933437354 - 14.496100225 -60.972522734 - 14.490598382 -61.057449335 - 14.416408596 -61.103302778 - 14.347648840 -61.064289507 -} -85042aa3fffffff -{ - 76.798561453 151.796258563 - 76.703627743 151.890335433 - 76.674368923 152.293644276 - 76.739694490 152.607147297 - 76.834872883 152.517881116 - 76.864484103 152.110274639 -} -85eee2c7fffffff -{ - -69.474595774 -31.121298002 - -69.397955873 -30.953715342 - -69.308826807 -31.059677075 - -69.296047822 -31.331669989 - -69.372297081 -31.499831145 - -69.461715348 -31.395432078 -} -85761e0bfffffff -{ - -2.256931650 158.275470498 - -2.345651809 158.286801076 - -2.376248944 158.365547187 - -2.318206383 158.432919832 - -2.229559062 158.421629511 - -2.198881448 158.342926283 -} -85f3365bfffffff -{ - -74.501979393 177.828357211 - -74.582928268 177.763799258 - -74.625984313 178.009577582 - -74.593767637 178.305806483 - -74.518805052 178.354098603 - -74.476222665 178.109025986 - -74.492224871 177.962140255 -} -8500400ffffffff -{ - 83.742162670 -7.211428750 - 83.826735785 -7.100758165 - 83.881707181 -7.772955182 - 83.850926927 -8.550736139 - 83.766084723 -8.641392346 - 83.712278147 -7.974418108 -} -85f17613fffffff -{ - -86.692962231 91.662622975 - -86.681865575 90.092418017 - -86.753529907 89.166722941 - -86.838378823 89.834858096 - -86.849779730 91.483267853 - -86.776013507 92.382840093 -} -850321b7fffffff -{ - 87.693552148 -29.661354168 - 87.779693816 -30.252560586 - 87.801660217 -32.594420511 - 87.735881608 -34.198113506 - 87.651559213 -33.472993510 - 87.631122057 -31.272540481 -} -850051c3fffffff -{ - 84.710021219 12.559703651 - 84.786672256 13.013916586 - 84.863984987 12.472310248 - 84.863316983 11.463101867 - 84.785549701 11.026034477 - 84.709563266 11.580431537 -} -8598b0b7fffffff -{ - -16.672571264 -15.529108342 - -16.754368042 -15.566287005 - -16.823133987 -15.507913479 - -16.809995764 -15.412303519 - -16.728107122 -15.375226524 - -16.659448534 -15.433657563 -} -85d76b67fffffff -{ - -49.654564180 24.966005169 - -49.737551355 24.970579248 - -49.770442829 25.071995238 - -49.720357203 25.168534519 - -49.637472499 25.163682328 - -49.604570888 25.062568489 -} -853d2dbbfffffff -{ - 37.383223034 81.051753151 - 37.295240032 81.093006079 - 37.280834659 81.210558755 - 37.354333869 81.287142544 - 37.442389044 81.246152307 - 37.456872995 81.128315053 -} -85c85d33fffffff -{ - -43.480837646 98.307191779 - -43.404194951 98.243362762 - -43.404962868 98.115350376 - -43.482363467 98.050735120 - -43.559172220 98.114336558 - -43.558414340 98.242781882 -} -85bc3593fffffff -{ - -36.211784771 35.268740685 - -36.129428934 35.271675315 - -36.089449362 35.177940736 - -36.131833744 35.081199877 - -36.214207128 35.078178638 - -36.254178678 35.171984877 -} -85e12a07fffffff -{ - -66.814258358 64.475742152 - -66.721495807 64.478443489 - -66.673741463 64.286681132 - -66.718474245 64.091702714 - -66.811148683 64.087554850 - -66.859179335 64.279830353 -} -85268b3bfffffff -{ - 36.748477507 -104.605702607 - 36.824078402 -104.538008941 - 36.908623731 -104.588447234 - 36.917542552 -104.706709130 - 36.841894646 -104.774361711 - 36.757374969 -104.723793845 -} -85f28273fffffff -{ - -88.266201492 -133.973618405 - -88.336390277 -131.983377328 - -88.313746765 -128.957685401 - -88.222699634 -128.184272162 - -88.156573613 -130.196551091 - -88.177547226 -132.973370472 -} -85e16823fffffff -{ - -66.110331661 44.726627160 - -66.040763323 44.597322128 - -66.044067219 44.389920625 - -66.117071978 44.310508889 - -66.186971479 44.439494814 - -66.183534516 44.648216962 -} -8579061bfffffff -{ - 8.165102571 -136.852221779 - 8.077389144 -136.887036676 - 8.004711775 -136.830276412 - 8.019719447 -136.738776285 - 8.107356320 -136.703959529 - 8.180062061 -136.760644632 -} -855128a3fffffff -{ - 11.480240896 -132.702146383 - 11.394569474 -132.737556842 - 11.321207387 -132.683535665 - 11.333504254 -132.594194699 - 11.419094811 -132.558796810 - 11.492469343 -132.612727205 -} -85eaec13fffffff -{ - -69.467068888 -169.899983748 - -69.536504177 -169.888370519 - -69.561338374 -169.683049016 - -69.516439786 -169.490328426 - -69.447025711 -169.503520101 - -69.422487830 -169.707855491 -} -85527613fffffff -{ - 19.588791512 47.457152092 - 19.502456566 47.435506096 - 19.445883010 47.498542429 - 19.475554776 47.583149077 - 19.561776459 47.604869263 - 19.618439611 47.541908803 -} -851c3377fffffff -{ - 50.984207862 -145.482860722 - 50.933429059 -145.574951135 - 50.870936594 -145.552543506 - 50.859166966 -145.438473521 - 50.909750831 -145.346463938 - 50.972298903 -145.368442952 -} -85f2d033fffffff -{ - -82.244284362 -89.457716561 - -82.251934638 -88.769635260 - -82.173049874 -88.387007599 - -82.087420307 -88.687519803 - -82.079969575 -89.361580585 - -82.157951696 -89.748959847 -} -854f9023fffffff -{ - 22.753569372 162.240843769 - 22.846275711 162.236914875 - 22.891256662 162.146318284 - 22.843452365 162.059775615 - 22.750779962 162.063883919 - 22.705877778 162.154355567 +85f14343fffffff +{ + -83.875549828 39.350819784 + -83.795512547 38.895412949 + -83.797602628 38.050058467 + -83.879865858 37.637719969 + -83.960993200 38.083306081 + -83.958765103 38.951449199 +} +85c54b6bfffffff +{ + -39.808358059 -25.815119772 + -39.890699091 -25.873161721 + -39.972393652 -25.810349427 + -39.971695550 -25.689304085 + -39.889249645 -25.631338730 + -39.807606757 -25.694341581 +} +852d6303fffffff +{ + 48.204485626 38.820337199 + 48.147545468 38.919067481 + 48.179529969 39.035694304 + 48.268611767 39.053796442 + 48.325658377 38.954853802 + 48.293516516 38.838021368 +} +85032417fffffff +{ + 88.619405886 33.217538826 + 88.677791284 36.157826609 + 88.770307584 35.502066829 + 88.802251073 31.418010310 + 88.738268502 28.426743913 + 88.648218866 29.545739144 +} +85a88883fffffff +{ + -18.849494391 -44.505106039 + -18.771865314 -44.453366744 + -18.691119376 -44.501197407 + -18.688023828 -44.600743642 + -18.765664659 -44.652482163 + -18.846389283 -44.604675375 +} +856eeea7fffffff +{ + 11.435585617 -118.581352019 + 11.513484845 -118.535704596 + 11.593354076 -118.584250673 + 11.595228803 -118.678462020 + 11.517276340 -118.724014450 + 11.437502335 -118.675450710 +} +85ad4e6ffffffff +{ + -29.202677246 3.631838678 + -29.294548776 3.610300906 + -29.358791997 3.689851076 + -29.331066758 3.790857288 + -29.239204226 3.812185188 + -29.175057793 3.732716862 +} +85c16563fffffff +{ + -25.749041491 -2.453844854 + -25.839549747 -2.481541515 + -25.907789831 -2.407280297 + -25.885411458 -2.305354051 + -25.794874666 -2.277841384 + -25.726744653 -2.352070760 +} +85c8d18ffffffff +{ + -35.285582369 101.078793370 + -35.218430174 101.021108043 + -35.222111692 100.913289507 + -35.292956508 100.862850574 + -35.360264436 100.920400997 + -35.356571789 101.028525882 +} +85804a03fffffff +{ + 2.569280932 -49.920293229 + 2.650978417 -49.870336965 + 2.733868535 -49.915327158 + 2.735064945 -50.010230115 + 2.653409885 -50.060162373 + 2.570516010 -50.015215805 +} +85b1719bfffffff +{ + -29.181116644 -125.838886926 + -29.134977714 -125.749657811 + -29.048856075 -125.746980548 + -29.008922231 -125.833301460 + -29.054964032 -125.922365517 + -29.141036628 -125.925273583 +} +85319633fffffff +{ + 37.532928430 111.537900020 + 37.451852498 111.531252269 + 37.415387551 111.609449259 + 37.459845433 111.694310052 + 37.540822944 111.701186487 + 37.577441075 111.622973733 +} +85e41cc3fffffff +{ + -58.607651058 101.623196679 + -58.525788876 101.522164845 + -58.530282322 101.335807501 + -58.616656920 101.249568841 + -58.698739462 101.350210236 + -58.694226964 101.537483960 +} +853ed1bbfffffff +{ + 19.247742420 25.862567458 + 19.152889412 25.856413706 + 19.101062036 25.941207279 + 19.143998542 26.032201059 + 19.238828493 26.038500178 + 19.290745115 25.953660215 } -853b332bfffffff -{ - 38.103748899 -53.690778875 - 38.018636892 -53.724925864 - 37.950945811 -53.655773203 - 37.968274595 -53.552394438 - 38.053411654 -53.518003702 - 38.121194984 -53.587235308 -} -8577a5abfffffff -{ - 3.637884172 150.667973671 - 3.543871167 150.681385370 - 3.509096740 150.767702790 - 3.568282451 150.840583813 - 3.662241606 150.827209638 - 3.697068937 150.740916884 -} -85ef60affffffff -{ - -76.341128133 -79.716004941 - -76.331464235 -79.319484819 - -76.244082568 -79.155235027 - -76.166823799 -79.384521146 - -76.176435157 -79.776357243 - -76.263357173 -79.943554416 -} -852e6ccbfffffff -{ - 34.495560746 135.121422545 - 34.577681344 135.090758429 - 34.597162592 134.999648527 - 34.534586718 134.939415557 - 34.452599259 134.970161313 - 34.433054608 135.061058725 -} -850f0513fffffff -{ - 67.696310760 -64.571088181 - 67.659327809 -64.802201891 - 67.564423405 -64.830281692 - 67.506598907 -64.628861800 - 67.543380644 -64.398969842 - 67.638187062 -64.369279363 -} -855c195bfffffff -{ - 9.719734918 -150.929932311 - 9.627841993 -150.961781437 - 9.554771129 -150.896848110 - 9.573551524 -150.800075091 - 9.665418227 -150.768173001 - 9.738530803 -150.833096752 -} -855c9d5bfffffff -{ - 5.442792530 -157.329880916 - 5.352490472 -157.358474857 - 5.281612481 -157.293577837 - 5.300982952 -157.200063229 - 5.391279121 -157.171399935 - 5.462210770 -157.236320493 -} -85e2daaffffffff -{ - -51.895667472 -121.464574512 - -51.846563621 -121.334062412 - -51.751016733 -121.338797906 - -51.704607416 -121.473518458 - -51.753598577 -121.603727196 - -51.849111412 -121.599518607 -} -8544e9c7fffffff -{ - 33.548914285 -87.224371107 - 33.613140410 -87.154556296 - 33.700574969 -87.185930613 - 33.723825985 -87.287301074 - 33.659554424 -87.357202152 - 33.572077340 -87.325646598 -} -85cd9d57fffffff -{ - -39.158472420 90.121407459 - -39.239694146 90.158608290 - -39.249886477 90.268877910 - -39.178905155 90.341749083 - -39.097753070 90.304479038 - -39.087512640 90.194406697 -} -859d512bfffffff -{ - -19.925202009 142.866712617 - -19.836725540 142.854296143 - -19.805748115 142.764470047 - -19.863140972 142.686971397 - -19.951610154 142.699216896 - -19.982693913 142.789132060 -} -851864cbfffffff -{ - 50.453179833 -0.933438082 - 50.403302851 -1.034050989 - 50.316790831 -1.011736575 - 50.280203337 -0.889173083 - 50.330028194 -0.788770943 - 50.416492508 -0.810721538 -} -855c9887fffffff -{ - 5.172031753 -157.415590301 - 5.081876043 -157.444111836 - 5.011080398 -157.379282882 - 5.030386311 -157.285908376 - 5.120536071 -157.257317433 - 5.191385931 -157.322170298 -} -855d1a67fffffff -{ - 17.022097455 -153.993464831 - 16.929883771 -154.025020231 - 16.857902607 -153.957352474 - 16.878108830 -153.858121928 - 16.970319155 -153.826500037 - 17.042326664 -153.894175040 -} -85aad88ffffffff -{ - -32.949441804 79.436912204 - -33.040621601 79.465706873 - -33.063871151 79.575031496 - -32.995944454 79.655398468 - -32.904816919 79.626483411 - -32.881563748 79.517321495 -} -85f16e53fffffff -{ - -85.982708301 12.342904188 - -85.888739727 12.226332791 - -85.849740554 11.056242029 - -85.903331836 9.969217595 - -85.997599969 10.033758991 - -86.038013051 11.237714483 -} -85f31c6ffffffff -{ - -76.973962378 -165.265933053 - -77.053414715 -165.215431840 - -77.077859652 -164.858538314 - -77.022425550 -164.555470746 - -76.943098189 -164.610228900 - -76.919077010 -164.963813209 -} -85a36527fffffff -{ - -9.547261967 53.378688994 - -9.632849726 53.384283088 - -9.664736174 53.462488482 - -9.610928352 53.535085886 - -9.525293574 53.529380859 - -9.493513552 53.451189406 -} -85cb04a3fffffff -{ - -32.281664985 49.752674599 - -32.372284342 49.756230420 - -32.417729029 49.845821429 - -32.372474207 49.931858570 - -32.281774590 49.928150182 - -32.236410008 49.838557341 -} -85614bdbfffffff -{ - 4.177826018 70.746386772 - 4.261397992 70.719799011 - 4.281515331 70.641481576 - 4.218136184 70.589820993 - 4.134663134 70.616384554 - 4.114470359 70.694632955 -} -85000957fffffff -{ - 82.592273478 28.140724458 - 82.653605762 28.616583499 - 82.740419426 28.414275754 - 82.765294126 27.723217607 - 82.702964880 27.248150461 - 82.616764361 27.463184961 -} -8522496ffffffff -{ - 49.889056614 176.052708445 - 49.978853510 176.067087163 - 50.033494374 175.949255993 - 49.998246563 175.817115600 - 49.908410701 175.803085020 - 49.853861404 175.920846308 -} -85388203fffffff -{ - 25.412659551 -3.751836708 - 25.349388377 -3.823456622 - 25.263061267 -3.804243004 - 25.240029960 -3.713596773 - 25.303205277 -3.642069725 - 25.389507630 -3.661096001 -} -85e5006ffffffff -{ - -62.829160603 118.288814311 - -62.763917193 118.134882397 - -62.792690707 117.934775009 - -62.886885550 117.887676518 - -62.952388116 118.041782190 - -62.923435987 118.242815149 -} -852f9223fffffff -{ - 44.490181875 156.265544913 - 44.582828291 156.252641387 - 44.618657185 156.133710945 - 44.561807798 156.027944434 - 44.469225116 156.041128921 - 44.433427930 156.159799331 -} -8552e993fffffff -{ - 14.160081193 49.113483979 - 14.077998083 49.092116078 - 14.026381438 49.149768449 - 14.056753550 49.228715103 - 14.138726207 49.250142959 - 14.190437171 49.192564368 -} -85155acbfffffff -{ - 59.370380165 128.915056307 - 59.295775161 129.019535397 - 59.301353656 129.201239980 - 59.381601557 129.279426163 - 59.456486046 129.175271956 - 59.450842909 128.992603257 +857602bbfffffff +{ + 0.058483971 158.205649623 + -0.031200484 158.217038490 + -0.063262715 158.296128797 + -0.005717859 158.363787194 + 0.083890193 158.352438853 + 0.116029803 158.273391584 +} +859e2d6ffffffff +{ + -19.718177220 164.693095682 + -19.632456440 164.660110449 + -19.612834442 164.564063039 + -19.678924966 164.500832510 + -19.764743638 164.533711594 + -19.784373922 164.629927625 +} +85179caffffffff +{ + 52.573090513 151.739491023 + 52.657942179 151.718429016 + 52.683800699 151.584069349 + 52.624790516 151.471140749 + 52.540011468 151.492530062 + 52.514169824 151.626521369 +} +85ed080ffffffff +{ + -69.277578557 163.779058862 + -69.275875710 163.555802529 + -69.350538436 163.447223398 + -69.427084414 163.562923955 + -69.428677796 163.787793009 + -69.353835003 163.895341384 +} +85f22613fffffff +{ + -77.516251986 -155.840587495 + -77.594025750 -155.721979235 + -77.605570650 -155.327195511 + -77.539049453 -155.055616735 + -77.461584199 -155.178210660 + -77.450329412 -155.568430965 +} +85f282a7fffffff +{ + -87.523092382 -133.566646902 + -87.592828104 -132.180319264 + -87.570939356 -130.080485146 + -87.480480216 -129.495032499 + -87.413594590 -130.894332525 + -87.434372684 -132.870747894 } -85ec8b07fffffff -{ - -65.777527690 129.173510955 - -65.726749451 128.984070177 - -65.770547365 128.782619284 - -65.865380098 128.769902692 - -65.916386244 128.960060531 - -65.872330811 129.162217906 -} -85020baffffffff -{ - 75.966997569 -97.781230999 - 75.892792081 -98.010496411 - 75.810747629 -97.866075051 - 75.802567419 -97.494843381 - 75.876353948 -97.264262529 - 75.958738972 -97.406202015 -} -85009d4bfffffff -{ - 77.469201961 85.568501996 - 77.447478310 85.983631195 - 77.515780034 86.271819393 - 77.606400372 86.144222396 - 77.628321946 85.723914926 - 77.559423152 85.436423060 -} -85006cd3fffffff -{ - 80.822281271 -16.540485633 - 80.904034643 -16.555627664 - 80.945163045 -17.052027098 - 80.903851350 -17.528287552 - 80.822169299 -17.503968874 - 80.781721059 -17.012558633 -} -85d11a9bfffffff -{ - -42.069606284 7.675141028 - -42.161903194 7.655566653 - -42.218760717 7.750047992 - -42.183254229 7.863952553 - -42.090995577 7.883235985 - -42.034205003 7.788905854 -} -8593228bfffffff -{ - -0.591099481 -103.387772030 - -0.662712938 -103.442892589 - -0.744987819 -103.413763312 - -0.755677995 -103.329431952 - -0.684004507 -103.274243835 - -0.601700927 -103.303454591 -} -85df2bb7fffffff -{ - -59.481204411 -65.924002467 - -59.449321955 -65.754044365 - -59.362493027 -65.719649107 - -59.307681827 -65.854339561 - -59.339411149 -66.023523633 - -59.426104231 -66.058789259 -} -85135523fffffff -{ - 63.265564909 -110.392906196 - 63.181490973 -110.480535842 - 63.103446993 -110.368555996 - 63.109217678 -110.169236185 - 63.193137293 -110.080793127 - 63.271440877 -110.192479152 -} -85f29873fffffff -{ - -87.702042357 -68.940005544 - -87.677266796 -66.710348754 - -87.586396346 -66.245307933 - -87.521700529 -67.872981726 - -87.544807763 -69.972436044 - -87.634201399 -70.569690719 -} -852bb19bfffffff -{ - 48.888061960 -75.487170668 - 48.836948189 -75.608920192 - 48.743612320 -75.601312928 - 48.701372135 -75.472505520 - 48.752294352 -75.350986477 - 48.845647880 -75.358044149 -} -85be7047fffffff -{ - -36.207626802 148.329426909 - -36.112156640 148.307694124 - -36.079413150 148.194924329 - -36.142060928 148.103715710 - -36.237542055 148.125206773 - -36.270364596 148.238148388 -} -8516a827fffffff -{ - 50.412964842 162.126683702 - 50.502796681 162.120910797 - 50.542310586 161.991554289 - 50.491932366 161.868226988 - 50.402131168 161.874364663 - 50.362677323 162.003465122 -} -85222cd3fffffff -{ - 43.086988270 -169.875089009 - 43.175437529 -169.845607644 - 43.241622060 -169.932886239 - 43.219275761 -170.049746263 - 43.130724391 -170.079034007 - 43.064621377 -169.991655895 -} -8505b063fffffff -{ - 69.045867157 114.155217377 - 68.982732793 114.355796290 - 69.011994552 114.605789511 - 69.104661156 114.656802520 - 69.168180058 114.455858204 - 69.138646452 114.204260731 -} -85488dd7fffffff -{ - 29.514475691 -102.976621872 - 29.592532793 -102.912246802 - 29.680526055 -102.958219485 - 29.690435805 -103.068690368 - 29.612319231 -103.133041258 - 29.524352422 -103.086945733 +8528db5bfffffff +{ + 50.928501675 -124.200825358 + 50.850323130 -124.228671478 + 50.787567331 -124.134759417 + 50.802800551 -124.012892159 + 50.880954796 -123.984570322 + 50.943900476 -124.078590897 } -852acd97fffffff +85f2b4abfffffff { - 31.873595358 -72.371008290 - 31.834385211 -72.457847849 - 31.759498822 -72.457374051 - 31.723826170 -72.370326202 - 31.762898527 -72.283623236 - 31.837781076 -72.283831537 + -85.289742006 169.316890810 + -85.373665007 168.973705705 + -85.436004248 169.743543429 + -85.412778325 170.858674666 + -85.327931090 171.170077641 + -85.267216782 170.398762810 } -85f22167fffffff -{ - -76.887293175 -144.886625719 - -76.958934358 -144.704129202 - -76.954089388 -144.318692016 - -76.877528284 -144.120347128 - -76.806338940 -144.305222774 - -76.811258489 -144.686099866 -} -8558926bfffffff -{ - 4.906080400 1.340622374 - 4.829629069 1.352329083 - 4.791199117 1.425991369 - 4.829186022 1.488058611 - 4.905707678 1.476431317 - 4.944172150 1.402657249 -} -8517435bfffffff -{ - 60.527512343 171.314343142 - 60.438153197 171.294374987 - 60.387701620 171.445577852 - 60.426317652 171.617035699 - 60.515587224 171.638014853 - 60.566331081 171.486526569 -} -85000aaffffffff -{ - 82.235348402 37.039158902 - 82.286507093 37.563929696 - 82.376463779 37.476604985 - 82.414949983 36.850994506 - 82.362852037 36.322614626 - 82.273215862 36.423381733 -} -857650cbfffffff -{ - -0.263166437 163.243139639 - -0.349489379 163.253072748 - -0.380160022 163.326264663 - -0.324593769 163.389472319 - -0.238359282 163.379579214 - -0.207602606 163.306438457 -} -85121897fffffff -{ - 56.742288671 -119.685416684 - 56.659031571 -119.730868283 - 56.590259963 -119.625447793 - 56.604524315 -119.474529172 - 56.687722567 -119.428434469 - 56.756715733 -119.533900078 -} -85c69253fffffff -{ - -41.331547966 -120.228369781 - -41.278914839 -120.121729232 - -41.183433001 -120.127604713 - -41.140609456 -120.239762865 - -41.193125906 -120.346211260 - -41.288582327 -120.340693632 -} -85ae5e83fffffff -{ - -25.012234437 102.117113602 - -25.091191097 102.153152059 - -25.100304153 102.237529778 - -25.030553511 102.285740061 - -24.951705110 102.249705626 - -24.942499161 102.165456747 -} -857b1983fffffff -{ - -4.314114025 47.718272228 - -4.224038908 47.716048946 - -4.176824360 47.639645165 - -4.219679537 47.565372172 - -4.309831237 47.567541166 - -4.357051203 47.644037497 -} -85ef6087fffffff -{ - -76.696070432 -80.811303601 - -76.688251576 -80.404226968 - -76.601663032 -80.228922788 - -76.523375273 -80.457704940 - -76.531161888 -80.859831116 - -76.617268015 -81.038085429 -} -855fa943fffffff -{ - 7.759632472 -52.291966616 - 7.839177848 -52.242763703 - 7.918165171 -52.286561938 - 7.917616368 -52.379512044 - 7.838125714 -52.428681916 - 7.759129172 -52.384934834 -} -85e4915bfffffff -{ - -49.426113497 102.262837299 - -49.347706269 102.182131123 - -49.353077573 102.035543901 - -49.436878492 101.969098819 - -49.515480755 102.049575856 - -49.510086994 102.196728679 -} -85a3b36ffffffff -{ - -21.173454991 39.413301940 - -21.079202855 39.414283810 - -21.033150819 39.327882525 - -21.081360967 39.240418774 - -21.175658738 39.239363908 - -21.221700792 39.325845822 -} -853e93abfffffff -{ - 18.344742907 16.710461863 - 18.250663292 16.711968128 - 18.203438837 16.799370709 - 18.250228045 16.885364649 - 18.344335124 16.884002104 - 18.391625650 16.796501851 -} -850a807bfffffff -{ - 58.137535273 100.061964941 - 58.047543369 100.078161529 - 58.006476787 100.225764152 - 58.055245593 100.357458296 - 58.145186240 100.341928877 - 58.186409696 100.194038305 -} -85065c47fffffff -{ - 62.289242811 -37.375647532 - 62.289495486 -37.563833431 - 62.209788466 -37.661645031 - 62.130079663 -37.571616770 - 62.129919390 -37.384451395 - 62.209375767 -37.286297460 -} -8504b5abfffffff -{ - 67.831899996 133.793251052 - 67.748839177 133.921428044 - 67.748186316 134.175968253 - 67.830608000 134.304232203 - 67.914005432 134.176988632 - 67.914644518 133.920538009 -} -8502c53bfffffff -{ - 71.970594345 -103.519074617 - 71.890391931 -103.676782820 - 71.809676519 -103.539708426 - 71.808847890 -103.246068882 - 71.888760199 -103.087099658 - 71.969791305 -103.223017248 -} -8506ca07fffffff -{ - 63.022500137 -51.468991119 - 63.003151121 -51.669683798 - 62.912651096 -51.733389916 - 62.841699244 -51.597256900 - 62.861000310 -51.397670435 - 62.951300870 -51.333114862 -} -8514230ffffffff -{ - 56.650401231 125.098577806 - 56.581081434 125.202156332 - 56.591208377 125.366127302 - 56.670751248 125.427289007 - 56.740339209 125.323874897 - 56.730115803 125.159132283 -} -85c6e103fffffff -{ - -34.151150361 -133.397880947 - -34.060937637 -133.383545659 - -34.006623996 -133.464525500 - -34.042490035 -133.559982743 - -34.132771138 -133.574512608 - -34.187117892 -133.493390600 -} -85f28637fffffff +852593affffffff { - -87.233700906 -151.567297527 - -87.317945190 -150.857933915 - -87.325502072 -148.926962703 - -87.248122919 -147.817369014 - -87.165752021 -148.600269333 - -87.158861841 -150.423268683 + 40.586813888 90.132337219 + 40.496374059 90.160540561 + 40.472161604 90.276382075 + 40.538261940 90.364263110 + 40.628714663 90.336389802 + 40.653054379 90.220305107 } -85b906bbfffffff -{ - -36.945838234 135.844785026 - -36.851870690 135.838509557 - -36.808966119 135.737268934 - -36.859916891 135.642233058 - -36.953824612 135.648264394 - -36.996841512 135.749575633 -} -850fabd7fffffff -{ - 65.836003068 -82.358839412 - 65.774976836 -82.542582051 - 65.679671791 -82.505593976 - 65.645292460 -82.286244129 - 65.706033703 -82.102777601 - 65.801438382 -82.138381681 -} -857c1d33fffffff -{ - 1.518716232 -21.668860068 - 1.595623462 -21.626995336 - 1.675125797 -21.670344178 - 1.677786054 -21.755619064 - 1.600859260 -21.797563163 - 1.521291741 -21.754153067 -} -856b853bfffffff -{ - 8.533074715 19.095976445 - 8.446897268 19.095539175 - 8.401855829 19.175296309 - 8.442910758 19.255562507 - 8.529098730 19.256122272 - 8.574221372 19.176293330 -} -850ec54ffffffff -{ - 53.064509300 -82.006740612 - 53.005153352 -82.132048237 - 52.910479671 -82.107888993 - 52.875085123 -81.959062239 - 52.934221034 -81.833889920 - 53.028971086 -81.857408102 -} -85ab9ab3fffffff -{ - -29.372171355 63.561039221 - -29.467343010 63.576499334 - -29.504053450 63.678323761 - -29.445528815 63.764606806 - -29.350338321 63.748987633 - -29.313691197 63.647244406 -} -8506252bfffffff -{ - 68.696282088 -22.060576104 - 68.719990581 -22.275150751 - 68.657449101 -22.438036907 - 68.571465869 -22.386050391 - 68.547987735 -22.172670477 - 68.610263339 -22.010085782 -} -85d236b7fffffff -{ - -49.872220384 -106.368457670 - -49.806359300 -106.257643760 - -49.711741635 -106.290691743 - -49.682914366 -106.434113176 - -49.748625040 -106.544897645 - -49.843313137 -106.512290966 -} -85d76ab7fffffff -{ - -50.798191894 24.725452471 - -50.880707360 24.729773148 - -50.912908434 24.833462365 - -50.862602933 24.932515984 - -50.780187149 24.927903426 - -50.747977111 24.824528625 -} -85539143fffffff -{ - 18.118801129 33.754873807 - 18.026246486 33.742515661 - 17.972293276 33.820525903 - 18.010794367 33.910890804 - 18.103285432 33.923374713 - 18.157339068 33.845368103 -} -859a438ffffffff -{ - -10.479118015 179.869711631 - -10.404563851 179.912056313 - -10.338667544 179.872374041 - -10.347274271 179.790460097 - -10.421713918 179.748122030 - -10.487661262 179.787691167 -} -85256463fffffff -{ - 55.237191730 104.660773846 - 55.147448664 104.665704237 - 55.103056632 104.794004510 - 55.148248341 104.917536159 - 55.237907863 104.913154973 - 55.282459483 104.784693413 -} -85a10c37fffffff -{ - -25.950755780 -136.230586982 - -25.860184896 -136.214458461 - -25.799988021 -136.289672915 - -25.830302704 -136.381124689 - -25.920923939 -136.397422320 - -25.981180224 -136.322099063 +8560150bfffffff +{ + 12.353240860 76.249252127 + 12.439956508 76.221345390 + 12.457386137 76.134696307 + 12.388172531 76.076028913 + 12.301534657 76.103922581 + 12.284032623 76.190496800 } -85509627fffffff +8572b623fffffff { - 24.985066283 -119.786203527 - 25.069319119 -119.736613746 - 25.150982566 -119.791024159 - 25.148314779 -119.895038726 - 25.064037730 -119.944505652 - 24.982452641 -119.890081111 + -2.848366779 131.237333394 + -2.942378334 131.253659983 + -2.976529043 131.343268439 + -2.916663426 131.416587710 + -2.822612721 131.400271135 + -2.788466731 131.310625204 } -85d36ba3fffffff -{ - -45.009797621 -124.291772259 - -44.961966650 -124.176321679 - -44.866379503 -124.175545610 - -44.818677337 -124.289824133 - -44.866411387 -124.405011462 - -44.961944273 -124.406183290 -} -85d4e4cffffffff -{ - -45.374438372 -163.349328810 - -45.293614985 -163.298726819 - -45.221427612 -163.378273986 - -45.230014627 -163.508313627 - -45.310782542 -163.559057267 - -45.383018958 -163.479620178 -} -85f14233fffffff -{ - -84.346332646 42.345979671 - -84.269079054 41.813356443 - -84.275926512 40.902497364 - -84.360300104 40.498393158 - -84.438777372 41.022033272 - -84.431652093 41.959250429 -} -85b54157fffffff -{ - -32.861341094 -165.315761248 - -32.773660949 -165.270209268 - -32.695734274 -165.337631686 - -32.705434145 -165.450508020 - -32.793040543 -165.496154338 - -32.871020835 -165.428830356 -} -85ef0e2bfffffff -{ - -80.481941979 -48.364951835 - -80.425488148 -47.893821437 - -80.329485223 -47.957420586 - -80.289782789 -48.482526055 - -80.345473553 -48.950412591 - -80.441623042 -48.896468859 -} -855ee24ffffffff -{ - 16.835865947 -54.836124273 - 16.909344696 -54.788187277 - 16.978648196 -54.830319676 - 16.974493214 -54.920331729 - 16.901076598 -54.968227469 - 16.831752871 -54.926152507 -} -8534cc7bfffffff -{ - 24.654665172 -24.996192230 - 24.577987991 -25.058289756 - 24.491641247 -25.015359373 - 24.481891766 -24.910461294 - 24.558462722 -24.848308531 - 24.644889332 -24.891108752 -} -85f2b537fffffff -{ - -85.583895945 -174.267480790 - -85.672778149 -174.298248307 - -85.714862773 -173.258449904 - -85.666525801 -172.210041573 - -85.577579113 -172.222114548 - -85.537003803 -173.239784650 -} -850a2a3bfffffff -{ - 66.367686777 88.766278186 - 66.339150384 88.981755832 - 66.397514796 89.141529750 - 66.484761362 89.085804854 - 66.513434188 88.868979857 - 66.454723311 88.709232190 -} -85d75e73fffffff -{ - -50.058368826 31.063346434 - -50.137334032 31.076238415 - -50.163456806 31.173370305 - -50.110651203 31.257303733 - -50.031800343 31.244186397 - -50.005640733 31.147360450 -} -85b25913fffffff -{ - -32.947454079 -64.197128108 - -33.019105748 -64.249329481 - -33.084180086 -64.206056258 - -33.077590834 -64.110627191 - -33.005980516 -64.058534699 - -32.940918124 -64.101762286 -} -85e8420bfffffff -{ - -57.542097320 -87.025814735 - -57.463106638 -86.934475892 - -57.383016870 -87.010158146 - -57.381762172 -87.176914720 - -57.460643262 -87.268650421 - -57.540888693 -87.193234674 -} -85c15e37fffffff -{ - -32.037650005 -4.703707190 - -32.130397184 -4.736168243 - -32.200973221 -4.657633280 - -32.178698507 -4.546653656 - -32.085916491 -4.514397389 - -32.015443902 -4.592915658 -} -85f2f517fffffff -{ - -81.188949166 -116.445359038 - -81.236044446 -115.943960722 - -81.189411836 -115.423144347 - -81.096341475 -115.409810074 - -81.050015056 -115.906524378 - -81.095997508 -116.421271428 -} -85490937fffffff -{ - 19.515431039 -112.185168651 - 19.597308466 -112.131263099 - 19.682562554 -112.179981107 - 19.685866933 -112.282662265 - 19.603930689 -112.336491740 - 19.518748877 -112.287716384 -} -85a824d3fffffff -{ - -28.043997104 -50.618997788 - -27.977773852 -50.566821953 - -27.903732892 -50.613650832 - -27.895950861 -50.712605150 - -27.962187241 -50.764751551 - -28.036192526 -50.717973208 -} -85b59e83fffffff -{ - -28.366583781 -146.395120044 - -28.273537858 -146.367922536 - -28.205910317 -146.444605222 - -28.231254586 -146.548537843 - -28.324303077 -146.575908495 - -28.392004836 -146.499173541 -} -859c4cb7fffffff -{ - -17.078955071 134.702181821 - -17.162151698 134.717895163 - -17.193222392 134.806430545 - -17.141119667 134.879278463 - -17.057898173 134.863580429 - -17.026804200 134.775019103 -} -8526f16ffffffff -{ - 37.105763566 -99.923764273 - 37.177947834 -99.853501379 - 37.263642365 -99.899761880 - 37.277143728 -100.016442777 - 37.204909558 -100.086703632 - 37.119223982 -100.040285948 -} -850242dbfffffff -{ - 74.784914720 -86.455892005 - 74.721674740 -86.718981027 - 74.632774731 -86.641027822 - 74.606917891 -86.302955379 - 74.669733091 -86.040023499 - 74.758828227 -86.114992111 -} -855b92b7fffffff -{ - 15.588239044 -176.819166270 - 15.672501487 -176.803521915 - 15.722039298 -176.873798498 - 15.687195867 -176.959733267 - 15.602860371 -176.975250282 - 15.553441277 -176.904960040 -} -8560b67bfffffff -{ - 19.219744003 80.492875850 - 19.305953869 80.464261438 - 19.321841142 80.371759235 - 19.251578914 80.307948144 - 19.165422721 80.336560922 - 19.149475056 80.428986540 -} -85a09913fffffff -{ - -11.049122463 -132.805939812 - -10.970365055 -132.795036361 - -10.912790852 -132.859457515 - -10.933895415 -132.934874125 - -11.012686922 -132.945900391 - -11.070339867 -132.881387201 -} -85245c47fffffff -{ - 43.367740990 110.872547779 - 43.282598977 110.866169847 - 43.241323289 110.954775758 - 43.285032772 111.049786782 - 43.370066467 111.056455337 - 43.411499091 110.967822633 -} -8507764bfffffff -{ - 68.174497413 -13.295067556 - 68.207620181 -13.482700914 - 68.155272878 -13.655878035 - 68.070011431 -13.640742426 - 68.037155800 -13.453857661 - 68.089295305 -13.281360130 -} -85ab094bfffffff -{ - -18.962447014 70.044088337 - -19.057221510 70.063325980 - -19.088687599 70.160233171 - -19.025326273 70.237803805 - -18.930573166 70.218440916 - -18.899159898 70.121632513 -} -851d9ab3fffffff -{ - 51.171565316 -152.886065530 - 51.241989818 -152.836532622 - 51.313494248 -152.900965648 - 51.314561448 -153.015203461 - 51.244034800 -153.064682844 - 51.172543151 -152.999978526 -} -85000e67fffffff -{ - 81.428896359 37.786625111 - 81.478605635 38.265454524 - 81.568209429 38.194279672 - 81.607838463 37.633191437 - 81.557280760 37.151127490 - 81.467949685 37.233338094 -} -8559991bfffffff -{ - 11.250761959 0.714241980 - 11.168046248 0.727063280 - 11.129555109 0.804908908 - 11.173758324 0.870059523 - 11.256561114 0.857325593 - 11.295073637 0.779353538 -} -85210193fffffff -{ - 51.064232833 61.387384336 - 50.985447166 61.473387188 - 50.993608588 61.625077095 - 51.080611001 61.691260833 - 51.159547400 61.605389908 - 51.151330528 61.453202008 -} -852cae0ffffffff -{ - 34.354177694 46.222205643 - 34.266295659 46.197932513 - 34.202003058 46.272855436 - 34.225532952 46.371956637 - 34.313312676 46.396336782 - 34.377664825 46.321509015 -} -85f16a07fffffff -{ - -84.551843366 12.719952157 - -84.457439796 12.626881353 - -84.418653224 11.751597420 - -84.473272539 10.950403410 - -84.567943968 11.014990765 - -84.607747697 11.909421982 -} -852fb57bfffffff -{ - 39.836076009 156.759154748 - 39.930843256 156.747641336 - 39.969230662 156.636071004 - 39.912815165 156.536240241 - 39.818112849 156.548003170 - 39.779760958 156.659347641 -} -859da57bfffffff -{ - -16.674767925 154.129583539 - -16.588903402 154.106583783 - -16.564158753 154.013659510 - -16.625216611 153.943600433 - -16.711133411 153.966457626 - -16.735940189 154.059516636 -} -85e51c0bfffffff -{ - -61.549685907 116.197269366 - -61.481824877 116.053506662 - -61.507466487 115.859021603 - -61.601126750 115.807400718 - -61.669243479 115.951244418 - -61.643443645 116.146630643 -} -85e8632ffffffff -{ - -56.284379504 -91.848244528 - -56.207938095 -91.748742936 - -56.123456859 -91.814392945 - -56.115273260 -91.979197201 - -56.191584806 -92.078985218 - -56.276209768 -92.013684429 -} -850e2a57fffffff -{ - 59.734984037 -74.082518944 - 59.683685447 -74.246694613 - 59.586324842 -74.240557153 - 59.540255258 -74.071219617 - 59.591334875 -73.907495167 - 59.688702355 -73.912656796 -} -8500dc53fffffff -{ - 84.171253916 96.823468092 - 84.134132995 97.663424950 - 84.190351194 98.413823877 - 84.284911279 98.331807710 - 84.322958297 97.473711695 - 84.265501927 96.715944033 -} -85920acbfffffff -{ - -13.263725403 -105.036607890 - -13.331907562 -105.093227953 - -13.418020794 -105.063965626 - -13.436012689 -104.977993414 - -13.367804135 -104.921295349 - -13.281630088 -104.950647461 -} -856930abfffffff -{ - 14.157184577 109.473611614 - 14.249729419 109.453043444 - 14.279597456 109.362262987 - 14.216863794 109.292055594 - 14.124269391 109.312695086 - 14.094458175 109.403470699 -} -85398203fffffff -{ - 30.888089025 -9.658737148 - 30.820012433 -9.734327474 - 30.729522672 -9.706263908 - 30.707112251 -9.602822098 - 30.775089185 -9.527297573 - 30.865576066 -9.555148888 -} -85765027fffffff -{ - -0.231468051 164.139170478 - -0.317153757 164.148838062 - -0.347610048 164.220895868 - -0.292467691 164.283233889 - -0.206872245 164.273606008 - -0.176328913 164.201600413 -} -85776a57fffffff -{ - 8.827147188 162.402541029 - 8.739147064 162.412863515 - 8.702773033 162.488130334 - 8.754333319 162.553023207 - 8.842238611 162.542742079 - 8.878678423 162.467526728 -} -85528acbfffffff -{ - 11.165912140 39.854030161 - 11.080866908 39.838319996 - 11.031330436 39.905621561 - 11.066733784 39.988599249 - 11.151697493 40.004401565 - 11.201339421 39.937134191 -} -8594218ffffffff -{ - -8.365526940 124.391366076 - -8.454840792 124.407754748 - -8.489592968 124.493243680 - -8.435015943 124.562397546 - -8.345636897 124.546007218 - -8.310900043 124.460464618 -} -85ca300ffffffff -{ - -39.277910467 51.756586861 - -39.365725660 51.762264142 - -39.411360506 51.860928508 - -39.369116038 51.953903926 - -39.281236483 51.948046244 - -39.235665677 51.849393667 -} -858d9eb3fffffff -{ - -4.581207625 112.432147366 - -4.496896567 112.414078964 - -4.475809186 112.331010226 - -4.539114322 112.266006370 - -4.623456396 112.284140295 - -4.644462386 112.367212580 -} -85e188d7fffffff -{ - -58.120955382 70.657974256 - -58.028647316 70.642655436 - -57.991970530 70.488325103 - -58.047384128 70.348864930 - -58.139665020 70.363356679 - -58.176560048 70.518135890 -} -851c8a63fffffff -{ - 44.523414654 -149.466960873 - 44.456513915 -149.505277636 - 44.401842166 -149.428991320 - 44.414061874 -149.314412439 - 44.480954467 -149.276028457 - 44.535635545 -149.352290335 -} -85570023fffffff -{ - 22.399313034 -34.359242059 - 22.321197269 -34.411002439 - 22.239525681 -34.361411912 - 22.235858878 -34.260126947 - 22.313890613 -34.208253934 - 22.395673218 -34.257778206 -} -85026d7bfffffff -{ - 73.489769987 -67.980158166 - 73.449985972 -68.277398250 - 73.357738819 -68.296853469 - 73.305342752 -68.021928358 - 73.344824543 -67.726541760 - 73.437002758 -67.704231306 -} -85454b7bfffffff -{ - 26.829013006 -94.080674575 - 26.902082199 -94.014953073 - 26.991101332 -94.051661985 - 27.007058808 -94.154243601 - 26.933921701 -94.220002632 - 26.844895101 -94.183142693 -} -855064c3fffffff -{ - 19.175252553 -137.978652149 - 19.088553114 -138.015026892 - 19.013230793 -137.954656893 - 19.024604901 -137.857989907 - 19.111250078 -137.821608724 - 19.186575423 -137.881900814 -} -85f166a3fffffff -{ - -88.520910299 14.829166649 - -88.428548367 14.380529116 - -88.392506362 11.332328181 - -88.445294991 8.496297471 - -88.538444595 8.578451130 - -88.578269373 11.870469845 -} -85b58557fffffff -{ - -31.459537965 -148.532814755 - -31.366551303 -148.502579435 - -31.298053546 -148.580905258 - -31.322471958 -148.689505415 - -31.415452951 -148.719919052 - -31.484021303 -148.641554427 -} -85c14cd7fffffff -{ - -29.420140259 -1.341350155 - -29.512391636 -1.368921864 - -29.580440692 -1.290938698 - -29.556133735 -1.185427423 - -29.463863693 -1.158058787 - -29.395919138 -1.235998138 -} -855f5a5bfffffff -{ - 10.768656250 -59.601552503 - 10.845269176 -59.554793691 - 10.918412667 -59.594892407 - 10.914946091 -59.681679713 - 10.838402426 -59.728381612 - 10.765256125 -59.688353188 -} -857b6807fffffff -{ - -8.561454325 39.206432423 - -8.466173872 39.207445785 - -8.416410253 39.125458825 - -8.461910566 39.042386784 - -8.557236597 39.041307654 - -8.607016799 39.123366360 -} -85d1335bfffffff -{ - -38.474561680 5.222621049 - -38.567819651 5.200641279 - -38.628784697 5.290214527 - -38.596412970 5.401650707 - -38.503179936 5.423365909 - -38.442293544 5.333909614 -} -85d3937bfffffff -{ - -50.530736688 -93.904071079 - -50.455040061 -93.812279205 - -50.366608159 -93.867111807 - -50.353738086 -94.013434198 - -50.429304096 -94.105417367 - -50.517870733 -94.050888132 -} -85bac22bfffffff -{ - -25.103164937 -179.436081941 - -25.023471530 -179.387573191 - -24.945417041 -179.434063817 - -24.947033960 -179.528915543 - -25.026619638 -179.577419413 - -25.104696049 -179.531076636 -} -850f20b7fffffff -{ - 69.104057469 -59.429664487 - 69.075083448 -59.680033236 - 68.982386179 -59.730122491 - 68.918818662 -59.531523264 - 68.947631256 -59.282727466 - 69.040171841 -59.230964013 -} -851f7537fffffff -{ - 56.428011333 21.764224777 - 56.352347958 21.760077560 - 56.313338780 21.892110017 - 56.349927433 22.028454659 - 56.425588798 22.032945447 - 56.464663720 21.900748076 -} -85f2a0abfffffff -{ - -84.301930902 -159.561237689 - -84.387699653 -159.349456536 - -84.407748645 -158.462361533 - -84.341293187 -157.809415054 - -84.256097460 -158.043139777 - -84.236771239 -158.908200716 -} -85509d97fffffff -{ - 26.212536720 -124.019886062 - 26.297095715 -123.974150443 - 26.375713113 -124.030289804 - 26.369692112 -124.132152693 - 26.285127031 -124.177746735 - 26.206588985 -124.121619672 -} -858844c7fffffff -{ - -6.195905491 -160.829368616 - -6.276153532 -160.854926676 - -6.341462490 -160.793205566 - -6.326592418 -160.705889723 - -6.246354709 -160.680261884 - -6.180976662 -160.742019591 -} -857b43d7fffffff -{ - -5.927838914 41.422905271 - -5.834225541 41.423039681 - -5.785004647 41.342695264 - -5.829380261 41.262138684 - -5.923047532 41.261941647 - -5.972285347 41.342363853 -} -85bd58a3fffffff -{ - -37.487391156 26.511968317 - -37.406630792 26.518866864 - -37.360507175 26.425753514 - -37.395139646 26.325722866 - -37.475892846 26.318740412 - -37.522020836 26.411872454 -} -8524ec1bfffffff -{ - 41.750657105 108.218085768 - 41.664848517 108.216045863 - 41.626292468 108.306845410 - 41.673385775 108.399738393 - 41.759100028 108.402070591 - 41.797815432 108.311217812 -} -85e77377fffffff -{ - -71.009940720 20.691368688 - -70.919497485 20.625836392 - -70.889639677 20.357839871 - -70.950041074 20.153328066 - -71.040717619 20.216736908 - -71.070760657 20.486790323 -} -8504f1a7fffffff -{ - 69.876894459 158.547860367 - 69.781132327 158.578604613 - 69.742688866 158.834173485 - 69.799692516 159.060512881 - 69.895524658 159.032029187 - 69.934284781 158.774941827 -} -85f3b303fffffff -{ - -80.305250097 160.951735224 - -80.379123727 160.721580744 - -80.444714215 161.019933580 - -80.435699029 161.551318921 - -80.361207316 161.776184651 - -80.296347466 161.475037052 -} -85bb1143fffffff -{ - -40.402874211 -177.810929844 - -40.327869987 -177.754514007 - -40.247889666 -177.811459486 - -40.242909675 -177.924623549 - -40.317836795 -177.981045471 - -40.397820972 -177.924297595 -} -855ca2c7fffffff -{ - 10.325112313 -157.992774235 - 10.233116011 -158.021617775 - 10.161885085 -157.955394947 - 10.182607563 -157.860300572 - 10.274608204 -157.831383220 - 10.345882085 -157.897633945 -} -85668857fffffff -{ - 3.802601207 -80.605984992 - 3.729048638 -80.661664087 - 3.644531129 -80.623248067 - 3.633614862 -80.529132724 - 3.707214031 -80.473482317 - 3.791682851 -80.511918431 -} -85c5817bfffffff -{ - -35.816106977 -42.750375394 - -35.884907789 -42.812336074 - -35.966061780 -42.778422053 - -35.978435759 -42.682324784 - -35.909533377 -42.620296864 - -35.828358693 -42.654433307 -} -85ca414bfffffff -{ - -39.894516333 66.128794534 - -39.983985240 66.148205083 - -40.018060372 66.261981970 - -39.962623710 66.356232120 - -39.873149104 66.336633056 - -39.839116736 66.222972214 -} -852d1487fffffff -{ - 38.948971864 32.689679964 - 38.856649592 32.675575513 - 38.798820172 32.772038297 - 38.833246818 32.882609956 - 38.925518632 32.896906608 - 38.983414377 32.800439649 -} -85cf482bfffffff -{ - -46.038545571 -90.734740172 - -45.961733226 -90.656193921 - -45.874638635 -90.710832376 - -45.864211580 -90.843804016 - -45.940906065 -90.922552079 - -46.028145470 -90.868127682 -} -853a68cffffffff -{ - 27.474785213 -39.383142959 - 27.392868890 -39.431958160 - 27.312134919 -39.376178957 - 27.313200563 -39.271620431 - 27.395058361 -39.222651530 - 27.475909114 -39.278394526 -} -85a3a117fffffff -{ - -17.443300099 42.331250502 - -17.348739306 42.331022111 - -17.302819806 42.247092133 - -17.351472760 42.163301791 - -17.446093621 42.163462133 - -17.492001509 42.247480913 -} -85817237fffffff -{ - -10.131678150 -46.655883225 - -10.049979356 -46.604778946 - -9.965050017 -46.651536996 - -9.961833653 -46.749367177 - -10.043524212 -46.800460948 - -10.128439366 -46.753735188 -} -85d2b4d3fffffff -{ - -48.331899362 -94.938662309 - -48.257000025 -94.848887792 - -48.167403517 -94.899854618 - -48.152575681 -95.040304811 - -48.227341917 -95.130239439 - -48.317069017 -95.079564882 -} -8507b45bfffffff -{ - 79.823752283 -12.919972660 - 79.904316931 -12.902609553 - 79.949814869 -13.330928842 - 79.914084261 -13.773437258 - 79.833493692 -13.783433456 - 79.788654360 -13.358296746 -} -85f14c0ffffffff -{ - -83.448083038 18.258206722 - -83.354860369 18.103422189 - -83.324025319 17.345529957 - -83.385754079 16.726588829 - -83.479425166 16.862743295 - -83.510930737 17.636653887 -} -85ef36a3fffffff -{ - -86.433478364 -26.945081829 - -86.354577256 -26.118316421 - -86.271448584 -26.793656219 - -86.265550191 -28.257543002 - -86.342500106 -29.109324615 - -86.427290216 -28.474117502 -} -856ad2d7fffffff -{ - -1.736939356 26.464624345 - -1.643602856 26.470527635 - -1.592670150 26.391097821 - -1.635016042 26.305751234 - -1.728334083 26.299786898 - -1.779324775 26.379230159 -} -85b6987bfffffff -{ - -22.895340346 -84.119452364 - -22.969485670 -84.181000754 - -23.054408892 -84.140137956 - -23.065189155 -84.037687807 - -22.991045760 -83.976154113 - -22.906120201 -84.017055701 -} -8554964bfffffff -{ - 14.345524680 -25.415994887 - 14.275666921 -25.471213259 - 14.197411596 -25.432465472 - 14.188929589 -25.338601224 - 14.258678813 -25.283336169 - 14.337018532 -25.321981806 -} -85bc120bfffffff -{ - -31.096537087 35.996028124 - -31.008673153 35.998564504 - -30.965732182 35.907346463 - -31.010665733 35.813520261 - -31.098554029 35.810901914 - -31.141484501 35.902191750 -} -85294e3bfffffff -{ - 36.900405378 -133.687671737 - 36.983191817 -133.649321556 - 37.048010670 -133.711742744 - 37.029994923 -133.812436717 - 36.947251169 -133.850594558 - 36.882480439 -133.788250883 -} -85005857fffffff -{ - 86.486105824 -4.860431167 - 86.572909093 -4.597222845 - 86.632032589 -5.792922738 - 86.602182014 -7.239840659 - 86.514750046 -7.437928337 - 86.457754089 -6.255224495 -} -85124653fffffff -{ - 56.333627657 -109.059521050 - 56.253078250 -109.133557870 - 56.173711443 -109.045898334 - 56.174665209 -108.884423340 - 56.255071788 -108.809882017 - 56.334667648 -108.897317961 -} -85f06953fffffff -{ - -76.614411274 21.118821262 - -76.522258827 21.022846713 - -76.494064256 20.641673228 - -76.557764984 20.352311406 - -76.650227800 20.444014472 - -76.678681928 20.829378126 -} -85935dc3fffffff -{ - -9.814155815 -98.546919716 - -9.887383314 -98.605506072 - -9.975535933 -98.572565423 - -9.990495554 -98.480958864 - -9.917231340 -98.422317537 - -9.829044251 -98.455337657 -} -85034517fffffff -{ - 80.690554562 -54.662996160 - 80.673723265 -55.195986104 - 80.591724548 -55.337176650 - 80.526918269 -54.952056100 - 80.543463063 -54.426570611 - 80.625097505 -54.278770776 -} -85146c6ffffffff -{ - 61.839671014 140.789556992 - 61.754734983 140.869384352 - 61.743532958 141.068387703 - 61.817198916 141.188707710 - 61.902366506 141.109686627 - 61.913636881 140.909534839 -} -853f6413fffffff -{ - 39.298143389 27.097952645 - 39.204738040 27.089257137 - 39.151257478 27.191098575 - 39.191120414 27.301692177 - 39.284500970 27.310598685 - 39.338043527 27.208700736 -} -85e39167fffffff -{ - -67.051535488 -121.736506825 - -67.011409750 -121.541777974 - -66.926500978 -121.548213545 - -66.881736874 -121.748210276 - -66.921697321 -121.942257098 - -67.006586474 -121.936988700 -} -85f15313fffffff -{ - -83.027569213 59.706218861 - -82.969761424 59.113845555 - -83.002294449 58.433641804 - -83.093420012 58.333756179 - -83.152214868 58.930813668 - -83.118885806 59.623170201 -} -853f2c2ffffffff -{ - 38.110823435 21.069276795 - 38.016281013 21.066716000 - 37.967649490 21.170831554 - 38.013509136 21.277615862 - 38.108056338 21.280389049 - 38.156739262 21.176165546 -} -85f0abb7fffffff -{ - -73.964319666 73.089146660 - -73.872997681 73.047208472 - -73.833885695 72.748225672 - -73.885784602 72.489371707 - -73.977141198 72.528347467 - -74.016566151 72.829143350 -} -85ed00dbfffffff -{ - -66.078302489 166.208338922 - -66.077579053 166.017853823 - -66.151045499 165.932906680 - -66.225375792 166.039276989 - -66.225973373 166.230930606 - -66.152366888 166.315040894 -} -85030a53fffffff -{ - 84.284463069 -102.692801557 - 84.285016598 -103.594852414 - 84.205879883 -104.075821182 - 84.127366754 -103.665664513 - 84.127006120 -102.788148152 - 84.204968505 -102.296698186 -} -85a6ce0bfffffff -{ - -19.665612904 106.482510395 - -19.596716482 106.462884441 - -19.582495228 106.379541173 - -19.637217722 106.315835224 - -19.706105994 106.335515414 - -19.720279995 106.418847367 -} -8511aed7fffffff -{ - 55.928435800 34.617925298 - 55.880260352 34.736085332 - 55.920153472 34.865868157 - 56.008382068 34.877699813 - 56.056641917 34.759183632 - 56.016588505 34.629192255 -} -8502607bfffffff -{ - 76.414201158 -74.414739747 - 76.366787483 -74.751892515 - 76.276677855 -74.736257997 - 76.233952079 -74.387594134 - 76.280941058 -74.052308276 - 76.371077791 -74.063816776 -} -85e9b21bfffffff -{ - -75.646327756 -95.180646726 - -75.660657744 -94.816004682 - -75.587342864 -94.577993068 - -75.500231090 -94.704035580 - -75.486141991 -95.064808416 - -75.558925512 -95.303381802 -} -857bb447fffffff -{ - -1.832480878 55.557203195 - -1.910779739 55.563991380 - -1.936839996 55.639661620 - -1.884505905 55.708522896 - -1.806183462 55.701634039 - -1.780218588 55.625984601 -} -8518a2c3fffffff -{ - 52.954124807 -23.406924003 - 52.884672896 -23.498840217 - 52.803654706 -23.438809092 - 52.792026692 -23.287153170 - 52.861387585 -23.195146024 - 52.942467410 -23.254884754 -} -850fb38ffffffff -{ - 68.658881628 -93.005250469 - 68.586833077 -93.178466264 - 68.497107078 -93.096786075 - 68.479215254 -92.843261369 - 68.550957547 -92.669715452 - 68.640897331 -92.750016560 -} -85271573fffffff -{ - 51.112580849 -99.114397998 - 51.040244147 -99.201385143 - 50.954533398 -99.142334799 - 50.940972808 -98.996652420 - 51.013120451 -98.909436893 - 51.099017702 -98.968130498 -} -85eaf673fffffff -{ - -65.936120690 -179.334321602 - -65.951609382 -179.499184164 - -66.026287803 -179.530516928 - -66.085487026 -179.395974578 - -66.069781039 -179.230337911 - -65.995093741 -179.200019403 -} -852521cbfffffff -{ - 54.148737581 93.887287956 - 54.056832812 93.915588004 - 54.023490645 94.060340540 - 54.081911296 94.177140321 - 54.173802486 94.149403893 - 54.207286925 94.004303685 -} -85df1caffffffff -{ - -60.651155405 -57.885450718 - -60.608401164 -57.716147581 - -60.518386093 -57.705581345 - -60.471182607 -57.863273552 - -60.513710249 -58.031924827 - -60.603667180 -58.043534916 -} -8581281bfffffff -{ - -13.413395706 -45.115771683 - -13.332646815 -45.064424448 - -13.248846290 -45.111753878 - -13.245810377 -45.210404579 - -13.326560891 -45.261748246 - -13.410345692 -45.214444927 -} -850da407fffffff -{ - 71.765464630 -174.991382023 - 71.675470642 -175.091879646 - 71.604442126 -174.898182456 - 71.622984788 -174.604514517 - 71.712665667 -174.501998517 - 71.784117828 -174.695154451 -} -85ef9043fffffff -{ - -76.377204997 11.164114262 - -76.281879310 11.136792335 - -76.238790946 10.781970079 - -76.290613110 10.451453373 - -76.386059999 10.474049925 - -76.429566802 10.831897711 -} -85005333fffffff -{ - 85.699889621 17.336428476 - 85.773674197 17.987922202 - 85.855578941 17.410058839 - 85.862204311 16.153175159 - 85.786886068 15.521531185 - 85.706478987 16.125772825 -} -85316c9bfffffff -{ - 43.579413426 132.299978163 - 43.657409735 132.262902691 - 43.668017988 132.162439934 - 43.600712743 132.099316881 - 43.522839049 132.136473098 - 43.512148045 132.236672066 -} -85b4295bfffffff -{ - -28.822450886 -160.831348392 - -28.731938520 -160.790790173 - -28.655795900 -160.859743670 - -28.670095945 -160.969196821 - -28.760544092 -161.009869988 - -28.836756455 -160.940975380 -} -8587b55bfffffff -{ - -6.584826229 95.170114694 - -6.498115130 95.145790246 - -6.474435855 95.054920596 - -6.537492496 94.988417740 - -6.624171764 95.012779581 - -6.647826281 95.103606984 -} -85b47533fffffff -{ - -27.879070175 -164.302635183 - -27.789970365 -164.259900737 - -27.712575353 -164.325144298 - -27.724215681 -164.433040047 - -27.813237853 -164.475866585 - -27.890697352 -164.410705606 +855516d7fffffff +{ + 25.409162235 -15.779502862 + 25.337111090 -15.848219541 + 25.248990352 -15.814722018 + 25.232884196 -15.712681590 + 25.304822682 -15.643979393 + 25.392979864 -15.677302902 } -85f29387fffffff +85f2b503fffffff { - -89.915696433 -140.297307936 - -89.949985838 -57.757362933 - -89.858736589 -55.603769920 - -89.793429041 -78.463827775 - -89.780266586 -103.227958204 - -89.826299528 -126.505360119 + -85.569228880 179.609329282 + -85.657199371 179.451522904 + -85.707468830 -179.582950212 + -85.668089214 -178.472979397 + -85.579696772 -178.356942866 + -85.531077452 -179.308810264 } -852ae243fffffff +851b19cbfffffff { - 35.796151323 -74.090219334 - 35.753020084 -74.182982783 - 35.672740619 -74.179615637 - 35.635585912 -74.083796962 - 35.678562502 -73.991177666 - 35.758848164 -73.994232848 + 54.730726838 -45.975842617 + 54.716232984 -46.130443764 + 54.630407834 -46.191787034 + 54.559277825 -46.098935345 + 54.573783095 -45.945013796 + 54.659406938 -45.883266371 } -851cb1b7fffffff +85f12157fffffff { - 48.602098159 -151.343279148 - 48.672916161 -151.295072927 - 48.744364430 -151.353337501 - 48.744986773 -151.460060385 - 48.674062974 -151.508233276 - 48.602622694 -151.449717082 + -85.046945423 141.363104650 + -85.107312299 140.607570132 + -85.190837142 140.882430651 + -85.213197293 141.942531436 + -85.151260767 142.697539087 + -85.068550428 142.393498682 +} +85cae267fffffff +{ + -44.952774934 59.709813522 + -45.037364693 59.723872453 + -45.076384940 59.838447364 + -45.030764624 59.938885034 + -44.946148714 59.924610230 + -44.907179141 59.810113609 +} +85f2b407fffffff +{ + -85.393954167 167.860174795 + -85.477209694 167.481463591 + -85.541205021 168.247751534 + -85.520272320 169.397021557 + -85.436004248 169.743543429 + -85.373665007 168.973705705 +} +85ef316bfffffff +{ + -84.524533118 -39.518607942 + -84.457996537 -38.808227365 + -84.366328077 -39.063759956 + -84.340526996 -40.004766799 + -84.405677885 -40.714176424 + -84.498000383 -40.483927070 +} +85992103fffffff +{ + -5.135846842 -7.647064897 + -5.205208298 -7.673621031 + -5.261416383 -7.616982158 + -5.248159936 -7.533781300 + -5.178741438 -7.507330242 + -5.122636343 -7.563974822 +} +85f2a2cffffffff +{ + -85.565655275 -170.183256330 + -85.654546265 -170.128649683 + -85.690853264 -169.053187928 + -85.636871103 -168.059491670 + -85.548154213 -168.156001157 + -85.513216312 -169.204549199 +} +85eda253fffffff +{ + -61.084652094 156.537818026 + -61.068746370 156.371937475 + -61.134627092 156.272363177 + -61.216604300 156.339035945 + -61.232475471 156.505795284 + -61.166404019 156.605000072 +} +858e838ffffffff +{ + -13.901487495 -91.606344864 + -13.976748129 -91.666855663 + -14.066170062 -91.629910845 + -14.080347732 -91.532391488 + -14.005064096 -91.471855841 + -13.915625822 -91.508864269 +} +85b4d31bfffffff +{ + -17.975169867 -155.479574684 + -17.886057159 -155.446866297 + -17.814678047 -155.512981513 + -17.832318162 -155.611791107 + -17.921377731 -155.644617363 + -17.992850398 -155.578516370 +} +85b0423bfffffff +{ + -20.443104946 -120.415136596 + -20.396816335 -120.338060078 + -20.319604140 -120.342049139 + -20.288688709 -120.422928128 + -20.334865513 -120.499903378 + -20.412069376 -120.496100895 +} +856d4497fffffff +{ + 12.029744438 -87.913256835 + 11.961754950 -87.969005287 + 11.885391749 -87.933515429 + 11.877051779 -87.842233519 + 11.945101970 -87.786479951 + 12.021431384 -87.822013293 +} +85d56b73fffffff +{ + -51.750065902 -175.371967918 + -51.684019568 -175.307732540 + -51.610798677 -175.377711227 + -51.603603278 -175.511675878 + -51.669585869 -175.575946130 + -51.742827563 -175.506217463 +} +85131eb3fffffff +{ + 64.286766147 -125.297459789 + 64.199183050 -125.335918424 + 64.137350567 -125.191594339 + 64.162868617 -125.008520210 + 64.250436529 -124.968956544 + 64.312502255 -125.113570298 +} +85cc16b7fffffff +{ + -41.091533061 85.597634595 + -41.173788738 85.632985380 + -41.187568365 85.748618325 + -41.119119937 85.828696524 + -41.036922778 85.793243451 + -41.023115477 85.677814096 +} +859890b7fffffff +{ + -19.481643410 -16.180299188 + -19.565547069 -16.219176714 + -19.636716377 -16.159584211 + -19.623876543 -16.061048590 + -19.539877960 -16.022275652 + -19.468814106 -16.081933461 +} +853ae073fffffff +{ + 25.050099463 -48.450100592 + 24.970211822 -48.486038901 + 24.896514323 -48.428159372 + 24.902584165 -48.334314100 + 24.982448925 -48.298203401 + 25.056266847 -48.356110181 +} +85036e33fffffff +{ + 80.056870857 -49.031096494 + 80.048215299 -49.535467546 + 79.968479870 -49.710159330 + 79.897824900 -49.385427143 + 79.906330306 -48.888099706 + 79.985639273 -48.708527725 +} +85141b73fffffff +{ + 52.611654256 132.346901787 + 52.540087470 132.424157754 + 52.540237150 132.571393754 + 52.611976279 132.642008653 + 52.683766600 132.565033803 + 52.683594184 132.417161076 +} +85a294a7fffffff +{ + -27.906616095 43.408929937 + -27.817790534 43.408234530 + -27.778546885 43.320759236 + -27.828156972 43.233877928 + -27.917036264 43.234499845 + -27.956251798 43.322076619 +} +85c19dd3fffffff +{ + -33.346954685 -20.045497214 + -33.434357234 -20.094515626 + -33.513523940 -20.029226409 + -33.505207807 -19.914796915 + -33.417704753 -19.865891601 + -33.338618338 -19.931302222 } -855c9297fffffff +85f2944bfffffff { - 6.398608232 -160.766774044 - 6.308426994 -160.793746741 - 6.238362689 -160.728683606 - 6.258427890 -160.636607329 - 6.348618793 -160.609557229 - 6.418734893 -160.674660720 + -88.095455836 132.943824501 + -88.146748729 130.648111973 + -88.236040106 130.907877629 + -88.273105841 133.713697579 + -88.217745481 136.078038054 + -88.129553602 135.573293216 } -85b13353fffffff +8501643bfffffff { - -35.311265567 -119.162295865 - -35.258098765 -119.066143511 - -35.165468265 -119.073039369 - -35.126019139 -119.175792597 - -35.179063308 -119.271796408 - -35.271679009 -119.265195549 + 73.578494578 3.913245843 + 73.647136486 4.007572317 + 73.707381696 3.810467463 + 73.698532064 3.518627829 + 73.629635457 3.426365036 + 73.569842038 3.623864878 } -85f075b7fffffff +851b8823fffffff { - -80.131863316 38.389419778 - -80.050910059 38.113195372 - -80.050480543 37.586151604 - -80.131096514 37.326653623 - -80.212740344 37.598927452 - -80.213076895 38.134744986 + 50.627493354 -51.733324871 + 50.604552721 -51.873591998 + 50.516739825 -51.917750461 + 50.452031303 -51.822062386 + 50.474933475 -51.682335461 + 50.562582486 -51.637757802 } -850083c7fffffff +85171537fffffff { - 77.329818086 78.434247749 - 77.319174371 78.848746001 - 77.393983971 79.089859342 - 77.479975194 78.914531578 - 77.490660954 78.494663205 - 77.415312768 78.255537949 -} -8505080ffffffff -{ - 79.770359291 127.779250757 - 79.692395854 128.097198478 - 79.702193049 128.635101014 - 79.790119277 128.863481682 - 79.868810499 128.548195520 - 79.858845724 128.001777623 -} -85ef582bfffffff -{ - -73.389382624 -57.066184131 - -73.344196396 -56.767609390 - -73.247474514 -56.754282970 - -73.196007336 -57.036233569 - -73.240815777 -57.332834638 - -73.337466812 -57.349455023 -} -85104cd7fffffff -{ - 66.856094378 60.727629543 - 66.788652690 60.858238275 - 66.799673511 61.085741152 - 66.878193103 61.183750301 - 66.945834043 61.053415928 - 66.934755870 60.824793653 -} -8506d397fffffff -{ - 67.034639978 -54.653541922 - 67.012020381 -54.885755756 - 66.920628742 -54.948648348 - 66.852048062 -54.780594077 - 66.874571470 -54.549817517 - 66.965771158 -54.485663791 -} -85e24163fffffff -{ - -51.691899165 -139.169633215 - -51.664442107 -139.038897313 - -51.575413709 -139.010530803 - -51.513977198 -139.112527290 - -51.541428420 -139.242803310 - -51.630321884 -139.271541684 -} -85d4266bfffffff -{ - -51.389064261 -160.555171946 - -51.313107951 -160.503110226 - -51.247564805 -160.592384378 - -51.257918591 -160.733626078 - -51.333825081 -160.785881727 - -51.399427673 -160.696702441 -} -85e29c1bfffffff -{ - -60.077501693 -115.637577670 - -60.025237760 -115.485293423 - -59.933899232 -115.505058876 - -59.894809839 -115.676338591 - -59.946920014 -115.828320631 - -60.038272863 -115.809325702 -} -850c9a9bfffffff -{ - 57.238804879 -175.649980796 - 57.157803016 -175.703012460 - 57.098107920 -175.595911385 - 57.119154430 -175.435916556 - 57.199967899 -175.382272200 - 57.259923519 -175.489233088 -} -85cfb0c3fffffff -{ - -50.052947779 -65.604113329 - -50.022875136 -65.478594815 - -49.946564439 -65.453740976 - -49.900425262 -65.553925687 - -49.930373814 -65.679023449 - -50.006585290 -65.704356450 -} -85a4c6affffffff -{ - -27.445036155 -28.587048599 - -27.526366083 -28.638500554 - -27.604856201 -28.588174275 - -27.601958189 -28.486241964 - -27.520505586 -28.434826036 - -27.442073750 -28.485306076 -} -85523133fffffff -{ - 20.290892971 42.435160407 - 20.201121404 42.416365468 - 20.144231501 42.486404329 - 20.177017836 42.575184140 - 20.266689558 42.594077023 - 20.323674803 42.524092349 -} -857b829bfffffff -{ - 0.032960534 53.237895856 - 0.117022708 53.233865376 - 0.162886938 53.163246952 - 0.124694473 53.096563793 - 0.040547477 53.100550787 - -0.005322236 53.171264486 -} -854db54bfffffff -{ - 31.005597820 -70.487612489 - 30.968297936 -70.574113684 - 30.894793669 -70.576467842 - 30.858603353 -70.492575544 - 30.895774210 -70.406220028 - 30.969264170 -70.403611189 -} -850e9e53fffffff -{ - 57.109475821 -98.410576433 - 57.034299021 -98.514388284 - 56.946214063 -98.446687445 - 56.933106124 -98.275680109 - 57.008074134 -98.171572038 - 57.096358778 -98.238764907 -} -850253b7fffffff -{ - 73.706458683 -91.310372383 - 73.637501191 -91.538545783 - 73.549917555 -91.442082880 - 73.531049094 -91.119791775 - 73.599614011 -90.891255122 - 73.687438852 -90.985357450 -} -85036ad3fffffff -{ - 80.196532275 -53.101405199 - 80.181817047 -53.610685697 - 80.100051200 -53.757332133 - 80.033371598 -53.400510279 - 80.047848475 -52.898190791 - 80.129240787 -52.745795567 -} -85e7400ffffffff -{ - -71.462827033 14.176206474 - -71.369704120 14.140980332 - -71.330364224 13.874516876 - -71.383872851 13.641453522 - -71.477143955 13.674199131 - -71.516759906 13.942494560 -} -8539a13bfffffff -{ - 34.951540788 -9.250734560 - 34.884474302 -9.330245331 - 34.793011734 -9.301308596 - 34.768625017 -9.193095622 - 34.835599195 -9.113660815 - 34.927052266 -9.142362831 -} -85d5ad23fffffff -{ - -52.666161218 -156.433009468 - -52.589878353 -156.384484449 - -52.528688282 -156.479497661 - -52.543715760 -156.622993253 - -52.619957980 -156.671757839 - -52.681213467 -156.576787937 -} -85171237fffffff -{ - 58.059069095 151.282634121 - 57.972526058 151.323146716 - 57.947532348 151.491183961 - 58.008920164 151.619455714 - 58.095583659 151.579756383 - 58.120739451 151.410970056 -} -85e6d5b7fffffff -{ - -57.970968028 13.555808766 - -57.888441942 13.537701338 - -57.849445264 13.387934729 - -57.892799583 13.255705622 - -57.975415773 13.273022599 - -58.014588113 13.423360128 -} -8500d967fffffff -{ - 85.387118599 123.926277119 - 85.315150457 124.673504674 - 85.330553987 125.829999542 - 85.418430455 126.277867702 - 85.492025805 125.538838417 - 85.476103707 124.342872298 -} -852aadabfffffff -{ - 38.988952407 -74.830304081 - 38.943208812 -74.928769897 - 38.859015445 -74.923854111 - 38.820554022 -74.820828225 - 38.866131983 -74.722518771 - 38.950336689 -74.727078759 -} -85075dc3fffffff -{ - 64.366061130 -21.921367047 - 64.387022443 -22.099926833 - 64.323621167 -22.236028212 - 64.239493879 -22.193356057 - 64.218743364 -22.015622365 - 64.281909971 -21.879736693 -} -85608a6bfffffff -{ - 19.794784164 73.684335112 - 19.876325803 73.655923809 - 19.887994971 73.569840751 - 19.818204434 73.512247442 - 19.736727290 73.540638451 - 19.724976177 73.626643145 -} -850a24a3fffffff -{ - 64.769015476 79.701304816 - 64.686542740 79.778790277 - 64.670095635 79.990308445 - 64.736043137 80.125271349 - 64.818628598 80.048602701 - 64.835154174 79.836151090 -} -85b82333fffffff -{ - -31.971404192 129.677078007 - -31.880504137 129.678252908 - -31.836528189 129.591521343 - -31.883329480 129.503599469 - -31.974142219 129.502229829 - -32.018241058 129.588976616 -} -8598c9cffffffff -{ - -23.345825332 -2.195446923 - -23.434822283 -2.222123975 - -23.502209217 -2.149716438 - -23.480486867 -2.050663684 - -23.391460307 -2.024161608 - -23.324185574 -2.096537121 -} -85e0347bfffffff -{ - -60.513115895 67.273404028 - -60.420514953 67.267179693 - -60.378836122 67.108065417 - -60.429521843 66.954759646 - -60.522063685 66.960041494 - -60.563979513 67.119571272 -} -851eca4bfffffff -{ - 39.786388882 25.960104819 - 39.693145944 25.952509650 - 39.640758987 26.055726591 - 39.681555155 26.166606596 - 39.774778928 26.174417318 - 39.827225846 26.071132605 -} -85021007fffffff -{ - 78.162184980 -120.249416075 - 78.134293054 -120.666572863 - 78.046567224 -120.777656926 - 77.987098926 -120.476575389 - 78.014738893 -120.064417765 - 78.102096514 -119.948378642 -} -8501559bfffffff -{ - 76.355467993 13.262569677 - 76.422970770 13.433399105 - 76.494460066 13.238600177 - 76.497936039 12.871081024 - 76.429998096 12.702444480 - 76.359018926 12.899104327 -} -85374d5bfffffff -{ - 36.816963808 -137.482640498 - 36.745492830 -137.522321624 - 36.677460664 -137.456980179 - 36.680914171 -137.352052357 - 36.752363248 -137.312365928 - 36.820380754 -137.377612430 -} -85f29a5bfffffff -{ - -88.040815660 -29.807755237 - -87.965112100 -28.229458648 - -87.881331833 -29.328834062 - -87.870519524 -31.872508766 - -87.942607623 -33.507405187 - -88.029069922 -32.552195305 -} -85de25b3fffffff -{ - -57.156646101 -59.822186103 - -57.117371070 -59.670054136 - -57.031037328 -59.655157715 - -56.984049172 -59.791584031 - -57.023131256 -59.943162441 - -57.109393824 -59.958867240 -} -85b800c7fffffff -{ - -30.186403768 130.300858419 - -30.095765467 130.301325280 - -30.053170333 130.215569735 - -30.101088701 130.129328157 - -30.191643913 130.128672373 - -30.234363924 130.214446923 -} -850accabfffffff -{ - 66.721665845 110.547363227 - 66.663404764 110.735965611 - 66.696799996 110.954315120 - 66.788737402 110.985199756 - 66.847335076 110.796096716 - 66.813657548 110.576607089 -} -853626c3fffffff -{ - 37.206005569 -148.783741908 - 37.129652562 -148.820680298 - 37.066992768 -148.747942317 - 37.080685257 -148.638292745 - 37.157032338 -148.601295792 - 37.219692908 -148.674006761 -} -85f32987fffffff -{ - -72.168120181 -157.502392751 - -72.239881904 -157.429941832 - -72.251059092 -157.165108667 - -72.190246546 -156.974764847 - -72.118676410 -157.049121714 - -72.107726042 -157.311926037 -} -856c95c7fffffff -{ - 4.554818596 -104.621705291 - 4.626434311 -104.569395278 - 4.703560179 -104.608389928 - 4.709006893 -104.699772131 - 4.637301617 -104.752057583 - 4.560239230 -104.712985561 -} -852ed23bfffffff -{ - 48.188491537 138.949759489 - 48.269456433 138.915602116 - 48.283502791 138.799363166 - 48.216637306 138.717615838 - 48.135783097 138.751936264 - 48.121683678 138.867841614 -} -850023dbfffffff -{ - 77.588066944 32.265253389 - 77.640918289 32.563831915 - 77.725642469 32.474443083 - 77.757212045 32.081748482 - 77.703755777 31.782675624 - 77.619337593 31.876765947 -} -8524542bfffffff -{ - 44.211055801 108.182597616 - 44.124037398 108.180518689 - 44.083586754 108.275747771 - 44.129994742 108.373114976 - 44.216915080 108.375515253 - 44.257525626 108.280227320 -} -85ee0043fffffff -{ - -75.012699962 -32.792784182 - -74.936904483 -32.556469299 - -74.845979402 -32.691071970 - -74.830492833 -33.058959165 - -74.905766756 -33.296107473 - -74.997047433 -33.164562162 -} -858a4137fffffff -{ - -2.215159100 -70.422223958 - -2.290434986 -70.473771937 - -2.375591318 -70.433989255 - -2.385401243 -70.342675872 - -2.310106777 -70.291199416 - -2.225020944 -70.330964707 -} -85056507fffffff -{ - 86.805710624 150.564973900 - 86.714924885 150.968554180 - 86.686880764 152.552272014 - 86.748292422 153.799124697 - 86.840075255 153.472059567 - 86.869497246 151.819938456 -} -8581986bfffffff -{ - -5.394284682 -33.535583065 - -5.311080574 -33.487093738 - -5.227339863 -33.534346919 - -5.226774356 -33.630113170 - -5.309990510 -33.678649108 - -5.393760127 -33.631372312 -} -85841387fffffff -{ - -7.546965825 62.614817688 - -7.633670608 62.627150617 - -7.663445866 62.712318671 - -7.606430972 62.785100191 - -7.519721073 62.772653919 - -7.490031072 62.687539437 -} -857ecb73fffffff -{ - 4.379042529 168.917648402 - 4.451658008 168.920030638 - 4.489954255 168.848100806 - 4.455544594 168.773845019 - 4.382924138 168.771585290 - 4.344718190 168.843458826 -} -85f25bcffffffff -{ - -74.559114192 -105.496446314 - -74.587925728 -105.180011085 - -74.526732890 -104.918362010 - -74.437200221 -104.973923617 - -74.408759819 -105.287771077 - -74.469483257 -105.548634161 -} -85be2b6ffffffff -{ - -35.534814986 150.701024116 - -35.439544144 150.676620731 - -35.409001033 150.563343507 - -35.473659572 150.474284808 - -35.568955290 150.498457065 - -35.599567740 150.611919411 -} -85f00a8bfffffff -{ - -77.518441780 62.828050166 - -77.465069388 62.488048283 - -77.499035117 62.123718986 - -77.586880242 62.096218570 - -77.640779269 62.438223233 - -77.606302923 62.805734070 -} -852a868ffffffff -{ - 40.683164088 -80.815140958 - 40.631357082 -80.910821941 - 40.545853176 -80.894836931 - 40.512100838 -80.783538436 - 40.563722879 -80.687949662 - 40.649281925 -80.703566819 -} -852b043bfffffff -{ - 46.990490153 -63.134859030 - 46.953640952 -63.261272164 - 46.863199261 -63.279716433 - 46.809688888 -63.172215952 - 46.846415508 -63.046180400 - 46.936774752 -63.027268369 -} -85aecc07fffffff -{ - -28.990607399 103.089180155 - -29.067662268 103.126673464 - -29.073361600 103.212869457 - -29.002103949 103.261436835 - -28.925148796 103.223952179 - -28.919351632 103.137891346 -} -857aeb27fffffff -{ - 5.994527465 38.424299590 - 6.080012228 38.425547041 - 6.127917098 38.348180460 - 6.090381767 38.269505489 - 6.004868350 38.268199348 - 5.956918833 38.345626888 -} -8533522bfffffff -{ - 30.907469660 167.438834139 - 31.004466928 167.440366616 - 31.054213871 167.342889023 - 31.006875385 167.243992404 - 30.909883237 167.242681336 - 30.860224292 167.340045479 -} -85da4867fffffff -{ - -54.662413029 150.500359559 - -54.578101755 150.468462757 - -54.549431602 150.319108637 - -54.605007451 150.201331880 - -54.689346501 150.232824435 - -54.718082150 150.382498584 -} -85242033fffffff -{ - 47.853992283 100.732358212 - 47.762892479 100.743955659 - 47.725471104 100.860220521 - 47.778991708 100.965060916 - 47.870030637 100.953882440 - 47.907610064 100.837444712 -} -85aea62bfffffff -{ - -31.214934340 91.032657418 - -31.300708461 91.067588174 - -31.314352332 91.169182684 - -31.242278397 91.235676825 - -31.156591699 91.200691576 - -31.142891513 91.099266413 -} -85f1958bfffffff -{ - -74.754158674 111.667343957 - -74.686700036 111.431182092 - -74.706076440 111.081529285 - -74.793089495 110.964978303 - -74.860974050 111.200834049 - -74.841418280 111.553565300 + 60.150242848 152.597172367 + 60.061474989 152.636575004 + 60.034078647 152.815648017 + 60.095267600 152.956151478 + 60.184149157 152.917706156 + 60.211728743 152.737797825 } -85476bcbfffffff +85c99cc7fffffff { - 31.373903469 -160.321379080 - 31.289164374 -160.351726952 - 31.228785521 -160.279110633 - 31.253144721 -160.176098738 - 31.337911183 -160.145655653 - 31.398291131 -160.218319551 + -34.164337233 115.646631959 + -34.106845618 115.573274216 + -34.122573528 115.473055609 + -34.195889122 115.445954930 + -34.253548635 115.519329436 + -34.237724443 115.619788227 } -85d795a3fffffff +851e24d7fffffff { - -51.257170495 47.376665839 - -51.179491983 47.413703956 - -51.130127499 47.332327899 - -51.158258970 47.214019235 - -51.235775268 47.176640654 - -51.285322354 47.257910146 + 52.466906076 15.908230923 + 52.386244341 15.911362302 + 52.350733004 16.037652603 + 52.395839562 16.161022739 + 52.476520830 16.158189118 + 52.512076190 16.031687432 } -85260dabfffffff +85f29a77fffffff { - 41.152684696 -93.593453515 - 41.216638075 -93.518455537 - 41.300720908 -93.559741801 - 41.320864827 -93.676224121 - 41.256868583 -93.751274834 - 41.172771357 -93.709790742 + -87.604934539 -42.634692493 + -87.543030300 -40.972216299 + -87.452328880 -41.454836810 + -87.422300139 -43.472646595 + -87.481149562 -45.114333028 + -87.572998267 -44.762244917 } -854cc53bfffffff +8503263bfffffff { - 18.118382356 -66.607061705 - 18.064608163 -66.652654074 - 17.994933335 -66.615907840 - 17.979101823 -66.533595214 - 18.032920469 -66.488074858 - 18.102526200 -66.524795041 + 89.851412983 96.359003907 + 89.799258488 121.429000141 + 89.798933506 148.511147329 + 89.849268168 174.220594178 + 89.937684450 -172.280549352 + 89.941929081 85.085528952 +} +852aee37fffffff +{ + 33.710272742 -72.018006756 + 33.670096145 -72.108409705 + 33.592655169 -72.108471270 + 33.555397191 -72.018415843 + 33.595431821 -71.928163078 + 33.672866130 -71.927815579 +} +850e9d93fffffff +{ + 57.158212683 -93.615247876 + 57.086660080 -93.730817526 + 56.995537886 -93.674249027 + 56.975795495 -93.502724745 + 57.047121412 -93.386986629 + 57.138416159 -93.442938817 +} +85c78d5bfffffff +{ + -44.104861791 -133.129756689 + -44.066830313 -133.015552158 + -43.974571466 -133.000278172 + -43.920450635 -133.098878680 + -43.958434787 -133.212763087 + -44.050586948 -133.228366569 +} +85f2358ffffffff +{ + -78.379831881 -156.848565132 + -78.458918423 -156.728015003 + -78.472335364 -156.303592239 + -78.406334303 -156.004985766 + -78.327561519 -156.130286348 + -78.314473318 -156.549483124 +} +85c0f6a3fffffff +{ + -40.214324613 -13.025093193 + -40.304135848 -13.071200207 + -40.379606773 -12.991682482 + -40.365177527 -12.865984824 + -40.275297075 -12.820074504 + -40.199915010 -12.899664583 +} +852d414ffffffff +{ + 47.362959067 42.071765499 + 47.302117943 42.167865380 + 47.330710739 42.287908889 + 47.420295085 42.312094410 + 47.481256909 42.215824684 + 47.452513453 42.095539105 +} +8552cc37fffffff +{ + 12.014961038 48.138843936 + 11.933831076 48.118370854 + 11.884186656 48.176135595 + 11.915574604 48.254305715 + 11.996599626 48.274840284 + 12.046341619 48.217143399 +} +85068353fffffff +{ + 73.261129914 -55.693305921 + 73.239409480 -56.002592549 + 73.150660825 -56.081212947 + 73.083852498 -55.852864447 + 73.105416838 -55.546093335 + 73.193944458 -55.465168505 +} +8572e2a7fffffff +{ + 0.370320879 142.064670954 + 0.274898449 142.079785427 + 0.240723513 142.170042766 + 0.301941368 142.245188508 + 0.397351085 142.230101709 + 0.431555723 142.139841436 +} +85c32cb3fffffff +{ + -42.361445148 -66.614242202 + -42.284282428 -66.586225592 + -42.219106621 -66.656386338 + -42.230959694 -66.754647036 + -42.308129898 -66.782954369 + -42.373439733 -66.712710488 +} +85da1987fffffff +{ + -51.190659617 164.528191882 + -51.108341413 164.479162488 + -51.096026261 164.335774717 + -51.166028550 164.241041950 + -51.248425659 164.289832339 + -51.260741657 164.433595395 +} +85ec423bfffffff +{ + -76.367144555 137.853767693 + -76.333818479 137.515821181 + -76.389231675 137.208983482 + -76.478396167 137.239191051 + -76.512011157 137.580110370 + -76.456170448 137.887836457 +} +85db521bfffffff +{ + -56.278908220 169.499182064 + -56.204859657 169.439324220 + -56.200772200 169.284581585 + -56.270747771 169.189240817 + -56.344885060 169.248883029 + -56.348958082 169.404082834 +} +85f2d6d3fffffff +{ + -84.169679152 -93.752566768 + -84.184668654 -92.850188451 + -84.110250668 -92.292382934 + -84.022076074 -92.631702356 + -84.007507395 -93.510504585 + -84.080700766 -94.073162174 +} +85050baffffffff +{ + 79.667209736 134.328612403 + 79.583250161 134.594425875 + 79.582259180 135.130594434 + 79.665220014 135.409403564 + 79.749831087 135.147977458 + 79.750829959 134.603263271 +} +85c92d4ffffffff +{ + -45.593510053 120.061520722 + -45.532119072 119.962832547 + -45.557324532 119.838855352 + -45.644068253 119.813223251 + -45.705653177 119.912009136 + -45.680300092 120.036329941 +} +85808b0bfffffff +{ + 2.990126875 -36.619621625 + 3.071518554 -36.570707098 + 3.155199499 -36.617667211 + 3.157527141 -36.713552577 + 3.076149447 -36.762500456 + 2.992430120 -36.715529751 +} +85030633fffffff +{ + 87.218564701 -124.571842819 + 87.185565262 -126.320699109 + 87.092622671 -126.606916454 + 87.033590156 -125.241837398 + 87.065083707 -123.573096712 + 87.157056376 -123.191338500 +} +854c2007fffffff +{ + 24.526599146 -65.145690607 + 24.454231843 -65.159528057 + 24.395450588 -65.103187839 + 24.408950398 -65.032914985 + 24.481358034 -65.018928222 + 24.540225619 -65.075363667 +} +8516ee37fffffff +{ + 50.510536508 172.704612143 + 50.600393382 172.714314759 + 50.651470219 172.591722100 + 50.612601574 172.459546569 + 50.522722221 172.450211873 + 50.471733762 172.572684539 +} +85829387fffffff +{ + 3.789199178 15.958952770 + 3.875919805 15.968230329 + 3.921920254 15.896517267 + 3.881277243 15.815558773 + 3.794614657 15.806236224 + 3.748536989 15.877917093 +} +85655b8bfffffff +{ + 5.301524845 92.129240759 + 5.394760391 92.103272055 + 5.419437269 92.009244076 + 5.350878488 91.941237615 + 5.257678462 91.967238228 + 5.233001653 92.061213508 +} +85e8ec83fffffff +{ + -59.145199640 -82.797864677 + -59.064607527 -82.713486890 + -58.989144494 -82.798859488 + -58.994112619 -82.968425692 + -59.074615574 -83.053306722 + -59.150239699 -82.968120355 +} +85e698bbfffffff +{ + -55.676067400 22.565165359 + -55.599896990 22.525891261 + -55.572530543 22.383206590 + -55.621240275 22.279203582 + -55.697560914 22.317912011 + -55.725021894 22.461190626 +} +85991a2ffffffff +{ + -10.694339148 -9.885769483 + -10.770876066 -9.916013947 + -10.833082108 -9.857104209 + -10.818640407 -9.767930585 + -10.742034950 -9.737797905 + -10.679939655 -9.796726876 +} +85e52c1bfffffff +{ + -66.242219074 122.446732779 + -66.182984217 122.264634053 + -66.218053242 122.045538057 + -66.312579920 122.007516643 + -66.372085212 122.190047439 + -66.336792440 122.410169912 +} +85012a2bfffffff +{ + 73.429000148 22.570684868 + 73.486496484 22.750038779 + 73.561933951 22.635634307 + 73.579529481 22.339917216 + 73.521606646 22.161213731 + 73.446515403 22.277562075 +} +858c0b53fffffff +{ + -7.887436574 101.906104130 + -7.802715833 101.883935748 + -7.780857605 101.794802754 + -7.843768512 101.727862990 + -7.928480293 101.750083004 + -7.950290201 101.839191228 +} +8582214ffffffff +{ + -7.235373183 9.100580192 + -7.145065952 9.112219978 + -7.092537493 9.043588726 + -7.130250047 8.963378243 + -7.220466258 8.951702772 + -7.273060930 9.020273388 +} +8553362ffffffff +{ + 27.724526254 37.344945948 + 27.630547020 37.328556214 + 27.571081890 37.409917068 + 27.605510757 37.507638067 + 27.699409990 37.524163906 + 27.758960417 37.442832860 +} +85bb105bfffffff +{ + -41.076854931 -176.428580081 + -41.001238949 -176.372264089 + -40.921671974 -176.431632425 + -40.917712032 -176.547122743 + -40.993252067 -176.603456321 + -41.072827959 -176.544282378 +} +852e46affffffff +{ + 37.503297899 136.065268543 + 37.586115943 136.033968603 + 37.604547236 135.937929625 + 37.540224589 135.873425160 + 37.457536800 135.904821108 + 37.439041463 136.000625891 +} +85f29017fffffff +{ + -89.098395580 152.417245586 + -89.171916818 148.787026697 + -89.254258772 151.540658157 + -89.255342294 158.746749863 + -89.173612444 161.784755601 + -89.099056289 158.369997790 } -85818467fffffff +85056677fffffff { - -9.477694538 -34.870671029 - -9.394481707 -34.821434605 - -9.311366523 -34.869105136 - -9.311447439 -34.966030598 - -9.394677684 -35.015308835 - -9.477809594 -34.967619933 + 84.975557058 134.624267416 + 84.893376030 135.153441106 + 84.891447753 136.229909047 + 84.971626804 136.811429726 + 85.055095089 136.301115989 + 85.057098803 135.189663671 +} +854f2c13fffffff +{ + 10.970767184 155.639853933 + 10.879399752 155.652136488 + 10.842050400 155.735133628 + 10.896018984 155.805809507 + 10.987310778 155.793568176 + 11.024709637 155.710609729 +} +85d7698bfffffff +{ + -50.430066565 23.071896064 + -50.513648931 23.073778040 + -50.547954839 23.177833414 + -50.498679684 23.279699873 + -50.415192898 23.277515996 + -50.380885601 23.173767095 +} +85152c27fffffff +{ + 60.945032042 112.200550884 + 60.886536156 112.347528516 + 60.915040559 112.523374188 + 61.002264821 112.553004574 + 61.061047422 112.405767794 + 61.032318269 112.229158150 +} +859c1d67fffffff +{ + -13.108959482 143.489061827 + -13.195532208 143.503642365 + -13.224697555 143.591742536 + -13.167335918 143.665260366 + -13.080768795 143.650708316 + -13.051557628 143.562609896 +} +85bf0d27fffffff +{ + -41.175669569 156.508852201 + -41.082998203 156.475465296 + -41.058524290 156.351544308 + -41.126684233 156.260760025 + -41.219408431 156.293909463 + -41.243919983 156.418081117 +} +85e9092ffffffff +{ + -63.366889278 -102.406278967 + -63.302119790 -102.261697482 + -63.217089893 -102.316957098 + -63.196721099 -102.516036470 + -63.261306632 -102.660697044 + -63.346444554 -102.606201831 +} +856aa473fffffff +{ + 4.652136865 21.032865900 + 4.739446090 21.040509651 + 4.786055931 20.965601206 + 4.745428311 20.883060175 + 4.658157871 20.875364204 + 4.611476191 20.950261431 +} +85bea323fffffff +{ + -28.413379060 156.949056477 + -28.320392722 156.919989468 + -28.295553702 156.813684179 + -28.363658163 156.736260312 + -28.456707613 156.765154982 + -28.481589591 156.871646158 +} +85c70d8bfffffff +{ + -42.905718883 -143.969988827 + -42.817254449 -143.941216542 + -42.758626098 -144.031111688 + -42.788412565 -144.149873054 + -42.876893539 -144.178885745 + -42.935571629 -144.088896856 +} +8500caaffffffff +{ + 87.006602750 115.591535317 + 86.944696703 116.906818718 + 86.972240624 118.619834576 + 87.063036656 119.097109662 + 87.127492094 117.774635045 + 87.098547948 115.979822458 +} +85a14673fffffff +{ + -24.857783090 -140.391183468 + -24.766305186 -140.370933856 + -24.702600485 -140.445811913 + -24.730302299 -140.541025550 + -24.821809363 -140.561443132 + -24.885585554 -140.486479164 +} +858e2d97fffffff +{ + -8.608884865 -79.296069959 + -8.687533458 -79.353407739 + -8.776207170 -79.313277797 + -8.786196554 -79.215793500 + -8.707528620 -79.158492999 + -8.618890658 -79.198639365 +} +852881a7fffffff +{ + 44.766274123 -118.059812027 + 44.842821749 -117.998316336 + 44.913336351 -118.062845089 + 44.907255421 -118.188906078 + 44.830690622 -118.250236107 + 44.760223901 -118.185671255 +} +85336ebbfffffff +{ + 25.292769542 163.043319537 + 25.387182903 163.040117601 + 25.433104087 162.947099557 + 25.384532598 162.857411166 + 25.290149709 162.860804294 + 25.244307690 162.953694700 +} +852eee8bfffffff +{ + 42.391530912 136.772189402 + 42.473769729 136.739152812 + 42.489606491 136.635261747 + 42.423269205 136.564680036 + 42.341153684 136.597833469 + 42.325252187 136.701452246 +} +85a0623bfffffff +{ + -19.211419005 -143.652779387 + -19.121891301 -143.630388716 + -19.055978922 -143.701339491 + -19.079506793 -143.794741240 + -19.169039429 -143.817281793 + -19.235039374 -143.746270804 +} +85105e9bfffffff +{ + 63.224016083 59.310461660 + 63.154485332 59.429417545 + 63.167220653 59.631064968 + 63.249553130 59.714626514 + 63.319263332 59.595840953 + 63.306461352 59.393320536 +} +851720abfffffff +{ + 64.272091453 152.645693823 + 64.180291038 152.691418458 + 64.151649915 152.899923278 + 64.214602988 153.063831968 + 64.306530733 153.019408850 + 64.335378972 152.809772012 +} +859a7467fffffff +{ + -13.680914984 -178.269927753 + -13.603284548 -178.226614325 + -13.533550034 -178.269702864 + -13.541394993 -178.355988088 + -13.618910021 -178.399302989 + -13.688695410 -178.356331346 +} +85c21e83fffffff +{ + -38.145206669 -55.690152581 + -38.094872198 -55.638120571 + -38.031696995 -55.683654953 + -38.018884166 -55.781150292 + -38.069230723 -55.833129772 + -38.132378013 -55.787666559 +} +85030d17fffffff +{ + 84.730692070 -74.673127687 + 84.772813257 -75.518228334 + 84.725643421 -76.381016690 + 84.637544938 -76.384286334 + 84.596683008 -75.553529553 + 84.642680507 -74.705157951 +} +850db16bfffffff +{ + 68.553702219 179.883977969 + 68.462098061 179.819605741 + 68.397715054 -179.997919393 + 68.424553480 -179.751109793 + 68.515935721 -179.685055703 + 68.580702394 -179.867485681 +} +851601b3fffffff +{ + 55.722721067 165.786761788 + 55.637156582 165.784743165 + 55.595881313 165.922713010 + 55.639930285 166.063047466 + 55.725469428 166.065827440 + 55.766985559 165.927511799 +} +85125ecbfffffff +{ + 53.703251710 -110.426667934 + 53.623965406 -110.492043746 + 53.546433655 -110.408326939 + 53.547966961 -110.259395145 + 53.627124942 -110.193564675 + 53.704878174 -110.277118935 +} +85ed413bfffffff +{ + -75.220387850 167.492301994 + -75.227447441 167.187292720 + -75.306201356 167.056820932 + -75.378101986 167.233606785 + -75.370877933 167.541613011 + -75.291918568 167.669818119 +} +85ec547bfffffff +{ + -73.919609051 140.687642590 + -73.888753808 140.394855872 + -73.947326915 140.143473796 + -74.037126281 140.184511067 + -74.068186003 140.479653085 + -74.009240368 140.731392128 +} +85252d63fffffff +{ + 54.089218760 98.533929104 + 53.997736421 98.551963308 + 53.959520788 98.688714537 + 54.012633912 98.807696598 + 54.104070610 98.790217671 + 54.142440128 98.653201407 +} +85d49887fffffff +{ + -41.488632781 -152.706792252 + -41.400354123 -152.668617647 + -41.333143178 -152.753464209 + -41.354151147 -152.876491575 + -41.442408582 -152.914867564 + -41.509679373 -152.830015179 +} +85f28477fffffff +{ + -86.505979802 -152.041609414 + -86.590055204 -151.496746217 + -86.598626206 -149.983774355 + -86.522502471 -149.084483153 + -86.439859207 -149.676732303 + -86.431889724 -151.122846114 +} +85ab5603fffffff +{ + -19.336987051 71.209562740 + -19.431787202 71.229721225 + -19.462694781 71.327252938 + -19.398754743 71.404521862 + -19.303981718 71.384240132 + -19.273121512 71.286812584 +} +853ce86bfffffff +{ + 25.343745599 94.382192130 + 25.430885722 94.355094719 + 25.453314206 94.254691483 + 25.388611580 94.181439630 + 25.301475055 94.208580283 + 25.279037495 94.308929683 +} +850a4237fffffff +{ + 71.018043974 98.895457002 + 70.975204860 99.152983039 + 71.025641143 99.389475144 + 71.119325302 99.369272925 + 71.162463813 99.110127926 + 71.111617065 98.872808042 +} +85caa343fffffff +{ + -44.719773448 50.228635334 + -44.802517819 50.233138325 + -44.849123126 50.335507056 + -44.812930009 50.433371585 + -44.730127147 50.428670593 + -44.683575799 50.326303242 +} +85ef22abfffffff +{ + -84.799690571 -59.935499109 + -84.760914600 -58.987358748 + -84.666526784 -58.907821828 + -84.611186261 -59.745438243 + -84.648888296 -60.672464053 + -84.742983548 -60.782786405 +} +85260323fffffff +{ + 41.956766700 -97.275802537 + 42.023069762 -97.201104491 + 42.106025604 -97.246829939 + 42.122678227 -97.367440211 + 42.056329956 -97.442159994 + 41.973374338 -97.396248093 +} +85ec240bfffffff +{ + -69.026619387 159.071061012 + -69.018549794 158.845463494 + -69.090853370 158.718742549 + -69.171444760 158.818425134 + -69.179455007 159.045663448 + -69.106933304 159.171570715 +} +85016e47fffffff +{ + 75.718434153 -0.131275446 + 75.791397180 -0.044284448 + 75.849374939 -0.292399708 + 75.833864031 -0.627549808 + 75.760667518 -0.711449692 + 75.703213471 -0.463308358 +} +85375043fffffff +{ + 37.328444920 -144.265789837 + 37.254064950 -144.304236997 + 37.189131374 -144.233780168 + 37.198581319 -144.124932750 + 37.272947526 -144.086447921 + 37.337877596 -144.156847962 +} +850c100bfffffff +{ + 63.820557602 -165.832405920 + 63.740810883 -165.930279212 + 63.668120542 -165.824752926 + 63.674913958 -165.621971141 + 63.754368429 -165.523463567 + 63.827321655 -165.628366896 +} +850a6d83fffffff +{ + 75.289640485 88.255406691 + 75.263221307 88.606166979 + 75.327813052 88.864409281 + 75.419345518 88.771785164 + 75.445976931 88.417424792 + 75.380861794 88.159311004 +} +85452053fffffff +{ + 15.144073737 -88.001660768 + 15.213991813 -87.941844246 + 15.297332547 -87.969450818 + 15.310767053 -88.057006350 + 15.240761151 -88.116882819 + 15.157408661 -88.089143877 +} +8514e8a3fffffff +{ + 54.479048203 140.491214967 + 54.400545973 140.554343635 + 54.390382276 140.710026815 + 54.458667692 140.803282209 + 54.537362694 140.740639451 + 54.547579692 140.584253266 +} +85a2763bfffffff +{ + -18.933554768 53.687118341 + -19.025398988 53.693393420 + -19.063410521 53.778032116 + -19.009475890 53.856378006 + -18.917570741 53.849973560 + -18.879661082 53.765352645 +} +8544a11bfffffff +{ + 25.708631103 -79.971756053 + 25.770556165 -79.908543162 + 25.855518616 -79.930002519 + 25.878619207 -80.014827172 + 25.816643709 -80.078143144 + 25.731618098 -80.056531369 +} +8521855bfffffff +{ + 42.495261539 61.110880051 + 42.415596975 61.184567664 + 42.422371744 61.313827045 + 42.508868295 61.369759015 + 42.588682358 61.296163382 + 42.581850258 61.166542992 +} +85480b77fffffff +{ + 28.373126697 -110.236826712 + 28.455021981 -110.177497235 + 28.540907277 -110.228540602 + 28.544844761 -110.338992359 + 28.462901230 -110.398246968 + 28.377068472 -110.347124998 +} +85146d4bfffffff +{ + 62.184620366 141.800232116 + 62.098862705 141.877910828 + 62.086171851 142.079056257 + 62.159158345 142.203686230 + 62.245141618 142.126865410 + 62.257913143 141.924552225 +} +850333c3fffffff +{ + 87.098277663 -162.003458946 + 87.019665933 -162.964785408 + 86.935425240 -162.140049567 + 86.927848960 -160.411127774 + 87.004179460 -159.414792783 + 87.090352532 -160.178999706 +} +85ad4c07fffffff +{ + -30.593910527 2.626164235 + -30.686427526 2.603032736 + -30.751440447 2.683622011 + -30.723839501 2.787265937 + -30.631327379 2.810181464 + -30.566411184 2.729669180 +} +85165167fffffff +{ + 52.765628718 175.348889583 + 52.852903591 175.362930899 + 52.905618717 175.238467487 + 52.870965502 175.100050488 + 52.783656271 175.086395829 + 52.731034380 175.210771099 +} +851315d7fffffff +{ + 66.334054029 -128.198166025 + 66.245851901 -128.228802818 + 66.188035233 -128.068092487 + 66.218191272 -127.876283758 + 66.306404666 -127.844342649 + 66.364451548 -128.005513218 +} +8592de6ffffffff +{ + -20.377328391 -108.871619714 + -20.325439635 -108.800756201 + -20.247826310 -108.818394145 + -20.222052821 -108.906718175 + -20.273808879 -108.977552959 + -20.351470967 -108.960092611 +} +85ca63c7fffffff +{ + -37.573391789 64.401383372 + -37.664688570 64.418786714 + -37.700673496 64.528920932 + -37.645311998 64.621552073 + -37.554001078 64.603965727 + -37.518065676 64.493931142 +} +85c70333fffffff +{ + -44.580297018 -141.444903822 + -44.493091784 -141.418656049 + -44.438193882 -141.510786955 + -44.470457677 -141.629286748 + -44.557688870 -141.655788567 + -44.612630435 -141.563536681 +} +856098b3fffffff +{ + 20.316159738 74.992733151 + 20.398266276 74.964155003 + 20.410344527 74.876478050 + 20.340394252 74.817458270 + 20.258349066 74.846019324 + 20.246192786 74.933617341 +} +8541ad73fffffff +{ + 24.947664830 114.988232913 + 25.033935208 114.969640410 + 25.068221539 114.880853530 + 25.016192437 114.810647161 + 24.929854920 114.829320237 + 24.895613624 114.918119125 +} +85947397fffffff +{ + -10.269878189 129.818629994 + -10.359218479 129.834863951 + -10.393258990 129.923022984 + -10.337962471 129.994988574 + -10.248577459 129.978762009 + -10.214533637 129.890562394 +} +850ac42bfffffff +{ + 64.872428363 105.635598948 + 64.820811539 105.818951033 + 64.859665914 106.011311391 + 64.950434047 106.021089078 + 65.002337885 105.837087768 + 64.963185509 105.643957539 +} +8560daaffffffff +{ + 18.590806156 67.840587724 + 18.523466878 67.885727244 + 18.521323072 67.976664170 + 18.586522784 68.022642009 + 18.653977147 67.977587951 + 18.656116703 67.886470298 +} +85f10037fffffff +{ + -83.898123550 115.178383907 + -83.923087432 114.374213909 + -84.007046821 114.209475348 + -84.066472963 114.869174994 + -84.040693566 115.690887994 + -83.956316878 115.835147288 +} +8556ed3bfffffff +{ + 8.120281976 -30.640874660 + 8.196788807 -30.594465615 + 8.277621631 -30.640340594 + 8.282006247 -30.732658292 + 8.205511970 -30.779122419 + 8.124620496 -30.733213874 +} +859026bbfffffff +{ + -12.426676631 -123.355808908 + -12.352484187 -123.353034824 + -12.301133009 -123.413308501 + -12.323920221 -123.476462339 + -12.398176123 -123.479337103 + -12.449581403 -123.418957264 } -85d460a3fffffff +85b5358ffffffff { - -48.117209546 -173.589780066 - -48.045791394 -173.529755396 - -47.970501642 -173.598838257 - -47.966608249 -173.727733175 - -48.037960282 -173.787807344 - -48.113271805 -173.718937646 + -39.181621852 -153.187682939 + -39.092007439 -153.149972886 + -39.023096641 -153.232390931 + -39.043738713 -153.352520266 + -39.133329556 -153.390419268 + -39.202301992 -153.308000342 } -85ef8b93fffffff +8590b42bfffffff { - -76.306423806 -14.494218629 - -76.215947314 -14.346563296 - -76.140206464 -14.599470617 - -76.154378608 -14.999067210 - -76.244480392 -15.150338184 - -76.320786371 -14.898431845 -} -85c22b13fffffff -{ - -37.132753027 -58.736861557 - -37.200924892 -58.784845586 - -37.256839426 -58.742326763 - -37.244579301 -58.651887920 - -37.176455005 -58.604027173 - -37.120543287 -58.646481923 -} -851d666bfffffff -{ - 51.100783480 -132.503980748 - 51.024252572 -132.512664995 - 50.970661682 -132.412763879 - 50.993448769 -132.303953286 - 51.070014072 -132.294804874 - 51.123758219 -132.394931196 -} -85e57477fffffff -{ - -67.796044746 114.449484670 - -67.727940906 114.273899456 - -67.751703113 114.028068217 - -67.843733688 113.956353873 - -67.912145157 114.131958177 - -67.888217584 114.379263513 -} -852b898bfffffff -{ - 43.051723055 -73.640756434 - 43.004880629 -73.749279988 - 42.916332642 -73.746193222 - 42.874624387 -73.635006494 - 42.921295534 -73.526684510 - 43.009845860 -73.529347638 -} -8518809bfffffff -{ - 50.942549419 -23.367615355 - 50.871503176 -23.456525600 - 50.788703882 -23.398541754 - 50.776891395 -23.251920495 - 50.847848804 -23.162925801 - 50.930707440 -23.220635932 -} -85d4208ffffffff -{ - -51.667537761 -162.645908683 - -51.592986417 -162.591548470 - -51.526246364 -162.678877495 - -51.534001088 -162.820445710 - -51.608498105 -162.874980637 - -51.675294777 -162.787773354 -} -85d55277fffffff -{ - -51.291872908 -165.502948844 - -51.218504384 -165.446246161 - -51.149605548 -165.529689247 - -51.154025130 -165.669681782 - -51.227334752 -165.726527625 - -51.296283725 -165.643238486 -} -85256e97fffffff -{ - 54.274078985 107.998038840 - 54.185439787 107.995845733 - 54.138772883 108.114160407 - 54.180587078 108.234762056 - 54.269123723 108.237449937 - 54.315948931 108.119042041 -} -851744abfffffff -{ - 62.861728262 170.988287471 - 62.770404877 170.967645996 - 62.718847995 171.133158935 - 62.758303516 171.319667374 - 62.849534590 171.341514043 - 62.901403330 171.175648824 -} -8508d417fffffff -{ - 63.894662860 23.009249219 - 63.865905559 23.156191223 - 63.918282339 23.286290533 - 63.999566952 23.269440578 - 64.028346256 23.121788881 - 63.975818719 22.991698721 -} -855d0837fffffff -{ - 19.308331382 -149.633926553 - 19.217361471 -149.667550227 - 19.144319284 -149.600425327 - 19.162228243 -149.499694461 - 19.253180543 -149.466018187 - 19.326241538 -149.533125215 -} -8521413bfffffff -{ - 54.730322386 74.376486073 - 54.643830515 74.446933751 - 54.634919359 74.612603346 - 54.712463115 74.708415284 - 54.799068081 74.638373728 - 54.808016316 74.472112393 -} -85af2b93fffffff -{ - -18.085843552 90.577957662 - -18.173306104 90.609071490 - -18.193339990 90.700428762 - -18.125953160 90.760535822 - -18.038594894 90.729376136 - -18.018519201 90.638155055 -} -85f3498ffffffff -{ - -70.271058307 -132.568896917 - -70.326804611 -132.404376068 - -70.302772960 -132.158276631 - -70.223102672 -132.078505504 - -70.167732668 -132.243266786 - -70.191657309 -132.487567022 -} -8520244ffffffff -{ - 48.553479846 66.941525636 - 48.469787925 67.015651091 - 48.470519010 67.162103644 - 48.554958882 67.234898830 - 48.638788351 67.160982686 - 48.638040372 67.014060816 -} -856b2383fffffff -{ - 16.555513139 22.411552288 - 16.462092957 22.408359280 - 16.412634312 22.492857398 - 16.456511375 22.580613039 - 16.549927390 22.583947327 - 16.599470635 22.499384715 -} -85f12e97fffffff -{ - -85.676717967 135.129871132 - -85.730049584 134.174243099 - -85.816322478 134.357082995 - -85.848699164 135.539049770 - -85.793596677 136.503897171 - -85.707916861 136.278071872 -} -852cd547fffffff -{ - 35.039746809 52.658219309 - 34.968406624 52.730430158 - 34.980971099 52.838758537 - 35.064977837 52.875114111 - 35.136468631 52.802887282 - 35.123801897 52.694320478 + -11.208314437 -115.584667925 + -11.269763489 -115.633914646 + -11.349243497 -115.612286911 + -11.367354398 -115.541327646 + -11.305879785 -115.491989467 + -11.226319813 -115.513702036 } -85324c2bfffffff +85f28333fffffff { - 34.595048199 156.154888111 - 34.690331531 156.143444235 - 34.729812085 156.039112548 - 34.673971665 155.946425657 - 34.578758603 155.958085433 - 34.539315573 156.062216453 + -86.956723074 -116.344026897 + -87.005719867 -114.870113843 + -86.958475884 -113.372228432 + -86.864244875 -113.395835094 + -86.817323068 -114.828004662 + -86.862618547 -116.278481682 +} +85155ab3fffffff +{ + 60.095462897 129.629160772 + 60.019764997 129.734515259 + 60.024464626 129.921153598 + 60.104920142 130.003453137 + 60.180900729 129.898465019 + 60.176142893 129.710807256 +} +8510ee57fffffff +{ + 59.961738707 58.612289278 + 59.890244936 58.722095127 + 59.903556508 58.905781662 + 59.988433157 58.980381417 + 60.060094326 58.870697972 + 60.046711217 58.686290142 +} +85913083fffffff +{ + -18.065246506 -124.978452886 + -17.984952844 -124.974086443 + -17.932530437 -125.039040107 + -17.960355331 -125.108478724 + -18.040724931 -125.112963947 + -18.093193738 -125.047891678 +} +85e69a8bfffffff +{ + -54.762303439 23.478984095 + -54.687715626 23.438789955 + -54.661569090 23.300256789 + -54.709925407 23.201354369 + -54.784664235 23.241030204 + -54.810895994 23.380128185 +} +8500ec27fffffff +{ + 86.315593831 30.645886664 + 86.376678935 31.668141791 + 86.466893812 31.324932121 + 86.494998855 29.901313624 + 86.431889724 28.877153886 + 86.342731657 29.277233799 +} +853e2c2bfffffff +{ + 30.896614428 25.510080828 + 30.799601363 25.503560714 + 30.746067663 25.598108807 + 30.789476507 25.699237177 + 30.886469976 25.705937708 + 30.940074327 25.611329538 +} +85e4a80bfffffff +{ + -55.015556254 100.555813749 + -54.933611364 100.466709912 + -54.936690083 100.297996414 + -55.021721652 100.217637226 + -55.103869682 100.306396489 + -55.100782967 100.475861919 +} +85bbaaa3fffffff +{ + -37.886388306 -175.311492192 + -37.807675161 -175.257638031 + -37.727530287 -175.316418372 + -37.726083281 -175.428877661 + -37.804714757 -175.482756925 + -37.884874876 -175.424152155 +} +852229d3fffffff +{ + 44.467292694 -171.754545217 + 44.556127917 -171.726500176 + 44.621338599 -171.818617516 + 44.597629835 -171.938864592 + 44.508700147 -171.966691943 + 44.443573608 -171.874490475 +} +85c4f1b7fffffff +{ + -45.219546675 -37.655717682 + -45.288863085 -37.725434082 + -45.371934619 -37.677529475 + -45.385696266 -37.559620770 + -45.316286126 -37.489862814 + -45.233208168 -37.538054736 +} +85964ea3fffffff +{ + -11.828916519 18.658713622 + -11.733411852 18.667726085 + -11.678341167 18.589100680 + -11.718724666 18.501487106 + -11.814174439 18.492418556 + -11.869295659 18.571019595 +} +854a1637fffffff +{ + 21.691757626 127.480678075 + 21.606376124 127.497769339 + 21.581150853 127.588985564 + 21.641352068 127.663161474 + 21.726760495 127.646073989 + 21.751940850 127.554806739 +} +85385337fffffff +{ + 31.827895360 7.316027488 + 31.733982524 7.326253788 + 31.695606340 7.424431947 + 31.751135125 7.512556095 + 31.845122975 7.502489277 + 31.883507103 7.404138624 +} +85504513fffffff +{ + 22.687830762 -138.812615017 + 22.602515729 -138.849458204 + 22.527673052 -138.787500143 + 22.538147917 -138.688775386 + 22.623417955 -138.651922153 + 22.698258148 -138.713803561 +} +850650cbfffffff +{ + 64.837439459 -36.603367970 + 64.840045339 -36.808803662 + 64.761349519 -36.917833956 + 64.680313086 -36.821811914 + 64.677808753 -36.617590708 + 64.756239612 -36.508181848 +} +85e29617fffffff +{ + -62.623903831 -111.871398013 + -62.568743736 -111.713235361 + -62.480039554 -111.744048503 + -62.446449844 -111.932162821 + -62.501434913 -112.090094072 + -62.590184207 -112.060143674 +} +8555a657fffffff +{ + 24.934600466 -19.373209155 + 24.860563936 -19.439573540 + 24.772974553 -19.402276370 + 24.759366929 -19.298773529 + 24.833290953 -19.232396325 + 24.920935010 -19.269534499 +} +85502dabfffffff +{ + 18.745598485 -134.432762475 + 18.660698269 -134.469302874 + 18.585402932 -134.411983255 + 18.595010675 -134.318214274 + 18.679848220 -134.281681013 + 18.755140696 -134.338909461 +} +85bf9107fffffff +{ + -29.855831635 164.038584470 + -29.765095442 164.002217111 + -29.746195364 163.894472216 + -29.818029795 163.822884335 + -29.908860355 163.859114164 + -29.927762158 163.967069781 +} +85f0cbb7fffffff +{ + -70.045134779 48.324238522 + -69.976905152 48.155666189 + -69.986964494 47.908101498 + -70.065451968 47.827275406 + -70.134072713 47.995627953 + -70.123813904 48.245034889 +} +855f4613fffffff +{ + 6.856410981 -61.198980466 + 6.933983355 -61.152632444 + 7.009646785 -61.192041318 + 7.007728396 -61.277724089 + 6.930223961 -61.324010338 + 6.854570022 -61.284675650 +} +8504352bfffffff +{ + 75.712985052 134.841403102 + 75.627970817 135.032678575 + 75.626053181 135.424394376 + 75.709140432 135.629339959 + 75.794633696 135.440446051 + 75.796560804 135.044189528 +} +853f615bfffffff +{ + 37.774459027 28.641349175 + 37.680411486 28.631285561 + 37.625346406 28.730266621 + 37.664263564 28.839352207 + 37.758278135 28.849616370 + 37.813408653 28.750594566 +} +859e5e27fffffff +{ + -16.024259159 158.079741650 + -15.939640731 158.053372330 + -15.916808967 157.960430764 + -15.978551683 157.893713951 + -16.063240047 157.919956125 + -16.086115845 158.013042466 +} +852ce41bfffffff +{ + 39.290601327 48.943497027 + 39.221724001 49.023355850 + 39.239617988 49.135607026 + 39.326512809 49.168243054 + 39.395535119 49.088324614 + 39.377517417 48.975829414 +} +85503663fffffff +{ + 17.876189900 -127.055052418 + 17.957332833 -127.015447149 + 18.034602713 -127.068310930 + 18.030633293 -127.160753808 + 17.949478614 -127.200228384 + 17.872305023 -127.147390915 +} +8505620ffffffff +{ + 84.415681982 143.488851553 + 84.327005999 143.835319453 + 84.310719128 144.792126825 + 84.382644328 145.428598028 + 84.472204861 145.103857155 + 84.488965797 144.120439792 +} +854e861bfffffff +{ + 27.333074764 156.868346643 + 27.426976594 156.858575493 + 27.468323641 156.762801753 + 27.415718012 156.676965270 + 27.321881902 156.686920740 + 27.280585588 156.782528560 +} +85b520d3fffffff +{ + -39.745217683 -155.119505145 + -39.656476614 -155.079592722 + -39.586428409 -155.161245245 + -39.605060612 -155.282792420 + -39.693770271 -155.322885550 + -39.763879225 -155.241251191 +} +856a2927fffffff +{ + 9.011908463 30.129752728 + 8.925780667 30.120946855 + 8.878460835 30.195759524 + 8.917167588 30.279394232 + 9.003255005 30.288315185 + 9.050676154 30.213486438 +} +85235bb7fffffff +{ + 43.999133912 -175.501997601 + 44.090130215 -175.478392396 + 44.153010953 -175.575586337 + 44.124804530 -175.696427926 + 44.033726762 -175.719789299 + 43.970936767 -175.622553421 +} +856f6d43fffffff +{ + 0.934133517 -125.539435443 + 0.854803462 -125.572507825 + 0.791261822 -125.527732107 + 0.807020517 -125.449978778 + 0.886249770 -125.416936681 + 0.949821060 -125.461617571 +} +8500f333fffffff +{ + 83.079528917 75.423578470 + 83.075530049 76.183466791 + 83.154798963 76.596164541 + 83.238996282 76.240869668 + 83.243006719 75.462623698 + 83.162807550 75.058318281 +} +85aa512bfffffff +{ + -25.025455153 80.176112301 + -25.118719350 80.203531651 + -25.143523298 80.305672757 + -25.075064503 80.380250079 + -24.981864787 80.352728494 + -24.957059332 80.250731594 +} +85800ebbfffffff +{ + -2.986433240 -43.261018693 + -2.903117902 -43.210507813 + -2.817832088 -43.257481814 + -2.815852018 -43.354949258 + -2.899150722 -43.405464977 + -2.984446125 -43.358508556 +} +85c70463fffffff +{ + -46.304821306 -142.876731322 + -46.218987231 -142.848102135 + -46.164140232 -142.942048262 + -46.195080529 -143.064736448 + -46.280932077 -143.093629038 + -46.335825988 -142.999570224 +} +856ba8a7fffffff +{ + 9.785838416 21.049037001 + 9.698210667 21.047082667 + 9.652063956 21.127193392 + 9.693459503 21.209322544 + 9.781088999 21.211402547 + 9.827321328 21.131227733 +} +856d438ffffffff +{ + 9.773828583 -88.367039794 + 9.703909022 -88.423235522 + 9.625223588 -88.387642178 + 9.616488996 -88.295807451 + 9.686469529 -88.239604495 + 9.765123636 -88.275243377 +} +85054ba7fffffff +{ + 80.673730682 -176.047673973 + 80.582900326 -176.232117685 + 80.510490858 -175.850099962 + 80.528121158 -175.285264619 + 80.618419536 -175.093060753 + 80.691623138 -175.473350691 +} +85aa334bfffffff +{ + -25.410959654 68.750982575 + -25.506737252 68.770194188 + -25.539617646 68.871638047 + -25.476669887 68.953766996 + -25.380902172 68.934413890 + -25.348072231 68.833073198 +} +853895abfffffff +{ + 25.318338935 -4.677485756 + 25.254325459 -4.749017655 + 25.167778453 -4.728707112 + 25.145264876 -4.637052259 + 25.209180176 -4.565608142 + 25.295707099 -4.585731040 +} +8502a113fffffff +{ + 76.618024876 -127.705774424 + 76.579036609 -128.059675260 + 76.489427751 -128.108578430 + 76.439009520 -127.807963613 + 76.477651308 -127.457306580 + 76.567054995 -127.404034673 +} +85109e6bfffffff +{ + 49.793390640 51.802051254 + 49.723062101 51.896581528 + 49.742614249 52.036301237 + 49.832607866 52.081883074 + 49.903084630 51.987312010 + 49.883419318 51.847199111 +} +85291917fffffff +{ + 35.639256658 -124.513373080 + 35.722840124 -124.464258166 + 35.796448884 -124.525359384 + 35.786414605 -124.635557689 + 35.702838209 -124.684503645 + 35.629288983 -124.623420515 } -8505593bfffffff +851b1077fffffff { - 79.690358526 170.787724266 - 79.594344023 170.735817787 - 79.537432969 171.166338738 - 79.575822448 171.651173975 - 79.671650099 171.711271955 - 79.729280753 171.278374468 + 56.475878892 -50.877862916 + 56.455348462 -51.041610043 + 56.365676228 -51.095095318 + 56.296717609 -50.985389795 + 56.317215315 -50.822383271 + 56.406704187 -50.768343919 } -85a2ec23fffffff +85156437fffffff { - -23.639417639 55.997612286 - -23.733379880 56.006056130 - -23.772882070 56.096564143 - -23.718330624 56.178596375 - -23.624313940 56.170009493 - -23.584903068 56.079533452 + 65.260472522 117.638477373 + 65.194116471 117.799818840 + 65.217129665 118.016026547 + 65.306703697 118.072147637 + 65.373403215 117.910723649 + 65.350184337 117.693256720 } -85f284a7fffffff +85e15843fffffff { - -85.874542594 -150.665882844 - -85.957421003 -150.178011827 - -85.963840344 -148.901576099 - -85.886922620 -148.162362943 - -85.805302131 -148.682605187 - -85.799330565 -149.910895360 + -62.134245582 52.206755605 + -62.047056899 52.245777902 + -61.990584077 52.116937344 + -62.021062157 51.949133991 + -62.108070128 51.909311243 + -62.164781028 52.038089638 } -852a603bfffffff -{ - 35.284379474 -63.212897411 - 35.250582885 -63.310906127 - 35.172435505 -63.325139226 - 35.128146734 -63.241645729 - 35.161835817 -63.143863800 - 35.239920948 -63.129348870 -} -850d1adbfffffff -{ - 69.246883216 -164.224838388 - 69.165651036 -164.355343941 - 69.087585639 -164.227694670 - 69.090445977 -163.970632142 - 69.171315927 -163.839205018 - 69.249687558 -163.965751451 -} -85b702c3fffffff -{ - -36.071502695 -93.793274091 - -36.000775806 -93.722391331 - -35.913799488 -93.764952577 - -35.897417784 -93.878216547 - -35.968012744 -93.949215087 - -36.055121315 -93.906834473 -} -85570a67fffffff -{ - 19.444849186 -33.660542280 - 19.369082151 -33.711376824 - 19.288873213 -33.663837761 - 19.284321634 -33.565530339 - 19.359999874 -33.514593867 - 19.440318518 -33.562066460 -} -85bee56ffffffff -{ - -31.759756941 148.369095672 - -31.664556815 148.348439655 - -31.632510842 148.241466699 - -31.695582504 148.154995135 - -31.790796140 148.175433875 - -31.822924752 148.282561638 -} -85e9ac23fffffff -{ - -69.673946182 -99.936183692 - -69.692404145 -99.687891698 - -69.625620170 -99.505985394 - -69.540766535 -99.572431438 - -69.522550459 -99.818997996 - -69.588947298 -100.000836822 -} -853d1a57fffffff -{ - 29.548227483 80.464367670 - 29.466226669 80.501691762 - 29.454621579 80.606077663 - 29.524948030 80.673364656 - 29.607026987 80.636243547 - 29.618701488 80.531632081 -} -85be838bfffffff -{ - -25.912348404 156.184759826 - -25.820168311 156.157250211 - -25.794901856 156.054001190 - -25.861766828 155.978089036 - -25.954007369 156.005432387 - -25.979322595 156.108854423 -} -85a56a2ffffffff -{ - -16.123639845 -18.922202795 - -16.203882554 -18.961738026 - -16.272688773 -18.906902864 - -16.261151550 -18.812455985 - -16.180806603 -18.773003409 - -16.112101113 -18.827914799 -} -8576140bfffffff -{ - -0.749336909 155.951133678 - -0.839966196 155.963125143 - -0.872014944 156.044417980 - -0.813508032 156.113681229 - -0.722946959 156.101729706 - -0.690824561 156.020474979 -} -85aa8087fffffff -{ - -31.775117806 68.605847348 - -31.869476304 68.625977385 - -31.902413256 68.732854205 - -31.840948527 68.819486953 - -31.746595702 68.799199364 - -31.713701824 68.692436427 -} -855806b7fffffff -{ - 14.541472500 5.529585088 - 14.453500016 5.539567594 - 14.412577212 5.622412192 - 14.459595017 5.695402806 - 14.547644347 5.685530171 - 14.588599084 5.602556914 -} -8546acb7fffffff -{ - 22.262842024 -171.744677784 - 22.350378328 -171.723470678 - 22.406356235 -171.793073948 - 22.374682979 -171.883932839 - 22.287045199 -171.905015705 - 22.231182117 -171.835364165 -} -8574eed3fffffff -{ - -1.746018699 -2.592509448 - -1.666484505 -2.579160272 - -1.622115276 -2.632013302 - -1.657207680 -2.698137935 - -1.736635077 -2.711497854 - -1.781076805 -2.658722453 -} -8547140bfffffff -{ - 32.077650536 -175.005343798 - 32.170810579 -174.984643834 - 32.231814106 -175.067203807 - 32.199550861 -175.170499031 - 32.106298473 -175.191023075 - 32.045401603 -175.108428137 -} -85732897fffffff -{ - 13.835661271 134.499931352 - 13.742368919 134.516372607 - 13.710151612 134.608866403 - 13.771245244 134.684947854 - 13.864548900 134.668522966 - 13.896747686 134.576000186 -} -85bf9627fffffff -{ - -29.098341932 166.019358736 - -29.008741343 165.981611222 - -28.991360813 165.875392356 - -29.063589919 165.806712357 - -29.153292598 165.844337666 - -29.170664102 165.950765551 -} -8502a373fffffff -{ - 75.300474111 -130.209398970 - 75.257868523 -130.525223358 - 75.168493613 -130.554444818 - 75.121870473 -130.271545196 - 75.164125737 -129.958172003 - 75.253351992 -129.925254619 -} -85d5626ffffffff -{ - -54.039604717 -170.832189271 - -53.973001534 -170.768649745 - -53.903686522 -170.848189725 - -53.900933519 -170.991042608 - -53.967472489 -171.054674258 - -54.036828660 -170.975361664 -} -857026cffffffff -{ - 8.132156310 -171.575801844 - 8.045034550 -171.596563583 - 7.979858808 -171.534313351 - 8.001763084 -171.451219559 - 8.088937917 -171.430368815 - 8.154155441 -171.492700853 -} -85021463fffffff -{ - 78.811084557 -122.577387448 - 78.779832039 -123.015007307 - 78.690689589 -123.114170374 - 78.633137610 -122.781582677 - 78.664074072 -122.349320212 - 78.752875234 -122.244325846 -} -85c70547fffffff -{ - -45.573273994 -143.416459996 - -45.486832701 -143.387424176 - -45.430845519 -143.480402221 - -45.461251767 -143.602521705 - -45.547709203 -143.631815150 - -45.603744378 -143.538731683 -} -850d7143fffffff -{ - 68.806035134 -143.105005691 - 68.747264239 -143.295627362 - 68.662139479 -143.260658765 - 68.635730368 -143.036822771 - 68.694153683 -142.846672129 - 68.779332427 -142.879883012 -} -85f10edbfffffff -{ - -83.724950596 105.727559558 - -83.735573260 104.914946560 - -83.815533144 104.624456398 - -83.885620651 105.161978122 - -83.874543619 105.994495090 - -83.793840813 106.269274616 -} -85715643fffffff -{ - 9.104977552 -169.121144903 - 9.016308488 -169.143548243 - 8.949931132 -169.079901328 - 8.972181533 -168.993775837 - 9.060897298 -168.971283252 - 9.127316006 -169.035005371 -} -851ade97fffffff -{ - 40.627311736 -45.659658328 - 40.541555194 -45.707644447 - 40.467490655 -45.638479998 - 40.479082707 -45.521315377 - 40.564826921 -45.473083921 - 40.638991509 -45.542262023 -} -8524eb23fffffff -{ - 39.927791872 110.022098700 - 39.844089281 110.017391224 - 39.806129917 110.101924138 - 39.851716385 110.191196629 - 39.935320595 110.196165035 - 39.973436816 110.111600323 -} -85058357fffffff -{ - 69.980088374 124.004261116 - 69.905591596 124.183038109 - 69.920401722 124.459031433 - 70.009866045 124.558416674 - 70.084772577 124.380031553 - 70.069804132 124.101858117 -} -85147123fffffff -{ - 59.164108100 136.327329345 - 59.083967568 136.412188780 - 59.079193384 136.594059566 - 59.154544464 136.692038816 - 59.234929744 136.607726414 - 59.239719265 136.424884225 -} -85baf68ffffffff -{ - -29.060774813 -177.391318891 - -28.979975418 -177.341446956 - -28.900185889 -177.392458351 - -28.901174755 -177.493188079 - -28.981873971 -177.543067497 - -29.061684440 -177.492209952 -} -85060603fffffff -{ - 70.824281943 -30.381748247 - 70.838575405 -30.637421467 - 70.767799952 -30.796757814 - 70.683046102 -30.700623194 - 70.668924279 -30.446787787 - 70.739385446 -30.287257550 -} -850b5e6ffffffff -{ - 68.513014173 83.494586644 - 68.492376138 83.735121754 - 68.557141028 83.893164708 - 68.642901902 83.810310717 - 68.663619961 83.568018356 - 68.598496602 83.410345420 -} -85b31a13fffffff -{ - -22.185835989 -72.564224683 - -22.263193993 -72.620574281 - -22.344128927 -72.578112414 - -22.347679859 -72.479311879 - -22.270342499 -72.423034955 - -22.189433585 -72.465485742 -} -850c21b3fffffff -{ - 66.642133570 -152.701173289 - 66.573166704 -152.850542282 - 66.491829986 -152.781449506 - 66.479297140 -152.564249692 - 66.547916067 -152.414770682 - 66.629414989 -152.482596097 -} -85bee093fffffff -{ - -31.726274772 149.466125960 - -31.631144940 149.444211643 - -31.599981183 149.336607893 - -31.663869485 149.250757003 - -31.759019236 149.272456768 - -31.790260912 149.380222179 -} -85f0b0dbfffffff -{ - -71.938751081 94.465534151 - -71.854436932 94.328985508 - -71.847042005 94.024303391 - -71.923895672 93.853733642 - -72.008489097 93.988690399 - -72.015949998 94.295822795 -} -85ec5ba3fffffff -{ - -76.764343984 125.129659889 - -76.714179795 124.811087724 - -76.753224495 124.445406819 - -76.842799253 124.395613087 - -76.893402694 124.715806058 - -76.853989378 125.084179270 -} -8507445bfffffff -{ - 65.281986629 -15.961010818 - 65.310142487 -16.132895733 - 65.253869647 -16.282533468 - 65.169649452 -16.259841618 - 65.141734271 -16.088636843 - 65.197799282 -15.939444539 -} -850365a7fffffff -{ - 80.939833051 -36.795237646 - 80.949715166 -37.334085611 - 80.879446430 -37.614954719 - 80.799877096 -37.359737421 - 80.790101925 -36.829169465 - 80.859790585 -36.545624219 -} -85db9233fffffff -{ - -45.404592583 -179.864314903 - -45.328984984 -179.922457190 - -45.332081543 179.958050777 - -45.410867880 179.896416639 - -45.486578993 179.954523437 - -45.483400192 -179.925699607 -} -8598338bfffffff -{ - -12.994100575 -9.690112426 - -13.073306680 -9.720961035 - -13.137566978 -9.660404328 - -13.122508113 -9.568979759 - -13.043233121 -9.538249477 - -12.979085799 -9.598825236 -} -85a2e51bfffffff -{ - -22.712812551 53.529562026 - -22.805718452 53.535902697 - -22.845764904 53.622994027 - -22.792808580 53.703726676 - -22.699837550 53.697248736 - -22.659887908 53.610175477 -} -85cdb323fffffff -{ - -39.680316727 94.424459203 - -39.605592045 94.372036167 - -39.602681247 94.254870684 - -39.674458602 94.189768328 - -39.749323738 94.241958695 - -39.752271156 94.359484877 -} -857a71a7fffffff -{ - -0.961350154 38.965927174 - -0.869829685 38.967002188 - -0.820192228 38.887475735 - -0.862042005 38.806807734 - -0.953601243 38.805670799 - -1.003272008 38.885263810 -} -854d2997fffffff -{ - 25.571047876 -60.029471894 - 25.494804912 -60.050112559 - 25.431080789 -59.991575361 - 25.443500404 -59.912312992 - 25.519769971 -59.891503707 - 25.583593434 -59.950125396 -} -8546e627fffffff -{ - 20.917923863 -167.438324251 - 20.827980132 -167.462993352 - 20.764990006 -167.395332527 - 20.791932072 -167.302925673 - 20.881930336 -167.278158849 - 20.944932031 -167.345896552 -} -85226c97fffffff -{ - 44.617199113 178.782608602 - 44.710054701 178.799399783 - 44.768581816 178.693704185 - 44.734159816 178.571242942 - 44.641248752 178.554736044 - 44.582814998 178.660405720 -} -852d487bfffffff -{ - 48.061682918 44.801562147 - 47.998092907 44.897763505 - 48.024436945 45.023695018 - 48.114513491 45.053709770 - 48.178233938 44.957368399 - 48.151747159 44.831151954 -} -85c6f407fffffff -{ - -37.036030667 -130.720385930 - -36.993887503 -130.619124904 - -36.903364262 -130.608989412 - -36.855071557 -130.699842319 - -36.897146825 -130.800863266 - -36.987582544 -130.811271060 -} -853748a7fffffff -{ - 36.332807564 -137.236035114 - 36.260899805 -137.275637790 - 36.192420074 -137.210679668 - 36.195863532 -137.106214319 - 36.267748576 -137.066607506 - 36.336212911 -137.131469988 -} -85ef298bfffffff -{ - -80.811252112 -71.846207770 - -80.790088776 -71.267901531 - -80.698197246 -71.100777105 - -80.627957402 -71.503437696 - -80.648798372 -72.072277524 - -80.740197241 -72.247824488 -} -85114c6ffffffff -{ - 68.417297167 44.618399896 - 68.367621080 44.783653169 - 68.400273620 44.999571520 - 68.482752183 45.051072211 - 68.532609367 44.885402135 - 68.499806231 44.668646503 -} -85e82ad3fffffff -{ - -63.310272470 -92.772937896 - -63.237190038 -92.650962270 - -63.157438733 -92.727962341 - -63.150618109 -92.926410568 - -63.223542825 -93.048772923 - -63.303445781 -92.972303571 -} -85f0432bfffffff -{ - -75.609601399 35.711342808 - -75.527138933 35.536685766 - -75.521073498 35.174921731 - -75.597503733 34.983734367 - -75.680440335 35.156228100 - -75.686472532 35.522103049 -} -8541a033fffffff -{ - 24.993428956 118.008013497 - 25.078488238 117.990999758 - 25.113920995 117.905705973 - 25.064245912 117.837405510 - 24.979111087 117.854499902 - 24.943726882 117.939814101 -} -853ed263fffffff -{ - 17.631956646 23.842660173 - 17.537873775 23.838253369 - 17.487453955 23.922914786 - 17.531030288 24.012040343 - 17.625101233 24.016590363 - 17.675607895 23.931871650 -} -85c00317fffffff -{ - -35.697105716 -10.417572768 - -35.788777819 -10.458247284 - -35.863177149 -10.380663117 - -35.845807224 -10.262365117 - -35.754074024 -10.221883593 - -35.679771754 -10.299506632 -} -85d580a3fffffff -{ - -51.295220979 -150.942069276 - -51.215506119 -150.900997483 - -51.157651842 -150.998219306 - -51.179449946 -151.136543753 - -51.259143285 -151.177884869 - -51.317060174 -151.080632713 -} -85d214d3fffffff -{ - -48.184544076 -104.209854482 - -48.116626530 -104.105503162 - -48.022440100 -104.141260317 - -47.996087458 -104.280974057 - -48.063855551 -104.385334408 - -48.158125523 -104.349972851 -} -853b5567fffffff -{ - 33.995549691 -45.183158043 - 33.910605619 -45.227880933 - 33.834017481 -45.164592212 - 33.842262518 -45.056572660 - 33.927184540 -45.011644610 - 34.003883676 -45.074940954 -} -8569a30ffffffff -{ - 7.764884430 109.542531378 - 7.857191854 109.522403290 - 7.884890553 109.433484540 - 7.820214560 109.364698370 - 7.727863898 109.384895043 - 7.700232421 109.473809347 -} -858d71d3fffffff -{ - -16.280065094 105.376413627 - -16.206100991 105.356115460 - -16.189477486 105.271085399 - -16.246868920 105.206368022 - -16.320825655 105.226720363 - -16.337398402 105.311735962 -} -852129b3fffffff -{ - 54.149601863 63.429839854 - 54.070360105 63.518520577 - 54.076305389 63.681400489 - 54.161533132 63.756176014 - 54.240925299 63.667687884 - 54.234939214 63.504229976 -} -8597ab87fffffff -{ - -14.952638655 34.418698968 - -14.855698548 34.421708740 - -14.804885099 34.336699974 - -14.850996885 34.248626473 - -14.947960765 34.245545447 - -14.998789164 34.330609180 -} -85118963fffffff -{ - 56.397286453 42.389683998 - 56.340393110 42.506490273 - 56.372912415 42.653257780 - 56.462473108 42.683584086 - 56.519490271 42.566532106 - 56.486822596 42.419399173 -} -853b285bfffffff -{ - 38.654744590 -48.838860220 - 38.568968118 -48.880774231 - 38.496905865 -48.812186605 - 38.510520203 -48.701643269 - 38.596298500 -48.659487168 - 38.668460741 -48.728116198 -} -85039a7bfffffff -{ - 75.728460708 -145.902089417 - 75.665080182 -146.178522515 - 75.575145103 -146.107246710 - 75.548448095 -145.763402747 - 75.611315136 -145.487651949 - 75.701390092 -145.555047001 -} -8500e977fffffff -{ - 88.003976711 27.595274969 - 88.069059241 29.418014068 - 88.158920771 28.645970682 - 88.181452526 25.852284344 - 88.112589924 24.051298029 - 88.025069063 25.011953304 -} -85bce8b7fffffff -{ - -29.424159155 25.089564321 - -29.334726586 25.096775338 - -29.283222295 25.007996094 - -29.321141896 24.911996997 - -29.410558936 24.904710300 - -29.462071995 24.993498319 -} -85dd136bfffffff -{ - -60.182247868 -8.554898191 - -60.097073213 -8.505272755 - -60.031321061 -8.634783014 - -60.050448178 -8.813925506 - -60.135490536 -8.864433170 - -60.201538670 -8.734918755 -} -858ec067fffffff -{ - -18.460576383 -84.941766649 - -18.536696884 -85.002609890 - -18.624331647 -84.962579145 - -18.635845417 -84.861663986 - -18.559718434 -84.800830588 - -18.472084191 -84.840902344 -} -85f2f063fffffff -{ - -82.402584504 -109.064879214 - -82.440207172 -108.435162505 - -82.383585136 -107.877404939 - -82.290233715 -107.954162199 - -82.253367132 -108.574372756 - -82.309105668 -109.127276240 -} -85259d83fffffff -{ - 42.380577840 92.769583330 - 42.289518386 92.794008900 - 42.262026837 92.910307529 - 42.325456775 93.002411470 - 42.416510246 92.978340172 - 42.444139994 92.861810425 -} -85c0f5c3fffffff -{ - -39.760623883 -11.390304350 - -39.851248725 -11.434262362 - -39.925727472 -11.353542094 - -39.909489795 -11.228809556 - -39.818802405 -11.185058381 - -39.744415152 -11.265832373 -} -8500438ffffffff -{ - 84.314819085 -11.207806092 - 84.400557974 -11.148506209 - 84.450498018 -11.930614467 - 84.413461638 -12.762326669 - 84.327606349 -12.796555781 - 84.278886123 -12.024230778 -} -850cb18bfffffff -{ - 61.887105922 -175.614597511 - 61.801984980 -175.677264856 - 61.738027677 -175.551042935 - 61.758894844 -175.362347116 - 61.843799127 -175.298828447 - 61.908053267 -175.424853178 -} -85cd8113fffffff -{ - -41.113821521 91.214954050 - -41.036496209 91.166589320 - -41.030040999 91.047068447 - -41.100850331 90.975542065 - -41.178301713 91.023629252 - -41.184817844 91.143521175 -} -851f41c3fffffff -{ - 54.832871946 25.743767926 - 54.755242974 25.734789797 - 54.710910929 25.860587839 - 54.744141130 25.995467322 - 54.821755666 26.004765360 - 54.866154628 25.878864220 -} -858759affffffff -{ - -12.583845067 79.651518615 - -12.673878470 79.676103092 - -12.700460585 79.768925321 - -12.636992731 79.837045096 - -12.547028921 79.812374451 - -12.520463322 79.719670029 -} -85e4eddbfffffff -{ - -59.908626216 87.791537755 - -59.818343993 87.724190019 - -59.802799656 87.536252053 - -59.877423474 87.414764634 - -59.967839948 87.481331352 - -59.983498755 87.670169452 -} -85a9840ffffffff -{ - -28.861472072 -42.490364062 - -28.792320707 -42.437936486 - -28.721204315 -42.486873030 - -28.719260194 -42.588221847 - -28.788432000 -42.640658370 - -28.859527481 -42.591737291 -} -85f0b253fffffff -{ - -70.619062882 93.843488324 - -70.533689905 93.717858866 - -70.525456886 93.432283367 - -70.602526091 93.270200966 - -70.688155527 93.394394257 - -70.696459716 93.682117575 -} -859691cffffffff -{ - -4.424824885 35.148144027 - -4.330301443 35.150738961 - -4.279478312 35.069364044 - -4.323143224 34.985340662 - -4.417690749 34.982680455 - -4.468549359 35.064108909 -} -85b25043fffffff -{ - -30.884700580 -67.519996009 - -30.957681096 -67.574519000 - -31.027398064 -67.531033837 - -31.024119612 -67.433058363 - -30.951174537 -67.378632668 - -30.881472498 -67.422085020 -} -85eab247fffffff -{ - -59.996923678 178.075475114 - -59.933385956 178.001290609 - -59.941326541 177.842271423 - -60.012847673 177.756934733 - -60.076478854 177.831020971 - -60.068495370 177.990543452 -} -8522916bfffffff -{ - 51.865554830 -156.864590031 - 51.938811677 -156.817402803 - 52.009651316 -156.891365071 - 52.007204374 -157.012773510 - 51.933844228 -157.059859202 - 51.863034352 -156.985638707 -} -85c31cd7fffffff -{ - -43.511601953 -60.813599464 - -43.435661406 -60.795940649 - -43.376773783 -60.868899393 - -43.393714796 -60.959648375 - -43.469694202 -60.977595068 - -43.528693898 -60.904504936 -} -85d1b46bfffffff -{ - -42.657714384 -2.269824663 - -42.749837219 -2.303642599 - -42.816024694 -2.212167598 - -42.790000217 -2.086924784 - -42.697861120 -2.053386065 - -42.631762609 -2.144810562 -} -85f30513fffffff -{ - -73.893106708 -165.775018810 - -73.968681471 -165.737747324 - -73.991759107 -165.456478094 - -73.938911840 -165.214524373 - -73.863427731 -165.254482763 - -73.840698328 -165.533715212 -} -850054cffffffff -{ - 83.174555875 21.161811203 - 83.243048384 21.607580525 - 83.326141024 21.296960851 - 83.339886936 20.528176438 - 83.270374041 20.087671290 - 83.188139197 20.410425683 -} -85665863fffffff -{ - 1.554556730 -69.873937726 - 1.481950150 -69.924517716 - 1.398269281 -69.885240827 - 1.387270477 -69.795402672 - 1.459903598 -69.744894268 - 1.543509011 -69.784152326 -} -85678c9bfffffff -{ - 12.650930577 -79.343945161 - 12.585278369 -79.397624924 - 12.508495989 -79.360074579 - 12.497419315 -79.268829785 - 12.563123909 -79.215182465 - 12.639852777 -79.252747373 -} -85ec4893fffffff -{ - -79.259841290 134.752759641 - -79.224149164 134.337070293 - -79.275489462 133.936230465 - -79.363036747 133.948987586 - -79.399155070 134.368849658 - -79.347296042 134.771765627 -} -851768cbfffffff -{ - 63.447084273 175.861881807 - 63.356776983 175.823792689 - 63.299592488 175.981190186 - 63.332391726 176.176831491 - 63.422551503 176.216100288 - 63.480060326 176.058551143 -} -855821a3fffffff -{ - 17.288379252 6.827747414 - 17.197910575 6.837029936 - 17.156351971 6.922484154 - 17.205230425 6.998788125 - 17.295774052 6.989625342 - 17.337364340 6.904038709 -} -853501abfffffff -{ - 41.919158269 -23.136424109 - 41.843027907 -23.214515709 - 41.754645666 -23.164017373 - 41.742336762 -23.035638617 - 41.818377740 -22.957484774 - 41.906816926 -23.007771340 -} -85069d1bfffffff -{ - 72.275203772 -57.636806987 - 72.250142247 -57.929048423 - 72.159898511 -57.995083141 - 72.094907544 -57.771060851 - 72.119798962 -57.481014133 - 72.209850292 -57.412805434 -} -85d90b27fffffff -{ - -54.699109060 135.916661398 - -54.654386325 135.779029366 - -54.700731757 135.650046980 - -54.792024025 135.658506131 - -54.836881627 135.796609533 - -54.790311677 135.925781699 -} -8503b60bfffffff +8516dca3fffffff { - 78.854140751 -171.949317972 - 78.765530060 -172.135869126 - 78.689334162 -171.842391455 - 78.701110508 -171.364472267 - 78.789199469 -171.173160040 - 78.866035304 -171.464462307 + 47.022737051 170.417076408 + 47.115629955 170.423105140 + 47.165764295 170.305038589 + 47.122922496 170.181079738 + 47.030018309 170.175385576 + 46.979966986 170.293315575 } -85d70297fffffff -{ - -55.867010067 37.664981909 - -55.800428419 37.592300100 - -55.791315030 37.450641321 - -55.848815267 37.381039834 - -55.915615327 37.453433263 - -55.924696625 37.595718376 -} -85f1618ffffffff -{ - -86.779501142 -6.763276875 - -86.687892359 -6.373226205 - -86.624206685 -7.539804837 - -86.649863731 -9.100581033 - -86.740347982 -9.561670555 - -86.806341544 -8.392739774 -} -8540e967fffffff -{ - 30.326341131 99.765015220 - 30.409616815 99.739157426 - 30.434711248 99.637666807 - 30.376524986 99.562073023 - 30.293234833 99.587991348 - 30.268145346 99.689443048 -} -85199eaffffffff -{ - 55.831211441 -24.947232704 - 55.763120119 -25.042152730 - 55.685707060 -24.976630582 - 55.676313989 -24.816491865 - 55.744310914 -24.721444199 - 55.821795219 -24.786661711 -} -85c41d9bfffffff -{ - -41.184556430 -36.608184252 - -41.257191009 -36.673499767 - -41.340455786 -36.626623727 - -41.351085271 -36.514179173 - -41.278348496 -36.448836130 - -41.195084531 -36.495964820 -} -85861eb3fffffff -{ - -5.104337900 84.132660648 - -5.017892394 84.106345142 - -4.992958745 84.018261318 - -5.054454615 83.956555541 - -5.140830682 83.982879274 - -5.165780328 84.070900657 -} -85006347fffffff -{ - 82.072972112 -7.204300585 - 82.155679478 -7.117966334 - 82.209802850 -7.640938278 - 82.180292884 -8.247195450 - 82.097372017 -8.321361701 - 82.044166249 -7.801504667 -} -85f38a3bfffffff -{ - -82.935439217 -171.177971092 - -83.021917704 -171.157156277 - -83.058232432 -170.503697073 - -83.007161436 -169.880744857 - -82.920729877 -169.917671613 - -82.885311074 -170.561479296 -} -851e490ffffffff -{ - 46.784021736 35.432377892 - 46.699058705 35.414105327 - 46.641450887 35.516655198 - 46.668746568 35.637452959 - 46.753657959 35.655942619 - 46.811325435 35.553417804 -} -8502946bfffffff -{ - 72.059368737 -139.816783591 - 72.004011748 -140.052560889 - 71.915960718 -140.027707811 - 71.883249982 -139.769600466 - 71.938226039 -139.534761639 - 72.026291965 -139.557088411 -} -855b8a73fffffff -{ - 15.714770674 178.535160229 - 15.800635044 178.546811905 - 15.849419218 178.471875233 - 15.812221570 178.385301048 - 15.726304086 178.373792139 - 15.677637249 178.448714514 -} -85411ed3fffffff -{ - 23.507539469 115.214041241 - 23.594653398 115.195660192 - 23.628751334 115.107577219 - 23.575686334 115.037862773 - 23.488503115 115.056323623 - 23.454454170 115.144419133 -} -859aa0a7fffffff -{ - -12.521528556 -168.426623399 - -12.439473903 -168.387180146 - -12.369500416 -168.440297303 - -12.381502526 -168.532775497 - -12.463457165 -168.572268453 - -12.533509685 -168.519233719 -} -85e206bbfffffff -{ - -61.236995990 -134.534229113 - -61.209464454 -134.367418782 - -61.122384287 -134.341990331 - -61.062944313 -134.482689859 - -61.090423284 -134.648801235 - -61.177394478 -134.674910232 -} -85011c4bfffffff -{ - 73.578611169 34.984709284 - 73.624945269 35.215838527 - 73.706754232 35.163819246 - 73.742032823 34.877972061 - 73.695239423 34.646299651 - 73.613628412 34.701009208 -} -85e7856ffffffff -{ - -62.912096996 35.691219358 - -62.836979329 35.601433858 - -62.827058134 35.415339270 - -62.892281477 35.317952313 - -62.967672781 35.407173571 - -62.977567029 35.594350152 -} -85e0f6a7fffffff -{ - -53.713405637 60.735464735 - -53.626150535 60.746168204 - -53.582827875 60.628785053 - -53.626541631 60.500559488 - -53.713694376 60.489277142 - -53.757236059 60.606798513 -} -85ee2ccbfffffff -{ - -76.205370569 -47.023190239 - -76.146427559 -46.699916822 - -76.049945894 -46.752502412 - -76.012278363 -47.123710683 - -76.070674580 -47.445616365 - -76.167281852 -47.397694779 -} -85811857fffffff -{ - -9.938824014 -40.748803548 - -9.855927527 -40.698097466 - -9.771526591 -40.745822873 - -9.770020329 -40.844247519 - -9.852921023 -40.894969969 - -9.937323769 -40.847251552 -} -85124ddbfffffff -{ - 54.250255097 -102.353940506 - 54.174068333 -102.440528128 - 54.089514949 -102.370003915 - 54.080940804 -102.213240438 - 54.156946870 -102.126318262 - 54.241707815 -102.196492042 -} -85250c0bfffffff -{ - 51.398179944 97.930358925 - 51.306249328 97.948612154 - 51.269681540 98.078588029 - 51.324891664 98.190556059 - 51.416779180 98.172798189 - 51.453499949 98.042576891 -} -85022127fffffff -{ - 80.980114008 -93.505559136 - 80.912751383 -93.882313190 - 80.832933899 -93.698088131 - 80.820041560 -93.143586027 - 80.886725863 -92.765122208 - 80.966978102 -92.942786862 -} -85c0c98bfffffff -{ - -44.531506501 -4.054201477 - -44.622482299 -4.091412227 - -44.689358592 -3.998727715 - -44.665169344 -3.868863257 - -44.574167725 -3.831938253 - -44.507381023 -3.924591493 -} -85d1a1a7fffffff -{ - -41.796095833 4.183260848 - -41.888824222 4.158809197 - -41.949325507 4.252176813 - -41.917020817 4.369878370 - -41.824311705 4.394041482 - -41.763887847 4.300791742 -} -85f0e20ffffffff -{ - -74.310636269 60.536269838 - -74.220645671 60.561149927 - -74.166182605 60.301134485 - -74.201343357 60.015579570 - -74.291193617 59.987838025 - -74.346025110 60.248504519 -} -85494e1bfffffff -{ - 22.187849459 -116.940554962 - 22.271266070 -116.889440674 - 22.354740890 -116.941558711 - 22.354720062 -117.044822183 - 22.271264119 -117.095831813 - 22.187868305 -117.043682878 -} -853c548ffffffff -{ - 29.375601622 91.752667759 - 29.458172344 91.724508034 - 29.477372674 91.622934506 - 29.414019998 91.549583421 - 29.331457584 91.577779165 - 29.312239474 91.679290123 -} -85032473fffffff -{ - 89.046640820 32.771568389 - 89.104985141 37.090618861 - 89.197827928 36.192587743 - 89.229041209 29.866516998 - 89.162321494 25.473045100 - 89.073365992 27.391622151 -} -85212617fffffff -{ - 51.513223773 55.576964893 - 51.439824432 55.670992875 - 51.455405416 55.819683634 - 51.544477715 55.874807684 - 51.618030116 55.780805179 - 51.602356949 55.631652054 -} -8526918bfffffff -{ - 39.806476394 -109.595314472 - 39.882961568 -109.529105156 - 39.963222615 -109.585149289 - 39.966960371 -109.707504467 - 39.890438142 -109.773627240 - 39.810215228 -109.717481799 -} -85c498abfffffff -{ - -44.548868752 -46.243902294 - -44.610066851 -46.314538121 - -44.692030003 -46.282177092 - -44.712841863 -46.178897552 - -44.651569286 -46.108148777 - -44.569559417 -46.140792377 -} -85161eb7fffffff -{ - 52.867198405 163.545145582 - 52.954912289 163.541279854 - 52.994701262 163.407029879 - 52.946707819 163.276906582 - 52.859016263 163.281172763 - 52.819295576 163.415162001 -} -85ef000bfffffff -{ - -82.905178373 -45.654828566 - -82.845756316 -45.049347341 - -82.751210041 -45.170104703 - -82.715776769 -45.879777750 - -82.774154797 -46.481073890 - -82.868998808 -46.376990165 -} -85ba704bfffffff -{ - -31.592824064 174.861915701 - -31.508467341 174.816519861 - -31.499405500 174.712462736 - -31.574760080 174.653588723 - -31.659238627 174.698921033 - -31.668240714 174.803191253 -} -852d5983fffffff -{ - 46.484154466 44.867482355 - 46.420038028 44.960738484 - 46.445515099 45.082946218 - 46.535250840 45.112166188 - 46.599498491 45.018779181 - 46.573878953 44.896302774 -} -85d50837fffffff -{ - -53.772430083 -164.125874215 - -53.701258522 -164.068319479 - -53.635526801 -164.156658100 - -53.640908758 -164.302403522 - -53.712022086 -164.360128007 - -53.777811730 -164.271938119 -} -85a270d7fffffff -{ - -18.463140147 54.227897647 - -18.555010406 54.234580205 - -18.592610500 54.319504714 - -18.538238706 54.397726340 - -18.446310449 54.390914528 - -18.408811910 54.306010392 -} -85c68167fffffff -{ - -38.768093617 -126.288249901 - -38.721566571 -126.184190195 - -38.628458736 -126.180406318 - -38.581941512 -126.280370419 - -38.628378680 -126.384202783 - -38.721422750 -126.388298158 -} -85eb0b83fffffff -{ - -64.854700020 -160.852311934 - -64.861496232 -160.692898826 - -64.795006529 -160.608987269 - -64.721879159 -160.684366242 - -64.715198034 -160.843008714 - -64.781529399 -160.927040618 -} -853c340ffffffff -{ - 29.007129644 81.787464881 - 28.925488621 81.822671263 - 28.913072787 81.925452698 - 28.982222078 81.993243378 - 29.063934454 81.958242512 - 29.076426334 81.855245098 -} -8524f6b7fffffff -{ - 39.865893124 102.383303151 - 39.778463407 102.390585656 - 39.744902023 102.488167451 - 39.798612481 102.578577611 - 39.885980234 102.571599519 - 39.919699668 102.473906977 -} -8504146ffffffff -{ - 72.385037855 138.068354580 - 72.297639944 138.209071551 - 72.290397092 138.527995046 - 72.370493684 138.709170047 - 72.458260283 138.570307064 - 72.465562045 138.248396297 -} -8556d56bfffffff -{ - 7.004493813 -37.001318649 - 7.083746795 -36.952577090 - 7.165776179 -36.999285191 - 7.168595925 -37.094743892 - 7.089365520 -37.143516873 - 7.007292783 -37.096799863 -} -85953517fffffff -{ - -3.734120666 117.188059661 - -3.822502799 117.204228121 - -3.856015677 117.284172507 - -3.801101959 117.348013676 - -3.712630406 117.331832820 - -3.679162008 117.251823145 -} -85f02367fffffff -{ - -80.644440368 72.687517718 - -80.604369505 72.186684294 - -80.652722551 71.747362212 - -80.741912646 71.805957310 - -80.782520654 72.313081896 - -80.733395357 72.755287434 -} -85f12bd7fffffff -{ - -86.075087210 110.287100919 - -86.093330840 108.990383841 - -86.177476116 108.606245159 - -86.244372374 109.564643071 - -86.225142231 110.910826710 - -86.140028981 111.247998607 -} -85ef716ffffffff -{ - -77.177895782 -66.917037494 - -77.148107837 -66.507731514 - -77.053597240 -66.420280843 - -76.989154884 -66.737215659 - -77.018622564 -67.142002690 - -77.112849878 -67.234344486 -} -852d4637fffffff -{ - 46.506320157 40.318021475 - 46.447147540 40.413085646 - 46.476815081 40.528309001 - 46.565809589 40.548679617 - 46.625096252 40.453432129 - 46.595274139 40.337997258 -} -853f4e5bfffffff -{ - 33.673173649 29.632697940 - 33.577523305 29.622129767 - 33.521261624 29.716218856 - 33.560578166 29.820905490 - 33.656188281 29.831655457 - 33.712522205 29.737537161 -} -854fa1d7fffffff -{ - 17.562530904 160.286072130 - 17.650565327 160.280500312 - 17.693212466 160.194692016 - 17.647749352 160.114575804 - 17.559755486 160.120304104 - 17.517184046 160.205992230 -} -85cf1683fffffff -{ - -52.702965682 -72.072540643 - -52.619915657 -72.024916257 - -52.551127760 -72.108853322 - -52.565244976 -72.240464062 - -52.648282513 -72.288534592 - -52.717215538 -72.204548978 -} -8503310ffffffff -{ - 88.095790121 -143.504935441 - 88.036739858 -145.593469513 - 87.943853939 -145.120108459 - 87.908935311 -142.760078447 +85033177fffffff +{ 87.964497042 -140.726370153 - 88.058330035 -140.993458981 -} -850521b3fffffff -{ - 81.024997332 98.069410438 - 80.985105253 98.614117041 - 81.039750703 99.109484168 - 81.135088749 99.063674461 - 81.175595176 98.511570000 - 81.120141781 98.012714105 -} -85d6c263fffffff -{ - -44.308459144 32.536784825 - -44.236954446 32.541162690 - -44.201006017 32.442793780 - -44.236556758 32.339985538 - -44.308066477 32.335512334 - -44.344020527 32.433942697 -} -8506695bfffffff -{ - 59.142440033 -30.541691603 - 59.149758490 -30.703357157 - 59.076780661 -30.804012837 - 58.996720102 -30.743085543 - 58.989543121 -30.582157161 - 59.062285603 -30.481421030 -} -85b55533fffffff -{ - -32.993105786 -162.358645428 - -32.904013859 -162.315212894 - -32.827362770 -162.385616093 - -32.839743606 -162.499376093 - -32.928771106 -162.542923309 - -33.005482235 -162.472596216 -} -85cd61affffffff -{ - -54.054152092 79.343588988 - -53.963740414 79.307785283 - -53.939142857 79.157231879 - -54.004792304 79.041958123 - -54.095254484 79.077119594 - -54.120017160 79.228198111 -} -85022b6ffffffff -{ - 78.157003855 -94.344507976 - 78.087101453 -94.632668480 - 78.004893870 -94.484531584 - 77.992234283 -94.052051808 - 78.061620343 -93.762699610 - 78.144180825 -93.906978764 -} -85ec0293fffffff -{ - -68.810122102 148.608929883 - -68.787551159 148.380539199 - -68.852617238 148.214381471 - -68.940534587 148.276870764 - -68.963165127 148.506847362 - -68.897818231 148.672741884 -} -85f008d3fffffff -{ - -78.414302947 61.432373670 - -78.358993567 61.070969496 - -78.391653494 60.672166803 - -78.480147197 60.630821153 - -78.536037508 60.994284340 - -78.502849024 61.397049022 -} -853ecd73fffffff -{ - 20.364402011 30.728333136 - 20.269850081 30.718114113 - 20.215686092 30.800347442 - 20.255978891 30.892815625 - 20.350481556 30.903173899 - 20.404740788 30.820924865 -} -856f369bfffffff -{ - -4.839923435 -113.392876475 - -4.774438965 -113.343017983 - -4.708104114 -113.383852509 - -4.703198464 -113.468552459 - -4.764621758 -113.512326715 - -4.830880454 -113.471457647 - -4.833337427 -113.429155277 -} -850a64affffffff -{ - 72.103492896 83.294919699 - 72.083898556 83.585667260 - 72.151478128 83.776124130 - 72.239071605 83.675291467 - 72.258761248 83.381969753 - 72.190761344 83.192069388 -} -851daa4ffffffff -{ - 53.506297050 -148.630443001 - 53.450306609 -148.726693657 - 53.384165100 -148.694723741 - 53.373932124 -148.566995993 - 53.429702393 -148.470783156 - 53.495925416 -148.502259307 -} -85be598bfffffff -{ - -33.475541597 142.100640568 - -33.380359528 142.087086900 - -33.343075824 141.983076621 - -33.400870822 141.892504965 - -33.496028697 141.905826085 - -33.533415918 142.009951455 -} -85f2a697fffffff -{ - -84.125566412 -173.131659188 - -84.213172380 -173.136839150 - -84.252887817 -172.357775937 - -84.203863119 -171.586462929 - -84.116239671 -171.605024301 - -84.077641705 -172.371189089 -} -85d09977fffffff -{ - -55.092634661 7.541276078 - -55.176904276 7.516890185 - -55.224350776 7.633446847 - -55.187457233 7.774160884 - -55.103208175 7.798103892 - -55.055831871 7.681775860 -} -85e162abfffffff -{ - -67.334661084 52.029793015 - -67.246725141 52.078120342 - -67.186790651 51.921249199 - -67.214523377 51.716148866 - -67.302258996 51.666631524 - -67.362462685 51.823399630 -} -85b933affffffff -{ - -36.754453549 136.918556522 - -36.660173016 136.910958374 - -36.618080920 136.808587450 - -36.670158395 136.713734875 - -36.764384770 136.721087436 - -36.806587964 136.823538079 -} -85d79b6ffffffff -{ - -47.697224362 44.291285601 - -47.774623779 44.290036436 - -47.824620352 44.386345119 - -47.797173734 44.483947586 - -47.719708657 44.485009745 - -47.669755783 44.388656716 -} -85b5749bfffffff -{ - -37.067770830 -161.297080277 - -36.979873657 -161.252684799 - -36.904705003 -161.327066606 - -36.917376964 -161.445770832 - -37.005218035 -161.490298361 - -37.080443296 -161.415990030 -} -8533a117fffffff -{ - 30.918365472 178.018233020 - 31.013991872 178.031504497 - 31.070977350 177.942064934 - 31.032227471 177.839378399 - 30.936543283 177.826309772 - 30.879666633 177.915724614 -} -851c2a33fffffff -{ - 48.890339838 -141.864309840 - 48.965083850 -141.832388617 - 49.010748261 -141.902043248 - 48.981657629 -142.003471064 - 48.906970146 -142.035148020 - 48.861316721 -141.965641410 -} -85c4d10ffffffff -{ - -47.890015278 -40.092556801 - -47.955073286 -40.166125740 - -48.037591108 -40.120619653 - -48.055069088 -40.001226679 - -47.989926152 -39.927586960 - -47.907390270 -39.973410646 -} -85f1294bfffffff -{ - -86.581884602 107.900707724 - -86.596482251 106.394980382 - -86.679828170 105.884529140 - -86.749883970 106.936782142 - -86.734326644 108.511246536 - -86.649703325 108.962766187 -} -85f21d97fffffff -{ - -79.608757121 -133.486246614 - -79.673920926 -133.167727391 - -79.652392499 -132.681068337 - -79.565900640 -132.520011423 - -79.501425645 -132.839636999 - -79.522756239 -133.319277346 -} -859ba5b7fffffff -{ - -21.076489862 -168.685537808 - -20.990319908 -168.642820613 - -20.914264243 -168.699896112 - -20.924312719 -168.799591655 - -21.010384635 -168.842365246 - -21.086506092 -168.785387158 -} -85c8d25bfffffff -{ - -33.199497361 102.211623382 - -33.135234235 102.154834964 - -33.139778943 102.051568827 - -33.208604620 102.004811274 - -33.273020190 102.061486036 - -33.268457596 102.165032553 -} -852d4087fffffff -{ - 47.308012061 40.500488918 - 47.248885947 40.597015206 - 47.278869487 40.714382139 - 47.368133181 40.735443470 - 47.427373623 40.638729966 - 47.397235816 40.521142251 -} -8508dd13fffffff -{ - 66.703225602 27.716954505 - 66.671347403 27.880424375 - 66.721152793 28.039064976 - 66.803001847 28.034387698 - 66.834945015 27.870106931 - 66.784973750 27.711316330 -} -85809d9bfffffff -{ - 1.209289143 -34.771936923 - 1.291093062 -34.723462469 - 1.374987373 -34.770417753 - 1.377117470 -34.865865856 - 1.295319512 -34.914381286 - 1.211385485 -34.867407768 -} -85491c03fffffff -{ - 17.880001184 -107.504798602 - 17.960162864 -107.448457123 - 18.046303911 -107.493683217 - 18.052223005 -107.595331930 - 17.971988340 -107.651625889 - 17.885907590 -107.606318893 -} -85020b9bfffffff -{ - 76.543135355 -99.222409911 - 76.467948437 -99.452798126 - 76.387351140 -99.295192992 - 76.381574560 -98.909682722 - 76.456335805 -98.677683292 - 76.537298772 -98.832774867 -} -850b18c7fffffff -{ - 62.101711428 79.075125449 - 62.017296833 79.148302913 - 62.001726267 79.344318810 - 62.070498831 79.467960144 - 62.155018860 79.395468347 - 62.170661174 79.198646925 -} -85e70d9bfffffff -{ - -70.987126471 28.926576951 - -70.901391338 28.823825149 - -70.883762962 28.551440537 - -70.951804190 28.379542453 - -71.037861968 28.480622426 - -71.055556406 28.755284567 -} -85bec88ffffffff -{ - -28.111594150 144.465655971 - -28.017607474 144.450235999 - -27.983756420 144.350456299 - -28.043791954 144.265978987 - -28.137771901 144.281194196 - -28.171723191 144.381091565 -} -8538da37fffffff -{ - 23.739656664 5.708935994 - 23.646796066 5.719661551 - 23.607019777 5.809901298 - 23.660089662 5.889567280 - 23.753034109 5.878972565 - 23.792824877 5.788580851 -} -8504ad93fffffff -{ - 71.193564800 144.656260527 - 71.102193536 144.757667655 - 71.084496954 145.052754227 - 71.158015489 145.248894882 - 71.249662265 145.149550576 - 71.267516019 144.851989304 + 87.908935311 -142.760078447 + 87.815386140 -142.435418714 + 87.776702790 -140.259795721 + 87.829094493 -138.290822224 + 87.923214341 -138.430335682 +} +8572ab4bfffffff +{ + -2.156388726 137.372494843 + -2.251245454 137.388251121 + -2.285221669 137.478879369 + -2.224357386 137.553769774 + -2.129489500 137.538033902 + -2.095496990 137.447387152 +} +85e05143fffffff +{ + -56.406294834 50.800745683 + -56.322551370 50.836319374 + -56.269824980 50.732943346 + -56.300631372 50.594065341 + -56.384206028 50.557966078 + -56.437143258 50.661268817 +} +85f11527fffffff +{ + -82.172825367 117.075562377 + -82.117099669 116.602735747 + -82.143380394 115.971215792 + -82.225818943 115.803068144 + -82.282348048 116.276940296 + -82.255629289 116.918004220 +} +850f864bfffffff +{ + 67.632740684 -92.800998164 + 67.560741416 -92.967679401 + 67.470448864 -92.890113312 + 67.451949209 -92.647134098 + 67.523652888 -92.480160987 + 67.614151258 -92.556452131 +} +85427353fffffff +{ + 28.628502022 67.893649508 + 28.550978178 67.946005209 + 28.549239449 68.051603492 + 28.625031893 68.105089388 + 28.702685817 68.052849489 + 28.704417204 67.947007431 +} +85225ea3fffffff +{ + 50.228195249 -177.066002150 + 50.315521571 -177.042080898 + 50.376097801 -177.151411681 + 50.349257395 -177.284693135 + 50.261862578 -177.308306286 + 50.201376502 -177.198946716 +} +856c46abfffffff +{ + 3.726107137 -90.044274065 + 3.652226669 -90.101621719 + 3.568413568 -90.065978797 + 3.558500585 -89.972935577 + 3.632439230 -89.915572673 + 3.716232632 -89.951268122 +} +85088957fffffff +{ + 62.604774422 22.467390329 + 62.575617542 22.607998686 + 62.627797594 22.731110226 + 62.709282121 22.713593214 + 62.738454779 22.572330058 + 62.686126948 22.449240408 +} +85140673fffffff +{ + 54.443782554 125.705824078 + 54.375685920 125.801204224 + 54.384457558 125.954392894 + 54.461410824 126.012874956 + 54.529759733 125.917652168 + 54.520902821 125.763787996 +} +8529400ffffffff +{ + 35.462928371 -132.223285317 + 35.546329953 -132.183617732 + 35.613561323 -132.245276947 + 35.597337435 -132.346536413 + 35.513972656 -132.386017926 + 35.446794920 -132.324426181 +} +857a2b7bfffffff +{ + -0.470123443 42.838097594 + -0.380243604 42.837694035 + -0.331410129 42.759757977 + -0.372430889 42.682147046 + -0.462364609 42.682492091 + -0.511223747 42.760506618 +} +8552db6ffffffff +{ + 8.217870669 46.476359737 + 8.298060293 46.474681401 + 8.344965906 46.401572026 + 8.311716192 46.330060238 + 8.231476789 46.331688337 + 8.184536820 46.404878505 +} +85e51e2ffffffff +{ + -60.724404333 114.510317693 + -60.654586808 114.373452477 + -60.677731435 114.182141321 + -60.770835287 114.126807702 + -60.840906033 114.263688692 + -60.817619171 114.455890233 +} +851e32b7fffffff +{ + 49.012514608 13.775648332 + 48.928093611 13.781039154 + 48.892553135 13.901569627 + 48.941401904 14.016919701 + 49.025853277 14.011793396 + 49.061425671 13.891052289 +} +85b22a6bfffffff +{ + -27.186335655 -69.138067286 + -27.261555823 -69.193058942 + -27.336190313 -69.150000283 + -27.335584075 -69.051975484 + -27.260395879 -68.997072849 + -27.185781974 -69.040105856 +} +851b006ffffffff +{ + 57.303766873 -46.009886461 + 57.290112309 -46.176219503 + 57.203572191 -46.242098413 + 57.130895600 -46.142115322 + 57.144561752 -45.976568541 + 57.230892874 -45.910221120 +} +854ecc83fffffff +{ + 25.771539169 144.672285055 + 25.687768843 144.687482943 + 25.653723359 144.780229525 + 25.703449701 144.857771963 + 25.787191876 144.842607600 + 25.821235929 144.749867216 +} +85c50993fffffff +{ + -34.108495982 -32.381213693 + -34.187148725 -32.438963938 + -34.268982706 -32.389968324 + -34.272133764 -32.283024968 + -34.193364009 -32.225285183 + -34.111560300 -32.274477951 +} +850d8cdbfffffff +{ + 67.293601085 -171.788699090 + 67.207405632 -171.881189826 + 67.136172334 -171.736997775 + 67.150798428 -171.500835029 + 67.236703716 -171.407190678 + 67.308273396 -171.550854838 +} +8502e0a3fffffff +{ + 74.522123467 -102.112404491 + 74.443741148 -102.300846557 + 74.363640748 -102.149322581 + 74.361575879 -101.811005927 + 74.439609118 -101.621030152 + 74.520056218 -101.770883760 +} +85310477fffffff +{ + 45.253609118 120.015973097 + 45.198885975 120.096681810 + 45.210854577 120.210441237 + 45.277645223 120.243847725 + 45.332565563 120.163148953 + 45.320497795 120.049033057 +} +85a4c263fffffff +{ + -28.900505714 -29.216490903 + -28.981646213 -29.269168617 + -29.061014200 -29.218826632 + -29.059188578 -29.115644755 + -28.977926003 -29.062999586 + -28.898611208 -29.113503425 +} +856eda83fffffff +{ + 15.431362211 -114.095333779 + 15.511826527 -114.044521302 + 15.595192281 -114.092716243 + 15.598011064 -114.191767399 + 15.517486408 -114.242498794 + 15.434203289 -114.194260338 +} +85ea235bfffffff +{ + -64.608574567 -166.839767432 + -64.621059429 -166.693290690 + -64.559960822 -166.601865332 + -64.486521627 -166.656956925 + -64.474176964 -166.802796856 + -64.535131553 -166.894180524 +} +85685603fffffff +{ + 6.749595197 121.661434069 + 6.657914224 121.678122508 + 6.627742847 121.763435864 + 6.689307052 121.832122005 + 6.781058152 121.815427365 + 6.811174937 121.730052726 +} +851ca303fffffff +{ + 48.442008023 -149.760607952 + 48.511452479 -149.711681108 + 48.582832087 -149.766458639 + 48.584765771 -149.870416822 + 48.515217362 -149.919325712 + 48.443839292 -149.864294796 +} +85a74dd7fffffff +{ + -25.451663777 105.080325849 + -25.527831760 105.116749790 + -25.534784479 105.197436631 + -25.465669494 105.241579899 + -25.389607503 105.205171859 + -25.382554578 105.124604538 +} +85c8988ffffffff +{ + -31.703185282 106.177837842 + -31.642516961 106.117874768 + -31.650035543 106.018330326 + -31.718262776 105.978492553 + -31.779086435 106.038383701 + -31.771527427 106.138185017 +} +851820c7fffffff +{ + 55.184191390 -9.114233384 + 55.129945474 -9.221776732 + 55.046851703 -9.182872102 + 55.018001455 -9.036852842 + 55.072165124 -8.929450470 + 55.155261077 -8.967925928 +} +85774a07fffffff +{ + 6.293663846 163.539552481 + 6.206304719 163.549497165 + 6.171450294 163.623050005 + 6.223881483 163.686605606 + 6.311144152 163.676701641 + 6.346072060 163.603201366 +} +85c1863bfffffff +{ + -31.235532410 -20.917910692 + -31.322344477 -20.966431261 + -31.401255333 -20.903803726 + -31.393273596 -20.792533330 + -31.306356463 -20.744113535 + -31.227526143 -20.806862938 +} +857d22a7fffffff +{ + -10.791589103 -21.811515342 + -10.711167979 -21.768786434 + -10.634833776 -21.812995856 + -10.638886705 -21.899997433 + -10.719357984 -21.942808393 + -10.795726167 -21.898535786 +} +85b7a8cffffffff +{ + -33.650385718 -89.889354061 + -33.580150315 -89.826998331 + -33.496840806 -89.872141826 + -33.483624465 -89.979508702 + -33.553740162 -90.042003565 + -33.637191939 -89.996992944 +} +85760367fffffff +{ + -0.419479961 159.383010962 + -0.508298288 159.394061011 + -0.539807207 159.471812504 + -0.482578103 159.538468725 + -0.393838776 159.527459222 + -0.362249547 159.449752950 +} +8584c4cbfffffff +{ + -9.928313616 67.620301992 + -10.017814704 67.636543652 + -10.047808832 67.726107052 + -9.988232705 67.799351924 + -9.898747365 67.782997068 + -9.868822297 67.693510454 +} +85aee623fffffff +{ + -28.086210940 98.750295501 + -28.167344912 98.786763352 + -28.176722435 98.877769399 + -28.105051174 98.932160870 + -28.024019236 98.895681551 + -28.014556572 98.804822043 +} +855344c3fffffff +{ + 26.162445410 48.282800351 + 26.074942975 48.259252802 + 26.013766613 48.325246584 + 26.040018240 48.414698355 + 26.127405174 48.438325892 + 26.188655951 48.372421901 +} +856c73d7fffffff +{ + 4.810727511 -91.301375603 + 4.737523815 -91.358512220 + 4.654864720 -91.323504993 + 4.645426795 -91.231305201 + 4.718691194 -91.174147783 + 4.801332763 -91.209210847 +} +850222c7fffffff +{ + 81.669406363 -108.424103287 + 81.660302597 -109.038678953 + 81.577851006 -109.315757213 + 81.505247152 -108.985239023 + 81.514330038 -108.382160751 + 81.596036755 -108.098245541 +} +85e663b7fffffff +{ + -67.037506308 1.906724666 + -66.945242000 1.928571188 + -66.889289801 1.734151704 + -66.925274073 1.517270666 + -67.017508100 1.493735758 + -67.073789386 1.688768365 +} +85435187fffffff +{ + 32.012932523 62.268110784 + 31.935983554 62.329204967 + 31.939289658 62.438826283 + 32.019589217 62.487613521 + 32.096683856 62.426595709 + 32.093333179 62.316713789 +} +85ef91cbfffffff +{ + -76.689314206 7.000508625 + -76.593434051 7.001929020 + -76.544447126 6.650868053 + -76.590860536 6.295801624 + -76.686777206 6.289344011 + -76.736247535 6.642991000 +} +85cd2607fffffff +{ + -50.051858530 95.386918438 + -49.968908284 95.318765086 + -49.965524393 95.170664758 + -50.045053520 95.090141399 + -50.128168487 95.157938698 + -50.131589709 95.306617020 +} +85e5438ffffffff +{ + -68.349068903 102.119547378 + -68.268965859 101.976668692 + -68.273841764 101.716232966 + -68.358851400 101.596893036 + -68.439242623 101.739031601 + -68.434335848 102.001259041 +} +850a3137fffffff +{ + 63.673699915 86.608482944 + 63.587793253 86.664924600 + 63.561882162 86.861896384 + 63.621760683 87.003172191 + 63.707727760 86.947604660 + 63.733756357 86.749885195 +} +857a49cffffffff +{ + 1.474221088 34.175889794 + 1.564862388 34.178797402 + 1.614420949 34.099304313 + 1.573385499 34.016856540 + 1.482728232 34.013886626 + 1.433122295 34.093426793 +} +858b3377fffffff +{ + -16.358181614 -61.326657438 + -16.287016618 -61.278742640 + -16.205762394 -61.319455745 + -16.195733717 -61.408003990 + -16.266886840 -61.455852265 + -16.348080536 -61.415218885 +} +8504acaffffffff +{ + 70.580249797 143.432668020 + 70.489698299 143.536552532 + 70.473956634 143.823532341 + 70.548632559 144.008974600 + 70.639466830 143.906957669 + 70.655343263 143.617618166 +} +85712bbbfffffff +{ + 12.769781237 -169.407866753 + 12.680177171 -169.430442279 + 12.614798488 -169.365911686 + 12.638992796 -169.278726987 + 12.728650811 -169.256059249 + 12.794060603 -169.320668392 +} +852196cffffffff +{ + 38.058580508 59.035944739 + 37.981269506 59.106454118 + 37.989094100 59.225310186 + 38.074298589 59.273958451 + 38.151761267 59.203504212 + 38.143867649 59.084345962 +} +85cc45b7fffffff +{ + -46.774683946 71.031632740 + -46.856557844 71.057273294 + -46.883672927 71.182090584 + -46.828885548 71.281097339 + -46.747027127 71.255254224 + -46.719940481 71.130606627 +} +85ee0b97fffffff +{ + -71.524875440 -39.983705581 + -71.457221275 -39.763757902 + -71.363151019 -39.838407854 + -71.336532686 -40.130601083 + -71.403744461 -40.350428424 + -71.498015443 -40.278193724 +} +85271e97fffffff +{ + 49.556488561 -98.737120269 + 49.485476609 -98.821620413 + 49.400305392 -98.765483978 + 49.385965270 -98.625182467 + 49.456790092 -98.540477126 + 49.542142121 -98.596277043 +} +851564a7fffffff +{ + 65.458559347 117.149399365 + 65.392695817 117.313271581 + 65.416468079 117.530604640 + 65.506314850 117.585325821 + 65.572523226 117.421343821 + 65.548539058 117.202746084 +} +85a14603fffffff +{ + -25.132423348 -140.452162481 + -25.040842654 -140.431797677 + -24.977130100 -140.506870472 + -25.004927300 -140.602394148 + -25.096537206 -140.622927790 + -25.160320802 -140.547768976 +} +85d30923fffffff +{ + -49.522809797 -115.807409068 + -49.466509242 -115.686921242 + -49.370174588 -115.702166317 + -49.330134796 -115.837417792 + -49.386302029 -115.957714139 + -49.482642059 -115.942950744 +} +85e39c47fffffff +{ + -66.522603933 -122.935498280 + -66.483616290 -122.743219808 + -66.398233747 -122.746060550 + -66.351867576 -122.940060339 + -66.390700352 -123.131642915 + -66.476053509 -123.129920830 +} +85b0300bfffffff +{ + -29.006434200 -115.933705995 + -28.952730260 -115.848073161 + -28.865006094 -115.858687320 + -28.830975679 -115.954691308 + -28.884547739 -116.040226557 + -28.972281883 -116.029855491 +} +854f2cbbfffffff +{ + 10.808525480 155.427326415 + 10.717016394 155.439663218 + 10.679731643 155.522844595 + 10.733906510 155.593650997 + 10.825340656 155.581355320 + 10.862674887 155.498212100 +} +850a1e87fffffff +{ + 63.074810958 94.251479899 + 63.038644938 94.435461891 + 63.089076162 94.588791885 + 63.175986388 94.558348060 + 63.212329698 94.373455764 + 63.161584760 94.219919973 +} +85f1190ffffffff +{ + -82.206258995 91.757402020 + -82.194913718 91.101712930 + -82.263975027 90.729632745 + -82.345250632 91.017755526 + -82.356680907 91.686719477 + -82.286748684 92.054110503 +} +85c6441bfffffff +{ + -33.482098287 -139.659863358 + -33.390000615 -139.638647418 + -33.329550698 -139.720096197 + -33.361146475 -139.822867348 + -33.453283972 -139.844282133 + -33.513785964 -139.762726980 +} +85e06553fffffff +{ + -61.614291002 46.269363930 + -61.531111722 46.323479701 + -61.471167970 46.214142512 + -61.494191561 46.050922993 + -61.577162039 45.996184817 + -61.637317820 46.105285729 +} +85cfa52ffffffff +{ + -51.211096417 -71.245093310 + -51.128431704 -71.200909114 + -51.059924124 -71.282675430 + -51.073938057 -71.408684151 + -51.156595140 -71.453287643 + -51.225246131 -71.371463740 +} +85031b93fffffff +{ + 83.520332811 -115.114818699 + 83.501331811 -115.899435826 + 83.413587134 -116.167444709 + 83.345610448 -115.665820443 + 83.364312470 -114.899399243 + 83.451284048 -114.616677462 +} +85b3841bfffffff +{ + -21.415932678 -77.920617349 + -21.492766896 -77.979718709 + -21.576702858 -77.937728825 + -21.583788397 -77.836625599 + -21.506963347 -77.777571675 + -21.423043615 -77.819573373 +} +85f09e13fffffff +{ + -69.164209497 82.324085858 + -69.072694444 82.252452513 + -69.047290744 81.998192118 + -69.113211016 81.814007394 + -69.204849038 81.883941861 + -69.230444801 82.139765957 +} +85f1ab8ffffffff +{ + -78.981584458 100.182717375 + -78.906439931 99.931507644 + -78.907360204 99.451386429 + -78.983442179 99.216386958 + -79.059101279 99.464652067 + -79.058163676 99.950917493 +} +85dc513bfffffff +{ + -50.304287637 -25.239247397 + -50.380463301 -25.306447680 + -50.458900276 -25.232192926 + -50.461108225 -25.090483523 + -50.384838374 -25.023395422 + -50.306454796 -25.097903669 +} +85d04ed3fffffff +{ + -46.314727322 23.942916079 + -46.399700295 23.945858809 + -46.436341737 24.042319702 + -46.388014226 24.135569429 + -46.303145954 24.132370721 + -46.266500440 24.036177873 +} +85e5143bfffffff +{ + -60.313857079 121.281281571 + -60.251675718 121.134460826 + -60.283949893 120.954046090 + -60.378595899 120.919741231 + -60.441013209 121.066812057 + -60.408547919 121.247939132 +} +85021867fffffff +{ + 76.037501664 -111.204645255 + 75.953791200 -111.359600161 + 75.882558327 -111.152128894 + 75.894621075 -110.790562423 + 75.978046926 -110.632839665 + 76.049695642 -110.839426572 +} +85e8c3affffffff +{ + -59.230732392 -75.226948609 + -59.211418236 -75.054685408 + -59.129325196 -74.994317463 + -59.066754934 -75.105539308 + -59.086007280 -75.276930431 + -59.167891444 -75.337968912 +} +8501848bfffffff +{ + 71.452910817 50.264944674 + 71.479943255 50.510306050 + 71.562050129 50.538208838 + 71.617161125 50.318519763 + 71.589788393 50.071639179 + 71.507646558 50.045970703 +} +85db5873fffffff +{ + -57.382858246 163.624390452 + -57.306597222 163.570759100 + -57.295447462 163.410091807 + -57.360543336 163.302590538 + -57.436882218 163.355909713 + -57.448047474 163.517043575 +} +85f29657fffffff +{ + -88.010775535 109.198670369 + -88.027124586 106.596544329 + -88.111685764 105.702714130 + -88.182141914 107.588440981 + -88.164012250 110.400930284 + -88.077306738 111.107020546 +} +850322d3fffffff +{ + 89.455436391 -165.468875525 + 89.374030167 -169.590420233 + 89.294237306 -165.268488815 + 89.286348717 -157.827783035 + 89.357098018 -152.908054154 + 89.446070979 -155.868486444 } -85522cb7fffffff -{ - 21.989137739 46.316136323 - 21.901123345 46.294635911 - 21.842760204 46.360709409 - 21.872324338 46.448208880 - 21.960227106 46.469792420 - 22.018677348 46.403793570 -} -85c6f69bfffffff -{ - -37.615749624 -129.613258080 - -37.572536660 -129.510958643 - -37.481217147 -129.502328819 - -37.433192616 -129.595714238 - -37.476332235 -129.697774548 - -37.567569566 -129.706688258 -} -85941d0bfffffff -{ - -13.311012881 125.786902139 - -13.396873250 125.803171891 - -13.431468393 125.888920349 - -13.380201108 125.958448964 - -13.294284532 125.942179829 - -13.259691411 125.856381399 -} -85ce959bfffffff -{ - -41.178906847 -68.620609760 - -41.102132687 -68.589480085 - -41.034895553 -68.657382146 - -41.044292262 -68.756476737 - -41.121060855 -68.787886180 - -41.188438494 -68.719921519 -} -850d0937fffffff -{ - 68.656267443 -148.906127729 - 68.590694470 -149.080941124 - 68.506526959 -149.021222196 - 68.487802595 -148.788319056 - 68.553006688 -148.613615606 - 68.637302933 -148.671699553 -} -85f2662bfffffff -{ - -73.277179831 -128.515272936 - -73.332287470 -128.301196869 - -73.302628626 -128.010414916 - -73.218051194 -127.936138780 - -73.163395967 -128.150159083 - -73.192867079 -128.438523223 -} -85356b77fffffff -{ - 35.988117256 -13.008838983 - 35.918066162 -13.087989557 - 35.826444117 -13.053680282 - 35.804862886 -12.940452699 - 35.874817617 -12.861346822 - 35.966449813 -12.895423546 -} -8520ab2ffffffff -{ - 39.999121049 74.425360674 - 39.912004392 74.478723404 - 39.903885786 74.604384293 - 39.982847745 74.677021841 - 40.070071549 74.623892654 - 40.078226330 74.497891626 -} -850acb13fffffff -{ - 66.043547865 115.635768811 - 65.979263936 115.807443284 - 66.005375527 116.028003423 - 66.096001033 116.078161005 - 66.160633200 115.906287527 - 66.134290601 115.684451288 -} -85026a0ffffffff -{ - 73.532124131 -74.920597845 - 73.482721663 -75.202445289 - 73.390277627 -75.187028793 - 73.347205588 -74.892673284 - 73.396249630 -74.612097657 - 73.488722200 -74.624603698 -} -85f2d11bfffffff -{ - -81.586726258 -89.095476624 - -81.593611072 -88.460262918 - -81.514295640 -88.109825704 - -81.428931139 -88.390269945 - -81.422225085 -89.013506181 - -81.500707065 -89.368125509 -} -85f1750ffffffff -{ - -87.648556438 57.121510061 - -87.587460708 55.445545222 - -87.615909518 53.383577632 - -87.707303070 52.876850919 - -87.771448349 54.573631864 - -87.741059789 56.760327148 -} -85155e73fffffff -{ - 59.884347015 127.983865692 - 59.810200566 128.092509977 - 59.817164627 128.277052234 - 59.898350321 128.353938068 - 59.972782898 128.245598863 - 59.965743368 128.060065190 -} -855b5dabfffffff -{ - 9.687362425 167.231462875 - 9.767358806 167.232488760 - 9.809114465 167.155395590 - 9.770778906 167.077348279 - 9.690784708 167.076460635 - 9.649123744 167.153482063 -} -859f4a23fffffff -{ - -22.997976805 161.832515224 - -22.909010439 161.800699168 - -22.887747365 161.700543300 - -22.955430340 161.632026395 - -23.044484298 161.663712682 - -23.065767744 161.764045932 -} -8509018bfffffff -{ - 66.182971874 -2.129572710 - 66.224298266 -2.270423212 - 66.185157630 -2.437758638 - 66.104797696 -2.463389842 - 66.063729319 -2.322715627 - 66.102763315 -2.156231707 -} -856318a7fffffff -{ - 14.011864778 57.179214157 - 13.953671878 57.229027038 - 13.955026983 57.310112071 - 14.014618126 57.341522935 - 14.072926637 57.291725839 - 14.071528302 57.210501909 -} -85592523fffffff -{ - 24.170410181 1.434224849 - 24.079711819 1.448196451 - 24.043331324 1.536592221 - 24.097653709 1.611176852 - 24.188452161 1.597319940 - 24.224828158 1.508763507 -} -85809c23fffffff -{ - 1.441598000 -34.055191108 - 1.523155186 -34.006976601 - 1.606877514 -34.053843091 - 1.609084471 -34.148945319 - 1.527532151 -34.197203568 - 1.443767996 -34.150315973 -} -85145e8bfffffff -{ - 56.384322912 140.137545050 - 56.304167615 140.205472071 - 56.294288887 140.370857415 - 56.364513228 140.469107868 - 56.444873235 140.401721477 - 56.454804383 140.235541448 -} -858086c7fffffff -{ - -1.471595020 -33.649582658 - -1.389097079 -33.601316668 - -1.305104240 -33.648326044 - -1.303572212 -33.743624439 - -1.386072926 -33.791936095 - -1.470102903 -33.744903816 -} -85f15623fffffff -{ - -83.791335020 69.778747755 - -83.747136107 69.036425224 - -83.793575457 68.341153923 - -83.885305807 68.379169745 - -83.930412584 69.134283263 - -83.882866319 69.838533621 -} -850f80affffffff -{ - 66.683974185 -88.088970960 - 66.616627346 -88.263495482 - 66.523631986 -88.204917561 - 66.497823191 -87.973148046 - 66.564874686 -87.798605974 - 66.658029588 -87.855845853 -} -85b6c877fffffff -{ - -18.036769391 -94.463607034 - -18.108868835 -94.524650820 - -18.197135128 -94.488597377 - -18.213333753 -94.391426116 - -18.141219608 -94.330342670 - -18.052921563 -94.366470027 -} -85f186a3fffffff -{ - -76.149305366 111.096415136 - -76.082202446 110.841166818 - -76.100560923 110.458795382 - -76.186206021 110.327993025 - -76.253773839 110.582791077 - -76.235230127 110.968866257 -} -857af0dbfffffff -{ - 5.280132559 44.841169968 - 5.364176562 44.840049628 - 5.411907559 44.765014556 - 5.375626989 44.691020287 - 5.291531665 44.692087056 - 5.243768170 44.767201706 -} -85f3a9affffffff -{ - -78.967775769 -165.397295029 - -79.049592262 -165.337945814 - -79.075468471 -164.911267299 - -79.019024606 -164.548680166 - -78.937356799 -164.614112054 - -78.911980008 -165.036074727 -} -85c4024bfffffff -{ - -39.993131741 -38.295207744 - -40.064735002 -38.359987507 - -40.147807521 -38.316658916 - -40.159283044 -38.208302603 - -40.087577828 -38.143481748 - -40.004499146 -38.187058008 -} -850699cbfffffff -{ - 71.759529456 -60.407473147 - 71.730114052 -60.689734800 - 71.638497062 -60.741880137 - 71.576452557 -60.513951487 - 71.605670558 -60.233657334 - 71.697129200 -60.179332576 -} -85ae08cbfffffff -{ - -25.497620433 97.275068063 - -25.580579835 97.310365759 - -25.592619520 97.400990803 - -25.521778296 97.456174361 - -25.438925069 97.420858699 - -25.426806941 97.330377261 -} -85cc1a4ffffffff -{ - -39.433591659 81.227729792 - -39.519541431 81.259601705 - -39.538620604 81.375227030 - -39.471760968 81.458791409 - -39.385861399 81.426793926 - -39.366771190 81.311357292 -} -85c398dbfffffff -{ - -42.319928883 -50.864045415 - -42.377628971 -50.931850766 - -42.457730572 -50.908340052 - -42.480195800 -50.816774037 - -42.422431148 -50.748838065 - -42.342265900 -50.772598737 -} -85a59b43fffffff -{ - -20.800647009 -36.465472429 - -20.722420129 -36.414913124 - -20.645618166 -36.463488384 - -20.647050538 -36.562635106 - -20.725306601 -36.613230775 - -20.802101097 -36.564643504 -} -850652d3fffffff -{ - 65.411411207 -38.131890335 - 65.412188792 -38.343530106 - 65.332203618 -38.451098374 - 65.251707556 -38.347495632 - 65.251016966 -38.137146441 - 65.330735696 -38.029114700 +8508e6a7fffffff +{ + 66.233867185 17.359911800 + 66.213390311 17.516316679 + 66.269997199 17.639244958 + 66.347217433 17.605591118 + 66.367682264 17.448324918 + 66.310938760 17.325576643 +} +85e463c3fffffff +{ + -66.061564805 89.984799959 + -65.972436900 89.894163867 + -65.958881674 89.660727150 + -66.034349640 89.516522673 + -66.123658889 89.606040971 + -66.137319312 89.840887460 +} +85eccd43fffffff +{ + -72.881262848 120.334077855 + -72.822597496 120.094484217 + -72.855085398 119.794408531 + -72.946496846 119.731916626 + -73.005530406 119.972094624 + -72.972782700 120.274187659 +} +8543a3c3fffffff +{ + 23.822584249 54.558292922 + 23.756149109 54.617839894 + 23.762332848 54.710246255 + 23.835026107 54.743282112 + 23.901602052 54.683737312 + 23.895343791 54.591154229 +} +85f071cffffffff +{ + -78.971787289 42.488182097 + -78.894730526 42.213359919 + -78.900225395 41.745728639 + -78.982963532 41.546145683 + -79.060675022 41.818765068 + -79.054991993 42.293234722 +} +85e8ae1bfffffff +{ + -67.149107820 -78.917521613 + -67.136032897 -78.681377689 + -67.050687873 -78.585594746 + -66.978714296 -78.724862586 + -66.991757821 -78.959341420 + -67.076806080 -79.056209723 +} +8500d36ffffffff +{ + 82.504839994 103.282245878 + 82.457776320 103.905494924 + 82.505399232 104.535144616 + 82.600964705 104.549279426 + 82.648888319 103.917810363 + 82.600375288 103.280432716 +} +85ae488bfffffff +{ + -22.273335157 104.055835591 + -22.350810287 104.091167218 + -22.360614416 104.170944530 + -22.293037672 104.215273767 + -22.215674487 104.179953425 + -22.205776184 104.100292448 +} +85874887fffffff +{ + -14.948428619 79.432353790 + -15.039840434 79.457256974 + -15.066459741 79.551817943 + -15.001652704 79.621353847 + -14.910309247 79.596360513 + -14.883704418 79.501921247 +} +85ae70dbfffffff +{ + -22.859680211 98.416740488 + -22.942010070 98.451498581 + -22.954871467 98.538797291 + -22.885482497 98.591203242 + -22.803263684 98.556433178 + -22.790322859 98.469268969 +} +8568eb4ffffffff +{ + 2.820194267 124.380706876 + 2.726970286 124.397360884 + 2.694515101 124.484227582 + 2.755322936 124.554495645 + 2.848611384 124.537839911 + 2.881027554 124.450917774 +} +8506c207fffffff +{ + 66.039925522 -50.519190535 + 66.023066998 -50.743013713 + 65.933725295 -50.817008150 + 65.861459930 -50.668206056 + 65.878271958 -50.445767755 + 65.967395502 -50.370752446 +} +85f1746bfffffff +{ + -87.163944946 82.634375570 + -87.138646404 80.857658892 + -87.201090549 79.551654214 + -87.291401370 80.020061609 + -87.317884632 81.891592944 + -87.252820854 83.196925683 +} +8503aedbfffffff +{ + 82.164294371 -150.203300497 + 82.096241590 -150.673499167 + 82.005232012 -150.492145793 + 81.981853236 -149.852520591 + 82.048978885 -149.382583280 + 82.140403361 -149.551881256 +} +85d8d8a3fffffff +{ + -40.856106080 128.863493767 + -40.765351240 128.865827987 + -40.716555802 128.769756931 + -40.758406841 128.671339761 + -40.849070560 128.668764234 + -40.897974447 128.764846904 +} +85a1481bfffffff +{ + -23.260959480 -144.238777906 + -23.169312630 -144.214963015 + -23.102731482 -144.288501920 + -23.127716000 -144.385917060 + -23.219370633 -144.409892666 + -23.286033071 -144.336292526 +} +85a4435bfffffff +{ + -24.668588316 -21.131163851 + -24.753519115 -21.176316229 + -24.829370623 -21.118482359 + -24.820202545 -21.015389636 + -24.735161681 -20.970322447 + -24.659398979 -21.028262454 +} +85c00b53fffffff +{ + -37.737448772 -8.072842541 + -37.829629367 -8.111792090 + -37.902168678 -8.030155006 + -37.882431149 -7.909551752 + -37.790202352 -7.870819958 + -37.717759175 -7.952473221 +} +855f5bdbfffffff +{ + 10.875438762 -60.630732732 + 10.951700195 -60.584415429 + 11.024176591 -60.623918593 + 11.020393228 -60.709666855 + 10.944202530 -60.755924551 + 10.871724511 -60.716493655 +} +85f29e63fffffff +{ + -88.618529426 -51.155634874 + -88.567202096 -47.992808529 + -88.475361729 -48.379372387 + -88.434052448 -51.538773792 + -88.480656153 -54.533911335 + -88.573014801 -54.541010263 +} +85006477fffffff +{ + 80.216073625 -4.175389628 + 80.295936543 -4.079593523 + 80.352672041 -4.479594826 + 80.328779819 -4.974313946 + 80.248668755 -5.062590093 + 80.192693072 -4.663713225 +} +85f18567fffffff +{ + -77.352996252 106.379699779 + -77.282035706 106.125289728 + -77.292901660 105.704387966 + -77.374849179 105.533298503 + -77.446301772 105.786392750 + -77.435313678 106.211928264 +} +85d0ddc7fffffff +{ + -53.832214373 18.310987667 + -53.915527271 18.305331686 + -53.952170586 18.418494257 + -53.905477668 18.536988028 + -53.822236480 18.542263207 + -53.785616342 18.429425002 +} +85ca2bd7fffffff +{ + -38.816122449 58.083006362 + -38.905946569 58.094650512 + -38.947076694 58.200505373 + -38.898322393 58.294659018 + -38.808457691 58.282825532 + -38.767387763 58.177027751 +} +85a36d4bfffffff +{ + -10.457790521 55.216461969 + -10.544937887 55.223477294 + -10.577330566 55.304203191 + -10.522472129 55.377891435 + -10.435283304 55.370760969 + -10.402994283 55.290057431 +} +851d9e37fffffff +{ + 51.738680704 -152.946161855 + 51.808725020 -152.896139281 + 51.880203894 -152.961394832 + 51.881625643 -153.076950465 + 51.811480274 -153.126917670 + 51.740014261 -153.061385218 +} +85a8b1c7fffffff +{ + -22.579400252 -41.137738792 + -22.503644246 -41.086019797 + -22.426690188 -41.134608135 + -22.425509541 -41.234906600 + -22.501286826 -41.286640753 + -22.578223474 -41.238061440 +} +85ed1117fffffff +{ + -65.563135516 162.170008083 + -65.557002285 161.978852507 + -65.628705765 161.881093296 + -65.706713702 161.975182269 + -65.712757660 162.167519267 + -65.640883179 162.264581204 +} +85df0b73fffffff +{ + -57.945863316 -59.667409226 + -57.906154409 -59.511375740 + -57.818986603 -59.496542241 + -57.771598420 -59.636888096 + -57.811109294 -59.792341477 + -57.898205733 -59.808028207 +} +855ac45bfffffff +{ + 19.917263594 169.972667601 + 20.008340117 169.976549344 + 20.056730309 169.891637802 + 20.013939328 169.802917375 + 19.922851971 169.799208070 + 19.874566277 169.884046717 +} +8534ddbbfffffff +{ + 24.140167578 -26.640354631 + 24.063076011 -26.700715909 + 23.977473824 -26.656482758 + 23.968876497 -26.552007217 + 24.045864526 -26.491579392 + 24.131553383 -26.535693321 +} +852b5dcbfffffff +{ + 38.380312768 -62.226755459 + 38.346348121 -62.331675041 + 38.264641138 -62.348498021 + 38.216972670 -62.260717502 + 38.250830690 -62.156062698 + 38.332463565 -62.138924017 +} +8502564bfffffff +{ + 75.340701457 -98.110539041 + 75.265929624 -98.329187361 + 75.183596833 -98.188834250 + 75.175703691 -97.832067754 + 75.250075978 -97.612166444 + 75.332740373 -97.750260775 +} +85f2aa93fffffff +{ + -84.779026142 -135.661915406 + -84.849698931 -135.046556499 + -84.832186354 -134.055250299 + -84.744363739 -133.708832809 + -84.675024156 -134.330428759 + -84.692183045 -135.292753969 +} +85000e53fffffff +{ + 80.763411542 38.784115568 + 80.811453375 39.233337407 + 80.900822315 39.177218655 + 80.941926763 38.662310988 + 80.893102178 38.209988300 + 80.803962227 38.275641447 +} +850b0ec3fffffff +{ + 63.284580882 75.101093708 + 63.203181023 75.186724406 + 63.193257015 75.391912204 + 63.264687284 75.512371323 + 63.346219975 75.427385106 + 63.356189761 75.221292052 +} +85d61a8bfffffff +{ + -47.623033049 36.924367927 + -47.556909277 36.926711031 + -47.527825950 36.826315833 + -47.564859788 36.723484633 + -47.630992392 36.721042356 + -47.660082412 36.821530480 +} +85b88d1bfffffff +{ + -23.474403859 130.811990199 + -23.387173995 130.811901627 + -23.349503294 130.732031137 + -23.398934196 130.652229727 + -23.486092809 130.652155482 + -23.523891858 130.732045337 +} +85e68c13fffffff +{ + -58.211287153 21.424798787 + -58.131618156 21.384918160 + -58.102544639 21.229451880 + -58.153030017 21.113171317 + -58.232854845 21.152356743 + -58.262038852 21.308519806 +} +855505c7fffffff +{ + 24.872513885 -10.433870891 + 24.804185077 -10.504186060 + 24.716703530 -10.477092580 + 24.697540913 -10.379867554 + 24.765760582 -10.309604528 + 24.853251873 -10.336514234 +} +8512580ffffffff +{ + 52.761768204 -108.116604773 + 52.683951355 -108.186037095 + 52.604626423 -108.108099532 + 52.602902064 -107.960931571 + 52.680576205 -107.891097450 + 52.760117592 -107.968831390 +} +85e2a113fffffff +{ + -62.012525645 -125.052165166 + -61.973156748 -124.883554452 + -61.883816927 -124.880653211 + -61.833895815 -125.045528579 + -61.873146822 -125.213564678 + -61.962436342 -125.217299207 +} +85f166d7fffffff +{ + -88.945763199 36.588682045 + -88.863992581 34.300272501 + -88.857835219 29.710122124 + -88.932370473 26.727502026 + -89.019347832 28.533309524 + -89.026712733 33.879360206 +} +853311c7fffffff +{ + 29.102075055 175.480486165 + 29.197841548 175.490789407 + 29.252767588 175.400849812 + 29.211818689 175.300651620 + 29.116008700 175.290550540 + 29.061190965 175.380445330 +} +85b2c88ffffffff +{ + -35.515069431 -69.403484104 + -35.584023851 -69.460491475 + -35.649438274 -69.415988254 + -35.645890017 -69.314503763 + -35.576963651 -69.257590351 + -35.511557510 -69.302067319 +} +858ca00bfffffff +{ + -4.123253308 108.736493564 + -4.037022617 108.716750930 + -4.014901922 108.630460688 + -4.079083197 108.563919450 + -4.165333910 108.583724978 + -4.187383398 108.670008896 +} +85030cabfffffff +{ + 85.497200593 -80.365883821 + 85.531854275 -81.412208721 + 85.476503963 -82.357268896 + 85.388037614 -82.243714453 + 85.354668708 -81.223569637 + 85.408508060 -80.291068603 +} +85c391c3fffffff +{ + -43.903415741 -50.473078536 + -43.941556242 -50.519482677 + -43.955500518 -50.551289914 + -44.025835837 -50.543739586 + -44.054302659 -50.440449339 + -44.026291303 -50.376754690 + -44.007194223 -50.353510513 + -43.926645653 -50.378551431 +} +8527455bfffffff +{ + 45.892282588 -86.249994486 + 45.832557814 -86.349385999 + 45.743561815 -86.320660226 + 45.714189822 -86.192967502 + 45.773710853 -86.093600969 + 45.862807339 -86.121901394 +} +854a0357fffffff +{ + 23.131799782 130.668501707 + 23.046805024 130.685488926 + 23.020327462 130.778327222 + 23.078879898 130.854220351 + 23.163890272 130.837242869 + 23.190332668 130.744362443 +} +858b2c0ffffffff +{ + -16.796157879 -66.139355576 + -16.874471010 -66.190154565 + -16.955191132 -66.148989919 + -16.957549609 -66.057060570 + -16.879262412 -66.006353575 + -16.798590809 -66.047483832 +} +85d4b477fffffff +{ + -46.381784465 -149.245950253 + -46.296657525 -149.209490698 + -46.235927353 -149.301400129 + -46.260267147 -149.429815238 + -46.345384820 -149.466519028 + -46.406172091 -149.374563841 +} +85e88b5bfffffff +{ + -64.387282641 -69.779150862 + -64.360468008 -69.571997242 + -64.271356917 -69.517258553 + -64.209255962 -69.668509043 + -64.235935874 -69.874457932 + -64.324850816 -69.930356729 +} +85030dd7fffffff +{ + 85.126032280 -75.439765542 + 85.167342191 -76.362831710 + 85.118867058 -77.288914081 + 85.030394901 -77.275923713 + 84.990422654 -76.370499576 + 85.037608559 -75.460453270 } -8512e0d3fffffff +858c689bfffffff { - 54.786860252 -116.712259891 - 54.705352878 -116.763068683 - 54.633718723 -116.667334585 - 54.643370895 -116.520816136 - 54.724796376 -116.469454533 - 54.796651932 -116.565162747 -} -85c81d67fffffff -{ - -39.027906604 106.742237716 - -38.960073510 106.671749328 - -38.969458269 106.556168007 - -39.046727551 106.510730309 - -39.114740651 106.581128141 - -39.105304334 106.697054956 -} -85692a23fffffff -{ - 14.772529159 114.112356922 - 14.863380849 114.093964463 - 14.894545320 114.007295047 - 14.834790335 113.939009319 - 14.743871185 113.957476684 - 14.712774462 114.044154891 -} -8576e117fffffff -{ - -2.032268298 162.958924175 - -2.118071781 162.968914192 - -2.147552875 163.042262863 - -2.091318477 163.105571000 - -2.005599702 163.095620853 - -1.976030623 163.022322708 -} -85ee206ffffffff -{ - -77.113349114 -40.361669060 - -77.046090829 -40.047356664 - -76.951598155 -40.151161986 - -76.924089459 -40.564408238 - -76.990737825 -40.878400532 - -77.085501760 -40.779496945 -} -85e0e527fffffff -{ - -55.867001030 54.031793879 - -55.781636318 54.059415266 - -55.731478655 53.949926977 - -55.766467930 53.812816501 - -55.851682309 53.784632710 - -55.902057975 53.894120446 -} -85d3a667fffffff -{ - -54.924366503 -100.786189638 - -54.854405123 -100.672273999 - -54.763890168 -100.719971024 - -54.743231037 -100.881109027 - -54.813039354 -100.995112026 - -54.903659649 -100.947891153 -} -85cd8013fffffff -{ - -40.654273161 92.542033520 - -40.577856902 92.491794431 - -40.572862194 92.372860559 - -40.644232870 92.303797111 - -40.720781752 92.353775789 - -40.725827464 92.473079138 -} -85d4f11bfffffff -{ - -42.934223735 -161.285115163 - -42.850217675 -161.237765291 - -42.777765362 -161.317124861 - -42.789266475 -161.443751258 - -42.873221206 -161.491251466 - -42.945726211 -161.411975446 -} -85e15217fffffff -{ - -62.912668654 57.801451445 - -62.822442921 57.824834922 - -62.770007396 57.676470528 - -62.807544109 57.504585707 - -62.897625946 57.480229085 - -62.950315465 57.628728224 -} -859b7653fffffff -{ - -21.068556787 -176.881932673 - -20.987312259 -176.835886697 - -20.911291542 -176.883744960 - -20.916475121 -176.977518879 - -20.997608054 -177.023574094 - -21.073668928 -176.975846354 -} -8590305bfffffff -{ - -12.616882893 -120.863860846 - -12.576104980 -120.795399390 - -12.510414697 -120.798456480 - -12.485504442 -120.869828670 - -12.526185881 -120.938208639 - -12.591873902 -120.935297892 -} -8526b3d3fffffff -{ - 42.142773857 -109.814621733 - 42.217600081 -109.747023888 - 42.295783169 -109.804561852 - 42.299102152 -109.929802486 - 42.224239660 -109.997307727 - 42.146094469 -109.939665389 -} -857ae667fffffff -{ - 4.135915426 43.045847303 - 4.221807037 43.045375145 - 4.269977359 42.969051348 - 4.232289857 42.893123748 - 4.146350643 42.893539855 - 4.098146468 42.969939649 -} -854aca27fffffff -{ - 16.822845910 138.855249083 - 16.730937677 138.871228365 - 16.697628920 138.964216709 - 16.756235621 139.041240051 - 16.848134931 139.025284770 - 16.881436532 138.932282076 -} -85f294dbfffffff -{ - -87.629681548 141.360991073 - -87.691480426 139.736462283 - -87.777848287 140.305617285 - -87.800727958 142.640119333 - -87.735579945 144.260260560 - -87.650977838 143.555688859 -} -85f1ae23fffffff -{ - -78.720215337 107.268919573 - -78.651200535 106.981481421 - -78.663274355 106.514938088 - -78.744512385 106.330205885 - -78.814080074 106.616188707 - -78.801855316 107.088407555 -} -85290913fffffff -{ - 34.679813564 -127.698193999 - 34.763792578 -127.653258107 - 34.835486876 -127.714340877 - 34.823141994 -127.820320444 - 34.739181874 -127.865080598 - 34.667547698 -127.804037129 -} -85428c3bfffffff -{ - 20.309581785 65.473009879 - 20.241057585 65.521513692 - 20.240227315 65.614400240 - 20.307938076 65.658971023 - 20.376586051 65.610542034 - 20.377399453 65.517467126 -} -85f24ebbfffffff -{ - -72.444473009 -113.771462870 - -72.482781694 -113.516690239 - -72.432559839 -113.265294250 - -72.344386542 -113.269974715 - -72.306479126 -113.523398449 - -72.356345614 -113.773490389 -} -85f181bbfffffff -{ - -77.410513068 103.832875635 - -77.337228614 103.590631810 - -77.344083864 103.166345327 - -77.424301755 102.979583947 - -77.498066370 103.220091375 - -77.491132206 103.649134551 -} -850aa12bfffffff -{ - 60.264984776 95.561586717 - 60.175611151 95.590163260 - 60.138931112 95.755141012 - 60.191476108 95.891971581 - 60.280833984 95.864155249 - 60.317663037 95.698747764 -} -85f16657fffffff -{ - -88.530316629 42.001867820 - -88.453080221 40.047684922 - -88.456885772 36.661716492 - -88.538249913 34.861135649 - -88.619902925 36.643112288 - -88.615744260 40.426800604 -} -85650927fffffff -{ - 3.947069170 97.203058970 - 4.040311146 97.178508981 - 4.065683394 97.084804609 - 3.997789741 97.015690146 - 3.904562875 97.040285181 - 3.879214494 97.133949737 -} -85486a43fffffff -{ - 28.769565982 -117.796722536 - 28.853649834 -117.743612747 - 28.935562520 -117.798966319 - 28.933322955 -117.907458489 - 28.849214128 -117.960447281 - 28.767369815 -117.905065185 -} -85833287fffffff -{ - -12.718254035 15.903213260 - -12.623709271 15.913172867 - -12.568117047 15.836374178 - -12.607018884 15.749653039 - -12.701497329 15.739641884 - -12.757140294 15.816403334 -} -85de33cbfffffff -{ - -57.453795687 -50.273821940 - -57.402854102 -50.131965919 - -57.315380639 -50.144377448 - -57.278823765 -50.297794529 - -57.329513722 -50.439315539 - -57.417011497 -50.427755010 -} -85358d83fffffff -{ - 37.536858617 -30.470874054 - 37.455257754 -30.537215839 - 37.369069374 -30.481652191 - 37.364394818 -30.359876160 - 37.445917637 -30.293407620 - 37.532193048 -30.348841322 -} -8561a563fffffff -{ - 9.822010852 83.289840494 - 9.912938172 83.262207383 - 9.934279348 83.170459537 - 9.864736973 83.106414443 - 9.773873077 83.134054082 - 9.752488116 83.225732401 -} -85f1511bfffffff -{ - -83.757182369 54.579765445 - -83.693039532 53.964979449 - -83.718388714 53.177619227 - -83.808591568 52.987427708 - -83.873886676 53.604174004 - -83.847814448 54.409377875 -} -853e8603fffffff -{ - 21.190746962 17.020111139 - 21.095201874 17.021392911 - 21.047479415 17.110988853 - 21.095239252 17.199404081 - 21.190811123 17.198273829 - 21.238596494 17.108576782 -} -856e1b93fffffff -{ - 8.058427980 -115.190201906 - 8.133708656 -115.142991600 - 8.212615435 -115.189030225 - 8.216151487 -115.282312858 - 8.140803820 -115.329446056 - 8.061987064 -115.283373915 -} -85af86a3fffffff -{ - -28.137076583 85.844152999 - -28.227152025 85.875665425 - -28.246562565 85.978173888 - -28.175929351 86.049009056 - -28.085934460 86.017417247 - -28.066492210 85.915069395 -} -85c1ab87fffffff -{ - -31.377298947 -15.984464245 - -31.466626396 -16.028723160 - -31.543701622 -15.960387992 - -31.531355638 -15.847709842 - -31.441939448 -15.803589057 - -31.364957947 -15.872007867 -} -859d8197fffffff -{ - -14.268451656 152.232078828 - -14.184901261 152.211406375 - -14.160173550 152.121462165 - -14.218926739 152.052069403 - -14.302520586 152.072601585 - -14.327317915 152.162666945 -} -85333427fffffff -{ - 25.274547279 176.729968538 - 25.368391042 176.741109340 - 25.422504112 176.656082714 - 25.382659621 176.559946641 - 25.288765774 176.548987912 - 25.234766372 176.633983023 -} -8532132bfffffff -{ - 37.960064352 171.302000057 - 38.057027962 171.308408067 - 38.109972367 171.204764523 - 38.065862749 171.094810624 - 37.968881541 171.088662576 - 37.916027371 171.192208356 -} -85263663fffffff -{ - 46.214773812 -101.278428669 - 46.145202054 -101.351472698 - 46.063850497 -101.295449998 - 46.051889536 -101.166632688 - 46.121291902 -101.093378337 - 46.202824639 -101.149150475 -} -8564a0cbfffffff -{ - 15.113470993 100.379529417 - 15.207124308 100.355177832 - 15.234143116 100.258943518 - 15.167485230 100.187094145 - 15.073820319 100.211501818 - 15.046824833 100.307702879 -} -8500cc2ffffffff -{ - 87.780844340 86.026520920 - 87.760688969 88.330477897 - 87.827960090 90.047976559 - 87.918695667 89.457297835 - 87.940414709 86.987171508 - 87.869751256 85.281013698 -} -85055193fffffff -{ - 81.194809461 149.741334642 - 81.101614622 149.901605539 - 81.075461788 150.503818859 - 81.142043476 150.955534462 - 81.235653394 150.805512318 - 81.262272722 150.193428202 -} -85cbaeaffffffff -{ - -37.956234586 47.522618030 - -38.043163518 47.524348370 - -38.091064551 47.615643001 - -38.051970389 47.705223818 - -37.964960978 47.703330908 - -37.917126158 47.612019919 -} -85c0588ffffffff -{ - -39.877987654 -1.295295674 - -39.971064403 -1.326577125 - -40.037523128 -1.237897012 - -40.010814648 -1.117992350 - -39.917726643 -1.086973490 - -39.851358226 -1.175596387 -} -85ef2a23fffffff -{ - -81.480257493 -60.633451656 - -81.441709858 -60.044824578 - -81.346134607 -59.983936813 - -81.289314834 -60.499851613 - -81.327220778 -61.080133858 - -81.422580108 -61.152792514 -} -85d75827fffffff -{ - -49.013338475 29.795665682 - -49.093620643 29.806695578 - -49.121917646 29.903140435 - -49.069963706 29.988258696 - -48.989795681 29.976999965 - -48.961467441 29.880851303 -} -8503288bfffffff -{ - 86.663735970 -53.982378595 - 86.731534422 -54.973854625 - 86.714354160 -56.564542645 - 86.630105528 -57.092950233 - 86.564525052 -56.088673413 - 86.581000310 -54.566800170 -} -85ea2b43fffffff -{ - -66.467888622 -170.678022673 - -66.532703334 -170.670818707 - -66.555977833 -170.497948920 - -66.514181936 -170.332967318 - -66.449378941 -170.341310660 - -66.426359258 -170.513496999 -} -857ed993fffffff -{ - 4.441224834 170.601927463 - 4.513907166 170.605723527 - 4.552408538 170.534522669 - 4.518134460 170.459574503 - 4.445441208 170.455900431 - 4.407032825 170.527052504 -} -851aa62bfffffff -{ - 47.891407264 -54.004762171 - 47.865336278 -54.136086178 - 47.777988739 -54.173147641 - 47.716856744 -54.079282235 - 47.742871175 -53.948422313 - 47.830073983 -53.910964793 -} -8584d08ffffffff -{ - -12.728974498 66.847043572 - -12.820560212 66.863064770 - -12.851776152 66.954198374 - -12.791335447 67.029233819 - -12.699759563 67.013093429 - -12.668614447 66.922036707 -} -85bd6a97fffffff -{ - -40.950501187 25.210653209 - -40.874532915 25.218266529 - -40.829816618 25.123826274 - -40.861061637 25.021761932 - -40.937020960 25.014062912 - -40.981744307 25.108513863 -} -85398813fffffff -{ - 31.894162962 -6.031068442 - 31.829306571 -6.108289603 - 31.739025621 -6.084567868 - 31.713624489 -5.983844636 - 31.778390230 -5.906717189 - 31.868647626 -5.930219162 -} -85772a37fffffff -{ - 8.204275974 155.853440496 - 8.112454948 155.865615579 - 8.076071173 155.948068835 - 8.131451828 156.018308106 - 8.223196730 156.006173986 - 8.259637110 155.923759618 -} -852cad17fffffff -{ - 36.289549468 46.492131994 - 36.223363166 46.569237929 - 36.241634389 46.673114989 - 36.326221809 46.700086318 - 36.392548240 46.622903540 - 36.374146919 46.518826049 -} -85299233fffffff -{ - 38.027841614 -111.330136725 - 38.106405847 -111.266442471 - 38.187107509 -111.322776284 - 38.189201794 -111.442889546 - 38.110603396 -111.506486475 - 38.029944887 -111.450067866 -} -85b071c7fffffff -{ - -22.669010047 -121.448027246 - -22.622104519 -121.368024973 - -22.542193380 -121.370889065 - -22.509203644 -121.453557183 - -22.555997894 -121.533445449 - -22.635892975 -121.530779572 -} -85f26c27fffffff -{ - -70.523868790 -121.674062388 - -70.569663419 -121.469346916 - -70.530402556 -121.230379310 - -70.445591605 -121.197609609 - -70.400190516 -121.401796509 - -70.439208143 -121.639285968 -} -8514ead3fffffff -{ - 53.160756125 139.097371312 - 53.084378734 139.161194632 - 53.076102783 139.311011123 - 53.144165452 139.397656657 - 53.220737527 139.334256808 - 53.229052380 139.183786034 -} -853aa6abfffffff -{ - 28.726273444 -56.540297687 - 28.646065613 -56.566599773 - 28.579029335 -56.505273757 - 28.592097681 -56.417568816 - 28.672326363 -56.391077500 - 28.739465964 -56.452480285 -} -85de8b6bfffffff -{ - -50.478260460 -40.471962736 - -50.422003779 -40.371157566 - -50.343964255 -40.403814933 - -50.322078939 -40.536774245 - -50.378103031 -40.637545698 - -50.456244649 -40.605392551 -} -85008463fffffff -{ - 76.611510339 72.296200874 - 76.610124696 72.686291667 - 76.689138778 72.875757706 - 76.769979758 72.672499382 - 76.771276282 72.277623527 - 76.691821462 72.090829363 -} -851ef34ffffffff -{ - 41.895564064 20.187511836 - 41.803609589 20.185767508 - 41.757300332 20.294679576 - 41.802898726 20.405461139 - 41.894861593 20.407436222 - 41.941217834 20.298398976 -} -85259817fffffff -{ - 41.062896753 92.582205414 - 40.972393050 92.606399618 - 40.945729304 92.720287763 - 41.009432483 92.810204141 - 41.099932571 92.786348171 - 41.126733322 92.672237361 -} -855b26dbfffffff -{ - 5.292657469 177.684263041 - 5.365777418 177.693947693 - 5.405378695 177.626632251 - 5.371757490 177.549647497 - 5.298601337 177.540077579 - 5.259102481 177.607377593 -} -85ee8197fffffff -{ - -70.868623416 -14.331826496 - -70.779051724 -14.226139980 - -70.703547218 -14.409186696 - -70.717193022 -14.697433124 - -70.806493122 -14.805011144 - -70.882419910 -14.622464221 -} -852f492ffffffff -{ - 32.322197701 136.649095869 - 32.405415681 136.620323560 - 32.427537894 136.530226038 - 32.366495528 136.469106197 - 32.283410296 136.497965885 - 32.261234750 136.587858346 -} -85f10593fffffff -{ - -84.676856156 128.159139884 - -84.720574941 127.323057246 - -84.806826004 127.352938515 - -84.849234703 128.248232479 - -84.804191183 129.097186765 - -84.718084431 129.038036252 -} -85b4ac77fffffff -{ - -24.806827026 -153.007626718 - -24.714638934 -152.975042923 - -24.642619825 -153.046708894 - -24.662704805 -153.150960956 - -24.754858388 -153.183687942 - -24.826961586 -153.112019907 + -13.508663302 96.327015202 + -13.429277402 96.303533222 + -13.407787061 96.214737645 + -13.465712816 96.149461877 + -13.545069728 96.172982279 + -13.566529938 96.261740118 } -851f5e0bfffffff -{ - 52.162514702 23.313718756 - 52.081180280 23.307989154 - 52.037492383 23.430510884 - 52.075079768 23.558887783 - 52.156407915 23.564916468 - 52.200155139 23.442269273 -} -85339e13fffffff -{ - 36.765336156 -179.450816026 - 36.860384000 -179.433699013 - 36.920279432 -179.526850321 - 36.885025019 -179.637115550 - 36.789907707 -179.654010207 - 36.730114154 -179.560862307 -} -851e5ec3fffffff -{ - 45.944729443 28.132817441 - 45.856932210 28.122311163 - 45.805007967 28.231441932 - 45.840821274 28.351133772 - 45.928592581 28.361883399 - 45.980576667 28.252698048 -} -85dfaaa7fffffff -{ - -60.484575852 -48.989930506 - -60.430762370 -48.834783608 - -60.340550793 -48.852704597 - -60.304111629 -49.024732250 - -60.357646535 -49.179510365 - -60.447898372 -49.162630597 -} -8518dd83fffffff -{ - 43.544450774 -14.641064318 - 43.475956636 -14.727546179 - 43.385818394 -14.687326106 - 43.364157978 -14.560900396 - 43.432563128 -14.474454435 - 43.522717546 -14.514397851 -} -85d8b427fffffff -{ - -44.931284323 144.593219094 - -44.838379038 144.574007289 - -44.801601189 144.450737944 - -44.857644310 144.346500177 - -44.950539610 144.365400004 - -44.987401962 144.488849740 -} -851609cbfffffff -{ - 54.334092514 169.604660545 - 54.420464547 169.610186446 - 54.466305346 169.476353508 - 54.425686469 169.337181106 - 54.339307267 169.332081654 - 54.293553848 169.465728031 -} -85b72027fffffff -{ - -38.181652393 -97.662395987 - -38.111528096 -97.583276344 - -38.021546820 -97.622407651 - -38.001572378 -97.740429795 - -38.071555395 -97.819632126 - -38.161654052 -97.780730257 -} -8538ed13fffffff -{ - 30.981928906 7.407405646 - 30.887835967 7.417468036 - 30.849032545 7.514853979 - 30.904312660 7.602346634 - 30.998480760 7.592441407 - 31.037293659 7.494886163 -} -8514cbc7fffffff -{ - 51.288260920 143.786420037 - 51.211641003 143.836484561 - 51.197875280 143.976918452 - 51.260652537 144.067848304 - 51.337429538 144.018232459 - 51.351272438 143.877236606 -} -85c83577fffffff -{ - -39.926159507 113.370249311 - -39.862254397 113.290002391 - -39.878343236 113.175348819 - -39.958433385 113.140619809 - -40.022525975 113.220858568 - -40.006340705 113.335835103 -} -850412cbfffffff -{ - 70.781822920 138.179938642 - 70.694609162 138.308646830 - 70.687167441 138.601449240 - 70.766884447 138.768044401 - 70.854439677 138.640903994 - 70.861936812 138.345586126 -} -85d4990bfffffff -{ - -40.675292397 -153.717964339 - -40.586733819 -153.679077308 - -40.518245979 -153.762520934 - -40.538256417 -153.884847539 - -40.626789532 -153.923926972 - -40.695337767 -153.840487782 -} -852475b7fffffff -{ - 47.634043170 109.092198898 - 47.546351702 109.088358102 - 47.502871767 109.188499193 - 47.546924582 109.292536679 - 47.634509916 109.296738275 - 47.678148704 109.196542037 -} -85003343fffffff -{ - 77.149644099 45.633904637 - 77.186618793 45.979811022 - 77.274124129 45.988387460 - 77.324621195 45.646128710 - 77.287122389 45.297575434 - 77.199654076 45.293930365 -} -8502cb07fffffff -{ - 68.123506812 -101.318494630 - 68.044303878 -101.458860631 - 67.959865731 -101.350909877 - 67.954364424 -101.103512787 - 68.033308659 -100.962369104 - 68.118012830 -101.069392051 -} -85e36b17fffffff -{ - -55.538892207 -150.388395581 - -55.527279598 -150.254558676 - -55.447284256 -150.204732889 - -55.379062036 -150.288491583 - -55.384920957 -150.355157498 - -55.395799331 -150.428707472 - -55.470574455 -150.471873613 -} -85dce00ffffffff -{ - -50.315102512 -19.003051206 - -50.395622806 -19.063789564 - -50.470721775 -18.979780956 - -50.465225556 -18.834853016 - -50.384620885 -18.774308502 - -50.309596779 -18.858497154 -} -854a65affffffff -{ - 29.072993984 138.229053763 - 28.993328791 138.245436517 - 28.964578880 138.340302735 - 29.015509242 138.418803308 - 29.095165981 138.402444434 - 29.123900888 138.307561033 -} -85145b23fffffff -{ - 55.945557809 144.792469488 - 55.863464140 144.847555717 - 55.847507307 145.008906287 - 55.913548064 145.115905514 - 55.995810843 145.061433730 - 56.011864093 144.899346082 -} -85adb087fffffff -{ - -28.245743374 22.324834599 - -28.155787903 22.333118483 - -28.102261524 22.246222369 - -28.138677996 22.151049767 - -28.228606825 22.142694805 - -28.282145908 22.229583449 -} -85108c27fffffff -{ - 54.608054525 52.326480359 - 54.539313296 52.430606310 - 54.559749671 52.585961609 - 54.649036396 52.637679137 - 54.717929655 52.533514265 - 54.697383891 52.377669675 -} -856a424ffffffff -{ - 5.796313636 33.198187906 - 5.882987071 33.201412859 - 5.930767254 33.123328307 - 5.891927432 33.041977308 - 5.805244763 33.038692256 - 5.757411058 33.116818299 -} -850b738bfffffff -{ - 67.276276603 73.302459830 - 67.199682291 73.404611666 - 67.192495359 73.638355511 - 67.261866298 73.771127157 - 67.338624348 73.669748882 - 67.345847904 73.434820510 -} -85e3b263fffffff -{ - -69.779959083 -122.876143753 - -69.742688632 -122.645435414 - -69.686964775 -122.620362672 - -69.659711085 -122.621563182 - -69.614665196 -122.840403628 - -69.651142747 -123.056177569 - -69.705623677 -123.054720706 - -69.733435270 -123.067879375 -} -854e4d9bfffffff -{ - 18.756663673 140.611747473 - 18.666128400 140.627504840 - 18.632457878 140.720496803 - 18.689326719 140.797739559 - 18.779845506 140.782009148 - 18.813512007 140.689008959 -} -8505689bfffffff -{ - 85.200664092 178.265247605 - 85.108768098 178.016771932 - 85.042728213 178.821777810 - 85.067053253 179.876256440 - 85.158200125 -179.842955880 - 85.225789968 179.351615493 -} -85204917fffffff -{ - 49.611879705 89.025540458 - 49.519469191 89.061030748 - 49.492922475 89.199023388 - 49.558662716 89.301877591 - 49.651090779 89.266843248 - 49.677761320 89.128498168 -} -85f31e37fffffff -{ - -77.376119178 -166.051289473 - -77.456150591 -166.004491769 - -77.481913845 -165.637391519 - -77.427195008 -165.320553676 - -77.347277751 -165.371939215 - -77.321961984 -165.735590520 -} -857525affffffff -{ - 9.240222309 -0.516269867 - 9.160124628 -0.502962379 - 9.122182041 -0.427391533 - 9.164315621 -0.365006289 - 9.244499096 -0.378234001 - 9.282463222 -0.453926865 -} -854e981bfffffff -{ - 30.154338257 154.595837307 - 30.248400112 154.583364933 - 30.287468675 154.484668968 - 30.232439367 154.398632267 - 30.138455732 154.411292318 - 30.099423087 154.509801630 -} -853b2377fffffff -{ - 39.218554820 -50.630895609 - 39.132848688 -50.670349084 - 39.062692486 -50.600722938 - 39.078146314 -50.491585754 - 39.163863726 -50.451883205 - 39.234116139 -50.521566659 -} -85f165dbfffffff -{ - -88.048649882 -21.468218396 - -87.965912984 -20.210161524 - -87.888380376 -21.614947955 - -87.890287148 -24.189822711 - -87.969801383 -25.558570757 - -88.050637910 -24.252871700 -} -8512e69bfffffff -{ - 55.241146633 -117.983507251 - 55.159137888 -118.031567227 - 55.088743987 -117.932865940 - 55.100138663 -117.786100450 - 55.182075422 -117.737462940 - 55.252689865 -117.836167065 -} -85c6422ffffffff -{ - -32.102286123 -137.485075820 - -32.010558311 -137.466549358 - -31.951417001 -137.546692116 - -31.983954372 -137.645477557 - -32.075731914 -137.664196381 - -32.134922443 -137.583937419 -} -85f25477fffffff -{ - -76.472228389 -120.906547206 - -76.521900832 -120.602236805 - -76.481384118 -120.253392868 - -76.391558018 -120.211956811 - -76.342430407 -120.514996684 - -76.382586916 -120.860755204 -} -853b5c2ffffffff -{ - 32.393050925 -43.549014470 - 32.308660021 -43.595129322 - 32.230567777 -43.533789859 - 32.236752900 -43.426341062 - 32.321111544 -43.380034673 - 32.399317420 -43.441368290 -} -85216b4ffffffff -{ - 55.883490404 75.845140163 - 55.796743105 75.914455506 - 55.785801605 76.083884200 - 55.861560105 76.184610251 - 55.948414813 76.115747157 - 55.959403768 75.945703962 -} -85031dcbfffffff -{ - 84.930106709 -112.983975869 - 84.914703270 -113.994599094 - 84.827639494 -114.368782441 - 84.757011125 -113.755399189 - 84.772118320 -112.775076093 - 84.858142153 -112.378429724 -} -8596220bfffffff -{ - -15.245108952 30.312437824 - -15.147885258 30.317134784 - -15.095390000 30.232239853 - -15.140094487 30.142612994 - -15.237321294 30.137845298 - -15.289840583 30.222775177 -} -85ad5e0bfffffff -{ - -28.232127627 6.714325551 - -28.322989173 6.696745495 - -28.384746901 6.775921032 - -28.355551928 6.872576211 - -28.264715090 6.889950874 - -28.203048381 6.810875802 -} -858d9033fffffff -{ - -4.661966270 114.005914677 - -4.578482935 113.988583481 - -4.557804130 113.907048369 - -4.620693942 113.842836960 - -4.704212738 113.860234258 - -4.724806325 113.941776882 -} -85654b13fffffff -{ - 2.861863680 90.303945040 - 2.954078790 90.277797536 - 2.978604663 90.184841281 - 2.910920062 90.118088397 - 2.818750290 90.144262224 - 2.794219743 90.237162727 -} -855c0e37fffffff -{ - 11.597469335 -149.181729799 - 11.505537327 -149.214449728 - 11.431885583 -149.149603364 - 11.450129863 -149.052056110 - 11.542031269 -149.019288420 - 11.615719038 -149.084115595 -} -85119aa3fffffff -{ - 52.206847439 41.262192993 - 52.148873846 41.368791688 - 52.180758799 41.500140792 - 52.270769122 41.525174313 - 52.328859022 41.418356611 - 52.296822023 41.286724212 -} -855a423bfffffff -{ - 15.218746175 165.000324213 - 15.305172910 164.999301887 - 15.349207819 164.916571217 - 15.306724067 164.834955608 - 15.220312236 164.836133051 - 15.176369105 164.918771017 -} -8569a3dbfffffff -{ - 7.893695690 108.849767859 - 7.986249222 108.829321680 - 8.013925672 108.739821880 - 7.948983724 108.670774799 - 7.856389595 108.691288888 - 7.828777963 108.780782198 -} -85b556a3fffffff -{ - -32.978791981 -160.090822383 - -32.888733076 -160.049215963 - -32.813200487 -160.121620145 - -32.827662810 -160.235573356 - -32.917665341 -160.277308917 - -32.993261975 -160.204962488 -} -85d6b083fffffff -{ - -46.912330810 44.592129479 - -46.990658381 44.591180746 - -47.040559839 44.687067557 - -47.012088358 44.783944750 - -46.933693538 44.784708640 - -46.883837375 44.688780442 -} -85d414a7fffffff -{ - -49.033537252 -157.993137794 - -48.953764728 -157.945371125 - -48.888021347 -158.034253876 - -48.901991319 -158.170845801 - -48.981721999 -158.218816217 - -49.047524636 -158.129991561 -} -85245037fffffff -{ - 43.586381979 109.021584336 - 43.500084273 109.018156501 - 43.459626499 109.110671069 - 43.505307420 109.206661634 - 43.591504196 109.210396997 - 43.632121098 109.117834620 -} -85d9b3dbfffffff -{ - -49.361455179 151.770995062 - -49.272435273 151.740008775 - -49.244013628 151.602631460 - -49.304553687 151.495961459 - -49.393602950 151.526616140 - -49.422082985 151.664272930 -} -85e6d197fffffff -{ - -57.235042226 13.120634017 - -57.153222337 13.104171137 - -57.113883205 12.958486944 - -57.156188977 12.828731407 - -57.238092828 12.844438975 - -57.277607500 12.990658262 -} -8543a30ffffffff -{ - 23.859300764 55.114199212 - 23.792492752 55.173447153 - 23.798371814 55.266318441 - 23.871130897 55.300120912 - 23.938079877 55.240879186 - 23.932128667 55.147828512 -} -853f24b7fffffff -{ - 39.783518276 17.256300916 - 39.690282294 17.257595793 - 39.645879440 17.364878227 - 39.694673306 17.471008897 - 39.787932382 17.469931882 - 39.832374645 17.362506257 -} -85d05ca3fffffff -{ - -47.269766379 22.907481868 - -47.354955509 22.909034584 - -47.391982434 23.007671217 - -47.343820192 23.104480277 - -47.258731395 23.102655534 - -47.221704441 23.004293365 -} -85f2ea83fffffff -{ - -78.003096068 -104.071903026 - -78.031641377 -103.657976726 - -77.968477577 -103.327023812 - -77.877375273 -103.410982617 - -77.849265215 -103.820380414 - -77.911825855 -104.150321510 -} -85b48353fffffff -{ - -21.612740059 -149.939238162 - -21.521394126 -149.910343000 - -21.451456502 -149.981319877 - -21.472775699 -150.081215053 - -21.564098547 -150.110255067 - -21.634125383 -150.039255231 -} -85006a4ffffffff -{ - 83.185387820 -19.100944747 - 83.269715258 -19.155152572 - 83.308181789 -19.852890263 - 83.261448665 -20.485679153 - 83.177316572 -20.414457968 - 83.139710317 -19.727404081 -} -85e87227fffffff -{ - -59.656906618 -89.114008812 - -59.579710633 -89.012472370 - -59.499485601 -89.088741430 - -59.496302284 -89.266201641 - -59.573372279 -89.368136949 - -59.653751588 -89.292215562 -} -85f2ddc3fffffff -{ - -79.519772912 -89.020892028 - -79.525911663 -88.510142193 - -79.446318258 -88.227540733 - -79.361268127 -88.452895675 - -79.355285003 -88.955873097 - -79.434197918 -89.241189504 -} -85e26ea3fffffff -{ - -52.175878798 -142.986116328 - -52.153333695 -142.856204972 - -52.066871835 -142.821205251 - -52.003102591 -142.915789615 - -52.025666895 -143.045227015 - -52.111981196 -143.080552880 -} -85f3ab13fffffff -{ - -79.984682327 -170.355193048 - -80.068023627 -170.333482811 - -80.101311582 -169.878935407 - -80.050625616 -169.450891417 - -79.967326642 -169.480327745 - -79.934665848 -169.930098106 -} -85e42223fffffff -{ - -61.531267275 106.539712138 - -61.453541989 106.416913632 - -61.465249365 106.214604341 - -61.554751943 106.134035024 - -61.632728373 106.256544977 - -61.620950786 106.459916742 -} -854a6ec3fffffff -{ - 27.423143917 138.917901033 - 27.341371852 138.934138832 - 27.311442388 139.028678304 - 27.363298787 139.106994506 - 27.445060296 139.090781627 - 27.474976038 138.996227553 -} -85049e9bfffffff -{ - 64.145328377 141.743066445 - 64.058384427 141.826953332 - 64.045624865 142.043688441 - 64.119724573 142.177887704 - 64.206908063 142.094995674 - 64.219752713 141.876903886 -} -853f43affffffff -{ - 34.128334297 29.380482386 - 34.032781524 29.370100244 - 33.976713032 29.464830704 - 34.016126162 29.569975065 - 34.111640227 29.580541348 - 34.167779992 29.485779292 -} -851b03cffffffff -{ - 56.885380191 -46.173751565 - 56.871356367 -46.338139871 - 56.784784284 -46.402871036 - 56.712443029 -46.303677458 - 56.726476948 -46.140056632 - 56.812841991 -46.074864344 -} -85ed0a03fffffff -{ - -68.644395102 161.783891945 - -68.639685755 161.564906819 - -68.713137618 161.451402674 - -68.791491929 161.557773452 - -68.796112917 161.778310162 - -68.722468185 161.890917480 -} -85ef266bfffffff -{ - -85.662791889 -58.828487595 - -85.622555394 -57.706092658 - -85.528468244 -57.638000249 - -85.474865508 -58.647975114 - -85.513772752 -59.741682856 - -85.607581301 -59.853822396 -} -8565617bfffffff -{ - -0.662878408 94.294118778 - -0.571833298 94.269119788 - -0.547130371 94.176576360 - -0.613489047 94.109077960 - -0.704502265 94.134113483 - -0.729188753 94.226610979 -} -850d00d3fffffff -{ - 72.629171745 -157.201499672 - 72.553517425 -157.387348712 - 72.469279938 -157.269888734 - 72.460419734 -156.968654052 - 72.535627520 -156.782160729 - 72.620141061 -156.897530379 -} -8500ddcbfffffff -{ - 85.205197142 100.285532926 - 85.163264395 101.276708860 - 85.214588256 102.228327906 - 85.309254419 102.204467310 - 85.352455696 101.190280449 - 85.299695435 100.223112140 -} -85dd2983fffffff -{ - -63.484977049 -23.267392247 - -63.404529318 -23.161592692 - -63.323442605 -23.268317523 - -63.322512622 -23.480203454 - -63.402682559 -23.586681056 - -63.484060316 -23.480600253 -} -85c96317fffffff -{ - -49.015151311 114.108478264 - -48.946639293 114.009139771 - -48.966550259 113.869239836 - -49.055090269 113.828202023 - -49.123814054 113.927542117 - -49.103785745 114.067919494 -} -8540c26ffffffff -{ - 33.750428120 103.367622892 - 33.830150896 103.342831481 - 33.857218341 103.241441419 - 33.804552395 103.164870216 - 33.724807387 103.189732708 - 33.697750494 103.291095428 -} -85ee2213fffffff -{ - -77.497900419 -36.696299349 - -77.426423028 -36.392230684 - -77.333580051 -36.525477253 - -77.311861722 -36.958003432 - -77.382711560 -37.262470965 - -77.475904622 -37.134053406 -} -8501a443fffffff -{ - 70.097366083 45.317150225 - 70.129295378 45.532694500 - 70.209632283 45.536036617 - 70.258007192 45.321912759 - 70.225728425 45.105355429 - 70.145425607 45.103935474 -} -85966b23fffffff -{ - -13.285232258 17.259741310 - -13.190169205 17.269281382 - -13.134526152 17.191214932 - -13.173897833 17.103639587 - -13.268900481 17.094045200 - -13.324591898 17.172080394 -} -85960503fffffff -{ - -14.276780257 28.441078629 - -14.179494061 28.446509205 - -14.126263727 28.362332088 - -14.170289616 28.272699248 - -14.267569188 28.267199522 - -14.320829577 28.351401755 -} -858c7197fffffff -{ - -11.918476521 99.671953917 - -11.837664196 99.649332278 - -11.816751329 99.560637621 - -11.876690961 99.494594601 - -11.957484204 99.517262288 - -11.978356970 99.605927029 -} -857b50dbfffffff -{ - -4.902273324 44.430919218 - -4.810320637 44.429903137 - -4.762013470 44.351301555 - -4.805647191 44.273630315 - -4.897665210 44.274587445 - -4.945984218 44.353274811 -} -85ae5bc7fffffff -{ - -25.486424973 103.847436447 - -25.563733473 103.883799621 - -25.571423157 103.966223772 - -25.501901997 104.012160564 - -25.424700225 103.975808541 - -25.416912956 103.893508448 -} -850335bbfffffff +859663abfffffff { - 89.117837857 166.613243114 - 89.025921264 166.466005437 - 88.973133291 170.952796256 - 89.005178920 175.889254033 - 89.095313799 176.979893972 - 89.155829224 172.231379838 -} -851eb6d3fffffff -{ - 42.778416675 6.894878764 - 42.690093743 6.906802328 - 42.657988795 7.017193218 - 42.714206298 7.115880777 - 42.802592921 7.104157447 - 42.834698458 6.993546025 -} -85cc9eabfffffff -{ - -33.200344300 84.193970592 - -33.289217229 84.225931590 - -33.308000863 84.333901884 - -33.237937169 84.409737361 - -33.149131984 84.377680436 - -33.130322704 84.269883665 -} -85ccf503fffffff -{ - -39.459895749 78.632009122 - -39.546918690 78.661985453 - -39.568664144 78.778228224 - -39.503386916 78.864313534 - -39.416406263 78.834197119 - -39.394660464 78.718135156 -} -8525263bfffffff -{ - 53.742170266 91.444636491 - 53.650190481 91.478029309 - 53.619708817 91.625106454 - 53.681073520 91.739171477 - 53.773056558 91.706328608 - 53.803671955 91.558870200 -} -857c110bfffffff -{ - 0.294009081 -19.511613350 - 0.370434977 -19.471139218 - 0.448784354 -19.513549405 - 0.450773082 -19.596499707 - 0.374320664 -19.637056705 - 0.295906009 -19.594580579 -} -85d3b41bfffffff -{ - -55.894197785 -97.315758207 - -55.821607185 -97.205867748 - -55.733436659 -97.261228660 - -55.717733589 -97.426039308 - -55.790176479 -97.536098458 - -55.878469992 -97.481180006 -} -85c4811bfffffff -{ - -42.762144734 -44.019076833 - -42.826696225 -44.087657759 - -42.909150401 -44.052382427 - -42.927088902 -43.948255514 - -42.862453103 -43.879583072 - -42.779963206 -43.915128894 -} -85f128a7fffffff -{ - -86.878535764 119.742925992 - -86.911214664 118.183830651 - -86.999047159 117.962732396 - -87.054743228 119.386975191 - -87.020184726 121.007604101 - -86.931869853 121.141395672 -} -851a662ffffffff -{ - 49.831641013 -33.844855770 - 49.752850577 -33.918871251 - 49.675275420 -33.849209445 - 49.676403431 -33.705671077 - 49.755129487 -33.631436050 - 49.832791930 -33.700958046 -} -85864b7bfffffff -{ - -7.531895121 72.992715796 - -7.619239460 73.012324277 - -7.647255011 73.101819641 - -7.587876700 73.171613656 - -7.500573562 73.151906131 - -7.472607443 73.062503517 -} -850360abfffffff -{ - 81.753607225 -43.723966522 - 81.753595962 -44.323818664 - 81.678802484 -44.575793905 - 81.604592815 -44.233455706 - 81.604543071 -43.643781819 - 81.678763479 -43.386386169 -} -85d89a0ffffffff -{ - -39.302060594 139.720675310 - -39.207458281 139.709194936 - -39.166791075 139.599980599 - -39.220623667 139.502135385 - -39.315187142 139.513348509 - -39.355957018 139.622674087 -} -85e808c3fffffff -{ - -62.240358967 -88.131288894 - -62.163613842 -88.024921103 - -62.086220740 -88.108601978 - -62.085411872 -88.298280446 - -62.162026480 -88.405131141 - -62.239580503 -88.321823383 -} -8570a06bfffffff -{ - 2.109068941 -175.282486013 - 2.027726235 -175.300359629 - 1.964220586 -175.241813560 - 1.982004361 -175.165308549 - 2.063396217 -175.147351802 - 2.126955198 -175.205983205 -} -85f38e57fffffff -{ - -82.052918167 -178.626749691 - -82.137802581 -178.692557340 - -82.183343262 -178.159695012 - -82.143084871 -177.565597138 - -82.057998154 -177.512280917 - -82.013363501 -178.040534357 -} -8503233bfffffff -{ - 88.221287021 -75.990632947 - 88.262635514 -78.607482706 - 88.209409924 -81.104034544 - 88.118637240 -80.883573351 - 88.080687552 -78.413455808 - 88.130285573 -76.019284663 -} -85699c93fffffff -{ - 4.542189299 109.994951512 - 4.633357513 109.975227171 - 4.659698921 109.887562324 - 4.594799827 109.819624921 - 4.503591399 109.839416915 - 4.477322229 109.927078701 -} -85f2982bfffffff -{ - -87.386755575 -70.881037469 - -87.365119258 -68.898705620 - -87.274871735 -68.414518991 - -87.207674975 -69.809803260 - -87.228006775 -71.686442252 - -87.316785254 -72.269890662 -} -85666a53fffffff -{ - 4.370356274 -67.142824346 - 4.301110004 -67.191037408 - 4.219785711 -67.152417974 - 4.207789933 -67.065612462 - 4.277064862 -67.017477300 - 4.358306950 -67.056069661 -} -85efb387fffffff -{ - -79.123178985 9.989539120 - -79.027465977 9.965526051 - -78.983241503 9.527078636 - -79.034191496 9.108191460 - -79.130011429 9.124779657 - -79.174779633 9.567692935 -} -8525a1dbfffffff -{ - 46.681261010 89.967846937 - 46.588947216 89.999603065 - 46.562362631 90.128936113 - 46.627964107 90.226816693 - 46.720288752 90.195470518 - 46.747001321 90.065833362 -} -851f9c2ffffffff -{ - 46.058750922 7.756052029 - 45.972950253 7.767590451 - 45.942065396 7.882817427 - 45.996974877 7.986740374 - 46.082831039 7.975423425 - 46.113722353 7.859961736 -} -85e8acd3fffffff -{ - -67.054720133 -82.143669685 - -67.046424203 -81.908951439 - -66.963526399 -81.802227388 - -66.889241419 -81.929295821 - -66.897548353 -82.162354842 - -66.980129238 -82.269996836 -} -85a48e6bfffffff -{ - -26.253424794 -34.438302594 - -26.330109322 -34.491522894 - -26.407486491 -34.449839434 - -26.408143246 -34.354767529 - -26.331333193 -34.301542178 - -26.253992024 -34.343393556 -} -852a5d63fffffff -{ - 32.216864078 -67.742310757 - 32.180833154 -67.832487289 - 32.105918681 -67.839079344 - 32.067066053 -67.755757631 - 32.102974952 -67.665753666 - 32.177858265 -67.658898980 -} -85f34957fffffff -{ - -70.677802036 -132.316228519 - -70.733765396 -132.146949380 - -70.709401557 -131.895296930 - -70.629187700 -131.814809826 - -70.573609177 -131.984322500 - -70.597860381 -132.234097517 -} -852f5c2ffffffff -{ - 34.147049981 140.227262423 - 34.233316522 140.200460438 - 34.257654620 140.104681048 - 34.195767355 140.035927449 - 34.109628246 140.062846732 - 34.085249004 140.158402672 -} -85ef3593fffffff -{ - -86.383282566 -55.775233599 - -86.338717793 -54.469722755 - -86.244863949 -54.468583833 - -86.195646048 -55.709426896 - -86.238491564 -56.979512407 - -86.332229408 -57.043991339 -} -85ea044bfffffff -{ - -64.114516807 -168.452390758 - -64.060198468 -168.377618622 - -64.003325740 -168.478215304 - -64.000686929 -168.653288373 - -64.054925985 -168.728237690 - -64.111883111 -168.627938168 -} -85aa324bfffffff -{ - -25.614701680 67.466135700 - -25.710521140 67.484344679 - -25.744263169 67.585375972 - -25.682130403 67.668101062 - -25.586313992 67.649747605 - -25.552627195 67.548813421 -} -85f106b3fffffff -{ - -83.135535082 124.945961980 - -83.174025669 124.284244750 - -83.258638671 124.267357031 - -83.304780863 124.929365301 - -83.265324224 125.600345209 - -83.180703706 125.600036791 -} -8503167bfffffff -{ - 84.430116754 -157.465083976 - 84.354828083 -158.034979140 - 84.267199136 -157.666460732 - 84.253977563 -156.747392070 - 84.327996862 -156.171368995 - 84.416498913 -156.520075288 -} -8538b523fffffff -{ - 27.708932015 -5.696353488 - 27.644001808 -5.769852390 - 27.555678620 -5.747701010 - 27.532304680 -5.652249521 - 27.597137973 -5.578837471 - 27.685441990 -5.600789979 -} -85abae17fffffff -{ - -23.500234700 63.752367193 - -23.595851099 63.767260760 - -23.631513799 63.864445415 - -23.571488600 63.946661664 - -23.475857018 63.931623720 - -23.440265714 63.834513841 -} -85178853fffffff -{ - 53.585368681 154.750501272 - 53.670370613 154.733359598 - 53.684815184 154.664641766 - 53.698521048 154.592728851 - 53.643020914 154.475963232 - 53.558079203 154.493469451 - 53.529269650 154.630558418 -} -85d5188ffffffff -{ - -53.407620740 -159.102672375 - -53.333398615 -159.050591520 - -53.270852381 -159.144105045 - -53.282463509 -159.289619039 - -53.356637328 -159.341920192 - -53.419248406 -159.248487795 -} -853465a3fffffff -{ - 32.537264538 -14.616435402 - 32.465368902 -14.691601631 - 32.374288190 -14.656687418 - 32.355080987 -14.546815711 - 32.426873691 -14.471676765 - 32.517976407 -14.506381960 -} -856775cffffffff -{ - 14.327017431 -69.058489435 - 14.267292183 -69.106442453 - 14.193116366 -69.068861124 - 14.178738044 -68.983346459 - 14.238507754 -68.935461486 - 14.312611348 -68.973023043 -} -8535014ffffffff -{ - 41.760003297 -24.141353541 - 41.683106257 -24.218317906 - 41.595072632 -24.166708146 - 41.583874784 -24.038336204 - 41.660683631 -23.961298523 - 41.748778448 -24.012705501 -} -852e3437fffffff -{ - 38.271679389 147.637696730 - 38.362661604 147.616340376 - 38.392160807 147.509705378 - 38.330687349 147.424677302 - 38.239810418 147.446220298 - 38.210301610 147.552605139 -} -852b0e67fffffff -{ - 44.108875091 -64.816169659 - 44.070699761 -64.933782607 - 43.982255985 -64.947863800 - 43.932053194 -64.844752785 - 43.970099126 -64.727455453 - 44.058476930 -64.712953952 -} -85f3902bfffffff -{ - -82.191531741 156.121088637 - -82.263786345 155.783060859 - -82.335355534 156.111976155 - -82.333824856 156.785502690 - -82.260711909 157.116922761 - -82.189987998 156.781596224 -} -85d0c997fffffff -{ - -52.339537616 22.581235819 - -52.422196347 22.582433979 - -52.455422761 22.690481201 - -52.405988645 22.797002686 - -52.323420072 22.795476631 - -52.290195351 22.687756480 -} -85b9668ffffffff -{ - -39.841008354 127.267020155 - -39.750864180 127.271258407 - -39.701595655 127.179158332 - -39.742362173 127.082822376 - -39.832408417 127.078358295 - -39.881786140 127.170455704 -} -855020c3fffffff -{ - 17.094713967 -130.750414339 - 17.011501376 -130.786619322 - 16.936850919 -130.733114996 - 16.945419386 -130.643506139 - 17.028559585 -130.607320948 - 17.103203697 -130.660724714 -} -85792b37fffffff -{ - 7.432067938 -132.367854634 - 7.346749142 -132.402649244 - 7.275499423 -132.349854093 - 7.289545548 -132.262352801 - 7.374776905 -132.227571394 - 7.446049541 -132.280277972 -} -85033043fffffff -{ - 87.303049964 -176.723659534 - 87.214454119 -177.316280774 - 87.143218155 -176.039988271 - 87.157955508 -174.187528854 - 87.244845080 -173.508883796 - 87.318743234 -174.764900660 -} -85e2e3b3fffffff -{ - -54.877290780 -130.370564035 - -54.840551230 -130.228326179 - -54.748207878 -130.214886279 - -54.692694216 -130.343142878 - -54.729367503 -130.484911070 - -54.821620431 -130.498891449 -} -8588c5b7fffffff -{ - -1.005264115 -156.888646729 - -1.091382195 -156.916698461 - -1.159987732 -156.853515516 - -1.142539208 -156.762260489 - -1.056437826 -156.734144000 - -0.987768202 -156.797347193 -} -850a9abbfffffff -{ - 56.847148990 105.093058809 - 56.757943279 105.097208833 - 56.712531003 105.229689182 - 56.756165033 105.358185447 - 56.845285982 105.354625605 - 56.890857944 105.221979890 -} -8503242ffffffff -{ - 88.859079097 8.893755785 - 88.941097827 10.882534988 - 89.017345837 7.834623468 - 89.004497020 2.561686368 - 88.917943960 1.114024095 - 88.848541950 4.331503032 -} -851225d7fffffff -{ - 63.035580999 -117.465097265 - 62.949300329 -117.528346067 - 62.878405028 -117.403020361 - 62.893537367 -117.214458785 - 62.979728772 -117.150271839 - 63.050877630 -117.275581604 + -14.866486502 20.245573032 + -14.770558856 20.254142084 + -14.715038387 20.173439024 + -14.755403899 20.084184014 + -14.851285134 20.075554823 + -14.906847329 20.156240710 } -850561d7fffffff +85ba1087fffffff { - 86.135015602 154.336923219 - 86.042535566 154.586494319 - 86.008928769 155.877604618 - 86.066516493 156.960987228 - 86.159600894 156.766439490 - 86.194529984 155.432774061 + -33.631101315 -177.515775846 + -33.551870454 -177.463495402 + -33.471257115 -177.516760916 + -33.469862396 -177.622137899 + -33.549002190 -177.674425668 + -33.629627721 -177.621329413 } -85930287fffffff -{ - -3.204701144 -104.476227115 - -3.275855992 -104.531301493 - -3.359188627 -104.502619249 - -3.371404726 -104.418778857 - -3.300195564 -104.363632835 - -3.216824660 -104.392398812 -} -85aa06cffffffff -{ - -24.749205245 70.034766640 - -24.844902910 70.054887436 - -24.876901658 70.156278481 - -24.813156638 70.237440469 - -24.717475974 70.217182559 - -24.685523229 70.115899631 -} -85e715b7fffffff -{ - -68.455558862 38.594453144 - -68.378778238 38.469424329 - -68.374547082 38.232377237 - -68.447167086 38.118609430 - -68.524297002 38.242873261 - -68.528457347 38.481678410 -} -85f1756bfffffff -{ - -87.242712744 60.065152744 - -87.185334273 58.569897145 - -87.218476476 56.841713448 - -87.310818509 56.528727970 - -87.370730409 58.052006632 - -87.335694537 59.862044425 -} -856111affffffff -{ - 7.401916793 80.751933316 - 7.491760193 80.724391107 - 7.513163170 80.635133603 - 7.444773298 80.573489210 - 7.355004412 80.601030633 - 7.333550886 80.690217339 -} -85cfb2d3fffffff -{ - -49.428050223 -64.491811683 - -49.396946470 -64.369129214 - -49.321101337 -64.347111904 - -49.276448968 -64.447305353 - -49.307422977 -64.569592727 - -49.383178747 -64.592081048 -} -855e68bbfffffff -{ - 13.884459268 -64.601724833 - 13.957862193 -64.557553137 - 14.024884836 -64.594412968 - 14.018509005 -64.675367234 - 13.945182225 -64.719471376 - 13.878155192 -64.682688844 -} -857b44cbfffffff -{ - -7.647584089 42.710233297 - -7.553772273 42.709866984 - -7.505192737 42.629498007 - -7.550415519 42.549412452 - -7.644287965 42.549716495 - -7.692877048 42.630168406 -} -859eda37fffffff -{ - -8.468531936 159.222809160 - -8.552833353 159.233770966 - -8.578788513 159.310762687 - -8.520527948 159.376748748 - -8.436288694 159.365826515 - -8.410247809 159.288878644 -} -8550ac6ffffffff -{ - 23.127991596 -126.490323013 - 23.211646406 -126.448373838 - 23.289156680 -126.503485538 - 23.282925603 -126.600520972 - 23.199268397 -126.642329040 - 23.121844600 -126.587242947 -} -85f0516bfffffff -{ - -75.492358744 44.860602138 - -75.418377655 44.641065227 - -75.426050355 44.289906933 - -75.507902870 44.154508964 - -75.582402532 44.373125600 - -75.574529770 44.728086767 -} -85de98affffffff -{ - -51.790857301 -37.564858743 - -51.730928331 -37.465012057 - -51.652142445 -37.505803935 - -51.633157079 -37.645928852 - -51.692844779 -37.745800778 - -51.771758768 -37.705523856 -} -85ab636ffffffff -{ - -15.212052989 74.230490493 - -15.304790847 74.252124005 - -15.333797970 74.347150264 - -15.270028870 74.420434491 - -15.177335775 74.398693145 - -15.148366935 74.303775256 -} -850a6b83fffffff -{ - 74.623966774 95.378775538 - 74.586655649 95.703963339 - 74.642977289 95.982425251 - 74.737111138 95.936528963 - 74.774738791 95.608550226 - 74.717913699 95.329270658 -} -850619c7fffffff -{ - 68.541325279 -38.375436873 - 68.543302573 -38.616269717 - 68.463984533 -38.737681780 - 68.382977987 -38.618881708 - 68.381085194 -38.379718799 - 68.460114729 -38.257693819 -} -8530c8cffffffff -{ - 35.071638257 130.417630560 - 35.001880867 130.434994164 - 34.982352881 130.529711930 - 35.032605898 130.607110733 - 35.102368608 130.589756799 - 35.121873049 130.494994308 -} -853e99b3fffffff -{ - 18.586577983 20.375119735 - 18.491958995 20.373572355 - 18.442821698 20.460336759 - 18.488226603 20.548727130 - 18.582853008 20.550421127 - 18.632067217 20.463578133 -} -856d8c3bfffffff -{ - 10.225618511 -99.824321477 - 10.299981063 -99.767853033 - 10.382083261 -99.804934879 - 10.389780018 -99.898587083 - 10.315323850 -99.955054796 - 10.233264612 -99.917871201 -} -85eb2677fffffff -{ - -60.644556188 -154.121302801 - -60.640889581 -153.972377598 - -60.566135692 -153.909013562 - -60.495210014 -153.994329246 - -60.498960043 -154.142586055 - -60.573552425 -154.206193669 -} -8502ddabfffffff -{ - 69.375199876 -106.158796383 - 69.292814585 -106.287698253 - 69.212895902 -106.158024800 - 69.215066019 -105.900183498 - 69.297216901 -105.770158464 - 69.377432306 -105.899088620 -} -85119c2ffffffff -{ - 53.181985535 39.794469463 - 53.126186065 39.903978507 - 53.159971696 40.035560285 - 53.249711420 40.057904198 - 53.305620782 39.948145592 - 53.271680256 39.816292545 -} -8572305bfffffff -{ - 4.716288897 134.345611379 - 4.620384726 134.361858133 - 4.586480267 134.453150007 - 4.648486213 134.528223799 - 4.744410617 134.511992728 - 4.778308903 134.420672110 -} -85014c23fffffff -{ - 77.568318297 -5.230240936 - 77.645064423 -5.163520696 - 77.698730090 -5.476576004 - 77.675056561 -5.855540239 - 77.598136521 -5.917724758 - 77.545060827 -5.605500281 -} -8572f6dbfffffff -{ - -1.424458936 138.272103146 - -1.519581896 138.287758058 - -1.553607756 138.378440620 - -1.492529097 138.453483778 - -1.397399668 138.437850749 - -1.363355302 138.347152613 -} -85a3338ffffffff -{ - -13.313761569 43.387918632 - -13.219189569 43.387275323 - -13.172286787 43.305301301 - -13.219961832 43.223881588 - -13.314599229 43.224460358 - -13.361496225 43.306523428 -} -85f39973fffffff -{ - -83.995113863 -178.351849910 - -84.082027394 -178.436048010 - -84.128624038 -177.716956745 - -84.087099952 -176.922200709 - -83.999944544 -176.860488435 - -83.954539541 -177.570967077 -} -85cd18b7fffffff -{ - -46.247144725 88.528244233 - -46.164128582 88.479521915 - -46.153326350 88.347242410 - -46.225452630 88.263238506 - -46.308584803 88.311584896 - -46.319474892 88.444312161 -} -85b04907fffffff -{ - -17.610522018 -122.747255604 - -17.567189681 -122.672898687 - -17.494395060 -122.674079147 - -17.464948180 -122.749448352 - -17.508179162 -122.823701687 - -17.580958216 -122.822689356 -} -858da29bfffffff -{ - -8.602249626 114.297648941 - -8.522732218 114.280678902 - -8.504783087 114.200493266 - -8.566433689 114.137269664 - -8.645978046 114.154304172 - -8.663844925 114.234497828 -} -85051e87fffffff -{ - 76.373516927 119.321384439 - 76.304063350 119.605254197 - 76.327233753 120.000233446 - 76.420153600 120.115626648 - 76.490186170 119.831807048 - 76.466717386 119.432515094 -} -85e25cb3fffffff -{ - -52.253212539 -137.118534145 - -52.223540296 -136.985337333 - -52.133441908 -136.960200417 - -52.073142001 -137.067851427 - -52.102794624 -137.200583920 - -52.192766630 -137.226128695 -} -852a5593fffffff -{ - 35.216963964 -67.278058495 - 35.179717400 -67.374213096 - 35.100780947 -67.381962086 - 35.059128365 -67.293852467 - 35.096247981 -67.197896562 - 35.175146866 -67.189851754 -} -853c75cbfffffff -{ - 31.786651442 90.888746574 - 31.702483519 90.912047284 - 31.682214421 91.011636740 - 31.745991737 91.088102264 - 31.830177415 91.065049863 - 31.850568223 90.965283441 -} -855f0877fffffff -{ - 6.294415520 -57.547555772 - 6.373379181 -57.499700009 - 6.451311124 -57.541182642 - 6.450274892 -57.630454533 - 6.371373259 -57.678258669 - 6.293445871 -57.636842625 -} -8517106bfffffff -{ - 58.467974682 151.247716241 - 58.381064375 151.288888013 - 58.355987977 151.459264084 - 58.417658917 151.589236774 - 58.504691275 151.548900369 - 58.529931227 151.377753840 -} -85790617fffffff -{ - 8.209886334 -136.577671367 - 8.122292870 -136.612511379 - 8.049641284 -136.555957102 - 8.064555329 -136.464638857 - 8.152071597 -136.429797955 - 8.224751001 -136.486276061 -} -856a1ccffffffff -{ - 5.639758294 25.809674645 - 5.726751676 25.815635182 - 5.773658837 25.738822545 - 5.733637954 25.656039574 - 5.646664323 25.650022145 - 5.599691736 25.726844543 -} -8503358ffffffff +85f024a7fffffff { - 88.980240514 161.818904453 - 88.888311163 162.084985653 - 88.841865140 166.241440299 - 88.881536860 170.469758307 - 88.973133291 170.952796256 - 89.025921264 166.466005437 + -83.042618236 82.267817882 + -83.016796395 81.550514663 + -83.077487104 81.035703806 + -83.165052502 81.238343630 + -83.191315184 81.970685623 + -83.129563846 82.485159326 +} +851aae8ffffffff +{ + 46.917002691 -50.782103744 + 46.894668808 -50.910119757 + 46.809850964 -50.952199467 + 46.747525703 -50.866601916 + 46.769827899 -50.739039368 + 46.854486943 -50.696621987 +} +85c8db8ffffffff +{ + -34.782519445 97.601695172 + -34.861459439 97.640213023 + -34.867407527 97.738476773 + -34.794495844 97.798053152 + -34.715641875 97.759515912 + -34.709613582 97.661421445 +} +85b8035bfffffff +{ + -28.843253040 129.969254726 + -28.753323489 129.970071605 + -28.711478977 129.886172336 + -28.759437900 129.801439903 + -28.849284424 129.800441453 + -28.891255128 129.884356844 +} +859c536ffffffff +{ + -12.888472688 138.268429387 + -12.975971370 138.283831343 + -13.007156784 138.373046149 + -12.950874141 138.446874027 + -12.863362538 138.431493243 + -12.832146424 138.342263347 +} +85bc74a3fffffff +{ + -35.769894363 26.655569742 + -35.686992384 26.662342078 + -35.639873859 26.570039227 + -35.675653451 26.470944724 + -35.758548105 26.464089876 + -35.805670590 26.556411989 +} +850134a3fffffff +{ + 69.451843276 30.443740815 + 69.498295461 30.610120726 + 69.573453760 30.550905846 + 69.601954561 30.323804744 + 69.555137765 30.157368110 + 69.480185600 30.218083848 +} +85b2319bfffffff +{ + -24.645510095 -71.737584369 + -24.721849551 -71.793879549 + -24.800355579 -71.751067247 + -24.802499715 -71.651974345 + -24.726185187 -71.595756556 + -24.647701620 -71.638554131 +} +856a5647fffffff +{ + 5.157451807 30.443058645 + 5.245014164 30.447330222 + 5.292864341 30.369221811 + 5.253209877 30.286811648 + 5.165648913 30.282480175 + 5.117740927 30.360618746 +} +8575597bfffffff +{ + -0.495758068 -1.472112711 + -0.415997198 -1.458957634 + -0.372320528 -1.512979127 + -0.408329249 -1.580079653 + -0.487986031 -1.593247394 + -0.531738126 -1.539302003 +} +85429027fffffff +{ + 17.209985122 63.046060204 + 17.145842080 63.094344481 + 17.145747378 63.182328103 + 17.209821100 63.222195366 + 17.274084549 63.173964590 + 17.274153814 63.085812790 +} +8500831bfffffff +{ + 77.393983971 79.089859342 + 77.382338414 79.506399144 + 77.456628033 79.752977406 + 77.543109991 79.581168933 + 77.554812416 79.159217278 + 77.479975194 78.914531578 } -85f38437fffffff -{ - -80.037435112 174.196140195 - -80.118038331 174.081846311 - -80.170358524 174.460149501 - -80.141311752 174.951877200 - -80.060368637 175.059012705 - -80.008807754 174.681624496 -} -8517450ffffffff -{ - 62.503590817 173.015737640 - 62.413062564 172.988517517 - 62.359494895 173.147165099 - 62.396143678 173.333294374 - 62.486558395 173.361659926 - 62.540438670 173.202752908 -} -855795b3fffffff -{ - 19.251410211 -43.292923271 - 19.175735902 -43.332861497 - 19.100626945 -43.280242470 - 19.101069389 -43.187690818 - 19.176688959 -43.147611807 - 19.251920929 -43.200225021 -} -85032e93fffffff -{ - 87.765634336 -50.816291623 - 87.837200480 -52.217866879 - 87.823731317 -54.650025035 - 87.739543037 -55.514290568 - 87.671228560 -54.070525973 - 87.683894481 -51.797533660 -} -85ecad03fffffff -{ - -67.365148293 140.627378992 - -67.330672268 140.414591536 - -67.387903012 140.232088651 - -67.479897033 140.262181551 - -67.514512015 140.476210499 - -67.456993237 140.658901071 -} -8588d2a3fffffff -{ - 1.688837560 -152.267378090 - 1.600311403 -152.297707955 - 1.530010600 -152.234502815 - 1.548177568 -152.140969931 - 1.636672809 -152.110586370 - 1.707032052 -152.173789266 -} -852fa4cbfffffff -{ - 37.334453653 156.123476318 - 37.429547645 156.111597073 - 37.468171505 156.003627125 - 37.411666802 155.907751789 - 37.316642304 155.919862092 - 37.278052888 156.027616954 -} -85078d3bfffffff -{ - 73.857304489 -29.330105735 - 73.874615508 -29.629025435 - 73.806384391 -29.819934386 - 73.721199928 -29.712106203 - 73.704083450 -29.415679701 - 73.771958006 -29.224601176 -} -85f20257fffffff -{ - -80.557439517 -143.155353448 - -80.631349249 -142.882581699 - -80.624914177 -142.337685637 - -80.544530090 -142.074734589 - -80.471275790 -142.351721812 - -80.477750173 -142.887544727 -} -85261d8ffffffff -{ - 41.456896558 -97.556385678 - 41.523865322 -97.482163594 - 41.607151773 -97.527955374 - 41.623468595 -97.648152801 - 41.556454194 -97.722393918 - 41.473168673 -97.676418900 -} -850a18a7fffffff -{ - 64.330180960 95.758393324 - 64.291856144 95.950581962 - 64.341711246 96.115872582 - 64.430215855 96.089274579 - 64.468740281 95.896119443 - 64.418559634 95.730531204 -} -856ed5bbfffffff -{ - 12.274964690 -114.289921647 - 12.353527415 -114.240465615 - 12.435364381 -114.287605730 - 12.438552485 -114.384242545 - 12.359925259 -114.433620410 - 12.278174408 -114.386439835 -} -852d9d23fffffff -{ - 33.748551928 40.973862328 - 33.657297727 40.953550304 - 33.594881064 41.035340385 - 33.623648703 41.137382327 - 33.714814357 41.157829459 - 33.777300965 41.076099829 -} -85ccd607fffffff -{ - -35.477229833 78.589648499 - -35.567262680 78.618490450 - -35.590480361 78.730460050 - -35.523665584 78.813419815 - -35.433678968 78.784447669 - -35.410460818 78.672645665 -} -85e416c3fffffff -{ - -56.573424692 107.024487341 - -56.496317556 106.917420709 - -56.508438886 106.742901256 - -56.597736342 106.674662989 - -56.675073245 106.781528874 - -56.662882681 106.956836281 -} -853d53dbfffffff -{ - 32.683979225 86.444997576 - 32.598748709 86.475348579 - 32.581325584 86.580620085 - 32.649029148 86.655754282 - 32.734302813 86.625650786 - 32.751829953 86.520165277 -} -8522e2bbfffffff -{ - 50.824097466 -169.612126322 - 50.907224622 -169.578562490 - 50.972901637 -169.676542568 - 50.955375426 -169.808216975 - 50.872156939 -169.841537148 - 50.806555909 -169.743427360 -} -852e080ffffffff -{ - 39.827891690 140.138301979 - 39.913540138 140.109268791 - 39.934461475 140.005877842 - 39.869782648 139.931781139 - 39.784257000 139.960950427 - 39.763287397 140.064080766 -} -8592e143fffffff -{ - -16.457172613 -104.663045397 - -16.523878818 -104.720459626 - -16.610016755 -104.690635184 - -16.629512197 -104.603305028 - -16.562788662 -104.545812157 - -16.476587017 -104.575728042 -} -85d47217fffffff -{ - -47.099448683 -167.817733553 - -47.022953142 -167.762342857 - -46.949462030 -167.838319135 - -46.952427287 -167.969526909 - -47.028860149 -168.025022994 - -47.102390447 -167.949206509 -} -85e9806bfffffff -{ - -72.184253198 -91.336226914 - -72.191388728 -91.038561541 - -72.114702635 -90.861805567 - -72.031316643 -90.981981231 - -72.024331985 -91.277010400 - -72.100583286 -91.454484832 +8547ac6bfffffff +{ + 28.626460687 -175.007665675 + 28.718816743 -174.987799865 + 28.778186704 -175.067042102 + 28.745089000 -175.166182650 + 28.652640513 -175.185886398 + 28.593382095 -175.106611944 +} +85f06b6ffffffff +{ + -75.619670537 25.126351647 + -75.529799496 25.012440323 + -75.507498680 24.653148263 + -75.574902640 24.403921687 + -75.665128169 24.514480793 + -75.687596810 24.877644771 +} +8564769bfffffff +{ + 7.455005857 92.843621077 + 7.548718276 92.817644436 + 7.573430991 92.722902927 + 7.504430713 92.654189926 + 7.410748386 92.680200914 + 7.386036198 92.774890673 +} +854849b7fffffff +{ + 31.335427506 -120.145681428 + 31.419592373 -120.093750429 + 31.498958289 -120.151265715 + 31.494093039 -120.260725447 + 31.409915075 -120.312518055 + 31.330615426 -120.254989605 +} +85686177fffffff +{ + 12.122367213 124.829898159 + 12.031046145 124.846777899 + 12.002235803 124.935115204 + 12.064797385 125.006628653 + 12.156169862 124.989747915 + 12.184929389 124.901354657 +} +85dc5caffffffff +{ + -49.872669518 -27.141633618 + -49.947732604 -27.210044066 + -50.027190293 -27.139492460 + -50.031539832 -27.000261137 + -49.956381174 -26.931936034 + -49.876968599 -27.002756091 +} +85ecab6bfffffff +{ + -66.326532928 135.040542253 + -66.283866679 134.840417360 + -66.334791179 134.649459836 + -66.428658826 134.658173403 + -66.471510508 134.859273211 + -66.420308224 135.050682595 +} +85dd4963fffffff +{ + -55.657060656 -33.120817381 + -55.590055091 -33.017576549 + -55.508847048 -33.075000800 + -55.494468042 -33.235087293 + -55.561212472 -33.338478560 + -55.642596745 -33.281635093 +} +853c9927fffffff +{ + 18.818108101 87.385182380 + 18.907764817 87.357203917 + 18.927791540 87.260560618 + 18.858195251 87.191963347 + 18.768573589 87.219961637 + 18.748513116 87.316537503 +} +856f4e0bfffffff +{ + 3.254604532 -123.253690650 + 3.323706714 -123.214904254 + 3.396292497 -123.261539658 + 3.399676028 -123.346956355 + 3.330523208 -123.385646242 + 3.258037423 -123.339016067 +} +85098177fffffff +{ + 60.441486496 6.079973587 + 60.408514872 5.958223820 + 60.331698752 5.971587447 + 60.287906454 6.106198299 + 60.320841983 6.227553388 + 60.397605687 6.214691808 +} +854a638ffffffff +{ + 27.444305139 138.115411288 + 27.362641264 138.131764352 + 27.333256895 138.226374079 + 27.385551909 138.304648166 + 27.467207443 138.288318655 + 27.496576380 138.193691429 +} +850a968ffffffff +{ + 54.704893399 99.719481227 + 54.613752205 99.735142870 + 54.574136983 99.871635809 + 54.625507428 99.992717640 + 54.716595609 99.977622466 + 54.756366663 99.840879089 +} +856ac627fffffff +{ + 0.629359647 29.238729049 + 0.721068023 29.243539261 + 0.771008617 29.164145163 + 0.729296675 29.079914935 + 0.637594025 29.075043041 + 0.587597502 29.154463035 +} +857a334bfffffff +{ + 0.196709109 47.902237542 + 0.283798724 47.899992258 + 0.331367821 47.825182223 + 0.291863605 47.752528180 + 0.204703624 47.754721507 + 0.157118190 47.829620886 +} +8571221bfffffff +{ + 14.463382030 -173.201412448 + 14.375243103 -173.221683462 + 14.312920277 -173.158573136 + 14.338714379 -173.075101072 + 14.426922405 -173.054736254 + 14.489267246 -173.117937301 +} +8538152ffffffff +{ + 32.364375149 -1.623384428 + 32.303632616 -1.701163100 + 32.214368078 -1.683051287 + 32.185892607 -1.587379242 + 32.246557352 -1.509722662 + 32.335775242 -1.527616027 +} +853fac57fffffff +{ + 31.157622293 15.219092854 + 31.061129301 15.222171450 + 31.015593418 15.320661581 + 31.066509738 15.416205663 + 31.163039716 15.413306646 + 31.208616510 15.314683875 +} +85545313fffffff +{ + 11.384581346 -10.946645802 + 11.322216736 -11.007012513 + 11.247836558 -10.983189209 + 11.235790135 -10.899134575 + 11.298043058 -10.838803894 + 11.372453963 -10.862491715 +} +850b7533fffffff +{ + 67.782450227 69.093038542 + 67.709205305 69.208221332 + 67.708172497 69.446815640 + 67.780379444 69.571468783 + 67.853810329 69.456931279 + 67.854848331 69.217090015 +} +85af31dbfffffff +{ + -19.910241426 85.928576661 + -20.000687270 85.958088648 + -20.022893226 86.053909073 + -19.954676844 86.120076780 + -19.864321360 86.090495721 + -19.842091890 85.994815815 +} +85a90cd3fffffff +{ + -30.359872297 -51.753337419 + -30.296998947 -51.701138214 + -30.225189784 -51.747727540 + -30.216289529 -51.846460870 + -30.279176313 -51.898625365 + -30.350949920 -51.852091374 +} +853b60bbfffffff +{ + 37.759974183 -41.642548604 + 37.674711446 -41.694592803 + 37.596145059 -41.630076199 + 37.602736161 -41.513539668 + 37.687964757 -41.461285890 + 37.766636471 -41.525777784 +} +852f6813fffffff +{ + 29.847627176 139.581412453 + 29.768817868 139.597618251 + 29.739465110 139.692470023 + 29.788934067 139.771128223 + 29.874123619 139.745452508 + 29.900273263 139.655301860 + 29.880600625 139.633859694 +} +85f3a27bfffffff +{ + -79.351252342 169.223821848 + -79.428902251 169.078240996 + -79.485797332 169.401163606 + -79.464331397 169.870104481 + -79.386261520 170.010059349 + -79.330074572 169.686748354 +} +856c1553fffffff +{ + 7.646920763 -97.791363876 + 7.719097172 -97.735482898 + 7.798648498 -97.770190254 + 7.805984458 -97.860882198 + 7.733711648 -97.916772859 + 7.654199359 -97.881962033 +} +855f528bfffffff +{ + 8.378040015 -58.393221249 + 8.456036317 -58.345819586 + 8.531926517 -58.386728452 + 8.529819484 -58.474970881 + 8.451888877 -58.522318670 + 8.375999653 -58.481477981 +} +8579b333fffffff +{ + 3.251309734 -143.668633947 + 3.162796365 -143.701773385 + 3.091840133 -143.641611219 + 3.109348675 -143.548354029 + 3.197801223 -143.515188902 + 3.268806066 -143.575306517 +} +85b73497fffffff +{ + -40.220875465 -94.021512305 + -40.147871693 -93.945271080 + -40.059210353 -93.990544983 + -40.043419469 -94.111851451 + -40.116291875 -94.188222822 + -40.205086499 -94.143158308 +} +85d2dd93fffffff +{ + -36.609588116 -104.624008629 + -36.544460729 -104.537970867 + -36.452420927 -104.566684368 + -36.425428383 -104.681167654 + -36.490406630 -104.767206843 + -36.582526395 -104.738761786 +} +85ec42d3fffffff +{ + -75.849745467 140.494152680 + -75.819791318 140.164449031 + -75.878205552 139.880005224 + -75.966987408 139.924767229 + -75.997182485 140.257448913 + -75.938352832 140.542375891 +} +850f1cb3fffffff +{ + 66.731518240 -71.208215752 + 66.684923829 -71.421437488 + 66.588684046 -71.424124551 + 66.539060324 -71.215154663 + 66.585409299 -71.002793053 + 66.681626362 -70.998541807 +} +85aba5a3fffffff +{ + -21.485209484 62.456320801 + -21.580342594 62.469925738 + -21.616151849 62.564659264 + -21.556749640 62.645722164 + -21.461595972 62.631976615 + -21.425864969 62.537308734 +} +85c00337fffffff +{ + -35.976650141 -9.988173573 + -36.068445231 -10.028499745 + -36.142544834 -9.950263212 + -36.124752155 -9.831665240 + -36.032898230 -9.791536106 + -35.958895724 -9.869807463 +} +85e61223fffffff +{ + -61.249067056 24.370427862 + -61.167774437 24.317165037 + -61.142429631 24.142316852 + -61.198287426 24.019826820 + -61.279775463 24.072285276 + -61.305210660 24.248041068 +} +85d16273fffffff +{ + -37.647843041 16.866200163 + -37.737782030 16.859972021 + -37.787463047 16.947948823 + -37.747166249 17.041965217 + -37.657310747 17.047959170 + -37.607668473 16.960170752 +} +85ecca27fffffff +{ + -71.503765392 116.455106173 + -71.439694879 116.242226136 + -71.466505434 115.955422603 + -71.557593409 115.879547816 + -71.622018971 116.092618440 + -71.595000261 116.381381676 +} +855b0c23fffffff +{ + 8.074505079 173.455580112 + 8.152145682 173.462008581 + 8.193909516 173.389451158 + 8.157929071 173.310503716 + 8.080264798 173.304204987 + 8.038604508 173.376723900 +} +85154c73fffffff +{ + 63.836933302 129.297811232 + 63.759356986 129.419732833 + 63.765099806 129.633887483 + 63.848486980 129.727457036 + 63.926379288 129.606005113 + 63.920568138 129.390508322 +} +856b4b97fffffff +{ + 12.201813242 33.877767758 + 12.113569734 33.865955527 + 12.063486607 33.939857354 + 12.101542487 34.025567615 + 12.189726210 34.037492711 + 12.239913923 33.963594806 +} +85ecf1d3fffffff +{ + -69.312487690 133.404675404 + -69.268962651 133.179857647 + -69.318663158 132.958561996 + -69.412187426 132.961396387 + -69.455938070 133.187389374 + -69.405937661 133.409370684 +} +85c7410ffffffff +{ + -37.252471878 -145.572310180 + -37.160893387 -145.543504853 + -37.097151698 -145.627526049 + -37.124930761 -145.740422131 + -37.216520626 -145.769436161 + -37.280320163 -145.685345598 +} +85f21d33fffffff +{ + -79.771480162 -130.218478854 + -79.833600559 -129.871844866 + -79.807120545 -129.382696782 + -79.718803343 -129.247149542 + -79.657396824 -129.594041117 + -79.683597045 -130.076281895 +} +851a0927fffffff +{ + 47.530313961 -39.472879683 + 47.447747157 -39.535936790 + 47.372627789 -39.463654878 + 47.379981863 -39.328374916 + 47.462507861 -39.265059565 + 47.537720659 -39.337281709 +} +85dbadbbfffffff +{ + -53.042241391 177.489276367 + -52.970648823 177.425289591 + -52.974798616 177.286481224 + -53.050598782 177.211277685 + -53.122285677 177.275182567 + -53.118078033 177.414373742 +} +85f25867fffffff +{ + -74.377579905 -107.364202795 + -74.408847671 -107.056623420 + -74.350026676 -106.791827126 + -74.260392604 -106.835582452 + -74.229512830 -107.140803172 + -74.287881456 -107.404619216 +} +85e55acbfffffff +{ + -64.959977624 99.942311322 + -64.877109835 99.823375876 + -64.878815911 99.594690871 + -64.963393431 99.483562689 + -65.046508008 99.601835112 + -65.044798244 99.831904755 +} +85f02a73fffffff +{ + -79.820536061 64.304764290 + -79.768870476 63.878591447 + -79.806165722 63.434939370 + -79.895754809 63.412937700 + -79.948046389 63.842516860 + -79.910117379 64.290701472 +} +85412197fffffff +{ + 17.430762775 114.857584841 + 17.520732734 114.839404087 + 17.553030555 114.752758958 + 17.495295030 114.684283558 + 17.405254309 114.702540769 + 17.373019861 114.789196940 +} +855953cbfffffff +{ + 18.010767812 7.656023912 + 17.919507660 7.664744310 + 17.877491647 7.751041917 + 17.926702305 7.828751045 + 18.018034552 7.820154537 + 18.060084116 7.733724875 +} +85b78aaffffffff +{ + -30.284701763 -88.178709165 + -30.351135215 -88.242559003 + -30.430787196 -88.202033266 + -30.444022294 -88.097599473 + -30.377594262 -88.033741418 + -30.297925742 -88.074325201 +} +85f05ccffffffff +{ + -75.629393833 41.150910998 + -75.551738587 40.947456758 + -75.553932304 40.588649465 + -75.633915558 40.429299212 + -75.712080844 40.631301977 + -75.709751985 40.994135802 +} +85abac13fffffff +{ + -22.435295331 64.041892040 + -22.530804307 64.056896234 + -22.566067460 64.153456418 + -22.505749678 64.234937305 + -22.410227779 64.219791383 + -22.375036483 64.123306237 +} +85a6de37fffffff +{ + -17.870013605 107.645762942 + -17.798990500 107.626469854 + -17.784311861 107.543327708 + -17.840709275 107.479487199 + -17.911727967 107.498836544 + -17.926353735 107.581970185 +} +85e85537fffffff +{ + -58.096129623 -87.336322654 + -58.017438643 -87.242975627 + -57.937469709 -87.319202558 + -57.936036093 -87.488497595 + -58.014614542 -87.582246828 + -58.094739184 -87.506300894 +} +85abaed7fffffff +{ + -23.416864987 63.282752397 + -23.512422322 63.297249690 + -23.548322574 63.394045146 + -23.488592343 63.476271091 + -23.393017409 63.461629272 + -23.357190203 63.364905978 +} +859d4d3bfffffff +{ + -22.585208353 138.469370677 + -22.495616026 138.461295182 + -22.461278695 138.373021029 + -22.516415365 138.292755382 + -22.605973906 138.300652747 + -22.640429697 138.388993864 +} +85116523fffffff +{ + 68.900161142 33.648878958 + 68.863352201 33.825855368 + 68.908193309 34.017230293 + 68.990018450 34.032058428 + 69.026947745 33.854259279 + 68.981930920 33.662456007 +} +85f14557fffffff +{ + -85.602435738 25.915569768 + -85.513124383 25.534319808 + -85.494411619 24.381817573 + -85.564390497 23.570656708 + -85.654706967 23.916552165 + -85.674056792 25.109854486 +} +85ec6943fffffff +{ + -80.267269776 143.961432467 + -80.245005979 143.487693872 + -80.306703840 143.104581571 + -80.391244064 143.195059884 + -80.413814083 143.675302528 + -80.351534243 144.058510375 +} +85b8d67bfffffff +{ + -21.367384130 129.647258920 + -21.282377442 129.648323124 + -21.246085597 129.571953975 + -21.294672162 129.494508796 + -21.379607115 129.493293573 + -21.416027321 129.569674421 +} +850e6a07fffffff +{ + 52.244171712 -66.520495235 + 52.202674587 -66.661712631 + 52.108048446 -66.674713089 + 52.054980294 -66.547124521 + 52.096324325 -66.406343804 + 52.190889152 -66.392715589 +} +85034953fffffff +{ + 77.507446780 -61.160493826 + 77.479431981 -61.558050228 + 77.391961159 -61.626096479 + 77.332695692 -61.301001723 + 77.360404703 -60.907288223 + 77.447682399 -60.834848499 +} +85031c0ffffffff +{ + 84.969721117 -119.358814281 + 84.944462403 -120.355847771 + 84.854017504 -120.623015321 + 84.789624304 -119.920870186 + 84.814285701 -118.952119683 + 84.903923249 -118.657724647 +} +851ed1cbfffffff +{ + 40.359808452 21.348661357 + 40.266692871 21.345749279 + 40.218627155 21.452306390 + 40.263626676 21.561886467 + 40.356745417 21.565021514 + 40.404861632 21.458353533 +} +85b16967fffffff +{ + -24.861353721 -128.510047227 + -24.774814062 -128.501934217 + -24.720890987 -128.573602517 + -24.753467885 -128.653515007 + -24.840087283 -128.661776677 + -24.894050086 -128.589977106 +} +85d9514bfffffff +{ + -54.384288325 131.880860515 + -54.334497221 131.746675250 + -54.376719675 131.611084737 + -54.468950332 131.609398937 + -54.518902938 131.743983455 + -54.476462920 131.879854221 +} +85198c83fffffff +{ + 56.734799540 -18.287313301 + 56.673197795 -18.391398726 + 56.593798813 -18.335279226 + 56.575953069 -18.175467494 + 56.637455682 -18.071371483 + 56.716903003 -18.127096779 +} +85032c77fffffff +{ + 86.931330515 -46.883168127 + 87.005879988 -47.792988623 + 87.000053671 -49.560603861 + 86.919895934 -50.328689528 + 86.847592838 -49.383469953 + 86.853210175 -47.702615143 +} +85566087fffffff +{ + 13.852992480 -26.603912897 + 13.783318374 -26.657934655 + 13.705755060 -26.618399344 + 13.697777725 -26.524937584 + 13.767345463 -26.470862761 + 13.844996868 -26.510302525 +} +8586654ffffffff +{ + -12.405421168 77.890618817 + -12.495808522 77.914123673 + -12.523088612 78.007100414 + -12.459956570 78.076458388 + -12.369631461 78.052861467 + -12.342376087 77.959998475 } diff --git a/tests/inputfiles/res01cells.txt b/tests/inputfiles/res01cells.txt index 66fa35264..0818f5e35 100644 --- a/tests/inputfiles/res01cells.txt +++ b/tests/inputfiles/res01cells.txt @@ -67,11 +67,11 @@ { 82.481541309 -125.294458935 78.003359755 -129.046886486 - 76.198757481 -119.328241168 + 76.198757542 -119.328241405 75.133106838 -115.601683024 75.422962423 -98.251891824 78.735601285 -84.348954249 - 81.480857220 -88.037104409 + 81.480857141 -88.037104267 82.853490041 -90.381097475 } 81027ffffffffff @@ -91,7 +91,7 @@ 69.371341411 -131.708839088 70.853401704 -120.279550372 75.133106838 -115.601683024 - 76.198757571 -119.328241528 + 76.198757542 -119.328241405 } 8102fffffffffff { @@ -115,7 +115,7 @@ { 84.935556354 -51.704877515 82.853490041 -90.381097475 - 81.480857101 -88.037104196 + 81.480857141 -88.037104267 78.735601285 -84.348954249 76.667576592 -65.326490151 77.635896754 -45.910670066 @@ -261,15 +261,15 @@ 81083ffffffffff { 63.327061328 4.012620898 - 61.890838431 8.644221328 + 61.890838475 8.644221198 61.540514600 11.080660058 - 62.889968395 15.771773986 + 62.889968358 15.771773841 63.800792653 17.535446308 - 66.327261808 16.433696961 + 66.327261733 16.433696997 67.351768675 14.813658726 - 67.468427884 8.130260834 + 67.468427885 8.130261032 67.015632628 5.239258880 - 64.525608348 3.699933219 + 64.525608422 3.699933260 } 8108bffffffffff { @@ -279,7 +279,7 @@ 58.401544870 25.082722327 62.478113452 24.517172438 63.800792653 17.535446308 - 62.889968339 15.771773769 + 62.889968358 15.771773841 } 8108fffffffffff { @@ -289,7 +289,7 @@ 68.929957882 31.831280499 70.052151520 20.597244294 67.351768675 14.813658726 - 66.327261696 16.433697015 + 66.327261733 16.433696997 } 81093ffffffffff { @@ -299,7 +299,7 @@ 63.095054078 -10.444977545 61.545509578 -2.297526088 63.327061328 4.012620898 - 64.525608459 3.699933281 + 64.525608422 3.699933260 } 81097ffffffffff { @@ -309,7 +309,7 @@ 73.310223685 0.325610352 69.273859192 -1.666585504 67.015632628 5.239258880 - 67.468427885 8.130261131 + 67.468427885 8.130261032 } 8109bffffffffff { @@ -319,17 +319,17 @@ 55.706768465 5.523646549 58.130531166 11.555977693 61.540514600 11.080660058 - 61.890838498 8.644221133 + 61.890838475 8.644221198 } 810a3ffffffffff { 61.436707955 82.827079570 60.139795359 91.709638140 - 61.905821813 96.240077311 + 61.905821766 96.240077164 62.669687607 98.786556026 67.054720133 97.856330315 68.690870429 86.645208197 - 66.606967510 81.658053771 + 66.606967573 81.658053904 65.556929070 79.339923965 } 810a7ffffffffff @@ -349,7 +349,7 @@ 56.210610738 106.403495638 60.356642584 106.865913194 62.669687607 98.786556026 - 61.905821742 96.240077094 + 61.905821766 96.240077164 } 810afffffffffff { @@ -373,7 +373,7 @@ { 65.939814467 68.434911474 65.556929070 79.339923965 - 66.606967605 81.658053971 + 66.606967573 81.658053904 68.690870429 86.645208197 72.974780121 82.219118924 73.267466401 67.048171960 @@ -714,11 +714,11 @@ 81163ffffffffff { 56.960700152 156.278507225 - 54.176658819 157.027696881 + 54.176658901 157.027696861 52.773824942 157.249567565 50.964143998 163.753396880 53.143635585 170.198815690 - 55.956862933 170.415808181 + 55.956862850 170.415808167 57.359097832 170.667380994 59.536413098 163.347047297 } @@ -728,7 +728,7 @@ 56.196522246 -175.748218768 59.032171995 178.579985330 57.359097832 170.667380994 - 55.956862809 170.415808164 + 55.956862850 170.415808167 53.143635585 170.198815690 50.639697127 176.302440283 } @@ -774,7 +774,7 @@ 51.128254500 145.328516069 49.980754537 151.613315915 52.773824942 157.249567565 - 54.176658942 157.027696851 + 54.176658901 157.027696861 56.960700152 156.278507225 58.234438966 148.177645469 } @@ -847,11 +847,11 @@ { 53.530974747 -48.902450049 49.261645502 -51.288437300 - 47.166397258 -48.463955280 + 47.166397324 -48.463955356 46.049312122 -47.213796703 46.651435603 -40.893517512 50.662382031 -37.732889191 - 53.008820526 -40.253812879 + 53.008820458 -40.253812801 54.201077797 -41.519558223 } 811a7ffffffffff @@ -871,7 +871,7 @@ 40.975558199 -54.879012779 41.862322112 -49.467374174 46.049312122 -47.213796703 - 47.166397355 -48.463955395 + 47.166397324 -48.463955356 } 811afffffffffff { @@ -895,7 +895,7 @@ { 58.170123409 -37.741944188 54.201077797 -41.519558223 - 53.008820424 -40.253812762 + 53.008820458 -40.253812801 50.662382031 -37.732889191 50.750858294 -30.592961895 54.351179053 -26.420768297 @@ -913,21 +913,21 @@ 811c3ffffffffff { 53.217495589 -144.424565132 - 51.504375402 -147.559746605 + 51.504375454 -147.559746516 50.423740032 -148.411356166 - 48.095354734 -146.748475648 + 48.095354803 -146.748475695 47.229253562 -145.501487734 - 47.406672463 -141.721101978 + 47.406672460 -141.721102090 47.862031640 -140.063200403 - 50.316149319 -138.904257427 + 50.316149247 -138.904257463 51.521279104 -138.991955968 - 52.968607410 -142.458781165 + 52.968607369 -142.458781059 } 811cbffffffffff { 44.093624239 -147.450093917 47.229253562 -145.501487734 - 48.095354838 -146.748475719 + 48.095354803 -146.748475695 50.423740032 -148.411356166 50.533101882 -153.781372134 46.908874696 -156.036313444 @@ -941,13 +941,13 @@ 41.457139817 -138.450291224 45.340991291 -136.701821678 47.862031640 -140.063200403 - 47.406672458 -141.721102146 + 47.406672460 -141.721102090 } 811d3ffffffffff { 56.566979237 -145.612515721 53.217495589 -144.424565132 - 52.968607349 -142.458781006 + 52.968607369 -142.458781059 51.521279104 -138.991955968 52.846691033 -133.851141565 56.759266243 -133.521092920 @@ -959,7 +959,7 @@ 50.154511598 -128.909853810 52.846691033 -133.851141565 51.521279104 -138.991955968 - 50.316149210 -138.904257481 + 50.316149247 -138.904257463 47.862031640 -140.063200403 45.340991291 -136.701821678 } @@ -969,7 +969,7 @@ 54.013771481 -157.282770919 50.533101882 -153.781372134 50.423740032 -148.411356166 - 51.504375480 -147.559746471 + 51.504375454 -147.559746516 53.217495589 -144.424565132 56.566979237 -145.612515721 } @@ -1234,11 +1234,11 @@ 81263ffffffffff { 47.471519107 -99.917048794 - 45.197627739 -102.323755994 + 45.197627806 -102.323755927 44.083379837 -103.535954411 40.088596508 -101.040330017 39.326802934 -95.246862157 - 41.451206651 -92.819409761 + 41.451206592 -92.819409839 42.444959539 -91.476261792 46.630019542 -93.395849042 } @@ -1248,7 +1248,7 @@ 37.099588897 -84.585167032 41.161268519 -85.703199259 42.444959539 -91.476261792 - 41.451206561 -92.819409876 + 41.451206592 -92.819409839 39.326802934 -95.246862157 35.090108394 -93.265211760 } @@ -1294,7 +1294,7 @@ 48.011188120 -112.788003928 44.413070881 -109.788387253 44.083379837 -103.535954411 - 45.197627840 -102.323755893 + 45.197627806 -102.323755927 47.471519107 -99.917048794 51.556775808 -102.902297701 } @@ -1432,11 +1432,11 @@ { 38.400687413 38.930217597 35.326155690 43.074400819 - 36.114444823 46.404510438 + 36.114444805 46.404510337 36.404918748 48.114435741 40.636123368 49.670644400 43.945518645 45.504838818 - 43.124283165 41.788830441 + 43.124283191 41.788830549 42.736298455 39.938746034 } 812c7ffffffffff @@ -1456,7 +1456,7 @@ 29.089392138 50.187903613 33.030250480 51.718680011 36.404918748 48.114435741 - 36.114444794 46.404510288 + 36.114444805 46.404510337 } 812cfffffffffff { @@ -1480,7 +1480,7 @@ { 45.672384772 35.197789215 42.736298455 39.938746034 - 43.124283204 41.788830602 + 43.124283191 41.788830549 43.945518645 45.504838818 48.339941657 47.038222832 51.409437276 42.136829070 @@ -1563,21 +1563,21 @@ 81303ffffffffff { 41.148270828 119.136909529 - 38.614966702 118.582885074 + 38.614966777 118.582885090 37.429854484 118.869298834 - 36.205282608 121.690154006 + 36.205282645 121.690153924 36.005614448 123.162764577 - 37.691245511 125.585234408 + 37.691245462 125.585234335 38.738746175 126.346942615 - 41.118552159 125.085828575 + 41.118552089 125.085828614 41.999374253 123.984120567 - 41.717194435 120.555880643 + 41.717194445 120.555880743 } 8130bffffffffff { 32.661445195 124.020556127 36.005614448 123.162764577 - 36.205282664 121.690153883 + 36.205282645 121.690153924 37.429854484 118.869298834 35.522423796 115.340960732 31.680907968 116.261300439 @@ -1591,13 +1591,13 @@ 34.331158601 132.308377458 38.194563738 130.657532707 38.738746175 126.346942615 - 37.691245438 125.585234298 + 37.691245462 125.585234335 } 81313ffffffffff { 43.254141680 115.501139011 41.148270828 119.136909529 - 41.717194450 120.555880794 + 41.717194445 120.555880743 41.999374253 123.984120567 45.096434369 125.981141767 47.997962809 122.152595068 @@ -1609,7 +1609,7 @@ 45.253613491 131.774400981 45.096434369 125.981141767 41.999374253 123.984120567 - 41.118552054 125.085828633 + 41.118552089 125.085828614 38.738746175 126.346942615 38.194563738 130.657532707 } @@ -1619,7 +1619,7 @@ 37.163896486 110.694610549 35.522423796 115.340960732 37.429854484 118.869298834 - 38.614966814 118.582885097 + 38.614966777 118.582885090 41.148270828 119.136909529 43.254141680 115.501139011 } @@ -1818,11 +1818,11 @@ { 35.124424052 -5.442348461 30.698974128 -4.341769247 - 29.828776129 -1.240801927 + 29.828776160 -1.240802017 29.300374659 0.260946826 32.110106931 4.204173996 36.597898145 3.543589357 - 37.588846271 0.238715857 + 37.588846243 0.238715955 38.115996723 -1.416234263 } 81387ffffffffff @@ -1842,7 +1842,7 @@ 22.197541386 -2.483865012 24.858335834 0.994677193 29.300374659 0.260946826 - 29.828776173 -1.240802061 + 29.828776160 -1.240802017 } 8138fffffffffff { @@ -1866,7 +1866,7 @@ { 42.540479966 -2.417795831 38.115996723 -1.416234263 - 37.588846230 0.238716004 + 37.588846243 0.238715955 36.597898145 3.543589357 39.402136369 8.045142114 43.786609354 7.509948482 @@ -1949,11 +1949,11 @@ 813c3ffffffffff { 29.173754149 81.028378152 - 26.544148588 82.168245291 + 26.544148665 82.168245258 25.201987106 82.644973727 24.410902228 87.416540768 27.664082662 90.911168473 - 30.360710993 89.983249547 + 30.360710912 89.983249570 31.726685304 89.579772388 32.589943337 84.479601176 } @@ -1963,7 +1963,7 @@ 33.621069781 98.228504256 34.856933635 93.431668466 31.726685304 89.579772388 - 30.360710872 89.983249584 + 30.360710912 89.983249570 27.664082662 90.911168473 26.622305043 95.855137494 } @@ -2009,7 +2009,7 @@ 22.410566168 75.010885846 21.802902869 79.445503143 25.201987106 82.644973727 - 26.544148703 82.168245242 + 26.544148665 82.168245258 29.173754149 81.028378152 29.662738501 75.868402207 } @@ -2275,11 +2275,11 @@ { 28.208961818 -172.646263295 23.782822701 -173.670387476 - 21.946696035 -171.353025480 + 21.946696093 -171.353025545 20.964113606 -170.267905107 22.310289219 -165.758017218 26.673265236 -164.456478279 - 28.616915510 -166.757037271 + 28.616915454 -166.757037202 29.625507898 -167.883372034 } 81467ffffffffff @@ -2295,7 +2295,7 @@ { 16.594714505 -171.359032500 20.964113606 -170.267905107 - 21.946696120 -171.353025578 + 21.946696093 -171.353025545 23.782822701 -173.670387476 22.092681232 -178.223769506 17.743332187 -178.950636641 @@ -2323,7 +2323,7 @@ { 33.965354508 -166.528928251 29.625507898 -167.883372034 - 28.616915426 -166.757037168 + 28.616915454 -166.757037202 26.673265236 -164.456478279 27.919872273 -159.565972031 32.121566513 -158.046494750 @@ -2469,21 +2469,21 @@ 814c3ffffffffff { 26.872316674 -66.795747118 - 25.805978615 -69.403495260 + 25.805978647 -69.403495183 24.945215619 -70.339043700 - 22.397527348 -69.980890862 + 22.397527424 -69.980890872 21.326183526 -69.383268502 - 20.812430650 -66.686098470 + 20.812430666 -66.686098549 20.979703908 -65.407238649 - 23.185423704 -63.986418904 + 23.185423639 -63.986418947 24.369915046 -63.736330238 - 26.305690298 -65.604724803 + 26.305690241 -65.604724747 } 814cbffffffffff { 18.713930766 -71.730135808 21.326183526 -69.383268502 - 22.397527461 -69.980890877 + 22.397527424 -69.980890872 24.945215619 -70.339043700 26.190448731 -73.868278728 23.342862881 -76.831217352 @@ -2497,13 +2497,13 @@ 14.482400618 -65.768821908 18.007410818 -63.616000348 20.979703908 -65.407238649 - 20.812430674 -66.686098589 + 20.812430666 -66.686098549 } 814d3ffffffffff { 30.273889962 -66.410900360 26.872316674 -66.795747118 - 26.305690213 -65.604724719 + 26.305690241 -65.604724747 24.369915046 -63.736330238 24.987464801 -60.036175320 28.788083859 -58.972372274 @@ -2515,7 +2515,7 @@ 21.814638995 -57.230111964 24.987464801 -60.036175320 24.369915046 -63.736330238 - 23.185423606 -63.986418968 + 23.185423639 -63.986418947 20.979703908 -65.407238649 18.007410818 -63.616000348 } @@ -2525,7 +2525,7 @@ 30.219492200 -74.640468167 26.190448731 -73.868278728 24.945215619 -70.339043700 - 25.805978663 -69.403495145 + 25.805978647 -69.403495183 26.872316674 -66.795747118 30.273889962 -66.410900360 } @@ -2534,11 +2534,11 @@ 18.378344876 156.334501776 22.758164293 155.855810587 24.673785080 151.382753541 - 22.954291385 148.944925073 + 22.954291436 148.944925143 22.136425461 147.702587702 17.783599461 148.405685762 15.944244424 152.721238216 - 17.612650265 155.090818126 + 17.612650220 155.090818052 } 814e7ffffffffff { @@ -2566,7 +2566,7 @@ 27.949605977 142.433221757 23.853446687 143.195565466 22.136425461 147.702587702 - 22.954291461 148.944925178 + 22.954291436 148.944925143 } 814f3ffffffffff { @@ -2576,7 +2576,7 @@ 12.194726726 160.773389703 16.340968800 160.526708790 18.378344876 156.334501776 - 17.612650196 155.090818017 + 17.612650220 155.090818052 } 814f7ffffffffff { @@ -2601,11 +2601,11 @@ 16.425664247 -127.756507612 20.415980207 -125.795144608 24.194920827 -128.477911532 - 23.913612769 -131.546390197 + 23.913612778 -131.546390108 23.820431162 -133.083815983 19.753210515 -134.899655793 16.072271836 -132.140804719 - 16.364888715 -129.223900924 + 16.364888711 -129.223901011 } 81507ffffffffff { @@ -2633,7 +2633,7 @@ 31.285608666 -134.106488972 27.469138610 -135.986891478 23.820431162 -133.083815983 - 23.913612783 -131.546390063 + 23.913612778 -131.546390108 } 81513ffffffffff { @@ -2643,7 +2643,7 @@ 8.931891500 -127.114065802 12.654413063 -125.238989385 16.425664247 -127.756507612 - 16.364888707 -129.223901053 + 16.364888711 -129.223901011 } 81517ffffffffff { @@ -2796,11 +2796,11 @@ 81563ffffffffff { 18.872500363 -37.026146688 - 16.439723399 -38.514741407 + 16.439723470 -38.514741364 15.255195072 -39.307972159 11.445409112 -37.039592147 11.247519432 -32.433078279 - 13.640092420 -30.912074537 + 13.640092352 -30.912074586 14.794642048 -30.078829806 18.672652617 -32.255901917 } @@ -2810,7 +2810,7 @@ 10.672390551 -23.629131103 14.423931207 -25.454790830 14.794642048 -30.078829806 - 13.640092317 -30.912074608 + 13.640092352 -30.912074586 11.247519432 -32.433078279 7.309910883 -30.182215331 } @@ -2856,7 +2856,7 @@ 18.914756858 -46.182474577 15.344440572 -43.961894526 15.255195072 -39.307972159 - 16.439723506 -38.514741342 + 16.439723470 -38.514741364 18.872500363 -37.026146688 22.737529603 -39.535390415 } @@ -3186,21 +3186,21 @@ 81623ffffffffff { 12.754829243 55.940074840 - 10.296971227 55.178175793 + 10.296971300 55.178175815 9.092686032 55.250562289 - 7.616228142 57.375161320 + 7.616228186 57.375161257 7.302087249 58.549882763 - 8.825639136 60.638711995 + 8.825639091 60.638711933 9.830369256 61.315435772 - 12.271971830 60.502253234 + 12.271971758 60.502253258 13.216340916 59.732575089 - 13.191260467 57.094225073 + 13.191260468 57.094225151 } 8162bffffffffff { 3.909046069 58.966832067 7.302087249 58.549882763 - 7.616228208 57.375161226 + 7.616228186 57.375161257 9.092686032 55.250562289 7.605969354 52.139413972 3.692753254 52.316592445 @@ -3214,13 +3214,13 @@ 5.242929410 65.970952155 9.132230942 64.708078686 9.830369256 61.315435772 - 8.825639069 60.638711902 + 8.825639091 60.638711933 } 81633ffffffffff { 15.222611966 53.502191119 12.754829243 55.940074840 - 13.191260468 57.094225190 + 13.191260468 57.094225151 13.216340916 59.732575089 16.192032948 61.472073941 19.310273661 58.982288385 @@ -3232,7 +3232,7 @@ 16.170389214 65.726699765 16.192032948 61.472073941 13.216340916 59.732575089 - 12.271971722 60.502253270 + 12.271971758 60.502253258 9.830369256 61.315435772 9.132230942 64.708078686 } @@ -3242,7 +3242,7 @@ 9.876090878 48.701817244 7.605969354 52.139413972 9.092686032 55.250562289 - 10.296971336 55.178175827 + 10.296971300 55.178175815 12.754829243 55.940074840 15.222611966 53.502191119 } @@ -3378,11 +3378,11 @@ { 9.105386362 113.093271264 4.672130987 113.985132145 - 3.822101898 116.677232939 + 3.822101927 116.677232861 3.326712873 117.998885339 6.289184675 121.267646339 10.736966168 120.449366342 - 11.610616618 117.720511451 + 11.610616593 117.720511532 12.105101652 116.372319392 } 81687ffffffffff @@ -3398,7 +3398,7 @@ { -1.090818370 118.801446766 3.326712873 117.998885339 - 3.822101939 116.677232821 + 3.822101927 116.677232861 4.672130987 113.985132145 1.535865776 110.723994256 -2.768742699 111.648325343 @@ -3426,7 +3426,7 @@ { 16.517911783 115.517768385 12.105101652 116.372319392 - 11.610616580 117.720511572 + 11.610616593 117.720511532 10.736966168 120.449366342 13.797500809 123.854824158 18.127070267 123.023555152 @@ -3444,11 +3444,11 @@ 816a3ffffffffff { 9.745677003 22.348181380 - 6.931187357 22.253829786 + 6.931187439 22.253829789 5.527020080 22.136132249 3.202074339 25.886010570 5.181922625 29.961298274 - 7.994339474 30.105008714 + 7.994339392 30.105008706 9.396155421 30.249100031 11.757964613 26.468996962 } @@ -3458,7 +3458,7 @@ 8.893462571 37.848935371 11.276322462 34.393732964 9.396155421 30.249100031 - 7.994339350 30.105008703 + 7.994339392 30.105008706 5.181922625 29.961298274 2.802659948 33.814945034 } @@ -3504,7 +3504,7 @@ 5.762860491 14.583250071 3.534622800 18.099816441 5.527020080 22.136132249 - 6.931187480 22.253829790 + 6.931187439 22.253829789 9.745677003 22.348181380 12.023443161 18.371312883 } @@ -3512,11 +3512,11 @@ { 11.421136456 -97.212261008 7.817460743 -99.981313215 - 5.250784371 -98.815087005 + 5.250784449 -98.815087036 3.938298965 -98.300824997 3.493802977 -93.911402021 7.059508614 -91.120071061 - 9.646037504 -92.245634616 + 9.646037429 -92.245634583 10.965445078 -92.748263678 } 816c7ffffffffff @@ -3532,7 +3532,7 @@ { 0.385414947 -101.048243208 3.938298965 -98.300824997 - 5.250784486 -98.815087053 + 5.250784449 -98.815087036 7.817460743 -99.981313215 8.135308830 -104.534974911 4.548448008 -107.104163874 @@ -3560,7 +3560,7 @@ { 14.465456015 -89.864906548 10.965445078 -92.748263678 - 9.646037391 -92.245634566 + 9.646037429 -92.245634583 7.059508614 -91.120071061 6.605186625 -86.589993551 10.069625269 -83.843685048 @@ -3771,21 +3771,21 @@ 81743ffffffffff { 5.362739777 -6.064496109 - 3.559837778 -7.899841526 + 3.559837831 -7.899841472 2.467580053 -8.412776380 - 0.169971577 -7.263796094 + 0.169971645 -7.263796128 -0.656325459 -6.384788496 - -0.277783601 -3.844032196 + -0.277783612 -3.844032271 0.301586632 -2.785857560 - 2.834222697 -2.356664691 + 2.834222623 -2.356664703 4.020023639 -2.579034765 - 5.210610966 -4.862616194 + 5.210610931 -4.862616127 } 8174bffffffffff { -3.845828260 -7.615506109 -0.656325459 -6.384788496 - 0.169971679 -7.263796145 + 0.169971645 -7.263796128 2.467580053 -8.412776380 2.638932741 -11.830186971 -0.876251295 -13.559193206 @@ -3799,13 +3799,13 @@ -5.889921754 -0.782839175 -1.855492619 -0.133688913 0.301586632 -2.785857560 - -0.277783618 -3.844032309 + -0.277783612 -3.844032271 } 81753ffffffffff { 8.664197475 -6.957444601 5.362739777 -6.064496109 - 5.210610914 -4.862616093 + 5.210610931 -4.862616127 4.020023639 -2.579034765 5.864518366 0.309803964 9.731836671 -0.319182727 @@ -3817,7 +3817,7 @@ 3.968796977 3.943036156 5.864518366 0.309803964 4.020023639 -2.579034765 - 2.834222585 -2.356664710 + 2.834222623 -2.356664703 0.301586632 -2.785857560 -1.855492619 -0.133688913 } @@ -3827,7 +3827,7 @@ 6.270965136 -13.708146704 2.638932741 -11.830186971 2.467580053 -8.412776380 - 3.559837858 -7.899841445 + 3.559837831 -7.899841472 5.362739777 -6.064496109 8.664197475 -6.957444601 } @@ -4094,21 +4094,21 @@ 817e3ffffffffff { -5.048182137 176.337603384 - -2.834222557 177.643335335 + -2.834222623 177.643335297 -1.646918936 177.857287571 - 0.277783669 176.155967679 + 0.277783612 176.155967729 0.849947565 175.093827879 - -0.169971675 172.736203802 + -0.169971645 172.736203872 -1.002106837 171.862683251 - -3.559837907 172.100158535 + -3.559837831 172.100158528 -4.648343501 172.621647398 - -5.210610948 175.137383948 + -5.210610931 175.137383873 } 817ebffffffffff { 4.248592317 175.460412012 0.849947565 175.093827879 - 0.277783584 176.155967754 + 0.277783612 176.155967729 -1.646918936 177.857287571 -0.936163765 -178.798236440 2.904037451 -178.025196652 @@ -4122,13 +4122,13 @@ 4.467031610 168.335252458 0.401594496 168.745755264 -1.002106837 171.862683251 - -0.169971630 172.736203907 + -0.169971645 172.736203872 } 817f3ffffffffff { -8.007193661 178.060436882 -5.048182137 176.337603384 - -5.210610923 175.137383836 + -5.210610931 175.137383873 -4.648343501 172.621647398 -7.173126164 170.304718515 -10.746291233 171.930081852 @@ -4140,7 +4140,7 @@ -6.270965136 166.291853296 -7.173126164 170.304718515 -4.648343501 172.621647398 - -3.559837794 172.100158524 + -3.559837831 172.100158528 -1.002106837 171.862683251 0.401594496 168.745755264 } @@ -4150,7 +4150,7 @@ -3.968796977 -176.056963844 -0.936163765 -178.798236440 -1.646918936 177.857287571 - -2.834222655 177.643335277 + -2.834222623 177.643335297 -5.048182137 176.337603384 -8.007193661 178.060436882 } @@ -4352,11 +4352,11 @@ -8.676263183 88.789796177 -4.455546809 87.528593971 -3.241875310 83.163859043 - -5.250784507 81.184912906 + -5.250784449 81.184912964 -6.202793501 80.140914871 -10.443970997 81.335288341 -11.675376139 85.767560980 - -9.646037372 87.754365479 + -9.646037429 87.754365417 } 81867ffffffffff { @@ -4384,7 +4384,7 @@ -0.870188190 74.826761152 -4.902363342 75.823225912 -6.202793501 80.140914871 - -5.250784419 81.184912993 + -5.250784449 81.184912964 } 81873ffffffffff { @@ -4394,7 +4394,7 @@ -13.836853810 94.368931436 -9.849742971 93.180878734 -8.676263183 88.789796177 - -9.646037459 87.754365388 + -9.646037429 87.754365417 } 81877ffffffffff { @@ -4417,11 +4417,11 @@ 81883ffffffffff { -10.680211197 -150.752700384 - -7.994339313 -149.894991270 + -7.994339392 -149.894991294 -6.672537737 -149.402881491 -3.434580807 -152.398082198 -4.259065522 -156.853109135 - -6.931187517 -157.746170242 + -6.931187439 -157.746170211 -8.243493260 -158.263771599 -11.520974627 -155.279374087 } @@ -4431,7 +4431,7 @@ -5.762860491 -165.416749929 -8.962142483 -162.746150997 -8.243493260 -158.263771599 - -6.931187400 -157.746170198 + -6.931187439 -157.746170211 -4.259065522 -156.853109135 -0.944653390 -159.931123344 } @@ -4477,7 +4477,7 @@ -8.893462571 -142.151064629 -5.820413131 -144.968323610 -6.672537737 -149.402881491 - -7.994339431 -149.894991307 + -7.994339392 -149.894991294 -10.680211197 -150.752700384 -13.929125817 -147.534733310 } @@ -4486,11 +4486,11 @@ -11.739863893 -60.846750778 -8.000707510 -58.487094828 -3.948691453 -60.503094155 - -3.822101923 -63.322767222 + -3.822101927 -63.322767139 -3.684741681 -64.728104075 -7.389406912 -67.118550390 -11.472123671 -65.150174298 - -11.610616601 -62.279488384 + -11.610616593 -62.279488468 } 818a7ffffffffff { @@ -4518,7 +4518,7 @@ 3.824532346 -64.328271730 0.376038687 -66.644555733 -3.684741681 -64.728104075 - -3.822101929 -63.322767098 + -3.822101927 -63.322767139 } 818b3ffffffffff { @@ -4528,7 +4528,7 @@ -19.252194905 -61.196998414 -15.773841771 -58.816959919 -11.739863893 -60.846750778 - -11.610616591 -62.279488510 + -11.610616593 -62.279488468 } 818b7ffffffffff { @@ -4679,21 +4679,21 @@ 81903ffffffffff { -13.614934220 -121.744588954 - -12.271971718 -119.497746676 + -12.271971758 -119.497746742 -11.320482945 -118.740073102 - -8.825639017 -119.361288085 + -8.825639091 -119.361288067 -7.824187580 -120.041133785 - -7.616228180 -122.624838819 + -7.616228186 -122.624838743 -7.935015078 -123.799153707 - -10.296971370 -124.821824215 + -10.296971300 -124.821824185 -11.501694573 -124.886520853 - -13.191260518 -122.905774790 + -13.191260468 -122.905774849 } 8190bffffffffff { -4.986310193 -118.123357779 -7.824187580 -120.041133785 - -8.825639128 -119.361288058 + -8.825639091 -119.361288067 -11.320482945 -118.740073102 -12.225768873 -115.372921696 -9.146555720 -112.908536050 @@ -4707,13 +4707,13 @@ -1.447642860 -124.298492780 -5.215027608 -125.883460722 -7.935015078 -123.799153707 - -7.616228189 -122.624838705 + -7.616228186 -122.624838743 } 81913ffffffffff { -17.031649155 -121.636200236 -13.614934220 -121.744588954 - -13.191260443 -122.905774878 + -13.191260468 -122.905774849 -11.501694573 -124.886520853 -12.603201515 -128.195514698 -16.505445569 -128.548728761 @@ -4725,7 +4725,7 @@ -9.876090878 -131.298182756 -12.603201515 -128.195514698 -11.501694573 -124.886520853 - -10.296971265 -124.821824169 + -10.296971300 -124.821824185 -7.935015078 -123.799153707 -5.215027608 -125.883460722 } @@ -4735,7 +4735,7 @@ -16.170389214 -114.273300235 -12.225768873 -115.372921696 -11.320482945 -118.740073102 - -12.271971778 -119.497746775 + -12.271971758 -119.497746742 -13.614934220 -121.744588954 -17.031649155 -121.636200236 } @@ -5065,11 +5065,11 @@ 819c3ffffffffff { -16.397258947 149.681050654 - -13.640092271 149.087925397 + -13.640092352 149.087925414 -12.247495976 148.867731067 -10.838676182 144.610282318 -13.663288803 140.997870045 - -16.439723553 141.485258646 + -16.439723470 141.485258636 -17.838743926 141.660736932 -19.302203395 146.041408620 } @@ -5079,7 +5079,7 @@ -18.914756858 133.817525423 -20.552278072 137.872608933 -17.838743926 141.660736932 - -16.439723430 141.485258629 + -16.439723470 141.485258636 -13.663288803 140.997870045 -12.143150711 136.629853212 } @@ -5125,7 +5125,7 @@ -10.672390551 156.370868897 -9.360957722 152.369119045 -12.247495976 148.867731067 - -13.640092392 149.087925423 + -13.640092352 149.087925414 -16.397258947 149.681050654 -17.661420320 154.220719391 } @@ -5263,11 +5263,11 @@ { -18.104552814 45.650154129 -22.624728935 45.728023459 - -23.913612820 48.453609971 + -23.913612778 48.453609892 -24.603066515 49.801471929 -22.089282598 53.738877013 -17.577652196 53.433411028 - -16.364888675 50.776098912 + -16.364888711 50.776098989 -15.682905648 49.493251095 } 81a27ffffffffff @@ -5283,7 +5283,7 @@ { -29.090245038 49.972821312 -24.603066515 49.801471929 - -23.913612760 48.453609852 + -23.913612778 48.453609892 -22.624728935 45.728023459 -25.066706608 41.567825139 -29.469379315 41.563582613 @@ -5311,7 +5311,7 @@ { -11.195314074 49.349103323 -15.682905648 49.493251095 - -16.364888729 50.776099028 + -16.364888711 50.776098989 -17.577652196 53.433411028 -14.874844611 57.208075256 -10.490963766 56.791433138 @@ -5330,11 +5330,11 @@ { -16.629033849 -30.247336190 -20.546746926 -32.627971694 - -22.954291509 -31.055074814 + -22.954291436 -31.055074857 -24.188862764 -30.314104446 -23.959523545 -25.498298851 -19.948884410 -23.248317537 - -17.612650151 -24.909181995 + -17.612650220 -24.909181948 -16.400980834 -25.661277261 } 81a47ffffffffff @@ -5350,7 +5350,7 @@ { -28.051410242 -32.864172008 -24.188862764 -30.314104446 - -22.954291401 -31.055074880 + -22.954291436 -31.055074857 -20.546746926 -32.627971694 -20.657405598 -37.456338573 -24.399276926 -39.968602800 @@ -5378,7 +5378,7 @@ { -12.444154506 -23.469997038 -16.400980834 -25.661277261 - -17.612650254 -24.909181924 + -17.612650220 -24.909181948 -19.948884410 -23.248317537 -19.451782018 -18.475435336 -15.444603171 -16.563212714 @@ -5396,21 +5396,21 @@ 81a63ffffffffff { -25.722246382 115.570256961 - -23.185423564 116.013581066 + -23.185423639 116.013581053 -22.002085574 115.759315738 - -20.812430630 113.313901379 + -20.812430666 113.313901451 -20.643702794 112.036684860 - -22.397527475 110.019109067 + -22.397527424 110.019109128 -23.470380969 109.420036669 - -25.805978716 110.596504852 + -25.805978647 110.596504817 -26.654916214 111.552066438 - -26.305690230 114.395275337 + -26.305690241 114.395275253 } 81a6bffffffffff { -17.323395846 111.177113292 -20.643702794 112.036684860 - -20.812430684 113.313901487 + -20.812430666 113.313901451 -22.002085574 115.759315738 -20.095984004 118.799982590 -16.249348507 118.020846847 @@ -5424,13 +5424,13 @@ -19.358823435 104.001451756 -23.118809683 105.717971513 -23.470380969 109.420036669 - -22.397527398 110.019109158 + -22.397527424 110.019109128 } 81a73ffffffffff { -27.826272076 118.588202924 -25.722246382 115.570256961 - -26.305690246 114.395275211 + -26.305690241 114.395275253 -26.654916214 111.552066438 -29.808573145 110.054805489 -32.609931080 113.256894581 @@ -5442,7 +5442,7 @@ -30.219492200 105.359531833 -29.808573145 110.054805489 -26.654916214 111.552066438 - -25.805978613 110.596504799 + -25.805978647 110.596504817 -23.470380969 109.420036669 -23.118809683 105.717971513 } @@ -5452,7 +5452,7 @@ -21.814638995 122.769888036 -20.095984004 118.799982590 -22.002085574 115.759315738 - -23.185423676 116.013581047 + -23.185423639 116.013581053 -25.722246382 115.570256961 -27.826272076 118.588202924 } @@ -5589,11 +5589,11 @@ -28.129236095 14.745412032 -23.752623711 15.277563957 -20.922822427 11.465300865 - -21.946696122 8.646974372 + -21.946696093 8.646974455 -22.373958345 7.197179188 -26.713039739 6.377204030 -29.673903232 10.254270186 - -28.616915426 13.242962887 + -28.616915454 13.242962798 } 81ac7ffffffffff { @@ -5621,7 +5621,7 @@ -15.285730312 4.541728886 -19.349758459 3.645213537 -22.373958345 7.197179188 - -21.946696078 8.646974497 + -21.946696093 8.646974455 } 81ad3ffffffffff { @@ -5631,7 +5631,7 @@ -34.994006697 18.352921949 -30.861032330 18.839987045 -28.129236095 14.745412032 - -28.616915470 13.242962755 + -28.616915454 13.242962798 } 81ad7ffffffffff { @@ -5912,11 +5912,11 @@ 81b63ffffffffff { -32.584864085 -92.042163924 - -30.360710846 -90.016750372 + -30.360710912 -90.016750430 -29.280171655 -88.974368600 -25.224826900 -90.903101298 -24.405915505 -95.801689567 - -26.544148725 -97.831754806 + -26.544148665 -97.831754742 -27.554872895 -98.934100896 -31.717351795 -97.283163744 } @@ -5926,7 +5926,7 @@ -22.410566168 -104.989114154 -26.422656616 -103.810201952 -27.554872895 -98.934100896 - -26.544148634 -97.831754711 + -26.544148665 -97.831754742 -24.405915505 -95.801689567 -20.179245095 -97.535778486 } @@ -5972,7 +5972,7 @@ -33.621069781 -81.771495744 -29.864781548 -83.855602594 -29.280171655 -88.974368600 - -30.360710945 -90.016750459 + -30.360710912 -90.016750430 -32.584864085 -92.042163924 -36.729836818 -89.847113574 } @@ -6046,11 +6046,11 @@ -37.664357631 -177.984745350 -33.802924798 -175.377998068 -29.865766953 -177.994280028 - -29.828776157 178.759197889 + -29.828776160 178.759197983 -29.709916100 177.141718027 -33.405709481 174.332728377 -37.499409187 176.688658747 - -37.588846249 -179.761283940 + -37.588846243 -179.761284045 } 81ba7ffffffffff { @@ -6078,13 +6078,13 @@ -22.197541386 177.516134988 -25.646518175 174.984411500 -29.709916100 177.141718027 - -29.828776161 178.759198031 + -29.828776160 178.759197983 } 81bb3ffffffffff { -41.580314895 -175.131667885 -37.664357631 -177.984745350 - -37.588846243 -179.761284097 + -37.588846243 -179.761284045 -37.499409187 176.688658747 -41.308559571 173.535818016 -45.286766294 176.129352503 @@ -6302,21 +6302,21 @@ 81c23ffffffffff { -42.261112529 -57.995322370 - -41.118552054 -54.914171297 + -41.118552089 -54.914171386 -40.222114985 -53.849703000 - -37.691245388 -54.414765681 + -37.691245462 -54.414765665 -36.642935844 -55.164004208 - -36.205282631 -58.309846168 + -36.205282645 -58.309846076 -36.394827059 -59.788175730 - -38.614966842 -61.417114960 + -38.614966777 -61.417114910 -39.800881987 -61.702805528 - -41.717194501 -59.444119188 + -41.717194445 -59.444119257 } 81c2bffffffffff { -33.936306151 -52.605485883 -36.642935844 -55.164004208 - -37.691245500 -54.414765657 + -37.691245462 -54.414765665 -40.222114985 -53.849703000 -41.284599349 -49.560121897 -38.242875714 -46.347801165 @@ -6330,13 +6330,13 @@ -29.892985339 -59.496606140 -33.439024482 -61.882734639 -36.394827059 -59.788175730 - -36.205282652 -58.309846030 + -36.205282645 -58.309846076 } 81c33ffffffffff { -45.669940987 -58.349065244 -42.261112529 -57.995322370 - -41.717194417 -59.444119291 + -41.717194445 -59.444119257 -39.800881987 -61.702805528 -40.399611294 -66.103092061 -44.179727183 -67.492505377 @@ -6348,7 +6348,7 @@ -37.163896486 -69.305389451 -40.399611294 -66.103092061 -39.800881987 -61.702805528 - -38.614966744 -61.417114886 + -38.614966777 -61.417114910 -36.394827059 -59.788175730 -33.439024482 -61.882734639 } @@ -6358,7 +6358,7 @@ -45.253613491 -48.225599019 -41.284599349 -49.560121897 -40.222114985 -53.849703000 - -41.118552107 -54.914171431 + -41.118552089 -54.914171386 -42.261112529 -57.995322370 -45.669940987 -58.349065244 } @@ -6432,11 +6432,11 @@ -44.047542419 -136.741605440 -42.220965832 -131.250403723 -37.719798674 -130.701290922 - -36.114444757 -133.595489746 + -36.114444805 -133.595489663 -35.229859246 -134.945614227 -36.899865496 -139.986096095 -41.330674023 -141.143537036 - -43.124283246 -138.211169366 + -43.124283191 -138.211169451 } 81c67ffffffffff { @@ -6464,13 +6464,13 @@ -29.089392138 -129.812096387 -30.785265895 -134.187508380 -35.229859246 -134.945614227 - -36.114444829 -133.595489621 + -36.114444805 -133.595489663 } 81c73ffffffffff { -48.470618150 -137.858009629 -44.047542419 -136.741605440 - -43.124283165 -138.211169495 + -43.124283191 -138.211169451 -41.330674023 -141.143537036 -42.790722675 -146.907957659 -47.031919689 -148.577727875 @@ -6627,11 +6627,11 @@ 81cc3ffffffffff { -44.062790041 88.615761091 - -41.451206515 87.180590120 + -41.451206592 87.180590161 -40.114354571 86.592585835 -39.308739799 80.964970588 -42.472631308 76.691253305 - -45.197627888 77.676244098 + -45.197627806 77.676244073 -46.574670225 78.105178464 -47.511000583 84.420136543 } @@ -6641,7 +6641,7 @@ -48.011188120 67.211996072 -49.548822884 73.069046717 -46.574670225 78.105178464 - -45.197627766 77.676244058 + -45.197627806 77.676244073 -42.472631308 76.691253305 -41.196520069 70.868937442 } @@ -6687,7 +6687,7 @@ -37.099588897 95.414832968 -36.658760420 90.251462996 -40.114354571 86.592585835 - -41.451206630 87.180590181 + -41.451206592 87.180590161 -44.062790041 88.615761091 -44.382483184 94.909861692 } @@ -6952,21 +6952,21 @@ 81d63ffffffffff { -52.679842289 39.479733015 - -50.316149177 41.095742582 + -50.316149247 41.095742537 -49.110626063 41.166752505 - -47.406672408 38.278897828 + -47.406672460 38.278897910 -46.935232413 36.645358136 - -48.095354836 33.251524202 + -48.095354803 33.251524305 -48.953262509 31.970816075 - -51.504375530 32.440253499 + -51.504375454 32.440253484 -52.574792760 33.344909809 - -52.968607379 37.541219066 + -52.968607369 37.541218941 } 81d6bffffffffff { -43.517931096 36.763509615 -46.935232413 36.645358136 - -47.406672485 38.278897952 + -47.406672460 38.278897910 -49.110626063 41.166752505 -47.840124408 45.954905070 -43.922958566 45.937440283 @@ -6980,13 +6980,13 @@ -43.443252764 26.962608176 -47.522117423 27.308702994 -48.953262509 31.970816075 - -48.095354787 33.251524356 + -48.095354803 33.251524305 } 81d73ffffffffff { -55.365830397 43.081393787 -52.679842289 39.479733015 - -52.968607364 37.541218878 + -52.968607369 37.541218941 -52.574792760 33.344909809 -55.133688198 29.499802760 -58.692722862 32.501399691 @@ -6998,7 +6998,7 @@ -54.013771481 22.717229081 -55.133688198 29.499802760 -52.574792760 33.344909809 - -51.504375417 32.440253477 + -51.504375454 32.440253484 -48.953262509 31.970816075 -47.522117423 27.308702994 } @@ -7008,7 +7008,7 @@ -50.154511598 51.090146190 -47.840124408 45.954905070 -49.110626063 41.166752505 - -50.316149282 41.095742514 + -50.316149247 41.095742537 -52.679842289 39.479733015 -55.365830397 43.081393787 } @@ -7017,11 +7017,11 @@ -52.241639863 141.693314491 -47.867154020 140.917609212 -45.755276550 135.074456458 - -47.166397363 131.536044538 + -47.166397324 131.536044644 -47.766522183 129.650156924 -52.164781161 129.343304101 -54.563206659 135.770304967 - -53.008820414 139.746187316 + -53.008820458 139.746187199 } 81d87ffffffffff { @@ -7049,13 +7049,13 @@ -40.975558199 125.120987221 -45.096127154 124.410374564 -47.766522183 129.650156924 - -47.166397304 131.536044698 + -47.166397324 131.536044644 } 81d93ffffffffff { -53.966055697 148.602458594 -52.241639863 141.693314491 - -53.008820482 139.746187143 + -53.008820458 139.746187199 -54.563206659 135.770304967 -59.076182871 136.256007339 -60.930172183 144.251686583 @@ -7147,11 +7147,11 @@ 81dc3ffffffffff { -58.629520204 -11.227229975 - -55.956862772 -9.584191788 + -55.956862850 -9.584191833 -54.634561911 -8.729168015 -51.321912702 -13.550591036 -51.685488584 -20.792782325 - -54.176658972 -22.972303214 + -54.176658901 -22.972303139 -55.370522372 -24.269926198 -59.096557065 -19.929581738 } @@ -7161,7 +7161,7 @@ -51.128254500 -34.671483931 -54.985759471 -32.107870553 -55.370522372 -24.269926198 - -54.176658865 -22.972303105 + -54.176658901 -22.972303139 -51.685488584 -20.792782325 -47.887810070 -24.595454871 } @@ -7207,7 +7207,7 @@ -56.196522246 4.251781232 -53.540333941 -1.301246553 -54.634561911 -8.729168015 - -55.956862890 -9.584191855 + -55.956862850 -9.584191833 -58.629520204 -11.227229975 -61.829816802 -4.785398759 } @@ -7539,11 +7539,11 @@ -67.952281178 -97.256815792 -68.236593010 -85.462329754 -64.230215215 -80.246568417 - -61.905821697 -83.759922931 + -61.905821766 -83.759922836 -60.677354119 -85.196914843 -60.510306773 -94.164234361 -63.939145038 -100.500301393 - -66.606967653 -98.341946035 + -66.606967573 -98.341946096 } 81e87ffffffffff { @@ -7571,13 +7571,13 @@ -56.210610738 -73.596504362 -56.733010544 -81.059703383 -60.677354119 -85.196914843 - -61.905821801 -83.759922789 + -61.905821766 -83.759922836 } 81e93ffffffffff { -71.105255254 -106.430914575 -67.952281178 -97.256815792 - -66.606967534 -98.341946131 + -66.606967573 -98.341946096 -63.939145038 -100.500301393 -62.739287767 -110.225667651 -65.252731088 -118.485062401 @@ -7604,15 +7604,15 @@ 81ea3ffffffffff { -61.963540538 -165.897898385 - -61.890838470 -171.355778963 + -61.890838475 -171.355778802 -62.205005366 -173.840904060 - -64.525608490 -176.300066818 + -64.525608422 -176.300066740 -65.724388873 -176.621924870 - -67.468427934 -171.869738817 + -67.468427885 -171.869738968 -67.859952975 -168.866719964 - -66.327261686 -163.566302857 + -66.327261733 -163.566303003 -65.283240627 -162.090990204 - -62.889968287 -164.228226217 + -62.889968358 -164.228226159 } 81eabffffffffff { @@ -7622,7 +7622,7 @@ -63.095054078 169.555022455 -66.425061040 175.121301599 -65.724388873 -176.621924870 - -64.525608388 -176.300066700 + -64.525608422 -176.300066740 } 81eafffffffffff { @@ -7632,7 +7632,7 @@ -73.310223685 -179.674389648 -71.265233378 -168.009832723 -67.859952975 -168.866719964 - -67.468427860 -171.869739043 + -67.468427885 -171.869738968 } 81eb3ffffffffff { @@ -7642,7 +7642,7 @@ -58.401544870 -154.917277673 -58.926343208 -162.713799968 -61.963540538 -165.897898385 - -62.889968394 -164.228226130 + -62.889968358 -164.228226159 } 81eb7ffffffffff { @@ -7652,7 +7652,7 @@ -68.929957882 -148.168719501 -65.493325551 -153.892764246 -65.283240627 -162.090990204 - -66.327261757 -163.566303077 + -66.327261733 -163.566303003 } 81ebbffffffffff { @@ -7662,7 +7662,7 @@ -55.706768465 -174.476353451 -59.383886487 -177.801783959 -62.205005366 -173.840904060 - -61.890838478 -171.355778722 + -61.890838475 -171.355778802 } 81ec3ffffffffff { @@ -7797,11 +7797,11 @@ -80.332241750 97.138716441 -76.345729136 87.747996476 -74.834321668 70.543592278 - -76.198757576 60.671758280 + -76.198757542 60.671758595 -76.645013354 54.976005155 -80.922208622 49.509760007 -83.576764877 77.315824880 - -81.480857075 91.962896079 + -81.480857141 91.962895733 } 81f07ffffffffff { @@ -7829,13 +7829,13 @@ -69.371341411 48.291160912 -73.245510848 43.596190366 -76.645013354 54.976005155 - -76.198757525 60.671758753 + -76.198757542 60.671758595 } 81f13ffffffffff { -79.492089224 122.541694417 -80.332241750 97.138716441 - -81.480857174 91.962895573 + -81.480857141 91.962895733 -83.576764877 77.315824880 -87.808243561 101.816835458 -84.942074318 162.091836165 diff --git a/tests/inputfiles/res03cells.txt b/tests/inputfiles/res03cells.txt index 8596b3659..23f87becb 100644 --- a/tests/inputfiles/res03cells.txt +++ b/tests/inputfiles/res03cells.txt @@ -2527,11 +2527,11 @@ 75.472867355 -3.473087865 75.989400821 -2.992899325 76.368288672 -4.888624085 - 76.261572243 -6.463942303 + 76.261572246 -6.463942256 76.167091307 -7.131612041 75.564481916 -7.242806237 75.246599463 -5.486593244 - 75.426433953 -4.217682742 + 75.426433950 -4.217682786 } 830169fffffffff { @@ -2559,13 +2559,13 @@ 77.083530217 -9.023350332 76.477357689 -9.058859975 76.167091307 -7.131612041 - 76.261572248 -6.463942233 + 76.261572246 -6.463942256 } 83016cfffffffff { 75.088650334 -1.740111508 75.472867355 -3.473087865 - 75.426433948 -4.217682806 + 75.426433950 -4.217682786 75.246599463 -5.486593244 74.648269500 -5.654274928 74.325023961 -4.045234647 @@ -3036,11 +3036,11 @@ { 69.263257885 52.681499584 69.414256713 54.365968073 - 69.782521976 54.771669634 + 69.782521965 54.771669628 69.969254041 54.875886265 70.383087201 53.521562465 70.219969078 51.879245742 - 69.844621097 51.732619844 + 69.844621108 51.732619848 69.658453300 51.551935696 } 8301b1fffffffff @@ -3060,7 +3060,7 @@ 69.667210147 57.813757686 70.104239364 56.535658652 69.969254041 54.875886265 - 69.782521960 54.771669622 + 69.782521965 54.771669628 } 8301b3fffffffff { @@ -3084,7 +3084,7 @@ { 69.481128948 49.885077617 69.658453300 51.551935696 - 69.844621113 51.732619850 + 69.844621108 51.732619848 70.219969078 51.879245742 70.609078850 50.453608069 70.418359869 48.838858897 @@ -3103,11 +3103,11 @@ { 79.721558498 -109.232572385 79.147878187 -110.717588878 - 78.822548544 -109.511339982 + 78.822548554 -109.511340017 78.657320880 -108.939915611 78.710905931 -105.785501832 79.259019069 -104.107157670 - 79.604481041 -105.192294898 + 79.604481031 -105.192294864 79.776539766 -105.755116050 } 830201fffffffff @@ -3127,7 +3127,7 @@ 77.987176369 -113.253482144 78.085341100 -110.311630315 78.657320880 -108.939915611 - 78.822548559 -109.511340034 + 78.822548554 -109.511340017 } 830203fffffffff { @@ -3151,7 +3151,7 @@ { 80.323859576 -103.887899499 79.776539766 -105.755116050 - 79.604481026 -105.192294848 + 79.604481031 -105.192294864 79.259019069 -104.107157670 79.261527467 -100.756059531 79.778774109 -98.737260599 @@ -4184,11 +4184,11 @@ { 71.168081059 -131.351317642 70.565459884 -131.478320419 - 70.367946515 -130.480909064 + 70.367946523 -130.480909091 70.242797461 -130.022587021 70.481702265 -128.430737537 71.105010409 -128.170781792 - 71.362338948 -129.117606786 + 71.362338940 -129.117606757 71.467042023 -129.631456709 } 830299fffffffff @@ -4208,7 +4208,7 @@ 69.371341411 -131.708839088 69.620633425 -130.215422001 70.242797461 -130.022587021 - 70.367946526 -130.480909106 + 70.367946523 -130.480909091 } 83029bfffffffff { @@ -4232,7 +4232,7 @@ { 72.071894258 -129.432224769 71.467042023 -129.631456709 - 71.362338936 -129.117606743 + 71.362338940 -129.117606757 71.105010409 -128.170781792 71.331292454 -126.471435307 71.954479007 -126.132283070 @@ -4314,11 +4314,11 @@ { 75.649307045 -123.591131731 75.038197079 -124.086783908 - 74.786079781 -122.921614803 + 74.786079790 -122.921614836 74.645641818 -122.382436677 74.829311490 -120.185035568 75.441616986 -119.504372107 - 75.733277736 -120.605201262 + 75.733277727 -120.605201228 75.867185044 -121.197131578 } 8302a9fffffffff @@ -4338,7 +4338,7 @@ 73.821619951 -124.962473438 74.027436479 -122.920417208 74.645641818 -122.382436677 - 74.786079794 -122.921614853 + 74.786079790 -122.921614836 } 8302abfffffffff { @@ -4362,7 +4362,7 @@ { 76.473114157 -120.537811392 75.867185044 -121.197131578 - 75.733277723 -120.605201212 + 75.733277727 -120.605201228 75.441616986 -119.504372107 75.599098854 -117.140213131 76.202603667 -116.290790621 @@ -5453,11 +5453,11 @@ { 82.488799674 -81.196049135 82.097425091 -84.942842764 - 81.701632848 -84.524064663 + 81.701632860 -84.524064680 81.508026002 -84.256071962 81.302063839 -80.285930951 81.649960743 -76.791128429 - 82.043164083 -77.006443484 + 82.043164072 -77.006443477 82.242966167 -77.018016690 } 830351fffffffff @@ -5477,7 +5477,7 @@ 81.229812000 -91.366759557 81.097346684 -87.382459093 81.508026002 -84.256071962 - 81.701632865 -84.524064686 + 81.701632860 -84.524064680 } 830353fffffffff { @@ -5501,7 +5501,7 @@ { 82.559056040 -72.851214692 82.242966167 -77.018016690 - 82.043164066 -77.006443474 + 82.043164072 -77.006443477 81.649960743 -76.791128429 81.370368878 -72.970926973 81.648878786 -69.208923258 @@ -5583,11 +5583,11 @@ { 82.398103397 -42.585359274 82.396704271 -47.342092627 - 82.049629881 -48.793182294 + 82.049629892 -48.793182263 81.868923121 -49.305207250 81.370619361 -46.695277044 81.378708844 -42.667044109 - 81.720583364 -41.424182448 + 81.720583354 -41.424182486 81.879693485 -40.588549961 } 830361fffffffff @@ -5607,7 +5607,7 @@ 82.239911776 -56.705526788 81.791677566 -53.550431614 81.868923121 -49.305207250 - 82.049629897 -48.793182242 + 82.049629892 -48.793182263 } 830363fffffffff { @@ -5631,7 +5631,7 @@ { 81.810448011 -36.203767843 81.879693485 -40.588549961 - 81.720583349 -41.424182505 + 81.720583354 -41.424182486 81.378708844 -42.667044109 80.842228987 -40.573142906 80.790101925 -36.829169465 @@ -8299,12 +8299,12 @@ 80.949642645 111.155945346 81.189630390 115.188800737 81.848244686 116.139183969 - 82.280469212 112.477462512 + 82.280469212 112.477462513 82.008427399 108.006716404 } 830529fffffffff { - 82.280469212 112.477462512 + 82.280469212 112.477462513 81.848244686 116.139183969 82.031396804 120.750442175 82.672133404 122.294146696 @@ -8342,7 +8342,7 @@ { 82.362188277 103.899565063 82.008427399 108.006716404 - 82.280469212 112.477462512 + 82.280469212 112.477462513 82.942519583 113.321630041 83.343042158 108.913360951 83.030841211 103.944436371 @@ -11830,11 +11830,11 @@ 62.394747654 -15.438489979 62.576811429 -16.515760509 62.173385964 -17.445514359 - 61.789192072 -17.335394210 + 61.789192084 -17.335394213 61.616671131 -17.194273298 61.480235116 -15.960898338 61.856710610 -15.131005276 - 62.202947906 -15.397576963 + 62.202947894 -15.397576961 } 830769fffffffff { @@ -11862,13 +11862,13 @@ 61.343378022 -19.242629923 61.224962179 -18.005165762 61.616671131 -17.194273298 - 61.789192090 -17.335394214 + 61.789192084 -17.335394213 } 83076cfffffffff { 62.781282057 -14.486574773 62.394747654 -15.438489979 - 62.202947889 -15.397576957 + 62.202947894 -15.397576961 61.856710610 -15.131005276 61.702419754 -13.904984866 62.063480917 -13.058058484 @@ -12339,11 +12339,11 @@ { 79.688332581 -16.355019957 79.961920022 -19.462297834 - 79.754622221 -21.368558344 + 79.754622229 -21.368558297 79.623992532 -22.140528613 79.018629705 -21.463825591 78.793455373 -18.702028328 - 79.037329952 -17.195140327 + 79.037329945 -17.195140372 79.128854252 -16.277634701 } 8307b1fffffffff @@ -12363,7 +12363,7 @@ 80.416872752 -26.182285242 79.819644519 -25.216053565 79.623992532 -22.140528613 - 79.754622232 -21.368558270 + 79.754622229 -21.368558297 } 8307b3fffffffff { @@ -12387,7 +12387,7 @@ { 78.830313114 -13.504892937 79.128854252 -16.277634701 - 79.037329941 -17.195140395 + 79.037329945 -17.195140372 78.793455373 -18.702028328 78.183896972 -18.248285308 77.935381362 -15.761068173 @@ -12405,15 +12405,15 @@ 830800fffffffff { 64.528090380 9.597145345 - 64.310524641 10.249885396 + 64.310524647 10.249885377 64.263700106 10.618774790 - 64.459677878 11.305775996 + 64.459677872 11.305775976 64.595948612 11.529258368 - 64.939892772 11.313362820 + 64.939892762 11.313362826 65.073062456 11.075818239 - 65.087510314 10.231495980 + 65.087510313 10.231496005 65.030354819 9.859998668 - 64.694692907 9.580475128 + 64.694692917 9.580475136 } 830802fffffffff { @@ -12423,7 +12423,7 @@ 63.960727464 12.823918552 64.483991977 12.525591033 64.595948612 11.529258368 - 64.459677869 11.305775965 + 64.459677872 11.305775976 } 830803fffffffff { @@ -12433,7 +12433,7 @@ 65.413227948 12.930936799 65.448305148 11.637085666 65.073062456 11.075818239 - 64.939892757 11.313362830 + 64.939892762 11.313362826 } 830804fffffffff { @@ -12443,7 +12443,7 @@ 64.665070305 7.646201117 64.348239695 8.659647646 64.528090380 9.597145345 - 64.694692922 9.580475140 + 64.694692917 9.580475136 } 830805fffffffff { @@ -12453,7 +12453,7 @@ 65.870718694 9.586063397 65.361255483 9.159000912 65.030354819 9.859998668 - 65.087510313 10.231496017 + 65.087510313 10.231496005 } 830806fffffffff { @@ -12463,7 +12463,72 @@ 63.519707127 9.693860814 63.822428008 10.699671194 64.263700106 10.618774790 - 64.310524651 10.249885367 + 64.310524647 10.249885377 +} +830808fffffffff +{ + 66.204756739 12.829506839 + 66.585639122 13.463341977 + 67.011021460 12.719428470 + 67.041485597 11.315504398 + 66.649038736 10.714351935 + 66.237622736 11.482857419 +} +830809fffffffff +{ + 67.011021460 12.719428470 + 67.400288774 13.378475583 + 67.832099976 12.599547258 + 67.859952975 11.133280036 + 67.458682949 10.510081866 + 67.041485597 11.315504398 +} +83080afffffffff +{ + 65.699937754 14.730495679 + 66.103484926 15.523290333 + 66.535682352 14.838561789 + 66.585639122 13.463341977 + 66.204756739 12.829506839 + 65.785845945 13.541403902 + 65.761651409 14.201538899 +} +83080bfffffffff +{ + 66.535682352 14.838561789 + 66.912504727 15.528131024 + 67.351768675 14.813658726 + 67.400288774 13.378475583 + 67.011021460 12.719428470 + 66.585639122 13.463341977 +} +83080cfffffffff +{ + 65.853852066 10.902305279 + 66.237622736 11.482857419 + 66.649038736 10.714351935 + 66.662638270 9.343736980 + 66.465098478 9.067675266 + 66.207405877 8.851108565 + 65.870718694 9.586063397 +} +83080dfffffffff +{ + 66.649038736 10.714351935 + 67.041485597 11.315504398 + 67.458682949 10.510081866 + 67.468734219 9.080454139 + 67.065241605 8.516906270 + 66.662638270 9.343736980 +} +83080efffffffff +{ + 65.413227948 12.930936799 + 65.785845945 13.541403902 + 66.204756739 12.829506839 + 66.237622736 11.482857419 + 65.853852066 10.902305279 + 65.448305148 11.637085666 } 830810fffffffff { @@ -12790,6 +12855,457 @@ 62.418188738 7.050817029 62.937385968 6.966744136 } +830840fffffffff +{ + 69.974543918 9.775021835 + 70.403158550 10.474564595 + 70.842034933 9.478595336 + 70.834390300 7.752412320 + 70.393073023 7.109983803 + 69.971933265 8.133799247 +} +830841fffffffff +{ + 70.842034933 9.478595336 + 71.280057667 10.207588309 + 71.723809421 9.149380068 + 71.710632355 7.329111176 + 71.259430537 6.664421462 + 70.834390300 7.752412320 +} +830842fffffffff +{ + 69.518889761 12.324631961 + 69.933993154 13.072820074 + 70.384629227 12.165989223 + 70.403158550 10.474564595 + 69.974543918 9.775021835 + 69.540802820 10.715534524 +} +830843fffffffff +{ + 70.384629227 12.165989223 + 70.808558273 12.949427626 + 71.265233378 11.990167277 + 71.280057667 10.207588309 + 70.842034933 9.478595336 + 70.403158550 10.474564595 +} +830844fffffffff +{ + 69.540326193 7.512619939 + 69.971933265 8.133799247 + 70.393073023 7.109983803 + 70.364882701 5.442505174 + 70.143027329 5.157425657 + 69.867854133 4.947170929 + 69.518305745 5.923714581 +} +830845fffffffff +{ + 70.393073023 7.109983803 + 70.834390300 7.752412320 + 71.259430537 6.664421462 + 71.224470269 4.910441519 + 70.771474782 4.333799760 + 70.364882701 5.442505174 +} +830846fffffffff +{ + 69.121448856 10.043311931 + 69.540802820 10.715534524 + 69.974543918 9.775021835 + 69.971933265 8.133799247 + 69.540326193 7.512619939 + 69.123433654 8.479174332 +} +830848fffffffff +{ + 72.160635914 11.794219838 + 72.602518144 12.658970107 + 73.070732179 11.574487117 + 73.077000876 9.576804605 + 72.619704541 8.781643065 + 72.171390887 9.910169200 +} +830849fffffffff +{ + 73.070732179 11.574487117 + 73.521740083 12.486434416 + 73.995374822 11.326366305 + 73.996674793 9.200586264 + 73.529498782 8.368239402 + 73.077000876 9.576804605 +} +83084afffffffff +{ + 71.658843240 14.647497725 + 72.084442725 15.568828381 + 72.565643896 14.602494667 + 72.602518144 12.658970107 + 72.160635914 11.794219838 + 71.698089316 12.812287979 +} +83084bfffffffff +{ + 72.565643896 14.602494667 + 72.999491737 15.578498201 + 73.487456498 14.551845028 + 73.521740083 12.486434416 + 73.070732179 11.574487117 + 72.602518144 12.658970107 +} +83084cfffffffff +{ + 71.723809421 9.149380068 + 72.171390887 9.910169200 + 72.619704541 8.781643065 + 72.600423632 6.856639426 + 72.139157810 6.168745316 + 71.710632355 7.329111176 +} +83084dfffffffff +{ + 72.619704541 8.781643065 + 73.077000876 9.576804605 + 73.529498782 8.368239402 + 73.503452709 6.325978423 + 73.031936335 5.614085386 + 72.600423632 6.856639426 +} +83084efffffffff +{ + 71.265233378 11.990167277 + 71.698089316 12.812287979 + 72.160635914 11.794219838 + 72.171390887 9.910169200 + 71.723809421 9.149380068 + 71.280057667 10.207588309 +} +830850fffffffff +{ + 68.182909183 14.786485458 + 68.575775077 15.539166661 + 69.029164201 14.756716741 + 69.074428614 13.184432748 + 68.668046616 12.468493919 + 68.229868576 13.285874911 +} +830851fffffffff +{ + 69.029164201 14.756716741 + 69.430149380 15.545494074 + 69.890569753 14.723962087 + 69.933993154 13.072820074 + 69.518889761 12.324631961 + 69.074428614 13.184432748 +} +830852fffffffff +{ + 67.668816482 16.997151763 + 68.047781423 17.780068378 + 68.508412488 17.071057436 + 68.575775077 15.539166661 + 68.182909183 14.786485458 + 67.736576945 15.533403023 +} +830853fffffffff +{ + 68.508412488 17.071057436 + 68.894855566 17.892927634 + 69.363206594 17.152178879 + 69.430149380 15.545494074 + 69.029164201 14.756716741 + 68.575775077 15.539166661 +} +830854fffffffff +{ + 67.832099976 12.599547258 + 68.229868576 13.285874911 + 68.668046616 12.468493919 + 68.693057650 10.934114150 + 68.282818440 10.287279857 + 67.859952975 11.133280036 +} +830855fffffffff +{ + 68.668046616 12.468493919 + 69.074428614 13.184432748 + 69.518889761 12.324631961 + 69.540802820 10.715534524 + 69.121448856 10.043311931 + 68.693057650 10.934114150 +} +830856fffffffff +{ + 67.351768675 14.813658726 + 67.736576945 15.533403023 + 68.182909183 14.786485458 + 68.229868576 13.285874911 + 67.832099976 12.599547258 + 67.400288774 13.378475583 +} +830858fffffffff +{ + 70.233219044 17.241626713 + 70.634572669 18.154254814 + 71.118441386 17.340751720 + 71.184499759 15.560206970 + 70.767135601 14.687748546 + 70.299724948 15.552472233 +} +830859fffffffff +{ + 71.118441386 17.340751720 + 71.527181080 18.306672240 + 72.018834078 17.451213438 + 72.084442725 15.568828381 + 71.658843240 14.647497725 + 71.184499759 15.560206970 +} +83085afffffffff +{ + 69.667111075 19.653636340 + 70.052151520 20.597244294 + 70.543456649 19.876159063 + 70.634572669 18.154254814 + 70.233219044 17.241626713 + 69.757119772 18.017063871 +} +83085bfffffffff +{ + 70.543456649 19.876159063 + 70.935011937 20.875898423 + 71.434798006 20.123253135 + 71.527181080 18.306672240 + 71.118441386 17.340751720 + 70.634572669 18.154254814 +} +83085cfffffffff +{ + 69.890569753 14.723962087 + 70.299724948 15.552472233 + 70.767135601 14.687748546 + 70.808558273 12.949427626 + 70.384629227 12.165989223 + 69.933993154 13.072820074 +} +83085dfffffffff +{ + 70.767135601 14.687748546 + 71.184499759 15.560206970 + 71.658843240 14.647497725 + 71.698089316 12.812287979 + 71.265233378 11.990167277 + 70.808558273 12.949427626 +} +83085efffffffff +{ + 69.363206594 17.152178879 + 69.757119772 18.017063871 + 70.233219044 17.241626713 + 70.299724948 15.552472233 + 69.890569753 14.723962087 + 69.430149380 15.545494074 +} +830860fffffffff +{ + 69.659820655 3.542720498 + 69.999398337 2.498499913 + 69.770369773 1.089180547 + 69.205631779 0.787123153 + 68.879577019 1.831030721 + 69.104892316 3.178869203 +} +830861fffffffff +{ + 70.560486954 2.861258549 + 70.902567984 1.747241335 + 70.669294013 0.271134076 + 70.098369024 -0.022431800 + 69.770369773 1.089180547 + 69.999398337 2.498499913 +} +830862fffffffff +{ + 69.518305745 5.923714581 + 69.867854133 4.947170929 + 69.659820655 3.542720498 + 69.104892316 3.178869203 + 68.768405776 4.160905114 + 68.973903067 5.502968789 +} +830863fffffffff +{ + 70.364882701 5.442505174 + 70.771474782 4.333799760 + 70.560486954 2.861258549 + 69.999398337 2.498499913 + 69.659820655 3.542720498 + 69.867854133 4.947170929 + 70.143027329 5.157425657 +} +830864fffffffff +{ + 68.879577019 1.831030721 + 69.205631779 0.787123153 + 68.959740547 -0.561592204 + 68.392331295 -0.809709002 + 68.079652217 0.230039475 + 68.321170263 1.523345105 +} +830865fffffffff +{ + 69.770369773 1.089180547 + 70.098369024 -0.022431800 + 69.847557605 -1.430883014 + 69.273859192 -1.666585504 + 68.959740547 -0.561592204 + 69.205631779 0.787123153 +} +830866fffffffff +{ + 68.768405776 4.160905114 + 69.104892316 3.178869203 + 68.879577019 1.831030721 + 68.321170263 1.523345105 + 67.997690835 2.506639292 + 68.219741428 3.797763423 +} +830868fffffffff +{ + 71.633526947 3.728799826 + 72.096742067 4.319120712 + 72.507661118 3.054972697 + 72.461117315 1.806332183 + 72.386609007 1.266276564 + 71.813581691 0.913709302 + 71.469696404 2.106505786 + 71.614243837 3.135420745 +} +830869fffffffff +{ + 72.507661118 3.054972697 + 72.981275471 3.658209551 + 73.393335884 2.300087683 + 73.310223685 0.325610352 + 72.731464443 -0.015975588 + 72.386609007 1.266276564 + 72.461117315 1.806332183 +} +83086afffffffff +{ + 71.259430537 6.664421462 + 71.710632355 7.329111176 + 72.139157810 6.168745316 + 72.096742067 4.319120712 + 71.633526947 3.728799826 + 71.224470269 4.910441519 +} +83086bfffffffff +{ + 72.139157810 6.168745316 + 72.600423632 6.856639426 + 73.031936335 5.614085386 + 72.981275471 3.658209551 + 72.507661118 3.054972697 + 72.096742067 4.319120712 +} +83086cfffffffff +{ + 71.469696404 2.106505786 + 71.813581691 0.913709302 + 71.575430242 -0.635092098 + 70.998491383 -0.916473323 + 70.669294013 0.271134076 + 70.902567984 1.747241335 +} +83086dfffffffff +{ + 72.386609007 1.266276564 + 72.731464443 -0.015975588 + 72.487683499 -1.644031426 + 71.904940452 -1.908443001 + 71.575430242 -0.635092098 + 71.813581691 0.913709302 +} +83086efffffffff +{ + 71.224470269 4.910441519 + 71.633526947 3.728799826 + 71.614243837 3.135420745 + 71.469696404 2.106505786 + 70.902567984 1.747241335 + 70.560486954 2.861258549 + 70.771474782 4.333799760 +} +830870fffffffff +{ + 67.876313309 8.211625588 + 68.289009946 8.793386260 + 68.701366013 7.878213536 + 68.691948105 6.865717878 + 68.628450372 6.423080120 + 68.090149790 6.008844669 + 67.749167522 6.878349380 + 67.873998758 7.726905594 +} +830871fffffffff +{ + 68.701366013 7.878213536 + 69.123433654 8.479174332 + 69.540326193 7.512619939 + 69.518305745 5.923714581 + 68.973903067 5.502968789 + 68.628450372 6.423080120 + 68.691948105 6.865717878 +} +830872fffffffff +{ + 67.458682949 10.510081866 + 67.859952975 11.133280036 + 68.282818440 10.287279857 + 68.289009946 8.793386260 + 67.876313309 8.211625588 + 67.468734219 9.080454139 +} +830873fffffffff +{ + 68.282818440 10.287279857 + 68.693057650 10.934114150 + 69.121448856 10.043311931 + 69.123433654 8.479174332 + 68.701366013 7.878213536 + 68.289009946 8.793386260 +} +830874fffffffff +{ + 67.749167522 6.878349380 + 68.090149790 6.008844669 + 67.886841035 4.724108938 + 67.344530036 4.363027591 + 67.015632628 5.239258880 + 67.217041720 6.471166227 +} +830875fffffffff +{ + 68.628450372 6.423080120 + 68.973903067 5.502968789 + 68.768405776 4.160905114 + 68.219741428 3.797763423 + 67.886841035 4.724108938 + 68.090149790 6.008844669 +} +830876fffffffff +{ + 67.468734219 9.080454139 + 67.876313309 8.211625588 + 67.873998758 7.726905594 + 67.749167522 6.878349380 + 67.217041720 6.471166227 + 66.880843319 7.295065633 + 67.065241605 8.516906270 +} 830880fffffffff { 60.411344863 17.250449425 @@ -12985,11 +13501,11 @@ { 59.221039728 22.212547984 58.956460510 23.179061920 - 59.110624961 23.851242724 + 59.110624954 23.851242708 59.226503456 24.118197847 59.807887562 24.028019511 60.034583415 23.118060795 - 59.797764551 22.586750383 + 59.797764558 22.586750399 59.719040826 22.247654238 } 830899fffffffff @@ -13009,7 +13525,7 @@ 58.401544870 25.082722327 58.987610202 25.009759659 59.226503456 24.118197847 - 59.110624952 23.851242698 + 59.110624954 23.851242708 } 83089bfffffffff { @@ -13033,7 +13549,7 @@ { 59.972326926 21.262731887 59.719040826 22.247654238 - 59.797764561 22.586750407 + 59.797764558 22.586750399 60.034583415 23.118060795 60.610921488 23.009480522 60.825165611 22.080946049 @@ -13115,11 +13631,11 @@ { 62.051951334 16.167327830 61.849456503 17.212572589 - 62.023803197 17.901360011 + 62.023803189 17.901359996 62.150917405 18.152477858 62.702866542 17.953843205 62.865819018 16.984469346 - 62.607212238 16.489550955 + 62.607212246 16.489550969 62.518157734 16.143657000 } 8308a9fffffffff @@ -13139,7 +13655,7 @@ 61.416749935 19.280998609 61.974982724 19.104846065 62.150917405 18.152477858 - 62.023803187 17.901359985 + 62.023803189 17.901359996 } 8308abfffffffff { @@ -13163,7 +13679,7 @@ { 62.708490836 15.081230811 62.518157734 16.143657000 - 62.607212250 16.489550976 + 62.607212246 16.489550969 62.865819018 16.984469346 63.411134964 16.762032840 63.560941499 15.775886604 @@ -13310,11 +13826,11 @@ 68.125168857 26.933497525 67.912226043 28.137180821 68.258560244 29.325147025 - 68.637219581 29.321138185 + 68.637219570 29.321138185 68.808742056 29.177229419 68.988670973 27.636334978 68.648686434 26.586822184 - 68.313081588 26.913769082 + 68.313081599 26.913769080 } 8308c9fffffffff { @@ -13342,13 +13858,13 @@ 68.929957882 31.831280499 69.134787217 30.293069995 68.808742056 29.177229419 - 68.637219564 29.321138185 + 68.637219570 29.321138185 } 8308ccfffffffff { 67.765539296 25.804822010 68.125168857 26.933497525 - 68.313081604 26.913769076 + 68.313081599 26.913769080 68.648686434 26.586822184 68.804352623 25.050155041 68.452142996 24.067975425 @@ -13503,11 +14019,11 @@ 66.367682264 17.448324918 66.220404980 18.548896141 66.611729332 19.448170392 - 66.975657130 19.310273081 + 66.975657119 19.310273085 67.128498621 19.101646852 67.215869654 17.677016972 66.844371923 16.929540304 - 66.547416384 17.368041687 + 66.547416394 17.368041682 } 8308e1fffffffff { @@ -13535,13 +14051,13 @@ 67.385690800 21.353092284 67.493319804 19.908830337 67.128498621 19.101646852 - 66.975657114 19.310273087 + 66.975657119 19.310273085 } 8308e4fffffffff { 65.969658559 16.603052945 66.367682264 17.448324918 - 66.547416399 17.368041676 + 66.547416394 17.368041682 66.844371923 16.929540304 66.912504727 15.528131024 66.535682352 14.838561789 @@ -13887,11 +14403,11 @@ { 64.952609910 1.956649836 64.708160589 0.846729095 - 64.346492523 0.689162787 + 64.346492533 0.689162784 64.175392686 0.750166812 63.899986598 1.862822152 64.132127473 2.801726056 - 64.473213156 2.700256400 + 64.473213146 2.700256403 64.651399478 2.792865385 } 830919fffffffff @@ -13916,7 +14432,7 @@ { 64.879461597 3.900668983 64.651399478 2.792865385 - 64.473213141 2.700256404 + 64.473213146 2.700256403 64.132127473 2.801726056 63.843410459 3.881200058 64.061317015 4.816728415 @@ -13930,7 +14446,7 @@ 64.189778076 -1.333560489 63.928569884 -0.189680032 64.175392686 0.750166812 - 64.346492539 0.689162786 + 64.346492533 0.689162784 } 83091dfffffffff { @@ -14080,11 +14596,11 @@ { 64.098585787 -7.366506597 63.773253415 -8.411179078 - 63.394706714 -8.432200330 + 63.394706724 -8.432200336 63.221674244 -8.327620868 63.011885686 -7.124206356 63.315653493 -6.218681702 - 63.661834999 -6.408393598 + 63.661834989 -6.408393593 63.849548840 -6.382778782 } 830931fffffffff @@ -14109,7 +14625,7 @@ { 64.157402952 -5.326961670 63.849548840 -6.382778782 - 63.661834983 -6.408393590 + 63.661834989 -6.408393593 63.315653493 -6.218681702 63.089488448 -5.036794392 63.377736565 -4.123775231 @@ -14123,7 +14639,7 @@ 63.095054078 -10.444977545 62.902233736 -9.223101583 63.221674244 -8.327620868 - 63.394706730 -8.432200335 + 63.394706724 -8.432200336 } 830935fffffffff { @@ -14275,11 +14791,11 @@ 67.876313309 8.211625588 68.289009946 8.793386260 68.701366013 7.878213536 - 68.691948104 6.865717848 + 68.691948105 6.865717878 68.628450372 6.423080120 68.090149790 6.008844669 67.749167522 6.878349380 - 67.873998758 7.726905623 + 67.873998758 7.726905594 } 830951fffffffff { @@ -14294,7 +14810,7 @@ { 67.468734219 9.080454139 67.876313309 8.211625588 - 67.873998756 7.726905582 + 67.873998758 7.726905594 67.749167522 6.878349380 67.217041720 6.471166227 66.880843319 7.295065633 @@ -14326,7 +14842,7 @@ 69.518305745 5.923714581 68.973903067 5.502968789 68.628450372 6.423080120 - 68.691948105 6.865717893 + 68.691948105 6.865717878 } 830956fffffffff { @@ -14405,11 +14921,11 @@ 71.633526947 3.728799826 72.096742067 4.319120712 72.507661118 3.054972697 - 72.461117313 1.806332146 + 72.461117315 1.806332183 72.386609007 1.266276564 71.813581691 0.913709302 71.469696404 2.106505786 - 71.614243838 3.135420781 + 71.614243837 3.135420745 } 830961fffffffff { @@ -14424,7 +14940,7 @@ { 71.224470269 4.910441519 71.633526947 3.728799826 - 71.614243835 3.135420730 + 71.614243837 3.135420745 71.469696404 2.106505786 70.902567984 1.747241335 70.560486954 2.861258549 @@ -14456,7 +14972,7 @@ 73.310223685 0.325610352 72.731464443 -0.015975588 72.386609007 1.266276564 - 72.461117315 1.806332202 + 72.461117315 1.806332183 } 830966fffffffff { @@ -14662,18 +15178,18 @@ { 61.368628237 7.212155346 60.838369569 7.289601452 - 60.628214300 7.907441437 + 60.628214302 7.907441417 60.580852095 8.246730660 60.908292837 9.175215135 61.378607944 9.084960469 - 61.473843211 8.394031135 + 61.473843208 8.394031155 61.580056849 8.082549847 } 830989fffffffff { 62.103538779 8.014812996 61.580056849 8.082549847 - 61.473843207 8.394031165 + 61.473843208 8.394031155 61.378607944 9.084960469 61.696710151 10.037981886 62.160063304 9.954471928 @@ -14723,24 +15239,24 @@ 59.767180203 7.438464343 60.103617706 8.343159825 60.580852095 8.246730660 - 60.628214306 7.907441408 + 60.628214302 7.907441417 } 830990fffffffff { 57.396841771 5.243918230 56.836641819 5.339442250 - 56.634768585 5.923515001 + 56.634768588 5.923514982 56.585499208 6.236768296 56.943587737 7.076616971 57.449891071 6.974928988 - 57.548297937 6.337434290 + 57.548297934 6.337434309 57.650466274 6.042789400 } 830991fffffffff { 58.204311001 5.954742879 57.650466274 6.042789400 - 57.548297932 6.337434319 + 57.548297934 6.337434309 57.449891071 6.974928988 57.799925211 7.835909891 58.299456634 7.739212530 @@ -14790,7 +15306,7 @@ 55.706768465 5.523646549 56.072529667 6.343020855 56.585499208 6.236768296 - 56.634768591 5.923514973 + 56.634768588 5.923514982 } 830998fffffffff { @@ -15049,11 +15565,11 @@ { 64.037429132 88.544748283 63.833282621 89.913199993 - 64.094281969 90.599788410 + 64.094281962 90.599788390 64.222477611 90.950093730 64.828368606 90.631498905 65.039089188 89.217635232 - 64.771569290 88.520659437 + 64.771569298 88.520659457 64.637633659 88.175026879 } 830a01fffffffff @@ -15073,7 +15589,7 @@ 63.389047393 92.577383075 63.995051031 92.308519152 64.222477611 90.950093730 - 64.094281958 90.599788379 + 64.094281962 90.599788390 } 830a03fffffffff { @@ -15097,7 +15613,7 @@ { 64.825700838 86.753466943 64.637633659 88.175026879 - 64.771569302 88.520659468 + 64.771569298 88.520659457 65.039089188 89.217635232 65.643696909 88.843886136 65.836160019 87.372964346 @@ -16130,11 +16646,11 @@ { 57.161119139 103.618252014 56.849237711 104.568232070 - 57.054573408 105.171018116 + 57.054573403 105.171018096 57.135123862 105.505567552 57.720562078 105.547548494 58.061478930 104.552717125 - 57.891724319 103.872295119 + 57.891724324 103.872295139 57.787219727 103.564385329 } 830a99fffffffff @@ -16154,7 +16670,7 @@ 56.210610738 106.403495638 56.789164948 106.461804776 57.135123862 105.505567552 - 57.054573400 105.171018087 + 57.054573403 105.171018096 } 830a9bfffffffff { @@ -16178,7 +16694,7 @@ { 58.094646116 102.576009375 57.787219727 103.564385329 - 57.891724327 103.872295149 + 57.891724324 103.872295139 58.061478930 104.552717125 58.653403442 104.576185180 58.988341304 103.540325049 @@ -16260,11 +16776,11 @@ { 60.782750536 96.946232245 60.510786637 98.091598505 - 60.740128315 98.745707315 + 60.740128309 98.745707294 60.843094314 99.096608363 61.448090995 98.997959006 61.737908535 97.806243305 - 61.521801310 97.097445449 + 61.521801317 97.097445470 61.404507325 96.764777881 } 830aa9fffffffff @@ -16284,7 +16800,7 @@ 59.942286411 100.308842325 60.543023709 100.240003081 60.843094314 99.096608363 - 60.740128305 98.745707284 + 60.740128309 98.745707294 } 830aabfffffffff { @@ -16308,7 +16824,7 @@ { 61.666781269 95.571960590 61.404507325 96.764777881 - 61.521801320 97.097445481 + 61.521801317 97.097445470 61.737908535 97.806243305 62.346459319 97.674084760 62.624759728 96.431386002 @@ -17399,11 +17915,11 @@ { 66.686837207 78.166705539 66.581371866 79.749980311 - 66.880413966 80.423087994 + 66.880413957 80.423087975 67.034320036 80.739385795 67.612894656 80.106488931 67.714666745 78.486922764 - 67.396294755 77.877232769 + 67.396294764 77.877232787 67.242866550 77.545280894 } 830b51fffffffff @@ -17423,7 +17939,7 @@ 66.323649283 82.867209441 66.909003834 82.307511042 67.034320036 80.739385795 - 66.880413953 80.423087965 + 66.880413957 80.423087975 } 830b53fffffffff { @@ -17447,7 +17963,7 @@ { 67.325717736 75.914802394 67.242866550 77.545280894 - 67.396294769 77.877232796 + 67.396294764 77.877232787 67.714666745 78.486922764 68.284718156 77.775076689 68.361417115 76.106131666 @@ -17529,11 +18045,11 @@ { 68.485849357 65.946678143 68.504738390 67.662229540 - 68.842700704 68.244090719 + 68.842700693 68.244090705 69.018109625 68.477077328 69.532434908 67.464767630 69.502628979 65.740545270 - 69.144398125 65.321489447 + 69.144398135 65.321489459 68.971911222 65.044977239 } 830b61fffffffff @@ -17553,7 +18069,7 @@ 68.489843937 71.099849161 69.019518554 70.175311378 69.018109625 68.477077328 - 68.842700688 68.244090697 + 68.842700693 68.244090705 } 830b63fffffffff { @@ -17577,7 +18093,7 @@ { 68.926102021 63.307738361 68.971911222 65.044977239 - 69.144398141 65.321489465 + 69.144398135 65.321489459 69.502628979 65.740545270 69.999556570 64.638456544 69.940553127 62.895964088 @@ -19679,11 +20195,11 @@ 830cd8fffffffff { 55.340695783 -162.596320335 - 55.013320106 -162.959904302 + 55.013320116 -162.959904291 54.837901661 -163.062371977 54.359753565 -162.427514808 54.403594783 -161.495024494 - 54.750693972 -161.283482382 + 54.750693963 -161.283482393 54.910585431 -161.096627888 55.369900146 -161.558999577 } @@ -19693,7 +20209,7 @@ 54.468963096 -159.650131331 54.928076613 -160.080345433 54.910585431 -161.096627888 - 54.750693957 -161.283482396 + 54.750693963 -161.283482393 54.403594783 -161.495024494 53.920013479 -160.888644661 } @@ -19739,7 +20255,7 @@ 55.255364289 -164.678141219 54.783472663 -164.014310064 54.837901661 -163.062371977 - 55.013320121 -162.959904286 + 55.013320116 -162.959904291 55.340695783 -162.596320335 55.799432825 -163.092301952 } @@ -20695,11 +21211,11 @@ 66.965953947 -134.735663803 66.626865356 -136.047672443 66.049845800 -136.025576519 - 65.893566243 -135.178487535 + 65.893566248 -135.178487560 65.777963867 -134.790653864 66.034658410 -133.572386044 66.647136224 -133.497699140 - 66.883182826 -134.298908306 + 66.883182821 -134.298908281 } 830d69fffffffff { @@ -20727,13 +21243,13 @@ 64.909224665 -135.984716456 65.169949435 -134.830785162 65.777963867 -134.790653864 - 65.893566250 -135.178487573 + 65.893566248 -135.178487560 } 830d6cfffffffff { 67.548440969 -134.722148713 66.965953947 -134.735663803 - 66.883182817 -134.298908269 + 66.883182821 -134.298908281 66.647136224 -133.497699140 66.898508250 -132.209481721 67.514810490 -132.094531910 @@ -26877,11 +27393,11 @@ 69.312577547 38.456969114 69.014055405 39.687895418 69.279835620 41.169016436 - 69.661813344 41.357612874 + 69.661813333 41.357612868 69.846455956 41.322718928 70.140588545 39.783292355 69.869154039 38.401702958 - 69.503673160 38.528409934 + 69.503673172 38.528409938 } 831169fffffffff { @@ -26909,13 +27425,13 @@ 69.774873164 44.257926868 70.095664694 42.758501179 69.846455956 41.322718928 - 69.661813327 41.357612865 + 69.661813333 41.357612868 } 83116cfffffffff { 69.026009402 37.024846861 69.312577547 38.456969114 - 69.503673177 38.528409936 + 69.503673172 38.528409938 69.869154039 38.401702958 70.136285194 36.830885209 69.844177578 35.509773275 @@ -27386,11 +27902,11 @@ { 52.252547842 32.382137078 51.883645788 33.178986176 - 52.006722076 33.787012730 + 52.006722070 33.787012714 52.096604944 34.059486424 52.713547622 34.124163534 53.055625327 33.353926198 - 52.870217776 32.805758093 + 52.870217782 32.805758109 52.807789035 32.497504156 } 8311b1fffffffff @@ -27410,7 +27926,7 @@ 51.127122714 34.739691660 51.745244219 34.812821276 52.096604944 34.059486424 - 52.006722069 33.787012705 + 52.006722070 33.787012714 } 8311b3fffffffff { @@ -27434,7 +27950,7 @@ { 53.168466253 31.683899824 52.807789035 32.497504156 - 52.870217785 32.805758118 + 52.870217782 32.805758109 53.055625327 33.353926198 53.670977010 33.409438389 54.003367775 32.621792794 @@ -28967,11 +29483,11 @@ 8312d8fffffffff { 49.362604020 -118.008689487 - 49.004765560 -118.198205699 + 49.004765570 -118.198205693 48.834839621 -118.348039635 48.370220936 -117.876210605 48.411409471 -116.954844613 - 48.749932576 -116.648693477 + 48.749932565 -116.648693483 48.927839454 -116.546731229 49.416475335 -117.125973566 } @@ -28981,7 +29497,7 @@ 48.471845105 -115.101051800 48.969051104 -115.661973119 48.927839454 -116.546731229 - 48.749932560 -116.648693487 + 48.749932565 -116.648693483 48.411409471 -116.954844613 47.936498245 -116.490851773 } @@ -29027,7 +29543,7 @@ 49.236415543 -119.747324456 48.782213870 -119.268152285 48.834839621 -118.348039635 - 49.004765576 -118.198205690 + 49.004765570 -118.198205693 49.362604020 -118.008689487 49.842161875 -118.605861352 } @@ -30487,11 +31003,11 @@ { 62.188050775 -139.156770290 61.644759223 -139.069876000 - 61.520917274 -138.341418287 + 61.520917281 -138.341418307 61.411879413 -138.008695329 61.666529527 -137.033520135 62.256916387 -137.046692687 - 62.478627924 -137.732352376 + 62.478627918 -137.732352355 62.544266633 -138.107167619 } 8313b1fffffffff @@ -30511,7 +31027,7 @@ 60.572677036 -138.907073918 60.827746632 -137.976175594 61.411879413 -138.008695329 - 61.520917283 -138.341418318 + 61.520917281 -138.341418307 } 8313b3fffffffff { @@ -30535,7 +31051,7 @@ { 63.094673950 -138.174736841 62.544266633 -138.107167619 - 62.478627914 -137.732352345 + 62.478627918 -137.732352355 62.256916387 -137.046692687 62.510374984 -136.023766206 63.106673602 -136.014663680 @@ -32068,11 +32584,11 @@ 8314d8fffffffff { 49.620257956 140.027016629 - 49.280590967 140.284499666 + 49.280590977 140.284499659 49.090880082 140.362190857 48.981520994 141.199421890 49.442002875 141.819316491 - 49.824421098 141.669815850 + 49.824421088 141.669815858 49.997180552 141.546477512 50.068583638 140.590500019 } @@ -32082,7 +32598,7 @@ 50.356260681 143.099653722 50.440839771 142.136420398 49.997180552 141.546477512 - 49.824421082 141.669815860 + 49.824421088 141.669815858 49.442002875 141.819316491 49.322846985 142.670541856 } @@ -32128,7 +32644,7 @@ 48.726226139 138.943202529 48.626098430 139.765835973 49.090880082 140.362190857 - 49.280590982 140.284499655 + 49.280590977 140.284499659 49.620257956 140.027016629 49.678922759 139.079548692 } @@ -33588,11 +34104,11 @@ { 49.554311259 113.145638825 49.223078451 113.810205556 - 49.398802150 114.306360806 + 49.398802147 114.306360788 49.445064239 114.594002514 49.962334763 114.771927557 50.342133585 114.066419040 - 50.243974785 113.479391921 + 50.243974788 113.479391938 50.155321598 113.225660328 } 8315b1fffffffff @@ -33612,7 +34128,7 @@ 48.558604636 115.095431309 49.066901629 115.276547308 49.445064239 114.594002514 - 49.398802145 114.306360781 + 49.398802147 114.306360788 } 8315b3fffffffff { @@ -33636,7 +34152,7 @@ { 50.488781494 112.538101236 50.155321598 113.225660328 - 50.243974790 113.479391947 + 50.243974788 113.479391938 50.342133585 114.066419040 50.868313428 114.240531930 51.249314568 113.510676628 @@ -33654,11 +34170,11 @@ 831600fffffffff { 55.516941709 162.584207588 - 55.118655734 162.615157909 + 55.118655746 162.615157908 54.919418305 162.627913408 54.651412652 163.599769435 54.976077718 164.546784927 - 55.374699587 164.535371761 + 55.374699575 164.535371761 55.574062616 164.532112521 55.849471511 163.543731040 } @@ -33668,7 +34184,7 @@ 55.600195203 166.478348090 55.890792701 165.510136325 55.574062616 164.532112521 - 55.374699569 164.535371761 + 55.374699575 164.535371761 54.976077718 164.546784927 54.692599747 165.512745071 } @@ -33714,7 +34230,7 @@ 54.832935203 160.721538232 54.580386104 161.697056274 54.919418305 162.627913408 - 55.118655752 162.615157907 + 55.118655746 162.615157908 55.516941709 162.584207588 55.776648677 161.577950455 } @@ -34420,11 +34936,11 @@ 831668fffffffff { 56.669717180 -179.459570825 - 56.285872292 -179.655079950 + 56.285872303 -179.655079944 56.093728468 -179.707919914 55.699117388 -178.839414231 55.874570612 -177.811405966 - 56.256424936 -177.692465646 + 56.256424925 -177.692465652 56.445858276 -177.583669605 56.847895547 -178.358813082 } @@ -34434,7 +34950,7 @@ 56.196522246 -175.748218768 56.606903520 -176.487494475 56.445858276 -177.583669605 - 56.256424919 -177.692465654 + 56.256424925 -177.692465652 55.874570612 -177.811405966 55.467472191 -176.967150592 } @@ -34480,18 +34996,18 @@ 56.284138315 178.368337432 55.902707439 179.259786914 56.093728468 -179.707919914 - 56.285872309 -179.655079941 + 56.285872303 -179.655079944 56.669717180 -179.459570825 57.062358566 179.729717668 } 831670fffffffff { 56.423563925 171.490097151 - 56.026033073 171.407650370 + 56.026033085 171.407650372 55.828830219 171.387666146 55.495179219 172.330700712 55.746946162 173.341547156 - 56.140142107 173.396231356 + 56.140142096 173.396231353 56.337705009 173.449982340 56.682779006 172.545250665 } @@ -34501,7 +35017,7 @@ 56.221894163 175.387361161 56.579424439 174.512780777 56.337705009 173.449982340 - 56.140142090 173.396231352 + 56.140142096 173.396231353 55.746946162 173.341547156 55.398495678 174.268514934 } @@ -34547,7 +35063,7 @@ 55.879648706 169.426383542 55.561169586 170.383422174 55.828830219 171.387666146 - 56.026033091 171.407650374 + 56.026033085 171.407650372 56.423563925 171.490097151 56.755302843 170.556742500 } @@ -36382,11 +36898,11 @@ 831788fffffffff { 54.001871367 154.220635410 - 53.615002928 154.350427756 + 53.615002939 154.350427752 53.416699749 154.391596829 53.211400089 155.347514042 53.597791549 156.196394647 - 53.995782272 156.125873522 + 53.995782260 156.125873526 54.190700600 156.071385103 54.392231556 155.052474077 } @@ -36396,7 +36912,7 @@ 54.350969803 157.938518781 54.568538782 156.928551206 54.190700600 156.071385103 - 53.995782254 156.125873527 + 53.995782260 156.125873526 53.597791549 156.196394647 53.377990442 157.155814973 } @@ -36442,18 +36958,18 @@ 53.210024078 152.614348899 53.018886503 153.564917105 53.416699749 154.391596829 - 53.615002945 154.350427750 + 53.615002939 154.350427752 54.001871367 154.220635410 54.187269685 153.195125821 } 831790fffffffff { 51.989629349 146.664877952 - 51.623501313 146.870546509 + 51.623501324 146.870546503 51.428597839 146.933453144 51.277154840 147.839693459 51.709248331 148.574192274 - 52.101400034 148.457180844 + 52.101400023 148.457180850 52.286863677 148.362239404 52.418516959 147.358975220 } @@ -36463,7 +36979,7 @@ 52.560388352 150.087844163 52.707211167 149.083932744 52.286863677 148.362239404 - 52.101400017 148.457180852 + 52.101400023 148.457180850 51.709248331 148.574192274 51.545418656 149.490691864 } @@ -36509,7 +37025,7 @@ 51.128254500 145.328516069 50.988676448 146.223291839 51.428597839 146.933453144 - 51.623501330 146.870546500 + 51.623501324 146.870546503 51.989629349 146.664877952 52.106354802 145.664140735 } @@ -39295,11 +39811,11 @@ 53.422987954 4.302501516 53.128505461 3.565733201 52.541668851 3.673240151 - 52.349359072 4.225480529 + 52.349359077 4.225480513 52.296998884 4.515847675 52.680560065 5.280447931 53.221432683 5.171662267 - 53.325468572 4.581169708 + 53.325468566 4.581169724 } 831969fffffffff { @@ -39327,13 +39843,13 @@ 51.360376196 3.881133560 51.750065902 4.628032082 52.296998884 4.515847675 - 52.349359080 4.225480504 + 52.349359077 4.225480513 } 83196cfffffffff { 54.004225457 4.200825177 53.422987954 4.302501516 - 53.325468564 4.581169733 + 53.325468566 4.581169724 53.221432683 5.171662267 53.598437304 5.954532067 54.133065316 5.849466619 @@ -39804,11 +40320,11 @@ { 60.389468411 -25.063565507 59.917715267 -25.850771145 - 59.538995347 -25.631742407 + 59.538995357 -25.631742417 59.368778055 -25.465010119 59.305637291 -24.259132326 59.749860897 -23.532718782 - 60.092211203 -23.855615589 + 60.092211193 -23.855615580 60.282464171 -23.953589910 } 8319b1fffffffff @@ -39828,7 +40344,7 @@ 58.956958467 -27.365250306 58.911055654 -26.167427513 59.368778055 -25.465010119 - 59.538995362 -25.631742420 + 59.538995357 -25.631742417 } 8319b3fffffffff { @@ -39852,7 +40368,7 @@ { 60.739409499 -23.138038999 60.282464171 -23.953589910 - 60.092211188 -23.855615575 + 60.092211193 -23.855615580 59.749860897 -23.532718782 59.669230804 -22.321430887 60.099496728 -21.572056957 @@ -39871,11 +40387,11 @@ { 50.639998680 -45.172024561 50.056649972 -45.565047312 - 49.739567518 -45.189879373 + 49.739567528 -45.189879384 49.579689924 -45.005869756 49.676854581 -44.058659533 50.254995322 -43.650449399 - 50.577005393 -44.019336407 + 50.577005384 -44.019336396 50.738443387 -44.203878636 } 831a01fffffffff @@ -39895,7 +40411,7 @@ 48.891066524 -46.320010262 48.996929641 -45.393589279 49.579689924 -45.005869756 - 49.739567533 -45.189879389 + 49.739567528 -45.189879384 } 831a03fffffffff { @@ -39919,7 +40435,7 @@ { 51.317046193 -43.786886274 50.738443387 -44.203878636 - 50.577005379 -44.019336391 + 50.577005384 -44.019336396 50.254995322 -43.650449399 50.342722702 -42.682671505 50.915545555 -42.253362533 @@ -40952,11 +41468,11 @@ { 42.706884127 -54.214088859 42.126555434 -54.441167757 - 41.865008365 -54.056297552 + 41.865008374 -54.056297562 41.712013908 -53.886057632 41.847927792 -53.121827008 42.446515159 -52.860574742 - 42.754664488 -53.204363471 + 42.754664479 -53.204363461 42.888509830 -53.396542374 } 831a99fffffffff @@ -40976,7 +41492,7 @@ 40.975558199 -54.879012779 41.114398698 -54.133089316 41.712013908 -53.886057632 - 41.865008378 -54.056297567 + 41.865008374 -54.056297562 } 831a9bfffffffff { @@ -41000,7 +41516,7 @@ { 43.470070086 -53.153082429 42.888509830 -53.396542374 - 42.754664474 -53.204363456 + 42.754664479 -53.204363461 42.446515159 -52.860574742 42.578930741 -52.077728466 43.177957448 -51.801629253 @@ -41082,11 +41598,11 @@ { 46.731969922 -50.060116412 46.143503139 -50.360614784 - 45.853978957 -49.975108905 + 45.853978966 -49.975108915 45.697533526 -49.796905868 45.820470495 -48.945098132 46.415375459 -48.617759661 - 46.730451673 -48.976627465 + 46.730451663 -48.976627455 46.878282055 -49.168007854 } 831aa9fffffffff @@ -41106,7 +41622,7 @@ 44.972462672 -50.938835076 45.100992650 -50.106994001 45.697533526 -49.796905868 - 45.853978970 -49.975108921 + 45.853978966 -49.975108915 } 831aabfffffffff { @@ -41130,7 +41646,7 @@ { 47.465224625 -48.847484119 46.878282055 -49.168007854 - 46.730451659 -48.976627449 + 46.730451663 -48.976627455 46.415375459 -48.617759661 46.532038957 -47.745852041 47.124674113 -47.400595525 @@ -42221,11 +42737,11 @@ { 54.305936790 -39.429253212 53.743116956 -39.936054164 - 53.400513519 -39.587841664 + 53.400513529 -39.587841675 53.237115544 -39.402066285 53.294284757 -38.356580694 53.841519585 -37.852219803 - 54.170629915 -38.222001483 + 54.170629905 -38.222001472 54.344437097 -38.390730954 } 831b51fffffffff @@ -42245,7 +42761,7 @@ 52.612941455 -40.908619446 52.682092846 -39.883008319 53.237115544 -39.402066285 - 53.400513534 -39.587841680 + 53.400513529 -39.587841675 } 831b53fffffffff { @@ -42269,7 +42785,7 @@ { 54.899008097 -37.856350083 54.344437097 -38.390730954 - 54.170629900 -38.222001466 + 54.170629905 -38.222001472 53.841519585 -37.852219803 53.885997547 -36.787686708 54.424738602 -36.259552231 @@ -42351,11 +42867,11 @@ { 57.597883921 -32.735384192 57.072290238 -33.376097579 - 56.708299960 -33.078048267 + 56.708299970 -33.078048278 56.541343926 -32.897093915 56.544343039 -31.760226585 57.046497948 -31.147120474 - 57.382661120 -31.503386324 + 57.382661110 -31.503386314 57.566501101 -31.644074144 } 831b61fffffffff @@ -42375,7 +42891,7 @@ 56.010300300 -34.606008043 56.028319620 -33.485147915 56.541343926 -32.897093915 - 56.708299975 -33.078048282 + 56.708299970 -33.078048278 } 831b63fffffffff { @@ -42399,7 +42915,7 @@ { 58.080350535 -30.973732875 57.566501101 -31.644074144 - 57.382661105 -31.503386308 + 57.382661110 -31.503386314 57.046497948 -31.147120474 57.033923610 -29.995937355 57.524575711 -29.357969498 @@ -42985,21 +43501,21 @@ 831c00fffffffff { 50.533827142 -143.601655315 - 50.306661623 -144.031945825 + 50.306661630 -144.031945813 50.159869212 -144.155631118 - 49.829344181 -143.949729085 + 49.829344191 -143.949729091 49.708377213 -143.772015622 - 49.729485517 -143.222289746 + 49.729485516 -143.222289763 49.799744366 -142.988158353 - 50.143581858 -142.844448066 + 50.143581848 -142.844448070 50.309188952 -142.874989673 - 50.502579457 -143.344037348 + 50.502579451 -143.344037334 } 831c02fffffffff { 49.308352939 -144.064037905 49.708377213 -143.772015622 - 49.829344196 -143.949729094 + 49.829344191 -143.949729091 50.159869212 -144.155631118 50.213163881 -144.841994916 49.765326306 -145.209009789 @@ -43013,13 +43529,13 @@ 48.970551942 -142.715064822 49.490783499 -142.498522446 49.799744366 -142.988158353 - 49.729485516 -143.222289771 + 49.729485516 -143.222289763 } 831c04fffffffff { 50.969180371 -143.728519139 50.533827142 -143.601655315 - 50.502579448 -143.344037326 + 50.502579451 -143.344037334 50.309188952 -142.874989673 50.514297468 -142.259375860 51.017608371 -142.344735051 @@ -43031,7 +43547,7 @@ 50.214791889 -141.556666302 50.514297468 -142.259375860 50.309188952 -142.874989673 - 50.143581843 -142.844448073 + 50.143581848 -142.844448070 49.799744366 -142.988158353 49.490783499 -142.498522446 } @@ -43041,10 +43557,75 @@ 50.710755838 -145.167886625 50.213163881 -144.841994916 50.159869212 -144.155631118 - 50.306661633 -144.031945806 + 50.306661630 -144.031945813 50.533827142 -143.601655315 50.969180371 -143.728519139 } +831c08fffffffff +{ + 48.727074315 -140.311737076 + 49.252650228 -140.071015424 + 49.579047377 -140.565181492 + 49.379169625 -141.293037523 + 48.856185182 -141.521616727 + 48.530470222 -141.034484616 +} +831c09fffffffff +{ + 48.582628070 -139.086184792 + 49.110626063 -138.833247495 + 49.446067383 -139.329017257 + 49.252650228 -140.071015424 + 48.727074315 -140.311737076 + 48.392475518 -139.822687701 +} +831c0afffffffff +{ + 48.002674547 -141.263103438 + 48.530470222 -141.034484616 + 48.856185182 -141.521616727 + 48.653505714 -142.230266154 + 48.391283331 -142.339144876 + 48.187266014 -142.485277609 + 47.803388717 -141.967051673 +} +831c0bfffffffff +{ + 47.862031640 -140.063200403 + 48.392475518 -139.822687701 + 48.727074315 -140.311737076 + 48.530470222 -141.034484616 + 48.002674547 -141.263103438 + 47.668819096 -140.780872616 +} +831c0cfffffffff +{ + 49.579047377 -140.565181492 + 50.099632296 -140.324299361 + 50.259441452 -140.573848115 + 50.413749743 -140.924702656 + 50.214791889 -141.556666302 + 49.696737225 -141.785151072 + 49.379169625 -141.293037523 +} +831c0dfffffffff +{ + 49.446067383 -139.329017257 + 49.969012615 -139.075654930 + 50.296199561 -139.576761037 + 50.099632296 -140.324299361 + 49.579047377 -140.565181492 + 49.252650228 -140.071015424 +} +831c0efffffffff +{ + 48.856185182 -141.521616727 + 49.379169625 -141.293037523 + 49.696737225 -141.785151072 + 49.490783499 -142.498522446 + 48.970551942 -142.715064822 + 48.653505714 -142.230266154 +} 831c10fffffffff { 49.353742363 -146.264408204 @@ -43370,6 +43951,457 @@ 52.399404057 -144.964122589 52.854997236 -145.121736536 } +831c40fffffffff +{ + 48.749516531 -134.240563932 + 49.280065175 -133.937196675 + 49.645232139 -134.440209980 + 49.478414905 -135.241304396 + 48.949479353 -135.532236884 + 48.585725760 -135.034561408 +} +831c41fffffffff +{ + 48.531452824 -132.937710772 + 49.063414705 -132.622022499 + 49.438510264 -133.124163938 + 49.280065175 -133.937196675 + 48.749516531 -134.240563932 + 48.375977326 -133.743281999 +} +831c42fffffffff +{ + 48.051549303 -135.324229647 + 48.585725760 -135.034561408 + 48.949479353 -135.532236884 + 48.777726700 -136.314034290 + 48.245421933 -136.591482225 + 47.882977663 -136.099394321 +} +831c43fffffffff +{ + 47.840124408 -134.045094930 + 48.375977326 -133.743281999 + 48.749516531 -134.240563932 + 48.585725760 -135.034561408 + 48.051549303 -135.324229647 + 47.679466233 -134.832096698 +} +831c44fffffffff +{ + 49.645232139 -134.440209980 + 50.170343862 -134.135298201 + 50.349490457 -134.389462788 + 50.528350321 -134.736658374 + 50.357378288 -135.452457156 + 49.833810960 -135.744634673 + 49.478414905 -135.241304396 +} +831c45fffffffff +{ + 49.438510264 -133.124163938 + 49.964966112 -132.806628852 + 50.331656484 -133.314686764 + 50.170343862 -134.135298201 + 49.645232139 -134.440209980 + 49.280065175 -133.937196675 +} +831c46fffffffff +{ + 48.949479353 -135.532236884 + 49.478414905 -135.241304396 + 49.833810960 -135.744634673 + 49.658985816 -136.533151794 + 49.131858837 -136.811578029 + 48.777726700 -136.314034290 +} +831c48fffffffff +{ + 47.362667134 -131.455737596 + 47.901270110 -131.130024936 + 48.294802134 -131.624895184 + 48.147981101 -132.441360610 + 47.610651474 -132.755202072 + 47.218848348 -132.264521579 +} +831c49fffffffff +{ + 47.095745041 -130.147945012 + 47.635415370 -129.810559868 + 48.039114516 -130.303395408 + 47.901270110 -131.130024936 + 47.362667134 -131.455737596 + 46.960820242 -130.966575607 +} +831c4afffffffff +{ + 46.676306640 -132.576517570 + 47.218848348 -132.264521579 + 47.610651474 -132.755202072 + 47.458249113 -133.553427134 + 46.917241399 -133.853677652 + 46.527082048 -133.367509946 +} +831c4bfffffffff +{ + 46.416948311 -131.290159418 + 46.960820242 -130.966575607 + 47.362667134 -131.455737596 + 47.218848348 -132.264521579 + 46.676306640 -132.576517570 + 46.276233448 -132.091388603 +} +831c4cfffffffff +{ + 48.294802134 -131.624895184 + 48.827973981 -131.297042641 + 49.213137238 -131.797746470 + 49.063414705 -132.622022499 + 48.531452824 -132.937710772 + 48.147981101 -132.441360610 +} +831c4dfffffffff +{ + 48.039114516 -130.303395408 + 48.573290654 -129.963578611 + 48.968640257 -130.462271656 + 48.827973981 -131.297042641 + 48.294802134 -131.624895184 + 47.901270110 -131.130024936 +} +831c4efffffffff +{ + 47.610651474 -132.755202072 + 48.147981101 -132.441360610 + 48.531452824 -132.937710772 + 48.375977326 -133.743281999 + 47.840124408 -134.045094930 + 47.458249113 -133.553427134 +} +831c50fffffffff +{ + 47.534065519 -137.618708166 + 48.069291032 -137.354248599 + 48.422265887 -137.845795873 + 48.238939136 -138.595656729 + 47.706016143 -138.848127499 + 47.354099584 -138.362748413 +} +831c51fffffffff +{ + 47.345633144 -136.375838169 + 47.882977663 -136.099394321 + 48.245421933 -136.591482225 + 48.069291032 -137.354248599 + 47.534065519 -137.618708166 + 47.172833271 -137.132417410 +} +831c52fffffffff +{ + 46.816394446 -138.614713881 + 47.354099584 -138.362748413 + 47.706016143 -138.848127499 + 47.519244396 -139.579181191 + 46.984070147 -139.819439376 + 46.633121032 -139.340365386 +} +831c53fffffffff +{ + 46.632773857 -137.396113558 + 47.172833271 -137.132417410 + 47.534065519 -137.618708166 + 47.354099584 -138.362748413 + 46.816394446 -138.614713881 + 46.456284261 -138.134392952 +} +831c54fffffffff +{ + 48.422265887 -137.845795873 + 48.952509115 -137.580604312 + 49.297199325 -138.077506749 + 49.110626063 -138.833247495 + 48.582628070 -139.086184792 + 48.238939136 -138.595656729 +} +831c55fffffffff +{ + 48.245421933 -136.591482225 + 48.777726700 -136.314034290 + 49.131858837 -136.811578029 + 48.952509115 -137.580604312 + 48.422265887 -137.845795873 + 48.069291032 -137.354248599 +} +831c56fffffffff +{ + 47.706016143 -138.848127499 + 48.238939136 -138.595656729 + 48.582628070 -139.086184792 + 48.392475518 -139.822687701 + 47.862031640 -140.063200403 + 47.519244396 -139.579181191 +} +831c58fffffffff +{ + 46.215612448 -134.920873929 + 46.759823192 -134.633783727 + 47.140192479 -135.120483532 + 46.974911745 -135.889101876 + 46.432681674 -136.164518076 + 46.053733473 -135.683031687 +} +831c59fffffffff +{ + 45.981086258 -133.666191555 + 46.527082048 -133.367509946 + 46.917241399 -133.853677652 + 46.759823192 -134.633783727 + 46.215612448 -134.920873929 + 45.827016203 -134.439500698 +} +831c5afffffffff +{ + 45.506788564 -135.957398767 + 46.053733473 -135.683031687 + 46.432681674 -136.164518076 + 46.263326126 -136.914982886 + 45.718597181 -137.177886529 + 45.340991291 -136.701821678 +} +831c5bfffffffff +{ + 45.278045820 -134.725280834 + 45.827016203 -134.439500698 + 46.215612448 -134.920873929 + 46.053733473 -135.683031687 + 45.506788564 -135.957398767 + 45.119679965 -135.481063031 +} +831c5cfffffffff +{ + 47.140192479 -135.120483532 + 47.679466233 -134.832096698 + 48.051549303 -135.324229647 + 47.882977663 -136.099394321 + 47.345633144 -136.375838169 + 46.974911745 -135.889101876 +} +831c5dfffffffff +{ + 46.917241399 -133.853677652 + 47.458249113 -133.553427134 + 47.840124408 -134.045094930 + 47.679466233 -134.832096698 + 47.140192479 -135.120483532 + 46.759823192 -134.633783727 +} +831c5efffffffff +{ + 46.432681674 -136.164518076 + 46.974911745 -135.889101876 + 47.345633144 -136.375838169 + 47.172833271 -137.132417410 + 46.632773857 -137.396113558 + 46.263326126 -136.914982886 +} +831c60fffffffff +{ + 51.944290263 -135.406586872 + 51.411251061 -135.422348945 + 51.056536677 -134.710723162 + 51.228012015 -133.970724108 + 51.763520035 -133.932115172 + 52.125190773 -134.656391470 +} +831c61fffffffff +{ + 51.763520035 -133.932115172 + 51.228012015 -133.970724108 + 50.861988867 -133.266854754 + 51.024252572 -132.512664995 + 51.561746140 -132.451056622 + 51.935101422 -133.166646207 +} +831c62fffffffff +{ + 51.230985319 -136.147342583 + 50.705400076 -136.151566671 + 50.357378288 -135.452457156 + 50.528350321 -134.736658374 + 51.056536677 -134.710723162 + 51.411251061 -135.422348945 +} +831c63fffffffff +{ + 51.056536677 -134.710723162 + 50.528350321 -134.736658374 + 50.349490457 -134.389462788 + 50.170343862 -134.135298201 + 50.331656484 -133.314686764 + 50.861988867 -133.266854754 + 51.228012015 -133.970724108 +} +831c64fffffffff +{ + 52.831800906 -136.133857730 + 52.294232244 -136.138494522 + 51.944290263 -135.406586872 + 52.125190773 -134.656391470 + 52.665564604 -134.627915907 + 53.022340944 -135.373532234 +} +831c65fffffffff +{ + 52.665564604 -134.627915907 + 52.125190773 -134.656391470 + 51.763520035 -133.932115172 + 51.935101422 -133.166646207 + 52.477785727 -133.114123593 + 52.846691033 -133.851141565 +} +831c66fffffffff +{ + 52.104467628 -136.872578119 + 51.574361955 -136.865733056 + 51.230985319 -136.147342583 + 51.411251061 -135.422348945 + 51.944290263 -135.406586872 + 52.294232244 -136.138494522 +} +831c68fffffffff +{ + 49.884125281 -130.624685741 + 50.233033099 -130.395504688 + 50.411238013 -130.364574281 + 50.799640085 -131.050027351 + 50.646987311 -131.817527826 + 50.291845832 -131.864319386 + 50.117490732 -131.974410520 + 49.740733703 -131.467743932 +} +831c69fffffffff +{ + 49.631104521 -129.266924471 + 50.154511598 -128.909853810 + 50.553905883 -129.584702406 + 50.411238013 -130.364574281 + 50.233033099 -130.395504688 + 49.884125281 -130.624685741 + 49.497171654 -130.120002788 +} +831c6afffffffff +{ + 49.213137238 -131.797746470 + 49.740733703 -131.467743932 + 50.117490732 -131.974410520 + 49.964966112 -132.806628852 + 49.438510264 -133.124163938 + 49.063414705 -132.622022499 +} +831c6bfffffffff +{ + 48.968640257 -130.462271656 + 49.497171654 -130.120002788 + 49.884125281 -130.624685741 + 49.740733703 -131.467743932 + 49.213137238 -131.797746470 + 48.827973981 -131.297042641 +} +831c6cfffffffff +{ + 51.561746140 -132.451056622 + 51.024252572 -132.512664995 + 50.646987311 -131.817527826 + 50.799640085 -131.050027351 + 51.338619885 -130.965356901 + 51.723574941 -131.671226675 +} +831c6dfffffffff +{ + 51.338619885 -130.965356901 + 50.799640085 -131.050027351 + 50.411238013 -130.364574281 + 50.553905883 -129.584702406 + 51.093859304 -129.476998799 + 51.490287940 -130.172146675 +} +831c6efffffffff +{ + 50.861988867 -133.266854754 + 50.331656484 -133.314686764 + 49.964966112 -132.806628852 + 50.117490732 -131.974410520 + 50.291845832 -131.864319386 + 50.646987311 -131.817527826 + 51.024252572 -132.512664995 +} +831c70fffffffff +{ + 50.004785343 -137.036258169 + 50.352999278 -136.850552061 + 50.526132761 -136.852656026 + 50.863197794 -137.557753297 + 50.676059013 -138.243472104 + 50.332334214 -138.225647047 + 50.158719689 -138.313975612 + 49.822327507 -137.811617114 +} +831c71fffffffff +{ + 49.833810960 -135.744634673 + 50.357378288 -135.452457156 + 50.705400076 -136.151566671 + 50.526132761 -136.852656026 + 50.352999278 -136.850552061 + 50.004785343 -137.036258169 + 49.658985816 -136.533151794 +} +831c72fffffffff +{ + 49.297199325 -138.077506749 + 49.822327507 -137.811617114 + 50.158719689 -138.313975612 + 49.969012615 -139.075654930 + 49.446067383 -139.329017257 + 49.110626063 -138.833247495 +} +831c73fffffffff +{ + 49.131858837 -136.811578029 + 49.658985816 -136.533151794 + 50.004785343 -137.036258169 + 49.822327507 -137.811617114 + 49.297199325 -138.077506749 + 48.952509115 -137.580604312 +} +831c74fffffffff +{ + 51.521279104 -138.991955968 + 51.002184855 -138.953622201 + 50.676059013 -138.243472104 + 50.863197794 -137.557753297 + 51.385745476 -137.574976850 + 51.717791748 -138.299132183 +} +831c75fffffffff +{ + 51.385745476 -137.574976850 + 50.863197794 -137.557753297 + 50.526132761 -136.852656026 + 50.705400076 -136.151566671 + 51.230985319 -136.147342583 + 51.574361955 -136.865733056 +} +831c76fffffffff +{ + 50.807610888 -139.623378575 + 50.296199561 -139.576761037 + 49.969012615 -139.075654930 + 50.158719689 -138.313975612 + 50.332334214 -138.225647047 + 50.676059013 -138.243472104 + 51.002184855 -138.953622201 +} 831c80fffffffff { 46.536865696 -150.439434333 @@ -43565,11 +44597,11 @@ { 45.005442934 -152.111988751 44.488399559 -152.424240003 - 44.159095159 -152.162942119 + 44.159095166 -152.162942130 44.034702594 -151.983142098 44.136382014 -151.183685777 44.609611423 -150.920346718 - 44.858104124 -151.279967670 + 44.858104116 -151.279967659 45.023067846 -151.407520839 } 831c99fffffffff @@ -43585,7 +44617,7 @@ { 43.553394478 -152.242138876 44.034702594 -151.983142098 - 44.159095171 -152.162942134 + 44.159095166 -152.162942130 44.488399559 -152.424240003 44.461486636 -153.132761480 43.936034619 -153.438294123 @@ -43613,7 +44645,7 @@ { 45.531599660 -151.088715725 45.023067846 -151.407520839 - 44.858104112 -151.279967654 + 44.858104116 -151.279967659 44.609611423 -150.920346718 44.702686019 -150.117197422 45.167741537 -149.849641183 @@ -43695,11 +44727,11 @@ { 47.979982991 -148.019618511 47.501115928 -148.362801676 - 47.169682338 -148.126951068 + 47.169682345 -148.126951079 47.047178064 -147.947185424 47.113845514 -147.131332989 47.546283526 -146.851035715 - 47.791149201 -147.209637509 + 47.791149194 -147.209637498 47.956832787 -147.323972570 } 831ca9fffffffff @@ -43715,7 +44747,7 @@ { 46.606433002 -148.223622274 47.047178064 -147.947185424 - 47.169682350 -148.126951082 + 47.169682345 -148.126951079 47.501115928 -148.362801676 47.515589532 -149.064529122 47.027852110 -149.401516326 @@ -43743,7 +44775,7 @@ { 48.426811601 -146.974820333 47.956832787 -147.323972570 - 47.791149190 -147.209637493 + 47.791149194 -147.209637498 47.546283526 -146.851035715 47.603975361 -146.033552628 48.028091534 -145.749566583 @@ -43890,11 +44922,11 @@ 43.224611035 -139.610550366 42.772265926 -139.896402438 42.338314879 -139.410329027 - 42.351320447 -138.898304812 + 42.351320446 -138.898304827 42.407795383 -138.667940351 42.964025875 -138.429547181 43.347063936 -138.889658261 - 43.231071152 -139.352610367 + 43.231071153 -139.352610352 } 831cc9fffffffff { @@ -43922,7 +44954,7 @@ 41.457139817 -138.450291224 42.016953602 -138.212373245 42.407795383 -138.667940351 - 42.351320446 -138.898304835 + 42.351320446 -138.898304827 } 831cccfffffffff { @@ -43932,7 +44964,7 @@ 44.096166471 -139.813282939 43.651658805 -140.100493302 43.224611035 -139.610550366 - 43.231071155 -139.352610345 + 43.231071153 -139.352610352 } 831ccdfffffffff { @@ -44083,11 +45115,11 @@ 46.997920633 -141.744274274 46.575976220 -142.034291015 46.177516624 -141.524281296 - 46.193617913 -140.993302370 + 46.193617912 -140.993302386 46.257362525 -140.760616549 46.794368472 -140.532070893 47.136344782 -141.009479291 - 47.006133367 -141.476832967 + 47.006133367 -141.476832951 } 831ce1fffffffff { @@ -44115,7 +45147,7 @@ 45.365922636 -140.516391510 45.907298483 -140.287952998 46.257362525 -140.760616549 - 46.193617912 -140.993302394 + 46.193617912 -140.993302386 } 831ce4fffffffff { @@ -44125,7 +45157,7 @@ 47.803388717 -141.967051673 47.389097615 -142.258368592 46.997920633 -141.744274274 - 47.006133369 -141.476832945 + 47.006133367 -141.476832951 } 831ce5fffffffff { @@ -44468,11 +45500,11 @@ 54.286489164 -142.246656091 53.933474295 -142.987235701 53.467229499 -142.859599918 - 53.391139250 -142.296691652 + 53.391139253 -142.296691669 53.291569969 -142.040377139 53.514711599 -141.353525910 54.044207982 -141.433055498 - 54.245937510 -141.958441775 + 54.245937508 -141.958441758 } 831d19fffffffff { @@ -44500,13 +45532,13 @@ 52.549345843 -142.616433305 52.769719463 -141.953540109 53.291569969 -142.040377139 - 53.391139254 -142.296691677 + 53.391139253 -142.296691669 } 831d1cfffffffff { 54.760963157 -142.367317221 54.286489164 -142.246656091 - 54.245937505 -141.958441750 + 54.245937508 -141.958441758 54.044207982 -141.433055498 54.269852377 -140.720745462 54.806936923 -140.792000256 @@ -44661,11 +45693,11 @@ 58.299451374 -140.485087825 57.940295065 -141.355065370 57.434769044 -141.239417338 - 57.337161628 -140.603466794 + 57.337161631 -140.603466813 57.233210554 -140.313502898 57.474965932 -139.505720841 58.036736122 -139.562814427 - 58.247608231 -140.158697322 + 58.247608228 -140.158697303 } 831d31fffffffff { @@ -44693,13 +45725,13 @@ 56.438548380 -141.020668475 56.678659129 -140.244825521 57.233210554 -140.313502898 - 57.337161632 -140.603466822 + 57.337161631 -140.603466813 } 831d34fffffffff { 58.812914448 -140.589445869 58.299451374 -140.485087825 - 58.247608225 -140.158697294 + 58.247608228 -140.158697303 58.036736122 -139.562814427 58.279675191 -138.720857831 58.848494202 -138.764740747 @@ -44853,11 +45885,11 @@ 831d50fffffffff { 50.004785343 -137.036258169 - 50.352999288 -136.850552055 + 50.352999278 -136.850552061 50.526132761 -136.852656026 50.863197794 -137.557753297 50.676059013 -138.243472104 - 50.332334204 -138.225647053 + 50.332334214 -138.225647047 50.158719689 -138.313975612 49.822327507 -137.811617114 } @@ -44876,7 +45908,7 @@ 50.296199561 -139.576761037 49.969012615 -139.075654930 50.158719689 -138.313975612 - 50.332334219 -138.225647048 + 50.332334214 -138.225647047 50.676059013 -138.243472104 51.002184855 -138.953622201 } @@ -44904,7 +45936,7 @@ 50.357378288 -135.452457156 50.705400076 -136.151566671 50.526132761 -136.852656026 - 50.352999273 -136.850552064 + 50.352999278 -136.850552061 50.004785343 -137.036258169 49.658985816 -136.533151794 } @@ -44983,11 +46015,11 @@ 831d60fffffffff { 49.884125281 -130.624685741 - 50.233033110 -130.395504681 + 50.233033099 -130.395504688 50.411238013 -130.364574281 50.799640085 -131.050027351 50.646987311 -131.817527826 - 50.291845822 -131.864319392 + 50.291845832 -131.864319386 50.117490732 -131.974410520 49.740733703 -131.467743932 } @@ -45006,7 +46038,7 @@ 50.331656484 -133.314686764 49.964966112 -132.806628852 50.117490732 -131.974410520 - 50.291845837 -131.864319385 + 50.291845832 -131.864319386 50.646987311 -131.817527826 51.024252572 -132.512664995 } @@ -45034,7 +46066,7 @@ 50.154511598 -128.909853810 50.553905883 -129.584702406 50.411238013 -130.364574281 - 50.233033094 -130.395504692 + 50.233033099 -130.395504688 49.884125281 -130.624685741 49.497171654 -130.120002788 } @@ -45241,11 +46273,11 @@ 831d88fffffffff { 51.390789142 -148.428756626 - 51.699018574 -148.183467070 + 51.699018565 -148.183467077 51.824808798 -147.969673186 52.274051260 -148.173102256 52.341492225 -149.035497449 - 52.082855688 -149.462648925 + 52.082855698 -149.462648918 51.926914685 -149.584854609 51.425627153 -149.183915015 } @@ -45255,7 +46287,7 @@ 51.308098057 -146.946452909 51.752162699 -147.129982681 51.824808798 -147.969673186 - 51.699018560 -148.183467081 + 51.699018565 -148.183467077 51.390789142 -148.428756626 50.889974729 -148.049379197 } @@ -45301,18 +46333,18 @@ 52.458477604 -150.784850257 51.957238360 -150.361317111 51.926914685 -149.584854609 - 52.082855701 -149.462648912 + 52.082855698 -149.462648918 52.341492225 -149.035497449 52.795623101 -149.260205996 } 831d90fffffffff { 53.026168714 -154.517763094 - 53.353613197 -154.282957407 + 53.353613188 -154.282957414 53.496184994 -154.077159476 53.956949780 -154.397946153 53.983439416 -155.353352370 - 53.690704037 -155.760399376 + 53.690704047 -155.760399369 53.525076491 -155.876127315 53.028556015 -155.364554642 } @@ -45322,7 +46354,7 @@ 53.003879648 -152.850363286 53.461421222 -153.145028132 53.496184994 -154.077159476 - 53.353613183 -154.282957418 + 53.353613188 -154.282957414 53.026168714 -154.517763094 52.527512171 -154.031848279 } @@ -45368,7 +46400,7 @@ 54.013771481 -157.282770919 53.520078090 -156.744612782 53.525076491 -155.876127315 - 53.690704051 -155.760399363 + 53.690704047 -155.760399369 53.983439416 -155.353352370 54.446908566 -155.701829758 } @@ -48154,11 +49186,11 @@ 56.466512514 27.692852030 55.938523296 27.611710483 55.617699334 28.493034851 - 55.754492355 29.136477469 + 55.754492351 29.136477450 55.857751127 29.409693582 56.460969693 29.406914736 56.748190470 28.565768304 - 56.536202796 28.018444943 + 56.536202800 28.018444962 } 831f69fffffffff { @@ -48186,13 +49218,13 @@ 54.953381725 30.223065006 55.559583733 30.232702853 55.857751127 29.409693582 - 55.754492349 29.136477440 + 55.754492351 29.136477450 } 831f6cfffffffff { 56.777375309 26.793472783 56.466512514 27.692852030 - 56.536202803 28.018444970 + 56.536202800 28.018444962 56.748190470 28.565768304 57.348038165 28.549618060 57.623978872 27.689922180 @@ -48663,11 +49695,11 @@ { 48.594024857 2.120222080 47.985628122 2.235477955 - 47.804469182 2.758125934 + 47.804469185 2.758125918 47.748074592 3.028335191 48.150803633 3.728605139 48.723009675 3.615702848 - 48.834677757 3.066609886 + 48.834677754 3.066609902 48.926778743 2.802853302 } 831fb1fffffffff @@ -48687,7 +49719,7 @@ 46.763730506 2.458901717 47.170817271 3.143782666 47.748074592 3.028335191 - 47.804469188 2.758125910 + 47.804469185 2.758125918 } 831fb3fffffffff { @@ -48711,7 +49743,7 @@ { 49.530713614 2.692197127 48.926778743 2.802853302 - 48.834677752 3.066609910 + 48.834677754 3.066609902 48.723009675 3.615702848 49.120911301 4.331847881 49.687797455 4.221736013 @@ -53331,11 +54363,11 @@ 8322d8fffffffff { 55.395048380 -169.317939013 - 55.760901794 -169.145112217 + 55.760901783 -169.145112222 55.937100598 -168.990609410 56.377659477 -169.610371800 56.278788406 -170.701924053 - 55.919622010 -170.994443519 + 55.919622021 -170.994443514 55.735044507 -171.075750281 55.290986261 -170.316129644 } @@ -53345,7 +54377,7 @@ 56.051524196 -172.875282353 55.617409617 -172.087536687 55.735044507 -171.075750281 - 55.919622026 -170.994443509 + 55.919622021 -170.994443514 56.278788406 -170.701924053 56.714534041 -171.358659465 } @@ -53391,7 +54423,7 @@ 55.576645572 -167.330253966 56.021024237 -167.913869517 55.937100598 -168.990609410 - 55.760901778 -169.145112225 + 55.760901783 -169.145112222 55.395048380 -169.317939013 54.941891681 -168.586755364 } @@ -54851,11 +55883,11 @@ { 40.816184228 -155.072581023 41.328733959 -154.827515737 - 41.581617368 -155.184445820 + 41.581617359 -155.184445811 41.744269213 -155.322864513 41.684510709 -156.028231590 41.132915038 -156.308983390 - 40.808950168 -156.027007425 + 40.808950178 -156.027007433 40.682279854 -155.848971388 } 8323b1fffffffff @@ -54871,7 +55903,7 @@ { 42.288139445 -155.035240641 41.744269213 -155.322864513 - 41.581617355 -155.184445806 + 41.581617359 -155.184445811 41.328733959 -154.827515737 41.454839371 -154.045716239 41.959751376 -153.796089327 @@ -54899,7 +55931,7 @@ { 40.162279224 -156.089396698 40.682279854 -155.848971388 - 40.808950183 -156.027007437 + 40.808950178 -156.027007433 41.132915038 -156.308983390 41.063640283 -157.016506495 40.504517474 -157.290283156 @@ -56433,11 +57465,11 @@ 8324d8fffffffff { 36.558701030 106.581953132 - 36.171045437 106.584426517 + 36.171045448 106.584426517 35.991437927 106.639482679 35.785429308 107.339288647 36.116013623 107.874265768 - 36.473772718 107.766676309 + 36.473772707 107.766676308 36.666499859 107.769489370 36.905000306 107.178625548 } @@ -56447,7 +57479,7 @@ 36.761183814 108.943064931 37.004187467 108.365336774 36.666499859 107.769489370 - 36.473772702 107.766676310 + 36.473772707 107.766676308 36.116013623 107.874265768 35.903857290 108.567969472 } @@ -56493,7 +57525,7 @@ 35.852906634 105.397285072 35.653211821 106.102601356 35.991437927 106.639482679 - 36.171045454 106.584426517 + 36.171045448 106.584426517 36.558701030 106.581953132 36.792363053 105.978197530 } @@ -57449,11 +58481,11 @@ 53.986803881 108.939696800 53.368829488 108.911307494 53.039152219 109.702093331 - 53.227161404 110.249973290 + 53.227161399 110.249973274 53.288831773 110.561660757 53.843336742 110.689260120 54.212440776 109.855588583 - 54.082028832 109.219929875 + 54.082028838 109.219929892 } 832569fffffffff { @@ -57481,13 +58513,13 @@ 52.372411378 111.229822053 52.918589748 111.365474041 53.288831773 110.561660757 - 53.227161396 110.249973266 + 53.227161399 110.249973274 } 83256cfffffffff { 54.315948931 108.119042041 53.986803881 108.939696800 - 54.082028840 109.219929901 + 54.082028838 109.219929892 54.212440776 109.855588583 54.775074124 109.973937699 55.142383648 109.108518673 @@ -58018,11 +59050,11 @@ 832600fffffffff { 43.996432995 -97.754847600 - 43.689400295 -98.107447627 + 43.689400304 -98.107447616 43.536367485 -98.283947696 42.963822828 -97.953093699 42.848264751 -97.100674412 - 43.152203184 -96.747902680 + 43.152203175 -96.747902691 43.302853152 -96.568678752 43.879336779 -96.888172691 } @@ -58032,7 +59064,7 @@ 42.599408576 -95.412903173 43.176228627 -95.714151513 43.302853152 -96.568678752 - 43.152203171 -96.747902696 + 43.152203175 -96.747902691 42.848264751 -97.100674412 42.269946279 -96.781094745 } @@ -58078,7 +59110,7 @@ 44.209998968 -99.490648867 43.643706071 -99.148424411 43.536367485 -98.283947696 - 43.689400309 -98.107447611 + 43.689400304 -98.107447616 43.996432995 -97.754847600 44.571934739 -98.093171851 } @@ -58784,11 +59816,11 @@ 832668fffffffff { 38.636347295 -86.408735730 - 38.382944047 -86.802173837 + 38.382944055 -86.802173826 38.241851846 -86.972575109 37.641022056 -86.746296778 37.463794015 -86.017893989 - 37.744189306 -85.680143089 + 37.744189299 -85.680143100 37.867892528 -85.483181959 38.439845541 -85.644635671 } @@ -58798,7 +59830,7 @@ 37.099588897 -84.585167032 37.666899982 -84.733644767 37.867892528 -85.483181959 - 37.744189295 -85.680143105 + 37.744189299 -85.680143100 37.463794015 -86.017893989 36.861666190 -85.801112910 } @@ -58844,18 +59876,18 @@ 39.014788311 -87.951381723 38.415748423 -87.715323431 38.241851846 -86.972575109 - 38.382944058 -86.802173820 + 38.382944055 -86.802173826 38.636347295 -86.408735730 39.212519340 -86.583814992 } 832670fffffffff { 41.436846005 -91.807892143 - 41.156062019 -92.187389909 + 41.156062028 -92.187389898 41.009208733 -92.362634262 40.417421193 -92.085700079 40.265304894 -91.291930223 - 40.557017942 -90.943348144 + 40.557017934 -90.943348155 40.694374271 -90.752158345 41.274622287 -90.987643541 } @@ -58865,7 +59897,7 @@ 39.947221847 -89.726216306 40.525079793 -89.945934684 40.694374271 -90.752158345 - 40.557017930 -90.943348160 + 40.557017934 -90.943348155 40.265304894 -91.291930223 39.669988413 -91.025623475 } @@ -58911,7 +59943,7 @@ 41.743249496 -93.458032217 41.155499942 -93.170248709 41.009208733 -92.362634262 - 41.156062032 -92.187389893 + 41.156062028 -92.187389898 41.436846005 -91.807892143 42.018932546 -92.059813968 } @@ -60746,11 +61778,11 @@ 832788fffffffff { 46.218061052 -104.190776751 - 45.888066721 -104.501983497 + 45.888066731 -104.501983488 45.728764627 -104.675007231 45.185117866 -104.290516212 45.116228925 -103.392995201 - 45.432731949 -103.045035040 + 45.432731939 -103.045035050 45.595273059 -102.884879905 46.154747411 -103.294331305 } @@ -60760,7 +61792,7 @@ 44.957696898 -101.607513290 45.520472600 -101.997119510 45.595273059 -102.884879905 - 45.432731934 -103.045035055 + 45.432731939 -103.045035050 45.116228925 -103.392995201 44.564787679 -103.019633961 } @@ -60806,18 +61838,18 @@ 46.322960206 -105.976834638 45.787503587 -105.581304959 45.728764627 -104.675007231 - 45.888066736 -104.501983483 + 45.888066731 -104.501983488 46.218061052 -104.190776751 46.773556021 -104.620434501 } 832790fffffffff { 48.022768199 -110.998982582 - 47.675274539 -111.254788520 + 47.675274550 -111.254788512 47.510135329 -111.418893283 47.003347819 -110.985766826 46.988170041 -110.063599452 - 47.316606597 -109.731113220 + 47.316606587 -109.731113227 47.488537756 -109.597133445 48.018063389 -110.095898550 } @@ -60827,7 +61859,7 @@ 46.935541921 -108.219021415 47.471235418 -108.697803216 47.488537756 -109.597133445 - 47.316606582 -109.731113232 + 47.316606587 -109.731113227 46.988170041 -110.063599452 46.472025493 -109.640451445 } @@ -60873,7 +61905,7 @@ 48.011188120 -112.788003928 47.514028635 -112.345205739 47.510135329 -111.418893283 - 47.675274555 -111.254788509 + 47.675274550 -111.254788512 48.022768199 -110.998982582 48.545494377 -111.517741793 } @@ -62649,11 +63681,11 @@ 8328d8fffffffff { 49.369796014 -123.874258160 - 49.715401620 -123.603627028 + 49.715401610 -123.603627036 49.895380514 -123.537048820 50.335604924 -124.180193027 50.228034139 -125.016026467 - 49.867763661 -125.133766123 + 49.867763672 -125.133766115 49.694654183 -125.265012173 49.274378521 -124.768177163 } @@ -62663,7 +63695,7 @@ 49.998340252 -126.653645519 49.588595069 -126.152399224 49.694654183 -125.265012173 - 49.867763677 -125.133766114 + 49.867763672 -125.133766115 50.228034139 -125.016026467 50.657707383 -125.673429945 } @@ -62709,7 +63741,7 @@ 49.540803528 -122.065325775 49.991246865 -122.693478539 49.895380514 -123.537048820 - 49.715401605 -123.603627040 + 49.715401610 -123.603627036 49.369796014 -123.874258160 48.938972842 -123.382429710 } @@ -63665,11 +64697,11 @@ 33.863653795 -134.859619705 34.445680279 -134.607811612 34.904268325 -135.033796665 - 34.820569947 -135.483882207 + 34.820569950 -135.483882194 34.814250309 -135.722972951 34.302646319 -135.998479567 33.809883232 -135.557936329 - 33.823564907 -135.083407438 + 33.823564905 -135.083407451 } 832969fffffffff { @@ -63697,7 +64729,7 @@ 35.806310660 -135.890023094 35.301995275 -136.166928941 34.814250309 -135.722972951 - 34.820569951 -135.483882187 + 34.820569950 -135.483882194 } 83296cfffffffff { @@ -63707,7 +64739,7 @@ 32.815866306 -134.688519434 33.398978573 -134.437722781 33.863653795 -134.859619705 - 33.823564905 -135.083407458 + 33.823564905 -135.083407451 } 83296dfffffffff { @@ -65750,11 +66782,11 @@ 832ad8fffffffff { 32.708784726 -77.261202366 - 32.507008386 -77.654149216 + 32.507008392 -77.654149204 32.375826330 -77.808779792 31.784697736 -77.666946417 31.589302189 -77.069263021 - 31.850240884 -76.764009119 + 31.850240878 -76.764009131 31.948589868 -76.568762471 32.476949888 -76.616706447 } @@ -65764,7 +66796,7 @@ 31.195687803 -75.897410815 31.716670934 -75.937457897 31.948589868 -76.568762471 - 31.850240874 -76.764009135 + 31.850240878 -76.764009131 31.589302189 -77.069263021 31.000586043 -76.934260623 } @@ -65810,7 +66842,7 @@ 33.165261389 -78.568355989 32.572081383 -78.419418230 32.375826330 -77.808779792 - 32.507008395 -77.654149199 + 32.507008392 -77.654149204 32.708784726 -77.261202366 33.244363116 -77.317511683 } @@ -66766,11 +67798,11 @@ 38.879628080 -57.004644035 38.674516464 -57.752714422 38.112931527 -57.922235977 - 37.878590032 -57.544786057 + 37.878590039 -57.544786068 37.729209797 -57.383426186 37.867567548 -56.697134436 38.458555700 -56.489075308 - 38.759503612 -56.815466377 + 38.759503604 -56.815466366 } 832b69fffffffff { @@ -66798,13 +67830,13 @@ 37.002131509 -58.249806873 37.141309711 -57.579878006 37.729209797 -57.383426186 - 37.878590043 -57.544786073 + 37.878590039 -57.544786068 } 832b6cfffffffff { 39.444633545 -56.821850409 38.879628080 -57.004644035 - 38.759503600 -56.815466361 + 38.759503604 -56.815466366 38.458555700 -56.489075308 38.595649617 -55.786046576 39.189312285 -55.565835044 @@ -67336,11 +68368,11 @@ { 39.483106615 43.464323770 39.034718356 44.044985137 - 39.139966866 44.540397930 + 39.139966863 44.540397916 39.190426266 44.789170696 39.796343724 44.966580339 40.249321175 44.385507317 - 40.143392954 43.882329726 + 40.143392957 43.882329741 40.090985487 43.630788839 } 832c01fffffffff @@ -67360,7 +68392,7 @@ 38.133332689 45.179694277 38.734838878 45.358549301 39.190426266 44.789170696 - 39.139966861 44.540397908 + 39.139966863 44.540397916 } 832c03fffffffff { @@ -67384,7 +68416,7 @@ { 40.537914380 43.038709727 40.090985487 43.630788839 - 40.143392959 43.882329748 + 40.143392957 43.882329741 40.249321175 44.385507317 40.859265602 44.561252623 41.309136599 43.968071797 @@ -68417,16 +69449,16 @@ { 30.417570403 48.787136774 29.973695974 49.261166121 - 30.081874070 49.691044623 + 30.081874068 49.691044610 30.110737120 49.918381010 30.668824996 50.125068460 - 31.141102727 49.640617217 - 31.079467267 49.180490158 + 31.141102726 49.640617217 + 31.079467269 49.180490172 31.025971809 48.962355680 } 832c99fffffffff { - 31.141102727 49.640617217 + 31.141102726 49.640617217 30.668824996 50.125068460 30.754496862 50.818461241 31.317660523 51.036906409 @@ -68441,7 +69473,7 @@ 29.089392138 50.187903613 29.640279201 50.394072354 30.110737120 49.918381010 - 30.081874067 49.691044603 + 30.081874068 49.691044610 } 832c9bfffffffff { @@ -68465,8 +69497,8 @@ { 31.472734322 48.479882812 31.025971809 48.962355680 - 31.079467270 49.180490179 - 31.141102727 49.640617217 + 31.079467269 49.180490172 + 31.141102726 49.640617217 31.706156102 49.847748373 32.179860007 49.354242054 32.081356883 48.655750664 @@ -68547,11 +69579,11 @@ { 34.944942239 46.293345590 34.493504464 46.817172498 - 34.599229812 47.278465106 + 34.599229810 47.278465092 34.638216693 47.516593453 35.223627061 47.711685737 35.691747204 47.181842963 - 35.609271490 46.699958270 + 35.609271492 46.699958284 35.556859132 46.465793651 } 832ca9fffffffff @@ -68571,7 +69603,7 @@ 33.590381402 47.840928783 34.169815248 48.036304505 34.638216693 47.516593453 - 34.599229808 47.278465085 + 34.599229810 47.278465092 } 832cabfffffffff { @@ -68595,7 +69627,7 @@ { 36.009139615 45.932136032 35.556859132 46.465793651 - 35.609271493 46.699958292 + 35.609271492 46.699958284 35.691747204 47.181842963 36.282814267 47.376518072 36.750191835 46.836191441 @@ -69686,11 +70718,11 @@ { 43.941552570 40.244573493 43.507913680 40.889704281 - 43.615478747 41.421611541 + 43.615478743 41.421611526 43.678497753 41.680312600 44.296866204 41.831897353 44.723341611 41.193439061 - 44.591914986 40.670685410 + 44.591914990 40.670685426 44.538032691 40.400624725 } 832d51fffffffff @@ -69710,7 +70742,7 @@ 42.631270692 42.150673638 43.247026252 42.305352106 43.678497753 41.680312600 - 43.615478742 41.421611518 + 43.615478743 41.421611526 } 832d53fffffffff { @@ -69734,7 +70766,7 @@ { 44.967822251 39.742317925 44.538032691 40.400624725 - 44.591914992 40.670685434 + 44.591914990 40.670685426 44.723341611 41.193439061 45.343902602 41.341590760 45.764886785 40.689242112 @@ -69816,11 +70848,11 @@ { 48.227474450 36.572269368 47.820529939 37.289682743 - 47.933892005 37.859648484 + 47.933892001 37.859648468 48.010197128 38.126682325 48.632282434 38.241714512 49.021378151 37.539862879 - 48.863160718 37.001173964 + 48.863160722 37.001173980 48.806000416 36.711916742 } 832d61fffffffff @@ -69840,7 +70872,7 @@ 46.992459504 38.692906006 47.613833862 38.813316743 48.010197128 38.126682325 - 47.933891999 37.859648459 + 47.933892001 37.859648468 } 832d63fffffffff { @@ -69864,7 +70896,7 @@ { 49.206791749 35.979485714 48.806000416 36.711916742 - 48.863160725 37.001173988 + 48.863160722 37.001173980 49.021378151 37.539862879 49.643747182 37.649013541 50.025114272 36.931433224 @@ -71966,11 +72998,11 @@ 832ed8fffffffff { 46.933246333 135.947466267 - 47.303327231 135.777856337 + 47.303327220 135.777856342 47.461815176 135.636813254 47.485069173 134.745043671 47.033536073 134.295801912 - 46.722808875 134.584562852 + 46.722808886 134.584562847 46.539461019 134.671114346 46.460224361 135.432288958 } @@ -71980,7 +73012,7 @@ 46.137635950 133.431381974 46.065154194 134.177069905 46.539461019 134.671114346 - 46.722808890 134.584562843 + 46.722808886 134.584562847 47.033536073 134.295801912 47.046589889 133.415706906 } @@ -72026,7 +73058,7 @@ 47.877990597 137.012301946 47.911951013 136.109563896 47.461815176 135.636813254 - 47.303327215 135.777856345 + 47.303327220 135.777856342 46.933246333 135.947466267 46.846738076 136.723956889 } @@ -72982,11 +74014,11 @@ 29.742029620 140.196952160 30.340632100 140.018549982 30.521858597 139.383116578 - 30.244569736 139.084176599 + 30.244569745 139.084176607 30.128924542 138.900545248 29.578086447 139.014661714 29.373227323 139.678576179 - 29.604800177 140.045471862 + 29.604800169 140.045471853 } 832f69fffffffff { @@ -73014,7 +74046,7 @@ 30.870958035 138.120125131 30.327563631 138.235179225 30.128924542 138.900545248 - 30.244569749 139.084176612 + 30.244569745 139.084176607 } 832f6cfffffffff { @@ -73024,7 +74056,7 @@ 28.952055379 141.003484090 29.553323848 140.831066951 29.742029620 140.196952160 - 29.604800165 140.045471848 + 29.604800169 140.045471853 } 832f6dfffffffff { @@ -73551,21 +74583,21 @@ 833000fffffffff { 39.387974601 121.874298518 - 39.039569434 121.779619331 + 39.039569444 121.779619334 38.875320325 121.816661980 - 38.697248994 122.212197608 + 38.697249000 122.212197596 38.672945588 122.423543706 - 38.909455376 122.764997291 + 38.909455369 122.764997281 39.058440284 122.861362179 - 39.384917479 122.677993367 + 39.384917470 122.677993373 39.501921888 122.524135658 - 39.465850141 122.065194441 + 39.465850143 122.065194455 } 833002fffffffff { 38.240938730 122.546991628 38.672945588 122.423543706 - 38.697249002 122.212197590 + 38.697249000 122.212197596 38.875320325 121.816661980 38.646090563 121.330977944 38.147625139 121.443442364 @@ -73579,13 +74611,13 @@ 38.517762053 123.699537114 39.013677792 123.428368691 39.058440284 122.861362179 - 38.909455365 122.764997275 + 38.909455369 122.764997281 } 833004fffffffff { 39.677609913 121.440211644 39.387974601 121.874298518 - 39.465850143 122.065194461 + 39.465850143 122.065194455 39.501921888 122.524135658 39.907939000 122.753452188 40.263888600 122.283025490 @@ -73597,7 +74629,7 @@ 39.958428926 123.453429783 39.907939000 122.753452188 39.501921888 122.524135658 - 39.384917465 122.677993376 + 39.384917470 122.677993373 39.058440284 122.861362179 39.013677792 123.428368691 } @@ -73607,10 +74639,75 @@ 38.910054476 120.728004641 38.646090563 121.330977944 38.875320325 121.816661980 - 39.039569449 121.779619335 + 39.039569444 121.779619334 39.387974601 121.874298518 39.677609913 121.440211644 } +833008fffffffff +{ + 39.311178991 125.485400658 + 39.819053670 125.215646944 + 39.869007411 124.622512370 + 39.416065351 124.308594011 + 38.914194260 124.579202270 + 38.859296727 125.162959779 +} +833009fffffffff +{ + 39.708194434 126.418876760 + 40.222114985 126.150297000 + 40.275093176 125.543745784 + 39.819053670 125.215646944 + 39.311178991 125.485400658 + 39.253332046 126.082171789 +} +83300afffffffff +{ + 38.350814381 125.428849168 + 38.859296727 125.162959779 + 38.914194260 124.579202270 + 38.465535761 124.270501692 + 38.214609815 124.404202190 + 37.993896287 124.465973954 + 37.903324416 125.111876812 +} +83300bfffffffff +{ + 38.738746175 126.346942615 + 39.253332046 126.082171789 + 39.311178991 125.485400658 + 38.859296727 125.162959779 + 38.350814381 125.428849168 + 38.288145975 126.016148963 +} +83300cfffffffff +{ + 39.869007411 124.622512370 + 40.370045890 124.347884202 + 40.391561237 124.052545065 + 40.368101184 123.696866610 + 39.958428926 123.453429783 + 39.463286704 123.728646330 + 39.416065351 124.308594011 +} +83300dfffffffff +{ + 40.275093176 125.543745784 + 40.782073805 125.270014985 + 40.827038788 124.667198256 + 40.370045890 124.347884202 + 39.869007411 124.622512370 + 39.819053670 125.215646944 +} +83300efffffffff +{ + 38.914194260 124.579202270 + 39.416065351 124.308594011 + 39.463286704 123.728646330 + 39.013677792 123.428368691 + 38.517762053 123.699537114 + 38.465535761 124.270501692 +} 833010fffffffff { 37.405122059 121.070823564 @@ -73936,6 +75033,457 @@ 40.309057198 119.489422425 40.601932788 119.013859807 } +833040fffffffff +{ + 41.891356721 129.517661697 + 42.422431148 129.251161935 + 42.481859560 128.591784700 + 42.014807924 128.210440252 + 41.489790234 128.479352229 + 41.425795910 129.127318310 +} +833041fffffffff +{ + 42.290066052 130.587020281 + 42.827204154 130.323386827 + 42.891164706 129.649465618 + 42.422431148 129.251161935 + 41.891356721 129.517661697 + 41.822978652 130.179729409 +} +833042fffffffff +{ + 40.893555605 129.390191759 + 41.425795910 129.127318310 + 41.489790234 128.479352229 + 41.026125722 128.105404055 + 40.500014337 128.370571570 + 40.431468403 129.007508828 +} +833043fffffffff +{ + 41.284599349 130.439878103 + 41.822978652 130.179729409 + 41.891356721 129.517661697 + 41.425795910 129.127318310 + 40.893555605 129.390191759 + 40.820765074 130.040807655 +} +833044fffffffff +{ + 42.481859560 128.591784700 + 43.005479087 128.319026309 + 43.031303093 127.990116971 + 43.017866825 127.601514795 + 42.587744994 127.290626563 + 42.070090746 127.565477447 + 42.014807924 128.210440252 +} +833045fffffffff +{ + 42.891164706 129.649465618 + 43.420763277 129.379245728 + 43.475622215 128.708055099 + 43.005479087 128.319026309 + 42.481859560 128.591784700 + 42.422431148 129.251161935 +} +833046fffffffff +{ + 41.489790234 128.479352229 + 42.014807924 128.210440252 + 42.070090746 127.565477447 + 41.605082498 127.200510538 + 41.086104967 127.471411784 + 41.026125722 128.105404055 +} +833048fffffffff +{ + 42.056160462 132.631851858 + 42.606805105 132.378564869 + 42.685131718 131.688062788 + 42.216916671 131.263280660 + 41.672398746 131.520243982 + 41.589992491 132.198453638 +} +833049fffffffff +{ + 42.435045127 133.775203083 + 42.991791933 133.526113849 + 43.075719219 132.821368561 + 42.606805105 132.378564869 + 42.056160462 132.631851858 + 41.968348359 133.323893697 +} +83304afffffffff +{ + 41.038274013 132.448675180 + 41.589992491 132.198453638 + 41.672398746 131.520243982 + 41.207194618 131.104264439 + 40.661679479 131.357980808 + 40.575190118 132.024315152 +} +83304bfffffffff +{ + 41.410447052 133.570126101 + 41.968348359 133.323893697 + 42.056160462 132.631851858 + 41.589992491 132.198453638 + 41.038274013 132.448675180 + 40.946563036 133.128446969 +} +83304cfffffffff +{ + 42.685131718 131.688062788 + 43.228329744 131.427781568 + 43.297228596 130.739226558 + 42.827204154 130.323386827 + 42.290066052 130.587020281 + 42.216916671 131.263280660 +} +83304dfffffffff +{ + 43.075719219 132.821368561 + 43.624961623 132.564957741 + 43.699223901 131.861724486 + 43.228329744 131.427781568 + 42.685131718 131.688062788 + 42.606805105 132.378564869 +} +83304efffffffff +{ + 41.672398746 131.520243982 + 42.216916671 131.263280660 + 42.290066052 130.587020281 + 41.822978652 130.179729409 + 41.284599349 130.439878103 + 41.207194618 131.104264439 +} +833050fffffffff +{ + 39.513122947 128.265268397 + 40.040023109 128.003747116 + 40.104675865 127.380362582 + 39.647101855 127.028864103 + 39.126374245 127.292187471 + 39.057080848 127.905309547 +} +833051fffffffff +{ + 39.898373157 129.266846698 + 40.431468403 129.007508828 + 40.500014337 128.370571570 + 40.040023109 128.003747116 + 39.513122947 128.265268397 + 39.440050125 128.891540532 +} +833052fffffffff +{ + 38.529696131 128.163279260 + 39.057080848 127.905309547 + 39.126374245 127.292187471 + 38.672915038 126.947066018 + 38.151759488 127.206752879 + 38.077867916 127.809941357 +} +833053fffffffff +{ + 38.906410637 129.147430572 + 39.440050125 128.891540532 + 39.513122947 128.265268397 + 39.057080848 127.905309547 + 38.529696131 128.163279260 + 38.452131207 128.779232515 +} +833054fffffffff +{ + 40.104675865 127.380362582 + 40.624677842 127.113302428 + 40.680991471 126.493124240 + 40.222114985 126.150297000 + 39.708194434 126.418876760 + 39.647101855 127.028864103 +} +833055fffffffff +{ + 40.500014337 128.370571570 + 41.026125722 128.105404055 + 41.086104967 127.471411784 + 40.624677842 127.113302428 + 40.104675865 127.380362582 + 40.040023109 128.003747116 +} +833056fffffffff +{ + 39.126374245 127.292187471 + 39.647101855 127.028864103 + 39.708194434 126.418876760 + 39.253332046 126.082171789 + 38.738746175 126.346942615 + 38.672915038 126.947066018 +} +833058fffffffff +{ + 39.653619001 131.201004359 + 40.199807896 130.950465434 + 40.281461431 130.297553274 + 39.821186110 129.906392752 + 39.281275241 130.159814701 + 39.195390462 130.801633141 +} +833059fffffffff +{ + 40.022727534 132.271529180 + 40.575190118 132.024315152 + 40.661679479 131.357980808 + 40.199807896 130.950465434 + 39.653619001 131.201004359 + 39.563054564 131.855860220 +} +83305afffffffff +{ + 38.648850748 131.049062649 + 39.195390462 130.801633141 + 39.281275241 130.159814701 + 38.824853556 129.776270296 + 38.284651588 130.026445739 + 38.194563738 130.657532707 +} +83305bfffffffff +{ + 39.010177577 132.100124088 + 39.563054564 131.855860220 + 39.653619001 131.201004359 + 39.195390462 130.801633141 + 38.648850748 131.049062649 + 38.554230359 131.692817835 +} +83305cfffffffff +{ + 40.281461431 130.297553274 + 40.820765074 130.040807655 + 40.893555605 129.390191759 + 40.431468403 129.007508828 + 39.898373157 129.266846698 + 39.821186110 129.906392752 +} +83305dfffffffff +{ + 40.661679479 131.357980808 + 41.207194618 131.104264439 + 41.284599349 130.439878103 + 40.820765074 130.040807655 + 40.281461431 130.297553274 + 40.199807896 130.950465434 +} +83305efffffffff +{ + 39.281275241 130.159814701 + 39.821186110 129.906392752 + 39.898373157 129.266846698 + 39.440050125 128.891540532 + 38.906410637 129.147430572 + 38.824853556 129.776270296 +} +833060fffffffff +{ + 43.789315957 125.868240273 + 43.387684109 126.352287047 + 43.422286665 127.134754674 + 43.861143291 127.450925239 + 44.271880992 126.971550527 + 44.234603940 126.171060792 +} +833061fffffffff +{ + 44.271880992 126.971550527 + 43.861143291 127.450925239 + 43.888951849 128.246664223 + 44.329814160 128.581475579 + 44.749717894 128.107633316 + 44.719546390 127.293156092 +} +833062fffffffff +{ + 42.951245096 126.054076442 + 42.555676682 126.525400603 + 42.587744994 127.290626563 + 43.017866825 127.601514795 + 43.422286665 127.134754674 + 43.387684109 126.352287047 +} +833063fffffffff +{ + 43.422286665 127.134754674 + 43.017866825 127.601514795 + 43.031303093 127.990116971 + 43.005479087 128.319026309 + 43.475622215 128.708055099 + 43.888951849 128.246664223 + 43.861143291 127.450925239 +} +833064fffffffff +{ + 44.143767701 124.580490804 + 43.745427287 125.081860976 + 43.789315957 125.868240273 + 44.234603940 126.171060792 + 44.642225521 125.673612076 + 44.595217402 124.869150724 +} +833065fffffffff +{ + 44.642225521 125.673612076 + 44.234603940 126.171060792 + 44.271880992 126.971550527 + 44.719546390 127.293156092 + 45.136533825 126.800487139 + 45.096434369 125.981141767 +} +833066fffffffff +{ + 43.302921585 124.797088064 + 42.910314304 125.285002853 + 42.951245096 126.054076442 + 43.387684109 126.352287047 + 43.789315957 125.868240273 + 43.745427287 125.081860976 +} +833068fffffffff +{ + 44.305446238 130.896760680 + 44.661623364 130.716591126 + 44.805561766 130.566102302 + 44.792776931 129.744429688 + 44.350352804 129.390304409 + 44.068658953 129.694875485 + 43.892359324 129.785826909 + 43.832810137 130.472024355 +} +833069fffffffff +{ + 44.714013703 132.041536263 + 45.253613491 131.774400981 + 45.249071820 130.940200959 + 44.805561766 130.566102302 + 44.661623364 130.716591126 + 44.305446238 130.896760680 + 44.240781417 131.598053045 +} +83306afffffffff +{ + 43.297228596 130.739226558 + 43.832810137 130.472024355 + 43.892359324 129.785826909 + 43.420763277 129.379245728 + 42.891164706 129.649465618 + 42.827204154 130.323386827 +} +83306bfffffffff +{ + 43.699223901 131.861724486 + 44.240781417 131.598053045 + 44.305446238 130.896760680 + 43.832810137 130.472024355 + 43.297228596 130.739226558 + 43.228329744 131.427781568 +} +83306cfffffffff +{ + 44.749717894 128.107633316 + 44.329814160 128.581475579 + 44.350352804 129.390304409 + 44.792776931 129.744429688 + 45.221883310 129.277037063 + 45.199322149 128.448759531 +} +83306dfffffffff +{ + 45.221883310 129.277037063 + 44.792776931 129.744429688 + 44.805561766 130.566102302 + 45.249071820 130.940200959 + 45.687391348 130.480231769 + 45.672953803 129.638411822 +} +83306efffffffff +{ + 43.888951849 128.246664223 + 43.475622215 128.708055099 + 43.420763277 129.379245728 + 43.892359324 129.785826909 + 44.068658953 129.694875485 + 44.350352804 129.390304409 + 44.329814160 128.581475579 +} +833070fffffffff +{ + 41.656586292 126.569798208 + 41.998051012 126.385803295 + 42.128004266 126.231699517 + 42.089878064 125.479202997 + 41.665012349 125.202054922 + 41.410940952 125.511711436 + 41.242025275 125.603971125 + 41.193954073 126.220626437 +} +833071fffffffff +{ + 42.070090746 127.565477447 + 42.587744994 127.290626563 + 42.555676682 126.525400603 + 42.128004266 126.231699517 + 41.998051012 126.385803295 + 41.656586292 126.569798208 + 41.605082498 127.200510538 +} +833072fffffffff +{ + 40.680991471 126.493124240 + 41.193954073 126.220626437 + 41.242025275 125.603971125 + 40.782073805 125.270014985 + 40.275093176 125.543745784 + 40.222114985 126.150297000 +} +833073fffffffff +{ + 41.086104967 127.471411784 + 41.605082498 127.200510538 + 41.656586292 126.569798208 + 41.193954073 126.220626437 + 40.680991471 126.493124240 + 40.624677842 127.113302428 +} +833074fffffffff +{ + 41.999374253 123.984120567 + 41.621256438 124.462360561 + 41.665012349 125.202054922 + 42.089878064 125.479202997 + 42.476673253 125.004068955 + 42.429867987 124.248458840 +} +833075fffffffff +{ + 42.476673253 125.004068955 + 42.089878064 125.479202997 + 42.128004266 126.231699517 + 42.555676682 126.525400603 + 42.951245096 126.054076442 + 42.910314304 125.285002853 +} +833076fffffffff +{ + 41.199525650 124.201132646 + 40.827038788 124.667198256 + 40.782073805 125.270014985 + 41.242025275 125.603971125 + 41.410940952 125.511711436 + 41.665012349 125.202054922 + 41.621256438 124.462360561 +} 833080fffffffff { 33.486535858 120.302743823 @@ -74131,11 +75679,11 @@ { 31.564960214 120.164986819 31.010787669 120.278479298 - 30.836383309 120.670280301 + 30.836383311 120.670280289 30.802368352 120.875266803 31.201552475 121.371272979 31.700194561 121.249825710 - 31.766196180 120.838043596 + 31.766196178 120.838043608 31.853858667 120.642264289 } 833099fffffffff @@ -74151,7 +75699,7 @@ { 30.296675886 120.996403924 30.802368352 120.875266803 - 30.836383313 120.670280283 + 30.836383311 120.670280289 31.010787669 120.278479298 30.713739877 119.800865528 30.153085410 119.915360448 @@ -74179,7 +75727,7 @@ { 32.401450345 120.529787333 31.853858667 120.642264289 - 31.766196177 120.838043614 + 31.766196178 120.838043608 31.700194561 121.249825710 32.094638762 121.748815652 32.586135689 121.627067425 @@ -74261,11 +75809,11 @@ { 35.611511973 120.925938377 35.087912293 121.038428484 - 34.910820108 121.432178755 + 34.910820110 121.432178743 34.882032924 121.640336932 35.259832812 122.144660059 35.721492299 122.022061763 - 35.777377109 121.603937646 + 35.777377107 121.603937658 35.866198645 121.407216147 } 8330a9fffffffff @@ -74281,7 +75829,7 @@ { 34.413091705 121.762641512 34.882032924 121.640336932 - 34.910820113 121.432178737 + 34.910820110 121.432178743 35.087912293 121.038428484 34.825192882 120.556720897 34.294697159 120.670261457 @@ -74309,7 +75857,7 @@ { 36.382875115 121.295789580 35.866198645 121.407216147 - 35.777377106 121.603937665 + 35.777377107 121.603937658 35.721492299 122.022061763 36.093828993 122.529366027 36.548183496 122.406483952 @@ -74456,11 +76004,11 @@ 35.249278198 130.193515781 34.761015093 130.315126313 34.622109284 130.978177324 - 34.856240625 131.340333757 + 34.856240618 131.340333746 35.002561571 131.466721868 35.553845196 131.233700220 35.660414643 130.621153501 - 35.366277240 130.373928954 + 35.366277247 130.373928965 } 8330c9fffffffff { @@ -74488,7 +76036,7 @@ 34.331158601 132.308377458 34.887802311 132.080882077 35.002561571 131.466721868 - 34.856240615 131.340333741 + 34.856240618 131.340333746 } 8330ccfffffffff { @@ -74498,7 +76046,7 @@ 35.861246482 129.409707123 35.381031112 129.531770260 35.249278198 130.193515781 - 35.366277252 130.373928969 + 35.366277247 130.373928965 } 8330cdfffffffff { @@ -74649,11 +76197,11 @@ 37.357822935 125.884029428 36.901954323 126.007265629 36.797417986 126.658591774 - 37.032929357 127.012201501 + 37.032929350 127.012201490 37.181377764 127.123933358 37.702665746 126.867786566 37.773185907 126.277215564 - 37.475498614 126.059781665 + 37.475498621 126.059781676 } 8330e1fffffffff { @@ -74681,7 +76229,7 @@ 36.575490163 127.968638759 37.102939683 127.717501694 37.181377764 127.123933358 - 37.032929347 127.012201485 + 37.032929350 127.012201490 } 8330e4fffffffff { @@ -74691,7 +76239,7 @@ 37.903324416 125.111876812 37.455344040 125.235304283 37.357822935 125.884029428 - 37.475498625 126.059781679 + 37.475498621 126.059781676 } 8330e5fffffffff { @@ -75034,11 +76582,11 @@ 42.797195835 119.521337235 42.246004036 119.390571276 41.941168612 119.876779474 - 42.101539018 120.286301198 + 42.101539014 120.286301186 42.125803970 120.530233356 42.562599181 120.751228562 42.929669649 120.227656378 - 42.877741322 119.730345448 + 42.877741326 119.730345460 } 833119fffffffff { @@ -75066,13 +76614,13 @@ 41.335404011 120.820069115 41.763379714 121.039899578 42.125803970 120.530233356 - 42.101539011 120.286301180 + 42.101539014 120.286301186 } 83311cfffffffff { 43.107152253 119.021281031 42.797195835 119.521337235 - 42.877741327 119.730345468 + 42.877741326 119.730345460 42.929669649 120.227656378 43.375371656 120.449692956 43.746953306 119.911497189 @@ -75227,11 +76775,11 @@ 46.401215364 116.686919675 45.823204751 116.575148822 45.501597860 117.140197609 - 45.668518863 117.590125015 + 45.668518858 117.590125002 45.702468576 117.854892310 46.179701325 118.061150200 46.557502452 117.457000138 - 46.485194419 116.916811821 + 46.485194424 116.916811834 } 833131fffffffff { @@ -75259,13 +76807,13 @@ 44.860009682 118.234614009 45.328164078 118.441273244 45.702468576 117.854892310 - 45.668518855 117.590124995 + 45.668518858 117.590125002 } 833134fffffffff { 46.726862591 116.104113158 46.401215364 116.686919675 - 46.485194425 116.916811842 + 46.485194424 116.916811834 46.557502452 117.457000138 47.043840634 117.662557328 47.424875689 117.039642569 @@ -75419,11 +76967,11 @@ 833150fffffffff { 41.656586292 126.569798208 - 41.998051023 126.385803290 + 41.998051012 126.385803295 42.128004266 126.231699517 42.089878064 125.479202997 41.665012349 125.202054922 - 41.410940942 125.511711442 + 41.410940952 125.511711436 41.242025275 125.603971125 41.193954073 126.220626437 } @@ -75442,7 +76990,7 @@ 40.827038788 124.667198256 40.782073805 125.270014985 41.242025275 125.603971125 - 41.410940956 125.511711432 + 41.410940952 125.511711436 41.665012349 125.202054922 41.621256438 124.462360561 } @@ -75470,7 +77018,7 @@ 42.587744994 127.290626563 42.555676682 126.525400603 42.128004266 126.231699517 - 41.998051007 126.385803298 + 41.998051012 126.385803295 41.656586292 126.569798208 41.605082498 127.200510538 } @@ -75549,11 +77097,11 @@ 833160fffffffff { 44.305446238 130.896760680 - 44.661623375 130.716591121 + 44.661623364 130.716591126 44.805561766 130.566102302 44.792776931 129.744429688 44.350352804 129.390304409 - 44.068658942 129.694875490 + 44.068658953 129.694875485 43.892359324 129.785826909 43.832810137 130.472024355 } @@ -75572,7 +77120,7 @@ 43.475622215 128.708055099 43.420763277 129.379245728 43.892359324 129.785826909 - 44.068658957 129.694875480 + 44.068658953 129.694875485 44.350352804 129.390304409 44.329814160 128.581475579 } @@ -75600,7 +77148,7 @@ 45.253613491 131.774400981 45.249071820 130.940200959 44.805561766 130.566102302 - 44.661623359 130.716591129 + 44.661623364 130.716591126 44.305446238 130.896760680 44.240781417 131.598053045 } @@ -75807,11 +77355,11 @@ 833188fffffffff { 38.195788187 118.121872973 - 38.533389133 118.038231562 + 38.533389123 118.038231564 38.713748062 118.074509763 38.992942823 117.594865351 38.724844854 117.005389800 - 38.360526468 116.939350324 + 38.360526478 116.939350322 38.190748964 116.982596424 37.939693462 117.617764742 } @@ -75821,7 +77369,7 @@ 38.693372653 119.124253721 38.974206093 118.658972150 38.713748062 118.074509763 - 38.533389118 118.038231565 + 38.533389123 118.038231564 38.195788187 118.121872973 37.940419383 118.747061801 } @@ -75867,18 +77415,18 @@ 38.174410867 115.828202612 37.927941197 116.473051994 38.190748964 116.982596424 - 38.360526484 116.939350323 + 38.360526478 116.939350322 38.724844854 117.005389800 39.002084659 116.511269173 } 833190fffffffff { 37.300704493 113.096964367 - 37.648861124 113.001006504 + 37.648861113 113.001006507 37.836226034 113.021364980 38.098167785 112.483638954 37.791453871 111.885571555 - 37.413709871 111.852307176 + 37.413709881 111.852307173 37.238763427 111.901668611 37.008458643 112.573633858 } @@ -75888,7 +77436,7 @@ 37.869616359 114.139900997 38.134629848 113.616316085 37.836226034 113.021364980 - 37.648861108 113.001006508 + 37.648861113 113.001006507 37.300704493 113.096964367 37.065054375 113.760571504 } @@ -75934,7 +77482,7 @@ 37.163896486 110.694610549 36.939172918 111.374476474 37.238763427 111.901668611 - 37.413709887 111.852307173 + 37.413709881 111.852307173 37.791453871 111.885571555 38.049980658 111.333759034 } @@ -84894,11 +86442,11 @@ 39.154574765 -137.605735119 38.671852979 -137.886689204 38.205854780 -137.423822284 - 38.217983943 -136.930685650 + 38.217983942 -136.930685665 38.266519911 -136.703339192 38.838227835 -136.457288217 39.260757186 -136.900194228 - 39.160364702 -137.357282549 + 39.160364702 -137.357282535 } 833769fffffffff { @@ -84926,7 +86474,7 @@ 37.262647345 -136.510032190 37.836839419 -136.264754930 38.266519911 -136.703339192 - 38.217983942 -136.930685672 + 38.217983942 -136.930685665 } 83376cfffffffff { @@ -84936,7 +86484,7 @@ 40.089394843 -137.789901345 39.614412674 -138.072245012 39.154574765 -137.605735119 - 39.160364704 -137.357282528 + 39.160364702 -137.357282535 } 83376dfffffffff { @@ -85403,11 +86951,11 @@ { 38.043031859 -159.745437079 37.462463846 -159.995108879 - 37.147092204 -159.697176988 + 37.147092212 -159.697176998 37.017798046 -159.522416267 37.179289743 -158.774246708 37.727738829 -158.548082638 - 37.985728333 -158.899158431 + 37.985728326 -158.899158420 38.144438158 -159.046078729 } 8337b1fffffffff @@ -85423,7 +86971,7 @@ { 36.462962585 -159.743812437 37.017798046 -159.522416267 - 37.147092216 -159.697177003 + 37.147092212 -159.697176998 37.462463846 -159.995108879 37.351766600 -160.694940028 36.764988496 -160.937613198 @@ -85451,7 +86999,7 @@ { 38.718501288 -158.789455656 38.144438158 -159.046078729 - 37.985728322 -158.899158415 + 37.985728326 -158.899158420 37.727738829 -158.548082638 37.882659364 -157.793172793 38.424441367 -157.562276488 @@ -85470,11 +87018,11 @@ { 33.920213682 -1.210393635 33.293682944 -1.086481777 - 33.155799233 -0.639308806 + 33.155799237 -0.639308819 33.084906435 -0.416817697 33.498146458 0.138045803 34.125861212 0.022822453 - 34.266134144 -0.428361618 + 34.266134140 -0.428361605 34.337003313 -0.653945265 } 833801fffffffff @@ -85494,7 +87042,7 @@ 32.045545009 -0.844902042 32.457214751 -0.300510733 33.084906435 -0.416817697 - 33.155799239 -0.639308826 + 33.155799237 -0.639308819 } 833803fffffffff { @@ -85518,7 +87066,7 @@ { 34.964353950 -0.775457584 34.337003313 -0.653945265 - 34.266134138 -0.428361598 + 34.266134140 -0.428361605 34.125861212 0.022822453 34.540217888 0.588462189 35.167537090 0.474438793 @@ -86551,11 +88099,11 @@ { 23.966793332 -2.848582613 23.373406509 -2.725164570 - 23.269212620 -2.318634443 + 23.269212625 -2.318634455 23.190235616 -2.120107054 23.570735719 -1.634755407 24.191390607 -1.747417084 - 24.348306345 -2.149523443 + 24.348306340 -2.149523431 24.402347376 -2.354513157 } 833899fffffffff @@ -86575,7 +88123,7 @@ 22.197541386 -2.483865012 22.573326835 -2.006842994 23.190235616 -2.120107054 - 23.269212626 -2.318634461 + 23.269212625 -2.318634455 } 83389bfffffffff { @@ -86599,7 +88147,7 @@ { 25.000248865 -2.476310134 24.402347376 -2.354513157 - 24.348306338 -2.149523425 + 24.348306340 -2.149523431 24.191390607 -1.747417084 24.576308787 -1.253509917 25.200366329 -1.365494757 @@ -86681,11 +88229,11 @@ { 28.908289303 -2.075106047 28.294028974 -1.951062971 - 28.172868529 -1.525066210 + 28.172868533 -1.525066223 28.097563539 -1.315192497 28.497917640 -0.797215877 29.126715569 -0.911392282 - 29.275994263 -1.336726277 + 29.275994259 -1.336726265 29.338543584 -1.551581216 } 8338a9fffffffff @@ -86705,7 +88253,7 @@ 27.073688758 -1.708865749 27.470732208 -1.200204623 28.097563539 -1.315192497 - 28.172868535 -1.525066229 + 28.172868533 -1.525066223 } 8338abfffffffff { @@ -86729,7 +88277,7 @@ { 29.955569298 -1.673659134 29.338543584 -1.551581216 - 29.275994256 -1.336726258 + 29.275994259 -1.336726265 29.126715569 -0.911392282 29.529994542 -0.383838653 30.160360447 -0.497110954 @@ -87820,11 +89368,11 @@ { 38.923477214 -0.237764932 38.294033594 -0.115045922 - 38.140277578 0.355185016 + 38.140277582 0.355185002 38.074248931 0.591768549 38.492342143 1.188593848 39.109644405 1.073007630 - 39.240155365 0.592929316 + 39.240155361 0.592929331 39.318859634 0.355669788 } 833951fffffffff @@ -87844,7 +89392,7 @@ 37.036562007 0.123807358 37.455041000 0.708795442 38.074248931 0.591768549 - 38.140277585 0.355184995 + 38.140277582 0.355185002 } 833953fffffffff { @@ -87868,7 +89416,7 @@ { 39.947158227 0.235904296 39.318859634 0.355669788 - 39.240155359 0.592929338 + 39.240155361 0.592929331 39.109644405 1.073007630 39.526861283 1.682024938 40.141858638 1.568026977 @@ -87950,11 +89498,11 @@ { 43.838891427 0.863644521 43.215793940 0.983680664 - 43.047511702 1.479020943 + 43.047511705 1.479020928 42.986442187 1.731414663 43.400945535 2.376287621 43.999257718 2.261329096 - 44.119981964 1.748811531 + 44.119981960 1.748811546 44.205806374 1.498849078 } 833961fffffffff @@ -87974,7 +89522,7 @@ 41.967575127 1.216870660 42.384487444 1.848286529 42.986442187 1.731414663 - 43.047511708 1.479020921 + 43.047511705 1.479020928 } 833963fffffffff { @@ -87998,7 +89546,7 @@ { 44.825951932 1.382480752 44.205806374 1.498849078 - 44.119981959 1.748811554 + 44.119981960 1.748811546 43.999257718 2.261329096 44.410857970 2.920074258 45.005182350 2.807218272 @@ -90099,11 +91647,11 @@ 833ad8fffffffff { 20.347207823 -49.805869011 - 19.995758728 -49.956065970 + 19.995758739 -49.956065965 19.830932326 -50.069631914 19.351839108 -49.762565434 19.367411872 -49.112812974 - 19.698350411 -48.884994971 + 19.698350401 -48.884994976 19.873831465 -48.807182926 20.376066977 -49.191088580 } @@ -90113,7 +91661,7 @@ 19.391715108 -47.807886170 19.897510794 -48.188248567 19.873831465 -48.807182926 - 19.698350396 -48.884994980 + 19.698350401 -48.884994976 19.367411872 -49.112812974 18.881803704 -48.803389489 } @@ -90159,7 +91707,7 @@ 20.283840591 -51.020407951 19.811371548 -50.715844699 19.830932326 -50.069631914 - 19.995758744 -49.956065963 + 19.995758739 -49.956065965 20.347207823 -49.805869011 20.845584280 -50.193078631 } @@ -91619,11 +93167,11 @@ { 34.724430492 -60.781512499 34.189375631 -60.906112698 - 33.980645389 -60.539995163 + 33.980645398 -60.539995172 33.835149086 -60.387681076 33.967987988 -59.769611691 34.542339230 -59.604094443 - 34.835579680 -59.912463014 + 34.835579671 -59.912463004 34.942699052 -60.096402140 } 833bb1fffffffff @@ -91643,7 +93191,7 @@ 33.133336870 -61.147392002 33.265465070 -60.543752500 33.835149086 -60.387681076 - 33.980645401 -60.539995178 + 33.980645398 -60.539995172 } 833bb3fffffffff { @@ -91667,7 +93215,7 @@ { 35.482770027 -59.961075859 34.942699052 -60.096402140 - 34.835579667 -59.912463000 + 34.835579671 -59.912463004 34.542339230 -59.604094443 34.675571026 -58.971215312 35.254297037 -58.795795949 @@ -91685,11 +93233,11 @@ 833c00fffffffff { 28.613070162 85.307848466 - 28.233827828 85.447653586 + 28.233827840 85.447653582 28.043685610 85.515648077 27.936513364 86.208578653 28.399985641 86.700924677 - 28.780493017 86.565422728 + 28.780493006 86.565422732 28.971152634 86.498854257 29.079787524 85.799383981 } @@ -91699,7 +93247,7 @@ 29.317655160 87.694432252 29.433267828 86.998227074 28.971152634 86.498854257 - 28.780493000 86.565422734 + 28.780493006 86.565422732 28.399985641 86.700924677 28.287572825 87.398774085 } @@ -91745,7 +93293,7 @@ 27.678382882 84.341795405 27.576245379 85.029284224 28.043685610 85.515648077 - 28.233827845 85.447653580 + 28.233827840 85.447653582 28.613070162 85.307848466 28.714758180 84.605751280 } @@ -92451,11 +93999,11 @@ 833c68fffffffff { 33.151020487 95.770327863 - 32.757402773 95.846259992 + 32.757402785 95.846259989 32.570612401 95.910152179 32.417622764 96.630782416 32.823568865 97.161877567 - 33.196434618 97.035717702 + 33.196434606 97.035717704 33.393201315 97.001836769 33.570080388 96.332177853 } @@ -92465,7 +94013,7 @@ 33.621069781 98.228504256 33.804613568 97.567777027 33.393201315 97.001836769 - 33.196434601 97.035717706 + 33.196434606 97.035717704 32.823568865 97.161877567 32.664007807 97.882078783 } @@ -92511,18 +94059,18 @@ 32.304336371 94.661137296 32.157880557 95.381508693 32.570612401 95.910152179 - 32.757402791 95.846259988 + 32.757402785 95.846259989 33.151020487 95.770327863 33.321037745 95.092298420 } 833c70fffffffff { 31.003363435 90.451435557 - 30.614483218 90.561299613 + 30.614483229 90.561299609 30.425472080 90.627874145 30.297236437 91.340253236 30.735343027 91.855779810 - 31.113100260 91.723687012 + 31.113100249 91.723687015 31.308061984 91.672543608 31.450466701 90.981555895 } @@ -92532,7 +94080,7 @@ 31.599338930 92.893726818 31.748829909 92.208873536 31.308061984 91.672543608 - 31.113100243 91.723687017 + 31.113100249 91.723687015 30.735343027 91.855779810 30.601011463 92.570583571 } @@ -92578,7 +94126,7 @@ 30.104062786 89.407436519 29.981787500 90.116759042 30.425472080 90.627874145 - 30.614483235 90.561299608 + 30.614483229 90.561299609 31.003363435 90.451435557 31.138597393 89.754947826 } @@ -94413,11 +95961,11 @@ 833d88fffffffff { 26.041513066 80.408791010 - 25.676073335 80.573599313 + 25.676073346 80.573599308 25.485978346 80.641828267 25.394931547 81.306255020 25.875366338 81.769700061 - 26.256285329 81.633211092 + 26.256285318 81.633211097 26.440469851 81.553592772 26.518284135 80.857495645 } @@ -94427,7 +95975,7 @@ 26.830386805 82.706685728 26.914592732 82.011189334 26.440469851 81.553592772 - 26.256285312 81.633211099 + 26.256285318 81.633211097 25.875366338 81.769700061 25.780165032 82.441001320 } @@ -94473,18 +96021,18 @@ 25.090534001 79.528294049 25.003403133 80.185460020 25.485978346 80.641828267 - 25.676073351 80.573599305 + 25.676073346 80.573599308 26.041513066 80.408791010 26.113063562 79.712677070 } 833d90fffffffff { 23.358964070 75.803112714 - 23.010466855 75.987635136 + 23.010466866 75.987635131 22.821628336 76.055080214 22.741291363 76.684524744 23.229609006 77.115439232 - 23.608512716 76.980085474 + 23.608512705 76.980085479 23.784535694 76.890032763 23.836155356 76.207280038 } @@ -94494,7 +96042,7 @@ 24.203950019 77.988008746 24.261029020 77.303590990 23.784535694 76.890032763 - 23.608512700 76.980085481 + 23.608512705 76.980085479 23.229609006 77.115439232 23.146261423 77.753108229 } @@ -94540,7 +96088,7 @@ 22.410566168 75.010885846 22.333004936 75.631858940 22.821628336 76.055080214 - 23.010466871 75.987635128 + 23.010466866 75.987635131 23.358964070 75.803112714 23.405316702 75.122517508 } @@ -99402,11 +100950,11 @@ 8340d8fffffffff { 34.623824833 102.532459872 - 34.989924258 102.414603699 + 34.989924247 102.414603703 35.185899415 102.399024088 35.395531194 101.763277110 35.010919324 101.178777326 - 34.617769400 101.218290449 + 34.617769411 101.218290446 34.434162537 101.278284226 34.254560162 101.994728416 } @@ -99416,7 +100964,7 @@ 34.230365517 100.021683665 34.057418763 100.740825622 34.434162537 101.278284226 - 34.617769417 101.218290445 + 34.617769411 101.218290446 35.010919324 101.178777326 35.214505929 100.532102602 } @@ -99462,7 +101010,7 @@ 35.346705515 103.609581751 35.562097028 102.985186044 35.185899415 102.399024088 - 34.989924242 102.414603704 + 34.989924247 102.414603703 34.623824833 102.532459872 34.437636595 103.245531796 } @@ -100922,11 +102470,11 @@ { 26.865051438 120.615740402 27.399262741 120.495466181 - 27.476770364 120.089987564 + 27.476770359 120.089987576 27.562299728 119.895227004 27.239282691 119.422057383 26.657733363 119.536435655 - 26.488018447 119.926138291 + 26.488018452 119.926138280 26.448100201 120.127974056 } 8341b1fffffffff @@ -100942,7 +102490,7 @@ { 28.137976005 119.781817697 27.562299728 119.895227004 - 27.476770358 120.089987582 + 27.476770359 120.089987576 27.399262741 120.495466181 27.812514311 120.986213308 28.340098034 120.865622663 @@ -100970,7 +102518,7 @@ { 25.907440174 120.247923375 26.448100201 120.127974056 - 26.488018455 119.926138274 + 26.488018452 119.926138280 26.657733363 119.536435655 26.326751307 119.063017394 25.739512157 119.178351601 @@ -102503,11 +104051,11 @@ 8342d8fffffffff { 20.636298427 71.519101758 - 20.306751926 71.718202630 + 20.306751936 71.718202624 20.120339910 71.784059534 20.045561216 72.374608024 20.532972256 72.771323369 - 20.907483198 72.638813534 + 20.907483188 72.638813540 21.074218415 72.540917333 21.105170761 71.879163703 } @@ -102517,7 +104065,7 @@ 21.508843226 73.575593561 21.544144201 72.910400386 21.074218415 72.540917333 - 20.907483182 72.638813542 + 20.907483188 72.638813540 20.532972256 72.771323369 20.456234300 73.370869614 } @@ -102563,7 +104111,7 @@ 19.707303596 70.813808821 19.634279951 71.395236362 20.120339910 71.784059534 - 20.306751941 71.718202621 + 20.306751936 71.718202624 20.636298427 71.519101758 20.663122690 70.861173479 } @@ -104023,11 +105571,11 @@ { 21.707204894 52.955206054 21.302842109 53.347671899 - 21.418652375 53.722872950 + 21.418652375 53.722872937 21.431772140 53.929441161 21.921607080 54.146993697 22.374471556 53.737987205 - 22.345569590 53.319975685 + 22.345569590 53.319975698 22.288304040 53.129776570 } 8343b1fffffffff @@ -104047,7 +105595,7 @@ 20.502391751 54.115741773 20.983780649 54.331879736 21.431772140 53.929441161 - 21.418652373 53.722872932 + 21.418652375 53.722872937 } 8343b3fffffffff { @@ -104071,7 +105619,7 @@ { 22.698426879 52.731068191 22.288304040 53.129776570 - 22.345569591 53.319975704 + 22.345569590 53.319975698 22.374471556 53.737987205 22.872696068 53.956945193 23.330224791 53.541167540 @@ -105604,11 +107152,11 @@ 8344d8fffffffff { 34.542036432 -81.285061715 - 34.812202553 -80.962413162 + 34.812202545 -80.962413172 34.922719898 -80.764550875 35.476502472 -80.863541202 35.695928635 -81.567649553 - 35.469268785 -81.964648111 + 35.469268793 -81.964648101 35.333392720 -82.127830285 34.733211237 -81.946860254 } @@ -105618,7 +107166,7 @@ 36.123995836 -82.992984251 35.523527569 -82.803555483 35.333392720 -82.127830285 - 35.469268796 -81.964648095 + 35.469268793 -81.964648101 35.695928635 -81.567649553 36.255731822 -81.677488635 } @@ -105664,7 +107212,7 @@ 34.153720241 -79.985888469 34.701196818 -80.074599939 34.922719898 -80.764550875 - 34.812202541 -80.962413177 + 34.812202545 -80.962413172 34.542036432 -81.285061715 33.942579315 -81.112257025 } @@ -107124,11 +108672,11 @@ { 17.396852458 -78.431209794 17.815083535 -78.064876560 - 18.144503925 -78.237608258 + 18.144503914 -78.237608256 18.332881910 -78.280540003 18.460604134 -78.822531893 18.018358985 -79.234397074 - 17.640276730 -79.144433708 + 17.640276741 -79.144433710 17.474498331 -79.058221258 } 8345b1fffffffff @@ -107144,7 +108692,7 @@ { 18.769231316 -77.870576705 18.332881910 -78.280540003 - 18.144503909 -78.237608253 + 18.144503914 -78.237608256 17.815083535 -78.064876560 17.734560812 -77.440591732 18.147355632 -77.077590802 @@ -107172,7 +108720,7 @@ { 17.050931154 -79.427699553 17.474498331 -79.058221258 - 17.640276747 -79.144433712 + 17.640276741 -79.144433710 18.018358985 -79.234397074 18.142706595 -79.784648665 17.694650373 -80.198200485 @@ -107191,11 +108739,11 @@ { 25.711347011 -169.600705416 25.094255769 -169.766352778 - 24.821886410 -169.445235040 + 24.821886418 -169.445235050 24.684380924 -169.286263668 24.886289308 -168.639195593 25.502097659 -168.468091768 - 25.776582035 -168.788808463 + 25.776582027 -168.788808453 25.914621776 -168.948651608 } 834601fffffffff @@ -107211,7 +108759,7 @@ { 24.067527283 -169.452953593 24.684380924 -169.286263668 - 24.821886422 -169.445235055 + 24.821886418 -169.445235050 25.094255769 -169.766352778 24.885063568 -170.415419927 24.267614736 -170.574927234 @@ -107239,7 +108787,7 @@ { 26.530896921 -168.776803400 25.914621776 -168.948651608 - 25.776582023 -168.788808449 + 25.776582027 -168.788808453 25.502097659 -168.468091768 25.702708970 -167.812429995 26.317028679 -167.636863621 @@ -108272,11 +109820,11 @@ { 17.053568741 -175.101262069 16.460628973 -175.221735015 - 16.225693456 -174.900490574 + 16.225693464 -174.900490583 16.084949556 -174.754325270 16.274453938 -174.177081971 16.889319189 -174.038010513 - 17.170835952 -174.333348811 + 17.170835944 -174.333348803 17.290340280 -174.493857556 } 834699fffffffff @@ -108292,7 +109840,7 @@ { 15.472956742 -174.889537413 16.084949556 -174.754325270 - 16.225693468 -174.900490588 + 16.225693464 -174.900490583 16.460628973 -175.221735015 16.221408633 -175.825051160 15.632025097 -175.940297278 @@ -108320,7 +109868,7 @@ { 17.886454797 -174.368070563 17.290340280 -174.493857556 - 17.170835939 -174.333348798 + 17.170835944 -174.333348803 16.889319189 -174.038010513 17.080808275 -173.452228279 17.698177492 -173.309227831 @@ -108402,11 +109950,11 @@ { 21.372068211 -172.453327232 20.762444014 -172.595231018 - 20.508403581 -172.272879988 + 20.508403589 -172.272879997 20.368894161 -172.120229905 20.568200722 -171.508395495 21.188328482 -171.353901660 - 21.467058428 -171.662137198 + 21.467058420 -171.662137189 21.596067791 -171.822926923 } 8346a9fffffffff @@ -108422,7 +109970,7 @@ { 19.749763304 -172.270572370 20.368894161 -172.120229905 - 20.508403593 -172.272880001 + 20.508403589 -172.272879997 20.762444014 -172.595231018 20.534243269 -173.221993036 19.926336830 -173.358202518 @@ -108450,7 +109998,7 @@ { 22.206971621 -171.675251200 21.596067791 -171.822926923 - 21.467058416 -171.662137185 + 21.467058420 -171.662137189 21.188328482 -171.353901660 21.388108572 -170.733409534 22.008809228 -170.574702313 @@ -109541,11 +111089,11 @@ { 29.989351092 -166.534563274 29.374804678 -166.726230560 - 29.085664561 -166.409223940 + 29.085664569 -166.409223950 28.950709616 -166.244292097 29.147148134 -165.562077748 29.748943107 -165.373313811 - 30.018195129 -165.705679807 + 30.018195121 -165.705679797 30.164403919 -165.863077849 } 834751fffffffff @@ -109561,7 +111109,7 @@ { 28.345843011 -166.428432505 28.950709616 -166.244292097 - 29.085664574 -166.409223955 + 29.085664569 -166.409223950 29.374804678 -166.726230560 29.192324134 -167.395616544 28.575285347 -167.580750511 @@ -109589,7 +111137,7 @@ { 30.776020353 -165.664842220 30.164403919 -165.863077849 - 30.018195117 -165.705679792 + 30.018195121 -165.705679797 29.748943107 -165.373313811 29.942205173 -164.682809219 30.540506648 -164.489393400 @@ -109671,11 +111219,11 @@ { 34.124525027 -163.249590705 33.522457580 -163.469382105 - 33.218804640 -163.159924643 + 33.218804648 -163.159924653 33.086676244 -162.989635442 33.269434430 -162.273322784 33.848279994 -162.066086687 - 34.111860143 -162.408765796 + 34.111860135 -162.408765785 34.265041313 -162.561942817 } 834761fffffffff @@ -109691,7 +111239,7 @@ { 32.502930888 -163.192119536 33.086676244 -162.989635442 - 33.218804652 -163.159924658 + 33.218804648 -163.159924653 33.522457580 -163.469382105 33.373357039 -164.156079935 32.766792604 -164.369036430 @@ -109719,7 +111267,7 @@ { 34.862232453 -162.335317430 34.265041313 -162.561942817 - 34.111860131 -162.408765780 + 34.111860135 -162.408765785 33.848279994 -162.066086687 34.026048963 -161.342084535 34.599630897 -161.130096155 @@ -115918,11 +117466,11 @@ 32.836860549 134.548962136 32.316445852 134.667504257 32.143420687 135.334827769 - 32.376123544 135.701473750 + 32.376123537 135.701473739 32.518678095 135.841267759 33.096312834 135.634460091 33.240427991 135.006762662 - 32.953124202 134.732041626 + 32.953124208 134.732041637 } 834b69fffffffff { @@ -115950,7 +117498,7 @@ 31.784672033 136.670054672 32.366495528 136.469106197 32.518678095 135.841267759 - 32.376123533 135.701473734 + 32.376123537 135.701473739 } 834b6cfffffffff { @@ -115960,7 +117508,7 @@ 33.515468224 133.762312712 33.002976974 133.881562125 32.836860549 134.548962136 - 32.953124213 134.732041641 + 32.953124208 134.732041637 } 834b6dfffffffff { @@ -116427,11 +117975,11 @@ { 22.661128042 118.696758423 22.057235754 118.811912390 - 21.894413210 119.199381565 + 21.894413212 119.199381553 21.848063204 119.398091729 22.277718191 119.877704902 22.844231246 119.758622146 - 22.934375810 119.359399814 + 22.934375808 119.359399826 23.016685162 119.165727480 } 834bb1fffffffff @@ -116447,7 +117995,7 @@ { 21.276116785 119.516836409 21.848063204 119.398091729 - 21.894413215 119.199381547 + 21.894413212 119.199381553 22.057235754 118.811912390 21.694265089 118.342776718 21.085880153 118.458841649 @@ -116475,7 +118023,7 @@ { 23.615813598 119.051497415 23.016685162 119.165727480 - 22.934375806 119.359399832 + 22.934375808 119.359399826 22.844231246 119.758622146 23.271539369 120.241208016 23.832352226 120.121794983 @@ -116493,21 +118041,21 @@ 834c00fffffffff { 24.153695392 -67.086852406 - 24.010601160 -67.443958191 + 24.010601164 -67.443958180 23.891429359 -67.571591260 - 23.537215543 -67.532212044 + 23.537215553 -67.532212045 23.389443921 -67.447974350 - 23.313556486 -67.069076202 + 23.313556488 -67.069076214 23.340796935 -66.889915569 - 23.647595631 -66.692913169 + 23.647595622 -66.692913174 23.812424036 -66.665298247 - 24.079058009 -66.923472226 + 24.079058001 -66.923472218 } 834c02fffffffff { 23.056612599 -67.765596782 23.389443921 -67.447974350 - 23.537215559 -67.532212046 + 23.537215553 -67.532212045 23.891429359 -67.571591260 24.065620758 -68.017011607 23.703196176 -68.403500647 @@ -116521,13 +118069,13 @@ 22.494125224 -66.942081188 22.959033235 -66.646164788 23.340796935 -66.889915569 - 23.313556489 -67.069076219 + 23.313556488 -67.069076214 } 834c04fffffffff { 24.594371946 -67.040548420 24.153695392 -67.086852406 - 24.079057997 -66.923472214 + 24.079058001 -66.923472218 23.812424036 -66.665298247 23.906557628 -66.192310229 24.406369039 -66.104460141 @@ -116539,7 +118087,7 @@ 23.501303342 -65.804016225 23.906557628 -66.192310229 23.812424036 -66.665298247 - 23.647595618 -66.692913177 + 23.647595622 -66.692913174 23.340796935 -66.889915569 22.959033235 -66.646164788 } @@ -116549,10 +118097,75 @@ 24.601684777 -68.079781399 24.065620758 -68.017011607 23.891429359 -67.571591260 - 24.010601166 -67.443958175 + 24.010601164 -67.443958180 24.153695392 -67.086852406 24.594371946 -67.040548420 } +834c08fffffffff +{ + 21.859117743 -65.356071606 + 22.330915965 -65.053517724 + 22.725779259 -65.305025442 + 22.649841070 -65.855373508 + 22.181482296 -66.154634465 + 21.785640725 -65.906850953 +} +834c09fffffffff +{ + 21.526861986 -64.546472358 + 22.002085574 -64.240684262 + 22.403619653 -64.496047509 + 22.330915965 -65.053517724 + 21.859117743 -65.356071606 + 21.456616082 -65.104401745 +} +834c0afffffffff +{ + 21.312234468 -66.206380716 + 21.785640725 -65.906850953 + 22.181482296 -66.154634465 + 22.104863914 -66.698194829 + 21.870183059 -66.846400114 + 21.698319410 -67.004452269 + 21.238207750 -66.750344510 +} +834c0bfffffffff +{ + 20.979703908 -65.407238649 + 21.456616082 -65.104401745 + 21.859117743 -65.356071606 + 21.785640725 -65.906850953 + 21.312234468 -66.206380716 + 20.908818452 -65.958448897 +} +834c0cfffffffff +{ + 22.725779259 -65.305025442 + 23.192338510 -65.002754570 + 23.386547058 -65.128594455 + 23.591721589 -65.323228525 + 23.501303342 -65.804016225 + 23.038112042 -66.103008330 + 22.649841070 -65.855373508 +} +834c0dfffffffff +{ + 22.403619653 -64.496047509 + 22.873534159 -64.190556748 + 23.267372199 -64.445743793 + 23.192338510 -65.002754570 + 22.725779259 -65.305025442 + 22.330915965 -65.053517724 +} +834c0efffffffff +{ + 22.181482296 -66.154634465 + 22.649841070 -65.855373508 + 23.038112042 -66.103008330 + 22.959033235 -66.646164788 + 22.494125224 -66.942081188 + 22.104863914 -66.698194829 +} 834c10fffffffff { 23.506882425 -69.248485077 @@ -116878,6 +118491,457 @@ 26.182510299 -67.407726363 26.646270394 -67.362447274 } +834c40fffffffff +{ + 21.013548724 -61.152505550 + 21.496702533 -60.834872092 + 21.917639118 -61.105115545 + 21.856440295 -61.689527130 + 21.376563296 -62.004250688 + 20.954624746 -61.737491626 +} +834c41fffffffff +{ + 20.640008377 -60.290479972 + 21.126411891 -59.970033505 + 21.554249926 -60.243927590 + 21.496702533 -60.834872092 + 21.013548724 -61.152505550 + 20.584708692 -60.882028353 +} +834c42fffffffff +{ + 20.469239008 -62.052556153 + 20.954624746 -61.737491626 + 21.376563296 -62.004250688 + 21.314079757 -62.582532693 + 20.832059339 -62.894583697 + 20.409174537 -62.631383520 +} +834c43fffffffff +{ + 20.095984004 -61.200017410 + 20.584708692 -60.882028353 + 21.013548724 -61.152505550 + 20.954624746 -61.737491626 + 20.469239008 -62.052556153 + 20.039455352 -61.785578192 +} +834c44fffffffff +{ + 21.917639118 -61.105115545 + 22.395085239 -60.787837340 + 22.602211199 -60.923004558 + 22.820900318 -61.120123450 + 22.744753313 -61.641684306 + 22.270516206 -61.956067169 + 21.856440295 -61.689527130 +} +834c45fffffffff +{ + 21.554249926 -60.243927590 + 22.034880378 -59.923850901 + 22.454763661 -60.197496364 + 22.395085239 -60.787837340 + 21.917639118 -61.105115545 + 21.496702533 -60.834872092 +} +834c46fffffffff +{ + 21.376563296 -62.004250688 + 21.856440295 -61.689527130 + 22.270516206 -61.956067169 + 22.205736417 -62.533803898 + 21.729160216 -62.845528548 + 21.314079757 -62.582532693 +} +834c48fffffffff +{ + 19.317815869 -59.464175405 + 19.813125634 -59.140636068 + 20.255853476 -59.418383934 + 20.204234561 -60.016337259 + 19.712200688 -60.337153921 + 19.268526102 -60.062762578 +} +834c49fffffffff +{ + 18.912778613 -58.581315301 + 19.411327315 -58.255166268 + 19.861016396 -58.536451006 + 19.813125634 -59.140636068 + 19.317815869 -59.464175405 + 18.867173744 -59.186163832 +} +834c4afffffffff +{ + 18.771021876 -60.383949854 + 19.268526102 -60.062762578 + 19.712200688 -60.337153921 + 19.659266493 -60.929306533 + 19.165124507 -61.247651532 + 18.720571671 -60.976707040 +} +834c4bfffffffff +{ + 18.366343758 -59.510088375 + 18.867173744 -59.186163832 + 19.317815869 -59.464175405 + 19.268526102 -60.062762578 + 18.771021876 -60.383949854 + 18.319498405 -60.109309882 +} +834c4cfffffffff +{ + 20.255853476 -59.418383934 + 20.745476352 -59.095229310 + 21.180245241 -59.372713538 + 21.126411891 -59.970033505 + 20.640008377 -60.290479972 + 20.204234561 -60.016337259 +} +834c4dfffffffff +{ + 19.861016396 -58.536451006 + 20.353824923 -58.210701072 + 20.795541740 -58.491707080 + 20.745476352 -59.095229310 + 20.255853476 -59.418383934 + 19.813125634 -59.140636068 +} +834c4efffffffff +{ + 19.712200688 -60.337153921 + 20.204234561 -60.016337259 + 20.640008377 -60.290479972 + 20.584708692 -60.882028353 + 20.095984004 -61.200017410 + 19.659266493 -60.929306533 +} +834c50fffffffff +{ + 20.284651690 -63.775819669 + 20.768525516 -63.466551433 + 21.184557281 -63.725936311 + 21.117627581 -64.290933196 + 20.637225176 -64.597018701 + 20.220299672 -64.341303914 +} +834c51fffffffff +{ + 19.921851353 -62.943761081 + 20.409174537 -62.631383520 + 20.832059339 -62.894583697 + 20.768525516 -63.466551433 + 20.284651690 -63.775819669 + 19.860880646 -63.516245047 +} +834c52fffffffff +{ + 19.734863832 -64.647686897 + 20.220299672 -64.341303914 + 20.637225176 -64.597018701 + 20.569566304 -65.155406984 + 20.087679803 -65.458526919 + 19.669922323 -65.206533794 +} +834c53fffffffff +{ + 19.371916351 -63.825825348 + 19.860880646 -63.516245047 + 20.284651690 -63.775819669 + 20.220299672 -64.341303914 + 19.734863832 -64.647686897 + 19.310270742 -64.391796781 +} +834c54fffffffff +{ + 21.184557281 -63.725936311 + 21.663189271 -63.416980007 + 22.071465171 -63.676174900 + 22.002085574 -64.240684262 + 21.526861986 -64.546472358 + 21.117627581 -64.290933196 +} +834c55fffffffff +{ + 20.832059339 -62.894583697 + 21.314079757 -62.582532693 + 21.729160216 -62.845528548 + 21.663189271 -63.416980007 + 21.184557281 -63.725936311 + 20.768525516 -63.466551433 +} +834c56fffffffff +{ + 20.637225176 -64.597018701 + 21.117627581 -64.290933196 + 21.526861986 -64.546472358 + 21.456616082 -65.104401745 + 20.979703908 -65.407238649 + 20.569566304 -65.155406984 +} +834c58fffffffff +{ + 18.615168174 -62.149534505 + 19.111112542 -61.833787228 + 19.548708271 -62.100983960 + 19.491186723 -62.680356767 + 18.998718366 -62.993061083 + 18.560314035 -62.729452821 +} +834c59fffffffff +{ + 18.221183145 -61.295408320 + 18.720571671 -60.976707040 + 19.165124507 -61.247651532 + 19.111112542 -61.833787228 + 18.615168174 -62.149534505 + 18.169809696 -61.882119132 +} +834c5afffffffff +{ + 18.062874587 -63.042484090 + 18.560314035 -62.729452821 + 18.998718366 -62.993061083 + 18.940437558 -63.566061225 + 18.446550142 -63.875953722 + 18.007410818 -63.616000348 +} +834c5bfffffffff +{ + 17.668849095 -62.198208184 + 18.169809696 -61.882119132 + 18.615168174 -62.149534505 + 18.560314035 -62.729452821 + 18.062874587 -63.042484090 + 17.616787043 -62.778672075 +} +834c5cfffffffff +{ + 19.548708271 -62.100983960 + 20.039455352 -61.785578192 + 20.469239008 -62.052556153 + 20.409174537 -62.631383520 + 19.921851353 -62.943761081 + 19.491186723 -62.680356767 +} +834c5dfffffffff +{ + 19.165124507 -61.247651532 + 19.659266493 -60.929306533 + 20.095984004 -61.200017410 + 20.039455352 -61.785578192 + 19.548708271 -62.100983960 + 19.111112542 -61.833787228 +} +834c5efffffffff +{ + 18.998718366 -62.993061083 + 19.491186723 -62.680356767 + 19.921851353 -62.943761081 + 19.860880646 -63.516245047 + 19.371916351 -63.825825348 + 18.940437558 -63.566061225 +} +834c60fffffffff +{ + 24.292286522 -61.257228337 + 23.772578409 -61.387379975 + 23.335423391 -60.989161334 + 23.413161530 -60.456686499 + 23.934102800 -60.318715477 + 24.376111629 -60.721037506 +} +834c61fffffffff +{ + 23.934102800 -60.318715477 + 23.413161530 -60.456686499 + 22.970343374 -60.058871513 + 23.043515376 -59.519155403 + 23.565479423 -59.373328073 + 24.013288974 -59.775068271 +} +834c62fffffffff +{ + 23.690371517 -61.912427216 + 23.177107893 -62.035770789 + 22.744753313 -61.641684306 + 22.820900318 -61.120123450 + 23.335423391 -60.989161334 + 23.772578409 -61.387379975 +} +834c63fffffffff +{ + 23.335423391 -60.989161334 + 22.820900318 -61.120123450 + 22.602211199 -60.923004558 + 22.395085239 -60.787837340 + 22.454763661 -60.197496364 + 22.970343374 -60.058871513 + 23.413161530 -60.456686499 +} +834c64fffffffff +{ + 25.253038887 -61.530619219 + 24.728388127 -61.659896671 + 24.292286522 -61.257228337 + 24.376111629 -60.721037506 + 24.902173277 -60.583780218 + 25.343036685 -60.990693478 +} +834c65fffffffff +{ + 24.902173277 -60.583780218 + 24.376111629 -60.721037506 + 23.934102800 -60.318715477 + 24.013288974 -59.775068271 + 24.540550046 -59.629789380 + 24.987464801 -60.036175320 +} +834c66fffffffff +{ + 24.640033222 -62.188443452 + 24.121762024 -62.310824805 + 23.690371517 -61.912427216 + 23.772578409 -61.387379975 + 24.292286522 -61.257228337 + 24.728388127 -61.659896671 +} +834c68fffffffff +{ + 21.716161909 -58.447083093 + 22.037088108 -58.230510765 + 22.209892217 -58.178901796 + 22.663669418 -58.575218409 + 22.595151149 -59.121973177 + 22.250419764 -59.219770477 + 22.090814391 -59.327163795 + 21.664032386 -59.049943132 +} +834c69fffffffff +{ + 21.330728961 -57.557511719 + 21.814638995 -57.230111964 + 22.273679798 -57.625327053 + 22.209892217 -58.178901796 + 22.037088108 -58.230510765 + 21.716161909 -58.447083093 + 21.282454869 -58.166355673 +} +834c6afffffffff +{ + 21.180245241 -59.372713538 + 21.664032386 -59.049943132 + 22.090814391 -59.327163795 + 22.034880378 -59.923850901 + 21.554249926 -60.243927590 + 21.126411891 -59.970033505 +} +834c6bfffffffff +{ + 20.795541740 -58.491707080 + 21.282454869 -58.166355673 + 21.716161909 -58.447083093 + 21.664032386 -59.049943132 + 21.180245241 -59.372713538 + 20.745476352 -59.095229310 +} +834c6cfffffffff +{ + 23.565479423 -59.373328073 + 23.043515376 -59.519155403 + 22.595151149 -59.121973177 + 22.663669418 -58.575218409 + 23.186439764 -58.421510502 + 23.639927115 -58.822429238 +} +834c6dfffffffff +{ + 23.186439764 -58.421510502 + 22.663669418 -58.575218409 + 22.209892217 -58.178901796 + 22.273679798 -57.625327053 + 22.797034465 -57.463727392 + 23.256059937 -57.863581645 +} +834c6efffffffff +{ + 22.970343374 -60.058871513 + 22.454763661 -60.197496364 + 22.034880378 -59.923850901 + 22.090814391 -59.327163795 + 22.250419764 -59.219770477 + 22.595151149 -59.121973177 + 23.043515376 -59.519155403 +} +834c70fffffffff +{ + 22.613002845 -62.796595248 + 22.927304371 -62.589084087 + 23.096653649 -62.549944157 + 23.523384740 -62.944055078 + 23.438726528 -63.450687621 + 23.101446134 -63.523849413 + 22.945237197 -63.626535066 + 22.544719581 -63.367530394 +} +834c71fffffffff +{ + 22.270516206 -61.956067169 + 22.744753313 -61.641684306 + 23.177107893 -62.035770789 + 23.096653649 -62.549944157 + 22.927304371 -62.589084087 + 22.613002845 -62.796595248 + 22.205736417 -62.533803898 +} +834c72fffffffff +{ + 22.071465171 -63.676174900 + 22.544719581 -63.367530394 + 22.945237197 -63.626535066 + 22.873534159 -64.190556748 + 22.403619653 -64.496047509 + 22.002085574 -64.240684262 +} +834c73fffffffff +{ + 21.729160216 -62.845528548 + 22.205736417 -62.533803898 + 22.613002845 -62.796595248 + 22.544719581 -63.367530394 + 22.071465171 -63.676174900 + 21.663189271 -63.416980007 +} +834c74fffffffff +{ + 24.369915046 -63.736330238 + 23.859752077 -63.844613945 + 23.438726528 -63.450687621 + 23.523384740 -62.944055078 + 24.035192668 -62.828274561 + 24.460732571 -63.226631389 +} +834c75fffffffff +{ + 24.035192668 -62.828274561 + 23.523384740 -62.944055078 + 23.096653649 -62.549944157 + 23.177107893 -62.035770789 + 23.690371517 -61.912427216 + 24.121762024 -62.310824805 +} +834c76fffffffff +{ + 23.771000598 -64.343568072 + 23.267372199 -64.445743793 + 22.873534159 -64.190556748 + 22.945237197 -63.626535066 + 23.101446134 -63.523849413 + 23.438726528 -63.450687621 + 23.859752077 -63.844613945 +} 834c80fffffffff { 21.682781747 -73.065890478 @@ -117073,11 +119137,11 @@ { 20.613084639 -74.782038771 20.198212684 -75.187475332 - 19.825710932 -75.115078131 + 19.825710941 -75.115078136 19.665905830 -75.028701586 19.576267526 -74.416927092 19.964312839 -74.066419530 - 20.281702132 -74.239058619 + 20.281702122 -74.239058613 20.467003047 -74.273266709 } 834c99fffffffff @@ -117093,7 +119157,7 @@ { 19.272200678 -75.383034696 19.665905830 -75.028701586 - 19.825710947 -75.115078137 + 19.825710941 -75.115078136 20.198212684 -75.187475332 20.341353914 -75.705163360 19.920260246 -76.113182125 @@ -117121,7 +119185,7 @@ { 20.875640877 -73.870585686 20.467003047 -74.273266709 - 20.281702117 -74.239058611 + 20.281702122 -74.239058613 19.964312839 -74.066419530 19.871667708 -73.458687811 20.254021786 -73.112150189 @@ -117203,11 +119267,11 @@ { 22.541540864 -70.895904977 22.155797086 -71.291364920 - 21.791439350 -71.235966625 + 21.791439359 -71.235966630 21.637682439 -71.150288998 21.535598527 -70.558627499 21.892935498 -70.226159866 - 22.198209230 -70.397030058 + 22.198209221 -70.397030053 22.379211810 -70.422848981 } 834ca9fffffffff @@ -117223,7 +119287,7 @@ { 21.274667408 -71.487077557 21.637682439 -71.150288998 - 21.791439365 -71.235966631 + 21.791439359 -71.235966630 22.155797086 -71.291364920 22.315760051 -71.773662271 21.923713755 -72.172429330 @@ -117251,7 +119315,7 @@ { 22.758697537 -70.030823661 22.379211810 -70.422848981 - 22.198209216 -70.397030050 + 22.198209221 -70.397030053 21.892935498 -70.226159866 21.787922051 -69.639592966 22.139604246 -69.311546011 @@ -117398,11 +119462,11 @@ 16.396698245 -66.226608019 16.004508834 -66.546747008 15.500219094 -66.287603474 - 15.428020403 -65.901925432 + 15.428020405 -65.901925443 15.445434867 -65.716798918 15.949565709 -65.412263821 16.397344185 -65.664899262 - 16.360158812 -66.034334304 + 16.360158810 -66.034334293 } 834cc9fffffffff { @@ -117430,7 +119494,7 @@ 14.482400618 -65.768821908 14.990345861 -65.464003804 15.445434867 -65.716798918 - 15.428020406 -65.901925449 + 15.428020405 -65.901925443 } 834cccfffffffff { @@ -117440,7 +119504,7 @@ 17.278604677 -66.166052478 16.894413409 -66.484834946 16.396698245 -66.226608019 - 16.360158811 -66.034334287 + 16.360158810 -66.034334293 } 834ccdfffffffff { @@ -117591,11 +119655,11 @@ 20.420794519 -66.812277254 20.062592900 -67.130531605 19.588638465 -66.874653261 - 19.513739696 -66.492352547 + 19.513739698 -66.492352559 19.536433084 -66.310234910 20.019517524 -66.010167681 20.430498815 -66.258247419 - 20.383089648 -66.621684911 + 20.383089646 -66.621684900 } 834ce1fffffffff { @@ -117623,7 +119687,7 @@ 18.630223543 -66.362343526 19.117909428 -66.062007645 19.536433084 -66.310234910 - 19.513739699 -66.492352564 + 19.513739698 -66.492352559 } 834ce4fffffffff { @@ -117633,7 +119697,7 @@ 21.238207750 -66.750344510 20.887833171 -67.067267538 20.420794519 -66.812277254 - 20.383089647 -66.621684894 + 20.383089646 -66.621684900 } 834ce5fffffffff { @@ -117976,11 +120040,11 @@ 27.541001141 -65.070767139 27.319774845 -65.649836994 26.850693735 -65.711932375 - 26.686622756 -65.373400948 + 26.686622761 -65.373400958 26.549800739 -65.238188211 26.657334352 -64.730688126 27.180711905 -64.626376170 - 27.456725165 -64.900259822 + 27.456725160 -64.900259812 } 834d19fffffffff { @@ -118008,13 +120072,13 @@ 25.927534557 -65.832643448 26.032758662 -65.336206284 26.549800739 -65.238188211 - 26.686622763 -65.373400963 + 26.686622761 -65.373400958 } 834d1cfffffffff { 28.016696082 -65.001612275 27.541001141 -65.070767139 - 27.456725156 -64.900259808 + 27.456725160 -64.900259812 27.180711905 -64.626376170 27.290433502 -64.107491967 27.820056134 -63.996581702 @@ -118169,11 +120233,11 @@ 31.147106370 -62.760606835 30.924121456 -63.389503802 30.420686003 -63.479040883 - 30.235463126 -63.126291223 + 30.235463131 -63.126291233 30.094160386 -62.982765444 30.216005412 -62.423944428 30.767066356 -62.292416202 - 31.051987519 -62.583110665 + 31.051987513 -62.583110655 } 834d31fffffffff { @@ -118201,13 +120265,13 @@ 29.428705625 -63.652772198 29.548827749 -63.106597519 30.094160386 -62.982765444 - 30.235463134 -63.126291239 + 30.235463131 -63.126291233 } 834d34fffffffff { 31.656596000 -62.662386258 31.147106370 -62.760606835 - 31.051987509 -62.583110650 + 31.051987513 -62.583110655 30.767066356 -62.292416202 30.890425764 -61.720592382 31.447032829 -61.580993587 @@ -118361,11 +120425,11 @@ 834d50fffffffff { 22.613002845 -62.796595248 - 22.927304380 -62.589084081 + 22.927304371 -62.589084087 23.096653649 -62.549944157 23.523384740 -62.944055078 23.438726528 -63.450687621 - 23.101446125 -63.523849419 + 23.101446134 -63.523849413 22.945237197 -63.626535066 22.544719581 -63.367530394 } @@ -118384,7 +120448,7 @@ 23.267372199 -64.445743793 22.873534159 -64.190556748 22.945237197 -63.626535066 - 23.101446139 -63.523849412 + 23.101446134 -63.523849413 23.438726528 -63.450687621 23.859752077 -63.844613945 } @@ -118412,7 +120476,7 @@ 22.744753313 -61.641684306 23.177107893 -62.035770789 23.096653649 -62.549944157 - 22.927304366 -62.589084090 + 22.927304371 -62.589084087 22.613002845 -62.796595248 22.205736417 -62.533803898 } @@ -118491,11 +120555,11 @@ 834d60fffffffff { 21.716161909 -58.447083093 - 22.037088118 -58.230510759 + 22.037088108 -58.230510765 22.209892217 -58.178901796 22.663669418 -58.575218409 22.595151149 -59.121973177 - 22.250419754 -59.219770483 + 22.250419764 -59.219770477 22.090814391 -59.327163795 21.664032386 -59.049943132 } @@ -118514,7 +120578,7 @@ 22.454763661 -60.197496364 22.034880378 -59.923850901 22.090814391 -59.327163795 - 22.250419769 -59.219770475 + 22.250419764 -59.219770477 22.595151149 -59.121973177 23.043515376 -59.519155403 } @@ -118542,7 +120606,7 @@ 21.814638995 -57.230111964 22.273679798 -57.625327053 22.209892217 -58.178901796 - 22.037088103 -58.230510769 + 22.037088108 -58.230510765 21.716161909 -58.447083093 21.282454869 -58.166355673 } @@ -118749,11 +120813,11 @@ 834d88fffffffff { 25.866853442 -70.014594173 - 26.111470689 -69.745659460 + 26.111470681 -69.745659468 26.189496984 -69.561777994 26.655304120 -69.536976693 26.887385374 -70.072633523 - 26.727493007 -70.443946318 + 26.727493014 -70.443946310 26.604552758 -70.580369259 26.049780532 -70.498924126 } @@ -118763,7 +120827,7 @@ 25.502218577 -69.065892585 25.959974952 -69.036777117 26.189496984 -69.561777994 - 26.111470678 -69.745659472 + 26.111470681 -69.745659468 25.866853442 -70.014594173 25.316708329 -69.937694850 } @@ -118809,18 +120873,18 @@ 27.349946800 -71.161304293 26.790742918 -71.075112835 26.604552758 -70.580369259 - 26.727493016 -70.443946305 + 26.727493014 -70.443946310 26.887385374 -70.072633523 27.361268331 -70.052427523 } 834d90fffffffff { 28.679141997 -73.328832303 - 28.931641565 -73.041807500 + 28.931641557 -73.041807509 29.019130600 -72.851524803 29.517411450 -72.858711761 29.752800953 -73.446597824 - 29.573363978 -73.830334516 + 29.573363986 -73.830334507 29.446454267 -73.975867121 28.871069492 -73.867035917 } @@ -118830,7 +120894,7 @@ 28.294849568 -72.274321166 28.785207275 -72.275597863 29.019130600 -72.851524803 - 28.931641553 -73.041807513 + 28.931641557 -73.041807509 28.679141997 -73.328832303 28.107469156 -73.225609102 } @@ -118876,7 +120940,7 @@ 30.219492200 -74.640468167 29.640672098 -74.525790055 29.446454267 -73.975867121 - 29.573363988 -73.830334501 + 29.573363986 -73.830334507 29.752800953 -73.446597824 30.258951262 -73.460063534 } @@ -119138,11 +121202,11 @@ 20.042044299 152.682644457 20.657435618 152.592316307 20.925260558 151.976485674 - 20.692093027 151.630539652 + 20.692093034 151.630539662 20.576394293 151.457043302 19.961598782 151.551825124 19.695261303 152.164570062 - 19.927382770 152.509093361 + 19.927382763 152.509093350 } 834e01fffffffff { @@ -119170,7 +121234,7 @@ 21.452013730 150.743452496 20.840951145 150.839593685 20.576394293 151.457043302 - 20.692093038 151.630539667 + 20.692093034 151.630539662 } 834e04fffffffff { @@ -119180,7 +121244,7 @@ 19.158694313 153.378829058 19.771066613 153.293729220 20.042044299 152.682644457 - 19.927382759 152.509093345 + 19.927382763 152.509093350 } 834e05fffffffff { @@ -120533,11 +122597,11 @@ 26.702715705 144.484443993 27.315297919 144.335606084 27.530958202 143.699925586 - 27.266485973 143.380797370 + 27.266485981 143.380797379 27.151188835 143.198704457 26.573366886 143.307215169 26.341123740 143.960330985 - 26.572151361 144.323342423 + 26.572151353 144.323342413 } 834ec9fffffffff { @@ -120565,7 +122629,7 @@ 27.949605977 142.433221757 27.378351899 142.542861115 27.151188835 143.198704457 - 27.266485985 143.380797384 + 27.266485981 143.380797379 } 834eccfffffffff { @@ -120575,7 +122639,7 @@ 25.867196304 145.260390980 26.480644102 145.117457181 26.702715705 144.484443993 - 26.572151350 144.323342408 + 26.572151353 144.323342413 } 834ecdfffffffff { @@ -120726,11 +122790,11 @@ 23.448532301 148.658933166 24.066900347 148.539770281 24.312061162 147.910903395 - 24.062569718 147.576065761 + 24.062569725 147.576065771 23.947256859 147.397440804 23.347621905 147.499412041 23.094411749 148.135101356 - 23.325631324 148.490464956 + 23.325631317 148.490464946 } 834ee1fffffffff { @@ -120758,7 +122822,7 @@ 24.791240433 146.654681358 24.196912224 146.757923063 23.947256859 147.397440804 - 24.062569729 147.576065776 + 24.062569725 147.576065771 } 834ee4fffffffff { @@ -120768,7 +122832,7 @@ 22.581163304 149.397497709 23.198447080 149.283973800 23.448532301 148.658933166 - 23.325631314 148.490464941 + 23.325631317 148.490464946 } 834ee5fffffffff { @@ -121111,11 +123175,11 @@ 16.555031711 156.526329603 17.158885758 156.463223592 17.441316934 155.865545937 - 17.224928979 155.512920169 + 17.224928986 155.512920180 17.108559548 155.345877372 16.486224900 155.433107560 16.215216277 156.018690462 - 16.448744236 156.349867951 + 16.448744230 156.349867941 } 834f19fffffffff { @@ -121143,7 +123207,7 @@ 17.999989209 154.666330490 17.379628426 154.754958094 17.108559548 155.345877372 - 17.224928989 155.512920185 + 17.224928986 155.512920180 } 834f1cfffffffff { @@ -121153,7 +123217,7 @@ 15.672237489 157.176986556 16.271321469 157.118599008 16.555031711 156.526329603 - 16.448744226 156.349867936 + 16.448744230 156.349867941 } 834f1dfffffffff { @@ -121304,11 +123368,11 @@ 13.061350264 160.169690874 13.646053742 160.131641523 13.934680912 159.556013805 - 13.734703841 159.200737837 + 13.734703847 159.200737848 13.617535289 159.041114481 12.995567987 159.120694380 12.728067846 159.676231591 - 12.963174277 159.992275064 + 12.963174271 159.992275054 } 834f31fffffffff { @@ -121336,7 +123400,7 @@ 14.508596927 158.398876236 13.886816284 158.479847174 13.617535289 159.041114481 - 13.734703850 159.200737853 + 13.734703847 159.200737848 } 834f34fffffffff { @@ -121346,7 +123410,7 @@ 12.194726726 160.773389703 12.773229576 160.739495759 13.061350264 160.169690874 - 12.963174267 159.992275049 + 12.963174271 159.992275054 } 834f35fffffffff { @@ -122253,11 +124317,11 @@ 19.617306014 -129.980707014 20.188283713 -129.720493586 20.715212080 -130.098643982 - 20.683043940 -130.523440193 + 20.683043941 -130.523440180 20.667995472 -130.735928365 20.095537292 -130.993223953 19.570519962 -130.613564621 - 19.602906978 -130.191801836 + 19.602906977 -130.191801848 } 835001fffffffff { @@ -122285,7 +124349,7 @@ 21.762122324 -130.859701744 21.193340348 -131.118338328 20.667995472 -130.735928365 - 20.683043941 -130.523440174 + 20.683043941 -130.523440180 } 835004fffffffff { @@ -122295,7 +124359,7 @@ 18.522587328 -129.864713822 19.089539189 -129.605942569 19.617306014 -129.980707014 - 19.602906976 -130.191801855 + 19.602906977 -130.191801848 } 835005fffffffff { @@ -123648,11 +125712,11 @@ 29.245189465 -133.129441362 29.831074166 -132.873510131 30.320274059 -133.283000481 - 30.253916565 -133.725220980 + 30.253916567 -133.725220967 30.245822902 -133.955159591 29.708528862 -134.224824880 29.196100946 -133.805623089 - 29.213815302 -133.349262815 + 29.213815300 -133.349262829 } 8350c9fffffffff { @@ -123680,7 +125744,7 @@ 31.285608666 -134.106488972 30.754758532 -134.377546090 30.245822902 -133.955159591 - 30.253916568 -133.725220961 + 30.253916567 -133.725220967 } 8350ccfffffffff { @@ -123690,7 +125754,7 @@ 28.166032618 -132.978536105 28.751369381 -132.723801774 29.245189465 -133.129441362 - 29.213815299 -133.349262835 + 29.213815300 -133.349262829 } 8350cdfffffffff { @@ -123841,11 +125905,11 @@ 24.472163982 -131.505508195 25.054493613 -131.246846695 25.566960849 -131.640369589 - 25.518003357 -132.074095824 + 25.518003358 -132.074095811 25.506945544 -132.295152916 24.948874512 -132.558712507 24.425392594 -132.159813213 - 24.449465975 -131.721067752 + 24.449465974 -131.721067765 } 8350e1fffffffff { @@ -123873,7 +125937,7 @@ 26.581619540 -132.432084347 26.028764371 -132.697015255 25.506945544 -132.295152916 - 25.518003359 -132.074095804 + 25.518003358 -132.074095811 } 8350e4fffffffff { @@ -123883,7 +125947,7 @@ 23.376844468 -131.372924071 23.956872160 -131.115600645 24.472163982 -131.505508195 - 24.449465974 -131.721067771 + 24.449465974 -131.721067765 } 8350e5fffffffff { @@ -124226,11 +126290,11 @@ 14.759379255 -128.548202388 15.311520849 -128.287426857 15.843357559 -128.650841098 - 15.826706665 -129.066430070 + 15.826706665 -129.066430058 15.806902099 -129.270688750 15.227418049 -129.521647646 14.710478235 -129.160167143 - 14.752578288 -128.754705570 + 14.752578287 -128.754705582 } 835119fffffffff { @@ -124258,7 +126322,7 @@ 16.903675010 -129.382456057 16.326142148 -129.634718541 15.806902099 -129.270688750 - 15.826706666 -129.066430051 + 15.826706665 -129.066430058 } 83511cfffffffff { @@ -124268,7 +126332,7 @@ 13.682125309 -128.447213483 14.228702638 -128.187953528 14.759379255 -128.548202388 - 14.752578287 -128.754705588 + 14.752578287 -128.754705582 } 83511dfffffffff { @@ -124419,11 +126483,11 @@ 9.976220940 -127.201497731 10.503029614 -126.940985896 11.030333343 -127.290321284 - 11.027373100 -127.696554170 + 11.027373100 -127.696554158 11.002370489 -127.892937732 10.423517170 -128.137555360 9.923504633 -127.793212243 - 9.976056546 -127.403343776 + 9.976056546 -127.403343788 } 835131fffffffff { @@ -124451,7 +126515,7 @@ 12.085116663 -127.993761971 11.506460001 -128.239640883 11.002370489 -127.892937732 - 11.027373100 -127.696554152 + 11.027373100 -127.696554158 } 835134fffffffff { @@ -124461,7 +126525,7 @@ 8.931891500 -127.114065802 9.451908906 -126.855117766 9.976220940 -127.201497731 - 9.976056545 -127.403343794 + 9.976056546 -127.403343788 } 835135fffffffff { @@ -126882,11 +128946,11 @@ 8352d8fffffffff { 9.975902718 45.307079131 - 9.597823184 45.220159523 + 9.597823195 45.220159526 9.412807935 45.223037208 9.085820718 45.736622168 9.314188497 46.237727166 - 9.682234352 46.230327964 + 9.682234341 46.230327961 9.869886395 46.274971316 10.206346736 45.859211307 } @@ -126896,7 +128960,7 @@ 9.762691218 47.228355151 10.097337732 46.821507602 9.869886395 46.274971316 - 9.682234335 46.230327961 + 9.682234341 46.230327961 9.314188497 46.237727166 8.987411973 46.747315277 } @@ -126942,7 +129006,7 @@ 9.509409047 44.198266169 9.182361306 44.715575524 9.412807935 45.223037208 - 9.597823200 45.220159527 + 9.597823195 45.220159526 9.975902718 45.307079131 10.314040615 44.882421891 } @@ -127898,11 +129962,11 @@ 26.580325378 51.169694230 25.982531420 50.993995323 25.555067879 51.424500358 - 25.666850205 51.825718237 + 25.666850202 51.825718225 25.687082328 52.042466273 26.212695380 52.256242453 26.679309651 51.811871693 - 26.635564737 51.373188537 + 26.635564740 51.373188549 } 835369fffffffff { @@ -127930,13 +129994,13 @@ 24.706441324 52.266543550 25.224029603 52.479259734 25.687082328 52.042466273 - 25.666850200 51.825718219 + 25.666850202 51.825718225 } 83536cfffffffff { 27.012337730 50.731935901 26.580325378 51.169694230 - 26.635564741 51.373188556 + 26.635564740 51.373188549 26.679309651 51.811871693 27.212804095 52.026672510 27.682675138 51.574479085 @@ -129983,11 +132047,11 @@ 8354d8fffffffff { 7.994097757 -16.598117998 - 7.706705709 -16.860746179 + 7.706705718 -16.860746171 7.544081264 -16.949806017 7.010645748 -16.665876897 6.967601484 -16.118684603 - 7.292082673 -15.943482054 + 7.292082664 -15.943482062 7.434122324 -15.812116020 7.928094560 -16.005689826 } @@ -129997,7 +132061,7 @@ 6.880832665 -15.039356863 7.368772399 -15.226558839 7.434122324 -15.812116020 - 7.292082660 -15.943482065 + 7.292082664 -15.943482062 6.967601484 -16.118684603 6.436510601 -15.837771283 } @@ -130043,7 +132107,7 @@ 8.124363819 -17.790957332 7.588871735 -17.504081650 7.544081264 -16.949806017 - 7.706705722 -16.860746167 + 7.706705718 -16.860746171 7.994097757 -16.598117998 8.493970884 -16.798182056 } @@ -130999,11 +133063,11 @@ 19.600949026 -3.076706496 19.167796385 -3.544296901 18.602420804 -3.422040386 - 18.514817409 -3.033431891 + 18.514817412 -3.033431903 18.433094910 -2.845151016 18.788327161 -2.388820276 19.392526968 -2.499653205 - 19.555291627 -2.880799874 + 19.555291625 -2.880799862 } 835569fffffffff { @@ -131031,13 +133095,13 @@ 17.484597774 -3.182723735 17.834115161 -2.733877476 18.433094910 -2.845151016 - 18.514817413 -3.033431909 + 18.514817412 -3.033431903 } 83556cfffffffff { 20.172255239 -3.197617099 19.600949026 -3.076706496 - 19.555291622 -2.880799857 + 19.555291625 -2.880799862 19.392526968 -2.499653205 19.753274644 -2.035641988 20.362429922 -2.145973937 @@ -131568,11 +133632,11 @@ 835600fffffffff { 15.608660618 -35.012243586 - 15.271357871 -35.232730776 + 15.271357881 -35.232730769 15.103363923 -35.343980458 14.566117295 -35.021385223 14.534004635 -34.366212036 - 14.870468695 -34.145117913 + 14.870468685 -34.145117920 15.037875819 -34.033045364 15.576517019 -34.353853821 } @@ -131582,7 +133646,7 @@ 14.464634947 -33.061980385 15.002226535 -33.376345965 15.037875819 -34.033045364 - 14.870468680 -34.145117923 + 14.870468685 -34.145117920 14.534004635 -34.366212036 13.993326191 -34.043981220 } @@ -131628,7 +133692,7 @@ 15.666830213 -36.324058612 15.133347482 -36.001286871 15.103363923 -35.343980458 - 15.271357886 -35.232730766 + 15.271357881 -35.232730769 15.608660618 -35.012243586 16.147957896 -35.339402663 } @@ -132334,11 +134398,11 @@ 835668fffffffff { 11.841972802 -25.414419231 - 11.527321678 -25.664529413 + 11.527321687 -25.664529406 11.360626258 -25.766539415 10.812673739 -25.456467357 10.766807548 -24.843314148 - 11.100053327 -24.641744602 + 11.100053318 -24.641744610 11.255780202 -24.515790349 11.784023896 -24.774392335 } @@ -132348,7 +134412,7 @@ 10.672390551 -23.629131103 11.196520407 -23.880780860 11.255780202 -24.515790349 - 11.100053313 -24.641744613 + 11.100053318 -24.641744610 10.766807548 -24.843314148 10.218489481 -24.535259489 } @@ -132394,18 +134458,18 @@ 11.953698076 -26.696978168 11.406477660 -26.385029588 11.360626258 -25.766539415 - 11.527321692 -25.664529402 + 11.527321687 -25.664529406 11.841972802 -25.414419231 12.374036374 -25.680010293 } 835670fffffffff { 13.758544483 -30.141080622 - 13.431640153 -30.378526356 + 13.431640163 -30.378526349 13.263944493 -30.485791029 12.718051718 -30.167357264 12.676839671 -29.529275288 - 13.012402189 -29.316740189 + 13.012402180 -29.316740196 13.174392401 -29.196645513 13.711326976 -29.487435986 } @@ -132415,7 +134479,7 @@ 12.590481609 -28.262576303 13.124735174 -28.546510269 13.174392401 -29.196645513 - 13.012402175 -29.316740199 + 13.012402180 -29.316740196 12.676839671 -29.529275288 12.129028506 -29.212097242 } @@ -132461,7 +134525,7 @@ 13.847681302 -31.447280984 13.304072454 -31.127761762 13.263944493 -30.485791029 - 13.431640168 -30.378526346 + 13.431640163 -30.378526349 13.758544483 -30.141080622 14.297802171 -30.438702989 } @@ -134296,11 +136360,11 @@ 835788fffffffff { 17.347105934 -39.961953207 - 17.001939284 -40.161648006 + 17.001939294 -40.161648000 16.834337428 -40.275348401 16.311850330 -39.953268848 16.292906264 -39.290183857 - 16.628874629 -39.063506347 + 16.628874619 -39.063506353 16.800504517 -38.961431042 17.333564644 -39.308564304 } @@ -134310,7 +136374,7 @@ 16.248891797 -37.966314275 16.782587140 -38.307734292 16.800504517 -38.961431042 - 16.628874614 -39.063506356 + 16.628874619 -39.063506353 16.292906264 -39.290183857 15.765652356 -38.967515032 } @@ -134356,18 +136420,18 @@ 17.367709974 -41.259933206 16.850260363 -40.938632736 16.834337428 -40.275348401 - 17.001939299 -40.161647997 + 17.001939294 -40.161648000 17.347105934 -39.961953207 17.879137103 -40.314643058 } 835790fffffffff { 18.935670176 -44.917552438 - 18.585697076 -45.093451894 + 18.585697087 -45.093451889 18.419159017 -45.207924078 17.916518992 -44.891128504 17.913897794 -44.229927834 - 18.248008813 -44.000988743 + 18.248008803 -44.000988748 18.422385285 -43.910508119 18.942971064 -44.278968238 } @@ -134377,7 +136441,7 @@ 17.901934988 -42.905866359 18.424737013 -43.269609578 18.422385285 -43.910508119 - 18.248008798 -44.000988752 + 18.248008803 -44.000988748 17.913897794 -44.229927834 17.405444086 -43.911609103 } @@ -134423,7 +136487,7 @@ 18.914756858 -46.182474577 18.418122501 -45.867377197 18.419159017 -45.207924078 - 18.585697092 -45.093451886 + 18.585697087 -45.093451889 18.935670176 -44.917552438 19.453680308 -45.290521408 } @@ -136198,11 +138262,11 @@ 8358d8fffffffff { 5.539501379 10.870896151 - 5.161709659 10.896824858 + 5.161709671 10.896824857 4.966874619 10.872068742 4.660918901 11.342353107 4.942239974 11.889144776 - 5.333783977 11.937427691 + 5.333783965 11.937427692 5.523597670 11.926184914 5.817012434 11.379373705 } @@ -136212,7 +138276,7 @@ 5.505707356 12.988442348 5.801065482 12.440878462 5.523597670 11.926184914 - 5.333783960 11.937427691 + 5.333783965 11.937427692 4.942239974 11.889144776 4.633666450 12.366271235 } @@ -136258,7 +138322,7 @@ 4.989683573 9.867155862 4.686394048 10.330434880 4.966874619 10.872068742 - 5.161709676 10.896824857 + 5.161709671 10.896824857 5.539501379 10.870896151 5.830885953 10.325210483 } @@ -137718,11 +139782,11 @@ { 14.570869276 -4.173236974 14.038745383 -4.052519030 - 13.966817856 -3.680439473 + 13.966817861 -3.680439484 13.883350494 -3.501449316 14.209688209 -3.071071245 14.790635488 -3.179871343 - 14.957265762 -3.542028038 + 14.957265757 -3.542028027 14.994945725 -3.729557663 } 8359b1fffffffff @@ -137742,7 +139806,7 @@ 12.988678178 -3.815956764 13.308711670 -3.392334535 13.883350494 -3.501449316 - 13.966817862 -3.680439489 + 13.966817861 -3.680439484 } 8359b3fffffffff { @@ -137766,7 +139830,7 @@ { 15.534009326 -3.849151647 14.994945725 -3.729557663 - 14.957265755 -3.542028021 + 14.957265757 -3.542028027 14.790635488 -3.179871343 15.123170145 -2.742566597 15.710249388 -2.851002662 @@ -140310,11 +142374,11 @@ 6.318375236 166.815524890 6.848271750 166.819961146 7.126743882 166.295441876 - 6.956087079 165.944720264 + 6.956087084 165.944720274 6.837680777 165.801491533 6.237907024 165.866306479 5.997231112 166.357894602 - 6.234531496 166.640929844 + 6.234531491 166.640929833 } 835b69fffffffff { @@ -140342,7 +142406,7 @@ 7.685350844 165.237889303 7.082678032 165.303985620 6.837680777 165.801491533 - 6.956087086 165.944720280 + 6.956087084 165.944720274 } 835b6cfffffffff { @@ -140352,7 +142416,7 @@ 5.521103943 167.326554624 6.043153179 167.334010527 6.318375236 166.815524890 - 6.234531487 166.640929829 + 6.234531491 166.640929833 } 835b6dfffffffff { @@ -140819,11 +142883,11 @@ { 12.079685423 -176.655147601 12.680639395 -176.530252813 - 12.963168884 -176.812605048 + 12.963168877 -176.812605039 13.073082251 -176.971854535 12.831203935 -177.555627742 12.262649675 -177.656922195 - 12.046830647 -177.338635403 + 12.046830654 -177.338635412 11.905760085 -177.198964781 } 835bb1fffffffff @@ -140839,7 +142903,7 @@ { 13.646365019 -176.865708660 13.073082251 -176.971854535 - 12.963168873 -176.812605034 + 12.963168877 -176.812605039 12.680639395 -176.530252813 12.857703873 -175.978147610 13.462806650 -175.849624088 @@ -140867,7 +142931,7 @@ { 11.309243471 -177.320303764 11.905760085 -177.198964781 - 12.046830657 -177.338635417 + 12.046830654 -177.338635412 12.262649675 -177.656922195 12.019954672 -178.236322745 11.456429558 -178.332857024 @@ -145488,11 +147552,11 @@ 835ed8fffffffff { 20.636349761 -53.871080726 - 20.962863365 -53.647538704 + 20.962863355 -53.647538711 21.137783050 -53.582876091 21.617223224 -53.976001893 21.567562820 -54.559511058 - 21.217953295 -54.683296987 + 21.217953305 -54.683296981 21.055453622 -54.794420154 20.602107421 -54.500848675 } @@ -145502,7 +147566,7 @@ 21.463633807 -55.709580210 21.017191992 -55.419146541 21.055453622 -54.794420154 - 21.217953310 -54.683296979 + 21.217953305 -54.683296981 21.567562820 -54.559511058 22.042194174 -54.954691512 } @@ -145548,7 +147612,7 @@ 20.698333878 -52.602859555 21.182358147 -52.993682870 21.137783050 -53.582876091 - 20.962863350 -53.647538714 + 20.962863355 -53.647538711 20.636349761 -53.871080726 20.176133192 -53.574480074 } @@ -146504,11 +148568,11 @@ 6.474796820 -64.487202023 7.008797499 -64.173554326 7.524040996 -64.435571743 - 7.511138774 -64.817305715 + 7.511138775 -64.817305704 7.542307720 -65.012891085 7.083894979 -65.336579487 6.530364901 -65.070826930 - 6.469782563 -64.678498512 + 6.469782563 -64.678498524 } 835f69fffffffff { @@ -146536,7 +148600,7 @@ 8.542069322 -64.955385616 8.091078718 -65.277667876 7.542307720 -65.012891085 - 7.511138775 -64.817305698 + 7.511138775 -64.817305704 } 835f6cfffffffff { @@ -146546,7 +148610,7 @@ 5.418558414 -64.538959958 5.953861199 -64.224998697 6.474796820 -64.487202023 - 6.469782564 -64.678498530 + 6.469782563 -64.678498524 } 835f6dfffffffff { @@ -148589,11 +150653,11 @@ 8360d8fffffffff { 17.850392647 68.752190676 - 18.218324743 68.623788743 + 18.218324732 68.623788747 18.375192608 68.520424407 18.391137217 67.884987132 17.937747637 67.567019907 - 17.628089376 67.776062897 + 17.628089387 67.776062893 17.445165356 67.839748854 17.371602320 68.389723796 } @@ -148603,7 +150667,7 @@ 17.041704534 66.944382668 16.969080644 67.485048592 17.445165356 67.839748854 - 17.628089392 67.776062890 + 17.628089387 67.776062893 17.937747637 67.567019907 17.950691837 66.936580761 } @@ -148649,7 +150713,7 @@ 18.811896376 69.487647140 18.831059129 68.847492776 18.375192608 68.520424407 - 18.218324727 68.623788749 + 18.218324732 68.623788747 17.850392647 68.752190676 17.775730951 69.311450305 } @@ -149605,11 +151669,11 @@ 0.794573135 72.758470770 1.384123094 72.572409582 1.537888444 72.016003384 - 1.249088834 71.771006563 + 1.249088842 71.771006570 1.126614692 71.617451983 0.580593708 71.740263720 0.402953624 72.327202277 - 0.650530250 72.634339337 + 0.650530242 72.634339330 } 836169fffffffff { @@ -149637,7 +151701,7 @@ 1.841400724 70.915894602 1.302022798 71.034919847 1.126614692 71.617451983 - 1.249088847 71.771006573 + 1.249088842 71.771006570 } 83616cfffffffff { @@ -149647,7 +151711,7 @@ 0.046172208 73.505614437 0.637340001 73.319403469 0.794573135 72.758470770 - 0.650530238 72.634339325 + 0.650530242 72.634339330 } 83616dfffffffff { @@ -150174,21 +152238,21 @@ 836200fffffffff { 10.767064919 57.853504970 - 10.428060712 57.742788626 + 10.428060722 57.742788630 10.261717257 57.754701600 - 10.053358359 58.048009663 + 10.053358365 58.048009654 10.012906580 58.212297057 - 10.222690110 58.504518918 + 10.222690104 58.504518909 10.363930346 58.594618223 - 10.702418821 58.482304124 + 10.702418811 58.482304128 10.830335982 58.373407348 - 10.829526627 58.010907866 + 10.829526627 58.010907877 } 836202fffffffff { 9.573553742 58.267356227 10.012906580 58.212297057 - 10.053358369 58.048009650 + 10.053358365 58.048009654 10.261717257 57.754701600 10.073488710 57.347628204 9.568475442 57.382757466 @@ -150202,13 +152266,13 @@ 9.766368030 59.205758459 10.278974403 59.036226352 10.363930346 58.594618223 - 10.222690101 58.504518905 + 10.222690104 58.504518909 } 836204fffffffff { 11.090092439 57.545212348 10.767064919 57.853504970 - 10.829526627 58.010907882 + 10.829526627 58.010907877 10.830335982 58.373407348 11.217498255 58.592106070 11.606794423 58.262028792 @@ -150220,7 +152284,7 @@ 11.218223438 59.141712506 11.217498255 58.592106070 10.830335982 58.373407348 - 10.702418806 58.482304129 + 10.702418811 58.482304128 10.363930346 58.594618223 10.278974403 59.036226352 } @@ -150230,10 +152294,75 @@ 10.387346934 56.902221373 10.073488710 57.347628204 10.261717257 57.754701600 - 10.428060727 57.742788631 + 10.428060722 57.742788630 10.767064919 57.853504970 11.090092439 57.545212348 } +836208fffffffff +{ + 10.447023493 60.676669107 + 10.968726839 60.503338660 + 11.053499669 60.044671754 + 10.621516817 59.762180721 + 10.104357051 59.933619220 + 10.014655468 60.389444040 +} +836209fffffffff +{ + 10.794250850 61.435130715 + 11.320482945 61.259926898 + 11.405245740 60.792570851 + 10.968726839 60.503338660 + 10.447023493 60.676669107 + 10.357328454 61.141109495 +} +83620afffffffff +{ + 9.492316543 60.561906360 + 10.014655468 60.389444040 + 10.104357051 59.933619220 + 9.676609705 59.653071881 + 9.417982919 59.738354656 + 9.194073312 59.769449981 + 9.064330757 60.276665314 +} +83620bfffffffff +{ + 9.830369256 61.315435772 + 10.357328454 61.141109495 + 10.447023493 60.676669107 + 10.014655468 60.389444040 + 9.492316543 60.561906360 + 9.397745033 61.023461877 +} +83620cfffffffff +{ + 11.053499669 60.044671754 + 11.569829141 59.872367982 + 11.609961976 59.645328128 + 11.609854287 59.367690323 + 11.218223438 59.141712506 + 10.706356238 59.312098903 + 10.621516817 59.762180721 +} +83620dfffffffff +{ + 11.405245740 60.792570851 + 11.926023768 60.618364906 + 12.005816970 60.156825413 + 11.569829141 59.872367982 + 11.053499669 60.044671754 + 10.968726839 60.503338660 +} +83620efffffffff +{ + 10.104357051 59.933619220 + 10.621516817 59.762180721 + 10.706356238 59.312098903 + 10.278974403 59.036226352 + 9.766368030 59.205758459 + 9.676609705 59.653071881 +} 836210fffffffff { 8.861855355 57.005409528 @@ -150559,6 +152688,457 @@ 11.888837364 56.104154752 12.224713978 55.774540652 } +836240fffffffff +{ + 12.855291264 63.941689346 + 13.393621778 63.760115827 + 13.473830426 63.262990839 + 13.020657507 62.950613500 + 12.486667776 63.130390952 + 12.401524013 63.624350058 +} +836241fffffffff +{ + 13.227646528 64.769283339 + 13.770276431 64.585953111 + 13.850805508 64.079746286 + 13.393621778 63.760115827 + 12.855291264 63.941689346 + 12.769857892 64.444659652 +} +836242fffffffff +{ + 11.861848884 63.805016828 + 12.401524013 63.624350058 + 12.486667776 63.130390952 + 12.037052105 62.820239454 + 11.501828434 62.999116299 + 11.411784483 63.489942514 +} +836243fffffffff +{ + 12.225768873 64.627078304 + 12.769857892 64.444659652 + 12.855291264 63.941689346 + 12.401524013 63.624350058 + 11.861848884 63.805016828 + 11.771541616 64.304784057 +} +836244fffffffff +{ + 13.473830426 63.262990839 + 14.006274395 63.082305576 + 14.043997448 62.836065494 + 14.045562861 62.542896701 + 13.628822134 62.283659531 + 13.100640604 62.462507585 + 13.020657507 62.950613500 +} +836245fffffffff +{ + 13.850805508 64.079746286 + 14.387472777 63.897258965 + 14.462720905 63.396934687 + 14.006274395 63.082305576 + 13.473830426 63.262990839 + 13.393621778 63.760115827 +} +836246fffffffff +{ + 12.486667776 63.130390952 + 13.020657507 62.950613500 + 13.100640604 62.462507585 + 12.651606421 62.157279903 + 12.121992847 62.335227367 + 12.037052105 62.820239454 +} +836248fffffffff +{ + 12.964409650 66.320231130 + 13.517188202 66.134445584 + 13.603493845 65.613313046 + 13.141828693 65.281316162 + 12.593369679 65.465443041 + 12.502268579 65.983237665 +} +836249fffffffff +{ + 13.338623592 67.191538172 + 13.895664424 67.004149705 + 13.982569891 66.473895668 + 13.517188202 66.134445584 + 12.964409650 66.320231130 + 12.872761620 66.847083436 +} +83624afffffffff +{ + 11.948130959 66.168112783 + 12.502268579 65.983237665 + 12.593369679 65.465443041 + 12.135111924 65.135839574 + 11.585408893 65.319058103 + 11.489543017 65.833548496 +} +83624bfffffffff +{ + 12.314242939 67.033561055 + 12.872761620 66.847083436 + 12.964409650 66.320231130 + 12.502268579 65.983237665 + 11.948130959 66.168112783 + 11.851766167 66.691597204 +} +83624cfffffffff +{ + 13.603493845 65.613313046 + 14.150375493 65.428271206 + 14.231328533 64.912933027 + 13.770276431 64.585953111 + 13.227646528 64.769283339 + 13.141828693 65.281316162 +} +83624dfffffffff +{ + 13.982569891 66.473895668 + 14.533649174 66.287193345 + 14.615138566 65.762688832 + 14.150375493 65.428271206 + 13.603493845 65.613313046 + 13.517188202 66.134445584 +} +83624efffffffff +{ + 12.593369679 65.465443041 + 13.141828693 65.281316162 + 13.227646528 64.769283339 + 12.769857892 64.444659652 + 12.225768873 64.627078304 + 12.135111924 65.135839574 +} +836250fffffffff +{ + 10.519899204 62.869148469 + 11.056044908 62.691165083 + 11.145904043 62.209214361 + 10.704505600 61.908282769 + 10.172942295 62.084450937 + 10.078213070 62.563372337 +} +836251fffffffff +{ + 10.871083913 63.669709545 + 11.411784483 63.489942514 + 11.501828434 62.999116299 + 11.056044908 62.691165083 + 10.519899204 62.869148469 + 10.424999283 63.356874372 +} +836252fffffffff +{ + 9.541456203 62.740469363 + 10.078213070 62.563372337 + 10.172942295 62.084450937 + 9.735747229 61.785630420 + 9.203664495 61.960919765 + 9.104122237 62.436843476 +} +836253fffffffff +{ + 9.883591811 63.535748628 + 10.424999283 63.356874372 + 10.519899204 62.869148469 + 10.078213070 62.563372337 + 9.541456203 62.740469363 + 9.441753533 63.225127125 +} +836254fffffffff +{ + 11.145904043 62.209214361 + 11.676644764 62.032160173 + 11.761461080 61.556019270 + 11.320482945 61.259926898 + 10.794250850 61.435130715 + 10.704505600 61.908282769 +} +836255fffffffff +{ + 11.501828434 62.999116299 + 12.037052105 62.820239454 + 12.121992847 62.335227367 + 11.676644764 62.032160173 + 11.145904043 62.209214361 + 11.056044908 62.691165083 +} +836256fffffffff +{ + 10.172942295 62.084450937 + 10.704505600 61.908282769 + 10.794250850 61.435130715 + 10.357328454 61.141109495 + 9.830369256 61.315435772 + 9.735747229 61.785630420 +} +836258fffffffff +{ + 10.580245725 65.174137854 + 11.130859138 64.991821091 + 11.226319813 64.486297964 + 10.775942655 64.166306733 + 10.229914205 64.346922690 + 10.129694657 64.849240693 +} +836259fffffffff +{ + 10.934387328 66.017519519 + 11.489543017 65.833548496 + 11.585408893 65.319058103 + 11.130859138 64.991821091 + 10.580245725 65.174137854 + 10.479655415 65.685357323 +} +83625afffffffff +{ + 9.578503516 65.030662248 + 10.129694657 64.849240693 + 10.229914205 64.346922690 + 9.783665713 64.029208413 + 9.237155350 64.208933177 + 9.132230942 64.708078686 +} +83625bfffffffff +{ + 9.923822141 65.868430567 + 10.479655415 65.685357323 + 10.580245725 65.174137854 + 10.129694657 64.849240693 + 9.578503516 65.030662248 + 9.473238499 65.538643724 +} +83625cfffffffff +{ + 11.226319813 64.486297964 + 11.771541616 64.304784057 + 11.861848884 63.805016828 + 11.411784483 63.489942514 + 10.871083913 63.669709545 + 10.775942655 64.166306733 +} +83625dfffffffff +{ + 11.585408893 65.319058103 + 12.135111924 65.135839574 + 12.225768873 64.627078304 + 11.771541616 64.304784057 + 11.226319813 64.486297964 + 11.130859138 64.991821091 +} +83625efffffffff +{ + 10.229914205 64.346922690 + 10.775942655 64.166306733 + 10.871083913 63.669709545 + 10.424999283 63.356874372 + 9.883591811 63.535748628 + 9.783665713 64.029208413 +} +836260fffffffff +{ + 14.893671682 61.294360752 + 14.469268192 61.627909826 + 14.468557587 62.216089017 + 14.893588368 62.478209754 + 15.323644509 62.146754184 + 15.322996261 61.551006561 +} +836261fffffffff +{ + 15.323644509 62.146754184 + 14.893588368 62.478209754 + 14.891256188 63.072447900 + 15.320178863 63.342897554 + 15.755902568 63.013807138 + 15.757017151 62.411820855 +} +836262fffffffff +{ + 14.048292711 61.373993684 + 13.630821375 61.702860736 + 13.628822134 62.283659531 + 14.045562861 62.542896701 + 14.468557587 62.216089017 + 14.469268192 61.627909826 +} +836263fffffffff +{ + 14.468557587 62.216089017 + 14.045562861 62.542896701 + 14.043997448 62.836065494 + 14.006274395 63.082305576 + 14.462720905 63.396934687 + 14.891256188 63.072447900 + 14.893588368 62.478209754 +} +836264fffffffff +{ + 15.317004103 60.364768957 + 14.891447767 60.704989209 + 14.893671682 61.294360752 + 15.322996261 61.551006561 + 15.754311283 61.212642747 + 15.750519139 60.615699375 +} +836265fffffffff +{ + 15.754311283 61.212642747 + 15.322996261 61.551006561 + 15.323644509 62.146754184 + 15.757017151 62.411820855 + 16.194112493 62.075585225 + 16.192032948 61.472073941 +} +836266fffffffff +{ + 14.466332341 60.456625953 + 14.047557933 60.792006840 + 14.048292711 61.373993684 + 14.469268192 61.627909826 + 14.893671682 61.294360752 + 14.891447767 60.704989209 +} +836268fffffffff +{ + 15.236183521 65.058047661 + 15.595659833 64.934602553 + 15.742549445 64.827821724 + 15.748678450 64.221937638 + 15.316042515 63.943043482 + 15.026315953 64.158073377 + 14.847778129 64.219207163 + 14.772174023 64.728684359 +} +836269fffffffff +{ + 15.627654813 65.913591455 + 16.170389214 65.726699765 + 16.178704660 65.115266209 + 15.742549445 64.827821724 + 15.595659833 64.934602553 + 15.236183521 65.058047661 + 15.160111060 65.576725395 +} +83626afffffffff +{ + 14.231328533 64.912933027 + 14.772174023 64.728684359 + 14.847778129 64.219207163 + 14.387472777 63.897258965 + 13.850805508 64.079746286 + 13.770276431 64.585953111 +} +83626bfffffffff +{ + 14.615138566 65.762688832 + 15.160111060 65.576725395 + 15.236183521 65.058047661 + 14.772174023 64.728684359 + 14.231328533 64.912933027 + 14.150375493 65.428271206 +} +83626cfffffffff +{ + 15.755902568 63.013807138 + 15.320178863 63.342897554 + 15.316042515 63.943043482 + 15.748678450 64.221937638 + 16.190075286 63.895493686 + 16.193146437 63.287424882 +} +83626dfffffffff +{ + 16.190075286 63.895493686 + 15.748678450 64.221937638 + 15.742549445 64.827821724 + 16.178704660 65.115266209 + 16.625770163 64.791759301 + 16.630997621 64.177783562 +} +83626efffffffff +{ + 14.891256188 63.072447900 + 14.462720905 63.396934687 + 14.387472777 63.897258965 + 14.847778129 64.219207163 + 15.026315953 64.158073377 + 15.316042515 63.943043482 + 15.320178863 63.342897554 +} +836270fffffffff +{ + 12.731450443 61.678118288 + 13.080976718 61.560127694 + 13.218135146 61.451620044 + 13.218812891 60.876837525 + 12.810317562 60.633467119 + 12.539900462 60.851259930 + 12.366452223 60.909627672 + 12.286668905 61.379930585 +} +836271fffffffff +{ + 13.100640604 62.462507585 + 13.628822134 62.283659531 + 13.630821375 61.702860736 + 13.218135146 61.451620044 + 13.080976718 61.560127694 + 12.731450443 61.678118288 + 12.651606421 62.157279903 +} +836272fffffffff +{ + 11.761461080 61.556019270 + 12.286668905 61.379930585 + 12.366452223 60.909627672 + 11.926023768 60.618364906 + 11.405245740 60.792570851 + 11.320482945 61.259926898 +} +836273fffffffff +{ + 12.121992847 62.335227367 + 12.651606421 62.157279903 + 12.731450443 61.678118288 + 12.286668905 61.379930585 + 11.761461080 61.556019270 + 11.676644764 62.032160173 +} +836274fffffffff +{ + 13.216340916 59.732575089 + 12.809832955 60.064814150 + 12.810317562 60.633467119 + 13.218812891 60.876837525 + 13.630786143 60.546163222 + 13.628775353 59.970485054 +} +836275fffffffff +{ + 13.630786143 60.546163222 + 13.218812891 60.876837525 + 13.218135146 61.451620044 + 13.630821375 61.702860736 + 14.048292711 61.373993684 + 14.047557933 60.792006840 +} +836276fffffffff +{ + 12.405650933 59.829181310 + 12.005816970 60.156825413 + 11.926023768 60.618364906 + 12.366452223 60.909627672 + 12.539900462 60.851259930 + 12.810317562 60.633467119 + 12.809832955 60.064814150 +} 836280fffffffff { 5.037426343 55.938969851 @@ -150754,11 +153334,11 @@ { 3.141839149 55.602403817 2.580203030 55.635284339 - 2.369101372 55.949936273 + 2.369101375 55.949936263 2.315928793 56.121309311 2.667278872 56.587210594 3.174073139 56.536772391 - 3.277455745 56.195167331 + 3.277455742 56.195167341 3.382944055 56.039221604 } 836299fffffffff @@ -150774,7 +153354,7 @@ { 1.801896571 56.170112897 2.315928793 56.121309311 - 2.369101378 55.949936258 + 2.369101375 55.949936263 2.580203030 55.635284339 2.332748037 55.193187643 1.764376889 55.225349833 @@ -150802,7 +153382,7 @@ { 3.937747778 56.005650357 3.382944055 56.039221604 - 3.277455740 56.195167346 + 3.277455742 56.195167341 3.174073139 56.536772391 3.522287291 56.999951363 4.021741436 56.947920367 @@ -150884,11 +153464,11 @@ { 7.091656540 56.690918136 6.561177672 56.725321903 - 6.350664419 57.029042716 + 6.350664422 57.029042706 6.304240765 57.196863842 6.638295929 57.648639328 7.107610475 57.594986471 - 7.197844112 57.260520367 + 7.197844109 57.260520377 7.302874510 57.109980542 } 8362a9fffffffff @@ -150904,7 +153484,7 @@ { 5.827441321 57.249036058 6.304240765 57.196863842 - 6.350664425 57.029042701 + 6.350664422 57.029042706 6.561177672 56.725321903 6.343650871 56.301244103 5.806025555 56.335014446 @@ -150932,7 +153512,7 @@ { 7.826181720 57.074968217 7.302874510 57.109980542 - 7.197844108 57.260520382 + 7.197844109 57.260520377 7.107610475 57.594986471 7.437781263 58.044085273 7.899580972 57.988990318 @@ -151079,11 +153659,11 @@ 6.199059397 64.246227363 5.707982215 64.331340781 5.554310509 64.875166396 - 5.781590718 65.179522184 + 5.781590712 65.179522175 5.925731001 65.286713953 6.480924891 65.107169043 6.599827142 64.608707662 - 6.311543084 64.397835704 + 6.311543091 64.397835713 } 8362c9fffffffff { @@ -151111,7 +153691,7 @@ 5.242929410 65.970952155 5.802137412 65.790681849 5.925731001 65.286713953 - 5.781590708 65.179522171 + 5.781590712 65.179522175 } 8362ccfffffffff { @@ -151121,7 +153701,7 @@ 6.832615485 63.625999528 6.349037135 63.707804913 6.199059397 64.246227363 - 6.311543095 64.397835716 + 6.311543091 64.397835713 } 8362cdfffffffff { @@ -151272,11 +153852,11 @@ 8.476593788 60.854458475 8.015136511 60.922442793 7.877402882 61.440844538 - 8.095573351 61.740053190 + 8.095573344 61.740053181 8.238614531 61.838603812 8.770915995 61.664186152 8.870354155 61.196917879 - 8.584612269 61.003294320 + 8.584612276 61.003294329 } 8362e1fffffffff { @@ -151304,7 +153884,7 @@ 7.597268481 62.486906444 8.134324697 62.311561057 8.238614531 61.838603812 - 8.095573341 61.740053177 + 8.095573344 61.740053181 } 8362e4fffffffff { @@ -151314,7 +153894,7 @@ 9.064330757 60.276665314 8.610342630 60.341652270 8.476593788 60.854458475 - 8.584612280 61.003294332 + 8.584612276 61.003294329 } 8362e5fffffffff { @@ -151657,11 +154237,11 @@ 14.354947480 56.444282770 13.820044525 56.274934277 13.473222461 56.604886509 - 13.596276910 56.935203185 + 13.596276906 56.935203175 13.599355555 57.123013909 14.014618126 57.341522935 14.423740810 56.991393744 - 14.415992523 56.611547213 + 14.415992526 56.611547223 } 836319fffffffff { @@ -151689,13 +154269,13 @@ 12.789486973 57.251416232 13.196458689 57.468159752 13.599355555 57.123013909 - 13.596276904 56.935203170 + 13.596276906 56.935203175 } 83631cfffffffff { 14.708654162 56.109662282 14.354947480 56.444282770 - 14.415992526 56.611547229 + 14.415992526 56.611547223 14.423740810 56.991393744 14.847365508 57.211686793 15.262672611 56.856434683 @@ -151850,11 +154430,11 @@ 18.201654269 54.878042631 17.641999194 54.705709682 17.265196273 55.064879667 - 17.384891878 55.416519937 + 17.384891874 55.416519926 17.392342574 55.613426227 17.844882690 55.832335214 18.277918493 55.454562482 - 18.260925640 55.056201466 + 18.260925644 55.056201476 } 836331fffffffff { @@ -151882,13 +154462,13 @@ 16.521023572 55.768216139 16.965053638 55.985488436 17.392342574 55.613426227 - 17.384891872 55.416519921 + 17.384891874 55.416519926 } 836334fffffffff { 18.584979124 54.513484102 18.201654269 54.878042631 - 18.260925644 55.056201482 + 18.260925644 55.056201476 18.277918493 55.454562482 18.738985148 55.675116020 19.177649690 55.291464476 @@ -152042,11 +154622,11 @@ 836350fffffffff { 12.731450443 61.678118288 - 13.080976729 61.560127690 + 13.080976718 61.560127694 13.218135146 61.451620044 13.218812891 60.876837525 12.810317562 60.633467119 - 12.539900452 60.851259934 + 12.539900462 60.851259930 12.366452223 60.909627672 12.286668905 61.379930585 } @@ -152065,7 +154645,7 @@ 12.005816970 60.156825413 11.926023768 60.618364906 12.366452223 60.909627672 - 12.539900466 60.851259927 + 12.539900462 60.851259930 12.810317562 60.633467119 12.809832955 60.064814150 } @@ -152093,7 +154673,7 @@ 13.628822134 62.283659531 13.630821375 61.702860736 13.218135146 61.451620044 - 13.080976713 61.560127695 + 13.080976718 61.560127694 12.731450443 61.678118288 12.651606421 62.157279903 } @@ -152172,11 +154752,11 @@ 836360fffffffff { 15.236183521 65.058047661 - 15.595659844 64.934602549 + 15.595659833 64.934602553 15.742549445 64.827821724 15.748678450 64.221937638 15.316042515 63.943043482 - 15.026315943 64.158073380 + 15.026315953 64.158073377 14.847778129 64.219207163 14.772174023 64.728684359 } @@ -152195,7 +154775,7 @@ 14.462720905 63.396934687 14.387472777 63.897258965 14.847778129 64.219207163 - 15.026315958 64.158073373 + 15.026315953 64.158073377 15.316042515 63.943043482 15.320178863 63.342897554 } @@ -152223,7 +154803,7 @@ 16.170389214 65.726699765 16.178704660 65.115266209 15.742549445 64.827821724 - 15.595659828 64.934602555 + 15.595659833 64.934602553 15.236183521 65.058047661 15.160111060 65.576725395 } @@ -152430,11 +155010,11 @@ 836388fffffffff { 9.929090596 54.758268457 - 10.272437035 54.738247833 + 10.272437025 54.738247833 10.447349051 54.791445252 10.774873852 54.453709867 10.574094343 53.952840696 - 10.220949979 53.847747072 + 10.220949989 53.847747071 10.048058823 53.857148127 9.729241862 54.323927586 } @@ -152444,7 +155024,7 @@ 10.320716459 55.614543251 10.645476602 55.285382628 10.447349051 54.791445252 - 10.272437019 54.738247834 + 10.272437025 54.738247833 9.929090596 54.758268457 9.611426404 55.219445799 } @@ -152490,18 +155070,18 @@ 10.166154495 52.943133387 9.846304136 53.415393020 10.048058823 53.857148127 - 10.220949994 53.847747073 + 10.220949989 53.847747071 10.574094343 53.952840696 10.904309935 53.606410858 } 836390fffffffff { 9.657942893 50.634953009 - 10.014055950 50.620746243 + 10.014055940 50.620746244 10.195682708 50.670263759 10.528832395 50.293532177 10.313301945 49.765142864 - 9.946932442 49.667927395 + 9.946932452 49.667927395 9.767747013 49.674311102 9.444005296 50.166278063 } @@ -152511,7 +155091,7 @@ 10.077544166 51.560030177 10.408347421 51.192198900 10.195682708 50.670263759 - 10.014055935 50.620746244 + 10.014055940 50.620746244 9.657942893 50.634953009 9.334912177 51.121946794 } @@ -152557,7 +155137,7 @@ 9.876090878 48.701817244 9.551775850 49.198561880 9.767747013 49.674311102 - 9.946932458 49.667927397 + 9.946932452 49.667927395 10.313301945 49.765142864 10.648692010 49.379447736 } @@ -158430,11 +161010,11 @@ 12.095483040 -65.626936638 11.669394924 -65.948889657 11.137967287 -65.686453676 - 11.070473506 -65.297430537 + 11.070473508 -65.297430548 11.081945858 -65.109244064 11.603530779 -64.800181244 12.086681436 -65.057462795 - 12.061084574 -65.432997335 + 12.061084572 -65.432997323 } 836769fffffffff { @@ -158462,7 +161042,7 @@ 10.067792225 -65.161150846 10.592086952 -64.851790053 11.081945858 -65.109244064 - 11.070473509 -65.297430554 + 11.070473508 -65.297430548 } 83676cfffffffff { @@ -158472,7 +161052,7 @@ 13.039244389 -65.567855244 12.621043034 -65.888426769 12.095483040 -65.626936638 - 12.061084572 -65.432997317 + 12.061084572 -65.432997323 } 83676dfffffffff { @@ -158939,11 +161519,11 @@ { 16.093969899 -82.984508190 15.627800246 -83.398665459 - 15.247187867 -83.291084998 + 15.247187877 -83.291085003 15.075700591 -83.205985044 15.008534237 -82.569636963 15.454826630 -82.190456013 - 15.795835687 -82.361412830 + 15.795835677 -82.361412825 15.985815049 -82.413155904 } 8367b1fffffffff @@ -158959,7 +161539,7 @@ { 14.624754287 -83.587463452 15.075700591 -83.205985044 - 15.247187883 -83.291085005 + 15.247187877 -83.291085003 15.627800246 -83.398665459 15.732364996 -83.977286546 15.261169186 -84.392100445 @@ -158987,7 +161567,7 @@ { 16.446793327 -81.999903082 15.985815049 -82.413155904 - 15.795835672 -82.361412822 + 15.795835677 -82.361412825 15.454826630 -82.190456013 15.385148638 -81.555301145 15.826610989 -81.178640851 @@ -159006,11 +161586,11 @@ { 7.913261056 116.622674690 7.288946549 116.739556805 - 7.159482961 117.119643190 + 7.159482965 117.119643179 7.093269385 117.309162542 7.519331844 117.764914641 8.143923134 117.649484521 - 8.273854525 117.268674590 + 8.273854521 117.268674601 8.340050138 117.078618950 } 836801fffffffff @@ -159026,7 +161606,7 @@ { 6.468364385 117.424223595 7.093269385 117.309162542 - 7.159482966 117.119643173 + 7.159482965 117.119643179 7.288946549 116.739556805 6.858628789 116.283660512 6.235235801 116.401327986 @@ -159054,7 +161634,7 @@ { 8.964862243 116.962534658 8.340050138 117.078618950 - 8.273854519 117.268674607 + 8.273854521 117.268674601 8.143923134 117.649484521 8.572789012 118.108159171 9.196644944 117.992365953 @@ -160087,11 +162667,11 @@ { -2.058179513 115.320809900 -2.650699622 115.438402708 - -2.751322758 115.813113387 + -2.751322754 115.813113376 -2.828128398 115.996688603 -2.441213412 116.437093003 -1.822276413 116.324135099 - -1.670485275 115.955244338 + -1.670485279 115.955244349 -1.618616138 115.767834973 } 836899fffffffff @@ -160107,7 +162687,7 @@ { -3.443620487 116.109262989 -2.828128398 115.996688603 - -2.751322752 115.813113370 + -2.751322754 115.813113376 -2.650699622 115.438402708 -3.090270063 114.991544774 -3.678239349 115.109846904 @@ -160135,7 +162715,7 @@ { -1.021893089 115.650963515 -1.618616138 115.767834973 - -1.670485282 115.955244355 + -1.670485279 115.955244349 -1.822276413 116.324135099 -1.429604290 116.767411274 -0.807569749 116.654074762 @@ -160217,11 +162797,11 @@ { 2.889974208 115.963921690 2.277234358 116.081199639 - 2.161926208 116.458636514 + 2.161926213 116.458636503 2.089962447 116.645163927 2.499704856 117.093182899 3.126111904 116.978986859 - 3.267833184 116.604175373 + 3.267833180 116.604175384 3.327033743 116.415422930 } 8368a9fffffffff @@ -160237,7 +162817,7 @@ { 1.465203058 116.758983111 2.089962447 116.645163927 - 2.161926214 116.458636497 + 2.161926213 116.458636503 2.277234358 116.081199639 1.838410285 115.629808183 1.228521025 115.747832713 @@ -160265,7 +162845,7 @@ { 3.942220697 116.298903817 3.327033743 116.415422930 - 3.267833178 116.604175390 + 3.267833180 116.604175384 3.126111904 116.978986859 3.540278633 117.429904470 4.167931123 117.315336998 @@ -161356,11 +163936,11 @@ { 12.933621300 117.297465893 12.307128691 117.413865837 - 12.164691903 117.796514844 + 12.164691907 117.796514833 12.104879102 117.989063708 12.539780767 118.452662956 13.153164856 118.336005230 - 13.270134628 117.949123698 + 13.270134624 117.949123709 13.342669322 117.757809923 } 836951fffffffff @@ -161376,7 +163956,7 @@ { 11.489235277 118.105361368 12.104879102 117.989063708 - 12.164691909 117.796514827 + 12.164691907 117.796514833 12.307128691 117.413865837 11.892939994 116.953503259 11.265384523 117.070728878 @@ -161404,7 +163984,7 @@ { 13.967694482 117.642248305 13.342669322 117.757809923 - 13.270134623 117.949123715 + 13.270134624 117.949123709 13.153164856 118.336005230 13.589097308 118.802547616 14.199820343 118.685536370 @@ -161486,11 +164066,11 @@ { 17.873166914 117.988694049 17.253787483 118.104519888 - 17.100108536 118.489633711 + 17.100108539 118.489633700 17.047027738 118.685247143 17.482992145 119.156802183 18.076528697 119.038925958 - 18.180017299 118.645904945 + 18.180017296 118.645904957 18.257977136 118.453383636 } 836961fffffffff @@ -161506,7 +164086,7 @@ { 16.449478887 118.802773602 17.047027738 118.685247143 - 17.100108541 118.489633694 + 17.100108539 118.489633700 17.253787483 118.104519888 16.862513087 117.639740305 16.240214910 117.756433686 @@ -161534,7 +164114,7 @@ { 18.874087990 118.338438150 18.257977136 118.453383636 - 18.180017295 118.645904962 + 18.180017296 118.645904957 18.076528697 119.038925958 18.511758350 119.513440995 19.100936787 119.395222160 @@ -162120,11 +164700,11 @@ 836a00fffffffff { 7.801540646 25.638192673 - 7.403643340 25.613079965 + 7.403643351 25.613079966 7.204754752 25.599097123 6.882228676 26.134035804 7.158042366 26.710298523 - 7.555876353 26.736397652 + 7.555876341 26.736397652 7.754728429 26.750910380 8.077997947 26.215357301 } @@ -162134,7 +164714,7 @@ 7.705179737 27.860067242 8.029210901 27.329293900 7.754728429 26.750910380 - 7.555876335 26.736397651 + 7.555876341 26.736397652 7.158042366 26.710298523 6.833740658 27.247865226 } @@ -162180,7 +164760,7 @@ 7.248658354 24.490976511 6.928023659 25.022897757 7.204754752 25.599097123 - 7.403643357 25.613079966 + 7.403643351 25.613079966 7.801540646 25.638192673 8.123887311 25.098238811 } @@ -162886,11 +165466,11 @@ 836a68fffffffff { 9.050121773 35.723150631 - 8.655713124 35.663823799 + 8.655713136 35.663823801 8.461403063 35.658535440 8.133340842 36.198241778 8.389089406 36.751225710 - 8.776578594 36.759890089 + 8.776578582 36.759890087 8.972944949 36.791239383 9.308013721 36.304456070 } @@ -162900,7 +165480,7 @@ 8.893462571 37.848935371 9.228012790 37.369842525 8.972944949 36.791239383 - 8.776578576 36.759890087 + 8.776578582 36.759890087 8.389089406 36.751225710 8.060176688 37.289888569 } @@ -162946,18 +165526,18 @@ 8.530928518 34.561477840 8.203866116 35.101836229 8.461403063 35.658535440 - 8.655713142 35.663823802 + 8.655713136 35.663823801 9.050121773 35.723150631 9.385535910 35.228890621 } 836a70fffffffff { 8.462474131 30.707850403 - 8.064550475 30.665117923 + 8.064550487 30.665117924 7.867262072 30.655453809 7.541242253 31.196985254 7.808347027 31.765846870 - 8.202357375 31.783240785 + 8.202357363 31.783240784 8.400839357 31.806468481 8.731173820 31.291640965 } @@ -162967,7 +165547,7 @@ 8.336574337 32.897872114 8.667058792 32.389459871 8.400839357 31.806468481 - 8.202357357 31.783240784 + 8.202357363 31.783240784 7.808347027 31.765846870 7.480983149 32.308152484 } @@ -163013,7 +165593,7 @@ 7.923278733 29.544342100 7.598738612 30.084690208 7.867262072 30.655453809 - 8.064550492 30.665117925 + 8.064550487 30.665117924 8.462474131 30.707850403 8.792485173 30.186915934 } @@ -164848,11 +167428,11 @@ 836b88fffffffff { 7.081625173 20.592723844 - 6.687304638 20.585449946 + 6.687304650 20.585449946 6.488302003 20.567405216 6.170450211 21.087545843 6.451695928 21.662252449 - 6.850400998 21.696628248 + 6.850400987 21.696628247 7.047843252 21.702225591 7.362220266 21.154353779 } @@ -164862,7 +167442,7 @@ 7.011431619 22.811969652 7.327083691 22.267022942 7.047843252 21.702225591 - 6.850400981 21.696628247 + 6.850400987 21.696628247 6.451695928 21.662252449 6.131712748 22.186740639 } @@ -164908,18 +167488,18 @@ 6.522352267 19.479242065 6.206724688 19.994700648 6.488302003 20.567405216 - 6.687304656 20.585449946 + 6.687304650 20.585449946 7.081625173 20.592723844 7.394587458 20.042341104 } 836b90fffffffff { 6.320958358 15.647787409 - 5.933501334 15.657760240 + 5.933501345 15.657760239 5.735880217 15.636083453 5.423622902 16.134169889 5.706695854 16.698698278 - 6.103256956 16.740559047 + 6.103256945 16.740559047 6.297612793 16.737449575 6.601851767 16.185980984 } @@ -164929,7 +167509,7 @@ 6.271911038 17.830960861 6.577819027 17.280517437 6.297612793 16.737449575 - 6.103256939 16.740559046 + 6.103256945 16.740559047 5.706695854 16.698698278 5.392028714 17.202568967 } @@ -164975,7 +167555,7 @@ 5.762860491 14.583250071 5.453082744 15.075297883 5.735880217 15.636083453 - 5.933501351 15.657760239 + 5.933501345 15.657760239 6.320958358 15.647787409 6.623414906 15.095704123 } @@ -165236,11 +167816,11 @@ { 8.014506318 -95.777434035 7.513542272 -96.171206486 - 7.145677871 -96.016259712 + 7.145677882 -96.016259717 6.961147469 -95.940201895 6.906433731 -95.316865704 7.406641252 -94.922662555 - 7.774885527 -95.076781284 + 7.774885516 -95.076781280 7.959563291 -95.152616004 } 836c01fffffffff @@ -165256,7 +167836,7 @@ { 6.460261814 -96.333634088 6.961147469 -95.940201895 - 7.145677888 -96.016259719 + 7.145677882 -96.016259717 7.513542272 -96.171206486 7.565930477 -96.798820345 7.064171534 -97.189977286 @@ -165284,7 +167864,7 @@ { 8.459400111 -94.756479082 7.959563291 -95.152616004 - 7.774885511 -95.076781278 + 7.774885516 -95.076781280 7.406641252 -94.922662555 7.351608604 -94.295509236 7.850810576 -93.900782779 @@ -166317,11 +168897,11 @@ { 2.316932842 -104.100535233 1.831699821 -104.460541036 - 1.486897795 -104.283455686 + 1.486897806 -104.283455690 1.299479755 -104.217151744 1.233298851 -103.634885141 1.732435023 -103.251757189 - 2.107618228 -103.386859358 + 2.107618216 -103.386859354 2.281264884 -103.474276727 } 836c99fffffffff @@ -166337,7 +168917,7 @@ { 0.802765639 -104.597664788 1.299479755 -104.217151744 - 1.486897811 -104.283455692 + 1.486897806 -104.283455690 1.831699821 -104.460541036 1.866457078 -105.086322222 1.383537287 -105.442054383 @@ -166365,7 +168945,7 @@ { 2.768520388 -103.110174932 2.281264884 -103.474276727 - 2.107618211 -103.386859352 + 2.107618216 -103.386859354 1.732435023 -103.251757189 1.667396300 -102.663028720 2.168677217 -102.277474534 @@ -166447,11 +169027,11 @@ { 5.157708592 -99.989225069 4.660766334 -100.367741576 - 4.303330441 -100.200555443 + 4.303330452 -100.200555448 4.116657899 -100.129111408 4.058043928 -99.523541690 4.561683057 -99.132894195 - 4.934775855 -99.278076285 + 4.934775844 -99.278076281 5.114524802 -99.360274012 } 836ca9fffffffff @@ -166467,7 +169047,7 @@ { 3.613948903 -100.518005249 4.116657899 -100.129111408 - 4.303330457 -100.200555450 + 4.303330452 -100.200555448 4.660766334 -100.367741576 4.702186291 -100.997809775 4.206080187 -101.372792819 @@ -166495,7 +169075,7 @@ { 5.611975551 -98.978443638 5.114524802 -99.360274012 - 4.934775839 -99.278076279 + 4.934775844 -99.278076281 4.561683057 -99.132894195 4.503551525 -98.522055810 5.007802664 -98.129878691 @@ -167586,11 +170166,11 @@ { 10.826940103 -91.508151870 10.330105571 -91.913221671 - 9.954649769 -91.772587792 + 9.954649780 -91.772587796 9.773519459 -91.692626714 9.718562742 -91.057964216 10.207432809 -90.664495776 - 10.568388568 -90.826052115 + 10.568388557 -90.826052110 10.756522614 -90.894532023 } 836d51fffffffff @@ -167606,7 +170186,7 @@ { 9.282407788 -92.086371917 9.773519459 -91.692626714 - 9.954649785 -91.772587798 + 9.954649780 -91.772587796 10.330105571 -91.913221671 10.397351896 -92.531294176 9.898098312 -92.934797529 @@ -167634,7 +170214,7 @@ { 11.250636086 -90.488163173 10.756522614 -90.894532023 - 10.568388552 -90.826052108 + 10.568388557 -90.826052110 10.207432809 -90.664495776 10.151318235 -90.027647261 10.637644436 -89.634711445 @@ -167716,11 +170296,11 @@ { 13.536807482 -87.228049745 13.051922860 -87.639978810 - 12.672156121 -87.515311622 + 12.672156131 -87.515311627 12.495462141 -87.432305388 12.436168408 -86.793281064 12.906594278 -86.404895327 - 13.258291503 -86.572117149 + 13.258291492 -86.572117144 13.448213613 -86.632474809 } 836d61fffffffff @@ -167736,7 +170316,7 @@ { 12.021431384 -87.822013293 12.495462141 -87.432305388 - 12.672156137 -87.515311629 + 12.672156131 -87.515311627 13.051922860 -87.639978810 13.136988574 -88.241530180 12.648231517 -88.653008039 @@ -167764,7 +170344,7 @@ { 13.928983480 -86.220360751 13.448213613 -86.632474809 - 13.258291487 -86.572117141 + 13.258291492 -86.572117144 12.906594278 -86.404895327 12.845380164 -85.765392407 13.311953152 -85.378576118 @@ -170876,11 +173456,11 @@ 0.901892344 -124.741388168 1.364758047 -124.483334897 1.858970539 -124.806494719 - 1.876645762 -125.193958139 + 1.876645761 -125.193958127 1.841235293 -125.375670943 1.284427734 -125.607793494 0.838478793 -125.294739892 - 0.911572878 -124.933909398 + 0.911572879 -124.933909409 } 836f69fffffffff { @@ -170908,7 +173488,7 @@ 2.853378693 -125.457452467 2.293739128 -125.690743622 1.841235293 -125.375670943 - 1.876645761 -125.193958121 + 1.876645761 -125.193958127 } 836f6cfffffffff { @@ -170918,7 +173498,7 @@ -0.041451351 -124.677249674 0.413328438 -124.420799265 0.901892344 -124.741388168 - 0.911572878 -124.933909415 + 0.911572879 -124.933909409 } 836f6dfffffffff { @@ -171385,11 +173965,11 @@ { -1.512350087 -107.613571052 -1.024934267 -107.241385921 - -0.650530232 -107.365660676 + -0.650530242 -107.365660670 -0.483806201 -107.457085121 -0.451425513 -108.074460202 -0.918409442 -108.413537290 - -1.249088852 -108.228993425 + -1.249088842 -108.228993430 -1.435823228 -108.168156843 } 836fb1fffffffff @@ -171405,7 +173985,7 @@ { -0.013539113 -107.113326221 -0.483806201 -107.457085121 - -0.650530247 -107.365660668 + -0.650530242 -107.365660670 -1.024934267 -107.241385921 -1.099869540 -106.679448209 -0.609000940 -106.304093094 @@ -171433,7 +174013,7 @@ { -1.919571512 -108.537025463 -1.435823228 -108.168156843 - -1.249088837 -108.228993433 + -1.249088842 -108.228993430 -0.918409442 -108.413537290 -0.886134939 -109.029010503 -1.349604452 -109.363275068 @@ -171487,7 +174067,7 @@ 837004fffffffff { 6.305296479 -171.080105139 - 5.701296071 -171.226054782 + 5.701296072 -171.226054782 5.241293601 -170.793131765 5.382944662 -170.210435223 5.989175450 -170.060209446 @@ -171509,7 +174089,7 @@ 4.502202436 -171.514899451 4.640625261 -170.939676997 5.241293601 -170.793131765 - 5.701296071 -171.226054782 + 5.701296072 -171.226054782 } 837008fffffffff { @@ -171840,7 +174420,7 @@ 6.615969480 -172.089938014 6.014390733 -172.231598286 5.558188361 -171.801639393 - 5.701296071 -171.226054782 + 5.701296072 -171.226054782 6.305296479 -171.080105139 6.763783250 -171.514025066 } @@ -172966,11 +175546,11 @@ 8370d8fffffffff { -4.796006678 -169.004546296 - -5.161709681 -169.103175146 + -5.161709671 -169.103175143 -5.337967615 -169.190153683 -5.779373289 -168.844464417 -5.689027513 -168.234895469 - -5.333783955 -168.062572305 + -5.333783965 -168.062572308 -5.150453982 -168.011916108 -4.697318798 -168.434002674 } @@ -172980,7 +175560,7 @@ -5.505707356 -167.011557652 -5.051910106 -167.435518476 -5.150453982 -168.011916108 - -5.333783971 -168.062572311 + -5.333783965 -168.062572308 -5.689027513 -168.234895469 -6.134018266 -167.881927906 } @@ -173026,7 +175606,7 @@ -4.989683573 -170.132844138 -5.427321060 -169.794462083 -5.337967615 -169.190153683 - -5.161709665 -169.103175142 + -5.161709671 -169.103175143 -4.796006678 -169.004546296 -4.343794424 -169.424522095 } @@ -174486,11 +177066,11 @@ { 8.767945994 -179.828829331 8.229525361 -179.913074071 - 8.032177817 -179.599169395 + 8.032177826 -179.599169403 7.891728507 -179.465888942 8.046002809 -178.953984846 8.625936245 -178.842021534 - 8.907583733 -179.111545453 + 8.907583725 -179.111545445 9.008163646 -179.268777022 } 8371b1fffffffff @@ -174506,7 +177086,7 @@ { 7.317405326 -179.574598275 7.891728507 -179.465888942 - 8.032177829 -179.599169408 + 8.032177826 -179.599169403 8.229525361 -179.913074071 7.989888429 179.531398641 7.457543435 179.451463643 @@ -174534,7 +177114,7 @@ { 9.552449552 -179.180131284 9.008163646 -179.268777022 - 8.907583721 -179.111545441 + 8.907583725 -179.111545445 8.625936245 -178.842021534 8.784114521 -178.322169943 9.369459225 -178.206879693 @@ -177639,21 +180219,21 @@ 837400fffffffff { 2.723867814 -5.358220713 - 2.476484811 -5.614549209 + 2.476484819 -5.614549201 2.324338283 -5.682865465 - 2.004371320 -5.526585713 + 2.004371329 -5.526585718 1.892421763 -5.402923000 - 1.941980473 -5.050147499 + 1.941980471 -5.050147510 2.024882529 -4.905372337 - 2.375503644 -4.843422178 + 2.375503634 -4.843422180 2.538732195 -4.877569969 - 2.705924027 -5.192246884 + 2.705924022 -5.192246875 } 837402fffffffff { 1.479335015 -5.562158990 1.892421763 -5.402923000 - 2.004371334 -5.526585720 + 2.004371329 -5.526585718 2.324338283 -5.682865465 2.347921627 -6.125294861 1.886626835 -6.333869268 @@ -177667,13 +180247,13 @@ 1.214689256 -4.654773810 1.745694264 -4.561632993 2.024882529 -4.905372337 - 1.941980471 -5.050147515 + 1.941980471 -5.050147510 } 837404fffffffff { 3.151618660 -5.472405768 2.723867814 -5.358220713 - 2.705924020 -5.192246870 + 2.705924022 -5.192246875 2.538732195 -4.877569969 2.779161474 -4.505458874 3.274994347 -4.607514870 @@ -177685,7 +180265,7 @@ 2.526343960 -4.028797513 2.779161474 -4.505458874 2.538732195 -4.877569969 - 2.375503628 -4.843422181 + 2.375503634 -4.843422180 2.024882529 -4.905372337 1.745694264 -4.561632993 } @@ -177695,10 +180275,75 @@ 2.831978259 -6.362866833 2.347921627 -6.125294861 2.324338283 -5.682865465 - 2.476484822 -5.614549197 + 2.476484819 -5.614549201 2.723867814 -5.358220713 3.151618660 -5.472405768 } +837408fffffffff +{ + 1.139803327 -3.056122553 + 1.680786684 -2.963804256 + 1.965855270 -3.322626694 + 1.713706612 -3.770082255 + 1.177707842 -3.862845359 + 0.888892193 -3.507725483 +} +837409fffffffff +{ + 1.100966307 -2.234515802 + 1.646918936 -2.142712429 + 1.934931255 -2.509193085 + 1.680786684 -2.963804256 + 1.139803327 -3.056122553 + 0.848013273 -2.693332915 +} +83740afffffffff +{ + 0.347523380 -3.600721435 + 0.888892193 -3.507725483 + 1.177707842 -3.862845359 + 0.928848909 -4.307241993 + 0.660923743 -4.353904571 + 0.448657110 -4.431497053 + 0.100059618 -4.049256735 +} +83740bfffffffff +{ + 0.301586632 -2.785857560 + 0.848013273 -2.693332915 + 1.139803327 -3.056122553 + 0.888892193 -3.507725483 + 0.347523380 -3.600721435 + 0.052027498 -3.241661005 +} +83740cfffffffff +{ + 1.965855270 -3.322626694 + 2.501272816 -3.230521962 + 2.640846181 -3.408454943 + 2.768224713 -3.649005219 + 2.526343960 -4.028797513 + 1.995832680 -4.121321457 + 1.713706612 -3.770082255 +} +83740dfffffffff +{ + 1.934931255 -2.509193085 + 2.475241585 -2.417575870 + 2.756497157 -2.780064615 + 2.501272816 -3.230521962 + 1.965855270 -3.322626694 + 1.680786684 -2.963804256 +} +83740efffffffff +{ + 1.177707842 -3.862845359 + 1.713706612 -3.770082255 + 1.995832680 -4.121321457 + 1.745694264 -4.561632993 + 1.214689256 -4.654773810 + 0.928848909 -4.307241993 +} 837410fffffffff { 1.440474385 -6.996719395 @@ -178024,6 +180669,457 @@ 4.525185752 -6.337803508 4.974161531 -6.461266910 } +837440fffffffff +{ + 1.801424843 0.893083292 + 2.361041961 0.982008709 + 2.653940944 0.588645288 + 2.391148219 0.109891628 + 1.836304310 0.020176256 + 1.539492420 0.409983870 +} +837441fffffffff +{ + 1.765521122 1.780864344 + 2.329863393 1.868917218 + 2.625652940 1.467746322 + 2.361041961 0.982008709 + 1.801424843 0.893083292 + 1.501704615 1.290746724 +} +837442fffffffff +{ + 0.978790805 0.320175787 + 1.539492420 0.409983870 + 1.836304310 0.020176256 + 1.576283995 -0.455848467 + 1.020465174 -0.546399666 + 0.719798211 -0.160203437 +} +837443fffffffff +{ + 0.936163765 1.201763560 + 1.501704615 1.290746724 + 1.801424843 0.893083292 + 1.539492420 0.409983870 + 0.978790805 0.320175787 + 0.675195315 0.714270926 +} +837444fffffffff +{ + 2.653940944 0.588645288 + 3.207499476 0.677501138 + 3.350931607 0.482442812 + 3.483433791 0.230336480 + 3.230001457 -0.186075822 + 2.681144301 -0.275687732 + 2.391148219 0.109891628 +} +837445fffffffff +{ + 2.625652940 1.467746322 + 3.183867996 1.555765413 + 3.472804933 1.158904475 + 3.207499476 0.677501138 + 2.653940944 0.588645288 + 2.361041961 0.982008709 +} +837446fffffffff +{ + 1.836304310 0.020176256 + 2.391148219 0.109891628 + 2.681144301 -0.275687732 + 2.420202378 -0.747406968 + 1.870172124 -0.837832410 + 1.576283995 -0.455848467 +} +837448fffffffff +{ + 0.848054873 3.009806435 + 1.423111334 3.096883661 + 1.728582383 2.683465664 + 1.462912809 2.186402610 + 0.892584242 2.098328876 + 0.583207231 2.508292266 +} +837449fffffffff +{ + 0.802580917 3.936098566 + 1.382296820 4.022089806 + 1.690599901 3.600802277 + 1.423111334 3.096883661 + 0.848054873 3.009806435 + 0.535835757 3.427710778 +} +83744afffffffff +{ + 0.007050629 2.420211149 + 0.583207231 2.508292266 + 0.892584242 2.098328876 + 0.629663153 1.603785650 + 0.058350228 1.514757090 + -0.254873526 1.921196905 +} +83744bfffffffff +{ + -0.045100607 3.340666115 + 0.535835757 3.427710778 + 0.848054873 3.009806435 + 0.583207231 2.508292266 + 0.007050629 2.420211149 + -0.309027958 2.834657725 +} +83744cfffffffff +{ + 1.728582383 2.683465664 + 2.297593811 2.770560826 + 2.596256966 2.361572597 + 2.329863393 1.868917218 + 1.765521122 1.780864344 + 1.462912809 2.186402610 +} +83744dfffffffff +{ + 1.690599901 3.600802277 + 2.264216231 3.686852135 + 2.565731151 3.270051235 + 2.297593811 2.770560826 + 1.728582383 2.683465664 + 1.423111334 3.096883661 +} +83744efffffffff +{ + 0.892584242 2.098328876 + 1.462912809 2.186402610 + 1.765521122 1.780864344 + 1.501704615 1.290746724 + 0.936163765 1.201763560 + 0.629663153 1.603785650 +} +837450fffffffff +{ + 0.206985560 -1.110981686 + 0.763468875 -1.019618614 + 1.061188951 -1.397956660 + 0.806206701 -1.863983523 + 0.254739621 -1.955964888 + -0.046744074 -1.581320507 +} +837451fffffffff +{ + 0.158330063 -0.250870209 + 0.719798211 -0.160203437 + 1.020465174 -0.546399666 + 0.763468875 -1.019618614 + 0.206985560 -1.110981686 + -0.097470185 -0.728449679 +} +837452fffffffff +{ + -0.603582633 -1.673471269 + -0.046744074 -1.581320507 + 0.254739621 -1.955964888 + 0.003091129 -2.419040449 + -0.548641657 -2.511763824 + -0.853812716 -2.140858150 +} +837453fffffffff +{ + -0.659387682 -0.819950879 + -0.097470185 -0.728449679 + 0.206985560 -1.110981686 + -0.046744074 -1.581320507 + -0.603582633 -1.673471269 + -0.911752702 -1.294653554 +} +837454fffffffff +{ + 1.061188951 -1.397956660 + 1.612089028 -1.306741331 + 1.903042536 -1.680945897 + 1.646918936 -2.142712429 + 1.100966307 -2.234515802 + 0.806206701 -1.863983523 +} +837455fffffffff +{ + 1.020465174 -0.546399666 + 1.576283995 -0.455848467 + 1.870172124 -0.837832410 + 1.612089028 -1.306741331 + 1.061188951 -1.397956660 + 0.763468875 -1.019618614 +} +837456fffffffff +{ + 0.254739621 -1.955964888 + 0.806206701 -1.863983523 + 1.100966307 -2.234515802 + 0.848013273 -2.693332915 + 0.301586632 -2.785857560 + 0.003091129 -2.419040449 +} +837458fffffffff +{ + -0.773514253 0.932864604 + -0.201549866 1.022823839 + 0.108781312 0.624381382 + -0.149076599 0.139598564 + -0.716038676 0.048826893 + -1.030130074 0.443629064 +} +837459fffffffff +{ + -0.831789655 1.832135844 + -0.254873526 1.921196905 + 0.058350228 1.514757090 + -0.201549866 1.022823839 + -0.773514253 0.932864604 + -1.090516709 1.335714671 +} +83745afffffffff +{ + -1.602414168 0.352763677 + -1.030130074 0.443629064 + -0.716038676 0.048826893 + -0.970533028 -0.433163751 + -1.537719654 -0.524792986 + -1.855492619 -0.133688913 +} +83745bfffffffff +{ + -1.667852447 1.245698051 + -1.090516709 1.335714671 + -0.773514253 0.932864604 + -1.030130074 0.443629064 + -1.602414168 0.352763677 + -1.923118760 0.751960670 +} +83745cfffffffff +{ + 0.108781312 0.624381382 + 0.675195315 0.714270926 + 0.978790805 0.320175787 + 0.719798211 -0.160203437 + 0.158330063 -0.250870209 + -0.149076599 0.139598564 +} +83745dfffffffff +{ + 0.058350228 1.514757090 + 0.629663153 1.603785650 + 0.936163765 1.201763560 + 0.675195315 0.714270926 + 0.108781312 0.624381382 + -0.201549866 1.022823839 +} +83745efffffffff +{ + -0.716038676 0.048826893 + -0.149076599 0.139598564 + 0.158330063 -0.250870209 + -0.097470185 -0.728449679 + -0.659387682 -0.819950879 + -0.970533028 -0.433163751 +} +837460fffffffff +{ + 4.795251840 -0.449615014 + 4.269496360 -0.360977514 + 4.004915696 0.144676926 + 4.264567663 0.567114906 + 4.793877690 0.482129189 + 5.059994429 -0.028986074 +} +837461fffffffff +{ + 4.793877690 0.482129189 + 4.264567663 0.567114906 + 3.997670300 1.076933803 + 4.258438864 1.507177043 + 4.791199117 1.425991369 + 5.059755819 0.910722962 +} +837462fffffffff +{ + 4.011031086 -0.775554516 + 3.493031237 -0.686351332 + 3.230001457 -0.186075822 + 3.483433791 0.230336480 + 4.004915696 0.144676926 + 4.269496360 -0.360977514 +} +837463fffffffff +{ + 4.004915696 0.144676926 + 3.483433791 0.230336480 + 3.350931607 0.482442812 + 3.207499476 0.677501138 + 3.472804933 1.158904475 + 3.997670300 1.076933803 + 4.264567663 0.567114906 +} +837464fffffffff +{ + 5.588679091 -1.048007462 + 5.058902415 -0.956372127 + 4.795251840 -0.449615014 + 5.059994429 -0.028986074 + 5.593496426 -0.117010185 + 5.858541775 -0.629315313 +} +837465fffffffff +{ + 5.593496426 -0.117010185 + 5.059994429 -0.028986074 + 4.793877690 0.482129189 + 5.059755819 0.910722962 + 5.596881174 0.826462463 + 5.864518366 0.309803964 +} +837466fffffffff +{ + 4.795370591 -1.368989919 + 4.273265982 -1.276849766 + 4.011031086 -0.775554516 + 4.269496360 -0.360977514 + 4.795251840 -0.449615014 + 5.058902415 -0.956372127 +} +837468fffffffff +{ + 3.427768261 2.943775241 + 3.802064432 3.001225771 + 3.979645062 2.976427974 + 4.251070263 2.458926181 + 3.989258421 2.020950211 + 3.636692708 2.073122115 + 3.450888446 2.044056832 + 3.159076108 2.448671647 +} +837469fffffffff +{ + 3.403411319 3.857967580 + 3.968796977 3.943036156 + 4.242423762 3.422046753 + 3.979645062 2.976427974 + 3.802064432 3.001225771 + 3.427768261 2.943775241 + 3.133094054 3.356144519 +} +83746afffffffff +{ + 2.596256966 2.361572597 + 3.159076108 2.448671647 + 3.450888446 2.044056832 + 3.183867996 1.555765413 + 2.625652940 1.467746322 + 2.329863393 1.868917218 +} +83746bfffffffff +{ + 2.565731151 3.270051235 + 3.133094054 3.356144519 + 3.427768261 2.943775241 + 3.159076108 2.448671647 + 2.596256966 2.361572597 + 2.297593811 2.770560826 +} +83746cfffffffff +{ + 4.791199117 1.425991369 + 4.258438864 1.507177043 + 3.989258421 2.020950211 + 4.251070263 2.458926181 + 4.787168355 2.381687332 + 5.058134037 1.862486739 +} +83746dfffffffff +{ + 4.787168355 2.381687332 + 4.251070263 2.458926181 + 3.979645062 2.976427974 + 4.242423762 3.422046753 + 4.781739220 3.348899396 + 5.055077924 2.826003496 +} +83746efffffffff +{ + 3.997670300 1.076933803 + 3.472804933 1.158904475 + 3.183867996 1.555765413 + 3.450888446 2.044056832 + 3.636692708 2.073122115 + 3.989258421 2.020950211 + 4.258438864 1.507177043 +} +837470fffffffff +{ + 2.707287579 -1.125238268 + 3.070299575 -1.065010875 + 3.240828115 -1.095006587 + 3.501627394 -1.590925314 + 3.250712289 -1.991790270 + 2.912437803 -1.929687174 + 2.732396381 -1.960018336 + 2.448225958 -1.589887467 +} +837471fffffffff +{ + 2.681144301 -0.275687732 + 3.230001457 -0.186075822 + 3.493031237 -0.686351332 + 3.240828115 -1.095006587 + 3.070299575 -1.065010875 + 2.707287579 -1.125238268 + 2.420202378 -0.747406968 +} +837472fffffffff +{ + 1.903042536 -1.680945897 + 2.448225958 -1.589887467 + 2.732396381 -1.960018336 + 2.475241585 -2.417575870 + 1.934931255 -2.509193085 + 1.646918936 -2.142712429 +} +837473fffffffff +{ + 1.870172124 -0.837832410 + 2.420202378 -0.747406968 + 2.707287579 -1.125238268 + 2.448225958 -1.589887467 + 1.903042536 -1.680945897 + 1.612089028 -1.306741331 +} +837474fffffffff +{ + 4.020023639 -2.579034765 + 3.509253465 -2.483182093 + 3.250712289 -1.991790270 + 3.501627394 -1.590925314 + 4.016054174 -1.683526237 + 4.275918608 -2.180282911 +} +837475fffffffff +{ + 4.016054174 -1.683526237 + 3.501627394 -1.590925314 + 3.240828115 -1.095006587 + 3.493031237 -0.686351332 + 4.011031086 -0.775554516 + 4.273265982 -1.276849766 +} +837476fffffffff +{ + 3.259682024 -2.876238249 + 2.756497157 -2.780064615 + 2.475241585 -2.417575870 + 2.732396381 -1.960018336 + 2.912437803 -1.929687174 + 3.250712289 -1.991790270 + 3.509253465 -2.483182093 +} 837480fffffffff { -1.423646423 -9.743508220 @@ -178219,11 +181315,11 @@ { -2.930750786 -10.942146651 -3.440101187 -11.181422408 - -3.775523000 -11.005353924 + -3.775522993 -11.005353931 -3.903843096 -10.879848665 -3.816276172 -10.301968481 -3.346436298 -10.105042478 - -3.093328009 -10.356335077 + -3.093328016 -10.356335069 -2.926470961 -10.443193087 } 837499fffffffff @@ -178239,7 +181335,7 @@ { -4.379042529 -11.082351598 -3.903843096 -10.879848665 - -3.775522988 -11.005353934 + -3.775522993 -11.005353931 -3.440101187 -11.181422408 -3.446762778 -11.688578828 -3.961435490 -11.932380630 @@ -178267,7 +181363,7 @@ { -2.422561958 -10.208404460 -2.926470961 -10.443193087 - -3.093328020 -10.356335066 + -3.093328016 -10.356335069 -3.346436298 -10.105042478 -3.259472986 -9.531820340 -2.795128588 -9.340413451 @@ -178349,11 +181445,11 @@ { 0.029193139 -8.109889455 -0.454082335 -8.331295186 - -0.782450873 -8.165243329 + -0.782450865 -8.165243336 -0.902296086 -8.040273328 -0.820126888 -7.486722733 -0.381296901 -7.312007883 - -0.144918875 -7.561812018 + -0.144918882 -7.561812011 0.018268542 -7.643681045 } 8374a9fffffffff @@ -178369,7 +181465,7 @@ { -1.346892928 -8.220205318 -0.902296086 -8.040273328 - -0.782450861 -8.165243339 + -0.782450865 -8.165243336 -0.454082335 -8.331295186 -0.445644482 -8.805458798 -0.934743677 -9.031198285 @@ -178397,7 +181493,7 @@ { 0.495670715 -7.426555660 0.018268542 -7.643681045 - -0.144918886 -7.561812007 + -0.144918882 -7.561812011 -0.381296901 -7.312007883 -0.300410601 -6.763429888 0.132586785 -6.593860381 @@ -178544,11 +181640,11 @@ -4.257756868 -1.880460368 -4.733235341 -2.030063046 -5.116958125 -1.617112733 - -5.052449968 -1.242511560 + -5.052449970 -1.242511571 -4.972522017 -1.081400866 -4.396848645 -0.987813288 -4.065576836 -1.375700224 - -4.226532288 -1.694506022 + -4.226532287 -1.694506011 } 8374c9fffffffff { @@ -178576,7 +181672,7 @@ -5.889921754 -0.782839175 -5.310087361 -0.689107935 -4.972522017 -1.081400866 - -5.052449971 -1.242511577 + -5.052449970 -1.242511571 } 8374ccfffffffff { @@ -178586,7 +181682,7 @@ -3.412418418 -2.138958402 -3.879453365 -2.288695131 -4.257756868 -1.880460368 - -4.226532284 -1.694506007 + -4.226532287 -1.694506011 } 8374cdfffffffff { @@ -178737,11 +181833,11 @@ -0.685985771 -3.817632320 -1.125811646 -3.972644947 -1.486175252 -3.581757924 - -1.430097949 -3.217976576 + -1.430097951 -3.217976587 -1.348433087 -3.065262601 -0.796733325 -2.971821387 -0.494579803 -3.334883123 - -0.658764556 -3.637088274 + -0.658764555 -3.637088263 } 8374e1fffffffff { @@ -178769,7 +181865,7 @@ -2.213839097 -2.791790774 -1.657207680 -2.698137935 -1.348433087 -3.065262601 - -1.430097952 -3.217976592 + -1.430097951 -3.217976587 } 8374e4fffffffff { @@ -178779,7 +181875,7 @@ 0.100059618 -4.049256735 -0.331490332 -4.204155650 -0.685985771 -3.817632320 - -0.658764552 -3.637088259 + -0.658764555 -3.637088263 } 8374e5fffffffff { @@ -179122,11 +182218,11 @@ 6.534481169 -4.863165580 6.142989331 -5.265419131 5.685209104 -5.148474426 - 5.640461671 -4.805813973 + 5.640461672 -4.805813984 5.556329814 -4.643005011 5.820792415 -4.257008566 6.342131569 -4.361424326 - 6.510755003 -4.690542919 + 6.510755001 -4.690542908 } 837519fffffffff { @@ -179154,13 +182250,13 @@ 4.784299416 -4.918873186 5.042309654 -4.538450508 5.556329814 -4.643005011 - 5.640461673 -4.805813989 + 5.640461672 -4.805813984 } 83751cfffffffff { 7.000019598 -4.979314664 6.534481169 -4.863165580 - 6.510754999 -4.690542904 + 6.510755001 -4.690542908 6.342131569 -4.361424326 6.613076663 -3.969722576 7.141714408 -4.073965873 @@ -179315,11 +182411,11 @@ 10.629686814 -4.322448494 10.219990417 -4.744444040 9.724349109 -4.625525223 - 9.666785501 -4.268720249 + 9.666785503 -4.268720260 9.582547998 -4.098186467 9.878120937 -3.691132235 10.430836596 -3.797774348 - 10.599362396 -4.142659285 + 10.599362394 -4.142659274 } 837531fffffffff { @@ -179347,13 +182443,13 @@ 8.747781221 -4.392258231 9.036828452 -3.991328199 9.582547998 -4.098186467 - 9.666785504 -4.268720265 + 9.666785503 -4.268720260 } 837534fffffffff { 11.132862454 -4.440423835 10.629686814 -4.322448494 - 10.599362391 -4.142659269 + 10.599362394 -4.142659274 10.430836596 -3.797774348 10.732905939 -3.384446343 11.292525544 -3.490831652 @@ -179507,11 +182603,11 @@ 837550fffffffff { 2.707287579 -1.125238268 - 3.070299585 -1.065010874 + 3.070299575 -1.065010875 3.240828115 -1.095006587 3.501627394 -1.590925314 3.250712289 -1.991790270 - 2.912437792 -1.929687176 + 2.912437803 -1.929687174 2.732396381 -1.960018336 2.448225958 -1.589887467 } @@ -179530,7 +182626,7 @@ 2.756497157 -2.780064615 2.475241585 -2.417575870 2.732396381 -1.960018336 - 2.912437808 -1.929687175 + 2.912437803 -1.929687174 3.250712289 -1.991790270 3.509253465 -2.483182093 } @@ -179558,7 +182654,7 @@ 3.230001457 -0.186075822 3.493031237 -0.686351332 3.240828115 -1.095006587 - 3.070299569 -1.065010876 + 3.070299575 -1.065010875 2.707287579 -1.125238268 2.420202378 -0.747406968 } @@ -179637,11 +182733,11 @@ 837560fffffffff { 3.427768261 2.943775241 - 3.802064443 3.001225773 + 3.802064432 3.001225771 3.979645062 2.976427974 4.251070263 2.458926181 3.989258421 2.020950211 - 3.636692697 2.073122113 + 3.636692708 2.073122115 3.450888446 2.044056832 3.159076108 2.448671647 } @@ -179660,7 +182756,7 @@ 3.472804933 1.158904475 3.183867996 1.555765413 3.450888446 2.044056832 - 3.636692714 2.073122114 + 3.636692708 2.073122115 3.989258421 2.020950211 4.258438864 1.507177043 } @@ -179688,7 +182784,7 @@ 3.968796977 3.943036156 4.242423762 3.422046753 3.979645062 2.976427974 - 3.802064426 3.001225771 + 3.802064432 3.001225771 3.427768261 2.943775241 3.133094054 3.356144519 } @@ -179895,11 +182991,11 @@ 837588fffffffff { 3.434314909 -8.439795408 - 3.745246848 -8.292548490 + 3.745246838 -8.292548494 3.873792315 -8.162612911 4.320293599 -8.297517264 4.380245267 -8.827229479 - 4.120094320 -9.088172818 + 4.120094330 -9.088172813 3.963985571 -9.163239824 3.463709555 -8.912063047 } @@ -179909,7 +183005,7 @@ 3.375792875 -7.510528665 3.815653181 -7.640212772 3.873792315 -8.162612911 - 3.745246834 -8.292548496 + 3.745246838 -8.292548494 3.434314909 -8.439795408 2.938092723 -8.191957978 } @@ -179955,18 +183051,18 @@ 4.500197654 -9.897444859 3.996033352 -9.642938434 3.963985571 -9.163239824 - 4.120094333 -9.088172809 + 4.120094330 -9.088172813 4.380245267 -8.827229479 4.833390900 -8.967495392 } 837590fffffffff { 5.154137590 -12.141579081 - 5.472361285 -11.980430454 + 5.472361276 -11.980430459 5.607535661 -11.849077952 6.078713762 -12.012142505 6.143040177 -12.574242329 - 5.869475805 -12.837503728 + 5.869475815 -12.837503723 5.709840972 -12.919553759 5.191240908 -12.651594297 } @@ -179976,7 +183072,7 @@ 5.079855937 -11.136986715 5.544551811 -11.294218152 5.607535661 -11.849077952 - 5.472361271 -11.980430461 + 5.472361276 -11.980430459 5.154137590 -12.141579081 4.638874797 -11.876870446 } @@ -180022,7 +183118,7 @@ 6.270965136 -13.708146704 5.749255228 -13.436972986 5.709840972 -12.919553759 - 5.869475819 -12.837503719 + 5.869475815 -12.837503723 6.143040177 -12.574242329 6.620643425 -12.743276160 } @@ -181798,11 +184894,11 @@ 8376d8fffffffff { -7.321739308 163.093233107 - -7.706705729 163.139253831 + -7.706705718 163.139253829 -7.880133980 163.204363694 -8.018015019 163.797312413 -7.635857087 164.189287147 - -7.292082653 164.056517937 + -7.292082664 164.056517938 -7.100625905 164.034134200 -6.922268669 163.531376809 } @@ -181812,7 +184908,7 @@ -6.880832665 164.960643137 -6.703642473 164.466056550 -7.100625905 164.034134200 - -7.292082670 164.056517940 + -7.292082664 164.056517938 -7.635857087 164.189287147 -7.771801767 164.778915147 } @@ -181858,7 +184954,7 @@ -8.124363819 162.209042668 -8.264255464 162.804992847 -7.880133980 163.204363694 - -7.706705712 163.139253829 + -7.706705718 163.139253829 -7.321739308 163.093233107 -7.142170736 162.582384228 } @@ -182814,11 +185910,11 @@ 10.173651283 162.528511122 9.559537171 162.600562803 9.302670375 163.124412474 - 9.539148553 163.424211393 + 9.539148546 163.424211384 9.629780104 163.600903840 10.189231041 163.585414096 10.476148636 163.034533663 - 10.291558497 162.680094504 + 10.291558504 162.680094513 } 837769fffffffff { @@ -182846,7 +185942,7 @@ 8.792690864 164.157676782 9.344910433 164.145765973 9.629780104 163.600903840 - 9.539148542 163.424211380 + 9.539148546 163.424211384 } 83776cfffffffff { @@ -182856,7 +185952,7 @@ 11.049339323 161.925348943 10.433748656 161.998749773 10.173651283 162.528511122 - 10.291558507 162.680094518 + 10.291558504 162.680094513 } 83776dfffffffff { @@ -184899,11 +187995,11 @@ 8378d8fffffffff { -9.239940059 -134.628805757 - -9.597823205 -134.779840479 + -9.597823195 -134.779840474 -9.780591345 -134.809146330 -10.188951620 -134.358338768 -10.046414637 -133.824178149 - -9.682234330 -133.769672034 + -9.682234341 -133.769672039 -9.504429989 -133.694222852 -9.104622055 -134.046658506 } @@ -184913,7 +188009,7 @@ -9.762691218 -132.771644849 -9.367997537 -133.118235208 -9.504429989 -133.694222852 - -9.682234346 -133.769672040 + -9.682234341 -133.769672039 -10.046414637 -133.824178149 -10.451340858 -133.374361022 } @@ -184959,7 +188055,7 @@ -9.509409047 -135.801733831 -9.921038900 -135.350204525 -9.780591345 -134.809146330 - -9.597823190 -134.779840472 + -9.597823195 -134.779840474 -9.239940059 -134.628805757 -8.835064355 -134.987020721 } @@ -185915,11 +189011,11 @@ 6.326920628 -126.596525130 5.755951388 -126.834850275 5.280239156 -126.506635701 - 5.343315707 -126.131642988 + 5.343315705 -126.131642999 5.337968143 -125.934470502 5.834439272 -125.674906570 6.348693040 -126.010825850 - 6.357226130 -126.407656502 + 6.357226132 -126.407656491 } 837969fffffffff { @@ -185947,7 +189043,7 @@ 4.339393062 -125.859280703 4.828228923 -125.601308336 5.337968143 -125.934470502 - 5.343315704 -126.131643005 + 5.343315705 -126.131642999 } 83796cfffffffff { @@ -185957,7 +189053,7 @@ 7.380558348 -126.687382023 6.808152739 -126.926923001 6.326920628 -126.596525130 - 6.357226132 -126.407656485 + 6.357226132 -126.407656491 } 83796dfffffffff { @@ -187999,11 +191095,11 @@ 837ad8fffffffff { 8.891958817 41.595029219 - 9.270631430 41.595324629 + 9.270631419 41.595324629 9.463300768 41.633882276 9.800444455 41.180781450 9.555602060 40.610454635 - 9.167971596 40.536241283 + 9.167971607 40.536241283 8.977831051 40.535188935 8.649403690 41.065194725 } @@ -188013,7 +191109,7 @@ 9.061221740 39.467791014 8.733269835 40.000124891 8.977831051 40.535188935 - 9.167971613 40.536241285 + 9.167971607 40.536241283 9.555602060 40.610454635 9.893776482 40.148939039 } @@ -188059,7 +191155,7 @@ 9.369199949 42.644449866 9.705152876 42.199874876 9.463300768 41.633882276 - 9.270631413 41.595324629 + 9.270631419 41.595324629 8.891958817 41.595029219 8.563210411 42.122364874 } @@ -189519,11 +192615,11 @@ { -1.572386063 55.461531203 -1.029560313 55.414838215 - -0.911572872 55.066090581 + -0.911572879 55.066090591 -0.806526512 54.904473763 -1.077206298 54.448843791 -1.666807289 54.479927765 - -1.876645767 54.806041883 + -1.876645761 54.806041873 -1.937275636 54.980960721 } 837bb1fffffffff @@ -189539,7 +192635,7 @@ { -0.223052126 54.872606783 -0.806526512 54.904473763 - -0.911572880 55.066090596 + -0.911572879 55.066090591 -1.029560313 55.414838215 -0.666741509 55.892653793 -0.130721174 55.844201047 @@ -189567,7 +192663,7 @@ { -2.486719794 55.025848668 -1.937275636 54.980960721 - -1.876645758 54.806041868 + -1.876645761 54.806041873 -1.666807289 54.479927765 -1.943574177 54.018747629 -2.539119688 54.049017991 @@ -191100,11 +194196,11 @@ 837cd8fffffffff { 8.849838534 -20.360460726 - 9.179368378 -20.171571440 + 9.179368368 -20.171571445 9.328340465 -20.041914856 9.841824080 -20.267671841 9.905931752 -20.886691451 - 9.604669492 -21.145105175 + 9.604669502 -21.145105169 9.439673273 -21.240928162 8.896102350 -20.942658374 } @@ -191114,7 +194210,7 @@ 10.031218079 -22.130304472 9.486894589 -21.829531753 9.439673273 -21.240928162 - 9.604669506 -21.145105165 + 9.604669502 -21.145105169 9.905931752 -20.886691451 10.424447193 -21.119303045 } @@ -191160,7 +194256,7 @@ 8.755747177 -19.210049293 9.263984873 -19.429037150 9.328340465 -20.041914856 - 9.179368363 -20.171571448 + 9.179368368 -20.171571445 8.849838534 -20.360460726 8.307358124 -20.064799245 } @@ -192620,11 +195716,11 @@ { -7.004002525 -13.329096473 -6.505310488 -13.108142071 - -6.234531481 -13.359070172 + -6.234531491 -13.359070167 -6.064824490 -13.450968579 -6.083431425 -13.983546654 -6.615326297 -14.241415984 - -6.956087094 -14.055279720 + -6.956087084 -14.055279726 -7.093312320 -13.930212169 } 837db1fffffffff @@ -192640,7 +195736,7 @@ { -5.537584541 -13.197726644 -6.064824490 -13.450968579 - -6.234531495 -13.359070163 + -6.234531491 -13.359070167 -6.505310488 -13.108142071 -6.415679844 -12.511172490 -5.921790765 -12.296059662 @@ -192668,7 +195764,7 @@ { -7.596590877 -14.157044179 -7.093312320 -13.930212169 - -6.956087079 -14.055279728 + -6.956087084 -14.055279726 -6.615326297 -14.241415984 -6.635958906 -14.782289825 -7.172309458 -15.044804119 @@ -192686,21 +195782,21 @@ 837e00fffffffff { -2.680526420 174.972745724 - -2.375503624 175.156577825 + -2.375503634 175.156577820 -2.210906368 175.183343062 - -1.941980463 174.949852483 + -1.941980471 174.949852490 -1.865650699 174.801509823 - -2.004371333 174.473414272 + -2.004371329 174.473414282 -2.121752495 174.354892713 - -2.476484829 174.385450800 + -2.476484819 174.385450799 -2.625406603 174.460557194 - -2.705924025 174.807753136 + -2.705924022 174.807753125 } 837e02fffffffff { -1.425503867 174.848915909 -1.865650699 174.801509823 - -1.941980475 174.949852494 + -1.941980471 174.949852490 -2.210906368 175.183343062 -2.119788979 175.616864308 -1.620369541 175.699472347 @@ -192714,13 +195810,13 @@ -1.403424289 173.903936854 -1.940495479 173.950756720 -2.121752495 174.354892713 - -2.004371327 174.473414287 + -2.004371329 174.473414282 } 837e04fffffffff { -3.064417748 175.193482447 -2.680526420 174.972745724 - -2.705924021 174.807753120 + -2.705924022 174.807753125 -2.625406603 174.460557194 -2.953524966 174.163029134 -3.406313557 174.389694985 @@ -192732,7 +195828,7 @@ -2.831978259 173.637133167 -2.953524966 174.163029134 -2.625406603 174.460557194 - -2.476484813 174.385450799 + -2.476484819 174.385450799 -2.121752495 174.354892713 -1.940495479 173.950756720 } @@ -192742,10 +195838,75 @@ -2.526343960 175.971202487 -2.119788979 175.616864308 -2.210906368 175.183343062 - -2.375503638 175.156577817 + -2.375503634 175.156577820 -2.680526420 174.972745724 -3.064417748 175.193482447 } +837e08fffffffff +{ + -1.742572507 172.339633748 + -2.289083056 172.389731440 + -2.472195984 172.810042814 + -2.113375835 173.177538977 + -1.571573279 173.129097595 + -1.383898340 172.711512192 +} +837e09fffffffff +{ + -1.916391180 171.535435646 + -2.467580053 171.587223620 + -2.651629463 172.015732533 + -2.289083056 172.389731440 + -1.742572507 172.339633748 + -1.553944425 171.913855086 +} +837e0afffffffff +{ + -0.836834361 172.662021707 + -1.383898340 172.711512192 + -1.571573279 173.129097595 + -1.216701086 173.494470379 + -0.945795773 173.470566746 + -0.720708792 173.490891219 + -0.482261285 173.031772071 +} +837e0bfffffffff +{ + -1.002106837 171.862683251 + -1.553944425 171.913855086 + -1.742572507 172.339633748 + -1.383898340 172.711512192 + -0.836834361 172.662021707 + -0.643686937 172.238979782 +} +837e0cfffffffff +{ + -2.472195984 172.810042814 + -3.013253053 172.859084170 + -3.102313722 173.067094918 + -3.163465663 173.332484600 + -2.831978259 173.637133167 + -2.295558367 173.589722986 + -2.113375835 173.177538977 +} +837e0dfffffffff +{ + -2.651629463 172.015732533 + -3.197296031 172.066439400 + -3.375792875 172.489471335 + -3.013253053 172.859084170 + -2.472195984 172.810042814 + -2.289083056 172.389731440 +} +837e0efffffffff +{ + -1.571573279 173.129097595 + -2.113375835 173.177538977 + -2.295558367 173.589722986 + -1.940495479 173.950756720 + -1.403424289 173.903936854 + -1.216701086 173.494470379 +} 837e10fffffffff { -1.018646796 176.224951645 @@ -193071,6 +196232,457 @@ -4.168718289 176.384455179 -4.570698713 176.619937129 } +837e40fffffffff +{ + -3.396285732 168.690462338 + -3.959982421 168.748153970 + -4.142254075 169.204271981 + -3.765475428 169.600003819 + -3.206211257 169.544104241 + -3.019302137 169.090687806 +} +837e41fffffffff +{ + -3.588834473 167.821896704 + -4.156901458 167.881408321 + -4.340157649 168.345875479 + -3.959982421 168.748153970 + -3.396285732 168.690462338 + -3.208401504 168.228678812 +} +837e42fffffffff +{ + -2.454323915 169.033636171 + -3.019302137 169.090687806 + -3.206211257 169.544104241 + -2.832749983 169.937761476 + -2.272320209 169.882495231 + -2.080813975 169.431793594 +} +837e43fffffffff +{ + -2.638932741 168.169813029 + -3.208401504 168.228678812 + -3.396285732 168.690462338 + -3.019302137 169.090687806 + -2.454323915 169.033636171 + -2.261848097 168.574551719 +} +837e44fffffffff +{ + -4.142254075 169.204271981 + -4.700039560 169.260805870 + -4.788630020 169.486630173 + -4.851996518 169.764874612 + -4.500197654 170.102555141 + -3.946780799 170.047790769 + -3.765475428 169.600003819 +} +837e45fffffffff +{ + -4.340157649 168.345875479 + -4.902252760 168.404207737 + -5.079855937 168.863013285 + -4.700039560 169.260805870 + -4.142254075 169.204271981 + -3.959982421 168.748153970 +} +837e46fffffffff +{ + -3.206211257 169.544104241 + -3.765475428 169.600003819 + -3.946780799 170.047790769 + -3.573472899 170.436971674 + -3.018696005 170.382834524 + -2.832749983 169.937761476 +} +837e48fffffffff +{ + -3.015639046 166.397318394 + -3.593883828 166.459891159 + -3.783761283 166.938422226 + -3.399961401 167.351736557 + -2.826067776 167.291029708 + -2.631629302 166.815148370 +} +837e49fffffffff +{ + -3.207545120 165.488741425 + -3.790059097 165.553202645 + -3.980958343 166.040082661 + -3.593883828 166.459891159 + -3.015639046 166.397318394 + -2.820204459 165.913053825 +} +837e4afffffffff +{ + -2.052071644 166.753230720 + -2.631629302 166.815148370 + -2.826067776 167.291029708 + -2.445480004 167.702330379 + -1.870395140 167.642274280 + -1.671433496 167.169061967 +} +837e4bfffffffff +{ + -2.236251731 165.849251041 + -2.820204459 165.913053825 + -3.015639046 166.397318394 + -2.631629302 166.815148370 + -2.052071644 166.753230720 + -1.852135368 166.271603379 +} +837e4cfffffffff +{ + -3.783761283 166.938422226 + -4.356128638 166.999779842 + -4.540389665 167.472599719 + -4.156901458 167.881408321 + -3.588834473 167.821896704 + -3.399961401 167.351736557 +} +837e4dfffffffff +{ + -3.980958343 166.040082661 + -4.557548204 166.103310137 + -4.742836478 166.584470750 + -4.356128638 166.999779842 + -3.783761283 166.938422226 + -3.593883828 166.459891159 +} +837e4efffffffff +{ + -2.826067776 167.291029708 + -3.399961401 167.351736557 + -3.588834473 167.821896704 + -3.208401504 168.228678812 + -2.638932741 168.169813029 + -2.445480004 167.702330379 +} +837e50fffffffff +{ + -1.341165070 170.219430646 + -1.902447321 170.274064669 + -2.092989915 170.716412712 + -1.726807573 171.101399183 + -1.170228266 171.048512461 + -0.975142063 170.608899751 +} +837e51fffffffff +{ + -1.514874760 169.375381181 + -2.080813975 169.431793594 + -2.272320209 169.882495231 + -1.902447321 170.274064669 + -1.341165070 170.219430646 + -1.145111190 169.771456219 +} +837e52fffffffff +{ + -0.413319381 170.554896704 + -0.975142063 170.608899751 + -1.170228266 171.048512461 + -0.807989174 171.431385182 + -0.250965671 171.379121415 + -0.051397405 170.942253595 +} +837e53fffffffff +{ + -0.578530844 169.715682110 + -1.145111190 169.771456219 + -1.341165070 170.219430646 + -0.975142063 170.608899751 + -0.413319381 170.554896704 + -0.212776149 170.109661097 +} +837e54fffffffff +{ + -2.092989915 170.716412712 + -2.648820835 170.769923936 + -2.833814132 171.206690441 + -2.467580053 171.587223620 + -1.916391180 171.535435646 + -1.726807573 171.101399183 +} +837e55fffffffff +{ + -2.272320209 169.882495231 + -2.832749983 169.937761476 + -3.018696005 170.382834524 + -2.648820835 170.769923936 + -2.092989915 170.716412712 + -1.902447321 170.274064669 +} +837e56fffffffff +{ + -1.170228266 171.048512461 + -1.726807573 171.101399183 + -1.916391180 171.535435646 + -1.553944425 171.913855086 + -1.002106837 171.862683251 + -0.807989174 171.431385182 +} +837e58fffffffff +{ + -0.917374066 167.992137583 + -1.493314901 168.051543109 + -1.691305409 168.516331361 + -1.317853126 168.919010409 + -0.746564126 168.861434915 + -0.544087015 168.399357102 +} +837e59fffffffff +{ + -1.090905757 167.107799665 + -1.671433496 167.169061967 + -1.870395140 167.642274280 + -1.493314901 168.051543109 + -0.917374066 167.992137583 + -0.713936566 167.521612704 +} +837e5afffffffff +{ + 0.032375552 168.340601813 + -0.544087015 168.399357102 + -0.746564126 168.861434915 + -0.377018226 169.262038790 + 0.194690925 169.205107450 + 0.401594496 168.745755264 +} +837e5bfffffffff +{ + -0.132780975 167.461005820 + -0.713936566 167.521612704 + -0.917374066 167.992137583 + -0.544087015 168.399357102 + 0.032375552 168.340601813 + 0.240232405 167.872781899 +} +837e5cfffffffff +{ + -1.691305409 168.516331361 + -2.261848097 168.574551719 + -2.454323915 169.033636171 + -2.080813975 169.431793594 + -1.514874760 169.375381181 + -1.317853126 168.919010409 +} +837e5dfffffffff +{ + -1.870395140 167.642274280 + -2.445480004 167.702330379 + -2.638932741 168.169813029 + -2.261848097 168.574551719 + -1.691305409 168.516331361 + -1.493314901 168.051543109 +} +837e5efffffffff +{ + -0.746564126 168.861434915 + -1.317853126 168.919010409 + -1.514874760 169.375381181 + -1.145111190 169.771456219 + -0.578530844 169.715682110 + -0.377018226 169.262038790 +} +837e60fffffffff +{ + -5.944977631 170.762372331 + -5.459756340 170.540396274 + -5.333946773 169.982468152 + -5.693271564 169.640546636 + -6.182933722 169.859846838 + -6.308828498 170.423801316 +} +837e61fffffffff +{ + -6.182933722 169.859846838 + -5.693271564 169.640546636 + -5.566101967 169.077807192 + -5.928378282 168.728334791 + -6.422432287 168.944752104 + -6.549818447 169.513582759 +} +837e62fffffffff +{ + -5.103494118 170.874772060 + -4.625884264 170.654579611 + -4.500197654 170.102555141 + -4.851996518 169.764874612 + -5.333946773 169.982468152 + -5.459756340 170.540396274 +} +837e63fffffffff +{ + -5.333946773 169.982468152 + -4.851996518 169.764874612 + -4.788630020 169.486630173 + -4.700039560 169.260805870 + -5.079855937 168.863013285 + -5.566101967 169.077807192 + -5.693271564 169.640546636 +} +837e64fffffffff +{ + -6.557695325 171.547583077 + -6.069451265 171.321252444 + -5.944977631 170.762372331 + -6.308828498 170.423801316 + -6.801656372 170.647585738 + -6.926045521 171.212544809 +} +837e65fffffffff +{ + -6.801656372 170.647585738 + -6.308828498 170.423801316 + -6.182933722 169.859846838 + -6.549818447 169.513582759 + -7.047185026 169.734611276 + -7.173126164 170.304718515 +} +837e66fffffffff +{ + -5.708746524 171.652147198 + -5.228007003 171.427698494 + -5.103494118 170.874772060 + -5.459756340 170.540396274 + -5.944977631 170.762372331 + -6.069451265 171.321252444 +} +837e68fffffffff +{ + -5.492970351 167.121939959 + -5.869475815 167.162496277 + -6.034804120 167.232251977 + -6.164890528 167.803976126 + -5.799783565 168.160991059 + -5.472361276 168.019569541 + -5.285329245 167.999891927 + -5.106728007 167.532757427 +} +837e69fffffffff +{ + -5.702648074 166.229194750 + -6.270965136 166.291853296 + -6.402610992 166.867717079 + -6.034804120 167.232251977 + -5.869475815 167.162496277 + -5.492970351 167.121939959 + -5.313344046 166.646478987 +} +837e6afffffffff +{ + -4.540389665 167.472599719 + -5.106728007 167.532757427 + -5.285329245 167.999891927 + -4.902252760 168.404207737 + -4.340157649 168.345875479 + -4.156901458 167.881408321 +} +837e6bfffffffff +{ + -4.742836478 166.584470750 + -5.313344046 166.646478987 + -5.492970351 167.121939959 + -5.106728007 167.532757427 + -4.540389665 167.472599719 + -4.356128638 166.999779842 +} +837e6cfffffffff +{ + -6.422432287 168.944752104 + -5.928378282 168.728334791 + -5.799783565 168.160991059 + -6.164890528 167.803976126 + -6.663278895 168.017300237 + -6.792228388 168.590791533 +} +837e6dfffffffff +{ + -6.663278895 168.017300237 + -6.164890528 167.803976126 + -6.034804120 167.232251977 + -6.402610992 166.867717079 + -6.905267449 167.077735000 + -7.035853617 167.655653890 +} +837e6efffffffff +{ + -5.566101967 169.077807192 + -5.079855937 168.863013285 + -4.902252760 168.404207737 + -5.285329245 167.999891927 + -5.472361276 168.019569541 + -5.799783565 168.160991059 + -5.928378282 168.728334791 +} +837e70fffffffff +{ + -3.753828274 170.876459126 + -4.120094330 170.911827187 + -4.277167960 170.984857769 + -4.401676197 171.531952097 + -4.056133439 171.854846824 + -3.745246838 171.707451506 + -3.563475976 171.690328231 + -3.384056186 171.259096263 +} +837e71fffffffff +{ + -3.946780799 170.047790769 + -4.500197654 170.102555141 + -4.625884264 170.654579611 + -4.277167960 170.984857769 + -4.120094330 170.911827187 + -3.753828274 170.876459126 + -3.573472899 170.436971674 +} +837e72fffffffff +{ + -2.833814132 171.206690441 + -3.384056186 171.259096263 + -3.563475976 171.690328231 + -3.197296031 172.066439400 + -2.651629463 172.015732533 + -2.467580053 171.587223620 +} +837e73fffffffff +{ + -3.018696005 170.382834524 + -3.573472899 170.436971674 + -3.753828274 170.876459126 + -3.384056186 171.259096263 + -2.833814132 171.206690441 + -2.648820835 170.769923936 +} +837e74fffffffff +{ + -4.648343501 172.621647398 + -4.179518137 172.396843859 + -4.056133439 171.854846824 + -4.401676197 171.531952097 + -4.874908659 171.754546478 + -4.998186241 172.302297278 +} +837e75fffffffff +{ + -4.874908659 171.754546478 + -4.401676197 171.531952097 + -4.277167960 170.984857769 + -4.625884264 170.654579611 + -5.103494118 170.874772060 + -5.228007003 171.427698494 +} +837e76fffffffff +{ + -3.837230829 172.712385567 + -3.375792875 172.489471335 + -3.197296031 172.066439400 + -3.563475976 171.690328231 + -3.745246838 171.707451506 + -4.056133439 171.854846824 + -4.179518137 172.396843859 +} 837e80fffffffff { 2.455540970 178.142812587 @@ -193266,11 +196878,11 @@ { 4.219864867 178.914283206 4.773514688 179.014519282 - 5.052449975 178.757488420 + 5.052449970 178.757488429 5.144219327 178.602846192 4.911149492 178.066198559 4.406544894 177.997034918 - 4.226532281 178.305493998 + 4.226532287 178.305493989 4.087603134 178.432570119 } 837e99fffffffff @@ -193286,7 +196898,7 @@ { 5.655400465 178.675983563 5.144219327 178.602846192 - 5.052449966 178.757488433 + 5.052449970 178.757488429 4.773514688 179.014519282 4.910079594 179.503783670 5.469991707 179.607053305 @@ -193314,7 +196926,7 @@ { 3.540328578 178.335296820 4.087603134 178.432570119 - 4.226532289 178.305493984 + 4.226532287 178.305493989 4.406544894 177.997034918 4.175158178 177.464962752 3.677253905 177.399684319 @@ -193396,11 +197008,11 @@ { 0.631533533 176.937371187 1.155499422 177.027017573 - 1.430097956 176.782023404 + 1.430097951 176.782023413 1.513754250 176.630386352 1.291901032 176.116537646 0.822888551 176.060663637 - 0.658764550 176.362911746 + 0.658764555 176.362911737 0.522140779 176.484023959 } 837ea9fffffffff @@ -193416,7 +197028,7 @@ { 1.989672585 176.689836337 1.513754250 176.630386352 - 1.430097947 176.782023417 + 1.430097951 176.782023413 1.155499422 177.027017573 1.269290313 177.487490263 1.799984953 177.579891667 @@ -193444,7 +197056,7 @@ { 0.004943074 176.397065402 0.522140779 176.484023959 - 0.658764557 176.362911732 + 0.658764555 176.362911737 0.822888551 176.060663637 0.603515753 175.551364323 0.141458826 175.498982248 @@ -193591,11 +197203,11 @@ 3.171219519 169.815086749 3.669066798 169.836832642 3.933902374 169.339375215 - 3.775522988 168.994646059 + 3.775522993 168.994646069 3.656994289 168.859834040 3.076693493 168.917821812 2.856004210 169.377430371 - 3.093328021 169.643664941 + 3.093328016 169.643664931 } 837ec9fffffffff { @@ -193623,7 +197235,7 @@ 4.467031610 168.335252458 3.882715323 168.394436955 3.656994289 168.859834040 - 3.775522995 168.994646074 + 3.775522993 168.994646069 } 837eccfffffffff { @@ -193633,7 +197245,7 @@ 2.420706886 170.282389328 2.910467468 170.306633613 3.171219519 169.815086749 - 3.093328013 169.643664927 + 3.093328016 169.643664931 } 837ecdfffffffff { @@ -193784,11 +197396,11 @@ 0.217684674 172.605633759 0.682585360 172.642199210 0.930223170 172.171779812 - 0.782450861 171.834756654 + 0.782450865 171.834756664 0.664256184 171.708227721 0.107090180 171.759870204 -0.091496959 172.188422264 - 0.144918886 172.438187999 + 0.144918882 172.438187989 } 837ee1fffffffff { @@ -193816,7 +197428,7 @@ 1.430213937 171.221368235 0.868236728 171.274113589 0.664256184 171.708227721 - 0.782450868 171.834756669 + 0.782450865 171.834756664 } 837ee4fffffffff { @@ -193826,7 +197438,7 @@ -0.482261285 173.031772071 -0.025381150 173.070364846 0.217684674 172.605633759 - 0.144918879 172.438187986 + 0.144918882 172.438187989 } 837ee5fffffffff { @@ -194169,11 +197781,11 @@ -6.489228512 175.482363813 -6.007543636 175.768812637 -5.595465964 175.536787125 - -5.640461673 175.194186006 + -5.640461672 175.194186016 -5.601112598 175.015043128 -5.955955132 174.710914371 -6.432627924 174.947579104 - -6.510755000 175.309457102 + -6.510755001 175.309457092 } 837f19fffffffff { @@ -194201,13 +197813,13 @@ -4.784299416 175.081126814 -5.131495889 174.780529729 -5.601112598 175.015043128 - -5.640461671 175.194186021 + -5.640461672 175.194186016 } 837f1cfffffffff { -6.908950164 175.716043784 -6.489228512 175.482363813 - -6.510755000 175.309457086 + -6.510755001 175.309457092 -6.432627924 174.947579104 -6.795174224 174.639836782 -7.278882623 174.878691232 @@ -194362,11 +197974,11 @@ -10.582350710 176.038920927 -10.078322568 176.337107871 -9.630508705 176.090903909 - -9.666785504 175.731279730 + -9.666785503 175.731279740 -9.629371230 175.544339764 -10.019479860 175.229662560 -10.525499211 175.479550994 - -10.599362393 175.857340737 + -10.599362394 175.857340726 } 837f31fffffffff { @@ -194394,13 +198006,13 @@ -8.747781221 175.607741769 -9.130061296 175.296859689 -9.629371230 175.544339764 - -9.666785502 175.731279746 + -9.666785503 175.731279740 } 837f34fffffffff { -11.037573891 176.287003415 -10.582350710 176.038920927 - -10.599362393 175.857340721 + -10.599362394 175.857340726 -10.525499211 175.479550994 -10.923438451 175.160986900 -11.436074985 175.413329628 @@ -194554,11 +198166,11 @@ 837f50fffffffff { -3.753828274 170.876459126 - -4.120094341 170.911827188 + -4.120094330 170.911827187 -4.277167960 170.984857769 -4.401676197 171.531952097 -4.056133439 171.854846824 - -3.745246828 171.707451505 + -3.745246838 171.707451506 -3.563475976 171.690328231 -3.384056186 171.259096263 } @@ -194577,7 +198189,7 @@ -3.375792875 172.489471335 -3.197296031 172.066439400 -3.563475976 171.690328231 - -3.745246843 171.707451508 + -3.745246838 171.707451506 -4.056133439 171.854846824 -4.179518137 172.396843859 } @@ -194605,7 +198217,7 @@ -4.500197654 170.102555141 -4.625884264 170.654579611 -4.277167960 170.984857769 - -4.120094324 170.911827186 + -4.120094330 170.911827187 -3.753828274 170.876459126 -3.573472899 170.436971674 } @@ -194684,11 +198296,11 @@ 837f60fffffffff { -5.492970351 167.121939959 - -5.869475826 167.162496278 + -5.869475815 167.162496277 -6.034804120 167.232251977 -6.164890528 167.803976126 -5.799783565 168.160991059 - -5.472361265 168.019569540 + -5.472361276 168.019569541 -5.285329245 167.999891927 -5.106728007 167.532757427 } @@ -194707,7 +198319,7 @@ -5.079855937 168.863013285 -4.902252760 168.404207737 -5.285329245 167.999891927 - -5.472361281 168.019569543 + -5.472361276 168.019569541 -5.799783565 168.160991059 -5.928378282 168.728334791 } @@ -194735,7 +198347,7 @@ -6.270965136 166.291853296 -6.402610992 166.867717079 -6.034804120 167.232251977 - -5.869475809 167.162496276 + -5.869475815 167.162496277 -5.492970351 167.121939959 -5.313344046 166.646478987 } @@ -194942,11 +198554,11 @@ 837f88fffffffff { -2.574151204 178.132331084 - -2.912437813 178.070312824 + -2.912437803 178.070312826 -3.070038435 177.978020340 -3.466802183 178.223467255 -3.388674546 178.750214552 - -3.070299564 178.934989126 + -3.070299575 178.934989125 -2.900178891 178.967219073 -2.481236038 178.595880751 } @@ -194956,7 +198568,7 @@ -2.756497157 177.219935385 -3.148155084 177.458649188 -3.070038435 177.978020340 - -2.912437798 178.070312827 + -2.912437803 178.070312826 -2.574151204 178.132331084 -2.158346521 177.765170951 } @@ -195002,18 +198614,18 @@ -3.230001457 179.813924178 -2.808056219 179.438486887 -2.900178891 178.967219073 - -3.070299579 178.934989122 + -3.070299575 178.934989125 -3.388674546 178.750214552 -3.790523678 179.002515030 } 837f90fffffffff { -3.287974162 -177.853205423 - -3.636692719 -177.926877887 + -3.636692708 -177.926877885 -3.800873513 -178.018774465 -4.214673850 -177.740438033 -4.133555545 -177.182240731 - -3.802064421 -176.998774226 + -3.802064432 -176.998774229 -3.626854612 -176.960634953 -3.193778453 -177.351898881 } @@ -195023,7 +198635,7 @@ -3.472804933 -178.841095525 -3.881725332 -178.569915029 -3.800873513 -178.018774465 - -3.636692703 -177.926877884 + -3.636692708 -177.926877885 -3.287974162 -177.853205423 -2.857487767 -178.240721976 } @@ -195069,7 +198681,7 @@ -3.968796977 -176.056963844 -3.533312544 -176.451845069 -3.626854612 -176.960634953 - -3.802064436 -176.998774231 + -3.802064432 -176.998774229 -4.133555545 -177.182240731 -4.552167523 -176.896660354 } @@ -199932,11 +203544,11 @@ 8382d8fffffffff { 4.177101807 7.290400281 - 4.561076042 7.343890732 + 4.561076031 7.343890730 4.745189318 7.325363492 5.027555518 6.790366594 4.756630447 6.315945038 - 4.390687666 6.356033855 + 4.390687677 6.356033856 4.199868227 6.328813390 3.900764823 6.767341320 } @@ -199946,7 +203558,7 @@ 4.221154434 5.380973349 3.924845977 5.811936381 4.199868227 6.328813390 - 4.390687682 6.356033856 + 4.390687677 6.356033856 4.756630447 6.315945038 5.036820297 5.783541060 } @@ -199992,7 +203604,7 @@ 4.732154389 8.344198848 5.016633986 7.806921223 4.745189318 7.325363492 - 4.561076025 7.343890729 + 4.561076031 7.343890730 4.177101807 7.290400281 3.875233052 7.736418175 } @@ -200948,11 +204560,11 @@ -12.887839783 3.366519008 -12.276217716 3.458697301 -11.894741459 3.015861783 - -12.046830658 2.661364577 + -12.046830654 2.661364588 -12.089340109 2.465297982 -12.633669306 2.332117927 -13.051214035 2.792733434 - -12.963168873 3.187394972 + -12.963168877 3.187394961 } 838369fffffffff { @@ -200980,7 +204592,7 @@ -11.138663793 2.144107201 -11.675162252 2.010104517 -12.089340109 2.465297982 - -12.046830651 2.661364593 + -12.046830654 2.661364588 } 83836cfffffffff { @@ -200990,7 +204602,7 @@ -13.887077985 3.722332460 -13.273780538 3.814455147 -12.887839783 3.366519008 - -12.963168879 3.187394956 + -12.963168877 3.187394961 } 83836dfffffffff { @@ -204043,11 +207655,11 @@ 3.742247301 67.838031568 3.222500409 67.941532791 3.055078156 68.508568045 - 3.292191461 68.815728285 + 3.292191454 68.815728276 3.436668134 68.931535824 4.011414842 68.748004795 4.148878291 68.219462361 - 3.859561039 67.991294645 + 3.859561046 67.991294654 } 838569fffffffff { @@ -204075,7 +207687,7 @@ 2.717252413 69.649200718 3.294963304 69.465204625 3.436668134 68.931535824 - 3.292191450 68.815728272 + 3.292191454 68.815728276 } 83856cfffffffff { @@ -204085,7 +207697,7 @@ 4.419053966 67.176089379 3.906551458 67.276010790 3.742247301 67.838031568 - 3.859561050 67.991294658 + 3.859561046 67.991294654 } 83856dfffffffff { @@ -204552,11 +208164,11 @@ { -5.538163657 53.225252425 -6.150696343 53.254228948 - -6.357226136 53.592343519 + -6.357226132 53.592343509 -6.425873923 53.770771466 -6.052652251 54.266538216 -5.477104524 54.224192999 - -5.343315701 53.868356990 + -5.343315705 53.868357001 -5.239720247 53.700799364 } 8385b1fffffffff @@ -204572,7 +208184,7 @@ { -7.007004237 53.811123301 -6.425873923 53.770771466 - -6.357226129 53.592343504 + -6.357226132 53.592343509 -6.150696343 53.254228948 -6.454593402 52.772855436 -7.071873750 52.800911592 @@ -204600,7 +208212,7 @@ { -4.632205774 53.670936340 -5.239720247 53.700799364 - -5.343315707 53.868357006 + -5.343315705 53.868357001 -5.477104524 54.224192999 -5.104576540 54.717189310 -4.534887206 54.672899593 @@ -204620,11 +208232,11 @@ -7.635920444 85.067482009 -7.041644584 84.885114169 -6.866313118 84.270304562 - -7.145677891 83.983740275 + -7.145677882 83.983740283 -7.284291402 83.839294989 -7.878994532 84.020341808 -8.054670771 84.636476205 - -7.774885508 84.923218729 + -7.774885516 84.923218720 } 838601fffffffff { @@ -204652,7 +208264,7 @@ -6.514817339 83.047208992 -7.106808011 83.224485294 -7.284291402 83.839294989 - -7.145677878 83.983740288 + -7.145677882 83.983740283 } 838604fffffffff { @@ -204662,7 +208274,7 @@ -8.401781337 85.865150938 -7.810853779 85.683776714 -7.635920444 85.067482009 - -7.774885520 84.923218716 + -7.774885516 84.923218720 } 838605fffffffff { @@ -206015,11 +209627,11 @@ -1.964723188 76.744999361 -1.366426203 76.558153803 -1.200083901 75.977305822 - -1.486897815 75.716544302 + -1.486897806 75.716544310 -1.614766747 75.564275920 -2.183047692 75.706851946 -2.366065087 76.309264833 - -2.107618208 76.613140654 + -2.107618216 76.613140646 } 8386c9fffffffff { @@ -206047,7 +209659,7 @@ -0.870188190 74.826761152 -1.432805185 74.965435928 -1.614766747 75.564275920 - -1.486897802 75.716544314 + -1.486897806 75.716544310 } 8386ccfffffffff { @@ -206057,7 +209669,7 @@ -2.731781119 77.516184731 -2.133447204 77.329549847 -1.964723188 76.744999361 - -2.107618220 76.613140641 + -2.107618216 76.613140646 } 8386cdfffffffff { @@ -206208,11 +209820,11 @@ -4.793626151 80.860593668 -4.193611665 80.674936774 -4.019762259 80.074267782 - -4.303330461 79.799444544 + -4.303330452 79.799444552 -4.436659078 79.650192408 -5.021598950 79.812400857 -5.204127636 80.424820096 - -4.934775836 80.721923727 + -4.934775844 80.721923719 } 8386e1fffffffff { @@ -206240,7 +209852,7 @@ -3.673184115 78.881996702 -4.253796915 79.040304288 -4.436659078 79.650192408 - -4.303330448 79.799444557 + -4.303330452 79.799444552 } 8386e4fffffffff { @@ -206250,7 +209862,7 @@ -5.566875090 81.648993746 -4.968527612 81.463936265 -4.793626151 80.860593668 - -4.934775848 80.721923715 + -4.934775844 80.721923719 } 8386e5fffffffff { @@ -206593,11 +210205,11 @@ -10.431878541 89.322338235 -9.850555182 89.145359025 -9.680107520 88.522871619 - -9.954649788 88.227412195 + -9.954649780 88.227412204 -10.098087284 88.089512147 -10.694902322 88.287926358 -10.857552307 88.901001671 - -10.568388549 89.173947899 + -10.568388557 89.173947890 } 838719fffffffff { @@ -206625,7 +210237,7 @@ -9.336365705 87.281551857 -9.932228881 87.476458134 -10.098087284 88.089512147 - -9.954649776 88.227412208 + -9.954649780 88.227412204 } 83871cfffffffff { @@ -206635,7 +210247,7 @@ -11.176978153 90.120642719 -10.600511495 89.945030878 -10.431878541 89.322338235 - -10.568388562 89.173947886 + -10.568388557 89.173947890 } 83871dfffffffff { @@ -206786,11 +210398,11 @@ -13.124360263 93.578770957 -12.562313937 93.409140071 -12.402747331 92.785831160 - -12.672156139 92.484688364 + -12.672156131 92.484688373 -12.819665669 92.354901474 -13.410874450 92.568594156 -13.555206334 93.171779189 - -13.258291484 93.427882865 + -13.258291492 93.427882856 } 838731fffffffff { @@ -206818,7 +210430,7 @@ -12.078938615 91.539853309 -12.670944687 91.750420664 -12.819665669 92.354901474 - -12.672156127 92.484688377 + -12.672156131 92.484688373 } 838734fffffffff { @@ -206828,7 +210440,7 @@ -13.836853810 94.368931436 -13.280878305 94.200996175 -13.124360263 93.578770957 - -13.258291497 93.427882853 + -13.258291492 93.427882856 } 838735fffffffff { @@ -207733,11 +211345,11 @@ 838800fffffffff { -7.932483784 -153.395606753 - -7.555876330 -153.263602345 + -7.555876341 -153.263602348 -7.368000175 -153.196312294 -6.914935575 -153.624620106 -7.027331370 -154.254221064 - -7.403643363 -154.386920038 + -7.403643351 -154.386920034 -7.591338303 -154.454728050 -8.045203760 -154.026618843 } @@ -207747,7 +211359,7 @@ -7.248658354 -155.509023489 -7.701914877 -155.085907403 -7.591338303 -154.454728050 - -7.403643346 -154.386920032 + -7.403643351 -154.386920034 -7.027331370 -154.254221064 -6.571897829 -154.684380267 } @@ -207793,7 +211405,7 @@ -7.705179737 -152.139932758 -7.254739654 -152.566101904 -7.368000175 -153.196312294 - -7.555876347 -153.263602350 + -7.555876341 -153.263602348 -7.932483784 -153.395606753 -8.386663260 -152.962758006 } @@ -208499,11 +212111,11 @@ 838868fffffffff { -6.468066160 -163.421376543 - -6.103256934 -163.259440948 + -6.103256945 -163.259440953 -5.917260337 -163.202657445 -5.459698352 -163.633121483 -5.561992010 -164.231218394 - -5.933501356 -164.342239766 + -5.933501345 -164.342239761 -6.114735717 -164.424383304 -6.564871491 -164.047072909 } @@ -208513,7 +212125,7 @@ -5.762860491 -165.416749929 -6.210126111 -165.046334926 -6.114735717 -164.424383304 - -5.933501340 -164.342239759 + -5.933501345 -164.342239761 -5.561992010 -164.231218394 -5.104290910 -164.660761293 } @@ -208559,18 +212171,18 @@ -6.271911038 -162.169039139 -5.814768801 -162.600148172 -5.917260337 -163.202657445 - -6.103256950 -163.259440956 + -6.103256945 -163.259440953 -6.468066160 -163.421376543 -6.920835220 -163.037277497 } 838870fffffffff { -7.222489932 -158.451735418 - -6.850400975 -158.303371748 + -6.850400987 -158.303371753 -6.662861635 -158.240943704 -6.205288708 -158.673671603 -6.312195128 -159.291968360 - -6.687304661 -159.414550058 + -6.687304650 -159.414550054 -6.872434277 -159.490248595 -7.326868385 -159.084924870 } @@ -208580,7 +212192,7 @@ -6.522352267 -160.520757935 -6.974995531 -160.121548317 -6.872434277 -159.490248595 - -6.687304644 -159.414550052 + -6.687304650 -159.414550054 -6.312195128 -159.291968360 -5.853355449 -159.725132436 } @@ -208626,7 +212238,7 @@ -7.011431619 -157.188030348 -6.555404800 -157.620027126 -6.662861635 -158.240943704 - -6.850400992 -158.303371755 + -6.850400987 -158.303371753 -7.222489932 -158.451735418 -7.678438292 -158.040483331 } @@ -210461,11 +214073,11 @@ 838988fffffffff { -8.580409836 -148.330301076 - -8.202357352 -148.216759213 + -8.202357363 -148.216759216 -8.015366352 -148.145636859 -7.571048015 -148.562853694 -7.689495567 -149.194034495 - -8.064550498 -149.334882080 + -8.064550487 -149.334882076 -8.253305011 -149.393666882 -8.701712925 -148.949259866 } @@ -210475,7 +214087,7 @@ -7.923278733 -150.455657900 -8.372262250 -150.014869357 -8.253305011 -149.393666882 - -8.064550481 -149.334882074 + -8.064550487 -149.334882076 -7.689495567 -149.194034495 -7.241822640 -149.614446554 } @@ -210521,18 +214133,18 @@ -8.336574337 -147.102127886 -7.895823279 -147.515896453 -8.015366352 -148.145636859 - -8.202357369 -148.216759218 + -8.202357363 -148.216759216 -8.580409836 -148.330301076 -9.027953462 -147.882574610 } 838990fffffffff { -9.152911139 -143.333966187 - -8.776578571 -143.240109910 + -8.776578582 -143.240109913 -8.591643014 -143.166339734 -8.159689232 -143.566416646 -8.284299048 -144.189503637 - -8.655713147 -144.336176202 + -8.655713136 -144.336176199 -8.843950674 -144.385227818 -9.282418694 -143.931695491 } @@ -210542,7 +214154,7 @@ -8.530928518 -145.438522160 -8.971059570 -144.987107216 -8.843950674 -144.385227818 - -8.655713130 -144.336176197 + -8.655713136 -144.336176199 -8.284299048 -144.189503637 -7.848192800 -144.593927549 } @@ -210588,7 +214200,7 @@ -8.893462571 -142.151064629 -8.465819203 -142.546596446 -8.591643014 -143.166339734 - -8.776578588 -143.240109914 + -8.776578582 -143.240109913 -9.152911139 -143.333966187 -9.589455983 -142.878632094 } @@ -210850,11 +214462,11 @@ -8.288706881 -62.530412852 -7.759011228 -62.202701595 -7.186389550 -62.479453112 - -7.159482964 -62.880356833 + -7.159482965 -62.880356821 -7.144467678 -63.080721148 -7.673494252 -63.409055026 -8.246712667 -63.133245243 - -8.273854522 -62.731325387 + -8.273854521 -62.731325399 } 838a01fffffffff { @@ -210882,7 +214494,7 @@ -6.045492475 -63.028604791 -6.570747340 -63.355461708 -7.144467678 -63.080721148 - -7.159482965 -62.880356815 + -7.159482965 -62.880356821 } 838a04fffffffff { @@ -210892,7 +214504,7 @@ -9.387741852 -62.581506330 -8.861897956 -62.253430895 -8.288706881 -62.530412852 - -8.273854521 -62.731325405 + -8.273854521 -62.731325399 } 838a05fffffffff { @@ -212245,11 +215857,11 @@ 1.668755016 -63.850300365 2.208802322 -63.532013788 2.750848308 -63.798855823 - 2.751322754 -64.186886636 + 2.751322754 -64.186886624 2.778130850 -64.384094502 2.290675826 -64.709431051 1.721901030 -64.440341302 - 1.670485279 -64.044755639 + 1.670485279 -64.044755651 } 838ac9fffffffff { @@ -212277,7 +215889,7 @@ 3.824532346 -64.328271730 3.343641450 -64.652177925 2.778130850 -64.384094502 - 2.751322754 -64.186886618 + 2.751322754 -64.186886624 } 838accfffffffff { @@ -212287,7 +215899,7 @@ 0.582735410 -63.901874655 1.122438869 -63.583258289 1.668755016 -63.850300365 - 1.670485280 -64.044755657 + 1.670485279 -64.044755651 } 838acdfffffffff { @@ -212438,11 +216050,11 @@ -3.276296481 -63.198163351 -2.737549419 -62.875187531 -2.175889197 -63.146941541 - -2.161926212 -63.541363509 + -2.161926213 -63.541363497 -2.140556539 -63.740165929 -2.652043308 -64.067054223 -3.227686719 -63.794610603 - -3.267833181 -63.395824604 + -3.267833180 -63.395824616 } 838ae1fffffffff { @@ -212470,7 +216082,7 @@ -1.060212922 -63.686137766 -1.566376344 -64.011572055 -2.140556539 -63.740165929 - -2.161926213 -63.541363491 + -2.161926213 -63.541363497 } 838ae4fffffffff { @@ -212480,7 +216092,7 @@ -4.377108182 -63.249516942 -3.840473278 -62.926194463 -3.276296481 -63.198163351 - -3.267833179 -63.395824622 + -3.267833180 -63.395824616 } 838ae5fffffffff { @@ -212823,11 +216435,11 @@ -13.290712686 -61.846669388 -12.777524038 -61.514181240 -12.203344922 -61.796013499 - -12.164691906 -62.203485179 + -12.164691907 -62.203485167 -12.156689039 -62.405373656 -12.695789559 -62.735036580 -13.257183947 -62.455853212 - -13.270134626 -62.050876279 + -13.270134624 -62.050876291 } 838b19fffffffff { @@ -212855,7 +216467,7 @@ -11.055777977 -62.355291711 -11.592842897 -62.683455561 -12.156689039 -62.405373656 - -12.164691908 -62.203485161 + -12.164691907 -62.203485167 } 838b1cfffffffff { @@ -212865,7 +216477,7 @@ -14.371280476 -61.897460886 -13.863498558 -61.564590385 -13.290712686 -61.846669388 - -13.270134624 -62.050876297 + -13.270134624 -62.050876291 } 838b1dfffffffff { @@ -213016,11 +216628,11 @@ -18.205399995 -61.146553317 -17.715200608 -60.809252180 -17.148762524 -61.096245596 - -17.100108538 -61.510366313 + -17.100108539 -61.510366300 -17.099456509 -61.713735771 -17.640868971 -62.044600190 -18.181791661 -61.762041203 - -18.180017298 -61.354095031 + -18.180017296 -61.354095043 } 838b31fffffffff { @@ -213048,7 +216660,7 @@ -16.013184143 -61.665816366 -16.554325671 -61.995160609 -17.099456509 -61.713735771 - -17.100108540 -61.510366294 + -17.100108539 -61.510366300 } 838b34fffffffff { @@ -213058,7 +216670,7 @@ -19.252194905 -61.196998414 -18.768646196 -60.859296095 -18.205399995 -61.146553317 - -18.180017296 -61.354095049 + -18.180017296 -61.354095043 } 838b35fffffffff { @@ -216489,11 +220101,11 @@ -18.015748293 101.913266899 -17.505510454 101.763043286 -17.381270512 101.158020436 - -17.640276749 100.855566281 + -17.640276741 100.855566290 -17.792765086 100.745533664 -18.352631741 100.981742218 -18.450351368 101.546620160 - -18.144503906 101.762391753 + -18.144503914 101.762391744 } 838d69fffffffff { @@ -216521,7 +220133,7 @@ -17.125740648 99.942921478 -17.689313966 100.177018536 -17.792765086 100.745533664 - -17.640276737 100.855566294 + -17.640276741 100.855566290 } 838d6cfffffffff { @@ -216531,7 +220143,7 @@ -18.638234976 102.663003548 -18.135398496 102.514923107 -18.015748293 101.913266899 - -18.144503919 101.762391741 + -18.144503914 101.762391744 } 838d6dfffffffff { @@ -216998,11 +220610,11 @@ { -7.232655342 115.796271057 -6.629556516 115.684553132 - -6.469782560 115.321501465 + -6.469782563 115.321501476 -6.425248530 115.135470227 -6.859953049 114.692945183 -7.425073059 114.810776998 - -7.511138777 115.182694307 + -7.511138775 115.182694296 -7.591716561 115.363358920 } 838db1fffffffff @@ -217018,7 +220630,7 @@ { -5.854501446 115.018323753 -6.425248530 115.135470227 - -6.469782565 115.321501482 + -6.469782563 115.321501476 -6.629556516 115.684553132 -6.263779054 116.120307577 -5.656012767 116.008204946 @@ -217046,7 +220658,7 @@ { -8.189879279 115.474687708 -7.591716561 115.363358920 - -7.511138774 115.182694291 + -7.511138775 115.182694296 -7.425073059 114.810776998 -7.858180178 114.368472216 -8.417404321 114.486977591 @@ -220151,21 +223763,21 @@ 839000fffffffff { -10.884895879 -121.828930097 - -10.702418806 -121.517695863 + -10.702418811 -121.517695872 -10.569789130 -121.414850407 - -10.222690093 -121.495481093 + -10.222690104 -121.495481091 -10.085548468 -121.591857196 - -10.053358364 -121.951990357 + -10.053358365 -121.951990346 -10.100958947 -122.114312120 - -10.428060732 -122.257211375 + -10.428060722 -122.257211370 -10.594762660 -122.261520982 - -10.829526634 -121.989092115 + -10.829526627 -121.989092123 } 839002fffffffff { -9.719475262 -121.339164125 -10.085548468 -121.591857196 - -10.222690109 -121.495481089 + -10.222690104 -121.495481091 -10.569789130 -121.414850407 -10.693030291 -120.982234402 -10.290739371 -120.669765941 @@ -220179,13 +223791,13 @@ -9.254931462 -122.173455615 -9.750435441 -122.388806051 -10.100958947 -122.114312120 - -10.053358366 -121.951990340 + -10.053358365 -121.951990346 } 839004fffffffff { -11.327386317 -121.815375158 -10.884895879 -121.828930097 - -10.829526623 -121.989092127 + -10.829526627 -121.989092123 -10.594762660 -122.261520982 -10.743280241 -122.685891065 -11.249252103 -122.701307843 @@ -220197,7 +223809,7 @@ -10.387346934 -123.097778627 -10.743280241 -122.685891065 -10.594762660 -122.261520982 - -10.428060717 -122.257211368 + -10.428060722 -122.257211370 -10.100958947 -122.114312120 -9.750435441 -122.388806051 } @@ -220207,10 +223819,75 @@ -11.218223438 -120.858287494 -10.693030291 -120.982234402 -10.569789130 -121.414850407 - -10.702418814 -121.517695877 + -10.702418811 -121.517695872 -10.884895879 -121.828930097 -11.327386317 -121.815375158 } +839008fffffffff +{ + -8.813105215 -123.730634216 + -9.317717794 -123.949110497 + -9.678465649 -123.662787906 + -9.536942120 -123.162249164 + -9.036886105 -122.945306493 + -8.673819496 -123.227355124 +} +839009fffffffff +{ + -8.583516688 -124.529492008 + -9.092686032 -124.749437711 + -9.458606316 -124.457118719 + -9.317717794 -123.949110497 + -8.813105215 -123.730634216 + -8.444846250 -124.018681507 +} +83900afffffffff +{ + -8.168617845 -123.009368606 + -8.673819496 -123.227355124 + -9.036886105 -122.945306493 + -8.897018712 -122.449564811 + -8.646955859 -122.341390867 + -8.458128450 -122.215811604 + -8.031132744 -122.510921820 +} +83900bfffffffff +{ + -7.935015078 -123.799153707 + -8.444846250 -124.018681507 + -8.813105215 -123.730634216 + -8.673819496 -123.227355124 + -8.168617845 -123.009368606 + -7.798095541 -123.293105775 +} +83900cfffffffff +{ + -9.678465649 -123.662787906 + -10.177735477 -123.880222063 + -10.354882905 -123.737596359 + -10.534662013 -123.530098396 + -10.387346934 -123.097778627 + -9.892555746 -122.881870400 + -9.536942120 -123.162249164 +} +83900dfffffffff +{ + -9.458606316 -124.457118719 + -9.962356268 -124.676015900 + -10.320716459 -124.385456749 + -10.177735477 -123.880222063 + -9.678465649 -123.662787906 + -9.317717794 -123.949110497 +} +83900efffffffff +{ + -9.036886105 -122.945306493 + -9.536942120 -123.162249164 + -9.892555746 -122.881870400 + -9.750435441 -122.388806051 + -9.254931462 -122.173455615 + -8.897018712 -122.449564811 +} 839010fffffffff { -10.004719810 -119.912095768 @@ -220536,6 +224213,457 @@ -12.861637810 -121.275859364 -13.326833598 -121.257760628 } +839040fffffffff +{ + -8.520122490 -127.768970441 + -9.041716156 -127.992975636 + -9.420843322 -127.678269724 + -9.280866086 -127.143693698 + -8.763711952 -126.920842019 + -8.382113712 -127.231392025 +} +839041fffffffff +{ + -8.270488590 -128.630472687 + -8.796498559 -128.855538883 + -9.180857210 -128.534744051 + -9.041716156 -127.992975636 + -8.520122490 -127.768970441 + -8.133270852 -128.085650274 +} +839042fffffffff +{ + -7.859320571 -127.007481442 + -8.382113712 -127.231392025 + -8.763711952 -126.920842019 + -8.624937435 -126.390582131 + -8.106672741 -126.167913293 + -7.722673798 -126.474242906 +} +839043fffffffff +{ + -7.605969354 -127.860586028 + -8.133270852 -128.085650274 + -8.520122490 -127.768970441 + -8.382113712 -127.231392025 + -7.859320571 -127.007481442 + -7.470046657 -127.319974357 +} +839044fffffffff +{ + -9.420843322 -127.678269724 + -9.936593482 -127.901224611 + -10.122827548 -127.744515397 + -10.312135027 -127.528842195 + -10.166154495 -127.056866613 + -9.654769440 -126.835064914 + -9.280866086 -127.143693698 +} +839045fffffffff +{ + -9.180857210 -128.534744051 + -9.700951699 -128.758761413 + -10.077544166 -128.439969823 + -9.936593482 -127.901224611 + -9.420843322 -127.678269724 + -9.041716156 -127.992975636 +} +839046fffffffff +{ + -8.763711952 -126.920842019 + -9.280866086 -127.143693698 + -9.654769440 -126.835064914 + -9.513987317 -126.307753238 + -9.001290419 -126.086141426 + -8.624937435 -126.390582131 +} +839048fffffffff +{ + -7.081210105 -129.607148530 + -7.617444396 -129.834230663 + -8.014789733 -129.505268858 + -7.878384620 -128.953293224 + -7.346600689 -128.727169678 + -6.946788340 -129.052038726 +} +839049fffffffff +{ + -6.809808129 -130.500410843 + -7.350454257 -130.728344462 + -7.753019410 -130.393251787 + -7.617444396 -129.834230663 + -7.081210105 -129.607148530 + -6.676154715 -129.938209963 +} +83904afffffffff +{ + -6.409389247 -128.824849232 + -6.946788340 -129.052038726 + -7.346600689 -128.727169678 + -7.211421017 -128.179262051 + -6.678564116 -127.953129923 + -6.276363063 -128.273824744 +} +83904bfffffffff +{ + -6.134248765 -129.710065820 + -6.676154715 -129.938209963 + -7.081210105 -129.607148530 + -6.946788340 -129.052038726 + -6.409389247 -128.824849232 + -6.001922360 -129.151789944 +} +83904cfffffffff +{ + -8.014789733 -129.505268858 + -8.545186952 -129.731297299 + -8.934775516 -129.404411826 + -8.796498559 -128.855538883 + -8.270488590 -128.630472687 + -7.878384620 -128.953293224 +} +83904dfffffffff +{ + -7.753019410 -130.393251787 + -8.287768706 -130.620137438 + -8.682575679 -130.287170312 + -8.545186952 -129.731297299 + -8.014789733 -129.505268858 + -7.617444396 -129.834230663 +} +83904efffffffff +{ + -7.346600689 -128.727169678 + -7.878384620 -128.953293224 + -8.270488590 -128.630472687 + -8.133270852 -128.085650274 + -7.605969354 -127.860586028 + -7.211421017 -128.179262051 +} +839050fffffffff +{ + -7.450243096 -125.419701232 + -7.969324515 -125.642109231 + -8.348057108 -125.341913904 + -8.210033353 -124.823590603 + -7.695573965 -124.602587024 + -7.314538158 -124.898485300 +} +839051fffffffff +{ + -7.198981723 -126.250507872 + -7.722673798 -126.474242906 + -8.106672741 -126.167913293 + -7.969324515 -125.642109231 + -7.450243096 -125.419701232 + -7.063920348 -125.721751716 +} +839052fffffffff +{ + -6.794933174 -124.676414377 + -7.314538158 -124.898485300 + -7.695573965 -124.602587024 + -7.559248668 -124.088945078 + -7.044337658 -123.868356248 + -6.661081127 -124.159911390 +} +839053fffffffff +{ + -6.539629572 -125.498271520 + -7.063920348 -125.721751716 + -7.450243096 -125.419701232 + -7.314538158 -124.898485300 + -6.794933174 -124.676414377 + -6.406369780 -124.974132728 +} +839054fffffffff +{ + -8.348057108 -125.341913904 + -8.861778796 -125.563259096 + -9.232903181 -125.264898173 + -9.092686032 -124.749437711 + -8.583516688 -124.529492008 + -8.210033353 -124.823590603 +} +839055fffffffff +{ + -8.106672741 -126.167913293 + -8.624937435 -126.390582131 + -9.001290419 -126.086141426 + -8.861778796 -125.563259096 + -8.348057108 -125.341913904 + -7.969324515 -125.642109231 +} +839056fffffffff +{ + -7.695573965 -124.602587024 + -8.210033353 -124.823590603 + -8.583516688 -124.529492008 + -8.444846250 -124.018681507 + -7.935015078 -123.799153707 + -7.559248668 -124.088945078 +} +839058fffffffff +{ + -6.011230362 -127.183398145 + -6.544845965 -127.409453698 + -6.941760812 -127.094995848 + -6.807362920 -126.558747797 + -6.278400005 -126.333937294 + -5.879203080 -126.644109271 +} +839059fffffffff +{ + -5.738120354 -128.046615815 + -6.276363063 -128.273824744 + -6.678564116 -127.953129923 + -6.544845965 -127.409453698 + -6.011230362 -127.183398145 + -5.606725639 -127.499843298 +} +83905afffffffff +{ + -5.345142342 -126.418213922 + -5.879203080 -126.644109271 + -6.278400005 -126.333937294 + -6.145749686 -125.802198241 + -5.616415899 -125.577636349 + -5.215027608 -125.883460722 +} +83905bfffffffff +{ + -5.067960209 -127.272701488 + -5.606725639 -127.499843298 + -6.011230362 -127.183398145 + -5.879203080 -126.644109271 + -5.345142342 -126.418213922 + -4.938425417 -126.730340034 +} +83905cfffffffff +{ + -6.941760812 -127.094995848 + -7.470046657 -127.319974357 + -7.859320571 -127.007481442 + -7.722673798 -126.474242906 + -7.198981723 -126.250507872 + -6.807362920 -126.558747797 +} +83905dfffffffff +{ + -6.678564116 -127.953129923 + -7.211421017 -128.179262051 + -7.605969354 -127.860586028 + -7.470046657 -127.319974357 + -6.941760812 -127.094995848 + -6.544845965 -127.409453698 +} +83905efffffffff +{ + -6.278400005 -126.333937294 + -6.807362920 -126.558747797 + -7.198981723 -126.250507872 + -7.063920348 -125.721751716 + -6.539629572 -125.498271520 + -6.145749686 -125.802198241 +} +839060fffffffff +{ + -11.748697940 -127.180254466 + -11.217129685 -127.138660205 + -10.838837482 -127.572409010 + -10.988892353 -128.052719867 + -11.522949248 -128.099775127 + -11.904488317 -127.661035646 +} +839061fffffffff +{ + -11.522949248 -128.099775127 + -10.988892353 -128.052719867 + -10.606554964 -128.488951434 + -10.754930970 -128.977132653 + -11.291323183 -129.029745848 + -11.677031559 -128.588598863 +} +839062fffffffff +{ + -11.065460535 -126.666315866 + -10.541213200 -126.628065791 + -10.166154495 -127.056866613 + -10.312135027 -127.528842195 + -10.838837482 -127.572409010 + -11.217129685 -127.138660205 +} +839063fffffffff +{ + -10.838837482 -127.572409010 + -10.312135027 -127.528842195 + -10.122827548 -127.744515397 + -9.936593482 -127.901224611 + -10.077544166 -128.439969823 + -10.606554964 -128.488951434 + -10.988892353 -128.052719867 +} +839064fffffffff +{ + -12.662171327 -126.783692458 + -12.125986361 -126.744121764 + -11.748697940 -127.180254466 + -11.904488317 -127.661035646 + -12.443342883 -127.706112511 + -12.823761569 -127.264877803 +} +839065fffffffff +{ + -12.443342883 -127.706112511 + -11.904488317 -127.661035646 + -11.522949248 -128.099775127 + -11.677031559 -128.588598863 + -12.218403281 -128.639283941 + -12.603201515 -128.195514698 +} +839066fffffffff +{ + -11.968561312 -126.271474256 + -11.439627582 -126.235238035 + -11.065460535 -126.666315866 + -11.217129685 -127.138660205 + -11.748697940 -127.180254466 + -12.125986361 -126.744121764 +} +839068fffffffff +{ + -9.598283343 -130.182150962 + -9.946932452 -130.332072605 + -10.125132153 -130.352175311 + -10.515275892 -129.911586172 + -10.368639331 -129.415647888 + -10.014055940 -129.379253756 + -9.840989895 -129.304562730 + -9.459188057 -129.629394821 +} +839069fffffffff +{ + -9.349400024 -131.072608709 + -9.876090878 -131.298182756 + -10.269973168 -130.855739858 + -10.125132153 -130.352175311 + -9.946932452 -130.332072605 + -9.598283343 -130.182150962 + -9.211274205 -130.513015926 +} +83906afffffffff +{ + -8.934775516 -129.404411826 + -9.459188057 -129.629394821 + -9.840989895 -129.304562730 + -9.700951699 -128.758761413 + -9.180857210 -128.534744051 + -8.796498559 -128.855538883 +} +83906bfffffffff +{ + -8.682575679 -130.287170312 + -9.211274205 -130.513015926 + -9.598283343 -130.182150962 + -9.459188057 -129.629394821 + -8.934775516 -129.404411826 + -8.545186952 -129.731297299 +} +83906cfffffffff +{ + -11.291323183 -129.029745848 + -10.754930970 -128.977132653 + -10.368639331 -129.415647888 + -10.515275892 -129.911586172 + -11.053842883 -129.969847596 + -11.443627767 -129.526503500 +} +83906dfffffffff +{ + -11.053842883 -129.969847596 + -10.515275892 -129.911586172 + -10.125132153 -130.352175311 + -10.269973168 -130.855739858 + -10.810547440 -130.919732544 + -11.204304324 -130.474412590 +} +83906efffffffff +{ + -10.606554964 -128.488951434 + -10.077544166 -128.439969823 + -9.700951699 -128.758761413 + -9.840989895 -129.304562730 + -10.014055940 -129.379253756 + -10.368639331 -129.415647888 + -10.754930970 -128.977132653 +} +839070fffffffff +{ + -9.882683093 -126.005180368 + -10.220949989 -126.152252929 + -10.393704061 -126.163975942 + -10.764759682 -125.737902790 + -10.615784991 -125.281767282 + -10.272437025 -125.261752167 + -10.104642687 -125.188642890 + -9.741130373 -125.485189839 +} +839071fffffffff +{ + -9.654769440 -126.835064914 + -10.166154495 -127.056866613 + -10.541213200 -126.628065791 + -10.393704061 -126.163975942 + -10.220949989 -126.152252929 + -9.882683093 -126.005180368 + -9.513987317 -126.307753238 +} +839072fffffffff +{ + -9.232903181 -125.264898173 + -9.741130373 -125.485189839 + -10.104642687 -125.188642890 + -9.962356268 -124.676015900 + -9.458606316 -124.457118719 + -9.092686032 -124.749437711 +} +839073fffffffff +{ + -9.001290419 -126.086141426 + -9.513987317 -126.307753238 + -9.882683093 -126.005180368 + -9.741130373 -125.485189839 + -9.232903181 -125.264898173 + -8.861778796 -125.563259096 +} +839074fffffffff +{ + -11.501694573 -124.886520853 + -10.982769056 -124.858588747 + -10.615784991 -125.281767282 + -10.764759682 -125.737902790 + -11.286412272 -125.770939665 + -11.656384864 -125.342710006 +} +839075fffffffff +{ + -11.286412272 -125.770939665 + -10.764759682 -125.737902790 + -10.393704061 -126.163975942 + -10.541213200 -126.628065791 + -11.065460535 -126.666315866 + -11.439627582 -126.235238035 +} +839076fffffffff +{ + -10.832394787 -124.410460801 + -10.320716459 -124.385456749 + -9.962356268 -124.676015900 + -10.104642687 -125.188642890 + -10.272437025 -125.261752167 + -10.615784991 -125.281767282 + -10.982769056 -124.858588747 +} 839080fffffffff { -7.812021514 -116.564135825 @@ -220731,11 +224859,11 @@ { -6.594164728 -115.061351379 -6.146435744 -114.718569473 - -5.781590703 -114.820477830 + -5.781590712 -114.820477825 -5.629800463 -114.916382021 -5.593544128 -115.501237764 -6.010887389 -115.794636112 - -6.311543100 -115.602164281 + -6.311543091 -115.602164287 -6.493005155 -115.552495563 } 839099fffffffff @@ -220751,7 +224879,7 @@ { -5.207654634 -114.617724079 -5.629800463 -114.916382021 - -5.781590717 -114.820477823 + -5.781590712 -114.820477825 -6.146435744 -114.718569473 -6.245782843 -114.219210681 -5.792952149 -113.872299663 @@ -220779,7 +224907,7 @@ { -6.935558056 -115.891087192 -6.493005155 -115.552495563 - -6.311543087 -115.602164290 + -6.311543091 -115.602164287 -6.010887389 -115.794636112 -5.973569972 -116.375445201 -6.386016407 -116.663542521 @@ -220861,11 +224989,11 @@ { -8.875271650 -118.494682906 -8.452341834 -118.168932308 - -8.095573335 -118.259946825 + -8.095573344 -118.259946819 -7.951238194 -118.356518335 -7.909507510 -118.919902130 -8.298800806 -119.190078404 - -8.584612284 -118.996705665 + -8.584612276 -118.996705671 -8.761860358 -118.952429720 } 8390a9fffffffff @@ -220881,7 +225009,7 @@ { -7.556866975 -118.081051041 -7.951238194 -118.356518335 - -8.095573349 -118.259946817 + -8.095573344 -118.259946819 -8.452341834 -118.168932308 -8.564102944 -117.702937269 -8.135736974 -117.372831591 @@ -220909,7 +225037,7 @@ { -9.179337984 -119.273800270 -8.761860358 -118.952429720 - -8.584612272 -118.996705674 + -8.584612276 -118.996705671 -8.298800806 -119.190078404 -8.255697967 -119.748719531 -8.639877093 -120.013599220 @@ -221056,11 +225184,11 @@ -3.290333127 -123.616910225 -2.862625794 -123.360826753 -2.393616161 -123.671869318 - -2.369101374 -124.050063748 + -2.369101375 -124.050063737 -2.409184350 -124.224973712 -2.946880748 -124.451014577 -3.359626265 -124.152201063 - -3.277455743 -123.804832648 + -3.277455742 -123.804832659 } 8390c9fffffffff { @@ -221088,7 +225216,7 @@ -1.447642860 -124.298492780 -1.989264655 -124.525654297 -2.409184350 -124.224973712 - -2.369101375 -124.050063731 + -2.369101375 -124.050063737 } 8390ccfffffffff { @@ -221098,7 +225226,7 @@ -4.172487877 -123.562747003 -3.752964090 -123.308264561 -3.290333127 -123.616910225 - -3.277455743 -123.804832664 + -3.277455742 -123.804832659 } 8390cdfffffffff { @@ -221249,11 +225377,11 @@ -7.212895866 -122.556080474 -6.820409749 -122.302337909 -6.379919038 -122.601885116 - -6.350664421 -122.970957305 + -6.350664422 -122.970957294 -6.394835278 -123.139407664 -6.909913865 -123.359510565 -7.287881544 -123.074065888 - -7.197844110 -122.739479612 + -7.197844109 -122.739479623 } 8390e1fffffffff { @@ -221281,7 +225409,7 @@ -5.489665649 -123.205403442 -6.009446303 -123.426579124 -6.394835278 -123.139407664 - -6.350664422 -122.970957289 + -6.350664422 -122.970957294 } 8390e4fffffffff { @@ -221291,7 +225419,7 @@ -8.031132744 -122.510921820 -7.646645689 -122.258768098 -7.212895866 -122.556080474 - -7.197844110 -122.739479628 + -7.197844109 -122.739479623 } 8390e5fffffffff { @@ -221634,11 +225762,11 @@ -14.479046949 -123.221938321 -14.191123934 -122.726726079 -13.718850660 -122.734119748 - -13.596276902 -123.064796835 + -13.596276906 -123.064796825 -13.476801499 -123.206793156 -13.644469332 -123.654424108 -14.175635426 -123.675967644 - -14.415992530 -123.388452767 + -14.415992526 -123.388452777 } 839119fffffffff { @@ -221666,13 +225794,13 @@ -12.789486973 -122.748583768 -12.952659823 -123.188117533 -13.476801499 -123.206793156 - -13.596276908 -123.064796820 + -13.596276906 -123.064796825 } 83911cfffffffff { -14.958646522 -123.218140931 -14.479046949 -123.221938321 - -14.415992523 -123.388452781 + -14.415992526 -123.388452777 -14.175635426 -123.675967644 -14.347772427 -124.131898738 -14.885921760 -124.156440363 @@ -221827,11 +225955,11 @@ -18.332634692 -124.770716679 -18.033614185 -124.243713069 -17.524337216 -124.239674594 - -17.384891870 -124.583480084 + -17.384891874 -124.583480074 -17.263059874 -124.733541606 -17.454290241 -125.215667480 -18.016055941 -125.247734315 - -18.260925648 -124.943798513 + -18.260925644 -124.943798524 } 839131fffffffff { @@ -221859,13 +225987,13 @@ -16.521023572 -124.231783861 -16.707921852 -124.704880015 -17.263059874 -124.733541606 - -17.384891876 -124.583480068 + -17.384891874 -124.583480074 } 839134fffffffff { -18.848915518 -124.779019725 -18.332634692 -124.770716679 - -18.260925640 -124.943798528 + -18.260925644 -124.943798524 -18.016055941 -125.247734315 -18.211525313 -125.739115899 -18.779800976 -125.774744067 @@ -222019,11 +226147,11 @@ 839150fffffffff { -9.882683093 -126.005180368 - -10.220949999 -126.152252933 + -10.220949989 -126.152252929 -10.393704061 -126.163975942 -10.764759682 -125.737902790 -10.615784991 -125.281767282 - -10.272437015 -125.261752162 + -10.272437025 -125.261752167 -10.104642687 -125.188642890 -9.741130373 -125.485189839 } @@ -222042,7 +226170,7 @@ -10.320716459 -124.385456749 -9.962356268 -124.676015900 -10.104642687 -125.188642890 - -10.272437030 -125.261752167 + -10.272437025 -125.261752167 -10.615784991 -125.281767282 -10.982769056 -124.858588747 } @@ -222070,7 +226198,7 @@ -10.166154495 -127.056866613 -10.541213200 -126.628065791 -10.393704061 -126.163975942 - -10.220949984 -126.152252926 + -10.220949989 -126.152252929 -9.882683093 -126.005180368 -9.513987317 -126.307753238 } @@ -222149,11 +226277,11 @@ 839160fffffffff { -9.598283343 -130.182150962 - -9.946932463 -130.332072609 + -9.946932452 -130.332072605 -10.125132153 -130.352175311 -10.515275892 -129.911586172 -10.368639331 -129.415647888 - -10.014055930 -129.379253752 + -10.014055940 -129.379253756 -9.840989895 -129.304562730 -9.459188057 -129.629394821 } @@ -222172,7 +226300,7 @@ -10.077544166 -128.439969823 -9.700951699 -128.758761413 -9.840989895 -129.304562730 - -10.014055945 -129.379253757 + -10.014055940 -129.379253756 -10.368639331 -129.415647888 -10.754930970 -128.977132653 } @@ -222200,7 +226328,7 @@ -9.876090878 -131.298182756 -10.269973168 -130.855739858 -10.125132153 -130.352175311 - -9.946932447 -130.332072603 + -9.946932452 -130.332072605 -9.598283343 -130.182150962 -9.211274205 -130.513015926 } @@ -222407,11 +226535,11 @@ 839188fffffffff { -12.269278489 -118.931443086 - -12.539900470 -119.148740076 + -12.539900462 -119.148740070 -12.636424133 -119.307527513 -13.101670390 -119.274839267 -13.277283932 -118.759513478 - -13.080976710 -118.439872300 + -13.080976718 -118.439872306 -12.945173873 -118.329642236 -12.402009219 -118.467435607 } @@ -222421,7 +226549,7 @@ -12.005816970 -119.843174587 -12.463483050 -119.814770024 -12.636424133 -119.307527513 - -12.539900458 -119.148740067 + -12.539900462 -119.148740070 -12.269278489 -118.931443086 -11.730576247 -119.065793342 } @@ -222467,18 +226595,18 @@ -13.628822134 -117.716340469 -13.081377489 -117.857653213 -12.945173873 -118.329642236 - -13.080976721 -118.439872311 + -13.080976718 -118.439872306 -13.277283932 -118.759513478 -13.750129742 -118.722355563 } 839190fffffffff { -14.749623067 -115.609505437 - -15.026315962 -115.841926630 + -15.026315953 -115.841926623 -15.130403735 -116.004133502 -15.625387458 -115.944426327 -15.807478633 -115.391439716 - -15.595659825 -115.065397440 + -15.595659833 -115.065397447 -15.456884297 -114.947570883 -14.893631992 -115.104184415 } @@ -222488,7 +226616,7 @@ -14.462720905 -116.603065313 -14.950240820 -116.548590131 -15.130403735 -116.004133502 - -15.026315949 -115.841926620 + -15.026315953 -115.841926623 -14.749623067 -115.609505437 -14.190011578 -115.762307144 } @@ -222534,7 +226662,7 @@ -16.170389214 -114.273300235 -15.603749528 -114.433798652 -15.456884297 -114.947570883 - -15.595659837 -115.065397452 + -15.595659833 -115.065397447 -15.807478633 -115.391439716 -16.309876863 -115.326286171 } @@ -224309,11 +228437,11 @@ 8392d8fffffffff { -20.019088793 -108.019462244 - -20.306751944 -108.281797384 + -20.306751936 -108.281797376 -20.428303324 -108.446337779 -20.975064924 -108.318635018 -21.154869647 -107.690393947 - -20.907483179 -107.361186452 + -20.907483188 -107.361186460 -20.763333381 -107.228513012 -20.173904185 -107.427485571 } @@ -224323,7 +228451,7 @@ -21.508843226 -106.424406439 -20.918763636 -106.627818616 -20.763333381 -107.228513012 - -20.907483191 -107.361186465 + -20.907483188 -107.361186460 -21.154869647 -107.690393947 -21.707514436 -107.555083414 } @@ -224369,7 +228497,7 @@ -19.707303596 -109.186191179 -20.247944637 -109.065847032 -20.428303324 -108.446337779 - -20.306751932 -108.281797372 + -20.306751936 -108.281797376 -20.019088793 -108.019462244 -19.430693974 -108.214037332 } @@ -225829,11 +229957,11 @@ { -3.100017694 -111.881718400 -3.543796386 -112.198319778 - -3.859561057 -112.008705343 + -3.859561046 -112.008705346 -4.044256663 -111.953470553 -4.132809339 -111.429673917 -3.663052686 -111.071179425 - -3.292191443 -111.184271727 + -3.292191454 -111.184271724 -3.132856673 -111.278500273 } 8393b1fffffffff @@ -225849,7 +229977,7 @@ { -4.509422181 -112.308123959 -4.044256663 -111.953470553 - -3.859561041 -112.008705349 + -3.859561046 -112.008705346 -3.543796386 -112.198319778 -3.510391469 -112.798437776 -3.949793261 -113.109889907 @@ -225877,7 +230005,7 @@ { -2.684862979 -110.956833618 -3.132856673 -111.278500273 - -3.292191459 -111.184271722 + -3.292191454 -111.184271724 -3.663052686 -111.071179425 -3.749796903 -110.539453402 -3.275592350 -110.177220455 @@ -227410,11 +231538,11 @@ 8394d8fffffffff { -19.623650919 129.969312645 - -19.995758750 130.043934037 + -19.995758739 130.043934035 -20.192142696 130.042380809 -20.439591562 130.577663294 -20.092832853 131.116792824 - -19.698350390 131.115005022 + -19.698350401 131.115005024 -19.511461337 131.077820996 -19.287612302 130.466882045 } @@ -227424,7 +231552,7 @@ -19.391715108 132.192113830 -19.170809247 131.578603991 -19.511461337 131.077820996 - -19.698350407 131.115005024 + -19.698350401 131.115005024 -20.092832853 131.116792824 -20.337971491 131.661407039 } @@ -227470,7 +231598,7 @@ -20.283840591 128.979592049 -20.533415227 129.505338861 -20.192142696 130.042380809 - -19.995758733 130.043934033 + -19.995758739 130.043934035 -19.623650919 129.969312645 -19.396937281 129.361381884 } @@ -228930,11 +233058,11 @@ { -11.456440610 114.079937209 -11.988878223 114.197937069 - -12.061084577 114.567002688 + -12.061084572 114.567002677 -12.144311158 114.744799849 -11.816402163 115.170345074 -11.235991105 115.059866954 - -11.070473503 114.702569441 + -11.070473508 114.702569452 -11.032980204 114.517946872 } 8395b1fffffffff @@ -228950,7 +233078,7 @@ { -12.718681181 114.854884182 -12.144311158 114.744799849 - -12.061084571 114.567002672 + -12.061084572 114.567002677 -11.988878223 114.197937069 -12.409395636 113.760196785 -12.935007249 113.878835907 @@ -228978,7 +233106,7 @@ { -10.493897293 114.400597801 -11.032980204 114.517946872 - -11.070473511 114.702569457 + -11.070473508 114.702569452 -11.235991105 115.059866954 -10.900804244 115.488222743 -10.314532736 115.377354815 @@ -234609,11 +238737,11 @@ -8.068468145 0.209653543 -8.579299202 0.067222242 -8.982696307 0.503457818 - -8.907583723 0.888454567 + -8.907583725 0.888454555 -8.829817303 1.058388269 -8.233681017 1.151596979 -7.875342131 0.737102512 - -8.032177828 0.400830585 + -8.032177826 0.400830597 } 839969fffffffff { @@ -234641,7 +238769,7 @@ -9.792952304 1.384373966 -9.193744927 1.477638441 -8.829817303 1.058388269 - -8.907583726 0.888454550 + -8.907583725 0.888454555 } 83996cfffffffff { @@ -234651,7 +238779,7 @@ -7.167156589 -0.078635436 -7.669668104 -0.221509641 -8.068468145 0.209653543 - -8.032177823 0.400830602 + -8.032177826 0.400830597 } 83996dfffffffff { @@ -235118,11 +239246,11 @@ { -9.398349025 -17.239047234 -9.947478801 -17.515901438 - -10.291558513 -17.319905480 + -10.291558504 -17.319905487 -10.437879071 -17.196462990 -10.351637846 -16.574090326 -9.828099354 -16.327504987 - -9.539148537 -16.575788623 + -9.539148546 -16.575788616 -9.367572286 -16.672657154 } 8399b1fffffffff @@ -235138,7 +239266,7 @@ { -10.964831451 -17.449131543 -10.437879071 -17.196462990 - -10.291558499 -17.319905490 + -10.291558504 -17.319905487 -9.947478801 -17.515901438 -9.979629113 -18.090470906 -10.531963711 -18.371985725 @@ -235166,7 +239294,7 @@ { -8.821928194 -16.400474983 -9.367572286 -16.672657154 - -9.539148550 -16.575788612 + -9.539148546 -16.575788616 -9.828099354 -16.327504987 -9.740388664 -15.708532985 -9.220562175 -15.468025630 @@ -236700,11 +240828,11 @@ 839ad8fffffffff { -4.905026054 -172.835548726 - -4.561076021 -172.656109265 + -4.561076031 -172.656109270 -4.381399619 -172.611757886 -3.936657265 -173.020363200 -4.032701909 -173.557959678 - -4.390687687 -173.643966149 + -4.390687677 -173.643966144 -4.561169092 -173.734157573 -4.990159559 -173.421983173 } @@ -236714,7 +240842,7 @@ -4.221154434 -174.619026651 -4.645704097 -174.314225762 -4.561169092 -173.734157573 - -4.390687672 -173.643966143 + -4.390687677 -173.643966144 -4.032701909 -173.557959678 -3.589806516 -173.963503228 } @@ -236760,7 +240888,7 @@ -4.732154389 -171.655801152 -4.285790508 -172.067283400 -4.381399619 -172.611757886 - -4.561076036 -172.656109273 + -4.561076031 -172.656109270 -4.905026054 -172.835548726 -5.338333046 -172.515962974 } @@ -237716,11 +241844,11 @@ -19.548830316 177.320862000 -19.011849411 177.645375432 -18.499185386 177.365551579 - -18.514817412 176.966568085 + -18.514817412 176.966568097 -18.484595601 176.761944130 -18.943901735 176.424317802 -19.496753354 176.705276615 - -19.555291624 177.119200150 + -19.555291625 177.119200138 } 839b69fffffffff { @@ -237748,13 +241876,13 @@ -17.484597774 176.817276265 -17.936619288 176.484052805 -18.484595601 176.761944130 - -18.514817412 176.966568103 + -18.514817412 176.966568097 } 839b6cfffffffff { -20.067273422 177.603149961 -19.548830316 177.320862000 - -19.555291624 177.119200132 + -19.555291625 177.119200138 -19.496753354 176.705276615 -19.963185859 176.363131305 -20.520648155 176.647224902 @@ -238285,11 +242413,11 @@ 839c00fffffffff { -15.263550656 145.923797833 - -14.870468674 145.854882078 + -14.870468685 145.854882080 -14.673652702 145.821974541 -14.480094604 145.212075744 -14.877932363 144.700486632 - -15.271357892 144.767269233 + -15.271357881 144.767269231 -15.468323979 144.799291551 -15.662984242 145.411654982 } @@ -238299,7 +242427,7 @@ -15.666830213 143.675941388 -15.864836683 144.283815184 -15.468323979 144.799291551 - -15.271357875 144.767269230 + -15.271357881 144.767269231 -14.877932363 144.700486632 -14.681711384 144.087447095 } @@ -238345,7 +242473,7 @@ -14.464634947 146.938019615 -14.273691383 146.331703260 -14.673652702 145.821974541 - -14.870468691 145.854882081 + -14.870468685 145.854882080 -15.263550656 145.923797833 -15.454820546 146.540184672 } @@ -239051,11 +243179,11 @@ 839c68fffffffff { -18.646079329 136.023378873 - -18.248008791 135.999011251 + -18.248008803 135.999011252 -18.056713149 135.962712295 -17.843769419 135.343062150 -18.204372367 134.833438528 - -18.585697099 134.906548112 + -18.585697087 134.906548111 -18.784281900 134.916177522 -19.015387389 135.485224586 } @@ -239065,7 +243193,7 @@ -18.914756858 133.817525423 -19.148630619 134.378335380 -18.784281900 134.916177522 - -18.585697081 134.906548110 + -18.585697087 134.906548111 -18.204372367 134.833438528 -17.988431302 134.214813968 } @@ -239111,18 +243239,18 @@ -17.901934988 137.094133641 -17.692020741 136.473937922 -18.056713149 135.962712295 - -18.248008809 135.999011252 + -18.248008803 135.999011252 -18.646079329 136.023378873 -18.874265634 136.600344390 } 839c70fffffffff { -17.026493682 140.983572345 - -16.628874607 140.936493646 + -16.628874619 140.936493647 -16.434200882 140.901639454 -16.231647366 140.282299617 -16.613364149 139.767886592 - -17.001939306 139.838352001 + -17.001939294 139.838352000 -17.200738111 139.859340147 -17.413825164 140.454514762 } @@ -239132,7 +243260,7 @@ -17.367709974 138.740066794 -17.583987285 139.328733208 -17.200738111 139.859340147 - -17.001939288 139.838351999 + -17.001939294 139.838352000 -16.613364149 139.767886592 -16.407889839 139.147461665 } @@ -239178,7 +243306,7 @@ -16.248891797 142.033685725 -16.049245932 141.415912856 -16.434200882 140.901639454 - -16.628874625 140.936493648 + -16.628874619 140.936493647 -17.026493682 140.983572345 -17.236289494 141.584844337 } @@ -241013,11 +245141,11 @@ 839d88fffffffff { -13.397160788 150.772224220 - -13.012402168 150.683259802 + -13.012402180 150.683259804 -12.814826470 150.652700668 -12.628249656 150.060693534 -13.036089639 149.559228893 - -13.431640174 149.621473653 + -13.431640163 149.621473651 -13.624839771 149.663734300 -13.801931753 150.283833551 } @@ -241027,7 +245155,7 @@ -13.847681302 148.552719016 -14.028014553 149.170454360 -13.624839771 149.663734300 - -13.431640157 149.621473650 + -13.431640163 149.621473651 -13.036089639 149.559228893 -12.847225128 148.962254622 } @@ -241073,18 +245201,18 @@ -12.590481609 151.737423697 -12.406124793 151.150750868 -12.814826470 150.652700668 - -13.012402185 150.683259806 + -13.012402180 150.683259804 -13.397160788 150.772224220 -13.571019769 151.394208786 } 839d90fffffffff { -11.473294271 155.464778410 - -11.100053307 155.358255387 + -11.100053318 155.358255390 -10.903159514 155.330319962 -10.721305547 154.763317671 -11.132530218 154.278374172 - -11.527321698 154.335470597 + -11.527321687 154.335470594 -11.715088311 154.386796478 -11.876504195 155.005490473 } @@ -241094,7 +245222,7 @@ -11.953698076 153.303021832 -12.118042437 153.921400040 -11.715088311 154.386796478 - -11.527321681 154.335470593 + -11.527321687 154.335470594 -11.132530218 154.278374172 -10.948800282 153.704937569 } @@ -241140,7 +245268,7 @@ -10.672390551 156.370868897 -10.492342030 155.810573015 -10.903159514 155.330319962 - -11.100053324 155.358255392 + -11.100053318 155.358255390 -11.473294271 155.464778410 -11.631828986 156.083337250 } @@ -242915,11 +247043,11 @@ 839ed8fffffffff { -9.538672038 159.949598784 - -9.179368357 159.828428551 + -9.179368368 159.828428555 -8.984558037 159.803259006 -8.805303797 159.266629449 -9.213482331 158.803290448 - -9.604669512 158.854894834 + -9.604669502 158.854894831 -9.785708352 158.913870166 -9.933983010 159.523026006 } @@ -242929,7 +247057,7 @@ -10.031218079 157.869695528 -10.181982511 158.480355625 -9.785708352 158.913870166 - -9.604669496 158.854894830 + -9.604669502 158.854894831 -9.213482331 158.803290448 -9.032727052 158.259184504 } @@ -242975,7 +247103,7 @@ -8.755747177 160.789950707 -8.577933279 160.260969409 -8.984558037 159.803259006 - -9.179368373 159.828428557 + -9.179368368 159.828428555 -9.538672038 159.949598784 -9.684525844 160.556856939 } @@ -244435,11 +248563,11 @@ { -14.422395521 176.959937318 -13.940425673 176.697895638 - -13.966817859 176.319560505 + -13.966817861 176.319560516 -13.932404042 176.124154398 -14.357823460 175.798318344 -14.889856054 176.062891094 - -14.957265759 176.457971985 + -14.957265757 176.457971973 -14.945330300 176.649094015 } 839fb1fffffffff @@ -244459,7 +248587,7 @@ -12.988678178 176.184043236 -13.406366132 175.862291942 -13.932404042 176.124154398 - -13.966817861 176.319560522 + -13.966817861 176.319560516 } 839fb3fffffffff { @@ -244483,7 +248611,7 @@ { -15.434102499 176.913280658 -14.945330300 176.649094015 - -14.957265756 176.457971967 + -14.957265757 176.457971973 -14.889856054 176.062891094 -15.322935498 175.732867180 -15.860786228 176.000205601 @@ -246016,11 +250144,11 @@ 83a0d8fffffffff { -9.642223669 -138.478564607 - -9.270631408 -138.404675369 + -9.270631419 -138.404675371 -9.088810077 -138.329484418 -8.671998262 -138.707494997 -8.802380891 -139.313719238 - -9.167971618 -139.463758719 + -9.167971607 -139.463758717 -9.354162482 -139.502835815 -9.778962710 -139.047368217 } @@ -246030,7 +250158,7 @@ -9.061221740 -140.532208986 -9.488597356 -140.077371244 -9.354162482 -139.502835815 - -9.167971602 -139.463758714 + -9.167971607 -139.463758717 -8.802380891 -139.313719238 -8.380844616 -139.696950567 } @@ -246076,7 +250204,7 @@ -9.369199949 -137.355550134 -8.957212632 -137.728207721 -9.088810077 -138.329484418 - -9.270631424 -138.404675373 + -9.270631419 -138.404675371 -9.642223669 -138.478564607 -10.064232593 -138.022770675 } @@ -247536,11 +251664,11 @@ { -22.121406257 -125.938130841 -21.576840519 -125.919877043 - -21.418652367 -126.277127072 + -21.418652375 -126.277127063 -21.295092307 -126.435958940 -21.508531269 -126.956911673 -22.097477696 -127.001801426 - -22.345569598 -126.680024293 + -22.345569590 -126.680024302 -22.426852206 -126.500247619 } 83a1b1fffffffff @@ -247560,7 +251688,7 @@ -20.502391751 -125.884258227 -20.711992975 -126.395128364 -21.295092307 -126.435958940 - -21.418652377 -126.277127057 + -21.418652375 -126.277127063 } 83a1b3fffffffff { @@ -247584,7 +251712,7 @@ { -22.977703800 -126.523580238 -22.426852206 -126.500247619 - -22.345569587 -126.680024307 + -22.345569590 -126.680024302 -22.097477696 -127.001801426 -22.314574566 -127.533085565 -22.909160067 -127.582221765 @@ -247603,11 +251731,11 @@ { -19.863420525 49.078928546 -20.498106486 49.099271882 - -20.683043946 49.476559831 + -20.683043941 49.476559820 -20.776489262 49.664867290 -20.420884059 50.208992556 -19.786339253 50.184161024 - -19.602906971 49.808198140 + -19.602906977 49.808198152 -19.509614116 49.621214365 } 83a201fffffffff @@ -247623,7 +251751,7 @@ { -21.411417182 49.687019254 -20.776489262 49.664867290 - -20.683043938 49.476559814 + -20.683043941 49.476559820 -20.498106486 49.099271882 -20.853217633 48.550342539 -21.487228404 48.569365216 @@ -247651,7 +251779,7 @@ { -18.874678104 49.599595365 -19.509614116 49.621214365 - -19.602906979 49.808198157 + -19.602906977 49.808198152 -19.786339253 50.184161024 -19.426213527 50.725626021 -18.792485263 50.698174607 @@ -248684,11 +252812,11 @@ { -29.485104696 45.856897047 -30.089069779 45.869029389 - -30.253916573 46.274779044 + -30.253916567 46.274779033 -30.361354073 46.468519118 -30.055020380 47.046403911 -29.425916719 47.037995586 - -29.213815293 46.650737160 + -29.213815300 46.650737171 -29.130523824 46.449592639 } 83a299fffffffff @@ -248704,7 +252832,7 @@ { -30.987010330 46.473680244 -30.361354073 46.468519118 - -30.253916565 46.274779027 + -30.253916567 46.274779033 -30.089069779 45.869029389 -30.441247442 45.269227909 -31.040891859 45.279696416 @@ -248732,7 +252860,7 @@ { -28.522588798 46.435849356 -29.130523824 46.449592639 - -29.213815303 46.650737177 + -29.213815300 46.650737171 -29.425916719 47.037995586 -29.112081547 47.613499148 -28.479891740 47.601908983 @@ -248814,11 +252942,11 @@ { -24.719279746 47.518062195 -25.342939943 47.534584821 - -25.518003364 47.925904201 + -25.518003358 47.925904189 -25.618891307 48.117094874 -25.284591454 48.678024721 -24.648075400 48.660854024 - -24.449465968 48.278932224 + -24.449465974 48.278932235 -24.361052362 48.084973421 } 83a2a9fffffffff @@ -248834,7 +252962,7 @@ { -26.253795249 48.131313437 -25.618891307 48.117094874 - -25.518003356 47.925904183 + -25.518003358 47.925904189 -25.342939943 47.534584821 -25.700615278 46.960784128 -26.321664337 46.975822613 @@ -248862,7 +252990,7 @@ { -23.735186504 48.067015623 -24.361052362 48.084973421 - -24.449465977 48.278932241 + -24.449465974 48.278932235 -24.648075400 48.660854024 -24.307618276 49.219236454 -23.669905148 49.199176449 @@ -249953,11 +254081,11 @@ { -14.996596675 50.546195659 -15.632894125 50.569851241 - -15.826706671 50.933569953 + -15.826706665 50.933569942 -15.912079945 51.118744596 -15.542806154 51.646347418 -14.919707565 51.614837931 - -14.752578282 51.245294407 + -14.752578287 51.245294418 -14.654970801 51.065046514 } 83a351fffffffff @@ -249973,7 +254101,7 @@ { -16.537537680 51.147824641 -15.912079945 51.118744596 - -15.826706663 50.933569937 + -15.826706665 50.933569942 -15.632894125 50.569851241 -15.977527442 50.044621374 -16.615138806 50.067104145 @@ -250001,7 +254129,7 @@ { -14.020392373 51.040259221 -14.654970801 51.065046514 - -14.752578290 51.245294423 + -14.752578287 51.245294418 -14.919707565 51.614837931 -14.547705047 52.139711102 -13.927377708 52.105828370 @@ -250083,11 +254211,11 @@ { -10.197632878 51.926276876 -10.826238499 51.952792909 - -11.027373104 52.303445852 + -11.027373100 52.303445842 -11.104368675 52.485308098 -10.729358321 52.996768154 -10.126417219 52.959454055 - -9.976056542 52.596656201 + -9.976056546 52.596656212 -9.874959864 52.422886996 } 83a361fffffffff @@ -250103,7 +254231,7 @@ { -11.711447981 52.520421122 -11.104368675 52.485308098 - -11.027373097 52.303445836 + -11.027373100 52.303445842 -10.826238499 51.952792909 -11.153330605 51.450078285 -11.785108842 51.475554590 @@ -250131,7 +254259,7 @@ { -9.249876589 52.395368609 -9.874959864 52.422886996 - -9.976056548 52.596656217 + -9.976056546 52.596656212 -10.126417219 52.959454055 -9.750465234 53.468150109 -9.152018002 53.428687486 @@ -250718,11 +254846,11 @@ { -19.797544580 -28.259258483 -20.351220812 -28.590226541 - -20.692093045 -28.369460331 + -20.692093034 -28.369460338 -20.863193242 -28.260000086 -20.822404102 -27.596745474 -20.266869346 -27.268330621 - -19.927382753 -27.490906656 + -19.927382763 -27.490906650 -19.756761200 -27.600553617 } 83a401fffffffff @@ -250738,7 +254866,7 @@ { -21.416761981 -28.594132760 -20.863193242 -28.260000086 - -20.692093029 -28.369460341 + -20.692093034 -28.369460338 -20.351220812 -28.590226541 -20.389852325 -29.254993694 -20.941376459 -29.589753133 @@ -250766,7 +254894,7 @@ { -19.201333101 -27.273514966 -19.756761200 -27.600553617 - -19.927382768 -27.490906646 + -19.927382763 -27.490906650 -20.266869346 -27.268330621 -20.220742822 -26.604650824 -19.663656555 -26.282092827 @@ -251799,11 +255927,11 @@ { -26.424344116 -36.490540506 -26.936891516 -36.848290322 - -27.266485992 -36.619202615 + -27.266485981 -36.619202621 -27.447915326 -36.527714472 -27.464854620 -35.867747075 -26.933768905 -35.488507068 - -26.572151342 -35.676657592 + -26.572151353 -35.676657587 -26.406876262 -35.790971523 } 83a499fffffffff @@ -251819,7 +255947,7 @@ { -27.973410683 -36.911299360 -27.447915326 -36.527714472 - -27.266485976 -36.619202624 + -27.266485981 -36.619202621 -26.936891516 -36.848290322 -26.949655159 -37.550839176 -27.456716070 -37.910890399 @@ -251847,7 +255975,7 @@ { -25.889137750 -35.435747453 -26.406876262 -35.790971523 - -26.572151359 -35.676657584 + -26.572151353 -35.676657587 -26.933768905 -35.488507068 -26.943860151 -34.824487669 -26.407486491 -34.449839434 @@ -251929,11 +256057,11 @@ { -23.189484648 -32.304164830 -23.726657242 -32.649955065 - -24.062569736 -32.423934223 + -24.062569725 -32.423934229 -24.239694862 -32.322597542 -24.225778183 -31.657264570 -23.677845353 -31.302414465 - -23.325631307 -31.509535060 + -23.325631317 -31.509535054 -23.157322925 -31.622041020 } 83a4a9fffffffff @@ -251949,7 +256077,7 @@ { -24.783729582 -32.682600012 -24.239694862 -32.322597542 - -24.062569720 -32.423934232 + -24.062569725 -32.423934229 -23.726657242 -32.649955065 -23.755309169 -33.336754279 -24.288519862 -33.685678566 @@ -251977,7 +256105,7 @@ { -22.616553764 -31.279569078 -23.157322925 -31.622041020 - -23.325631322 -31.509535051 + -23.325631317 -31.509535054 -23.677845353 -31.302414465 -23.657639326 -30.634906351 -23.106185047 -30.285404041 @@ -253068,11 +257196,11 @@ { -16.319769080 -24.386757853 -16.880860022 -24.700800102 - -17.224928995 -24.487079813 + -17.224928986 -24.487079820 -17.388608398 -24.371277549 -17.326393102 -23.716643868 -16.772876826 -23.415672283 - -16.448744220 -23.650132066 + -16.448744230 -23.650132059 -16.276725790 -23.756074600 } 83a551fffffffff @@ -253088,7 +257216,7 @@ { -17.942142200 -24.678292368 -17.388608398 -24.371277549 - -17.224928980 -24.487079823 + -17.224928986 -24.487079820 -16.880860022 -24.700800102 -16.923110977 -25.338586009 -17.483969549 -25.656886875 @@ -253116,7 +257244,7 @@ { -15.715796662 -23.446382154 -16.276725790 -23.756074600 - -16.448744235 -23.650132056 + -16.448744230 -23.650132059 -16.772876826 -23.415672283 -16.706548133 -22.762152265 -16.153459601 -22.467307949 @@ -253198,11 +257326,11 @@ { -12.830188510 -20.708809143 -13.389513438 -21.004582316 - -13.734703856 -20.799262145 + -13.734703847 -20.799262152 -13.889977643 -20.678844966 -13.812585379 -20.038242653 -13.270171417 -19.764798370 - -12.963174262 -20.007724953 + -12.963174271 -20.007724946 -12.790817531 -20.109337476 } 83a561fffffffff @@ -253218,7 +257346,7 @@ { -14.434253190 -20.958441824 -13.889977643 -20.678844966 - -13.734703842 -20.799262155 + -13.734703847 -20.799262152 -13.389513438 -21.004582316 -13.429302768 -21.611851958 -13.990235038 -21.912166619 @@ -253246,7 +257374,7 @@ { -12.233450622 -19.818153857 -12.790817531 -20.109337476 - -12.963174276 -20.007724943 + -12.963174271 -20.007724946 -13.270171417 -19.764798370 -13.190005990 -19.126589741 -12.649821213 -18.859333103 @@ -253832,21 +257960,21 @@ 83a600fffffffff { -23.997628205 113.235869084 - -23.647595612 113.307086828 + -23.647595622 113.307086826 -23.484062404 113.271493585 - -23.313556483 112.930923776 + -23.313556488 112.930923786 -23.293530362 112.750670104 - -23.537215561 112.467787946 + -23.537215553 112.467787955 -23.688270391 112.390693689 - -24.010601174 112.556041825 + -24.010601164 112.556041820 -24.124298280 112.689641705 - -24.079057999 113.076527793 + -24.079058001 113.076527782 } 83a602fffffffff { -22.864255970 112.633102039 -23.293530362 112.750670104 - -23.313556491 112.930923791 + -23.313556488 112.930923786 -23.484062404 113.271493585 -23.246504926 113.678415817 -22.750014061 113.571238686 @@ -253860,13 +257988,13 @@ -23.167939348 111.660884098 -23.656795653 111.908553926 -23.688270391 112.390693689 - -23.537215550 112.467787959 + -23.537215553 112.467787955 } 83a604fffffffff { -24.279591227 113.609850408 -23.997628205 113.235869084 - -24.079058002 113.076527776 + -24.079058001 113.076527782 -24.124298280 112.689641705 -24.535048385 112.508445964 -24.881083171 112.915133862 @@ -253878,7 +258006,7 @@ -24.601684777 111.920218601 -24.535048385 112.508445964 -24.124298280 112.689641705 - -24.010601159 112.556041817 + -24.010601164 112.556041820 -23.688270391 112.390693689 -23.656795653 111.908553926 } @@ -253888,10 +258016,75 @@ -23.501303342 114.195983775 -23.246504926 113.678415817 -23.484062404 113.271493585 - -23.647595627 113.307086824 + -23.647595622 113.307086826 -23.997628205 113.235869084 -24.279591227 113.609850408 } +83a608fffffffff +{ + -24.012749526 110.178077167 + -24.511576276 110.429052024 + -24.543585261 110.931397925 + -24.082018359 111.178100186 + -23.588188746 110.928738470 + -23.550956465 110.431041358 +} +83a609fffffffff +{ + -24.441371773 109.408456492 + -24.945215619 109.660956300 + -24.977697283 110.173685835 + -24.511576276 110.429052024 + -24.012749526 110.178077167 + -23.975053805 109.670188644 +} +83a60afffffffff +{ + -23.051383231 110.182387150 + -23.550956465 110.431041358 + -23.588188746 110.928738470 + -23.131037766 111.173198388 + -22.884044211 111.049541506 + -22.665245057 110.988150522 + -22.594147589 110.432994103 +} +83a60bfffffffff +{ + -23.470380969 109.420036669 + -23.975053805 109.670188644 + -24.012749526 110.178077167 + -23.550956465 110.431041358 + -23.051383231 110.182387150 + -23.008531887 109.679249097 +} +83a60cfffffffff +{ + -24.543585261 110.931397925 + -25.036464223 111.183093528 + -25.049905280 111.432105960 + -25.017201175 111.730081728 + -24.601684777 111.920218601 + -24.113695741 111.670247561 + -24.082018359 111.178100186 +} +83a60dfffffffff +{ + -24.977697283 110.173685835 + -25.475486841 110.427025061 + -25.502218577 110.934107415 + -25.036464223 111.183093528 + -24.543585261 110.931397925 + -24.511576276 110.429052024 +} +83a60efffffffff +{ + -23.588188746 110.928738470 + -24.082018359 111.178100186 + -24.113695741 111.670247561 + -23.656795653 111.908553926 + -23.167939348 111.660884098 + -23.131037766 111.173198388 +} 83a610fffffffff { -22.001660183 113.873298750 @@ -254217,6 +258410,457 @@ -24.885990445 115.264684639 -25.175033736 115.667438158 } +83a640fffffffff +{ + -26.750514808 106.945175726 + -27.268071239 107.204074171 + -27.297780053 107.754541387 + -26.815122690 108.040522146 + -26.302517611 107.782838974 + -26.267642369 107.237927601 +} +83a641fffffffff +{ + -27.201073718 106.086443481 + -27.723579515 106.346420636 + -27.754510408 106.908139301 + -27.268071239 107.204074171 + -26.750514808 106.945175726 + -26.714471192 106.389228173 +} +83a642fffffffff +{ + -25.748671270 106.981485889 + -26.267642369 107.237927601 + -26.302517611 107.782838974 + -25.823577437 108.065832262 + -25.309656689 107.810588007 + -25.269651048 107.271121844 +} +83a643fffffffff +{ + -26.190448731 106.131721272 + -26.714471192 106.389228173 + -26.750514808 106.945175726 + -26.267642369 107.237927601 + -25.748671270 106.981485889 + -25.707545741 106.431192722 +} +83a644fffffffff +{ + -27.297780053 107.754541387 + -27.808757453 108.014710389 + -27.820782162 108.287826457 + -27.791641439 108.607671265 + -27.349946800 108.838695707 + -26.843814934 108.579888224 + -26.815122690 108.040522146 +} +83a645fffffffff +{ + -27.754510408 106.908139301 + -28.270333662 107.169541745 + -28.294849568 107.725678834 + -27.808757453 108.014710389 + -27.297780053 107.754541387 + -27.268071239 107.204074171 +} +83a646fffffffff +{ + -26.302517611 107.782838974 + -26.815122690 108.040522146 + -26.843814934 108.579888224 + -26.365135805 108.856197878 + -25.857478839 108.599854082 + -25.823577437 108.065832262 +} +83a648fffffffff +{ + -27.080636595 104.368647268 + -27.614741706 104.627836672 + -27.653763205 105.206237824 + -27.163652867 105.519327257 + -26.634583708 105.260900050 + -26.590611549 104.688579851 +} +83a649fffffffff +{ + -27.528132865 103.454610880 + -28.067256681 103.714390557 + -28.108116914 104.304174419 + -27.614741706 104.627836672 + -27.080636595 104.368647268 + -27.034909503 103.785160242 +} +83a64afffffffff +{ + -26.055116187 104.431826969 + -26.590611549 104.688579851 + -26.634583708 105.260900050 + -26.148005703 105.570471582 + -25.617647550 105.314477263 + -25.568754287 104.748112848 +} +83a64bfffffffff +{ + -26.494291238 103.527815067 + -27.034909503 103.785160242 + -27.080636595 104.368647268 + -26.590611549 104.688579851 + -26.055116187 104.431826969 + -26.004545983 103.854505623 +} +83a64cfffffffff +{ + -27.653763205 105.206237824 + -28.181210786 105.467144004 + -28.213584142 106.040249660 + -27.723579515 106.346420636 + -27.201073718 106.086443481 + -27.163652867 105.519327257 +} +83a64dfffffffff +{ + -28.108116914 104.304174419 + -28.640492708 104.565846172 + -28.674543984 105.150457391 + -28.181210786 105.467144004 + -27.653763205 105.206237824 + -27.614741706 104.627836672 +} +83a64efffffffff +{ + -26.634583708 105.260900050 + -27.163652867 105.519327257 + -27.201073718 106.086443481 + -26.714471192 106.389228173 + -26.190448731 106.131721272 + -26.148005703 105.570471582 +} +83a650fffffffff +{ + -24.319783070 107.837804272 + -24.834707378 108.090655211 + -24.873776976 108.619437431 + -24.403067804 108.890203473 + -23.893276425 108.638649155 + -23.849088648 108.115004915 +} +83a651fffffffff +{ + -24.749584355 107.017090916 + -25.269651048 107.271121844 + -25.309656689 107.810588007 + -24.834707378 108.090655211 + -24.319783070 107.837804272 + -24.274692378 107.303675944 +} +83a652fffffffff +{ + -23.333471866 107.864502955 + -23.849088648 108.115004915 + -23.893276425 108.638649155 + -23.426935494 108.906725709 + -22.916533071 108.657499728 + -22.867285887 108.138894770 +} +83a653fffffffff +{ + -23.753848557 107.052011125 + -24.274692378 107.303675944 + -24.319783070 107.837804272 + -23.849088648 108.115004915 + -23.333471866 107.864502955 + -23.283350498 107.335608223 +} +83a654fffffffff +{ + -24.873776976 108.619437431 + -25.382653671 108.873363938 + -25.415761753 109.396655018 + -24.945215619 109.660956300 + -24.441371773 109.408456492 + -24.403067804 108.890203473 +} +83a655fffffffff +{ + -25.309656689 107.810588007 + -25.823577437 108.065832262 + -25.857478839 108.599854082 + -25.382653671 108.873363938 + -24.873776976 108.619437431 + -24.834707378 108.090655211 +} +83a656fffffffff +{ + -23.893276425 108.638649155 + -24.403067804 108.890203473 + -24.441371773 109.408456492 + -23.975053805 109.670188644 + -23.470380969 109.420036669 + -23.426935494 108.906725709 +} +83a658fffffffff +{ + -24.603588192 105.367001360 + -25.134902424 105.620607621 + -25.182332526 106.176109959 + -24.703417288 106.472338898 + -24.177339068 106.219635425 + -24.124966537 105.669764825 +} +83a659fffffffff +{ + -25.032208600 104.493751893 + -25.568754287 104.748112848 + -25.617647550 105.314477263 + -25.134902424 105.620607621 + -24.603588192 105.367001360 + -24.549813151 104.806471348 +} +83a65afffffffff +{ + -23.593028201 105.418503003 + -24.124966537 105.669764825 + -24.177339068 106.219635425 + -23.702689612 106.512690368 + -23.176070768 106.262322557 + -23.118809683 105.717971513 +} +83a65bfffffffff +{ + -24.012556601 104.554458911 + -24.549813151 104.806471348 + -24.603588192 105.367001360 + -24.124966537 105.669764825 + -23.593028201 105.418503003 + -23.534420191 104.863689650 +} +83a65cfffffffff +{ + -25.182332526 106.176109959 + -25.707545741 106.431192722 + -25.748671270 106.981485889 + -25.269651048 107.271121844 + -24.749584355 107.017090916 + -24.703417288 106.472338898 +} +83a65dfffffffff +{ + -25.617647550 105.314477263 + -26.148005703 105.570471582 + -26.190448731 106.131721272 + -25.707545741 106.431192722 + -25.182332526 106.176109959 + -25.134902424 105.620607621 +} +83a65efffffffff +{ + -24.177339068 106.219635425 + -24.703417288 106.472338898 + -24.749584355 107.017090916 + -24.274692378 107.303675944 + -23.753848557 107.052011125 + -23.702689612 106.512690368 +} +83a660fffffffff +{ + -28.499125685 110.077767958 + -28.114359726 109.658617362 + -28.177381698 109.016680551 + -28.627757750 108.783400648 + -29.019722615 109.200776050 + -28.954070739 109.853327413 +} +83a661fffffffff +{ + -29.019722615 109.200776050 + -28.627757750 108.783400648 + -28.687685285 108.132520270 + -29.141996002 107.888160637 + -29.541228049 108.303362492 + -29.478842854 108.965225998 +} +83a662fffffffff +{ + -27.668151661 109.881141003 + -27.289439213 109.470344221 + -27.349946800 108.838695707 + -27.791641439 108.607671265 + -28.177381698 109.016680551 + -28.114359726 109.658617362 +} +83a663fffffffff +{ + -28.177381698 109.016680551 + -27.791641439 108.607671265 + -27.820782162 108.287826457 + -27.808757453 108.014710389 + -28.294849568 107.725678834 + -28.687685285 108.132520270 + -28.627757750 108.783400648 +} +83a664fffffffff +{ + -28.813992016 111.150151028 + -28.430519729 110.720955167 + -28.499125685 110.077767958 + -28.954070739 109.853327413 + -29.344832913 110.281158020 + -29.273314076 110.934912862 +} +83a665fffffffff +{ + -29.344832913 110.281158020 + -28.954070739 109.853327413 + -29.019722615 109.200776050 + -29.478842854 108.965225998 + -29.876975084 109.391298385 + -29.808573145 110.054805489 +} +83a666fffffffff +{ + -27.979977411 110.934630360 + -27.602331406 110.514080210 + -27.668151661 109.881141003 + -28.114359726 109.658617362 + -28.499125685 110.077767958 + -28.430519729 110.720955167 +} +83a668fffffffff +{ + -29.227349542 105.993111790 + -29.573363986 106.169665493 + -29.709325000 106.304146775 + -29.656513900 106.972654538 + -29.198522958 107.228414664 + -28.931641557 106.958192491 + -28.760045570 106.870354638 + -28.734248438 106.302744503 +} +83a669fffffffff +{ + -29.696277787 105.093524192 + -30.219492200 105.359531833 + -30.170720360 106.036669845 + -29.709325000 106.304146775 + -29.573363986 106.169665493 + -29.227349542 105.993111790 + -29.200039018 105.413889932 +} +83a66afffffffff +{ + -28.213584142 106.040249660 + -28.734248438 106.302744503 + -28.760045570 106.870354638 + -28.270333662 107.169541745 + -27.754510408 106.908139301 + -27.723579515 106.346420636 +} +83a66bfffffffff +{ + -28.674543984 105.150457391 + -29.200039018 105.413889932 + -29.227349542 105.993111790 + -28.734248438 106.302744503 + -28.213584142 106.040249660 + -28.181210786 105.467144004 +} +83a66cfffffffff +{ + -29.541228049 108.303362492 + -29.141996002 107.888160637 + -29.198522958 107.228414664 + -29.656513900 106.972654538 + -30.063069547 107.385261464 + -30.004274085 108.056359644 +} +83a66dfffffffff +{ + -30.063069547 107.385261464 + -29.656513900 106.972654538 + -29.709325000 106.304146775 + -30.170720360 106.036669845 + -30.584642948 106.446237248 + -30.529769794 107.126465103 +} +83a66efffffffff +{ + -28.687685285 108.132520270 + -28.294849568 107.725678834 + -28.270333662 107.169541745 + -28.760045570 106.870354638 + -28.931641557 106.958192491 + -29.198522958 107.228414664 + -29.141996002 107.888160637 +} +83a670fffffffff +{ + -26.393002406 109.384625844 + -26.727493014 109.556053690 + -26.851898386 109.690949750 + -26.788741521 110.313947160 + -26.355552912 110.524440197 + -26.111470681 110.254340532 + -25.945696390 110.169210826 + -25.918478706 109.651547127 +} +83a671fffffffff +{ + -26.843814934 108.579888224 + -27.349946800 108.838695707 + -27.289439213 109.470344221 + -26.851898386 109.690949750 + -26.727493014 109.556053690 + -26.393002406 109.384625844 + -26.365135805 108.856197878 +} +83a672fffffffff +{ + -25.415761753 109.396655018 + -25.918478706 109.651547127 + -25.945696390 110.169210826 + -25.475486841 110.427025061 + -24.977697283 110.173685835 + -24.945215619 109.660956300 +} +83a673fffffffff +{ + -25.857478839 108.599854082 + -26.365135805 108.856197878 + -26.393002406 109.384625844 + -25.918478706 109.651547127 + -25.415761753 109.396655018 + -25.382653671 108.873363938 +} +83a674fffffffff +{ + -26.654916214 111.552066438 + -26.290017125 111.138751715 + -26.355552912 110.524440197 + -26.788741521 110.313947160 + -27.160503906 110.726172182 + -27.092170833 111.350081838 +} +83a675fffffffff +{ + -27.160503906 110.726172182 + -26.788741521 110.313947160 + -26.851898386 109.690949750 + -27.289439213 109.470344221 + -27.668151661 109.881141003 + -27.602331406 110.514080210 +} +83a676fffffffff +{ + -25.861359924 111.339438691 + -25.502218577 110.934107415 + -25.475486841 110.427025061 + -25.945696390 110.169210826 + -26.111470681 110.254340532 + -26.355552912 110.524440197 + -26.290017125 111.138751715 +} 83a680fffffffff { -18.072868422 114.467124495 @@ -254412,11 +259056,11 @@ { -16.149787412 114.558945932 -15.597091338 114.449705604 - -15.428020403 114.098074546 + -15.428020405 114.098074557 -15.397043772 113.914887005 -15.804205372 113.481400292 -16.300689433 113.599501885 - -16.360158812 113.965665718 + -16.360158810 113.965665707 -16.444953743 114.140639867 } 83a699fffffffff @@ -254432,7 +259076,7 @@ { -14.893310108 113.797403069 -15.397043772 113.914887005 - -15.428020407 114.098074562 + -15.428020405 114.098074557 -15.597091338 114.449705604 -15.294452250 114.870788507 -14.735108007 114.761154194 @@ -254460,7 +259104,7 @@ { -16.990905434 114.249482653 -16.444953743 114.140639867 - -16.360158809 113.965665702 + -16.360158810 113.965665707 -16.300689433 113.599501885 -16.703874543 113.166329883 -17.193012491 113.285037874 @@ -254542,11 +259186,11 @@ { -20.206167564 113.961708202 -19.684375549 113.853701988 - -19.513739697 113.507647431 + -19.513739698 113.507647441 -19.488608372 113.325917388 -19.875862285 112.896954096 -20.334976078 113.015095534 - -20.383089647 113.378315111 + -20.383089646 113.378315100 -20.468485590 113.550511735 } 83a6a9fffffffff @@ -254562,7 +259206,7 @@ { -19.022011190 113.208361866 -19.488608372 113.325917388 - -19.513739701 113.507647447 + -19.513739698 113.507647441 -19.684375549 113.853701988 -19.414690359 114.267639860 -18.885840637 114.159236338 @@ -254590,7 +259234,7 @@ { -20.983195542 113.658117477 -20.468485590 113.550511735 - -20.383089645 113.378315095 + -20.383089646 113.378315100 -20.334976078 113.015095534 -20.717536525 112.586488712 -21.169142060 112.705205080 @@ -254737,11 +259381,11 @@ -20.155488704 105.909505115 -19.674596613 105.770558865 -19.571824130 105.183324050 - -19.825710949 104.884921855 + -19.825710941 104.884921864 -19.978877110 104.785796902 -20.515636565 105.028826961 -20.588361171 105.567162526 - -20.281702115 105.760941395 + -20.281702122 105.760941387 } 83a6c9fffffffff { @@ -254769,7 +259413,7 @@ -19.358823435 104.001451756 -19.900284199 104.242928796 -19.978877110 104.785796902 - -19.825710937 104.884921868 + -19.825710941 104.884921864 } 83a6ccfffffffff { @@ -254779,7 +259423,7 @@ -20.726750647 106.629199928 -20.253406033 106.492500789 -20.155488704 105.909505115 - -20.281702127 105.760941384 + -20.281702122 105.760941387 } 83a6cdfffffffff { @@ -254930,11 +259574,11 @@ -22.074526819 109.747952361 -21.623378303 109.620771331 -21.542640475 109.055744002 - -21.791439367 108.764033361 + -21.791439359 108.764033370 -21.944089810 108.675999236 -22.454802086 108.922939528 -22.503326216 109.431401714 - -22.198209213 109.602969956 + -22.198209221 109.602969947 } 83a6e1fffffffff { @@ -254962,7 +259606,7 @@ -21.373772347 107.916405485 -21.889850394 108.162337675 -21.944089810 108.675999236 - -21.791439355 108.764033374 + -21.791439359 108.764033370 } 83a6e4fffffffff { @@ -254972,7 +259616,7 @@ -22.594147589 110.432994103 -22.150427316 110.308088161 -22.074526819 109.747952361 - -22.198209225 109.602969944 + -22.198209221 109.602969947 } 83a6e5fffffffff { @@ -255315,11 +259959,11 @@ -27.374236717 115.271225206 -26.821946257 115.372173774 -26.521709137 114.964128999 - -26.686622766 114.626599032 + -26.686622761 114.626599042 -26.713906576 114.424530096 -27.153562561 114.250139278 -27.513957282 114.690009711 - -27.456725155 115.099740198 + -27.456725160 115.099740188 } 83a719fffffffff { @@ -255347,13 +259991,13 @@ -25.927534557 114.167356552 -26.358608112 113.993333653 -26.713906576 114.424530096 - -26.686622758 114.626599047 + -26.686622761 114.626599042 } 83a71cfffffffff { -27.680193422 115.687728330 -27.374236717 115.271225206 - -27.456725160 115.099740182 + -27.456725160 115.099740188 -27.513957282 114.690009711 -27.962270264 114.515326087 -28.327673183 114.964192427 @@ -255508,11 +260152,11 @@ -30.968345340 117.601926177 -30.390573023 117.694063772 -30.068252936 117.237683057 - -30.235463136 116.873708756 + -30.235463131 116.873708767 -30.269938258 116.659694275 -30.747757589 116.495497440 -31.124281040 116.982853135 - -31.051987509 117.416889356 + -31.051987513 117.416889345 } 83a731fffffffff { @@ -255540,13 +260184,13 @@ -29.428705625 116.347227802 -29.897743133 116.182633148 -30.269938258 116.659694275 - -30.235463129 116.873708772 + -30.235463131 116.873708767 } 83a734fffffffff { -31.295725282 118.068396666 -30.968345340 117.601926177 - -31.051987515 117.416889339 + -31.051987513 117.416889345 -31.124281040 116.982853135 -31.610898110 116.819189663 -31.991569482 117.317241104 @@ -255700,11 +260344,11 @@ 83a750fffffffff { -26.393002406 109.384625844 - -26.727493024 109.556053695 + -26.727493014 109.556053690 -26.851898386 109.690949750 -26.788741521 110.313947160 -26.355552912 110.524440197 - -26.111470672 110.254340527 + -26.111470681 110.254340532 -25.945696390 110.169210826 -25.918478706 109.651547127 } @@ -255723,7 +260367,7 @@ -25.502218577 110.934107415 -25.475486841 110.427025061 -25.945696390 110.169210826 - -26.111470685 110.254340536 + -26.111470681 110.254340532 -26.355552912 110.524440197 -26.290017125 111.138751715 } @@ -255751,7 +260395,7 @@ -27.349946800 108.838695707 -27.289439213 109.470344221 -26.851898386 109.690949750 - -26.727493009 109.556053687 + -26.727493014 109.556053690 -26.393002406 109.384625844 -26.365135805 108.856197878 } @@ -255830,11 +260474,11 @@ 83a760fffffffff { -29.227349542 105.993111790 - -29.573363996 106.169665498 + -29.573363986 106.169665493 -29.709325000 106.304146775 -29.656513900 106.972654538 -29.198522958 107.228414664 - -28.931641547 106.958192486 + -28.931641557 106.958192491 -28.760045570 106.870354638 -28.734248438 106.302744503 } @@ -255853,7 +260497,7 @@ -28.294849568 107.725678834 -28.270333662 107.169541745 -28.760045570 106.870354638 - -28.931641561 106.958192495 + -28.931641557 106.958192491 -29.198522958 107.228414664 -29.141996002 107.888160637 } @@ -255881,7 +260525,7 @@ -30.219492200 105.359531833 -30.170720360 106.036669845 -29.709325000 106.304146775 - -29.573363980 106.169665490 + -29.573363986 106.169665493 -29.227349542 105.993111790 -29.200039018 105.413889932 } @@ -256088,11 +260732,11 @@ 83a788fffffffff { -22.764141597 116.403303964 - -23.101446144 116.476150589 + -23.101446134 116.476150587 -23.281926851 116.446171305 -23.559908764 116.854218257 -23.291564689 117.354313855 - -22.927304361 117.410915911 + -22.927304371 117.410915913 -22.757487093 117.374293400 -22.506698989 116.832354355 } @@ -256102,7 +260746,7 @@ -23.267372199 115.554256207 -23.545081662 115.951808182 -23.281926851 116.446171305 - -23.101446129 116.476150586 + -23.101446134 116.476150587 -22.764141597 116.403303964 -22.511850196 115.868304041 } @@ -256148,18 +260792,18 @@ -22.744753313 118.358315694 -22.495621495 117.809615371 -22.757487093 117.374293400 - -22.927304376 117.410915912 + -22.927304371 117.410915913 -23.291564689 117.354313855 -23.569652214 117.772965543 } 83a790fffffffff { -21.900757416 120.705867055 - -22.250419774 120.780229526 + -22.250419764 120.780229523 -22.437405564 120.758576371 -22.708743128 121.211224300 -22.413994508 121.730142999 - -22.037088098 121.769489232 + -22.037088108 121.769489235 -21.861159887 121.732199613 -21.617664196 121.161709413 } @@ -256169,7 +260813,7 @@ -22.454763661 119.802503636 -22.726618545 120.244520702 -22.437405564 120.758576371 - -22.250419758 120.780229522 + -22.250419764 120.780229523 -21.900757416 120.705867055 -21.655199803 120.141407261 } @@ -256215,7 +260859,7 @@ -21.814638995 122.769888036 -21.573347913 122.193639357 -21.861159887 121.732199613 - -22.037088114 121.769489234 + -22.037088108 121.769489235 -22.413994508 121.730142999 -22.684625272 122.193445426 } @@ -259001,11 +263645,11 @@ -27.508461469 -59.695692120 -27.077517240 -59.348681476 -26.550185224 -59.646224297 - -26.488018450 -60.073861733 + -26.488018452 -60.073861720 -26.501786990 -60.280039856 -27.026725536 -60.612877326 -27.507053863 -60.323585333 - -27.476770361 -59.910012411 + -27.476770359 -59.910012424 } 83a969fffffffff { @@ -259033,7 +263677,7 @@ -25.487092806 -60.236852464 -26.014806370 -60.568131297 -26.501786990 -60.280039856 - -26.488018453 -60.073861714 + -26.488018452 -60.073861720 } 83a96cfffffffff { @@ -259043,7 +263687,7 @@ -28.452967458 -59.745300475 -28.030002355 -59.397849051 -27.508461469 -59.695692120 - -27.476770360 -59.910012430 + -27.476770359 -59.910012424 } 83a96dfffffffff { @@ -259510,11 +264154,11 @@ { -30.478267012 -40.189082451 -29.972047534 -39.788552888 - -29.604800159 -39.954528154 + -29.604800169 -39.954528147 -29.443067698 -40.069434396 -29.440753057 -40.779311590 -29.922234056 -41.145488362 - -30.244569754 -40.915823386 + -30.244569745 -40.915823393 -30.428389371 -40.835724453 } 83a9b1fffffffff @@ -259530,7 +264174,7 @@ { -28.955186807 -39.704841465 -29.443067698 -40.069434396 - -29.604800174 -39.954528144 + -29.604800169 -39.954528147 -29.972047534 -39.788552888 -30.014969257 -39.135970817 -29.502056779 -38.739049200 @@ -259558,7 +264202,7 @@ { -30.927710679 -41.239575484 -30.428389371 -40.835724453 - -30.244569740 -40.915823396 + -30.244569745 -40.915823393 -29.922234056 -41.145488362 -29.914319578 -41.856421778 -30.389197069 -42.223929695 @@ -262665,11 +267309,11 @@ -25.707718671 11.418906967 -25.091142039 11.502573395 -24.683057596 10.966297098 - -24.821886422 10.554764938 + -24.821886418 10.554764950 -24.889543108 10.348078424 -25.505444355 10.258672188 -25.916088482 10.796209130 - -25.776582023 11.211191559 + -25.776582027 11.211191547 } 83ac01fffffffff { @@ -262697,7 +267341,7 @@ -23.864738165 9.908641282 -24.476629982 9.816764715 -24.889543108 10.348078424 - -24.821886416 10.554764956 + -24.821886418 10.554764950 } 83ac04fffffffff { @@ -262707,7 +267351,7 @@ -26.727919372 11.877993008 -26.114813509 11.961097109 -25.707718671 11.418906967 - -25.776582029 11.211191540 + -25.776582027 11.211191547 } 83ac05fffffffff { @@ -264060,11 +268704,11 @@ -17.097995690 5.855238092 -16.477223351 5.945590347 -16.078561198 5.472816619 - -16.225693469 5.099509406 + -16.225693464 5.099509417 -16.275587335 4.899070068 -16.849770109 4.777568685 -17.274124725 5.263441017 - -17.170835939 5.666651209 + -17.170835944 5.666651197 } 83acc9fffffffff { @@ -264092,7 +268736,7 @@ -15.285730312 4.541728886 -15.852978913 4.418944908 -16.275587335 4.899070068 - -16.225693462 5.099509423 + -16.225693464 5.099509417 } 83acccfffffffff { @@ -264102,7 +268746,7 @@ -18.120398685 6.243277918 -17.499588739 6.333436237 -17.097995690 5.855238092 - -17.170835945 5.666651191 + -17.170835944 5.666651197 } 83accdfffffffff { @@ -264253,11 +268897,11 @@ -21.396475266 8.536045031 -20.773901695 8.623616291 -20.365894071 8.119560960 - -20.508403593 7.727119992 + -20.508403589 7.727120003 -20.566751778 7.523050697 -21.165320979 7.416020184 -21.587661380 7.927692120 - -21.467058416 8.337862823 + -21.467058420 8.337862811 } 83ace1fffffffff { @@ -264285,7 +268929,7 @@ -19.551298256 7.126264068 -20.144230018 7.017403081 -20.566751778 7.523050697 - -20.508403587 7.727120009 + -20.508403589 7.727120003 } 83ace4fffffffff { @@ -264295,7 +268939,7 @@ -22.426394149 8.958596293 -21.805548223 9.045805333 -21.396475266 8.536045031 - -21.467058422 8.337862805 + -21.467058420 8.337862811 } 83ace5fffffffff { @@ -264638,11 +269282,11 @@ -29.950237163 14.511249960 -29.347214293 14.589719348 -28.949000580 14.020869114 - -29.085664573 13.590776037 + -29.085664569 13.590776050 -29.163158067 13.382796027 -29.788248693 13.314493087 -30.177503511 13.877315947 - -30.018195117 14.294320216 + -30.018195121 14.294320203 } 83ad19fffffffff { @@ -264670,7 +269314,7 @@ -28.146655779 12.897783232 -28.769572558 12.826280200 -29.163158067 13.382796027 - -29.085664567 13.590776056 + -29.085664569 13.590776050 } 83ad1cfffffffff { @@ -264680,7 +269324,7 @@ -30.943386715 15.008441494 -30.345401175 15.086116749 -29.950237163 14.511249960 - -30.018195123 14.294320197 + -30.018195121 14.294320203 } 83ad1dfffffffff { @@ -264831,11 +269475,11 @@ -34.043795981 17.816737334 -33.460973400 17.888564995 -33.082355113 17.287581422 - -33.218804652 16.840075333 + -33.218804648 16.840075347 -33.306261410 16.632467560 -33.931985040 16.588992069 -34.291045286 17.175696001 - -34.111860131 17.591234228 + -34.111860135 17.591234215 } 83ad31fffffffff { @@ -264863,7 +269507,7 @@ -32.315582316 16.099481392 -32.941021195 16.051997410 -33.306261410 16.632467560 - -33.218804646 16.840075353 + -33.218804648 16.840075347 } 83ad34fffffffff { @@ -264873,7 +269517,7 @@ -34.994006697 18.352921949 -34.417486433 18.423695113 -34.043795981 17.816737334 - -34.111860137 17.591234208 + -34.111860135 17.591234215 } 83ad35fffffffff { @@ -267294,11 +271938,11 @@ 83aed8fffffffff { -32.150447800 102.165806217 - -32.507008402 102.345850801 + -32.507008392 102.345850796 -32.655120717 102.477476637 -32.619410504 103.192549059 -32.141257941 103.501805042 - -31.850240868 103.235990864 + -31.850240878 103.235990869 -31.673274215 103.146175063 -31.644635757 102.524524430 } @@ -267308,7 +271952,7 @@ -31.195687803 104.102589185 -31.169468198 103.493085300 -31.673274215 103.146175063 - -31.850240882 103.235990873 + -31.850240878 103.235990869 -32.141257941 103.501805042 -32.100224701 104.208485064 } @@ -267354,7 +271998,7 @@ -33.165261389 101.431644011 -33.135234235 102.154834964 -32.655120717 102.477476637 - -32.507008387 102.345850793 + -32.507008392 102.345850796 -32.150447800 102.165806217 -32.119082805 101.531957557 } @@ -268310,11 +272954,11 @@ -15.397769520 96.588533841 -15.976274969 96.814927442 -16.098407889 97.401782821 - -15.795835668 97.638587182 + -15.795835677 97.638587175 -15.664505625 97.790286304 -15.126689076 97.629695494 -14.982998175 97.012369334 - -15.247187886 96.708914990 + -15.247187877 96.708914997 } 83af69fffffffff { @@ -268342,7 +272986,7 @@ -16.335100604 98.563946805 -15.804206220 98.405314281 -15.664505625 97.790286304 - -15.795835681 97.638587172 + -15.795835677 97.638587175 } 83af6cfffffffff { @@ -268352,7 +272996,7 @@ -14.689500183 95.775392757 -15.270392271 95.999138096 -15.397769520 96.588533841 - -15.247187873 96.708915001 + -15.247187877 96.708914997 } 83af6dfffffffff { @@ -270395,11 +275039,11 @@ 83b0d8fffffffff { -18.447262949 -111.705777288 - -18.218324725 -111.376211243 + -18.218324732 -111.376211253 -18.076775563 -111.250798489 -17.497611291 -111.427919043 -17.345729437 -111.976306626 - -17.628089394 -112.223937117 + -17.628089387 -112.223937107 -17.740557991 -112.388224310 -18.263303804 -112.296881431 } @@ -270409,7 +275053,7 @@ -17.041704534 -113.055617332 -17.557450172 -112.970547576 -17.740557991 -112.388224310 - -17.628089383 -112.223937103 + -17.628089387 -112.223937107 -17.345729437 -111.976306626 -16.769059345 -112.149282849 } @@ -270455,7 +275099,7 @@ -18.811896376 -110.512352860 -18.230562139 -110.693680236 -18.076775563 -111.250798489 - -18.218324736 -111.376211258 + -18.218324732 -111.376211253 -18.447262949 -111.705777288 -18.976872070 -111.607923745 } @@ -271411,11 +276055,11 @@ -26.727208303 -128.440355888 -26.421611434 -127.839487176 -25.845427493 -127.803526624 - -25.666850197 -128.174281786 + -25.666850202 -128.174281775 -25.542257862 -128.342620572 -25.774855748 -128.907343378 -26.385649373 -128.967900652 - -26.635564746 -128.626811440 + -26.635564740 -128.626811451 } 83b169fffffffff { @@ -271443,13 +276087,13 @@ -24.706441324 -127.733456450 -24.936105651 -128.286918926 -25.542257862 -128.342620572 - -25.666850205 -128.174281769 + -25.666850202 -128.174281775 } 83b16cfffffffff { -27.308513981 -128.482388489 -26.727208303 -128.440355888 - -26.635564737 -128.626811456 + -26.635564740 -128.626811451 -26.385649373 -128.967900652 -26.620899282 -129.544152621 -27.236030717 -129.609789808 @@ -273496,11 +278140,11 @@ 83b2d8fffffffff { -35.855779427 -73.136687850 - -36.171045458 -73.415573492 + -36.171045448 -73.415573483 -36.342541009 -73.501741508 -36.840368507 -73.077465775 -36.817550024 -72.397389620 - -36.473772697 -72.233323683 + -36.473772707 -72.233323692 -36.316256647 -72.095333434 -35.850584092 -72.408269727 } @@ -273510,7 +278154,7 @@ -36.761183814 -71.056935069 -36.303830120 -71.370345412 -36.316256647 -72.095333434 - -36.473772712 -72.233323694 + -36.473772707 -72.233323692 -36.817550024 -72.397389620 -37.308795974 -71.965863201 } @@ -273556,7 +278200,7 @@ -35.852906634 -74.602714928 -36.357030047 -74.185964763 -36.342541009 -73.501741508 - -36.171045444 -73.415573479 + -36.171045448 -73.415573483 -35.855779427 -73.136687850 -35.381811539 -73.448939719 } @@ -274512,11 +279156,11 @@ -21.901117705 -61.005419880 -22.437483799 -61.337346587 -22.950751786 -61.051415885 - -22.934375807 -60.640600162 + -22.934375808 -60.640600174 -22.963480698 -60.429686165 -22.501271992 -60.087541956 -21.950955778 -60.379773561 - -21.894413213 -60.800618459 + -21.894413212 -60.800618447 } 83b369fffffffff { @@ -274544,7 +279188,7 @@ -23.963809348 -60.479737793 -23.509112325 -60.137172923 -22.963480698 -60.429686165 - -22.934375808 -60.640600180 + -22.934375808 -60.640600174 } 83b36cfffffffff { @@ -274554,7 +279198,7 @@ -20.844479321 -60.959796763 -21.382216652 -61.290183375 -21.901117705 -61.005419880 - -21.894413213 -60.800618441 + -21.894413212 -60.800618447 } 83b36dfffffffff { @@ -278168,11 +282812,11 @@ 83b600fffffffff { -29.084389946 -93.729425161 - -28.780492997 -93.434577259 + -28.780493006 -93.434577268 -28.629207997 -93.286529646 -28.053549586 -93.551768832 -27.931707022 -94.257509465 - -28.233827848 -94.552346427 + -28.233827840 -94.552346418 -28.383734550 -94.701643816 -28.961607797 -94.441882193 } @@ -278182,7 +282826,7 @@ -27.678382882 -95.658204595 -28.255221483 -95.408356454 -28.383734550 -94.701643816 - -28.233827835 -94.552346414 + -28.233827840 -94.552346418 -27.931707022 -94.257509465 -27.351738673 -94.518609130 } @@ -278228,7 +282872,7 @@ -29.317655160 -92.305567748 -28.746692818 -92.574863504 -28.629207997 -93.286529646 - -28.780493010 -93.434577272 + -28.780493006 -93.434577268 -29.084389946 -93.729425161 -29.662816515 -93.459608983 } @@ -278934,11 +283578,11 @@ 83b668fffffffff { -23.875133409 -103.343820090 - -23.608512697 -103.019914511 + -23.608512705 -103.019914521 -23.461892985 -102.880717092 -22.869150106 -103.102290677 -22.717786639 -103.736612527 - -23.010466873 -104.012364879 + -23.010466866 -104.012364869 -23.141562004 -104.174805475 -23.706661775 -104.006284696 } @@ -278948,7 +283592,7 @@ -22.410566168 -104.989114154 -22.970869240 -104.829000829 -23.141562004 -104.174805475 - -23.010466861 -104.012364865 + -23.010466866 -104.012364869 -22.717786639 -103.736612527 -22.124369849 -103.953668368 } @@ -278994,18 +283638,18 @@ -24.203950019 -102.011991254 -23.612301373 -102.238092996 -23.461892985 -102.880717092 - -23.608512709 -103.019914526 + -23.608512705 -103.019914521 -23.875133409 -103.343820090 -24.444690743 -103.166650387 } 83b670fffffffff { -26.542098605 -98.679472291 - -26.256285309 -98.366788894 + -26.256285318 -98.366788903 -26.107288592 -98.222293460 -25.519062416 -98.466336619 -25.378582502 -99.139468953 - -25.676073354 -99.426400701 + -25.676073346 -99.426400692 -25.816790317 -99.583887672 -26.392723517 -99.370877101 } @@ -279015,7 +283659,7 @@ -25.090534001 -100.471705951 -25.663402946 -100.268000434 -25.816790317 -99.583887672 - -25.676073342 -99.426400688 + -25.676073346 -99.426400692 -25.378582502 -99.139468953 -24.787846596 -99.379064195 } @@ -279061,7 +283705,7 @@ -26.830386805 -97.293314272 -26.245092978 -97.541772945 -26.107288592 -98.222293460 - -26.256285322 -98.366788908 + -26.256285318 -98.366788903 -26.542098605 -98.679472291 -27.120670013 -98.456949749 } @@ -280896,11 +285540,11 @@ 83b788fffffffff { -31.432790448 -88.546527061 - -31.113100239 -88.276312977 + -31.113100249 -88.276312985 -30.959671679 -88.126931087 -30.404070964 -88.410790391 -30.307997360 -89.140210092 - -30.614483239 -89.438700399 + -30.614483229 -89.438700391 -30.772564177 -89.576419638 -31.342850043 -89.269675023 } @@ -280910,7 +285554,7 @@ -30.104062786 -90.592563481 -30.675463353 -90.295915579 -30.772564177 -89.576419638 - -30.614483225 -89.438700386 + -30.614483229 -89.438700391 -30.307997360 -89.140210092 -29.746495726 -89.420499875 } @@ -280956,18 +285600,18 @@ -31.599338930 -87.106273182 -31.049953741 -87.393567528 -30.959671679 -88.126931087 - -31.113100254 -88.276312989 + -31.113100249 -88.276312985 -31.432790448 -88.546527061 -32.001468743 -88.229639646 } 83b790fffffffff { -33.528520431 -83.203565505 - -33.196434596 -82.964282289 + -33.196434606 -82.964282296 -33.041132657 -82.816111864 -32.511785277 -83.114735864 -32.447039073 -83.856578517 - -32.757402795 -84.153740018 + -32.757402785 -84.153740011 -32.922074496 -84.276665862 -33.475554167 -83.925181860 } @@ -280977,7 +285621,7 @@ -32.304336371 -85.338862704 -32.860989748 -84.997136671 -32.922074496 -84.276665862 - -32.757402781 -84.153740006 + -32.757402785 -84.153740011 -32.447039073 -83.856578517 -31.910553362 -84.152447082 } @@ -281023,7 +285667,7 @@ -33.621069781 -81.771495744 -33.099080510 -82.072697200 -33.041132657 -82.816111864 - -33.196434611 -82.964282299 + -33.196434606 -82.964282296 -33.528520431 -83.203565505 -34.078368603 -82.842390763 } @@ -282799,11 +287443,11 @@ 83b8d8fffffffff { -21.350088086 126.332752853 - -20.962863344 126.352461290 + -20.962863355 126.352461289 -20.781174422 126.314959921 -20.546860053 125.720887584 -20.856553322 125.241695900 - -21.217953316 125.316703018 + -21.217953305 125.316703019 -21.410363743 125.304602249 -21.671443052 125.800366329 } @@ -282813,7 +287457,7 @@ -21.463633807 124.290419790 -21.726057424 124.775851453 -21.410363743 125.304602249 - -21.217953299 125.316703018 + -21.217953305 125.316703019 -20.856553322 125.241695900 -20.619702044 124.652332531 } @@ -282859,7 +287503,7 @@ -20.698333878 127.397140445 -20.466673753 126.798722351 -20.781174422 126.314959921 - -20.962863361 126.352461289 + -20.962863355 126.352461289 -21.350088086 126.332752853 -21.609626086 126.838764866 } @@ -283815,11 +288459,11 @@ -38.672312030 123.401095511 -38.055895004 123.460986768 -37.704657368 122.880859635 - -37.878590044 122.455213919 + -37.878590039 122.455213932 -37.932778159 122.215974275 -38.483930957 122.092265993 -38.872838845 122.699581841 - -38.759503599 123.184533647 + -38.759503604 123.184533634 } 83b969fffffffff { @@ -283847,13 +288491,13 @@ -37.002131509 121.750193127 -37.545159787 121.623242480 -37.932778159 122.215974275 - -37.878590036 122.455213938 + -37.878590039 122.455213932 } 83b96cfffffffff { -39.025760324 123.995635534 -38.672312030 123.401095511 - -38.759503606 123.184533627 + -38.759503604 123.184533634 -38.872838845 122.699581841 -39.431951293 122.579480147 -39.821733230 123.201986138 @@ -284386,11 +289030,11 @@ -34.275660531 179.812620576 -33.736741690 -179.814697008 -33.172366509 179.836533467 - -33.155799237 179.360691167 + -33.155799237 179.360691181 -33.145404173 179.122884349 -33.681108896 178.746128972 -34.248533123 179.089753025 - -34.266134140 179.571638410 + -34.266134140 179.571638395 } 83ba01fffffffff { @@ -284418,13 +289062,13 @@ -32.045545009 179.155097958 -32.577533307 178.783885400 -33.145404173 179.122884349 - -33.155799237 179.360691188 + -33.155799237 179.360691181 } 83ba04fffffffff { -34.840646224 -179.834715402 -34.275660531 179.812620576 - -34.266134139 179.571638388 + -34.266134140 179.571638395 -34.248533123 179.089753025 -34.787565434 178.707287620 -35.354124470 179.055664228 @@ -285781,11 +290425,11 @@ -24.347467902 178.063831179 -23.802606160 178.403132753 -23.264754206 178.103232606 - -23.269212625 177.681365532 + -23.269212625 177.681365545 -23.244432392 177.466677148 -23.734511431 177.116620459 -24.301137705 177.415961163 - -24.348306340 177.850476581 + -24.348306340 177.850476569 } 83bac9fffffffff { @@ -285813,13 +290457,13 @@ -22.197541386 177.516134988 -22.681171826 177.170829707 -23.244432392 177.466677148 - -23.269212625 177.681365551 + -23.269212625 177.681365545 } 83baccfffffffff { -24.889666562 178.366580712 -24.347467902 178.063831179 - -24.348306339 177.850476562 + -24.348306340 177.850476569 -24.301137705 177.415961163 -24.797416372 177.061022042 -25.367064885 177.363938488 @@ -285974,11 +290618,11 @@ -29.280605631 178.889660198 -28.734975313 179.244979536 -28.179380923 178.922276902 - -28.172868533 178.474933764 + -28.172868533 178.474933777 -28.154743844 178.249225703 -28.670774891 177.886110669 -29.242578751 178.206190526 - -29.275994259 178.663273749 + -29.275994259 178.663273735 } 83bae1fffffffff { @@ -286006,13 +290650,13 @@ -27.073688758 178.291134251 -27.584484927 177.933150757 -28.154743844 178.249225703 - -28.172868533 178.474933784 + -28.172868533 178.474933777 } 83bae4fffffffff { -29.838778357 179.215681241 -29.280605631 178.889660198 - -29.275994258 178.663273728 + -29.275994259 178.663273735 -29.242578751 178.206190526 -29.763514260 177.837795931 -30.336464459 178.161982721 @@ -286359,11 +291003,11 @@ -39.253706510 -179.149656488 -38.728640200 -178.758152627 -38.165262189 -179.136929359 - -38.140277581 -179.644815013 + -38.140277582 -179.644814998 -38.138454439 -179.895939398 -38.686607592 179.713183320 -39.239936031 -179.916284097 - -39.240155362 -179.407070654 + -39.240155361 -179.407070669 } 83bb19fffffffff { @@ -286391,13 +291035,13 @@ -37.036562007 -179.876192642 -37.582694283 179.738911867 -38.138454439 -179.895939398 - -38.140277583 -179.644814991 + -38.140277582 -179.644814998 } 83bb1cfffffffff { -39.815703801 -178.766270932 -39.253706510 -179.149656488 - -39.240155361 -179.407070677 + -39.240155361 -179.407070669 -39.239936031 -179.916284097 -39.789695851 179.686668343 -40.340193478 -179.937254310 @@ -286552,11 +291196,11 @@ -44.136364960 -177.975174959 -43.631267114 -177.563293626 -43.078641623 -177.976873590 - -43.047511704 -178.520979088 + -43.047511705 -178.520979072 -43.054814790 -178.786794683 -43.607924985 -179.192088058 -44.138124954 -178.790578381 - -44.119981961 -178.251188437 + -44.119981960 -178.251188454 } 83bb31fffffffff { @@ -286584,13 +291228,13 @@ -41.967575127 -178.783129340 -42.520379695 -179.181983142 -43.054814790 -178.786794683 - -43.047511706 -178.520979064 + -43.047511705 -178.520979072 } 83bb34fffffffff { -44.685771653 -177.556091544 -44.136364960 -177.975174959 - -44.119981961 -178.251188462 + -44.119981960 -178.251188454 -44.138124954 -178.790578381 -44.691137215 -179.202522643 -45.216757061 -178.794486261 @@ -290025,11 +294669,11 @@ -41.510112420 25.054704197 -40.981744307 25.108513863 -40.666481904 24.448815183 - -40.808950182 23.972992553 + -40.808950178 23.972992567 -40.915024237 23.772520267 -41.518099809 23.790101101 -41.797431433 24.416200795 - -41.581617354 24.815554203 + -41.581617359 24.815554189 } 83bd69fffffffff { @@ -290057,7 +294701,7 @@ -40.020820433 23.140039420 -40.626980247 23.151867801 -40.915024237 23.772520267 - -40.808950176 23.972992574 + -40.808950178 23.972992567 } 83bd6cfffffffff { @@ -290067,7 +294711,7 @@ -42.338442554 25.667520868 -41.817779180 25.719703135 -41.510112420 25.054704197 - -41.581617362 24.815554183 + -41.581617359 24.815554189 } 83bd6dfffffffff { @@ -290534,11 +295178,11 @@ { -34.660300759 45.306789982 -34.047091569 45.308371960 - -33.823564900 44.916592536 + -33.823564905 44.916592549 -33.745304654 44.708093141 -34.088565858 44.088522226 -34.665623726 44.095629981 - -34.820569954 44.516117819 + -34.820569950 44.516117806 -34.933494719 44.711973241 } 83bdb1fffffffff @@ -290554,7 +295198,7 @@ { -33.162841649 44.699182115 -33.745304654 44.708093141 - -33.823564908 44.916592555 + -33.823564905 44.916592549 -34.047091569 45.308371960 -33.765431481 45.901038319 -33.147524773 45.899123347 @@ -290582,7 +295226,7 @@ { -35.541722767 44.706827355 -34.933494719 44.711973241 - -34.820569947 44.516117800 + -34.820569950 44.516117806 -34.665623726 44.095629981 -35.004783764 43.468780014 -35.576163939 43.474027916 @@ -296774,21 +301418,21 @@ 83c200fffffffff { -39.536697827 -57.739166247 - -39.384917465 -57.322006615 + -39.384917470 -57.322006627 -39.262503904 -57.175626880 - -38.909455358 -57.235002721 + -38.909455369 -57.235002719 -38.763897124 -57.339459501 - -38.697248998 -57.787802417 + -38.697249000 -57.787802404 -38.728564473 -57.997710417 - -39.039569453 -58.220380673 + -39.039569444 -58.220380666 -39.204939359 -58.248034916 - -39.465850150 -57.934805536 + -39.465850143 -57.934805545 } 83c202fffffffff { -38.422883548 -56.978292072 -38.763897124 -57.339459501 - -38.909455374 -57.235002719 + -38.909455369 -57.235002719 -39.262503904 -57.175626880 -39.424439885 -56.642873245 -39.050769570 -56.201986367 @@ -296802,13 +301446,13 @@ -37.880975054 -57.962724213 -38.352175256 -58.295647820 -38.728564473 -57.997710417 - -38.697249001 -57.787802397 + -38.697249000 -57.787802404 } 83c204fffffffff { -39.978312788 -57.779279540 -39.536697827 -57.739166247 - -39.465850139 -57.934805550 + -39.465850143 -57.934805545 -39.204939359 -58.248034916 -39.308444540 -58.803905306 -39.809767865 -58.894807406 @@ -296820,7 +301464,7 @@ -38.910054476 -59.271995359 -39.308444540 -58.803905306 -39.204939359 -58.248034916 - -39.039569439 -58.220380663 + -39.039569444 -58.220380666 -38.728564473 -57.997710417 -38.352175256 -58.295647820 } @@ -296830,10 +301474,75 @@ -39.958428926 -56.546570217 -39.424439885 -56.642873245 -39.262503904 -57.175626880 - -39.384917472 -57.322006633 + -39.384917470 -57.322006627 -39.536697827 -57.739166247 -39.978312788 -57.779279540 } +83c208fffffffff +{ + -37.274854453 -59.831265288 + -37.750542499 -60.176294324 + -38.142120639 -59.874727890 + -38.057881828 -59.231152397 + -37.584404961 -58.892138805 + -37.192962898 -59.190660447 +} +83c209fffffffff +{ + -36.952023003 -60.779744348 + -37.429854484 -61.130701166 + -37.829205462 -60.827537191 + -37.750542499 -60.176294324 + -37.274854453 -59.831265288 + -36.875693051 -60.131523715 +} +83c20afffffffff +{ + -36.714380438 -58.853282578 + -37.192962898 -59.190660447 + -37.584404961 -58.892138805 + -37.497133758 -58.259371403 + -37.259332504 -58.093319127 + -37.083997246 -57.914359816 + -36.629598233 -58.223404618 +} +83c20bfffffffff +{ + -36.394827059 -59.788175730 + -36.875693051 -60.131523715 + -37.274854453 -59.831265288 + -37.192962898 -59.190660447 + -36.714380438 -58.853282578 + -36.315413887 -59.150515042 +} +83c20cfffffffff +{ + -38.142120639 -59.874727890 + -38.612505295 -60.221453873 + -38.805142019 -60.069996342 + -39.007717567 -59.836821760 + -38.910054476 -59.271995359 + -38.441803570 -58.931330636 + -38.057881828 -59.231152397 +} +83c20dfffffffff +{ + -37.829205462 -60.827537191 + -38.301657326 -61.180235061 + -38.693372653 -60.875746279 + -38.612505295 -60.221453873 + -38.142120639 -59.874727890 + -37.750542499 -60.176294324 +} +83c20efffffffff +{ + -37.584404961 -58.892138805 + -38.057881828 -59.231152397 + -38.441803570 -58.931330636 + -38.352175256 -58.295647820 + -37.880975054 -57.962724213 + -37.497133758 -58.259371403 +} 83c210fffffffff { -38.826800473 -55.216224146 @@ -297159,6 +301868,457 @@ -41.556888568 -57.284652251 -42.021615868 -57.321294790 } +83c240fffffffff +{ + -36.439532298 -64.724619060 + -36.919552882 -65.100038090 + -37.343150312 -64.790770666 + -37.286414187 -64.108308958 + -36.808177737 -63.738367816 + -36.384899854 -64.045371077 +} +83c241fffffffff +{ + -36.056349923 -65.718045039 + -36.538080541 -66.098784267 + -36.969856128 -65.788762870 + -36.919552882 -65.100038090 + -36.439532298 -64.724619060 + -36.008111640 -65.032562483 +} +83c242fffffffff +{ + -35.901064903 -63.677290755 + -36.384899854 -64.045371077 + -36.808177737 -63.738367816 + -36.747295379 -63.065680820 + -36.265388566 -62.703184866 + -35.842443106 -63.007755517 +} +83c243fffffffff +{ + -35.522423796 -64.659039268 + -36.008111640 -65.032562483 + -36.439532298 -64.724619060 + -36.384899854 -64.045371077 + -35.901064903 -63.677290755 + -35.470016703 -63.982976764 +} +83c244fffffffff +{ + -37.343150312 -64.790770666 + -37.817366120 -65.168103420 + -38.025912287 -65.012823226 + -38.246504896 -64.784583832 + -38.174410867 -64.171797388 + -37.701904721 -63.799977770 + -37.286414187 -64.108308958 +} +83c245fffffffff +{ + -36.969856128 -65.788762870 + -37.445709864 -66.171448188 + -37.869616359 -65.860099003 + -37.817366120 -65.168103420 + -37.343150312 -64.790770666 + -36.919552882 -65.100038090 +} +83c246fffffffff +{ + -36.808177737 -63.738367816 + -37.286414187 -64.108308958 + -37.701904721 -63.799977770 + -37.638885719 -63.124110862 + -37.162506354 -62.759791694 + -36.747295379 -63.065680820 +} +83c248fffffffff +{ + -34.721393117 -66.643469200 + -35.210555351 -67.027400398 + -35.658435910 -66.718120825 + -35.616723639 -66.026748959 + -35.129259605 -65.647937720 + -34.681817071 -65.955334366 +} +83c249fffffffff +{ + -34.298674094 -67.645093841 + -34.789455423 -68.033964019 + -35.245623517 -67.724298249 + -35.210555351 -67.027400398 + -34.721393117 -66.643469200 + -34.265687538 -66.951450362 +} +83c24afffffffff +{ + -34.188780373 -65.578433247 + -34.681817071 -65.955334366 + -35.129259605 -65.647937720 + -35.083205345 -64.965669153 + -34.592004514 -64.594024078 + -34.145029898 -64.899350776 +} +83c24bfffffffff +{ + -33.770896127 -66.569458305 + -34.265687538 -66.951450362 + -34.721393117 -66.643469200 + -34.681817071 -65.955334366 + -34.188780373 -65.578433247 + -33.733572916 -65.884532720 +} +83c24cfffffffff +{ + -35.658435910 -66.718120825 + -36.141801496 -67.104009163 + -36.581812961 -66.793421280 + -36.538080541 -66.098784267 + -36.056349923 -65.718045039 + -35.616723639 -66.026748959 +} +83c24dfffffffff +{ + -35.245623517 -67.724298249 + -35.730548220 -68.115151508 + -36.178838560 -67.804189271 + -36.141801496 -67.104009163 + -35.658435910 -66.718120825 + -35.210555351 -67.027400398 +} +83c24efffffffff +{ + -35.129259605 -65.647937720 + -35.616723639 -66.026748959 + -36.056349923 -65.718045039 + -36.008111640 -65.032562483 + -35.522423796 -64.659039268 + -35.083205345 -64.965669153 +} +83c250fffffffff +{ + -35.715478408 -61.685461734 + -36.200701582 -62.040478884 + -36.615624305 -61.737188992 + -36.545031692 -61.081594560 + -36.061951339 -60.732362447 + -35.647328530 -61.032909808 +} +83c251fffffffff +{ + -35.355150884 -62.647065662 + -35.842443106 -63.007755517 + -36.265388566 -62.703184866 + -36.200701582 -62.040478884 + -35.715478408 -61.685461734 + -35.292880897 -61.987445180 +} +83c252fffffffff +{ + -35.159145156 -60.685386274 + -35.647328530 -61.032909808 + -36.061951339 -60.732362447 + -35.988084464 -60.087137098 + -35.502180574 -59.745454482 + -35.087872502 -60.043129606 +} +83c253fffffffff +{ + -34.802491497 -61.634177963 + -35.292880897 -61.987445180 + -35.715478408 -61.685461734 + -35.647328530 -61.032909808 + -35.159145156 -60.685386274 + -34.736913978 -60.984641569 +} +83c254fffffffff +{ + -36.615624305 -61.737188992 + -37.095529361 -62.093972604 + -37.502761139 -61.789365427 + -37.429854484 -61.130701166 + -36.952023003 -60.779744348 + -36.545031692 -61.081594560 +} +83c255fffffffff +{ + -36.265388566 -62.703184866 + -36.747295379 -63.065680820 + -37.162506354 -62.759791694 + -37.095529361 -62.093972604 + -36.615624305 -61.737188992 + -36.200701582 -62.040478884 +} +83c256fffffffff +{ + -36.061951339 -60.732362447 + -36.545031692 -61.081594560 + -36.952023003 -60.779744348 + -36.875693051 -60.131523715 + -36.394827059 -59.788175730 + -35.988084464 -60.087137098 +} +83c258fffffffff +{ + -34.047374113 -63.556708433 + -34.541945309 -63.921119153 + -34.980731286 -63.616739839 + -34.924494993 -62.950328556 + -34.431975530 -62.591427915 + -33.993648882 -62.893393649 +} +83c259fffffffff +{ + -33.648487524 -64.529566395 + -34.145029898 -64.899350776 + -34.592004514 -64.594024078 + -34.541945309 -63.921119153 + -34.047374113 -63.556708433 + -33.600899193 -63.859791493 +} +83c25afffffffff +{ + -33.496076828 -62.536265559 + -33.993648882 -62.893393649 + -34.431975530 -62.591427915 + -34.372250307 -61.934865672 + -33.876862546 -61.583332080 + -33.439024482 -61.882734639 +} +83c25bfffffffff +{ + -33.101223895 -63.497190009 + -33.600899193 -63.859791493 + -34.047374113 -63.556708433 + -33.993648882 -62.893393649 + -33.496076828 -62.536265559 + -33.050135460 -62.836944610 +} +83c25cfffffffff +{ + -34.980731286 -63.616739839 + -35.470016703 -63.982976764 + -35.901064903 -63.677290755 + -35.842443106 -63.007755517 + -35.355150884 -62.647065662 + -34.924494993 -62.950328556 +} +83c25dfffffffff +{ + -34.592004514 -64.594024078 + -35.083205345 -64.965669153 + -35.522423796 -64.659039268 + -35.470016703 -63.982976764 + -34.980731286 -63.616739839 + -34.541945309 -63.921119153 +} +83c25efffffffff +{ + -34.431975530 -62.591427915 + -34.924494993 -62.950328556 + -35.355150884 -62.647065662 + -35.292880897 -61.987445180 + -34.802491497 -61.634177963 + -34.372250307 -61.934865672 +} +83c260fffffffff +{ + -39.719036653 -64.641195254 + -39.200410102 -64.481231341 + -38.759748043 -64.945364505 + -38.831414091 -65.573684447 + -39.350472737 -65.746183637 + -39.797494776 -65.277872847 +} +83c261fffffffff +{ + -39.350472737 -65.746183637 + -38.831414091 -65.573684447 + -38.383110619 -66.032994470 + -38.447390543 -66.668600448 + -38.966573645 -66.853562520 + -39.421414914 -66.390509940 +} +83c262fffffffff +{ + -39.121533473 -63.860617244 + -38.608837743 -63.712000858 + -38.174410867 -64.171797388 + -38.246504896 -64.784583832 + -38.759748043 -64.945364505 + -39.200410102 -64.481231341 +} +83c263fffffffff +{ + -38.759748043 -64.945364505 + -38.246504896 -64.784583832 + -38.025912287 -65.012823226 + -37.817366120 -65.168103420 + -37.869616359 -65.860099003 + -38.383110619 -66.032994470 + -38.831414091 -65.573684447 +} +83c264fffffffff +{ + -40.681884551 -64.326999090 + -40.158113546 -64.168001769 + -39.719036653 -64.641195254 + -39.797494776 -65.277872847 + -40.321881412 -65.449845954 + -40.767255792 -64.972210600 +} +83c265fffffffff +{ + -40.321881412 -65.449845954 + -39.797494776 -65.277872847 + -39.350472737 -65.746183637 + -39.421414914 -66.390509940 + -39.946104210 -66.575390713 + -40.399611294 -66.103092061 +} +83c266fffffffff +{ + -40.072331805 -63.539408349 + -39.554438523 -63.392023898 + -39.121533473 -63.860617244 + -39.200410102 -64.481231341 + -39.719036653 -64.641195254 + -40.158113546 -64.168001769 +} +83c268fffffffff +{ + -37.098126250 -67.884775558 + -37.413709881 -68.147692827 + -37.585164946 -68.213793813 + -38.048317441 -67.765185858 + -37.991582926 -67.122732239 + -37.648861113 -66.998993493 + -37.491347282 -66.869378796 + -37.059232241 -67.181284987 +} +83c269fffffffff +{ + -36.689785016 -68.905701824 + -37.163896486 -69.305389451 + -37.634212399 -68.862639884 + -37.585164946 -68.213793813 + -37.413709881 -68.147692827 + -37.098126250 -67.884775558 + -36.657750549 -68.197043901 +} +83c26afffffffff +{ + -36.581812961 -66.793421280 + -37.059232241 -67.181284987 + -37.491347282 -66.869378796 + -37.445709864 -66.171448188 + -36.969856128 -65.788762870 + -36.538080541 -66.098784267 +} +83c26bfffffffff +{ + -36.178838560 -67.804189271 + -36.657750549 -68.197043901 + -37.098126250 -67.884775558 + -37.059232241 -67.181284987 + -36.581812961 -66.793421280 + -36.141801496 -67.104009163 +} +83c26cfffffffff +{ + -38.966573645 -66.853562520 + -38.447390543 -66.668600448 + -37.991582926 -67.122732239 + -38.048317441 -67.765185858 + -38.567311979 -67.962510277 + -39.029823824 -67.505081732 +} +83c26dfffffffff +{ + -38.567311979 -67.962510277 + -38.048317441 -67.765185858 + -37.585164946 -68.213793813 + -37.634212399 -68.862639884 + -38.152701129 -69.072198260 + -38.622711867 -68.620748163 +} +83c26efffffffff +{ + -38.383110619 -66.032994470 + -37.869616359 -65.860099003 + -37.445709864 -66.171448188 + -37.491347282 -66.869378796 + -37.648861113 -66.998993493 + -37.991582926 -67.122732239 + -38.447390543 -66.668600448 +} +83c270fffffffff +{ + -38.046352988 -62.816892417 + -38.360526478 -63.060649678 + -38.529825079 -63.106950194 + -38.956682886 -62.643086273 + -38.870939265 -62.046137600 + -38.533389123 -61.961768436 + -38.376750645 -61.841996829 + -37.977211803 -62.147932256 +} +83c271fffffffff +{ + -37.701904721 -63.799977770 + -38.174410867 -64.171797388 + -38.608837743 -63.712000858 + -38.529825079 -63.106950194 + -38.360526478 -63.060649678 + -38.046352988 -62.816892417 + -37.638885719 -63.124110862 +} +83c272fffffffff +{ + -37.502761139 -61.789365427 + -37.977211803 -62.147932256 + -38.376750645 -61.841996829 + -38.301657326 -61.180235061 + -37.829205462 -60.827537191 + -37.429854484 -61.130701166 +} +83c273fffffffff +{ + -37.162506354 -62.759791694 + -37.638885719 -63.124110862 + -38.046352988 -62.816892417 + -37.977211803 -62.147932256 + -37.502761139 -61.789365427 + -37.095529361 -62.093972604 +} +83c274fffffffff +{ + -39.800881987 -61.702805528 + -39.290141950 -61.578561046 + -38.870939265 -62.046137600 + -38.956682886 -62.643086273 + -39.468541678 -62.779515231 + -39.893595336 -62.306830872 +} +83c275fffffffff +{ + -39.468541678 -62.779515231 + -38.956682886 -62.643086273 + -38.529825079 -63.106950194 + -38.608837743 -63.712000858 + -39.121533473 -63.860617244 + -39.554438523 -63.392023898 +} +83c276fffffffff +{ + -39.197867137 -60.990059389 + -38.693372653 -60.875746279 + -38.301657326 -61.180235061 + -38.376750645 -61.841996829 + -38.533389123 -61.961768436 + -38.870939265 -62.046137600 + -39.290141950 -61.578561046 +} 83c280fffffffff { -36.832545932 -50.871717767 @@ -297354,11 +302514,11 @@ { -35.663185782 -48.975394306 -35.223114570 -48.545165883 - -34.856240609 -48.659666260 + -34.856240618 -48.659666254 -34.702410525 -48.771803873 -34.651477757 -49.478239654 -35.059928531 -49.848965194 - -35.366277256 -49.626071028 + -35.366277247 -49.626071035 -35.549108211 -49.572030365 } 83c299fffffffff @@ -297374,7 +302534,7 @@ { -34.286490117 -48.400559659 -34.702410525 -48.771803873 - -34.856240624 -48.659666252 + -34.856240618 -48.659666254 -35.223114570 -48.545165883 -35.331249330 -47.939307981 -34.883050757 -47.510257646 @@ -297402,7 +302562,7 @@ { -35.981045907 -50.003128226 -35.549108211 -49.572030365 - -35.366277243 -49.626071038 + -35.366277247 -49.626071035 -35.059928531 -49.848965194 -35.002754373 -50.552413586 -35.403718653 -50.922361445 @@ -297484,11 +302644,11 @@ { -37.797320335 -53.338390554 -37.394321841 -52.900881550 - -37.032929341 -52.987798516 + -37.032929350 -52.987798510 -36.883220541 -53.096640379 -36.806862576 -53.789316230 -37.177440109 -54.155978317 - -37.475498629 -53.940218318 + -37.475498621 -53.940218324 -37.655261190 -53.899964647 } 83c2a9fffffffff @@ -297504,7 +302664,7 @@ { -36.505244700 -52.728439973 -36.883220541 -53.096640379 - -37.032929356 -52.987798508 + -37.032929350 -52.987798510 -37.394321841 -52.900881550 -37.531369283 -52.328923531 -37.120185238 -51.891309113 @@ -297532,7 +302692,7 @@ { -38.050145026 -54.337080248 -37.655261190 -53.899964647 - -37.475498616 -53.940218328 + -37.475498621 -53.940218324 -37.177440109 -54.155978317 -37.095066193 -54.843819156 -37.458300279 -55.208706877 @@ -297679,11 +302839,11 @@ -31.799380541 -58.944199694 -31.401266898 -58.592306726 -30.901958998 -58.895229116 - -30.836383309 -59.329719724 + -30.836383311 -59.329719711 -30.856693600 -59.537212635 -31.365153589 -59.870796358 -31.809268473 -59.578160638 - -31.766196180 -59.161956379 + -31.766196178 -59.161956392 } 83c2c9fffffffff { @@ -297711,7 +302871,7 @@ -29.892985339 -59.496606140 -30.405320898 -59.828614271 -30.856693600 -59.537212635 - -30.836383312 -59.329719704 + -30.836383311 -59.329719711 } 83c2ccfffffffff { @@ -297721,7 +302881,7 @@ -32.682212733 -58.993312154 -32.292192232 -58.640957657 -31.799380541 -58.944199694 - -31.766196178 -59.161956398 + -31.766196178 -59.161956392 } 83c2cdfffffffff { @@ -297872,11 +303032,11 @@ -35.811075028 -58.174843570 -35.445873676 -57.818060659 -34.977791605 -58.126425576 - -34.910820108 -58.567821270 + -34.910820110 -58.567821257 -34.937002368 -58.776559977 -35.425378124 -59.110711793 -35.831860307 -58.814757697 - -35.777377109 -58.396062328 + -35.777377107 -58.396062342 } 83c2e1fffffffff { @@ -297904,7 +303064,7 @@ -34.029992937 -58.738685302 -34.523027152 -59.071246380 -34.937002368 -58.776559977 - -34.910820111 -58.567821251 + -34.910820110 -58.567821257 } 83c2e4fffffffff { @@ -297914,7 +303074,7 @@ -36.629598233 -58.223404618 -36.272321370 -57.866138821 -35.811075028 -58.174843570 - -35.777377108 -58.396062348 + -35.777377107 -58.396062342 } 83c2e5fffffffff { @@ -298257,11 +303417,11 @@ -42.959919020 -60.061557101 -42.730408173 -59.365531660 -42.260403136 -59.302079820 - -42.101539009 -59.713698826 + -42.101539014 -59.713698814 -41.966622781 -59.879307480 -42.080325366 -60.488112881 -42.604760939 -60.605610330 - -42.877741331 -60.269654527 + -42.877741326 -60.269654540 } 83c319fffffffff { @@ -298289,13 +303449,13 @@ -41.335404011 -59.179930885 -41.448286136 -59.772296262 -41.966622781 -59.879307480 - -42.101539016 -59.713698808 + -42.101539014 -59.713698814 } 83c31cfffffffff { -43.436435147 -60.136210129 -42.959919020 -60.061557101 - -42.877741322 -60.269654545 + -42.877741326 -60.269654540 -42.604760939 -60.605610330 -42.719025161 -61.231494484 -43.249409072 -61.360177520 @@ -298450,11 +303610,11 @@ -46.580450809 -62.862385458 -46.356488837 -62.080588685 -45.852733722 -61.972573524 - -45.668518852 -62.409875011 + -45.668518858 -62.409874998 -45.527421089 -62.587558521 -45.648936896 -63.278144158 -46.199656475 -63.443447949 - -46.485194430 -63.083188153 + -46.485194424 -63.083188166 } 83c331fffffffff { @@ -298482,13 +303642,13 @@ -44.860009682 -61.765385991 -44.981919944 -62.436162840 -45.527421089 -62.587558521 - -45.668518861 -62.409874992 + -45.668518858 -62.409874998 } 83c334fffffffff { -47.089886549 -62.985411549 -46.580450809 -62.862385458 - -46.485194420 -63.083188171 + -46.485194424 -63.083188166 -46.199656475 -63.443447949 -46.320376926 -64.154603487 -46.876034325 -64.334765317 @@ -298642,11 +303802,11 @@ 83c350fffffffff { -38.046352988 -62.816892417 - -38.360526488 -63.060649686 + -38.360526478 -63.060649678 -38.529825079 -63.106950194 -38.956682886 -62.643086273 -38.870939265 -62.046137600 - -38.533389113 -61.961768429 + -38.533389123 -61.961768436 -38.376750645 -61.841996829 -37.977211803 -62.147932256 } @@ -298665,7 +303825,7 @@ -38.693372653 -60.875746279 -38.301657326 -61.180235061 -38.376750645 -61.841996829 - -38.533389128 -61.961768437 + -38.533389123 -61.961768436 -38.870939265 -62.046137600 -39.290141950 -61.578561046 } @@ -298693,7 +303853,7 @@ -38.174410867 -64.171797388 -38.608837743 -63.712000858 -38.529825079 -63.106950194 - -38.360526474 -63.060649675 + -38.360526478 -63.060649678 -38.046352988 -62.816892417 -37.638885719 -63.124110862 } @@ -298772,11 +303932,11 @@ 83c360fffffffff { -37.098126250 -67.884775558 - -37.413709891 -68.147692835 + -37.413709881 -68.147692827 -37.585164946 -68.213793813 -38.048317441 -67.765185858 -37.991582926 -67.122732239 - -37.648861104 -66.998993485 + -37.648861113 -66.998993493 -37.491347282 -66.869378796 -37.059232241 -67.181284987 } @@ -298795,7 +303955,7 @@ -37.869616359 -65.860099003 -37.445709864 -66.171448188 -37.491347282 -66.869378796 - -37.648861118 -66.998993495 + -37.648861113 -66.998993493 -37.991582926 -67.122732239 -38.447390543 -66.668600448 } @@ -298823,7 +303983,7 @@ -37.163896486 -69.305389451 -37.634212399 -68.862639884 -37.585164946 -68.213793813 - -37.413709877 -68.147692823 + -37.413709881 -68.147692827 -37.098126250 -67.884775558 -36.657750549 -68.197043901 } @@ -299030,11 +304190,11 @@ 83c388fffffffff { -41.156013469 -54.181096217 - -41.410940960 -54.488288573 + -41.410940952 -54.488288564 -41.495885039 -54.703911496 -41.962213647 -54.707511811 -42.173183390 -54.050247314 - -41.998051005 -53.614196696 + -41.998051012 -53.614196705 -41.869404318 -53.458433434 -41.318763980 -53.591451581 } @@ -299044,7 +304204,7 @@ -40.827038788 -55.332801744 -41.285464643 -55.344252641 -41.495885039 -54.703911496 - -41.410940948 -54.488288559 + -41.410940952 -54.488288564 -41.156013469 -54.181096217 -40.609446617 -54.304711052 } @@ -299090,18 +304250,18 @@ -42.587744994 -52.709373437 -42.033291223 -52.852358500 -41.869404318 -53.458433434 - -41.998051015 -53.614196711 + -41.998051012 -53.614196705 -42.173183390 -54.050247314 -42.647393722 -54.045358374 } 83c390fffffffff { -43.799974817 -49.979990775 - -44.068658961 -50.305124525 + -44.068658953 -50.305124515 -44.166825735 -50.528550389 -44.663644924 -50.474440122 -44.864102314 -49.734069382 - -44.661623356 -49.283408864 + -44.661623364 -49.283408874 -44.525932433 -49.118830929 -43.958831343 -49.308675088 } @@ -299111,7 +304271,7 @@ -43.475622215 -51.291944901 -43.965011442 -51.249294462 -44.166825735 -50.528550389 - -44.068658949 -50.305124510 + -44.068658953 -50.305124515 -43.799974817 -49.979990775 -43.235631329 -50.157515113 } @@ -299157,7 +304317,7 @@ -45.253613491 -48.225599019 -44.684131912 -48.428472336 -44.525932433 -49.118830929 - -44.661623367 -49.283408880 + -44.661623364 -49.283408874 -44.864102314 -49.734069382 -45.368209946 -49.667607076 } @@ -300932,11 +306092,11 @@ 83c4d8fffffffff { -48.978726255 -39.366100775 - -49.280590986 -39.715500352 + -49.280590977 -39.715500341 -49.410773717 -39.941199895 -49.949776538 -39.708376901 -50.092417662 -38.780144558 - -49.824421079 -38.330184132 + -49.824421088 -38.330184142 -49.671750129 -38.154774591 -49.096987712 -38.504480917 } @@ -300946,7 +306106,7 @@ -50.356260681 -36.900346278 -49.783791766 -37.270461844 -49.671750129 -38.154774591 - -49.824421092 -38.330184149 + -49.824421088 -38.330184142 -50.092417662 -38.780144558 -50.635169345 -38.523982284 } @@ -300992,7 +306152,7 @@ -48.726226139 -41.056797471 -49.260952042 -40.845872695 -49.410773717 -39.941199895 - -49.280590973 -39.715500336 + -49.280590977 -39.715500341 -48.978726255 -39.366100775 -48.402309596 -39.696260299 } @@ -302452,11 +307612,11 @@ { -32.192562961 -45.124972028 -32.638626373 -45.495553039 - -32.953124219 -45.267958359 + -32.953124208 -45.267958363 -33.137377860 -45.200479195 -33.220249509 -44.575131045 -32.745075934 -44.157363684 - -32.376123526 -44.298526265 + -32.376123537 -44.298526261 -32.218254133 -44.412711309 } 83c5b1fffffffff @@ -302472,7 +307632,7 @@ { -33.604804871 -45.620383655 -33.137377860 -45.200479195 - -32.953124204 -45.267958367 + -32.953124208 -45.267958363 -32.638626373 -45.495553039 -32.606818270 -46.206835156 -33.045618284 -46.577697464 @@ -302500,7 +307660,7 @@ { -31.765033408 -44.042676502 -32.218254133 -44.412711309 - -32.376123542 -44.298526259 + -32.376123537 -44.298526261 -32.745075934 -44.157363684 -32.821319056 -43.524309169 -32.338500400 -43.108987108 @@ -302520,11 +307680,11 @@ -40.268280018 -135.914182066 -40.013027237 -135.173363990 -39.384816511 -135.053239526 - -39.139966855 -135.459602096 + -39.139966863 -135.459602084 -39.015870240 -135.660612150 -39.268074494 -136.392567315 -39.894830284 -136.524684291 - -40.143392965 -136.117670247 + -40.143392957 -136.117670259 } 83c601fffffffff { @@ -302552,13 +307712,13 @@ -38.133332689 -134.820305723 -38.387985985 -135.536892766 -39.015870240 -135.660612150 - -39.139966866 -135.459602078 + -39.139966863 -135.459602084 } 83c604fffffffff { -40.895749248 -136.044816090 -40.268280018 -135.914182066 - -40.143392954 -136.117670265 + -40.143392957 -136.117670259 -39.894830284 -136.524684291 -40.144023503 -137.272256180 -40.769158761 -137.413134747 @@ -303915,11 +309075,11 @@ -31.182039655 -130.626617158 -30.884073019 -129.983094394 -30.282087143 -129.925041386 - -30.081874062 -130.308955402 + -30.081874068 -130.308955390 -29.956937667 -130.487540245 -30.203689601 -131.101621509 -30.829073817 -131.181365126 - -31.079467275 -130.819509816 + -31.079467269 -130.819509828 } 83c6c9fffffffff { @@ -303947,13 +309107,13 @@ -29.089392138 -129.812096387 -29.334572569 -130.413620739 -29.956937667 -130.487540245 - -30.081874071 -130.308955385 + -30.081874068 -130.308955390 } 83c6ccfffffffff { -31.787535900 -130.691952302 -31.182039655 -130.626617158 - -31.079467265 -130.819509833 + -31.079467269 -130.819509828 -30.829073817 -131.181365126 -31.077008685 -131.808284766 -31.705020243 -131.894119692 @@ -304108,11 +309268,11 @@ -35.723042161 -133.101299341 -35.441656241 -132.411086126 -34.821761330 -132.325436452 - -34.599229803 -132.721534920 + -34.599229810 -132.721534908 -34.474530308 -132.911055760 -34.728418231 -133.580711403 -35.359486056 -133.683982433 - -35.609271499 -133.300041704 + -35.609271492 -133.300041716 } 83c6e1fffffffff { @@ -304140,13 +309300,13 @@ -33.590381402 -132.159071217 -33.844514407 -132.814780386 -34.474530308 -132.911055760 - -34.599229813 -132.721534902 + -34.599229810 -132.721534908 } 83c6e4fffffffff { -36.344451611 -133.195698326 -35.723042161 -133.101299341 - -35.609271488 -133.300041721 + -35.609271492 -133.300041716 -35.359486056 -133.683982433 -35.612641797 -134.367863471 -36.244303175 -134.478445069 @@ -304493,11 +309653,11 @@ -44.727468204 -139.122937297 -44.507788520 -138.328183387 -43.881913841 -138.165072488 - -43.615478735 -138.578388486 + -43.615478743 -138.578388474 -43.492046121 -138.791162899 -43.732430009 -139.592352623 -44.344554595 -139.759744693 - -44.591914998 -139.329314562 + -44.591914990 -139.329314574 } 83c719fffffffff { @@ -304525,13 +309685,13 @@ -42.631270692 -137.849326362 -42.876567476 -138.633813456 -43.492046121 -138.791162899 - -43.615478747 -138.578388468 + -43.615478743 -138.578388474 } 83c71cfffffffff { -45.350247713 -139.298628723 -44.727468204 -139.122937297 - -44.591914987 -139.329314580 + -44.591914990 -139.329314574 -44.344554595 -139.759744693 -44.579424999 -140.577808225 -45.187707102 -140.755649739 @@ -304686,11 +309846,11 @@ -49.008576105 -142.792480424 -48.833065927 -141.941817660 -48.220465842 -141.725377874 - -47.933891992 -142.140351544 + -47.933892001 -142.140351532 -47.810835560 -142.364669504 -48.028629888 -143.241636135 -48.616285643 -143.451893209 - -48.863160731 -142.998826008 + -48.863160722 -142.998826020 } 83c731fffffffff { @@ -304718,13 +309878,13 @@ -46.992459504 -141.307093994 -47.217721871 -142.166320971 -47.810835560 -142.364669504 - -47.933892005 -142.140351526 + -47.933892001 -142.140351532 } 83c734fffffffff { -49.615793817 -143.023854943 -49.008576105 -142.792480424 - -48.863160719 -142.998826027 + -48.863160722 -142.998826020 -48.616285643 -143.451893209 -48.826016562 -144.346618793 -49.407763191 -144.569213191 @@ -307148,11 +312308,11 @@ 83c8d8fffffffff { -35.127925764 99.292726427 - -34.812202536 99.037586821 + -34.812202545 99.037586828 -34.630490279 98.946953242 -34.593063940 98.268467311 -35.103491372 97.854362300 - -35.469268802 98.035351906 + -35.469268793 98.035351899 -35.629704316 98.160784618 -35.619111554 98.921210096 } @@ -307162,7 +312322,7 @@ -36.123995836 97.007015749 -36.120881726 97.774316359 -35.629704316 98.160784618 - -35.469268787 98.035351896 + -35.469268793 98.035351899 -35.103491372 97.854362300 -35.061774885 97.163584264 } @@ -307208,7 +312368,7 @@ -34.153720241 100.014111531 -34.120207871 99.348013614 -34.630490279 98.946953242 - -34.812202550 99.037586832 + -34.812202545 99.037586828 -35.127925764 99.292726427 -35.110217083 100.045808368 } @@ -308668,11 +313828,11 @@ { -34.150780039 120.366600552 -33.810621789 119.853354270 - -33.980645400 119.460004814 + -33.980645398 119.460004828 -34.024026767 119.233476987 -34.539622000 119.085393194 -34.926459999 119.628145389 - -34.835579669 120.087537009 + -34.835579671 120.087536996 -34.750473564 120.287609897 } 83c9b1fffffffff @@ -308692,7 +313852,7 @@ -33.133336870 118.852607998 -33.640270140 118.702977948 -34.024026767 119.233476987 - -33.980645395 119.460004834 + -33.980645398 119.460004828 } 83c9b3fffffffff { @@ -308716,7 +313876,7 @@ { -35.094546486 120.812920259 -34.750473564 120.287609897 - -34.835579673 120.087536989 + -34.835579671 120.087536996 -34.926459999 119.628145389 -35.450652697 119.481835159 -35.840280142 120.037337427 @@ -310249,11 +315409,11 @@ 83cad8fffffffff { -48.629648466 61.723170462 - -49.004765582 61.801794309 + -49.004765570 61.801794307 -49.200840783 61.784834028 -49.471061884 62.536964302 -49.144230585 63.332763756 - -48.749932554 63.351306515 + -48.749932565 63.351306517 -48.561927004 63.308264308 -48.315682025 62.453528175 } @@ -310263,7 +315423,7 @@ -48.471845105 64.898948200 -48.236590266 64.036040687 -48.561927004 63.308264308 - -48.749932571 63.351306517 + -48.749932565 63.351306517 -49.144230585 63.332763756 -49.405501542 64.103747299 } @@ -310309,7 +315469,7 @@ -49.236415543 60.252675544 -49.515010450 60.985197415 -49.200840783 61.784834028 - -49.004765565 61.801794306 + -49.004765570 61.801794307 -48.629648466 61.723170462 -48.372680183 60.877848692 } @@ -311769,11 +316929,11 @@ { -38.469605909 42.205926388 -39.014434073 42.207308346 - -39.160364709 42.642717477 + -39.160364702 42.642717465 -39.277650831 42.840136300 -39.041031294 43.451638961 -38.450698120 43.464570803 - -38.217983935 43.069314323 + -38.217983942 43.069314335 -38.144366219 42.853348566 } 83cbb1fffffffff @@ -311789,7 +316949,7 @@ { -39.861850651 42.823304335 -39.277650831 42.840136300 - -39.160364700 42.642717459 + -39.160364702 42.642717465 -39.014434073 42.207308346 -39.334135359 41.552494076 -39.872340761 41.551804406 @@ -311817,7 +316977,7 @@ { -37.593100752 42.849954763 -38.144366219 42.853348566 - -38.217983946 43.069314341 + -38.217983942 43.069314335 -38.450698120 43.464570803 -38.205052795 44.074231326 -37.608782888 44.083330234 @@ -311835,11 +316995,11 @@ 83cc00fffffffff { -43.532141725 83.418176376 - -43.152203164 83.252097304 + -43.152203175 83.252097309 -42.961685488 83.171686500 -42.849228651 82.337627005 -43.307321120 81.735629122 - -43.689400315 81.892552388 + -43.689400304 81.892552384 -43.880798192 81.969872073 -43.995899433 82.817600107 } @@ -311849,7 +317009,7 @@ -44.209998968 80.509351133 -44.336604327 81.353594522 -43.880798192 81.969872073 - -43.689400298 81.892552381 + -43.689400304 81.892552384 -43.307321120 81.735629122 -43.185086777 80.895023927 } @@ -311895,7 +317055,7 @@ -42.599408576 84.587096827 -42.496407912 83.760505980 -42.961685488 83.171686500 - -43.152203181 83.252097312 + -43.152203175 83.252097309 -43.532141725 83.418176376 -43.635753973 84.268210953 } @@ -312601,11 +317761,11 @@ 83cc68fffffffff { -47.713896437 70.319211767 - -47.316606575 70.268886771 + -47.316606587 70.268886773 -47.126304282 70.210568275 -46.926754845 69.338931082 -47.294883536 68.635229562 - -47.675274562 68.745211489 + -47.675274550 68.745211488 -47.873717071 68.762798867 -48.095466203 69.572999323 } @@ -312615,7 +317775,7 @@ -48.011188120 67.211996072 -48.243288591 68.007433140 -47.873717071 68.762798867 - -47.675274544 68.745211486 + -47.675274550 68.745211488 -47.294883536 68.635229562 -47.084010653 67.767240766 } @@ -312661,18 +317821,18 @@ -46.935541921 71.780978585 -46.747365646 70.907023318 -47.126304282 70.210568275 - -47.316606593 70.268886773 + -47.316606587 70.268886773 -47.713896437 70.319211767 -47.924873432 71.143061353 } 83cc70fffffffff { -45.824982712 77.068205671 - -45.432731928 76.954964947 + -45.432731939 76.954964950 -45.241618492 76.883977144 -45.087962011 76.020481250 -45.505393873 75.361419869 - -45.888066743 75.498016515 + -45.888066731 75.498016512 -46.084859662 75.547787337 -46.253374161 76.389632054 } @@ -312682,7 +317842,7 @@ -46.322960206 74.023165362 -46.502906956 74.855958310 -46.084859662 75.547787337 - -45.888066725 75.498016510 + -45.888066731 75.498016512 -45.505393873 75.361419869 -45.340771989 74.495981526 } @@ -312728,7 +317888,7 @@ -44.957696898 78.392486710 -44.814843906 77.532132150 -45.241618492 76.883977144 - -45.432731945 76.954964952 + -45.432731939 76.954964950 -45.824982712 77.068205671 -45.981858954 77.917849471 } @@ -314563,11 +319723,11 @@ 83cd88fffffffff { -40.918874617 89.263654715 - -40.557017923 89.056651839 + -40.557017934 89.056651845 -40.368368694 88.970115109 -40.289639158 88.180782711 -40.777201287 87.641999470 - -41.156062039 87.812610108 + -41.156062028 87.812610102 -41.339000640 87.911674748 -41.404688868 88.743817054 } @@ -314577,7 +319737,7 @@ -41.743249496 86.541967783 -41.819620342 87.375298302 -41.339000640 87.911674748 - -41.156062022 87.812610099 + -41.156062028 87.812610102 -40.777201287 87.641999470 -40.690420558 86.842907216 } @@ -314623,18 +319783,18 @@ -39.947221847 90.273783694 -39.876138184 89.494814024 -40.368368694 88.970115109 - -40.557017940 89.056651848 + -40.557017934 89.056651845 -40.918874617 89.263654715 -40.974076408 90.093641542 } 83cd90fffffffff { -38.084037279 94.556057297 - -37.744189289 94.319856893 + -37.744189299 94.319856900 -37.558528036 94.230109740 -37.504771054 93.494432686 -38.009623332 93.019566254 - -38.382944065 93.197826181 + -38.382944055 93.197826174 -38.555255808 93.312723232 -38.578533443 94.113791192 } @@ -314644,7 +319804,7 @@ -39.014788311 92.048618277 -39.047302157 92.854321439 -38.555255808 93.312723232 - -38.382944049 93.197826172 + -38.382944055 93.197826174 -38.009623332 93.019566254 -37.949740054 92.272298742 } @@ -314690,7 +319850,7 @@ -37.099588897 95.414832968 -37.051541270 94.691061612 -37.558528036 94.230109740 - -37.744189304 94.319856903 + -37.744189299 94.319856900 -38.084037279 94.556057297 -38.098391292 95.351780540 } @@ -316465,11 +321625,11 @@ 83ced8fffffffff { -35.330175752 -77.788686387 - -34.989924237 -77.585396291 + -34.989924247 -77.585396297 -34.833196689 -77.441080855 -34.334491126 -77.749587074 -34.304352420 -78.491160515 - -34.617769421 -78.781709560 + -34.617769411 -78.781709554 -34.786997068 -78.887166005 -35.315683122 -78.495761361 } @@ -316479,7 +321639,7 @@ -34.230365517 -79.978316335 -34.763998362 -79.595788227 -34.786997068 -78.887166005 - -34.617769406 -78.781709550 + -34.617769411 -78.781709554 -34.304352420 -78.491160515 -33.797707425 -78.797906049 } @@ -316525,7 +321685,7 @@ -35.346705515 -76.390418249 -34.856057050 -76.700480238 -34.833196689 -77.441080855 - -34.989924252 -77.585396300 + -34.989924247 -77.585396297 -35.330175752 -77.788686387 -35.853531381 -77.388586052 } @@ -317985,11 +323145,11 @@ { -50.145573973 -65.402694162 -49.612025353 -65.231535033 - -49.398802139 -65.693639223 + -49.398802147 -65.693639212 -49.251216867 -65.883838506 -49.374066510 -66.674537047 -49.945213719 -66.905675698 - -50.243974797 -66.520608050 + -50.243974788 -66.520608062 -50.354144093 -66.287874472 } 83cfb1fffffffff @@ -318009,7 +323169,7 @@ -48.558604636 -64.904568691 -48.683763986 -65.671368147 -49.251216867 -65.883838506 - -49.398802151 -65.693639205 + -49.398802147 -65.693639212 } 83cfb3fffffffff { @@ -318033,7 +323193,7 @@ { -50.891856306 -66.479418501 -50.354144093 -66.287874472 - -50.243974784 -66.520608067 + -50.243974788 -66.520608062 -49.945213719 -66.905675698 -50.065166920 -67.721132286 -50.639555781 -67.972223269 @@ -319567,11 +324727,11 @@ 83d0d8fffffffff { -54.626235786 17.076773184 - -55.013320127 17.040095708 + -55.013320116 17.040095709 -55.195246239 17.099156019 -55.428179536 18.076890420 -55.110292586 18.853559158 - -54.750693951 18.716517607 + -54.750693963 18.716517607 -54.558074268 18.728306618 -54.304396056 17.928459759 } @@ -319581,7 +324741,7 @@ -54.468963096 20.349868669 -54.227372865 19.555766884 -54.558074268 18.728306618 - -54.750693968 18.716517609 + -54.750693963 18.716517607 -55.110292586 18.853559158 -55.328118903 19.833465031 } @@ -319627,7 +324787,7 @@ -55.255364289 15.321858781 -55.503560848 16.295385970 -55.195246239 17.099156019 - -55.013320110 17.040095710 + -55.013320116 17.040095709 -54.626235786 17.076773184 -54.360073686 16.272434812 } @@ -320583,11 +325743,11 @@ -37.244210437 20.097606558 -37.862301963 20.082790367 -38.184010825 20.690968183 - -37.985728320 21.100841592 + -37.985728326 21.100841580 -37.916465818 21.333894105 -37.359079368 21.397519691 -37.008693496 20.765852142 - -37.147092218 20.302822990 + -37.147092212 20.302823002 } 83d169fffffffff { @@ -320615,7 +325775,7 @@ -38.810570189 21.909019357 -38.260378581 21.971308705 -37.916465818 21.333894105 - -37.985728329 21.100841574 + -37.985728326 21.100841580 } 83d16cfffffffff { @@ -320625,7 +325785,7 @@ -36.295233988 19.515077007 -36.914832691 19.495388837 -37.244210437 20.097606558 - -37.147092210 20.302823009 + -37.147092212 20.302823002 } 83d16dfffffffff { @@ -326765,11 +331925,11 @@ -53.343158112 -175.097422378 -52.889916445 -174.639962894 -52.384250471 -175.142213583 - -52.349359076 -175.774519506 + -52.349359077 -175.774519487 -52.375443094 -176.074503066 -52.918312481 -176.507984449 -53.381075124 -176.028493259 - -53.325468567 -175.418830257 + -53.325468566 -175.418830276 } 83d569fffffffff { @@ -326797,13 +331957,13 @@ -51.360376196 -176.118866440 -51.905853663 -176.545027368 -52.375443094 -176.074503066 - -52.349359078 -175.774519478 + -52.349359077 -175.774519487 } 83d56cfffffffff { -53.842876420 -174.587088182 -53.343158112 -175.097422378 - -53.325468567 -175.418830285 + -53.325468566 -175.418830276 -53.381075124 -176.028493259 -53.921038438 -176.469549332 -54.376790634 -175.980743697 @@ -327274,11 +332434,11 @@ { -52.900149014 -146.086315654 -52.311326398 -145.804375204 - -52.006722063 -146.212987300 + -52.006722070 -146.212987286 -51.883427752 -146.447815186 -52.067996397 -147.405636910 -52.622492990 -147.667365371 - -52.870217789 -147.194241876 + -52.870217782 -147.194241891 -53.024364257 -146.992288413 } 83d5b1fffffffff @@ -327298,7 +332458,7 @@ -51.127122714 -145.260308340 -51.321621638 -146.199991259 -51.883427752 -146.447815186 - -52.006722075 -146.212987280 + -52.006722070 -146.212987286 } 83d5b3fffffffff { @@ -327322,7 +332482,7 @@ { -53.605715195 -147.291683206 -53.024364257 -146.992288413 - -52.870217778 -147.194241898 + -52.870217782 -147.194241891 -52.622492990 -147.667365371 -52.796587553 -148.643085037 -53.343384805 -148.919123456 @@ -327340,21 +332500,21 @@ 83d600fffffffff { -50.463443556 36.910711463 - -50.143581839 37.155551937 + -50.143581848 37.155551930 -49.977260067 37.174280193 - -49.729485509 36.777710225 + -49.729485516 36.777710237 -49.665608377 36.539566872 - -49.829344196 36.050270894 + -49.829344191 36.050270909 -49.955092899 35.880267770 - -50.306661640 35.968054190 + -50.306661630 35.968054187 -50.449601984 36.102723628 - -50.502579452 36.655962683 + -50.502579451 36.655962666 } 83d602fffffffff { -49.223071652 36.557500257 -49.665608377 36.539566872 - -49.729485520 36.777710243 + -49.729485516 36.777710237 -49.977260067 37.174280193 -49.846191643 37.830904342 -49.341095976 37.882417388 @@ -327368,13 +332528,13 @@ -49.268689394 35.111664965 -49.801739533 35.235832122 -49.955092899 35.880267770 - -49.829344188 36.050270916 + -49.829344191 36.050270909 } 83d604fffffffff { -50.826412710 37.310373203 -50.463443556 36.910711463 - -50.502579450 36.655962658 + -50.502579451 36.655962666 -50.449601984 36.102723628 -50.798362546 35.672940034 -51.233617034 36.083749359 @@ -327386,7 +332546,7 @@ -50.710755838 34.832113375 -50.798362546 35.672940034 -50.449601984 36.102723628 - -50.306661625 35.968054186 + -50.306661630 35.968054187 -49.955092899 35.880267770 -49.801739533 35.235832122 } @@ -327396,10 +332556,75 @@ -50.214791889 38.443333698 -49.846191643 37.830904342 -49.977260067 37.174280193 - -50.143581853 37.155551926 + -50.143581848 37.155551930 -50.463443556 36.910711463 -50.826412710 37.310373203 } +83d608fffffffff +{ + -49.680821430 32.732161907 + -50.225438997 32.837255892 + -50.392813257 33.505025378 + -50.017812295 34.052906433 + -49.478946192 33.937946255 + -49.309334071 33.284789877 +} +83d609fffffffff +{ + -49.873452491 31.494091926 + -50.423740032 31.588643834 + -50.598730800 32.267756080 + -50.225438997 32.837255892 + -49.680821430 32.732161907 + -49.503826224 32.067925920 +} +83d60afffffffff +{ + -48.764540676 33.177711462 + -49.309334071 33.284789877 + -49.478946192 33.937946255 + -49.106069604 34.469792092 + -48.836833998 34.411323861 + -48.610983945 34.423906457 + -48.395208293 33.714288351 +} +83d60bfffffffff +{ + -48.953262509 31.970816075 + -49.503826224 32.067925920 + -49.680821430 32.732161907 + -49.309334071 33.284789877 + -48.764540676 33.177711462 + -48.585468098 32.527798813 +} +83d60cfffffffff +{ + -50.392813257 33.505025378 + -50.931317629 33.618296898 + -51.010904393 33.954205784 + -51.058700795 34.379944205 + -50.710755838 34.832113375 + -50.177977690 34.709096843 + -50.017812295 34.052906433 +} +83d60dfffffffff +{ + -50.598730800 32.267756080 + -51.142886750 32.370584228 + -51.308098057 33.053547091 + -50.931317629 33.618296898 + -50.392813257 33.505025378 + -50.225438997 32.837255892 +} +83d60efffffffff +{ + -49.478946192 33.937946255 + -50.017812295 34.052906433 + -50.177977690 34.709096843 + -49.801739533 35.235832122 + -49.268689394 35.111664965 + -49.106069604 34.469792092 +} 83d610fffffffff { -48.688693830 38.585164670 @@ -327725,6 +332950,457 @@ -51.801024378 39.385679738 -52.171783164 39.842817237 } +83d640fffffffff +{ + -51.314561448 26.984796539 + -51.880203894 27.038605168 + -52.079499700 27.765602709 + -51.714207480 28.422643703 + -51.153728715 28.355478907 + -50.953361412 27.644435999 +} +83d641fffffffff +{ + -51.461617305 25.581314618 + -52.032249217 25.621035475 + -52.241173778 26.357777104 + -51.880203894 27.038605168 + -51.314561448 26.984796539 + -51.104877240 26.264058300 +} +83d642fffffffff +{ + -50.386739025 27.585674800 + -50.953361412 27.644435999 + -51.153728715 28.355478907 + -50.788666512 28.992162972 + -50.227356926 28.920771061 + -50.025783902 28.225140545 +} +83d643fffffffff +{ + -50.533101882 26.218627866 + -51.104877240 26.264058300 + -51.314561448 26.984796539 + -50.953361412 27.644435999 + -50.386739025 27.585674800 + -50.176145989 26.880422551 +} +83d644fffffffff +{ + -52.079499700 27.765602709 + -52.638825856 27.828084065 + -52.734087018 28.194824610 + -52.804220235 28.650385433 + -52.458477604 29.215149743 + -51.904320063 29.139307712 + -51.714207480 28.422643703 +} +83d645fffffffff +{ + -52.241173778 26.357777104 + -52.805501802 26.406125909 + -53.003879648 27.149636714 + -52.638825856 27.828084065 + -52.079499700 27.765602709 + -51.880203894 27.038605168 +} +83d646fffffffff +{ + -51.153728715 28.355478907 + -51.714207480 28.422643703 + -51.904320063 29.139307712 + -51.535310452 29.772769211 + -50.980147811 29.692984555 + -50.788666512 28.992162972 +} +83d648fffffffff +{ + -50.782730801 23.390657808 + -51.364245315 23.407365924 + -51.593849008 24.145585853 + -51.242186197 24.851489169 + -50.665439389 24.820081465 + -50.435559840 24.097299366 +} +83d649fffffffff +{ + -50.883947342 21.931160422 + -51.470003270 21.932514820 + -51.710197195 22.678350426 + -51.364245315 23.407365924 + -50.782730801 23.390657808 + -50.542593760 22.660126329 +} +83d64afffffffff +{ + -49.852902579 24.073894867 + -50.435559840 24.097299366 + -50.665439389 24.820081465 + -50.313072405 25.504298933 + -49.735362613 25.466955279 + -49.505049091 24.759167205 +} +83d64bfffffffff +{ + -49.955199730 22.651296161 + -50.542593760 22.660126329 + -50.782730801 23.390657808 + -50.435559840 24.097299366 + -49.852902579 24.073894867 + -49.612651268 23.358264565 +} +83d64cfffffffff +{ + -51.593849008 24.145585853 + -52.169273769 24.170499245 + -52.388270275 24.916306617 + -52.032249217 25.621035475 + -51.461617305 25.581314618 + -51.242186197 24.851489169 +} +83d64dfffffffff +{ + -51.710197195 22.678350426 + -52.290195351 22.687756480 + -52.519700922 23.441860134 + -52.169273769 24.170499245 + -51.593849008 24.145585853 + -51.364245315 23.407365924 +} +83d64efffffffff +{ + -50.665439389 24.820081465 + -51.242186197 24.851489169 + -51.461617305 25.581314618 + -51.104877240 26.264058300 + -50.533101882 26.218627866 + -50.313072405 25.504298933 +} +83d650fffffffff +{ + -49.301151122 29.462881190 + -49.862972142 29.538085392 + -50.055941291 30.223624942 + -49.688674126 30.819040092 + -49.132428433 30.732551665 + -48.937870168 30.061754494 +} +83d651fffffffff +{ + -49.458513502 28.161889019 + -50.025783902 28.225140545 + -50.227356926 28.920771061 + -49.862972142 29.538085392 + -49.301151122 29.462881190 + -49.098256649 28.782137979 +} +83d652fffffffff +{ + -48.375853911 29.983115295 + -48.937870168 30.061754494 + -49.132428433 30.732551665 + -48.766642891 31.310316731 + -48.210313888 31.220995185 + -48.014082256 30.564421385 +} +83d653fffffffff +{ + -48.530666834 28.714817530 + -49.098256649 28.782137979 + -49.301151122 29.462881190 + -48.937870168 30.061754494 + -48.375853911 29.983115295 + -48.171539921 29.316751903 +} +83d654fffffffff +{ + -50.055941291 30.223624942 + -50.611799223 30.306945781 + -50.794823284 30.997098860 + -50.423740032 31.588643834 + -49.873452491 31.494091926 + -49.688674126 30.819040092 +} +83d655fffffffff +{ + -50.227356926 28.920771061 + -50.788666512 28.992162972 + -50.980147811 29.692984555 + -50.611799223 30.306945781 + -50.055941291 30.223624942 + -49.862972142 29.538085392 +} +83d656fffffffff +{ + -49.132428433 30.732551665 + -49.688674126 30.819040092 + -49.873452491 31.494091926 + -49.503826224 32.067925920 + -48.953262509 31.970816075 + -48.766642891 31.310316731 +} +83d658fffffffff +{ + -48.804482750 26.087714783 + -49.382800129 26.130482850 + -49.603572344 26.829792844 + -49.246881475 27.471618214 + -48.673851210 27.416255568 + -48.452210549 26.731496503 +} +83d659fffffffff +{ + -48.921618849 24.729622705 + -49.505049091 24.759167205 + -49.735362613 25.466955279 + -49.382800129 26.130482850 + -48.804482750 26.087714783 + -48.573596100 25.394481495 +} +83d65afffffffff +{ + -47.873636514 26.683772762 + -48.452210549 26.731496503 + -48.673851210 27.416255568 + -48.317883872 28.039037536 + -47.744734359 27.979368251 + -47.522117423 27.308702994 +} +83d65bfffffffff +{ + -47.989757999 25.359308114 + -48.573596100 25.394481495 + -48.804482750 26.087714783 + -48.452210549 26.731496503 + -47.873636514 26.683772762 + -47.642055827 26.004661554 +} +83d65cfffffffff +{ + -49.603572344 26.829792844 + -50.176145989 26.880422551 + -50.386739025 27.585674800 + -50.025783902 28.225140545 + -49.458513502 28.161889019 + -49.246881475 27.471618214 +} +83d65dfffffffff +{ + -49.735362613 25.466955279 + -50.313072405 25.504298933 + -50.533101882 26.218627866 + -50.176145989 26.880422551 + -49.603572344 26.829792844 + -49.382800129 26.130482850 +} +83d65efffffffff +{ + -48.673851210 27.416255568 + -49.246881475 27.471618214 + -49.458513502 28.161889019 + -49.098256649 28.782137979 + -48.530666834 28.714817530 + -48.317883872 28.039037536 +} +83d660fffffffff +{ + -53.907955679 30.294393937 + -53.422172957 29.923689661 + -53.290259938 28.995395021 + -53.642414516 28.411218346 + -54.136836397 28.762647444 + -54.270498510 29.718033669 +} +83d661fffffffff +{ + -54.136836397 28.762647444 + -53.642414516 28.411218346 + -53.498084502 27.475178652 + -53.845867907 26.863748774 + -54.348655901 27.194370090 + -54.495342288 28.157734741 +} +83d662fffffffff +{ + -53.066350485 30.480887247 + -52.588725438 30.117822317 + -52.458477604 29.215149743 + -52.804220235 28.650385433 + -53.290259938 28.995395021 + -53.422172957 29.923689661 +} +83d663fffffffff +{ + -53.290259938 28.995395021 + -52.804220235 28.650385433 + -52.734087018 28.194824610 + -52.638825856 27.828084065 + -53.003879648 27.149636714 + -53.498084502 27.475178652 + -53.642414516 28.411218346 +} +83d664fffffffff +{ + -54.513935340 31.638124139 + -54.029073243 31.240549436 + -53.907955679 30.294393937 + -54.270498510 29.718033669 + -54.764472545 30.096645972 + -54.886815178 31.071125480 +} +83d665fffffffff +{ + -54.764472545 30.096645972 + -54.270498510 29.718033669 + -54.136836397 28.762647444 + -54.495342288 28.157734741 + -54.998182220 28.515728030 + -55.133688198 29.499802760 +} +83d666fffffffff +{ + -53.663219462 31.788759187 + -53.186300108 31.400301294 + -53.066350485 30.480887247 + -53.422172957 29.923689661 + -53.907955679 30.294393937 + -54.029073243 31.240549436 +} +83d668fffffffff +{ + -53.312187423 24.221949944 + -53.690704047 24.239600631 + -53.860955885 24.334745527 + -54.031378632 25.282386600 + -53.688691399 25.921220575 + -53.353613188 25.717042586 + -53.165744731 25.703033119 + -52.957410861 24.949759314 +} +83d669fffffffff +{ + -53.442078948 22.707188914 + -54.013771481 22.717229081 + -54.197804666 23.668492592 + -53.860955885 24.334745527 + -53.690704047 24.239600631 + -53.312187423 24.221949944 + -53.093441664 23.459669656 +} +83d66afffffffff +{ + -52.388270275 24.916306617 + -52.957410861 24.949759314 + -53.165744731 25.703033119 + -52.805501802 26.406125909 + -52.241173778 26.357777104 + -52.032249217 25.621035475 +} +83d66bfffffffff +{ + -52.519700922 23.441860134 + -53.093441664 23.459669656 + -53.312187423 24.221949944 + -52.957410861 24.949759314 + -52.388270275 24.916306617 + -52.169273769 24.170499245 +} +83d66cfffffffff +{ + -54.348655901 27.194370090 + -53.845867907 26.863748774 + -53.688691399 25.921220575 + -54.031378632 25.282386600 + -54.542209012 25.590671899 + -54.702372134 26.560627805 +} +83d66dfffffffff +{ + -54.542209012 25.590671899 + -54.031378632 25.282386600 + -53.860955885 24.334745527 + -54.197804666 23.668492592 + -54.716301711 23.952935171 + -54.890360450 24.927962960 +} +83d66efffffffff +{ + -53.498084502 27.475178652 + -53.003879648 27.149636714 + -52.805501802 26.406125909 + -53.165744731 25.703033119 + -53.353613188 25.717042586 + -53.688691399 25.921220575 + -53.845867907 26.863748774 +} +83d670fffffffff +{ + -51.716684317 30.478595928 + -52.082855698 30.537351082 + -52.239650867 30.657056504 + -52.358481742 31.551184026 + -52.006708581 32.065254281 + -51.699018565 31.816532923 + -51.517613959 31.783336150 + -51.344538314 31.088768825 +} +83d671fffffffff +{ + -51.904320063 29.139307712 + -52.458477604 29.215149743 + -52.588725438 30.117822317 + -52.239650867 30.657056504 + -52.082855698 30.537351082 + -51.716684317 30.478595928 + -51.535310452 29.772769211 +} +83d672fffffffff +{ + -50.794823284 30.997098860 + -51.344538314 31.088768825 + -51.517613959 31.783336150 + -51.142886750 32.370584228 + -50.598730800 32.267756080 + -50.423740032 31.588643834 +} +83d673fffffffff +{ + -50.980147811 29.692984555 + -51.535310452 29.772769211 + -51.716684317 30.478595928 + -51.344538314 31.088768825 + -50.794823284 30.997098860 + -50.611799223 30.306945781 +} +83d674fffffffff +{ + -52.574792760 33.344909809 + -52.114567939 32.949912645 + -52.006708581 32.065254281 + -52.358481742 31.551184026 + -52.827487563 31.930903713 + -52.935946075 32.840422455 +} +83d675fffffffff +{ + -52.827487563 31.930903713 + -52.358481742 31.551184026 + -52.239650867 30.657056504 + -52.588725438 30.117822317 + -53.066350485 30.480887247 + -53.186300108 31.400301294 +} +83d676fffffffff +{ + -51.760702673 33.439270208 + -51.308098057 33.053547091 + -51.142886750 32.370584228 + -51.517613959 31.783336150 + -51.699018565 31.816532923 + -52.006708581 32.065254281 + -52.114567939 32.949912645 +} 83d680fffffffff { -45.007831770 40.754449164 @@ -327919,12 +333595,12 @@ 83d698fffffffff { -43.153287597 41.473344646 - -42.591009404 41.499118735 - -42.351320442 41.101695159 + -42.591009404 41.499118736 + -42.351320446 41.101695173 -42.281729009 40.878228744 -42.583574626 40.202153480 -43.092852320 40.197041574 - -43.231071157 40.647389661 + -43.231071153 40.647389648 -43.351623043 40.845683193 } 83d699fffffffff @@ -327940,8 +333616,8 @@ { -41.765392628 40.881105169 -42.281729009 40.878228744 - -42.351320450 41.101695178 - -42.591009404 41.499118735 + -42.351320446 41.101695173 + -42.591009404 41.499118736 -42.383464711 42.125337574 -41.814410868 42.146925207 -41.457139817 41.549708776 @@ -327968,7 +333644,7 @@ { -43.907012337 40.815657116 -43.351623043 40.845683193 - -43.231071151 40.647389641 + -43.231071153 40.647389648 -43.092852320 40.197041574 -43.388038372 39.513541550 -43.890155071 39.506131998 @@ -327976,7 +333652,7 @@ } 83d69efffffffff { - -42.591009404 41.499118735 + -42.591009404 41.499118736 -43.153287597 41.473344646 -43.512115311 42.081337242 -43.306239398 42.717798372 @@ -328050,11 +333726,11 @@ { -46.969102129 39.364436558 -46.438241172 39.404673301 - -46.193617909 39.006697600 + -46.193617912 39.006697614 -46.127293741 38.775796445 -46.401823792 38.070512836 -46.874074370 38.058075431 - -47.006133371 38.523167062 + -47.006133367 38.523167049 -47.128953006 38.721490667 } 83d6a9fffffffff @@ -328070,7 +333746,7 @@ { -45.647730271 38.785762031 -46.127293741 38.775796445 - -46.193617916 39.006697620 + -46.193617912 39.006697614 -46.438241172 39.404673301 -46.269309794 40.046681909 -45.731207405 40.082366603 @@ -328098,7 +333774,7 @@ { -47.652530263 38.676640516 -47.128953006 38.721490667 - -47.006133365 38.523167042 + -47.006133367 38.523167049 -46.874074370 38.058075431 -47.141146898 37.345438404 -47.606052852 37.330465878 @@ -328245,11 +333921,11 @@ -44.783476035 28.963384948 -44.286073779 29.005800092 -44.010719852 28.322061269 - -44.159095171 27.837057856 + -44.159095166 27.837057870 -44.273079581 27.643954541 -44.855020144 27.697312516 -45.089237665 28.336567375 - -44.858104112 28.720032355 + -44.858104116 28.720032341 } 83d6c9fffffffff { @@ -328277,7 +333953,7 @@ -43.443252764 26.962608176 -44.029570314 27.009369142 -44.273079581 27.643954541 - -44.159095164 27.837057877 + -44.159095166 27.837057870 } 83d6ccfffffffff { @@ -328287,7 +333963,7 @@ -45.540089585 29.611231458 -45.050559063 29.651735355 -44.783476035 28.963384948 - -44.858104120 28.720032335 + -44.858104116 28.720032341 } 83d6cdfffffffff { @@ -328438,11 +334114,11 @@ -47.712764345 33.035609017 -47.246856940 33.065197296 -47.014027814 32.362776671 - -47.169682349 31.873048907 + -47.169682345 31.873048921 -47.290278289 31.690100820 -47.846390031 31.781951805 -48.034921560 32.428424325 - -47.791149189 32.790362517 + -47.791149194 32.790362502 } 83d6e1fffffffff { @@ -328470,7 +334146,7 @@ -46.530830215 30.962741896 -47.092305178 31.047251772 -47.290278289 31.690100820 - -47.169682343 31.873048929 + -47.169682345 31.873048921 } 83d6e4fffffffff { @@ -328480,7 +334156,7 @@ -48.395208293 33.714288351 -47.937066020 33.741709279 -47.712764345 33.035609017 - -47.791149197 32.790362497 + -47.791149194 32.790362502 } 83d6e5fffffffff { @@ -328823,11 +334499,11 @@ -54.206914522 38.330112184 -53.697558349 38.723759170 -53.312364199 38.264154110 - -53.391139255 37.703308315 + -53.391139253 37.703308331 -53.368749470 37.399548693 -53.749189337 36.945507717 -54.202907246 37.416462734 - -54.245937505 38.041558260 + -54.245937508 38.041558242 } 83d719fffffffff { @@ -328855,13 +334531,13 @@ -52.549345843 37.383566695 -52.921826292 36.941986730 -53.368749470 37.399548693 - -53.391139251 37.703308340 + -53.391139253 37.703308331 } 83d71cfffffffff { -54.599264374 38.804016624 -54.206914522 38.330112184 - -54.245937507 38.041558233 + -54.245937508 38.041558242 -54.202907246 37.416462734 -54.591373137 36.949237139 -55.051857848 37.434392798 @@ -329016,11 +334692,11 @@ -58.208004885 40.173407324 -57.669631197 40.595733245 -57.257473318 40.039470879 - -57.337161633 39.396533168 + -57.337161631 39.396533187 -57.321528633 39.049365053 -57.743751126 38.556316919 -58.219039877 39.124090012 - -58.247608226 39.841302717 + -58.247608228 39.841302697 } 83d731fffffffff { @@ -329048,13 +334724,13 @@ -56.438548380 38.979331525 -56.852371047 38.500865720 -57.321528633 39.049365053 - -57.337161629 39.396533197 + -57.337161631 39.396533187 } 83d734fffffffff { -58.626670787 40.750443316 -58.208004885 40.173407324 - -58.247608228 39.841302687 + -58.247608228 39.841302697 -58.219039877 39.124090012 -58.649691162 38.615549186 -59.130987764 39.203993865 @@ -329208,11 +334884,11 @@ 83d750fffffffff { -51.716684317 30.478595928 - -52.082855709 30.537351084 + -52.082855698 30.537351082 -52.239650867 30.657056504 -52.358481742 31.551184026 -52.006708581 32.065254281 - -51.699018554 31.816532921 + -51.699018565 31.816532923 -51.517613959 31.783336150 -51.344538314 31.088768825 } @@ -329231,7 +334907,7 @@ -51.308098057 33.053547091 -51.142886750 32.370584228 -51.517613959 31.783336150 - -51.699018569 31.816532927 + -51.699018565 31.816532923 -52.006708581 32.065254281 -52.114567939 32.949912645 } @@ -329259,7 +334935,7 @@ -52.458477604 29.215149743 -52.588725438 30.117822317 -52.239650867 30.657056504 - -52.082855692 30.537351081 + -52.082855698 30.537351082 -51.716684317 30.478595928 -51.535310452 29.772769211 } @@ -329338,11 +335014,11 @@ 83d760fffffffff { -53.312187423 24.221949944 - -53.690704058 24.239600632 + -53.690704047 24.239600631 -53.860955885 24.334745527 -54.031378632 25.282386600 -53.688691399 25.921220575 - -53.353613177 25.717042585 + -53.353613188 25.717042586 -53.165744731 25.703033119 -52.957410861 24.949759314 } @@ -329361,7 +335037,7 @@ -53.003879648 27.149636714 -52.805501802 26.406125909 -53.165744731 25.703033119 - -53.353613193 25.717042589 + -53.353613188 25.717042586 -53.688691399 25.921220575 -53.845867907 26.863748774 } @@ -329389,7 +335065,7 @@ -54.013771481 22.717229081 -54.197804666 23.668492592 -53.860955885 24.334745527 - -53.690704041 24.239600631 + -53.690704047 24.239600631 -53.312187423 24.221949944 -53.093441664 23.459669656 } @@ -329596,11 +335272,11 @@ 83d788fffffffff { -49.988605159 41.791846898 - -50.332334225 41.774352952 + -50.332334214 41.774352953 -50.501786197 41.667696256 -50.857425885 42.143740873 -50.697330492 42.945372653 - -50.352999268 43.149447939 + -50.352999278 43.149447939 -50.179898220 43.155093368 -49.826181654 42.480523293 } @@ -329610,7 +335286,7 @@ -50.296199561 40.423238963 -50.652509997 40.876665499 -50.501786197 41.667696256 - -50.332334209 41.774352953 + -50.332334214 41.774352953 -49.988605159 41.791846898 -49.629903115 41.136596685 } @@ -329656,18 +335332,18 @@ -50.357378288 44.547542844 -50.009184176 43.853752239 -50.179898220 43.155093368 - -50.352999283 43.149447936 + -50.352999278 43.149447939 -50.697330492 42.945372653 -51.051800097 43.444606743 } 83d790fffffffff { -49.935543667 48.123480128 - -50.291845843 48.135680615 + -50.291845832 48.135680614 -50.472579064 48.054188711 -50.811222316 48.630658586 -50.599277427 49.453557509 - -50.233033089 49.604495311 + -50.233033099 49.604495312 -50.053844562 49.594819985 -49.727753076 48.844335112 } @@ -329677,7 +335353,7 @@ -50.331656484 46.685313236 -50.673431120 47.238154477 -50.472579064 48.054188711 - -50.291845827 48.135680614 + -50.291845832 48.135680614 -49.935543667 48.123480128 -49.602222752 47.390763217 } @@ -329723,7 +335399,7 @@ -50.154511598 51.090146190 -49.836178131 50.322412939 -50.053844562 49.594819985 - -50.233033105 49.604495309 + -50.233033099 49.604495312 -50.599277427 49.453557509 -50.934187088 50.053873906 } @@ -329985,11 +335661,11 @@ -50.475655924 136.250733549 -49.855543708 136.193592463 -49.539233579 135.342377157 - -49.739567534 134.810120600 + -49.739567528 134.810120616 -49.837584974 134.541206536 -50.458358893 134.576745325 -50.780259860 135.439414043 - -50.577005378 135.980663620 + -50.577005384 135.980663604 } 83d801fffffffff { @@ -330017,13 +335693,13 @@ -48.891066524 133.679989738 -49.508512468 133.701529118 -49.837584974 134.541206536 - -49.739567525 134.810120624 + -49.739567528 134.810120616 } 83d804fffffffff { -50.785849078 137.124730844 -50.475655924 136.250733549 - -50.577005387 135.980663596 + -50.577005384 135.980663604 -50.780259860 135.439414043 -51.403835726 135.490139275 -51.717841511 136.376576621 @@ -331380,11 +337056,11 @@ -42.664365066 127.029894368 -42.038061071 127.062595797 -41.685307006 126.404180438 - -41.865008379 125.943702425 + -41.865008374 125.943702438 -41.931991519 125.692241694 -42.514239178 125.604348184 -42.894446297 126.286475550 - -42.754664473 126.795636553 + -42.754664479 126.795636539 } 83d8c9fffffffff { @@ -331412,13 +337088,13 @@ -40.975558199 125.120987221 -41.550719545 125.027387557 -41.931991519 125.692241694 - -41.865008371 125.943702445 + -41.865008374 125.943702438 } 83d8ccfffffffff { -43.017042874 127.705424735 -42.664365066 127.029894368 - -42.754664481 126.795636531 + -42.754664479 126.795636539 -42.894446297 126.286475550 -43.483500274 126.204851157 -43.862103375 126.904967913 @@ -331573,11 +337249,11 @@ -46.635571258 131.275896376 -46.007669443 131.270620634 -45.665763139 130.521658451 - -45.853978972 130.024891070 + -45.853978966 130.024891085 -45.935673260 129.762893605 -46.542014903 129.726403167 -46.900447138 130.494020474 - -46.730451658 131.023372560 + -46.730451663 131.023372545 } 83d8e1fffffffff { @@ -331605,13 +337281,13 @@ -44.972462672 129.061164924 -45.573310838 129.015469635 -45.935673260 129.762893605 - -45.853978963 130.024891092 + -45.853978966 130.024891085 } 83d8e4fffffffff { -46.974579747 132.044887671 -46.635571258 131.275896376 - -46.730451666 131.023372538 + -46.730451663 131.023372545 -46.900447138 130.494020474 -47.511879640 130.467572912 -47.865733999 131.256178729 @@ -331958,11 +337634,11 @@ -54.060683975 142.062633975 -53.458391490 141.936829649 -53.183884318 140.975049227 - -53.400513536 140.412158308 + -53.400513529 140.412158325 -53.515849539 140.142848384 -54.138802656 140.276296939 -54.408803941 141.239440711 - -54.170629898 141.777998545 + -54.170629905 141.777998528 } 83d919fffffffff { @@ -331990,13 +337666,13 @@ -52.612941455 139.091380554 -53.235288002 139.204637222 -53.515849539 140.142848384 - -53.400513526 140.412158333 + -53.400513529 140.412158325 } 83d91cfffffffff { -54.325694888 143.049039610 -54.060683975 142.062633975 - -54.170629909 141.777998520 + -54.170629905 141.777998528 -54.408803941 141.239440711 -55.031718532 141.394640380 -55.290412819 142.383268938 @@ -332151,11 +337827,11 @@ -57.262112213 148.789390286 -56.687811189 148.576770549 -56.471262714 147.504265712 - -56.708299977 146.921951705 + -56.708299970 146.921951722 -56.840941122 146.662628200 -57.451526469 146.923495690 -57.655210949 147.983465889 - -57.382661102 148.496613704 + -57.382661110 148.496613686 } 83d931fffffffff { @@ -332183,13 +337859,13 @@ -56.010300300 145.393991957 -56.623497883 145.627443269 -56.840941122 146.662628200 - -56.708299966 146.921951731 + -56.708299970 146.921951722 } 83d934fffffffff { -57.465975630 149.886252001 -57.262112213 148.789390286 - -57.382661114 148.496613679 + -57.382661110 148.496613686 -57.655210949 147.983465889 -58.262432672 148.273559742 -58.451667781 149.358301475 @@ -335624,11 +341300,11 @@ -62.058428842 164.875234288 -61.567984625 164.450352881 -61.504519652 163.218703089 - -61.789192092 162.664605771 + -61.789192084 162.664605787 -61.950332719 162.471694933 -62.487468437 163.060697499 -62.529826920 164.237409919 - -62.202947886 164.602423056 + -62.202947894 164.602423039 } 83db69fffffffff { @@ -335656,13 +341332,13 @@ -61.343378022 160.757370077 -61.890312572 161.307463572 -61.950332719 162.471694933 - -61.789192080 162.664605795 + -61.789192084 162.664605787 } 83db6cfffffffff { -62.105323788 166.119268100 -62.058428842 164.875234288 - -62.202947899 164.602423034 + -62.202947894 164.602423039 -62.529826920 164.237409919 -63.056357041 164.866276292 -63.080819063 166.053357745 @@ -336133,11 +341809,11 @@ { -48.371925885 -176.202333899 -47.838997487 -176.656604692 - -47.804469186 -177.241874099 + -47.804469185 -177.241874082 -47.821158468 -177.523920513 -48.372170510 -177.943598040 -48.871586894 -177.506149194 - -48.834677752 -176.933390081 + -48.834677754 -176.933390098 -48.852481881 -176.636207669 } 83dbb1fffffffff @@ -336157,7 +341833,7 @@ -46.763730506 -177.541098283 -47.316019136 -177.953878175 -47.821158468 -177.523920513 - -47.804469185 -177.241874073 + -47.804469185 -177.241874082 } 83dbb3fffffffff { @@ -336181,7 +341857,7 @@ { -49.380644384 -176.175301287 -48.852481881 -176.636207669 - -48.834677754 -176.933390106 + -48.834677754 -176.933390098 -48.871586894 -177.506149194 -49.420960830 -177.932958632 -49.914386049 -177.487753023 @@ -336199,11 +341875,11 @@ 83dc00fffffffff { -55.739113429 -15.750515863 - -55.374699564 -15.464628230 + -55.374699575 -15.464628239 -55.192795261 -15.321333460 -54.705720029 -15.992659853 -54.758118633 -17.088626041 - -55.118655756 -17.384842101 + -55.118655746 -17.384842092 -55.298060211 -17.537255599 -55.793579662 -16.875070994 } @@ -336213,7 +341889,7 @@ -54.832935203 -19.278461768 -55.335674696 -18.651692720 -55.298060211 -17.537255599 - -55.118655740 -17.384842088 + -55.118655746 -17.384842092 -54.758118633 -17.088626041 -54.259805827 -17.736665170 } @@ -336259,7 +341935,7 @@ -55.600195203 -13.521651910 -55.124989279 -14.215716144 -55.192795261 -15.321333460 - -55.374699580 -15.464628243 + -55.374699575 -15.464628239 -55.739113429 -15.750515863 -56.226369867 -15.052588962 } @@ -336965,11 +342641,11 @@ 83dc68fffffffff { -52.404880053 -31.965316034 - -52.101400014 -31.542819137 + -52.101400023 -31.542819150 -51.938929444 -31.369414575 -51.378558568 -31.822010622 -51.302315171 -32.781252393 - -51.623501333 -33.129453510 + -51.623501324 -33.129453497 -51.771349269 -33.343859093 -52.313984506 -32.984711475 } @@ -336979,7 +342655,7 @@ -51.128254500 -34.671483931 -51.669636599 -34.340398435 -51.771349269 -33.343859093 - -51.623501320 -33.129453492 + -51.623501324 -33.129453497 -51.302315171 -32.781252393 -50.737220295 -33.210980640 } @@ -337025,18 +342701,18 @@ -52.560388352 -29.912155837 -52.005476354 -30.388304759 -51.938929444 -31.369414575 - -52.101400027 -31.542819156 + -52.101400023 -31.542819150 -52.404880053 -31.965316034 -52.948000813 -31.576594630 } 83dc70fffffffff { -54.332788488 -24.242682936 - -53.995782250 -23.874126464 + -53.995782260 -23.874126474 -53.823244512 -23.710898511 -53.292154708 -24.274855237 -53.273672166 -25.317853842 - -53.615002949 -25.649572259 + -53.615002939 -25.649572248 -53.779920656 -25.840110172 -54.308919428 -25.333587302 } @@ -337046,7 +342722,7 @@ -53.210024078 -27.385651101 -53.741740898 -26.912396889 -53.779920656 -25.840110172 - -53.615002934 -25.649572243 + -53.615002939 -25.649572248 -53.273672166 -25.317853842 -52.734498293 -25.857244735 } @@ -337092,7 +342768,7 @@ -54.350969803 -22.061481219 -53.828711815 -22.650206404 -53.823244512 -23.710898511 - -53.995782265 -23.874126480 + -53.995782260 -23.874126474 -54.332788488 -24.242682936 -54.858099288 -23.701709444 } @@ -338927,11 +344603,11 @@ 83dd88fffffffff { -56.521720283 -6.783596218 - -56.140142084 -6.603768642 + -56.140142096 -6.603768647 -55.950791901 -6.489548612 -55.519457484 -7.247786673 -55.649608048 -8.350548718 - -56.026033096 -8.592349634 + -56.026033085 -8.592349628 -56.215230541 -8.694123190 -56.658194655 -7.889129689 } @@ -338941,7 +344617,7 @@ -55.879648706 -10.573616458 -56.334062961 -9.801279936 -56.215230541 -8.694123190 - -56.026033079 -8.592349624 + -56.026033085 -8.592349628 -55.649608048 -8.350548718 -55.204726508 -9.090406112 } @@ -338987,18 +344663,18 @@ -56.221894163 -4.612638839 -55.804489031 -5.387945483 -55.950791901 -6.489548612 - -56.140142101 -6.603768650 + -56.140142096 -6.603768647 -56.521720283 -6.783596218 -56.952323952 -5.946807370 } 83dd90fffffffff { -56.642406154 2.243824664 - -56.256424913 2.307534350 + -56.256424925 2.307534348 -56.062606939 2.386906779 -55.693059562 1.576450498 -55.899133902 0.518977683 - -56.285872315 0.344920053 + -56.285872303 0.344920056 -56.478686882 0.300445955 -56.854990083 1.212620748 } @@ -339008,7 +344684,7 @@ -56.284138315 -1.631662568 -56.674921656 -0.744410703 -56.478686882 0.300445955 - -56.285872298 0.344920058 + -56.285872303 0.344920056 -55.899133902 0.518977683 -55.515078141 -0.280765842 } @@ -339054,7 +344730,7 @@ -56.196522246 4.251781232 -55.841547058 3.432346199 -56.062606939 2.386906779 - -56.256424930 2.307534347 + -56.256424925 2.307534348 -56.642406154 2.243824664 -57.003644264 3.179052200 } @@ -340830,11 +346506,11 @@ 83ded8fffffffff { -47.537032573 -44.679263894 - -47.303327213 -44.222143644 + -47.303327220 -44.222143658 -47.159642624 -44.050443308 -46.583549483 -44.312082269 -46.438525840 -45.075181186 - -46.722808893 -45.415437166 + -46.722808886 -45.415437153 -46.836161774 -45.643069812 -47.358445075 -45.511435071 } @@ -340844,7 +346520,7 @@ -46.137635950 -46.568618026 -46.653629150 -46.453151457 -46.836161774 -45.643069812 - -46.722808882 -45.415437148 + -46.722808886 -45.415437153 -46.438525840 -45.075181186 -45.863295635 -45.321024271 } @@ -340890,7 +346566,7 @@ -47.877990597 -42.987698054 -47.301543661 -43.265966215 -47.159642624 -44.050443308 - -47.303327224 -44.222143665 + -47.303327220 -44.222143658 -47.537032573 -44.679263894 -48.065294702 -44.530277433 } @@ -341846,11 +347522,11 @@ -54.208901182 -70.538275432 -54.029024178 -69.529134199 -53.473045097 -69.267578196 - -53.227161391 -69.750026740 + -53.227161399 -69.750026726 -53.072641918 -69.952141470 -53.186699448 -70.865328378 -53.769078469 -71.187945397 - -54.082028845 -70.780070094 + -54.082028838 -70.780070108 } 83df69fffffffff { @@ -341878,13 +347554,13 @@ -52.372411378 -68.770177947 -52.491600832 -69.654766175 -53.072641918 -69.952141470 - -53.227161402 -69.750026719 + -53.227161399 -69.750026726 } 83df6cfffffffff { -54.766614809 -70.827757163 -54.208901182 -70.538275432 - -54.082028833 -70.780070114 + -54.082028838 -70.780070108 -53.769078469 -71.187945397 -53.877191108 -72.130574426 -54.460236635 -72.480122722 @@ -343931,11 +349607,11 @@ 83e0d8fffffffff { -50.098935075 56.308771595 - -49.715401598 56.396372967 + -49.715401610 56.396372964 -49.531153280 56.370028490 -49.241574450 55.557109254 -49.500801955 54.821169351 - -49.867763683 54.866233882 + -49.867763672 54.866233885 -50.057699079 54.815303379 -50.367688201 55.486915015 } @@ -343945,7 +349621,7 @@ -49.998340252 53.346354481 -50.314154642 53.995271213 -50.057699079 54.815303379 - -49.867763666 54.866233884 + -49.867763672 54.866233885 -49.500801955 54.821169351 -49.201960406 54.022625128 } @@ -343991,7 +349667,7 @@ -49.540803528 57.934674225 -49.260924991 57.108322229 -49.531153280 56.370028490 - -49.715401616 56.396372963 + -49.715401610 56.396372964 -50.098935075 56.308771595 -50.402461633 57.002814647 } @@ -344947,11 +350623,11 @@ -66.836511679 46.170139546 -66.245643180 46.626841865 -65.801728672 45.719369852 - -65.893566250 44.821512413 + -65.893566248 44.821512440 -65.901392584 44.340983622 -66.412268305 43.775620659 -66.904881920 44.697370891 - -66.883182818 45.701091747 + -66.883182821 45.701091719 } 83e169fffffffff { @@ -344979,13 +350655,13 @@ -64.909224665 44.015283544 -65.411279405 43.467092230 -65.901392584 44.340983622 - -65.893566246 44.821512453 + -65.893566248 44.821512440 } 83e16cfffffffff { -67.283001941 47.130035044 -66.836511679 46.170139546 - -66.883182821 45.701091705 + -66.883182821 45.701091719 -66.904881920 44.697370891 -67.424531221 44.114019543 -67.919141785 45.088964813 @@ -348042,11 +353718,11 @@ -56.697634223 -151.790175678 -56.629897289 -150.833809535 -56.074390950 -150.472809332 - -55.754492341 -150.863522561 + -55.754492351 -150.863522550 -55.630117463 -151.106591089 -55.771699545 -152.147164184 -56.285903300 -152.469471252 - -56.536202810 -151.981555026 + -56.536202800 -151.981555038 } 83e369fffffffff { @@ -348074,13 +353750,13 @@ -54.953381725 -149.776934994 -55.107081891 -150.800107873 -55.630117463 -151.106591089 - -55.754492356 -150.863522544 + -55.754492351 -150.863522550 } 83e36cfffffffff { -57.243860993 -152.171042132 -56.697634223 -151.790175678 - -56.536202797 -151.981555045 + -56.536202800 -151.981555038 -56.285903300 -152.469471252 -56.414921512 -153.526804114 -56.919979095 -153.865236563 @@ -348551,11 +354227,11 @@ { -70.395596620 -127.150332155 -70.168840571 -125.461555702 - -69.782521954 -125.228330371 + -69.782521965 -125.228330372 -69.592419361 -125.216984948 -69.250247755 -126.681883850 -69.466684827 -128.199481067 - -69.844621119 -128.267380154 + -69.844621108 -128.267380152 -70.034497786 -128.413604643 } 83e3b1fffffffff @@ -348575,7 +354251,7 @@ -69.667210147 -122.186242314 -69.349710383 -123.706890212 -69.592419361 -125.216984948 - -69.782521971 -125.228330375 + -69.782521965 -125.228330372 } 83e3b3fffffffff { @@ -348599,7 +354275,7 @@ { -70.232422141 -130.106109152 -70.034497786 -128.413604643 - -69.844621102 -128.267380151 + -69.844621108 -128.267380152 -69.466684827 -128.199481067 -69.101363508 -129.602536689 -69.292075879 -131.119173081 @@ -353219,11 +358895,11 @@ 83e6d8fffffffff { -56.138694825 10.900959637 - -55.760901772 10.854887776 + -55.760901783 10.854887778 -55.566068368 10.898629246 -55.257610923 10.075993141 -55.529385549 9.108096850 - -55.919622032 9.005556487 + -55.919622021 9.005556486 -56.109658356 9.016969877 -56.413203441 9.986639535 } @@ -353233,7 +358909,7 @@ -56.051524196 7.124717647 -56.370801356 8.079970178 -56.109658356 9.016969877 - -55.919622015 9.005556488 + -55.919622021 9.005556486 -55.529385549 9.108096850 -55.206893497 8.287863513 } @@ -353279,7 +358955,7 @@ -55.576645572 12.669746034 -55.282002899 11.846372164 -55.566068368 10.898629246 - -55.760901789 10.854887778 + -55.760901783 10.854887778 -56.138694825 10.900959637 -56.426324184 11.882782779 } @@ -354739,11 +360415,11 @@ { -61.871104478 43.105046111 -61.437720002 42.409605317 - -61.520917280 41.658581669 + -61.520917281 41.658581693 -61.514953525 41.254608061 -61.980929811 40.721495891 -62.470742361 41.428977946 - -62.478627918 42.267647670 + -62.478627918 42.267647645 -62.436953327 42.657531904 } 83e7b1fffffffff @@ -354763,7 +360439,7 @@ -60.572677036 41.092926082 -61.029961769 40.576440068 -61.514953525 41.254608061 - -61.520917280 41.658581704 + -61.520917281 41.658581693 } 83e7b3fffffffff { @@ -354787,7 +360463,7 @@ { -62.875471512 43.384857667 -62.436953327 42.657531904 - -62.478627918 42.267647632 + -62.478627918 42.267647645 -62.470742361 41.428977946 -62.945397523 40.878183340 -63.439765752 41.617586598 @@ -354807,11 +360483,11 @@ -64.953210359 -91.285851958 -64.976612159 -89.818924266 -64.450346393 -88.987084034 - -64.094281951 -89.400211622 + -64.094281962 -89.400211610 -63.915156545 -89.599938606 -63.894166645 -91.011389651 -64.408780170 -91.864597019 - -64.771569309 -91.479340531 + -64.771569298 -91.479340543 } 83e801fffffffff { @@ -354839,13 +360515,13 @@ -63.389047393 -87.422616925 -63.387928921 -88.801415362 -63.915156545 -89.599938606 - -64.094281967 -89.400211604 + -64.094281962 -89.400211610 } 83e804fffffffff { -65.465892269 -92.180545795 -64.953210359 -91.285851958 - -64.771569293 -91.479340549 + -64.771569298 -91.479340543 -64.408780170 -91.864597019 -64.366699463 -93.305757658 -64.867266605 -94.214456568 @@ -356202,11 +361878,11 @@ -58.036787753 -75.883788708 -57.902812840 -74.729317560 -57.336326353 -74.337718667 - -57.054573395 -74.828981918 + -57.054573403 -74.828981904 -56.892491042 -75.040168454 -56.983047237 -76.101189842 -57.563270093 -76.551124092 - -57.891724333 -76.127704846 + -57.891724324 -76.127704861 } 83e8c9fffffffff { @@ -356234,13 +361910,13 @@ -56.210610738 -73.596504362 -56.310208506 -74.624251830 -56.892491042 -75.040168454 - -57.054573408 -74.828981896 + -57.054573403 -74.828981904 } 83e8ccfffffffff { -58.601400908 -76.313561817 -58.036787753 -75.883788708 - -57.891724319 -76.127704867 + -57.891724324 -76.127704861 -57.563270093 -76.551124092 -57.643728677 -77.645924156 -58.220955885 -78.131934901 @@ -356395,11 +362071,11 @@ -61.685724319 -82.670834337 -61.618716402 -81.355947074 -61.059631000 -80.778870698 - -60.740128299 -81.254292720 + -60.740128309 -81.254292706 -60.569749659 -81.467277673 -60.616871984 -82.699531668 -61.176437212 -83.324123867 - -61.521801327 -82.902554516 + -61.521801317 -82.902554530 } 83e8e1fffffffff { @@ -356427,13 +362103,13 @@ -59.942286411 -79.691157675 -60.003487229 -80.887369271 -60.569749659 -81.467277673 - -60.740128314 -81.254292699 + -60.740128309 -81.254292706 } 83e8e4fffffffff { -62.237868625 -83.298763742 -61.685724319 -82.670834337 - -61.521801312 -82.902554536 + -61.521801317 -82.902554530 -61.176437212 -83.324123867 -61.208235641 -84.591847325 -61.759881420 -85.263156053 @@ -356780,11 +362456,11 @@ -67.591137387 -102.007116666 -67.725969113 -100.450480088 -67.265833257 -99.300621891 - -66.880413946 -99.576912033 + -66.880413957 -99.576912025 -66.693305936 -99.737471245 -66.578140613 -101.293993076 -67.018564299 -102.415511631 - -67.396294776 -102.122767206 + -67.396294764 -102.122767213 } 83e919fffffffff { @@ -356812,13 +362488,13 @@ -66.323649283 -97.132790559 -66.233640816 -98.672960676 -66.693305936 -99.737471245 - -66.880413963 -99.576912021 + -66.880413957 -99.576912025 } 83e91cfffffffff { -68.030110725 -103.222219042 -67.591137387 -102.007116666 - -67.396294759 -102.122767217 + -67.396294764 -102.122767213 -67.018564299 -102.415511631 -66.877519940 -103.981891502 -67.297378800 -105.157897498 @@ -356973,11 +362649,11 @@ -69.343183216 -114.683885348 -69.598224151 -113.179770693 -69.241046668 -111.706291160 - -68.842700681 -111.755909296 + -68.842700693 -111.755909295 -68.650927198 -111.843438663 -68.422517541 -113.438644309 -68.759773891 -114.811626245 - -69.144398147 -114.678510541 + -69.144398135 -114.678510541 } 83e931fffffffff { @@ -357005,13 +362681,13 @@ -68.489843937 -108.900150839 -68.288946730 -110.512077384 -68.650927198 -111.843438663 - -68.842700699 -111.755909294 + -68.842700693 -111.755909295 } 83e934fffffffff { -69.672980713 -116.202772165 -69.343183216 -114.683885348 - -69.144398130 -114.678510543 + -69.144398135 -114.678510541 -68.759773891 -114.811626245 -68.504208152 -116.381356101 -68.816131498 -117.788981936 @@ -357920,15 +363596,15 @@ 83ea00fffffffff { -64.327495459 -168.929453512 - -64.310524647 -169.750114648 + -64.310524647 -169.750114623 -64.363581870 -170.115154745 - -64.694692927 -170.419524873 + -64.694692917 -170.419524864 -64.861448382 -170.418762286 - -65.087510320 -169.768503976 + -65.087510313 -169.768503995 -65.136623661 -169.389838109 - -64.939892756 -168.686637153 + -64.939892762 -168.686637174 -64.802007020 -168.465795942 - -64.459677862 -168.694224031 + -64.459677872 -168.694224024 } 83ea02fffffffff { @@ -357938,7 +363614,7 @@ -64.665070305 -172.353798883 -65.018419625 -171.396012389 -64.861448382 -170.418762286 - -64.694692912 -170.419524859 + -64.694692917 -170.419524864 } 83ea03fffffffff { @@ -357948,7 +363624,7 @@ -65.870718694 -170.413936603 -65.578138774 -169.312524459 -65.136623661 -169.389838109 - -65.087510310 -169.768504005 + -65.087510313 -169.768503995 } 83ea04fffffffff { @@ -357958,7 +363634,7 @@ -63.960727464 -167.176081448 -63.948859194 -168.403611399 -64.327495459 -168.929453512 - -64.459677877 -168.694224021 + -64.459677872 -168.694224024 } 83ea05fffffffff { @@ -357968,7 +363644,7 @@ -65.413227948 -167.069063201 -64.898304008 -167.449070427 -64.802007020 -168.465795942 - -64.939892765 -168.686637184 + -64.939892762 -168.686637174 } 83ea06fffffffff { @@ -357978,7 +363654,72 @@ -63.519707127 -170.306139186 -64.020499306 -170.757785011 -64.363581870 -170.115154745 - -64.310524648 -169.750114611 + -64.310524647 -169.750114623 +} +83ea08fffffffff +{ + -66.475949193 -169.146891880 + -66.932291883 -169.058038839 + -67.081432195 -167.791910969 + -66.762027586 -166.653379189 + -66.307549913 -166.798459867 + -66.170313623 -168.026328215 +} +83ea09fffffffff +{ + -67.081432195 -167.791910969 + -67.544416995 -167.665873090 + -67.685680595 -166.341195148 + -67.351768675 -165.186341274 + -66.891412484 -165.371829921 + -66.762027586 -166.653379189 +} +83ea0afffffffff +{ + -66.547999434 -171.459736785 + -67.065241605 -171.483093730 + -67.233744633 -170.237309169 + -66.932291883 -169.058038839 + -66.475949193 -169.146891880 + -66.320077902 -170.357829209 + -66.465098478 -170.932324734 +} +83ea0bfffffffff +{ + -67.233744633 -170.237309169 + -67.698096974 -170.172476659 + -67.859952975 -168.866719964 + -67.544416995 -167.665873090 + -67.081432195 -167.791910969 + -66.932291883 -169.058038839 +} +83ea0cfffffffff +{ + -65.722145910 -168.135511657 + -66.170313623 -168.026328215 + -66.307549913 -166.798459867 + -65.985192578 -165.717081316 + -65.761651409 -165.798461101 + -65.503795370 -166.007962277 + -65.413227948 -167.069063201 +} +83ea0dfffffffff +{ + -66.307549913 -166.798459867 + -66.762027586 -166.653379189 + -66.891412484 -165.371829921 + -66.554941622 -164.277194847 + -66.103484926 -164.476709667 + -65.985192578 -165.717081316 +} +83ea0efffffffff +{ + -65.870718694 -170.413936603 + -66.320077902 -170.357829209 + -66.475949193 -169.146891880 + -66.170313623 -168.026328215 + -65.722145910 -168.135511657 + -65.578138774 -169.312524459 } 83ea10fffffffff { @@ -358305,6 +364046,457 @@ -61.941363298 -169.421165969 -62.358252547 -168.753577015 } +83ea40fffffffff +{ + -68.616331236 -160.478553018 + -69.090613343 -160.139358358 + -69.175376915 -158.615509303 + -68.775612561 -157.496145236 + -68.308219931 -157.899519936 + -68.233399064 -159.359704101 +} +83ea41fffffffff +{ + -69.175376915 -158.615509303 + -69.652598957 -158.212312969 + -69.722238015 -156.621966511 + -69.305022453 -155.507353016 + -68.835914493 -155.976364206 + -68.775612561 -157.496145236 +} +83ea42fffffffff +{ + -68.883378078 -163.118135023 + -69.363206594 -162.847821121 + -69.472619962 -161.327020290 + -69.090613343 -160.139358358 + -68.616331236 -160.478553018 + -68.518169489 -161.937959829 +} +83ea43fffffffff +{ + -69.472619962 -161.327020290 + -69.956595498 -160.995405889 + -70.052151520 -159.402755706 + -69.652598957 -158.212312969 + -69.175376915 -158.615509303 + -69.090613343 -160.139358358 +} +83ea44fffffffff +{ + -67.768781761 -159.703763944 + -68.233399064 -159.359704101 + -68.308219931 -157.899519936 + -67.908971150 -156.843873033 + -67.679655924 -157.047298266 + -67.425967833 -157.384029956 + -67.385690800 -158.646907716 +} +83ea45fffffffff +{ + -68.308219931 -157.899519936 + -68.775612561 -157.496145236 + -68.835914493 -155.976364206 + -68.419963701 -154.926662426 + -67.960675557 -155.389036993 + -67.908971150 -156.843873033 +} +83ea46fffffffff +{ + -68.047781423 -162.219931622 + -68.518169489 -161.937959829 + -68.616331236 -160.478553018 + -68.233399064 -159.359704101 + -67.768781761 -159.703763944 + -67.681021252 -161.105907983 +} +83ea48fffffffff +{ + -70.619070531 -157.334778453 + -71.108101216 -156.856245236 + -71.170100335 -155.112394810 + -70.733397997 -153.935286004 + -70.253910845 -154.489079451 + -70.201263639 -156.147411469 +} +83ea49fffffffff +{ + -71.170100335 -155.112394810 + -71.659597529 -154.546778984 + -71.701564526 -152.725122057 + -71.245427715 -151.566948238 + -70.767050167 -152.208274362 + -70.733397997 -153.935286004 +} +83ea4afffffffff +{ + -70.937758816 -160.272106647 + -71.434798006 -159.876746865 + -71.525713614 -158.125611906 + -71.108101216 -156.856245236 + -70.619070531 -157.334778453 + -70.539263151 -159.001987768 +} +83ea4bfffffffff +{ + -71.525713614 -158.125611906 + -72.024823593 -157.645312058 + -72.097074206 -155.807252353 + -71.659597529 -154.546778984 + -71.170100335 -155.112394810 + -71.108101216 -156.856245236 +} +83ea4cfffffffff +{ + -69.722238015 -156.621966511 + -70.201263639 -156.147411469 + -70.253910845 -154.489079451 + -69.818690009 -153.385566580 + -69.349107194 -153.926925563 + -69.305022453 -155.507353016 +} +83ea4dfffffffff +{ + -70.253910845 -154.489079451 + -70.733397997 -153.935286004 + -70.767050167 -152.208274362 + -70.313364189 -151.123416594 + -69.844745951 -151.744130094 + -69.818690009 -153.385566580 +} +83ea4efffffffff +{ + -70.052151520 -159.402755706 + -70.539263151 -159.001987768 + -70.619070531 -157.334778453 + -70.201263639 -156.147411469 + -69.722238015 -156.621966511 + -69.652598957 -158.212312969 +} +83ea50fffffffff +{ + -68.485300098 -167.393811546 + -68.963213438 -167.246706238 + -69.107991272 -165.808863749 + -68.761832581 -164.570196000 + -68.286983461 -164.786298337 + -68.154871419 -166.172953676 +} +83ea51fffffffff +{ + -69.107991272 -165.808863749 + -69.591911018 -165.611471024 + -69.725951785 -164.101311481 + -69.363206594 -162.847821121 + -68.883378078 -163.118135023 + -68.761832581 -164.570196000 +} +83ea52fffffffff +{ + -68.641934039 -170.032449461 + -69.121448856 -169.956688069 + -69.289105878 -168.540073667 + -68.963213438 -167.246706238 + -68.485300098 -167.393811546 + -68.331303878 -168.763541911 +} +83ea53fffffffff +{ + -69.289105878 -168.540073667 + -69.775571179 -168.418812466 + -69.933993154 -166.927179926 + -69.591911018 -165.611471024 + -69.107991272 -165.808863749 + -68.963213438 -167.246706238 +} +83ea54fffffffff +{ + -67.685680595 -166.341195148 + -68.154871419 -166.172953676 + -68.286983461 -164.786298337 + -67.937806999 -163.617334381 + -67.472107256 -163.848266443 + -67.351768675 -165.186341274 +} +83ea55fffffffff +{ + -68.286983461 -164.786298337 + -68.761832581 -164.570196000 + -68.883378078 -163.118135023 + -68.518169489 -161.937959829 + -68.047781423 -162.219931622 + -67.937806999 -163.617334381 +} +83ea56fffffffff +{ + -67.859952975 -168.866719964 + -68.331303878 -168.763541911 + -68.485300098 -167.393811546 + -68.154871419 -166.172953676 + -67.685680595 -166.341195148 + -67.544416995 -167.665873090 +} +83ea58fffffffff +{ + -70.574409264 -165.181447259 + -71.072946306 -164.946668680 + -71.207811254 -163.289435234 + -70.830457245 -161.939207930 + -70.336790152 -162.259768632 + -70.215179191 -163.846411221 +} +83ea59fffffffff +{ + -71.207811254 -163.289435234 + -71.711128705 -162.984386383 + -71.831250380 -161.236642234 + -71.434798006 -159.876746865 + -70.937758816 -160.272106647 + -70.830457245 -161.939207930 +} +83ea5afffffffff +{ + -70.763639105 -168.154371245 + -71.265233378 -168.009832723 + -71.427443616 -166.372734456 + -71.072946306 -164.946668680 + -70.574409264 -165.181447259 + -70.426850746 -166.753269409 +} +83ea5bfffffffff +{ + -71.427443616 -166.372734456 + -71.935139619 -166.164001915 + -72.084442725 -164.431171619 + -71.711128705 -162.984386383 + -71.207811254 -163.289435234 + -71.072946306 -164.946668680 +} +83ea5cfffffffff +{ + -69.725951785 -164.101311481 + -70.215179191 -163.846411221 + -70.336790152 -162.259768632 + -69.956595498 -160.995405889 + -69.472619962 -161.327020290 + -69.363206594 -162.847821121 +} +83ea5dfffffffff +{ + -70.336790152 -162.259768632 + -70.830457245 -161.939207930 + -70.937758816 -160.272106647 + -70.539263151 -159.001987768 + -70.052151520 -159.402755706 + -69.956595498 -160.995405889 +} +83ea5efffffffff +{ + -69.933993154 -166.927179926 + -70.426850746 -166.753269409 + -70.574409264 -165.181447259 + -70.215179191 -163.846411221 + -69.725951785 -164.101311481 + -69.591911018 -165.611471024 +} +83ea60fffffffff +{ + -66.950751772 -156.787854531 + -66.974365796 -155.524570969 + -66.486320970 -154.963312566 + -65.982814039 -155.650176761 + -65.963463406 -156.866693709 + -66.443406294 -157.442011114 +} +83ea61fffffffff +{ + -67.477268832 -154.808204206 + -67.487589896 -153.497258475 + -66.991392836 -152.953979298 + -66.493062839 -153.702432445 + -66.486320970 -154.963312566 + -66.974365796 -155.524570969 +} +83ea62fffffffff +{ + -67.385690800 -158.646907716 + -67.425967833 -157.384029956 + -66.950751772 -156.787854531 + -66.443406294 -157.442011114 + -66.407896236 -158.658053023 + -66.875028108 -159.265685521 +} +83ea63fffffffff +{ + -67.908971150 -156.843873033 + -67.960675557 -155.389036993 + -67.477268832 -154.808204206 + -66.974365796 -155.524570969 + -66.950751772 -156.787854531 + -67.425967833 -157.384029956 + -67.679655924 -157.047298266 +} +83ea64fffffffff +{ + -65.963463406 -156.866693709 + -65.982814039 -155.650176761 + -65.490338072 -155.107239294 + -64.986591163 -155.766905634 + -64.971628510 -156.939987639 + -65.456073688 -157.495852559 +} +83ea65fffffffff +{ + -66.486320970 -154.963312566 + -66.493062839 -153.702432445 + -65.992507043 -153.175922055 + -65.493325551 -153.892764246 + -65.490338072 -155.107239294 + -65.982814039 -155.650176761 +} +83ea66fffffffff +{ + -66.407896236 -158.658053023 + -66.443406294 -157.442011114 + -65.963463406 -156.866693709 + -65.456073688 -157.495852559 + -65.425422412 -158.668407429 + -65.897362877 -159.254316733 +} +83ea68fffffffff +{ + -68.456183955 -153.417446115 + -68.915972061 -152.888797693 + -68.935063771 -151.325071622 + -68.637219570 -150.678861815 + -68.469956118 -150.502248214 + -67.980224109 -151.355879785 + -67.984666121 -152.714362221 + -68.313081599 -153.086230920 +} +83ea69fffffffff +{ + -68.935063771 -151.325071622 + -69.394030687 -150.724184291 + -69.394264622 -149.106578507 + -68.929957882 -148.168719501 + -68.449220227 -149.097031972 + -68.469956118 -150.502248214 + -68.637219570 -150.678861815 +} +83ea6afffffffff +{ + -68.835914493 -155.976364206 + -69.305022453 -155.507353016 + -69.349107194 -153.926925563 + -68.915972061 -152.888797693 + -68.456183955 -153.417446115 + -68.419963701 -154.926662426 +} +83ea6bfffffffff +{ + -69.349107194 -153.926925563 + -69.818690009 -153.385566580 + -69.844745951 -151.744130094 + -69.394030687 -150.724184291 + -68.935063771 -151.325071622 + -68.915972061 -152.888797693 +} +83ea6cfffffffff +{ + -67.984666121 -152.714362221 + -67.980224109 -151.355879785 + -67.475886252 -150.834963026 + -66.984149370 -151.648800450 + -66.991392836 -152.953979298 + -67.487589896 -153.497258475 +} +83ea6dfffffffff +{ + -68.469956118 -150.502248214 + -68.449220227 -149.097031972 + -67.936828443 -148.603315747 + -67.453222990 -149.486124603 + -67.475886252 -150.834963026 + -67.980224109 -151.355879785 +} +83ea6efffffffff +{ + -68.419963701 -154.926662426 + -68.456183955 -153.417446115 + -68.313081599 -153.086230920 + -67.984666121 -152.714362221 + -67.487589896 -153.497258475 + -67.477268832 -154.808204206 + -67.960675557 -155.389036993 +} +83ea70fffffffff +{ + -66.664321961 -162.985147733 + -67.120836686 -162.742550095 + -67.220077667 -161.396531116 + -66.975657119 -160.689726915 + -66.823618885 -160.478600706 + -66.310468828 -161.039667788 + -66.249240605 -162.203935337 + -66.547416394 -162.631958318 +} +83ea71fffffffff +{ + -67.220077667 -161.396531116 + -67.681021252 -161.105907983 + -67.768781761 -159.703763944 + -67.385690800 -158.646907716 + -66.875028108 -159.265685521 + -66.823618885 -160.478600706 + -66.975657119 -160.689726915 +} +83ea72fffffffff +{ + -66.891412484 -165.371829921 + -67.351768675 -165.186341274 + -67.472107256 -163.848266443 + -67.120836686 -162.742550095 + -66.664321961 -162.985147733 + -66.554941622 -164.277194847 +} +83ea73fffffffff +{ + -67.472107256 -163.848266443 + -67.937806999 -163.617334381 + -68.047781423 -162.219931622 + -67.681021252 -161.105907983 + -67.220077667 -161.396531116 + -67.120836686 -162.742550095 +} +83ea74fffffffff +{ + -66.249240605 -162.203935337 + -66.310468828 -161.039667788 + -65.851272421 -160.423964924 + -65.338681640 -160.966563855 + -65.283240627 -162.090990204 + -65.734681527 -162.711839449 +} +83ea75fffffffff +{ + -66.823618885 -160.478600706 + -66.875028108 -159.265685521 + -66.407896236 -158.658053023 + -65.897362877 -159.254316733 + -65.851272421 -160.423964924 + -66.310468828 -161.039667788 +} +83ea76fffffffff +{ + -66.554941622 -164.277194847 + -66.664321961 -162.985147733 + -66.547416394 -162.631958318 + -66.249240605 -162.203935337 + -65.734681527 -162.711839449 + -65.664852161 -163.829044680 + -66.103484926 -164.476709667 +} 83ea80fffffffff { -62.814808863 179.354958179 @@ -358500,11 +364692,11 @@ { -63.068531672 173.303759753 -63.088292729 172.061945702 - -63.394706734 171.567799656 + -63.394706724 171.567799664 -63.563590532 171.432957370 -64.041494692 172.190075139 -64.001818013 173.349240351 - -63.661834978 173.591606414 + -63.661834989 173.591606407 -63.506869328 173.831084328 } 83ea99fffffffff @@ -358524,7 +364716,7 @@ -63.095054078 169.555022455 -63.585882635 170.273785247 -63.563590532 171.432957370 - -63.394706720 171.567799672 + -63.394706724 171.567799664 } 83ea9bfffffffff { @@ -358548,7 +364740,7 @@ { -63.470749914 175.073652400 -63.506869328 173.831084328 - -63.661834994 173.591606404 + -63.661834989 173.591606407 -64.001818013 173.349240351 -64.466136892 174.144392038 -64.409211067 175.300646609 @@ -358630,11 +364822,11 @@ { -63.926978344 -177.712899438 -64.023951378 -178.904144792 - -64.346492543 -179.310837220 + -64.346492533 -179.310837216 -64.517200009 -179.377830038 -64.926418291 -178.484077691 -64.814233465 -177.403662265 - -64.473213136 -177.299743594 + -64.473213146 -177.299743597 -64.310887742 -177.106399273 } 83eaa9fffffffff @@ -358654,7 +364846,7 @@ -64.189778076 178.666439511 -64.613953113 179.528376892 -64.517200009 -179.377830038 - -64.346492528 -179.310837210 + -64.346492533 -179.310837216 } 83eaabfffffffff { @@ -358678,7 +364870,7 @@ { -64.199327085 -175.926601937 -64.310887742 -177.106399273 - -64.473213151 -177.299743599 + -64.473213146 -177.299743597 -64.814233465 -177.403662265 -65.208106355 -176.479713044 -65.080967248 -175.415538323 @@ -358825,11 +365017,11 @@ -71.482607574 -177.288909504 -71.634137631 -178.789640945 -72.190197814 -179.065064696 - -72.461117323 -178.193667790 + -72.461117315 -178.193667817 -72.546320666 -177.668933188 -72.281451933 -175.949214477 -71.773102293 -175.848872133 - -71.614243829 -176.864579280 + -71.614243837 -176.864579255 } 83eac9fffffffff { @@ -358857,13 +365049,13 @@ -73.310223685 -179.674389648 -73.060261389 -177.837144606 -72.546320666 -177.668933188 - -72.461117311 -178.193667830 + -72.461117315 -178.193667817 } 83eaccfffffffff { -70.930884371 -177.079939701 -71.482607574 -177.288909504 - -71.614243840 -176.864579240 + -71.614243837 -176.864579255 -71.773102293 -175.848872133 -71.495584200 -174.236569642 -70.993635695 -174.192843001 @@ -359018,11 +365210,11 @@ -67.754246081 -172.638050457 -67.916198474 -173.797216315 -68.446768383 -173.885245437 - -68.691948112 -173.134282099 + -68.691948105 -173.134282122 -68.756404310 -172.691425746 -68.466487309 -171.379053408 -67.994353116 -171.415514335 - -67.873998751 -172.273094427 + -67.873998758 -172.273094406 } 83eae1fffffffff { @@ -359050,13 +365242,13 @@ -69.518305745 -174.076285419 -69.236016778 -172.688473145 -68.756404310 -172.691425746 - -68.691948101 -173.134282133 + -68.691948105 -173.134282122 } 83eae4fffffffff { -67.230186822 -172.584706879 -67.754246081 -172.638050457 - -67.873998760 -172.273094393 + -67.873998758 -172.273094406 -67.994353116 -171.415514335 -67.698096974 -170.172476659 -67.233744633 -170.237309169 @@ -359402,11 +365594,11 @@ { -62.828789179 -162.352700159 -62.363357848 -161.794725899 - -62.023803182 -162.098640019 + -62.023803189 -162.098640004 -61.894710922 -162.344074943 -61.927905670 -163.530420820 -62.346920739 -163.996871122 - -62.607212254 -163.510449016 + -62.607212246 -163.510449031 -62.777482310 -163.366836629 } 83eb19fffffffff @@ -359431,7 +365623,7 @@ { -63.231043060 -163.946955589 -62.777482310 -163.366836629 - -62.607212242 -163.510449038 + -62.607212246 -163.510449031 -62.346920739 -163.996871122 -62.365035004 -165.191352108 -62.773129849 -165.675287689 @@ -359445,7 +365637,7 @@ -61.416749935 -160.719001391 -61.464913312 -161.895397884 -61.894710922 -162.344074943 - -62.023803194 -162.098640000 + -62.023803189 -162.098640004 } 83eb1dfffffffff { @@ -359595,11 +365787,11 @@ { -59.956333229 -156.245366152 -59.442424005 -155.791599312 - -59.110624947 -156.148757306 + -59.110624954 -156.148757292 -58.984265247 -156.396073629 -59.074655286 -157.515668809 -59.543136139 -157.907049155 - -59.797764566 -157.413249586 + -59.797764558 -157.413249601 -59.964698492 -157.240687909 } 83eb31fffffffff @@ -359624,7 +365816,7 @@ { -60.467848307 -157.716129002 -59.964698492 -157.240687909 - -59.797764554 -157.413249609 + -59.797764558 -157.413249601 -59.543136139 -157.907049155 -59.619368969 -159.040343908 -60.077625750 -159.449097255 @@ -359638,7 +365830,7 @@ -58.401544870 -154.917277673 -58.505790803 -156.021988530 -58.984265247 -156.396073629 - -59.110624959 -156.148757286 + -59.110624954 -156.148757292 } 83eb35fffffffff { @@ -359790,11 +365982,11 @@ -66.664321961 -162.985147733 -67.120836686 -162.742550095 -67.220077667 -161.396531116 - -66.975657112 -160.689726894 + -66.975657119 -160.689726915 -66.823618885 -160.478600706 -66.310468828 -161.039667788 -66.249240605 -162.203935337 - -66.547416401 -162.631958339 + -66.547416394 -162.631958318 } 83eb51fffffffff { @@ -359809,7 +366001,7 @@ { -66.554941622 -164.277194847 -66.664321961 -162.985147733 - -66.547416390 -162.631958312 + -66.547416394 -162.631958318 -66.249240605 -162.203935337 -65.734681527 -162.711839449 -65.664852161 -163.829044680 @@ -359841,7 +366033,7 @@ -67.385690800 -158.646907716 -66.875028108 -159.265685521 -66.823618885 -160.478600706 - -66.975657123 -160.689726926 + -66.975657119 -160.689726915 } 83eb56fffffffff { @@ -359920,11 +366112,11 @@ -68.456183955 -153.417446115 -68.915972061 -152.888797693 -68.935063771 -151.325071622 - -68.637219561 -150.678861796 + -68.637219570 -150.678861815 -68.469956118 -150.502248214 -67.980224109 -151.355879785 -67.984666121 -152.714362221 - -68.313081608 -153.086230939 + -68.313081599 -153.086230920 } 83eb61fffffffff { @@ -359939,7 +366131,7 @@ { -68.419963701 -154.926662426 -68.456183955 -153.417446115 - -68.313081594 -153.086230914 + -68.313081599 -153.086230920 -67.984666121 -152.714362221 -67.487589896 -153.497258475 -67.477268832 -154.808204206 @@ -359971,7 +366163,7 @@ -68.929957882 -148.168719501 -68.449220227 -149.097031972 -68.469956118 -150.502248214 - -68.637219574 -150.678861825 + -68.637219570 -150.678861815 } 83eb66fffffffff { @@ -360177,18 +366369,18 @@ { -61.089287578 -170.716099993 -60.654332549 -171.343928055 - -60.628214305 -172.092558603 + -60.628214302 -172.092558583 -60.672515492 -172.434044774 -61.186518502 -172.889184402 -61.565607934 -172.301031720 - -61.473843206 -171.605968824 + -61.473843208 -171.605968845 -61.486548246 -171.224514783 } 83eb89fffffffff { -61.914260110 -170.584292101 -61.486548246 -171.224514783 - -61.473843210 -171.605968855 + -61.473843208 -171.605968845 -61.565607934 -172.301031720 -62.075155820 -172.764169578 -62.446264908 -172.162131300 @@ -360238,24 +366430,24 @@ -59.767180203 -172.561535657 -60.285487250 -173.008929769 -60.672515492 -172.434044774 - -60.628214303 -172.092558572 + -60.628214302 -172.092558583 } 83eb90fffffffff { -57.139340317 -172.830831915 -56.666863298 -173.390158494 - -56.634768590 -174.076485037 + -56.634768588 -174.076485018 -56.670082866 -174.396256685 -57.200126646 -174.842055022 -57.622227976 -174.312954815 - -57.548297931 -173.662565671 + -57.548297934 -173.662565691 -57.564289021 -173.313293391 } 83eb91fffffffff { -58.030008729 -172.744012330 -57.564289021 -173.313293391 - -57.548297935 -173.662565700 + -57.548297934 -173.662565691 -57.622227976 -174.312954815 -58.148424895 -174.766660406 -58.562874409 -174.226251909 @@ -360305,7 +366497,7 @@ -55.706768465 -174.476353451 -56.240434591 -174.914509234 -56.670082866 -174.396256685 - -56.634768588 -174.076485008 + -56.634768588 -174.076485018 } 83eb98fffffffff { @@ -363089,11 +369281,11 @@ -75.277844089 175.296859241 -75.388810715 173.250235104 -75.953629340 172.555216176 - -76.261572255 173.536057774 + -76.261572246 173.536057744 -76.375953520 174.151023316 -76.173364833 176.545945820 -75.639126045 176.985025558 - -75.426433941 175.782317184 + -75.426433950 175.782317214 } 83ed69fffffffff { @@ -363121,13 +369313,13 @@ -77.083530217 170.976649668 -76.909961061 173.558388298 -76.375953520 174.151023316 - -76.261572242 173.536057729 + -76.261572246 173.536057744 } 83ed6cfffffffff { -74.711474878 175.852435828 -75.277844089 175.296859241 - -75.426433953 175.782317231 + -75.426433950 175.782317214 -75.639126045 176.985025558 -75.411773790 179.206317667 -74.879560429 179.518773054 @@ -363598,11 +369790,11 @@ { -59.423128122 156.119389769 -59.278514797 154.950407617 - -59.538995366 154.368257569 + -59.538995357 154.368257583 -59.687490358 154.133478023 -60.269547010 154.549808340 -60.395530665 155.687617945 - -60.092211184 156.144384434 + -60.092211193 156.144384420 -59.959715671 156.434535279 } 83edb1fffffffff @@ -363622,7 +369814,7 @@ -58.956958467 152.634749694 -59.545200187 153.016660418 -59.687490358 154.133478023 - -59.538995353 154.368257592 + -59.538995357 154.368257583 } 83edb3fffffffff { @@ -363646,7 +369838,7 @@ { -60.089112187 157.624070680 -59.959715671 156.434535279 - -60.092211197 156.144384414 + -60.092211193 156.144384420 -60.395530665 155.687617945 -60.970581263 156.140055636 -61.079733904 157.297884671 @@ -366753,11 +372945,11 @@ -79.485404076 75.688922513 -78.872864813 75.138377125 -78.603969812 72.192333830 - -78.822548560 70.488659932 + -78.822548554 70.488659983 -78.926914683 69.608265905 -79.546602851 69.839635131 -79.837488548 72.994626201 - -79.604481024 74.807705189 + -79.604481031 74.807705136 } 83f001fffffffff { @@ -366785,13 +372977,13 @@ -77.987176369 66.746517856 -78.604696102 66.797515416 -78.926914683 69.608265905 - -78.822548551 70.488660009 + -78.822548554 70.488659983 } 83f004fffffffff { -79.718388520 78.964028538 -79.485404076 75.688922513 - -79.604481035 74.807705109 + -79.604481031 74.807705136 -79.837488548 72.994626201 -80.456446177 73.475095387 -80.708535019 77.032888457 @@ -368148,11 +374340,11 @@ -71.305088809 51.462790249 -70.692894480 51.875586704 -70.257692705 50.622073813 - -70.367946526 49.519090876 + -70.367946523 49.519090909 -70.395739514 48.932813809 -70.951474213 48.372268374 -71.427208711 49.649227173 - -71.362338937 50.882393278 + -71.362338940 50.882393243 } 83f0c9fffffffff { @@ -368180,13 +374372,13 @@ -69.371341411 48.291160912 -69.918325418 47.741343081 -70.395739514 48.932813809 - -70.367946521 49.519090925 + -70.367946523 49.519090909 } 83f0ccfffffffff { -71.738054536 52.809917726 -71.305088809 51.462790249 - -71.362338941 50.882393225 + -71.362338940 50.882393243 -71.427208711 49.649227173 -71.991610896 49.079374376 -72.464644776 50.454006095 @@ -368341,11 +374533,11 @@ -75.654777178 60.128319517 -75.028884221 60.327211477 -74.638823389 58.466049538 - -74.786079794 57.078385123 + -74.786079790 57.078385164 -74.843836972 56.348133475 -75.441186816 55.930552684 -75.863762263 57.852779558 - -75.733277723 59.394798816 + -75.733277727 59.394798772 } 83f0e1fffffffff { @@ -368373,13 +374565,13 @@ -73.821619951 55.037526562 -74.411016874 54.594993074 -74.843836972 56.348133475 - -74.786079788 57.078385185 + -74.786079790 57.078385164 } 83f0e4fffffffff { -76.032510288 62.170127235 -75.654777178 60.128319517 - -75.733277729 59.394798749 + -75.733277727 59.394798772 -75.863762263 57.852779558 -76.468708910 57.473692346 -76.878502212 59.595379713 @@ -368726,11 +374918,11 @@ -81.865713187 103.649783892 -81.370671266 101.240454042 -81.369847410 96.996173706 - -81.701632869 95.475935273 + -81.701632860 95.475935320 -81.869459922 94.746912816 -82.410591441 97.077563412 -82.402960542 101.799605911 - -82.043164061 102.993556563 + -82.043164072 102.993556523 } 83f119fffffffff { @@ -368758,13 +374950,13 @@ -81.229812000 88.633240443 -81.801566779 90.363285476 -81.869459922 94.746912816 - -81.701632855 95.475935344 + -81.701632860 95.475935320 } 83f11cfffffffff { -81.792756103 108.089493136 -81.865713187 103.649783892 - -82.043164077 102.993556506 + -82.043164072 102.993556523 -82.402960542 101.799605911 -82.899594990 104.823664776 -82.806598209 109.761990156 @@ -368919,11 +375111,11 @@ -81.522829987 138.436378043 -81.303642162 134.796484398 -81.650948322 131.255437016 - -82.049629904 131.206817735 + -82.049629892 131.206817737 -82.242957656 131.354673936 -82.475605165 135.733402843 -82.096729356 139.240031449 - -81.720583342 138.575817505 + -81.720583354 138.575817514 } 83f131fffffffff { @@ -368951,13 +375143,13 @@ -82.239911776 123.294473212 -82.553013512 127.399206738 -82.242957656 131.354673936 - -82.049629886 131.206817738 + -82.049629892 131.206817737 } 83f134fffffffff { -81.116938586 141.592645487 -81.522829987 138.436378043 - -81.720583360 138.575817523 + -81.720583354 138.575817514 -82.096729356 139.240031449 -82.246997044 143.706254629 -81.811011709 146.677216238 @@ -372392,11 +378584,11 @@ -69.673054965 -141.735299246 -70.104247560 -140.839402948 -70.011155012 -139.129934124 - -69.661813322 -138.642387118 + -69.661813333 -138.642387132 -69.480669864 -138.534207145 -69.047167911 -139.719003950 -69.146384769 -141.220539967 - -69.503673182 -141.471590077 + -69.503673172 -141.471590062 } 83f369fffffffff { @@ -372424,13 +378616,13 @@ -69.774873164 -135.742073132 -69.358693112 -137.004780037 -69.480669864 -138.534207145 - -69.661813338 -138.642387139 + -69.661813333 -138.642387132 } 83f36cfffffffff { -69.741677242 -143.408581524 -69.673054965 -141.735299246 - -69.503673166 -141.471590058 + -69.503673172 -141.471590062 -69.146384769 -141.220539967 -68.697535811 -142.327367065 -68.775390439 -143.795852544 @@ -372901,11 +379093,11 @@ { -78.869933689 159.422685942 -79.394673420 157.739258892 - -79.754622238 158.631441739 + -79.754622229 158.631441703 -79.909844705 159.253564473 -79.849771120 162.755698930 -79.326771093 164.105906694 - -79.037329936 162.804859590 + -79.037329945 162.804859628 -78.864178390 162.321323884 } 83f3b1fffffffff @@ -372925,7 +379117,7 @@ -80.416872752 153.817714758 -80.413549671 157.540666172 -79.909844705 159.253564473 - -79.754622223 158.631441689 + -79.754622229 158.631441703 } 83f3b3fffffffff { @@ -372949,7 +379141,7 @@ { -78.321007761 163.705695997 -78.864178390 162.321323884 - -79.037329949 162.804859646 + -79.037329945 162.804859628 -79.326771093 164.105906694 -79.217196502 167.364133274 -78.681737710 168.404977793 diff --git a/tests/inputfiles/uncompact_test1.txt b/tests/inputfiles/uncompact_test1.txt new file mode 100644 index 000000000..faecca4cd --- /dev/null +++ b/tests/inputfiles/uncompact_test1.txt @@ -0,0 +1,15 @@ +[ + "85283447fffffff", + "8528340ffffffff", + "8528340bfffffff", + "85283457fffffff", + "85283443fffffff", + "8528344ffffffff", + "852836b7fffffff", + "8528342bfffffff", + "8528343bfffffff", + "85283407fffffff", + "85283403fffffff", + "8528341bfffffff", + "8428347ffffffff" +] diff --git a/tests/inputfiles/uncompact_test2.txt b/tests/inputfiles/uncompact_test2.txt new file mode 100644 index 000000000..f32646773 --- /dev/null +++ b/tests/inputfiles/uncompact_test2.txt @@ -0,0 +1,13 @@ +85283447fffffff +8528340ffffffff +8528340bfffffff +85283457fffffff +85283443fffffff +8528344ffffffff +852836b7fffffff +8528342bfffffff +8528343bfffffff +85283407fffffff +85283403fffffff +8528341bfffffff +8428347ffffffff diff --git a/tests/inputfiles/uncompact_test3.txt b/tests/inputfiles/uncompact_test3.txt new file mode 100644 index 000000000..0be180eed --- /dev/null +++ b/tests/inputfiles/uncompact_test3.txt @@ -0,0 +1 @@ +85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..b2d6de306 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md index f151477d3..891c9a5bd 100644 --- a/website/README.md +++ b/website/README.md @@ -1,37 +1,31 @@ # H3 Documentation Website -This is the source for the [H3 documentation website](https://uber.github.io/h3/). +This is the source for the [H3 documentation website](https://h3geo.org/). -The source of the pages in the documentation is in the [docs](../docs) directory. +The source of the pages in the documentation is in the [docs](./docs) directory. + +The website is built using [Docusaurus](https://docusaurus.io/). ## Building Locally -Building the documentation requires Node.js. To build and view the H3 documentation, +Building the documentation requires Node.js. To build and view the H3 documentation, run the following from `./website`: ``` -npm install -npm run build -npm start +yarn +yarn start ``` -## Updating the H3 Website +You will then be able to open http://localhost:3000 in your browser. -From `./website`: +You can also test a production-ready build with: -Make sure your `gh-pages` branch is up to date with the upstream repo: ``` -git checkout gh-pages -git pull upstream gh-pages +yarn build ``` -Switch back to `master` and run the build: -``` -git checkout master -./scripts/build-to-gh-pages.sh -``` +## Updating the H3 Website -You're now on branch `gh-pages` again. Push changes to the live site: -``` -git push upstream gh-pages:gh-pages -``` \ No newline at end of file +[Website deployment](https://docusaurus.io/docs/deployment#deploy) happens +automatically via GitHub Actions whenever changes are landed to +the `master` branch. diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 000000000..e00595dae --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/docs/README.md b/website/docs/README.md new file mode 100644 index 000000000..0af10b05f --- /dev/null +++ b/website/docs/README.md @@ -0,0 +1,28 @@ +--- +id: README +title: Introduction +sidebar_label: Introduction +slug: / +--- + +H3 is a geospatial indexing system that partitions the world into hexagonal cells. H3 is open source under the Apache 2 license. + +The H3 Core Library implements the H3 grid system. It includes functions for converting from latitude and longitude coordinates to the containing H3 cell, finding the center of H3 cells, finding the boundary geometry of H3 cells, finding neighbors of H3 cells, and more. + +* The H3 Core Library is written in *C*. [Bindings for many other languages](/docs/community/bindings) are available. + +## Highlights + +* H3 is a hierarchical [geospatial index](/docs/highlights/indexing). +* H3 was developed to address the [challenges of Uber's data science needs](/docs/highlights/aggregation). +* H3 can be used to [join disparate data sets](/docs/highlights/joining). +* In addition to the benefits of the hexagonal grid shape, H3 includes features for [modeling flow](/docs/highlights/flowmodel). +* H3 is well suited to apply [ML to geospatial data](/docs/highlights/ml). + +## Comparisons + +* [S2](/docs/comparisons/s2), an open source, hierarchical, discrete, and global grid system using square cells. +* [Geohash](/docs/comparisons/geohash), a system for encoding locations using a string of characters, creating a hierarchical, square grid system (a quadtree). +* [Hexbin](/docs/comparisons/hexbin), the process of taking coordinates and binning them into hexagonal cells in analytics or mapping software. +* [Admin Boundaries](/docs/comparisons/admin), officially designated areas used for aggregating and analyzing data. +* [Placekey](/docs/comparisons/placekey), a system for encoding points of interest (POIs) which incorporates H3 in its POI identifier. diff --git a/website/docs/api/directededge.mdx b/website/docs/api/directededge.mdx new file mode 100644 index 000000000..5abfc9b98 --- /dev/null +++ b/website/docs/api/directededge.mdx @@ -0,0 +1,686 @@ +--- +id: uniedge +title: Directed edge functions +sidebar_label: Directed edges +slug: /api/uniedge +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Directed edges allow encoding the directed (that is, which cell is the origin and which is the destination can be determined) +edge from one cell to a neighboring cell. + +## areNeighborCells + +Determines whether or not the provided H3 cells are neighbors. + + + + +```c +H3Error areNeighborCells(H3Index origin, H3Index destination, int *out); +``` + +`out` will be 1 if the indexes are neighbors, 0 otherwise. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +boolean areNeighborCells(long origin, long destination); +boolean areNeighborCells(String origin, String destination); +``` + + + + +```js +h3.areNeighborCells(origin, destination) +``` + +```js live +function example() { + const origin = '85283473fffffff'; + const destination = '85283477fffffff'; + return h3.areNeighborCells(origin, destination); +} +``` + + + + +```py +h3.are_neighbor_cells(origin, destination) +``` + + + + +```sql +h3_are_neighbor_cells(origin, destination) +``` + + + + +```sh +$ h3 areNeighborCells --help +h3: Determines if the provided H3 cells are neighbors (have a shared border) +H3 4.1.0 + + areNeighborCells Determines if the provided H3 cells are neighbors (have a shared border) + -o, --origin Required. Origin H3 Cell + -d, --destination Required. Destination H3 Cell + -h, --help Show this help message. + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 areNeighborCells -o 85283473fffffff -d 85283477fffffff +true +``` + + + + + +## cellsToDirectedEdge + +Provides a directed edge H3 index based on the provided origin and +destination. + + + + +```c +H3Error cellsToDirectedEdge(H3Index origin, H3Index destination, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long cellsToDirectedEdge(long origin, long destination); +String cellsToDirectedEdge(String origin, String destination); +``` + + + + +```js +h3.cellsToDirectedEdge(h3Index) +``` + +```js live +function example() { + const origin = '85283473fffffff'; + const destination = '85283477fffffff'; + return h3.cellsToDirectedEdge(origin, destination); +} +``` + + + + +```py +h3.cells_to_directed_edge(origin, destination) +``` + + + + +```sql +h3_cells_to_directed_edge(origin, destination) +``` + + + + +```sh +$ h3 cellsToDirectedEdge --help +h3: Converts neighboring cells into a directed edge index (or errors if they are not neighbors) +H3 4.1.0 + + cellsToDirectedEdge Converts neighboring cells into a directed edge index (or errors if they are not neighbors) + -o, --origin Required. Origin H3 Cell + -d, --destination Required. Destination H3 Cell + -h, --help Show this help message. + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 cellsToDirectedEdge -o 85283473fffffff -d 85283477fffffff +"115283473fffffff" +``` + + + + +## isValidDirectedEdge + +Determines if the provided H3Index is a valid unidirectional edge index. + + + + +```c +int isValidDirectedEdge(H3Index edge); +``` + +Returns `1` if it is a unidirectional edge H3Index, otherwise `0`. + + + + +```java +boolean isValidDirectedEdge(long edge); +boolean isValidDirectedEdge(String edgeAddress); +``` + + + + +```js +h3.isValidDirectedEdge(edge) +``` + +```js live +function example() { + const edge = '115283473fffffff'; + return h3.isValidDirectedEdge(edge); +} +``` + + + + +```py +h3.is_valid_directed_edge(edge) +``` + + + + +```sql +h3_is_valid_directed_edge(edge) +``` + + + + +```sh +$ h3 isValidDirectedEdge --help +h3: Checks if the provided H3 directed edge is actually valid +H3 4.1.0 + + isValidDirectedEdge Checks if the provided H3 directed edge is actually valid + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 isValidDirectedEdge -c 115283473fffffff +true +``` + + + + +## getDirectedEdgeOrigin + +Provides the origin hexagon from the directed edge H3Index. + + + + +```c +H3Error getDirectedEdgeOrigin(H3Index edge, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long getDirectedEdgeOrigin(long edge); +String getDirectedEdgeOrigin(String edgeAddress); +``` + + + + +```js +h3.getDirectedEdgeOrigin(h3Index) +``` + +```js live +function example() { + const edge = '115283473fffffff'; + return h3.getDirectedEdgeOrigin(edge); +} +``` + + + + +```py +h3.get_directed_edge_origin(edge) +``` + + + + +```sql +h3_get_directed_edge_origin(edge) +``` + + + + +```sh +$ h3 getDirectedEdgeOrigin --help +h3: Returns the origin cell from the directed edge +H3 4.1.0 + + getDirectedEdgeOrigin Returns the origin cell from the directed edge + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 getDirectedEdgeOrigin -c 115283473fffffff +"85283473fffffff" +``` + + + + +## getDirectedEdgeDestination + +Provides the destination hexagon from the directed edge H3Index. + + + + +```c +H3Error getDirectedEdgeDestination(H3Index edge, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long getDirectedEdgeDestination(long edge); +String getDirectedEdgeDestination(String edgeAddress); +``` + + + + +```js +h3.getDirectedEdgeDestination(edge) +``` + +```js live +function example() { + const edge = '115283473fffffff'; + return h3.getDirectedEdgeDestination(edge); +} +``` + + + + +```py +h3.get_directed_edge_destination(edge) +``` + + + + +```sql +h3.get_directed_edge_destination(edge) +``` + + + + +```sh +$ h3 getDirectedEdgeDestination --help +h3: Returns the destination cell from the directed edge +H3 4.1.0 + + getDirectedEdgeDestination Returns the destination cell from the directed edge + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 getDirectedEdgeDestination -c 115283473fffffff +"85283477fffffff" +``` + + + + + +## directedEdgeToCells + +Provides the origin-destination pair of cells for the given directed edge. + + + + +```c +H3Error directedEdgeToCells(H3Index edge, H3Index* originDestination); +``` + +The origin and destination are placed at +`originDestination[0]` and `originDestination[1]`, respectively. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List directedEdgeToCells(long edge); +List directedEdgeToCells(String edgeAddress); +``` + + + + +```js +h3.directedEdgeToCells(edge) +``` + +```js live +function example() { + const edge = '115283473fffffff'; + return h3.directedEdgeToCells(edge); +} +``` + + + + +```py +h3.directed_edge_to_cells(edge) +``` + + + + +```sql +h3_directed_edge_to_cells(edge) +``` + + + + +```sh +$ h3 directedEdgeToCells --help +h3: Returns the origin, destination pair of cells from the directed edge +H3 4.1.0 + + directedEdgeToCells Returns the origin, destination pair of cells from the directed edge + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 directedEdgeToCells -c 115283473fffffff +["85283473fffffff", "85283477fffffff"] +``` + + + + +## originToDirectedEdges + +Provides all of the directed edges from the current cell. + + + + +```c +H3Error originToDirectedEdges(H3Index origin, H3Index* edges); +``` + +`edges` must be of length 6, +and the number of directed edges placed in the array may be less than 6. +If this is the case, one of the members of the array will be `0`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List originToDirectedEdges(long h3); +List originToDirectedEdges(String h3); +``` + + + + +```js +h3.originToDirectedEdges(h3Index) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.originToDirectedEdges(h); +} +``` + + + + +```py +h3.origin_to_directed_edges(h) +``` + + + + +```sql +h3_origin_to_directed_edges(h) +``` + + + + +```sh +$ h3 originToDirectedEdges --help +h3: Returns all of the directed edges from the specified origin cell +H3 4.1.0 + + originToDirectedEdges Returns all of the directed edges from the specified origin cell + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 originToDirectedEdges -c 85283473fffffff +["115283473fffffff", "125283473fffffff", "135283473fffffff", "145283473fffffff", "155283473fffffff", "165283473fffffff"] +``` + + + + + +## directedEdgeToBoundary + +Provides the geographic lat/lng coordinates defining the directed edge. +Note that this may be more than two points for complex edges. + + + + +```c +H3Error directedEdgeToBoundary(H3Index edge, CellBoundary* gb); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List directedEdgeToBoundary(long edge); +List directedEdgeToBoundary(String edgeAddress); +``` + + + + +```js +h3.directedEdgeToBoundary(edge, [formatAsGeoJson]) +``` + +```js live +function example() { + const edge = '115283473fffffff'; + return h3.directedEdgeToBoundary(edge); +} +``` + + + + +```py +h3.directed_edge_to_boundary(edge) +``` + + + + +```sql +h3_directed_edge_to_boundary(edge) +``` + + + + +```sh +$ h3 directedEdgeToBoundary --help +h3: Provides the coordinates defining the directed edge +H3 4.1.0 + + directedEdgeToBoundary Provides the coordinates defining the directed edge + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for [[lat, lng], ...], 'wkt' for a WKT POLYGON, 'newline' for lat\nlng\n... (Default: json) +``` + +```bash +$ h3 directedEdgeToBoundary -c 115283473fffffff +[[37.4201286777, -122.0377349643], [37.3375560844, -122.0904289290]] +``` + + + diff --git a/website/docs/api/hierarchy.mdx b/website/docs/api/hierarchy.mdx new file mode 100644 index 000000000..db2c72c35 --- /dev/null +++ b/website/docs/api/hierarchy.mdx @@ -0,0 +1,790 @@ +--- +id: hierarchy +title: Hierarchical grid functions +sidebar_label: Hierarchy +slug: /api/hierarchy +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +These functions permit moving between resolutions in the H3 grid system. +The functions produce parent cells (coarser), or child cells (finer). + +## cellToParent + +Provides the unique ancestor (coarser) cell of the given `cell` for +the provided resolution. If the input cell has resolution `r`, then +`parentRes = r - 1` would give the immediate parent, +`parentRes = r - 2` would give the grandparent, and so on. + + + + +```c +H3Error cellToParent(H3Index cell, int parentRes, H3Index *parent); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long cellToParent(long cell, int parentRes); +String cellToParentAddress(String cellAddress, int parentRes); +``` + + + + +```js +h3.cellToParent(cell, parentRes) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToParent(cell, 4); +} +``` + + + + +```py +h3.cell_to_parent(h, res=None) +``` + +If `res = None`, we set `res = resolution(h) - 1`. +See the [h3-py docs](https://uber.github.io/h3-py/api_verbose.html#h3.cell_to_parent). + + + + +```sql +h3_cell_to_parent(h, res) +``` + + + + +```sh +$ h3 cellToParent --help +h3: Returns the H3 index that is the parent (or higher) of the provided cell +H3 4.1.0 + + cellToParent Returns the H3 index that is the parent (or higher) of the provided cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 0-14 inclusive, excluding 15 as it can never be a parent + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 cellToParent -c 85283473fffffff -r 4 +"8428347ffffffff" +``` + + + + + +## cellToChildren + +Provides the children (descendant) cells of `cell` at +resolution `childRes`. + + + + +```c +H3Error cellToChildren(H3Index cell, int childRes, H3Index *children); +``` + +`children` must be an array of at least size `cellToChildrenSize(cell, childRes)`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List cellToChildren(long cell, int childRes); +List cellToChildren(String cellAddress, int childRes); +``` + + + + +```js +h3.cellToChildren(cell, childRes) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToChildren(cell, 6); +} +``` + + + + +```py +h3.cell_to_children(h, res=None) +``` + +If `res = None`, we set `res = resolution(h) + 1`. +See the [h3-py docs](https://uber.github.io/h3-py/api_verbose.html#h3.cell_to_children). + + + + +```sql +h3_cell_to_children(h, res) +``` + + + + +```sh +$ h3 cellToChildren --help +h3: Returns an array of H3 indexes that are the children (or lower) of the provided cell +H3 4.1.0 + + cellToChildren Returns an array of H3 indexes that are the children (or lower) of the provided cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 1-15 inclusive, excluding 0 as it can never be a child + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 cellToChildren -c 85283473fffffff -r 6 +[ "862834707ffffff", "86283470fffffff", "862834717ffffff", "86283471fffffff", "862834727ffffff", "86283472fffffff", "862834737ffffff" ] +``` + + + + + +## cellToChildrenSize + +Provides the number of children at a given resolution of the given cell. + + + + +```c +H3Error cellToChildrenSize(H3Index cell, int childRes, int64_t *out); +``` + +Provides the size of the `children` array needed for the given inputs to `cellToChildren`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +```py +h3.cell_to_children_size(h, res=None) +``` + +If `res = None`, we set `res = resolution(h) + 1`. +See the [h3-py docs](https://uber.github.io/h3-py/api_verbose.html#h3.cell_to_children_size). + + + + +```sql +h3_cell_to_children_size(h, res) +``` + + + + +```sh +$ h3 cellToChildrenSize --help +h3: Returns the maximum number of children for a given cell at the specified child resolution +H3 4.1.0 + + cellToChildrenSize Returns the maximum number of children for a given cell at the specified child resolution + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 1-15 inclusive, excluding 0 as it can never be a child +``` + +```bash +$ h3 cellToChildrenSize -c 85283473fffffff -r 6 +7 +``` + + + + + +## cellToCenterChild + +Provides the center child (finer) cell contained by `cell` at resolution `childRes`. + + + + +```c +H3Error cellToCenterChild(H3Index cell, int childRes, H3Index *child); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + + +```java +long cellToCenterChild(long cell, int childRes); +String cellToCenterChild(String cellAddress, int childRes); +``` + + + + +```js +h3.cellToCenterChild(cell, childRes) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToCenterChild(cell, 7); +} +``` + + + + +```py +h3.cell_to_center_child(h, res=None) +``` + +If `res = None`, we set `res = resolution(h) + 1`. +See the [h3-py docs](https://uber.github.io/h3-py/api_verbose.html#h3.cell_to_center_child). + + + + +```sql +h3_cell_to_center_child(h, res) +``` + + + + +```sh +$ h3 cellToCenterChild --help +h3: Returns the H3 index that is the centrally-placed child (or lower) of the provided cell +H3 4.1.0 + + cellToCenterChild Returns the H3 index that is the centrally-placed child (or lower) of the provided cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 1-15 inclusive, excluding 0 as it can never be a child + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 cellToCenterChild -c 85283473fffffff -r 7 +"872834700ffffff" +``` + + + + + +## cellToChildPos + +Provides the position of the child cell within an ordered list of all children of the cell's parent at the specified resolution `parentRes`. +The order of the ordered list is the same as that returned by `cellToChildren`. +This is the complement of `childPosToCell`. + + + + +```c +H3Error cellToChildPos(H3Index child, int parentRes, int64_t *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long cellToChildPos(long child, int parentRes); +long cellToChildPos(String childAddress, int parentRes); +``` + + + + +```js +h3.cellToChildPos(child, parentRes) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToChildPos(cell, 3); +} +``` + + + + +```py +h3.cell_to_child_pos(child, res_parent) +``` + + + + +```sql +h3_cell_to_child_pos(child, res_parent) +``` + + + + +```sh +$ h3 cellToChildPos --help +h3: Returns the position of the child cell within an ordered list of all children of the cell's parent at the specified child resolution +H3 4.1.0 + + cellToChildPos Returns the position of the child cell within an ordered list of all children of the cell's parent at the specified child resolution + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 1-15 inclusive, excluding 0 as it can never be a child +``` + +```bash +$ h3 cellToChildPos -c 85283473fffffff -r 3 +25 +``` + + + + + +## childPosToCell + +Provides the child cell at a given position within an ordered list of all children of `parent` at the specified resolution `childRes`. +The order of the ordered list is the same as that returned by `cellToChildren`. +This is the complement of `cellToChildPos`. + + + + +```c +H3Error childPosToCell(int64_t childPos, H3Index parent, int childRes, H3Index *child); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + + +```java +long childPosToCell(long childPos, long parent, int childRes); +String childPosToCell(long childPos, String parentAddress, int childRes); +``` + + + + +```js +h3.childPosToCell(childPos, parent, childRes); +``` + +```js live +function example() { + const parent = '85283473fffffff'; + const childPos = 42; + return h3.childPosToCell(childPos, parent, 7); +} +``` + + + + +```py +h3.child_pos_to_cell(parent, res_child, child_pos) +``` + + + + +```sql +h3_child_pos_to_cell(parent, res_child, child_pos) +``` + + + + +```sh +$ h3 childPosToCell --help +h3: Returns the child cell at a given position and resolution within an ordered list of all children of the parent cell +H3 4.1.0 + + childPosToCell Returns the child cell at a given position and resolution within an ordered list of all children of the parent cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -r, --resolution Required. Resolution, 1-15 inclusive, excluding 0 as it can never be a child + -p, --position Required. The child position within the set of children of the parent cell + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 childPosToCell -p 42 -c 85283473fffffff -r 7 +"872834730ffffff" +``` + + + + + +## compactCells + +Compacts a collection of H3 cells by recursively replacing children cells +with their parents if all children are present. +Input cells must all share the same resolution. + + + + +```c +H3Error compactCells(const H3Index *cellSet, H3Index *compactedSet, const int64_t numCells); +``` + +Compacts `cellSet` into the array `compactedSet`. +`compactedSet` must be at least the size of `cellSet` (in case the set cannot be compacted). + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List compactCells(Collection cells); +List compactCellAddress(Collection cells); +``` + + + + +```js +h3.compactCells(cells) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + const nearby = h3.gridDisk(cell, 4); + return h3.compactCells(nearby); +} +``` + + + + +```py +h3.compact_cells(cells) +``` + + + + +```sql +h3_compact_cells(cells) +``` + + + + +```sh +$ h3 compactCells --help +h3: Compacts the provided set of cells as best as possible. The set of input cells must all share the same resolution. +H3 4.1.0 + + compactCells Compacts the provided set of cells as best as possible. The set of input cells must all share the same resolution. + -h, --help Show this help message. + -i, --file The file to load the cells from. Use -- to read from stdin. + -c, --cells The cells to compact. Up to 100 cells if provided as hexadecimals with zero padding. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 compactCells -c 85283473fffffff,85283447fffffff,8528347bfffffff,85283463fffffff,85283477fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528346bfffffff,8528346ffffffff,85283467fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff +[ "85283447fffffff", "8528340ffffffff", "8528340bfffffff", "85283457fffffff", "85283443fffffff", "8528344ffffffff", "852836b7fffffff", "8528342bfffffff", "8528343bfffffff", "85283407fffffff", "85283403fffffff", "8528341bfffffff", "8428347ffffffff" ] +``` + + + + +## uncompactCells + +Uncompacts the set `compactedSet` of indexes to the resolution `res`. +`h3Set` must be at least of size `uncompactCellsSize(compactedSet, numHexes, res)`. + + + + +```c +H3Error uncompactCells(const H3Index *compactedSet, const int64_t numCells, H3Index *cellSet, const int64_t maxCells, const int res); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List uncompactCells(Collection cells, int res); +List uncompactCellAddress(Collection cells, int res); +``` + + + + +```js +h3.uncompactCells(cells, res) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + const nearby = h3.gridDisk(cell, 4); + const compacted = h3.compactCells(nearby); + return h3.uncompactCells(compacted, 5); +} +``` + + + + +```py +h3.uncompact_cells(cells, res) +``` + + + + +```sql +h3_uncompact_cells(cells, res) +``` + + + + +```sh +$ h3 uncompactCells --help +h3: Unompacts the provided set of compacted cells.The uncompacted cells will be printed one per line to stdout. +H3 4.1.0 + + uncompactCells Unompacts the provided set of compacted cells.The uncompacted cells will be printed one per line to stdout. + -h, --help Show this help message. + -i, --file The file to load the cells from. Use -- to read from stdin. + -c, --cells The cells to uncompact. Up to 100 cells if provided as hexadecimals with zero padding. + -r, --resolution Required. Resolution, 0-15 inclusive, that the compacted set should be uncompacted to. Must be greater than or equal to the highest resolution within the compacted set. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 uncompactCells -r 5 -c 85283447fffffff,8528340ffffffff,8528340bfffffff,85283457fffffff,85283443fffffff,8528344ffffffff,852836b7fffffff,8528342bfffffff,8528343bfffffff,85283407fffffff,85283403fffffff,8528341bfffffff,8428347ffffffff +[ "85283447fffffff", "8528340ffffffff", "8528340bfffffff", "85283457fffffff", "85283443fffffff", "8528344ffffffff", "852836b7fffffff", "8528342bfffffff", "8528343bfffffff", "85283407fffffff", "85283403fffffff", "8528341bfffffff", "85283463fffffff", "85283467fffffff", "8528346bfffffff", "8528346ffffffff", "85283473fffffff", "85283477fffffff", "8528347bfffffff" ] +``` + + + + + +## uncompactCellsSize + +Provides the total resulting number of cells if uncompacting a cell set to +a given resolution. + + + + +```c +H3Error uncompactCellsSize(const H3Index *compactedSet, const int64_t numCompacted, const int res, int64_t *out); +``` + +Provides the size of the array needed by `uncompactCells` into `out`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + diff --git a/website/docs/api/indexing.mdx b/website/docs/api/indexing.mdx new file mode 100644 index 000000000..db570ff13 --- /dev/null +++ b/website/docs/api/indexing.mdx @@ -0,0 +1,290 @@ +--- +id: indexing +title: Indexing functions +sidebar_label: Indexing +slug: /api/indexing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +These functions are used for finding the H3 cell index containing coordinates, +and for finding the center and boundary of H3 cells. + +## latLngToCell + +Indexes the location at the specified resolution, +providing the index of the cell containing the location. +This buckets the geographic point into the H3 grid. +For more information, see the +[algorithm description](../core-library/latLngToCellDesc). + + + + +```c +H3Error latLngToCell(const LatLng *g, int res, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long latLngToCell(double lat, double lng, int res); +String latLngToCellAddress(double lat, double lng, int res); +``` + + + + +```js +h3.latLngToCell(lat, lng, res) +``` + +```js live +function example() { + const lat = 45; + const lng = 40; + const res = 2; + return h3.latLngToCell(lat, lng, res); +} +``` + + + + +```py +h3.latlng_to_cell(lat, lng, resolution) +``` + + + + +```sql +h3_latlng_to_cell(lat, lng, resolution) +``` + +```sql +h3_latlng_to_cell_string(lat, lng, resolution) +``` + + + + +```sh +$ h3 latLngToCell --help +h3: Convert degrees latitude/longitude coordinate to an H3 cell +H3 4.1.0 + + latLngToCell Convert degrees latitude/longitude coordinate to an H3 cell + -h, --help Show this help message. + -r, --resolution Required. Resolution, 0-15 inclusive. + --lat, --latitude Required. Latitude in degrees. + --lng, --longitude Required. Longitude in degrees. + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 latLngToCell --lat 45 --lng 40 -r 2 +"822d57fffffffff" +``` + + + + +## cellToLatLng + +Finds the center of the cell in grid space. See the +[algorithm description](../core-library/cellToLatLngDesc) for +more information. + +The center will drift versus the centroid +of the cell on Earth due to distortion from the gnomonic +projection within the icosahedron face it resides on and its +distance from the center of the icosahedron face. + + + + +```c +H3Error cellToLatLng(H3Index cell, LatLng *g); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +LatLng cellToLatLng(long cell); +LatLng cellToLatLng(String cellAddress); +``` + + + + +```js +h3.cellToLatLng(cell) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToLatLng(cell); +} +``` + + + + +```py +h3.cell_to_latlng(cell) +``` + + + + +```sql +h3_cell_to_latlng(cell) +``` +```sql +h3_cell_to_lat(cell) +``` +```sql +h3_cell_to_lng(cell) +``` + + + + +```sh +$ h3 cellToLatLng --help +h3: Convert an H3Cell to a coordinate +H3 4.1.0 + + cellToLatLng Convert an H3Cell to a coordinate + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for [lat, lng], 'wkt' for a WKT POINT, 'newline' for lat\nlng\n (Default: json) +``` + +```bash +$ h3 cellToLatLng -c 85283473fffffff +[37.3457933754, -121.9763759726] +``` + + + + + +## cellToBoundary + +Finds the boundary of the cell. +For more information, see the +[algorithm description](../core-library/cellToBoundaryDesc). + + + + +```c +H3Error cellToBoundary(H3Index cell, CellBoundary *bndry); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List cellToBoundary(long cell); +List cellToBoundary(String cellAddress); +``` + + + + +```js +h3.cellToBoundary(cell, [formatAsGeoJson]) +``` + +```js live +function example() { + const cell = '85283473fffffff'; + return h3.cellToBoundary(cell); +} +``` + + + + +```py +h3.cell_to_boundary(cell) +``` + +Returns tuple of lat/lng tuples. +For GeoJSON compatibility (lng/lat order), see the +[`h3-py` docs](https://uber.github.io/h3-py/api_quick.html#polygon-interface). + + + + +```sql +h3_cell_to_boundary_wkt(cell) +``` + + + + +```sh +$ h3 cellToBoundary --help +h3: Convert an H3 cell to a polygon defining its boundary +H3 4.1.0 + + cellToBoundary Convert an H3 cell to a polygon defining its boundary + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for [[lat, lng], ...], 'wkt' for a WKT POLYGON, 'newline' for lat\nlng\n... (Default: json) +``` + +```bash +$ h3 cellToBoundary -c 85283473fffffff +[[37.2713558667, -121.9150803271], [37.3539264509, -121.8622232890], [37.4283411861, -121.9235499963], [37.4201286777, -122.0377349643], [37.3375560844, -122.0904289290], [37.2631979746, -122.0291013092]] +``` + + + diff --git a/website/docs/api/inspection.mdx b/website/docs/api/inspection.mdx new file mode 100644 index 000000000..d721f92ee --- /dev/null +++ b/website/docs/api/inspection.mdx @@ -0,0 +1,709 @@ +--- +id: inspection +title: Index inspection functions +sidebar_label: Inspection +slug: /api/inspection +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +These functions provide metadata about an H3 index, such as its resolution or base cell, and provide utilities for converting into and out of the 64-bit representation of an H3 index. + +## getResolution + +Returns the resolution of the index. +(Works for cells, edges, and vertexes.) + + + + +```c +int getResolution(H3Index h); +``` + + + + +```java +int getResolution(long h3); +int getResolution(String h3Address); +``` + + + + +```js +h3.getResolution(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.getResolution(h); +} +``` + + + + +```py +h3.get_resolution(h) +``` + + + + +```sql +h3_get_resolution(h) +``` + + + + +```sh +$ h3 getResolution --help +h3: Extracts the resolution (0 - 15) from the H3 cell +H3 4.1.0 + + getResolution Extracts the resolution (0 - 15) from the H3 cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell +``` + +```bash +$ h3 getResolution -c 85283473fffffff +5 +``` + + + + + +## getBaseCellNumber + +Returns the base cell number of the index. +(Works for cells, edges, and vertexes.) + + + + +```c +int getBaseCellNumber(H3Index h); +``` + + + + +```java +int getBaseCellNumber(long h3); +int getBaseCellNumber(String h3Address); +``` + + + + +```js +h3.getBaseCellNumber(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.getBaseCellNumber(h); +} +``` + + + + +```py +h3.get_base_cell_number(h) +``` + + + + +```sql +h3_get_base_cell_number(h) +``` + + + + +```sh +$ h3 getBaseCellNumber --help +h3: Extracts the base cell number (0 - 121) from the H3 cell +H3 4.1.0 + + getBaseCellNumber Extracts the base cell number (0 - 121) from the H3 cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell +``` + +```bash +$ h3 getBaseCellNumber -c 85283473fffffff +20 +``` + + + + +## stringToH3 + +Converts the string representation to `H3Index` (`uint64_t`) representation. + + + + +```c +H3Error stringToH3(const char *str, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long stringToH3(String h3Address); +``` + + + + +:::note + +The H3 JavaScript binding supports only the string representation of an H3 index. + +::: + + + + +```py +h3.str_to_int(h) +``` + + + + +```sql +h3_string_to_h3(h) +``` + + + + +:::note + +The H3 CLI supports only the string representation of an H3 index. + +::: + + + + + +## h3ToString + +Converts the `H3Index` representation of the index to the string representation. + + + + +```c +H3Error h3ToString(H3Index h, char *str, size_t sz); +``` + +`str` must be at least of length 17. +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +String h3ToString(long h3); +``` + + + + +:::note + +The H3 JavaScript binding supports only the string representation of an H3 index. + +::: + + + + +```py +h3.int_to_str(h) +``` + + + + +```sql +h3_h3_to_string(h) +``` + + + + +:::note + +The H3 CLI supports only the string representation of an H3 index. + +::: + + + + + + +## isValidCell + +Returns non-zero if this is a valid H3 cell index. + + + + +```c +int isValidCell(H3Index h); +``` + + + + +```java +boolean isValidCell(long h3); +boolean isValidCell(String h3Address); +``` + + + + +```js +h3.isValidCell(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.isValidCell(h); +} +``` + + + + +```py +h3.is_valid_cell(h) +``` + + + + +```sql +h3_is_valid_cell(h) +``` + + + + +```sh +$ h3 isValidCell --help +h3: Checks if the provided H3 index is actually valid +H3 4.1.0 + + isValidCell Checks if the provided H3 index is actually valid + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 isValidCell -c 85283473fffffff +true +``` + + + + + +## isResClassIII + +Returns non-zero if this index has a resolution with Class III orientation. + + + + +```c +int isResClassIII(H3Index h); +``` + + + + +```java +boolean isResClassIII(long h3); +boolean isResClassIII(String h3Address); +``` + + + + +```js +h3.isResClassIII(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.isResClassIII(h); +} +``` + + + + +```py +h3.is_res_class_III(h) +``` + + + + +```sql +h3_is_res_class_iii(h) +``` + + + + +```sh +$ h3 isResClassIII --help +h3: Checks if the provided H3 index has a Class III orientation +H3 4.1.0 + + isResClassIII Checks if the provided H3 index has a Class III orientation + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 isResClassIII -c 85283473fffffff +true +``` + + + + + +## isPentagon + +Returns non-zero if this index represents a pentagonal cell. + + + + +```c +int isPentagon(H3Index h); +``` + + + + +```java +boolean isPentagon(long h3); +boolean isPentagon(String h3Address); +``` + + + + +```js +h3.isPentagon(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.isPentagon(h); +} +``` + + + + +```py +h3.is_pentagon(h) +``` + + + + +```sql +h3_is_pentagon(h) +``` + + + + +```sh +$ h3 isPentagon --help +h3: Checks if the provided H3 index is a pentagon instead of a hexagon +H3 4.1.0 + + isPentagon Checks if the provided H3 index is a pentagon instead of a hexagon + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 isPentagon -c 85283473fffffff +false +``` + + + + + +## getIcosahedronFaces + +Find all icosahedron faces intersected by a given H3 cell. +Faces are represented as integers from 0-19, inclusive. + + + + +```c +H3Error getIcosahedronFaces(H3Index h, int* out); +``` + +Face values are placed in the array `out`. +`out` must be at least length of `maxFaceCount(h)`. +The array is sparse, and empty (no intersection) array values are represented by -1. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +Collection getIcosahedronFaces(long h3); +Collection getIcosahedronFaces(String h3Address); +``` + + + + +```js +h3.getIcosahedronFaces(h) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.getIcosahedronFaces(h); +} +``` + + + + +```py +h3.get_icosahedron_faces(h) +``` + + + + +```sql +h3_get_icosahedron_faces(h) +``` + + + + +```sh +$ h3 getIcosahedronFaces --help +h3: Returns the icosahedron face numbers (0 - 19) that the H3 index intersects +H3 4.1.0 + + getIcosahedronFaces Returns the icosahedron face numbers (0 - 19) that the H3 index intersects + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for [faceNum, ...], 'newline' for faceNum\n... (Default: json) +``` + +```bash +$ h3 getIcosahedronFaces -c 85283473fffffff +[7] +``` + + + +## maxFaceCount + +Returns the maximum number of icosahedron faces the given H3 index may intersect. + + + + +```c +H3Error maxFaceCount(H3Index h3, int *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + diff --git a/website/docs/api/misc.mdx b/website/docs/api/misc.mdx new file mode 100644 index 000000000..5fe03c59d --- /dev/null +++ b/website/docs/api/misc.mdx @@ -0,0 +1,1689 @@ +--- +id: misc +title: Miscellaneous H3 functions +sidebar_label: Miscellaneous +slug: /api/misc +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +These functions include descriptions of the H3 grid system. + +## degsToRads + +Converts degrees to radians. + + + + +```c +double degsToRads(double degrees); +``` + + + + +:::note + +Use `java.lang.Math.toRadians(double degrees)` instead. + +::: + + + + +```js +h3.degsToRads(degrees) +``` + +```js live +function example() { + const degrees = 45; + return h3.degsToRads(degrees); +} +``` + + + + +:::note + +Use `math.radians(degrees)` instead. + +::: + + + + +:::note + +Use `radians(degrees)` instead. + +::: + + + + +```sh +$ h3 degsToRads --help +h3: Converts degrees to radians +H3 4.1.0 + + degsToRads Converts degrees to radians + -d, --degree Required. Angle in degrees + -h, --help Show this help message. +``` + +```bash +$ h3 degsToRads -d 180 +3.1415926536 +``` + + + + +## radsToDegs + +Converts radians to degrees. + + + + +```c +double radsToDegs(double radians); +``` + + + + +:::note + +Use `java.lang.Math.toDegrees(double radians)` instead. + +::: + + + + +```js +h3.radsToDegs(h) +``` + +```js live +function example() { + const radians = 3.14159; + return h3.radsToDegs(radians); +} +``` + + + + +:::note + +Use `math.degrees(radians)` instead. + +::: + + + + +:::note + +Use `degrees(radians)` instead. + +::: + + + + +```sh +$ h3 radsToDegs --help +h3: Converts radians to degrees +H3 4.1.0 + + radsToDegs Converts radians to degrees + -r, --radian Required. Angle in radians + -h, --help Show this help message. +``` + +```bash +$ h3 radsToDegs -r 1 +57.2957795131 +``` + + + + +## getHexagonAreaAvgKm2 + +Average hexagon area in square kilometers at the given resolution. +Excludes pentagons. + + + + +```c +H3Error getHexagonAreaAvgKm2(int res, double *out); +``` + + + + +```java +double getHexagonAreaAvg(int res, AreaUnit unit); +``` + + + + +```js +h3.getHexagonAreaAvg(res, h3.UNITS.km2) +``` + +```js live +function example() { + const res = 5; + return h3.getHexagonAreaAvg(res, h3.UNITS.km2); +} +``` + + + + +```py +h3.average_hexagon_area(res, unit='km^2') +``` + + + + +```sql +h3_average_hexagon_area(res, 'km^2') +``` + + + + +```sh +$ h3 getHexagonAreaAvgKm2 --help +h3: The average area in square kilometers for a hexagon of a given resolution (excludes pentagons) +H3 4.1.0 + + getHexagonAreaAvgKm2 The average area in square kilometers for a hexagon of a given resolution (excludes pentagons) + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. +``` + +```bash +$ h3 getHexagonAreaAvgKm2 -r 1 +609788.4417941332 +``` + + + + +## getHexagonAreaAvgM2 + +Average hexagon area in square meters at the given resolution. +Excludes pentagons. + + + + +```c +H3Error getHexagonAreaAvgM2(int res, double *out); +``` + + + + +```java +double getHexagonAreaAvg(int res, AreaUnit unit); +``` + + + + +```js +h3.getHexagonAreaAvg(res, h3.UNITS.m2) +``` + +```js live +function example() { + const res = 5; + return h3.getHexagonAreaAvg(res, h3.UNITS.m2); +} +``` + + + + +```py +h3.average_hexagon_area(res, unit='m^2') +``` + + + + +```sql +h3_average_hexagon_area(res, 'm^2') +``` + + + + +```sh +$ h3 getHexagonAreaAvgM2 --help +h3: The average area in square meters for a hexagon of a given resolution (excludes pentagons) +H3 4.1.0 + + getHexagonAreaAvgM2 The average area in square meters for a hexagon of a given resolution (excludes pentagons) + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. +``` + +```bash +$ h3 getHexagonAreaAvgM2 -r 5 +252903858.1819452047 +``` + + + + + +## cellAreaRads2 + +Exact area of specific cell in square radians. + + + + +```c +H3Error cellAreaRads2(H3Index h, double *out); +``` + + + + +```java +double cellArea(long h3, AreaUnit unit); +int cellArea(String h3Address, AreaUnit unit); +``` + + + + +```js +h3.cellArea(h, h3.UNITS.rads2) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.cellArea(h, h3.UNITS.rads2); +} +``` + + + + +```py +h3.cell_area(h, unit='rads^2') +``` + + + + +```sql +h3_cell_area(h, 'rads^2') +``` + + + + +```sh +$ h3 cellAreaRads2 --help +h3: The exact area of a specific cell in square radians +H3 4.1.0 + + cellAreaRads2 The exact area of a specific cell in square radians + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 cellAreaRads2 -c 85283473fffffff +0.0000065310 +``` + + + + +## cellAreaKm2 + +Exact area of specific cell in square kilometers. + + + + +```c +H3Error cellAreaKm2(H3Index h, double *out); +``` + + + + +```java +double cellArea(long h3, AreaUnit unit); +int cellArea(String h3Address, AreaUnit unit); +``` + + + + +```js +h3.cellArea(h, h3.UNITS.km2) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.cellArea(h, h3.UNITS.km2); +} +``` + + + + +```py +h3.cell_area(h, unit='km^2') +``` + + + + +```sql +h3_cell_area(h, 'km^2') +``` + + + + +```sh +$ h3 cellAreaKm2 --help +h3: The exact area of a specific cell in square kilometers +H3 4.1.0 + + cellAreaKm2 The exact area of a specific cell in square kilometers + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 cellAreaKm2 -c 85283473fffffff +265.0925581283 +``` + + + + +## cellAreaM2 + +Exact area of specific cell in square meters. + + + + +```c +H3Error cellAreaM2(H3Index h, double *out); +``` + + + + +```java +double cellArea(long h3, AreaUnit unit); +int cellArea(String h3Address, AreaUnit unit); +``` + + + + +```js +h3.cellArea(h, h3.UNITS.m2) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.cellArea(h, h3.UNITS.m2); +} +``` + + + + +```py +h3.cell_area(h, unit='m^2') +``` + + + + +```sql +h3_cell_area(h, 'm^2') +``` + + + + +```sh +$ h3 cellAreaM2 --help +h3: The exact area of a specific cell in square meters +H3 4.1.0 + + cellAreaM2 The exact area of a specific cell in square meters + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 cellAreaM2 -c 85283473fffffff +265092558.1282823086 +``` + + + + +## getHexagonEdgeLengthAvgKm + +Average hexagon edge length in kilometers at the given resolution. +Excludes pentagons. + + + + +```c +H3Error getHexagonEdgeLengthAvgKm(int res, double *out); +``` + + + + +```java +double getHexagonEdgeLengthAvg(int res, LengthUnit unit); +``` + + + + +```js +h3.getHexagonEdgeLengthAvg(res, h3.UNITS.km) +``` + +```js live +function example() { + const res = 5; + return h3.getHexagonEdgeLengthAvg(res, h3.UNITS.km); +} +``` + + + + +```py +h3.average_hexagon_edge_length(res, unit='km') +``` + + + + +```sql +h3_average_hexagon_edge_length(res, 'km') +``` + + + + +```sh +$ h3 getHexagonEdgeLengthAvgKm --help +h3: The average hexagon edge length in kilometers of a given resolution (excludes pentagons) +H3 4.1.0 + + getHexagonEdgeLengthAvgKm The average hexagon edge length in kilometers of a given resolution (excludes pentagons) + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. +``` + +```bash +$ h3 getHexagonEdgeLengthAvgKm -r 5 +9.8540909900 +``` + + + + + +## getHexagonEdgeLengthAvgM + +Average hexagon edge length in meters at the given resolution. +Excludes pentagons. + + + + +```c +H3Error getHexagonEdgeLengthAvgM(int res, double *out); +``` + + + + +```java +double getHexagonEdgeLengthAvg(int res, LengthUnit unit); +``` + + + + +```js +h3.getHexagonEdgeLengthAvg(res, h3.UNITS.m) +``` + +```js live +function example() { + const res = 5; + return h3.getHexagonEdgeLengthAvg(res, h3.UNITS.m); +} +``` + + + + +```py +h3.average_hexagon_edge_length(res, unit='m') +``` + + + + +```sql +h3_average_hexagon_edge_length(res, 'm') +``` + + + + +```sh +$ h3 getHexagonEdgeLengthAvgM --help +h3: The average hexagon edge length in meters of a given resolution (excludes pentagons) +H3 4.1.0 + + getHexagonEdgeLengthAvgM The average hexagon edge length in meters of a given resolution (excludes pentagons) + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. +``` + +```bash +$ h3 getHexagonEdgeLengthAvgM -r 5 +9854.0909900000 +``` + + + + + +## edgeLengthKm + +Exact edge length of specific unidirectional edge in kilometers. + + + + +```c +H3Error edgeLengthKm(H3Index edge, double *length); +``` + + + + +```java +double edgeLength(long h3, LengthUnit unit); +double edgeLength(String h3Address, LengthUnit unit); +``` + + + + +```js +h3.edgeLength(h3, h3.UNITS.km) +``` + +```js live +function example() { + const h = '115283473fffffff'; + return h3.edgeLength(h, h3.UNITS.km); +} +``` + + + + +```py +h3.edge_length(h, unit='km') +``` + + + + +```sql +h3_edge_length(h, 'km') +``` + + + + +```sh +$ h3 edgeLengthKm --help +h3: The exact edge length of a specific directed edge in kilometers +H3 4.1.0 + + edgeLengthKm The exact edge length of a specific directed edge in kilometers + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 edgeLengthKm -c 115283473fffffff +10.2947360862 +``` + + + + + +## edgeLengthM + +Exact edge length of specific unidirectional edge in meters. + + + + +```c +H3Error edgeLengthM(H3Index edge, double *length); +``` + + + + +```java +double edgeLength(long h3, LengthUnit unit); +double edgeLength(String h3Address, LengthUnit unit); +``` + + + + +```js +h3.edgeLength(h3, h3.UNITS.m) +``` + +```js live +function example() { + const h = '115283473fffffff'; + return h3.edgeLength(h, h3.UNITS.m); +} +``` + + + + +```py +h3.edge_length(h, unit='m') +``` + + + + +```sql +h3_edge_length(h, 'm') +``` + + + + +```sh +$ h3 edgeLengthM --help +h3: The exact edge length of a specific directed edge in meters +H3 4.1.0 + + edgeLengthM The exact edge length of a specific directed edge in meters + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 edgeLengthM -c 115283473fffffff +10294.7360861995 +``` + + + + + +## edgeLengthRads + +Exact edge length of specific unidirectional edge in radians. + + + + +```c +H3Error edgeLengthRads(H3Index edge, double *length); +``` + + + + +```java +double edgeLength(long h3, LengthUnit unit); +double edgeLength(String h3Address, LengthUnit unit); +``` + + + + +```js +h3.edgeLength(h3, h3.UNITS.rads) +``` + +```js live +function example() { + const h = '115283473fffffff'; + return h3.edgeLength(h, h3.UNITS.rads); +} +``` + + + + +```py +h3.edge_length(h, unit='rads') +``` + + + + +```sql +h3_edge_length(h, 'rads') +``` + + + + +```sh +$ h3 edgeLengthRads --help +h3: The exact edge length of a specific directed edge in radians +H3 4.1.0 + + edgeLengthRads The exact edge length of a specific directed edge in radians + -c, --cell Required. H3 Cell + -h, --help Show this help message. +``` + +```bash +$ h3 edgeLengthRads -c 115283473fffffff +0.0016158726 +``` + + + + + +## getNumCells + +Number of unique H3 indexes at the given resolution. + + + + +```c +H3Error getNumCells(int res, int64_t *out); +``` + + + + +```java +long getNumCells(int res); +``` + + + + +```js +h3.getNumCells(res) +``` + +```js live +function example() { + const res = 5; + return h3.getNumCells(res); +} +``` + + + + +```py +h3.get_num_cells(res) +``` + + + + +```sql +h3_get_num_cells(res) +``` + + + + +```sh +$ h3 getNumCells --help +h3: The number of unique H3 cells for a specified resolution +H3 4.1.0 + + getNumCells The number of unique H3 cells for a specified resolution + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. +``` + +```bash +$ h3 getNumCells -r 5 +2016842 +``` + + + + + +## getRes0Cells + +Provide all the resolution `0` H3 cells. +These are the coarsest cells that can be represented in the H3 system and are +the parents/ancestors of all other cells in the H3 grid system. +The returned cells correspond to the 122 base cells. + + + + +```c +H3Error getRes0Cells(H3Index *out); +``` + +`out` must be an array of at least size `res0CellCount()`. + + + + +```java +Collection getRes0Cells(); +Collection getRes0CellAddresses(); +``` + + + + +```js +h3.getRes0Cells() +``` + +```js live +function example() { + return h3.getRes0Cells(); +} +``` + + + + +```py +h3.get_res0_cells() +``` + + + + +```sql +h3_get_res0_cells() +``` +```sql +h3_get_res0_cells_string() +``` + + + + +```sh +$ h3 getRes0Cells --help +h3: Returns all of the resolution 0 cells +H3 4.1.0 + + getRes0Cells Returns all of the resolution 0 cells + -h, --help Show this help message. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 getRes0Cells +[ "8001fffffffffff", "8003fffffffffff", "8005fffffffffff", "8007fffffffffff", "8009fffffffffff", "800bfffffffffff", "800dfffffffffff", "800ffffffffffff", "8011fffffffffff", "8013fffffffffff", "8015fffffffffff", "8017fffffffffff", "8019fffffffffff", "801bfffffffffff", "801dfffffffffff", "801ffffffffffff", "8021fffffffffff", "8023fffffffffff", "8025fffffffffff", "8027fffffffffff", "8029fffffffffff", "802bfffffffffff", "802dfffffffffff", "802ffffffffffff", "8031fffffffffff", "8033fffffffffff", "8035fffffffffff", "8037fffffffffff", "8039fffffffffff", "803bfffffffffff", "803dfffffffffff", "803ffffffffffff", "8041fffffffffff", "8043fffffffffff", "8045fffffffffff", "8047fffffffffff", "8049fffffffffff", "804bfffffffffff", "804dfffffffffff", "804ffffffffffff", "8051fffffffffff", "8053fffffffffff", "8055fffffffffff", "8057fffffffffff", "8059fffffffffff", "805bfffffffffff", "805dfffffffffff", "805ffffffffffff", "8061fffffffffff", "8063fffffffffff", "8065fffffffffff", "8067fffffffffff", "8069fffffffffff", "806bfffffffffff", "806dfffffffffff", "806ffffffffffff", "8071fffffffffff", "8073fffffffffff", "8075fffffffffff", "8077fffffffffff", "8079fffffffffff", "807bfffffffffff", "807dfffffffffff", "807ffffffffffff", "8081fffffffffff", "8083fffffffffff", "8085fffffffffff", "8087fffffffffff", "8089fffffffffff", "808bfffffffffff", "808dfffffffffff", "808ffffffffffff", "8091fffffffffff", "8093fffffffffff", "8095fffffffffff", "8097fffffffffff", "8099fffffffffff", "809bfffffffffff", "809dfffffffffff", "809ffffffffffff", "80a1fffffffffff", "80a3fffffffffff", "80a5fffffffffff", "80a7fffffffffff", "80a9fffffffffff", "80abfffffffffff", "80adfffffffffff", "80affffffffffff", "80b1fffffffffff", "80b3fffffffffff", "80b5fffffffffff", "80b7fffffffffff", "80b9fffffffffff", "80bbfffffffffff", "80bdfffffffffff", "80bffffffffffff", "80c1fffffffffff", "80c3fffffffffff", "80c5fffffffffff", "80c7fffffffffff", "80c9fffffffffff", "80cbfffffffffff", "80cdfffffffffff", "80cffffffffffff", "80d1fffffffffff", "80d3fffffffffff", "80d5fffffffffff", "80d7fffffffffff", "80d9fffffffffff", "80dbfffffffffff", "80ddfffffffffff", "80dffffffffffff", "80e1fffffffffff", "80e3fffffffffff", "80e5fffffffffff", "80e7fffffffffff", "80e9fffffffffff", "80ebfffffffffff", "80edfffffffffff", "80effffffffffff", "80f1fffffffffff", "80f3fffffffffff" ] +``` + + + + +## res0CellCount + +Number of resolution `0` H3 indexes, which is defined as 122. + + + + +```c +int res0CellCount(void); +``` + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + + +## getPentagons + +All the pentagon H3 cells at the specified resolution. +There are 12 pentagons at each resolution. + + + + +```c +H3Error getPentagons(int res, H3Index *out); +``` + +`out` must be an array of at least size `pentagonIndexCount()`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +Collection h3.getPentagons(int res); +Collection h3.getPentagonsAddresses(int res); +``` + + + + +```js +h3.getPentagons(res) +``` + +```js live +function example() { + const res = 5; + return h3.getPentagons(res); +} +``` + + + + +```py +h3.get_pentagons(res) +``` + + + + +```sql +h3_get_pentagons(res) +``` +```sql +h3_get_pentagons_string(res) +``` + + + + +```sh +$ h3 getPentagons --help +h3: Returns all of the pentagons at the specified resolution +H3 4.1.0 + + getPentagons Returns all of the pentagons at the specified resolution + -r, --resolution Required. Resolution, 0-15 inclusive. + -h, --help Show this help message. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 getPentagons -r 5 +[ "85080003fffffff", "851c0003fffffff", "85300003fffffff", "854c0003fffffff", "85620003fffffff", "85740003fffffff", "857e0003fffffff", "85900003fffffff", "85a60003fffffff", "85c20003fffffff", "85d60003fffffff", "85ea0003fffffff" ] +``` + + + + +## pentagonCount + +Number of pentagon H3 cells per resolution. +This is always 12, but provided as a convenience. + + + + +```c +int pentagonCount(void); +``` + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +```sh +$ h3 pentagonCount --help +h3: Returns 12 +H3 4.1.0 + + pentagonCount Returns 12 + -h, --help Show this help message. +``` + +```bash +$ h3 pentagonCount +12 +``` + + + + + +## greatCircleDistanceKm + +Gives the "great circle" or "haversine" distance between pairs of +LatLng points (lat/lng pairs) in kilometers. + + + + +```c +double greatCircleDistanceKm(const LatLng *a, const LatLng *b); +``` + + + + +```java +double greatCircleDistance(LatLng point1, LatLng point2, LengthUnit unit); +``` + + + + +```js +h3.greatCircleDistance(point1, point2, h3.UNITS.km) +``` + +```js live +function example() { + const point1 = [-10, 0]; + const point2 = [10, 0]; + return h3.greatCircleDistance(point1, point2, h3.UNITS.km) +} +``` + + + + +```py +h3.great_circle_distance(point1, point2, unit='km') +``` + + + + +```sql +h3_great_circle_distance(point1, point2, 'km') +``` + + + + +```sh +$ h3 greatCircleDistanceKm --help +h3: Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in kilometers +H3 4.1.0 + + greatCircleDistanceKm Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in kilometers + -i, --file The file to load the coordinates from. Use -- to read from stdin. + -c, --coordinates The array of coordinates to convert. Up to 1500 characters. + -h, --help Show this help message. +``` + +```bash +$ h3 greatCircleDistanceKm -c "[[-10, 0], [10, 0]]" +2223.9010395046 +``` + + + + +## greatCircleDistanceM + +Gives the "great circle" or "haversine" distance between pairs of +LatLng points (lat/lng pairs) in meters. + + + + +```c +double greatCircleDistanceM(const LatLng *a, const LatLng *b); +``` + + + + +```java +double greatCircleDistance(LatLng point1, LatLng point2, LengthUnit unit); +``` + + + + +```js +h3.greatCircleDistance(point1, point2, h3.UNITS.m); +``` + +```js live +function example() { + const point1 = [-10, 0]; + const point2 = [10, 0]; + return h3.greatCircleDistance(point1, point2, h3.UNITS.m); +} +``` + + + + +```py +h3.great_circle_distance(point1, point2, unit='m') +``` + + + + +```sql +h3_great_circle_distance(point1, point2, 'm') +``` + + + + +```sh +$ h3 greatCircleDistanceM --help +h3: Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in meters +H3 4.1.0 + + greatCircleDistanceM Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in meters + -i, --file The file to load the coordinates from. Use -- to read from stdin. + -c, --coordinates The array of coordinates to convert. Up to 1500 characters. + -h, --help Show this help message. +``` + +```bash +$ h3 greatCircleDistanceM -c "[[-10, 0], [10, 0]]" +2223901.0395045886 +``` + + + + + +## greatCircleDistanceRads + +Gives the "great circle" or "haversine" distance between pairs of +LatLng points (lat/lng pairs) in radians. + + + + +```c +double greatCircleDistanceRads(const LatLng *a, const LatLng *b); +``` + + + + +```java +double greatCircleDistance(LatLng point1, LatLng point2, LengthUnit unit); +``` + + + + +```js +h3.greatCircleDistance(point1, point2, h3.UNITS.rads) +``` + +```js live +function example() { + const point1 = [-10, 0]; + const point2 = [10, 0]; + return h3.greatCircleDistance(point1, point2, h3.UNITS.rads) +} +``` + + + + +```py +h3.great_circle_distance(point1, point2, unit='rads') +``` + + + + +```sql +h3.great_circle_distance(point1, point2, 'rads') +``` + + + + +```sh +$ h3 greatCircleDistanceRads --help +h3: Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in radians +H3 4.1.0 + + greatCircleDistanceRads Calculates the 'great circle' or 'haversine' distance between two lat, lng points, in radians + -i, --file The file to load the coordinates from. Use -- to read from stdin. + -c, --coordinates The array of coordinates to convert. Up to 1500 characters. + -h, --help Show this help message. +``` + +```bash +$ h3 greatCircleDistanceRads -c "[[-10, 0], [10, 0]]" +0.3490658504 +``` + + + + + +## describeH3Error + +Provides a human-readable description of an H3Error error code. + + + + +```c +char *describeH3Error(H3Error err); +``` + +This function cannot fail, as it just returns a string stating that the +H3Error value is itself invalid and does not allocate memory to do so. +Do not call `free` on the result of this function. + + + + +:::note + +Just read the `.message` property from the caught error, instead. + +::: + +```js live +function example() { + let errorMessage = "" + try { + h3.cellToChildrenSize("asdf", 9); + } catch (e) { + errorMessage = e.message; + } + return errorMessage; +} +``` + + + + +```sh +$ h3 describeH3Error --help +h3: Returns a description of the provided H3 error code number, or indicates the number is itself invalid. +H3 4.1.0 + + describeH3ErrorReturns a description of the provided H3 error code number, or indicates the number is itself invalid. + -e, --error Required. H3 Error code to describe + -h, --help Show this help message. +``` + +```bash +$ h3 describeH3Error -e 5 +Cell argument was not valid +``` + + + diff --git a/website/docs/api/regions.mdx b/website/docs/api/regions.mdx new file mode 100644 index 000000000..5f16de1a6 --- /dev/null +++ b/website/docs/api/regions.mdx @@ -0,0 +1,587 @@ +--- +id: regions +title: Region functions +sidebar_label: Regions +slug: /api/regions +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +These functions convert H3 indexes to and from polygonal areas. + +## polygonToCells + +Each binding's version of `polygonToCells` takes as input a GeoJSON-like data +structure describing a polygon (i.e., an outer ring and optional holes) and +a target cell resolution. +It produces a collection of cells that are contained within the polygon. + +Containment is determined by centroids of the cells, so that a partitioning +of polygons (covering an area without overlaps) will result in +a partitioning of H3 cells. + + + + +```c +H3Error polygonToCells(const GeoPolygon *geoPolygon, int res, uint32_t flags, H3Index *out); +``` + +In C, `polygonToCells` takes a `GeoPolygon` struct and preallocated, +zeroed memory, and fills it with the covering cells. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List polygonToCells(List points, List> holes, int res); +List polygonToCellAddresses(List points, List> holes, int res); +``` + + + + +```js +h3.polygonToCells(polygon, res, isGeoJson) +``` + +```js live +function example() { + const polygon = [ + [37.813318999983238, -122.4089866999972145], + [37.7198061999978478, -122.3544736999993603], + [37.8151571999998453, -122.4798767000009008] + ]; + const res = 7; + return h3.polygonToCells(polygon, res); +} +``` + + + + +```py +h3.polygon_to_cells(h3shape, res) +h3.h3shape_to_cells(h3shape, res) +``` + +In Python, `h3shape_to_cells` takes an `H3Shape` object +(`LatLngPoly` or `LatLngMultiPoly`). +Note that `polygon_to_cells` is an alias for `h3shape_to_cells`. +For more info, see the [`h3-py` docs](https://uber.github.io/h3-py/api_quick.html#polygon-interface). + + + + +```sql +h3_polygon_wkt_to_cells(wkt, res) +``` +```sql +h3_polygon_wkt_to_cells_string(wkt, res) +``` + + + + +```sh +$ h3 polygonToCells --help +h3: Converts a polygon (array of lat, lng points, or array of arrays of lat, lng points) into a set of covering cells at the specified resolution +H3 4.1.0 + + polygonToCells Converts a polygon (array of lat, lng points, or array of arrays of lat, lng points) into a set of covering cells at the specified resolution + -h, --help Show this help message. + -i, --file The file to load the polygon from. Use -- to read from stdin. + -p, --polygon The polygon to convert. Up to 1500 characters. + -r, --resolution Required. Resolution, 0-15 inclusive, that the polygon should be converted to. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 polygonToCells -r 7 -p "[[37.813318999983238, -122.4089866999972145], [37.7198061999978478, -122.3544736999993603], [37.8151571999998453, -122.4798767000009008]]" +[ "87283082bffffff", "872830870ffffff", "872830820ffffff", "87283082effffff", "872830828ffffff", "87283082affffff", "872830876ffffff" ] +``` + + + + + +## maxPolygonToCellsSize + +Provides an upper bound on the number of cells needed for memory allocation +purposes when computing `polygonToCells` on the given GeoJSON-like data structure. + + + + +```c +H3Error maxPolygonToCellsSize(const GeoPolygon *geoPolygon, int res, uint32_t flags, int64_t *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +```sh +$ h3 maxPolygonToCellsSize --help +h3: Returns the maximum number of cells that could be needed to cover the polygon. Will always be equal or more than actually necessary +H3 4.1.0 + + maxPolygonToCellsSize Returns the maximum number of cells that could be needed to cover the polygon. Will always be equal or more than actually necessary + -h, --help Show this help message. + -i, --file The file to load the polygon from. Use -- to read from stdin. + -p, --polygon The polygon to convert. Up to 1500 characters. + -r, --resolution Required. Resolution, 0-15 inclusive, that the polygon should be converted to. +``` + +```bash +$ h3 maxPolygonToCellsSize -r 7 -p "[[37.813318999983238, -122.4089866999972145], [37.7198061999978478, -122.3544736999993603], [37.8151571999998453, -122.4798767000009008]]" +100 +``` + + + + +## polygonToCellsExperimental + +Each binding's version of `polygonToCellsExperimental` takes as input a +GeoJSON-like data structure describing a polygon (i.e., an outer ring and +optional holes) and a target cell resolution. +It produces a collection of cells that are contained within the polygon. + +This function differs from `polygonToCells` in that it uses an experimental +new algorithm which supports center-based, fully-contained, and +overlapping containment modes. + + + + +```c +H3Error polygonToCellsExperimental(const GeoPolygon *geoPolygon, int res, uint32_t flags, int64_t size, H3Index *out); +``` + +In C, `polygonToCellsExperimental` takes a `GeoPolygon` struct and preallocated, +zeroed memory, and fills it with the covering cells. + +`size` should be the size in number of `H3Index`s of `out`. + +The valid values for `flags` are: + +| Enum name | Integer value | Description +| --------- | ------------- | ----------- +| `CONTAINMENT_CENTER` | 0 | Cell center is contained in the shape +| `CONTAINMENT_FULL` | 1 | Cell is fully contained in the shape +| `CONTAINMENT_OVERLAPPING` | 2 | Cell overlaps the shape at any point +| `CONTAINMENT_OVERLAPPING_BBOX` | 3 | Cell bounding box overlaps shape + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List polygonToCellsExperimental(List points, List> holes, PolygonToCellsFlags flags, int res); +List polygonToCellExperimentalAddresses(List points, List> holes, PolygonToCellsFlags flags, int res); +``` + +The valid values for `flags` are: + +| Enum name | Description +| --------- | ----------- +| `PolygonToCellsFlags.containment_center` | Cell center is contained in the shape +| `PolygonToCellsFlags.containment_full` | Cell is fully contained in the shape +| `PolygonToCellsFlags.containment_overlapping` | Cell overlaps the shape at any point +| `PolygonToCellsFlags.containment_overlapping_bbox` | Cell bounding box overlaps shape + + + + +```js +h3.polygonToCellsExperimental(polygon, res, flags, isGeoJson) +``` + +```js live +function example() { + const polygon = [ + [37.813318999983238, -122.4089866999972145], + [37.7198061999978478, -122.3544736999993603], + [37.8151571999998453, -122.4798767000009008] + ]; + const res = 7; + return h3.polygonToCellsExperimental(polygon, res, h3.POLYGON_TO_CELLS_FLAGS.containmentOverlapping); +} +``` + +The valid values for `flags` are: + +| Enum name | Description +| --------- | ----------- +| `POLYGON_TO_CELLS_FLAGS.containment_center` | Cell center is contained in the shape +| `POLYGON_TO_CELLS_FLAGS.containment_full` | Cell is fully contained in the shape +| `POLYGON_TO_CELLS_FLAGS.containment_overlapping` | Cell overlaps the shape at any point +| `POLYGON_TO_CELLS_FLAGS.containment_overlapping_bbox` | Cell bounding box overlaps shape + + + + +```py +h3.h3shape_to_cells_experimental(h3shape, res, contain='overlap') +``` + +In Python, `h3shape_to_cells_experimental` takes an `H3Shape` object +(`LatLngPoly` or `LatLngMultiPoly`). +For more info, see the [`h3-py` docs](https://uber.github.io/h3-py/api_quick.html#polygon-interface). + +The valid values for `contain` are: + +| String value | Description +| ------------ | ----------- +| `center` | Cell center is contained in the shape (default) +| `full` | Cell is fully contained in the shape +| `overlap` | Cell overlaps the shape at any point +| `bbox_overlap` | Cell bounding box overlaps shape + + + + +```sql +h3_polygon_wkt_to_cells_experimental(h3shape, res, 'overlap') +``` +```sql +h3_polygon_wkt_to_cells_experimental_string(h3shape, res, 'overlap') +``` + +The valid values for the third `contain` argument are: + +| String value | Description +| ------------ | ----------- +| `center` | Cell center is contained in the shape (default) +| `full` | Cell is fully contained in the shape +| `overlap` | Cell overlaps the shape at any point +| `bbox_overlap` | Cell bounding box overlaps shape + + + + +This function is not exposed in the CLI bindings. + + + + + +## maxPolygonToCellsSizeExperimental + +Provides an upper bound on the number of cells needed for memory allocation +purposes when computing `polygonToCellsExperimental` on the given GeoJSON-like data structure. + + + + +```c +H3Error maxPolygonToCellsSizeExperimental(const GeoPolygon *geoPolygon, int res, uint32_t flags, int64_t *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +This function is not exposed in the CLI bindings. + + + + + +## cellsToLinkedMultiPolygon / cellsToMultiPolygon + +Create a GeoJSON-like multi-polygon describing the outline(s) of a set of cells. +Polygon outlines will follow GeoJSON MultiPolygon order: Each polygon will +have one outer loop, which is first in the list, followed by any holes. + +It is expected that all cells in the set have the same resolution and +that the set contains no duplicates. Behavior is undefined if duplicates +or multiple resolutions are present, and the algorithm may produce +unexpected or invalid output. + + + + +```c +H3Error cellsToLinkedMultiPolygon(const H3Index *h3Set, const int numHexes, LinkedGeoPolygon *out); +``` + +It is the responsibility of the caller to call `destroyLinkedPolygon` on the +populated linked geo structure, or the memory for that structure will +not be freed. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List>> cellsToMultiPolygon(Collection h3, boolean geoJson); +List>> cellAddressesToMultiPolygon(Collection h3Addresses, boolean geoJson); +``` + + + + +```js +h3.cellsToMultiPolygon(cells, geoJson) +``` + +```js live +function example() { + const cells = ['872830828ffffff', '87283082effffff']; + return h3.cellsToMultiPolygon(cells, true); +} +``` + + + + +```py +h3.cells_to_h3shape(cells, *, tight=True) +``` + +Returns an `H3Shape` object: +- If `tight=True`, returns `LatLngPoly` if possible, otherwise `LatLngMultiPoly`. +- If `tight=False`, always returns a `LatLngMultiPoly`. + +For more info, see the [`h3-py` docs](https://uber.github.io/h3-py/api_quick.html#polygon-interface). + + + + +```sql +h3_cells_to_multi_polygon_wkt(cells) +``` + + + + +```sh +$ h3 cellsToMultiPolygon --help +h3: Returns a polygon (array of arrays of lat, lng points) for a set of cells +H3 4.1.0 + + cellsToMultiPolygon Returns a polygon (array of arrays of lat, lng points) for a set of cells + -h, --help Show this help message. + -i, --file The file to load the cells from. Use -- to read from stdin. + -c, --cells The cells to convert. Up to 100 cells if provided as hexadecimals with zero padding. + -f, --format 'json' for [[[[lat, lng],...],...],...] 'wkt' for a WKT MULTIPOLYGON +``` + +```bash +$ h3 cellsToMultiPolygon -c 872830828ffffff,87283082effffff +[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]] +``` + + + + + + +## destroyLinkedMultiPolygon + +Free all allocated memory for a linked geo structure. The caller is +responsible for freeing memory allocated to the input polygon struct. + + + + +```c +void destroyLinkedMultiPolygon(LinkedGeoPolygon *polygon); +``` + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + + diff --git a/website/docs/api/traversal.mdx b/website/docs/api/traversal.mdx new file mode 100644 index 000000000..1cb5b3796 --- /dev/null +++ b/website/docs/api/traversal.mdx @@ -0,0 +1,1130 @@ +--- +id: traversal +title: Grid traversal functions +sidebar_label: Traversal +slug: /api/traversal +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Grid traversal allows finding cells in the vicinity of an origin cell, +and determining how to traverse the grid from one cell to another. + +## gridDistance + +Provides the *grid distance* between two cells, which is +defined as the minimum number of "hops" needed across adjacent cells to get +from one cell to the other. + +Note that finding the grid distance may fail for a few reasons: + +- the cells are not comparable (different resolutions), +- the cells are too far apart, or +- the cells are separated by pentagonal distortion. + +This is the same set of limitations as the local IJ coordinate space functions. + + + + +```c +H3Error gridDistance(H3Index origin, H3Index h3, int64_t *distance); +``` + +Returns 0 (`E_SUCCESS`) on success, or an error if finding the distance failed. + + + + +```java +long gridDistance(long a, long b) throws DistanceUndefinedException; +long gridDistance(String a, String b) throws DistanceUndefinedException; +``` + + + + +```js +h3.gridDistance(a, b) +``` + +```js live +function example() { + const start = '85283473fffffff'; + const end = '8528342bfffffff'; + return h3.gridDistance(start, end); +} +``` + + + + +```py +h3.grid_distance(h1, h2) +``` + + + + +```sql +h3_grid_distance(h1, h2) +``` + + + + +```sh +$ h3 gridDistance --help +h3: Returns the number of steps along the grid to move from the origin cell to the destination cell +H3 4.1.0 + + gridDistance Returns the number of steps along the grid to move from the origin cell to the destination cell + -h, --help Show this help message. + -o, --origin Required. The origin H3 cell + -d, --destination Required. The destination H3 cell +``` + +```bash +$ h3 gridDistance -o 85283473fffffff -d 8528342bfffffff +2 +``` + + + + + +## gridRingUnsafe + +Produces the "hollow ring" of cells which are *exactly* grid distance `k` +from the origin cell. + +This function may fail if pentagonal distortion is encountered. + + + + +```c +H3Error gridRingUnsafe(H3Index origin, int k, H3Index* out); +``` + +The caller should allocate memory for the maximum size of the ring, which is +`6*k` if `k > 0` and `1` if `k == 0`. + + +Returns 0 (`E_SUCCESS`) if no pentagonal distortion was encountered. + + + + +```java +List gridRingUnsafe(long h3, int k) throws PentagonEncounteredException; +List gridRingUnsafe(String h3Address, int k) throws PentagonEncounteredException; +``` + + + + +```js +h3.gridRingUnsafe(h3Index, k) +``` + +```js live +function example() { + const h = '85283473fffffff'; + const k = 1; + return h3.gridRingUnsafe(h, k); +} +``` + + + + +```py +h3.grid_ring(h, k) +``` + +:::note + +Python uses the C function `gridRingUnsafe` internally to generate the results, +but on failure falls back to `gridDiskDistances` and returns the set +of cells at the specified distance to produce an equivalent to the "safe" version, +but this consumes a lot of memory to do so. + +::: + + + + +```sql +h3_grid_ring_unsafe(h, k) +``` + + + + +```sh +$ h3 gridRing --help +h3: Returns an array of H3 cells, each cell 'k' steps away from the origin cell +H3 4.1.0 + + gridRing Returns an array of H3 cells, each cell 'k' steps away from the origin cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -k Required. Maximum grid distance for the output set + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 gridRing -k 1 -c 85283473fffffff +[ "8528340bfffffff", "85283447fffffff", "8528347bfffffff", "85283463fffffff", "85283477fffffff", "8528340ffffffff" ] +``` + +:::note + +The shell uses the C function `gridRingUnsafe` internally to generate the results, +but on failure falls back to `gridDiskDistances` and returns the set +of cells at the specified distance to produce an equivalent to the "safe" version, +but this consumes a lot of memory to do so. + +::: + + + + + +## gridDisk + +Produces the "filled-in disk" of cells which are *at most* grid distance `k` +from the origin cell. + +Output order is not guaranteed. + + + + +```c +H3Error gridDisk(H3Index origin, int k, H3Index* out); +``` + +Elements of the output array may be left as zero, +which can happen when crossing a pentagon. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List gridDisk(long origin, int k); +List gridDisk(String origin, int k); +``` + + + + +```js +h3.gridDisk(origin, k) +``` + +```js live +function example() { + const h = '85283473fffffff'; + const k = 5; + return h3.gridDisk(h, k); +} +``` + + + + +```py +h3.grid_disk(origin, k) +``` + + + + +```sql +h3_grid_disk(origin, k) +``` + + + + +```sh +$ h3 gridDisk --help +h3: Returns an array of a H3 cells within 'k' steps of the origin cell +H3 4.1.0 + + gridDisk Returns an array of a H3 cells within 'k' steps of the origin cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -k Required. Maximum grid distance for the output set + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 gridDisk -k 5 -c 85283473fffffff +[ "85283473fffffff", "85283447fffffff", "8528347bfffffff", "85283463fffffff", "85283477fffffff", "8528340ffffffff", "8528340bfffffff", "85283457fffffff", "85283443fffffff", "8528344ffffffff", "852836b7fffffff", "8528346bfffffff", "8528346ffffffff", "85283467fffffff", "8528342bfffffff", "8528343bfffffff", "85283407fffffff", "85283403fffffff", "8528341bfffffff", "852834cffffffff", "85283453fffffff", "8528345bfffffff", "8528344bfffffff", "852836b3fffffff", "852836a3fffffff", "852836a7fffffff", "852830d3fffffff", "852830d7fffffff", "8528309bfffffff", "85283093fffffff", "8528342ffffffff", "85283423fffffff", "85283433fffffff", "852834abfffffff", "85283417fffffff", "85283413fffffff", "852834c7fffffff", "852834c3fffffff", "852834cbfffffff", "8529a927fffffff", "8529a92ffffffff", "85283697fffffff", "85283687fffffff", "852836bbfffffff", "852836abfffffff", "852836affffffff", "852830dbfffffff", "852830c3fffffff", "852830c7fffffff", "8528308bfffffff", "85283083fffffff", "85283097fffffff", "8528355bfffffff", "85283427fffffff", "85283437fffffff", "852834affffffff", "852834a3fffffff", "852834bbfffffff", "8528348ffffffff", "8528348bfffffff", "852834d7fffffff", "852834d3fffffff", "852834dbfffffff", "8529a937fffffff", "8529a923fffffff", "8529a92bfffffff", "85283693fffffff", "85283683fffffff", "8528368ffffffff", "85283617fffffff", "85283607fffffff", "85283633fffffff", "85283637fffffff", "852830cbfffffff", "852830cffffffff", "8528301bfffffff", "85283013fffffff", "8528308ffffffff", "85283087fffffff", "8528354bfffffff", "85283543fffffff", "85283553fffffff", "852835cbfffffff", "852835dbfffffff", "852834a7fffffff", "852834b7fffffff", "852834b3fffffff", "85283487fffffff", "85283483fffffff", "8528349bfffffff", "85291a6ffffffff" ] +``` + + + + +## maxGridDiskSize + +Maximum number of cells that can result from the `gridDisk` function for a given `k`. + + + + +```c +H3Error maxGridDiskSize(int k, int64_t *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + + +## gridDiskDistances + +Produces the same set of cells as `gridDisk`, but along with each cell's +grid distance from the origin cell. + +Output order is not guaranteed. + + + + +```c +H3Error gridDiskDistances(H3Index origin, int k, H3Index* out, int* distances); +``` + +Elements of the output array may be left as zero, +which can happen when crossing a pentagon. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List> gridDiskDistances(long origin, int k); +List> gridDiskDistances(String origin, int k); +``` + + + + +```js +h3.gridDiskDistances(origin, k) +``` + +```js live +function example() { + const h = '85283473fffffff'; + const k = 5; + return h3.gridDiskDistances(h, k); +} +``` + + + + +:::note + +This function is not exposed in Python. + +::: + + + + +```sql +h3_grid_disk_distances(origin, k) +``` + + + + +```sh +$ h3 gridDiskDistances --help +h3: Returns an array of arrays of H3 cells, each array containing cells 'k' steps away from the origin cell, based on the outer array index +H3 4.1.0 + + gridDiskDistances Returns an array of arrays of H3 cells, each array containing cells 'k' steps away from the origin cell, based on the outer array index + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -k Required. Maximum grid distance for the output set + -f, --format 'json' for [["CELL", ...], ...], 'newline' for CELL\n with an extra newline between rings (Default: json) +``` + +```bash +$ h3 gridDiskDistances -k 5 -c 85283473fffffff +[["85283473fffffff"], ["85283447fffffff", "8528347bfffffff", "85283463fffffff", "85283477fffffff", "8528340ffffffff", "8528340bfffffff"], ["85283457fffffff", "85283443fffffff", "8528344ffffffff", "852836b7fffffff", "8528346bfffffff", "8528346ffffffff", "85283467fffffff", "8528342bfffffff", "8528343bfffffff", "85283407fffffff", "85283403fffffff", "8528341bfffffff"], ["852834cffffffff", "85283453fffffff", "8528345bfffffff", "8528344bfffffff", "852836b3fffffff", "852836a3fffffff", "852836a7fffffff", "852830d3fffffff", "852830d7fffffff", "8528309bfffffff", "85283093fffffff", "8528342ffffffff", "85283423fffffff", "85283433fffffff", "852834abfffffff", "85283417fffffff", "85283413fffffff", "852834c7fffffff"], ["852834c3fffffff", "852834cbfffffff", "8529a927fffffff", "8529a92ffffffff", "85283697fffffff", "85283687fffffff", "852836bbfffffff", "852836abfffffff", "852836affffffff", "852830dbfffffff", "852830c3fffffff", "852830c7fffffff", "8528308bfffffff", "85283083fffffff", "85283097fffffff", "8528355bfffffff", "85283427fffffff", "85283437fffffff", "852834affffffff", "852834a3fffffff", "852834bbfffffff", "8528348ffffffff", "8528348bfffffff", "852834d7fffffff"], ["852834d3fffffff", "852834dbfffffff", "8529a937fffffff", "8529a923fffffff", "8529a92bfffffff", "85283693fffffff", "85283683fffffff", "8528368ffffffff", "85283617fffffff", "85283607fffffff", "85283633fffffff", "85283637fffffff", "852830cbfffffff", "852830cffffffff", "8528301bfffffff", "85283013fffffff", "8528308ffffffff", "85283087fffffff", "8528354bfffffff", "85283543fffffff", "85283553fffffff", "852835cbfffffff", "852835dbfffffff", "852834a7fffffff", "852834b7fffffff", "852834b3fffffff", "85283487fffffff", "85283483fffffff", "8528349bfffffff", "85291a6ffffffff"]] +``` + + + + +## gridDiskUnsafe + +Produces cells within grid distance `k` of the origin cell, just like `gridDisk`. +However, the function may return an error code if pentagonal distorition is +encountered. In this case, the output in the `out` array is undefined. + +Users can fall back to calling the slower but more robust `gridDiskDistances`. + + + + +```c +H3Error gridDiskUnsafe(H3Index origin, int k, H3Index* out); +``` + +Output is placed in the provided array in order of increasing distance from +the origin. +The provided array must be of size `maxGridDiskSize(k)`. + +Returns 0 (`E_SUCCESS`) if no pentagonal distortion is encountered. + + + + +```java +List> gridDiskUnsafe(Long h3, int k) throws PentagonEncounteredException; +List> gridDiskUnsafe(String h3Address, int k) throws PentagonEncounteredException; +``` + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +```sql +h3_grid_disk_unsafe(origin, k) +``` + + + + +:::note + +This function is not exposed. + +::: + + + + + +## gridDiskDistancesUnsafe + +`gridDiskDistancesUnsafe` produces indexes within `k` distance of the origin index. +Output behavior is undefined when one of the indexes returned by this +function is a pentagon or is in the pentagon distortion area. + +Output is placed in the provided array in order of increasing distance from +the origin. The distances in hexagons is placed in the distances array at +the same offset. The provided array must be of size `maxGridDiskSize(k)`. + + + + +```c +H3Error gridDiskDistancesUnsafe(H3Index origin, int k, H3Index* out, int* distances); +``` + +Returns 0 (`E_SUCCESS`) if no pentagonal distortion is encountered. + + + + +:::note + +This function is not exposed because the same functionality is exposed by `gridDiskUnsafe` + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +```sql +h3_grid_disk_distances_unsafe(origin, k) +``` + + + + +:::note + +This function is not exposed. + +::: + + + + + +## gridDiskDistancesSafe + +`gridDiskDistancesSafe` produces indexes within `k` distance of the origin index. + +Output is placed in the provided array in order of increasing distance from +the origin. The distances in hexagons is placed in the distances array at +the same offset. The provided array must be of size `maxGridDiskSize(k)`. + + + + +```c +H3Error gridDiskDistancesSafe(H3Index origin, int k, H3Index* out, int* distances); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +:::note + +This function is not exposed because the same functionality is exposed by `gridDiskSafe` + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +```sql +h3_grid_disk_distances_safe(origin, k) +``` + + + + +:::note + +This function is not exposed. + +::: + + + + + +## gridDisksUnsafe + +`gridDisksUnsafe` takes an array of input cells and a max `k` and returns an +array of cells sorted first by the original cell indices and then by the +grid ring (0 to max), with no guaranteed sorting within each grid ring group. + + + + +```c +H3Error gridDisksUnsafe(H3Index* h3Set, int length, int k, H3Index* out); +``` + +Returns 0 (`E_SUCCESS`) if no pentagonal distortion was encountered. + + + + +:::note + +This function is not exposed because the same functionality is exposed by `gridDiskUnsafe` + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + +:::note + +This function is not exposed. + +::: + + + + + +## gridPathCells + +Given two H3 cells, return a minimal-length contiguous path of cells +between them (inclusive of the endpoint cells). + +This function may fail if the cells are very far apart, or if +the cells are on opposite sides of a pentagon. + +Notes: + + * The output of this function should not be considered stable + across library versions. The only guarantees are + that the path length will be `gridDistance(start, end) + 1` and that + every cell in the path will be a neighbor of the preceding cell. + + * Paths exist in the H3 grid of cells, and may not align closely with either + Cartesian lines or great arcs. + + + + +```c +H3Error gridPathCells(H3Index start, H3Index end, H3Index* out); +``` + +Returns 0 (`E_SUCCESS`) if no pentagonal distortion was encountered. + + + + +```java +List gridPathCells(long start, long end) throws LineUndefinedException +List gridPathCells(String startAddress, String endAddress) throws LineUndefinedException +``` + + + + +```js +h3.gridPathCells(start, end) +``` + +```js live +function example() { + const start = '85283473fffffff'; + const end = '8528342bfffffff'; + return h3.gridPathCells(start, end); +} +``` + + + + +```py +h3.grid_path_cells(start, end) +``` + + + + +```sql +h3_grid_path_cells(start, end) +``` + + + + +```sh +$ h3 gridPathCells --help +h3: Returns an array of H3 cells from the origin cell to the destination cell (inclusive) +H3 4.1.0 + + gridPathCells Returns an array of H3 cells from the origin cell to the destination cell (inclusive) + -h, --help Show this help message. + -o, --origin Required. The origin H3 cell + -d, --destination Required. The destination H3 cell + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 gridPathCells -o 85283473fffffff -d 8528342bfffffff +[ "85283473fffffff", "85283477fffffff", "8528342bfffffff" ] +``` + + + + +## gridPathCellsSize + +Number of cells in a grid path from the start cell to the end cell, +to be used for allocating memory. + + + + +```c +H3Error gridPathCellsSize(H3Index start, H3Index end, int64_t* size); +``` + +Returns 0 (`E_SUCCESS`) on success, or an error if the path cannot be computed. + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + +:::note + +This function exists for memory management and is not exposed. + +::: + + + + + +## cellToLocalIj + +Produces local IJ coordinates for an H3 cell anchored by an origin. + +`mode` is reserved for future expansion and must be set to `0`. + +This function's output is not guaranteed to be compatible across different +versions of H3. + + + + +```c +H3Error cellToLocalIj(H3Index origin, H3Index h3, uint32_t mode, CoordIJ *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +CoordIJ cellToLocalIj(long origin, long h3) throws PentagonEncounteredException, LocalIjUndefinedException; +CoordIJ cellToLocalIj(String originAddress, String h3Address) throws PentagonEncounteredException, LocalIjUndefinedException; +``` + + + + +```js +h3.cellToLocalIj(origin, h3) +``` + +```js live +function example() { + const origin = '85283473fffffff'; + const h = '8528342bfffffff'; + const {i, j} = h3.cellToLocalIj(origin, h); + return [i, j]; +} +``` + + + + +```py +h3.cell_to_local_ij(origin, h) +``` + + + + +```sql +h3_cell_to_local_ij(origin, h) +``` + + + + +```sh +$ h3 cellToLocalIj --help +h3: Returns the IJ coordinate for a cell anchored to an origin cell +H3 4.1.0 + + cellToLocalIj Returns the IJ coordinate for a cell anchored to an origin cell + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -o, --origin Required. The origin H3 cell + -f, --format 'json' for [I, J], 'newline' for I\nJ\n (Default: json) +``` + +```bash +$ h3 cellToLocalIj -o 85283473fffffff -c 8528342bfffffff +[25, 13] +``` + + + + +## localIjToCell + +Produces an H3 cell from local IJ coordinates anchored by an origin. + +`mode` is reserved for future expansion and must be set to `0`. + +This function's output is not guaranteed to be compatible across different +versions of H3. + + + + +```c +H3Error localIjToCell(H3Index origin, const CoordIJ *ij, uint32_t mode, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +long localIjToCell(long origin, CoordIJ ij) throws LocalIjUndefinedException; +String localIjToCell(String originAddress, CoordIJ ij) throws LocalIjUndefinedException; +``` + + + + +```js +h3.localIjToCell(origin, coords) +``` + +```js live +function example() { + const h = '85283473fffffff'; + const coords = {i: 0, j: 0}; + return h3.localIjToCell(h, coords); +} +``` + + + + +```py +h3.local_ij_to_cell(origin, i, j) +``` + + + + +```sql +h3_local_ij_to_cell(origin, i, j) +``` + + + + +```sh +$ h3 localIjToCell --help +h3: Returns the H3 index from a local IJ coordinate anchored to an origin cell +H3 4.1.0 + + localIjToCell Returns the H3 index from a local IJ coordinate anchored to an origin cell + -h, --help Show this help message. + -o, --origin Required. The origin H3 cell + -i Required. The I dimension of the IJ coordinate + -j Required. The J dimension of the IJ coordinate + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 localIjToCell -o 85283473fffffff -i 0 -j 0 +"85280003fffffff" +``` + + + + + diff --git a/website/docs/api/vertex.mdx b/website/docs/api/vertex.mdx new file mode 100644 index 000000000..3f778900c --- /dev/null +++ b/website/docs/api/vertex.mdx @@ -0,0 +1,347 @@ +--- +id: vertex +title: Vertex functions +sidebar_label: Vertexes +slug: /api/vertex +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Vertex mode allows encoding the topological vertexes of H3 cells. + +## cellToVertex + +Returns the index for the specified cell vertex. +Valid vertex numbers are between 0 and 5 (inclusive) +for hexagonal cells, and 0 and 4 (inclusive) for pentagonal cells. + + + + +```c +H3Error cellToVertex(H3Index origin, int vertexNum, H3Index *out); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +Long cellToVertex(long origin, int vertexNum); +String cellToVertex(String origin, int vertexNum); +``` + + + + +```js +h3.cellToVertex(origin, vertexNum) +``` + +```js live +function example() { + const h = '85283473fffffff'; + const vertexNum = 2; + return h3.cellToVertex(h, vertexNum); +} +``` + + + + +```py +h3.cell_to_vertex(origin, vertex_num) +``` + + + + +```sql +h3_cell_to_vertex(origin, vertex_num) +``` + + + + +```sh +$ h3 cellToVertex --help +h3: Returns the vertex for the specified cell and vertex index. Must be 0-5 for hexagons, 0-4 for pentagons +H3 4.1.0 + + cellToVertex Returns the vertex for the specified cell and vertex index. Must be 0-5 for hexagons, 0-4 for pentagons + -c, --cell Required. H3 Cell + -v, --vertex Required. Vertex index number. 0-5 for hexagons, 0-4 for pentagons + -h, --help Show this help message. + -f, --format 'json' for "CELL"\n, 'newline' for CELL\n (Default: json) +``` + +```bash +$ h3 cellToVertex -v 2 -c 85283473fffffff +"205283463fffffff" +``` + + + + +## cellToVertexes + +Returns the indexes for all vertexes of the given cell. + + + + +```c +H3Error cellToVertexes(H3Index origin, H3Index *out); +``` + +The length of the `out` array must be 6. +If the given cell is a pentagon, one member of the +array will be set to `0`. + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +List cellToVertexes(long origin); +List cellToVertexes(String origin); +``` + + + + +```js +h3.cellToVertexes(origin) +``` + +```js live +function example() { + const h = '85283473fffffff'; + return h3.cellToVertexes(h); +} +``` + + + + +```py +h3.cell_to_vertexes(origin) +``` + + + + +```sql +h3_cell_to_vertexes(origin) +``` + + + + +```sh +$ h3 cellToVertexes --help +h3: Returns all of the vertexes from the specified cell +H3 4.1.0 + + cellToVertexes Returns all of the vertexes from the specified cell + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for ["CELL", ...], 'newline' for CELL\n... (Default: json) +``` + +```bash +$ h3 cellToVertexes -c 85283473fffffff +[ "22528340bfffffff", "235283447fffffff", "205283463fffffff", "255283463fffffff", "22528340ffffffff", "23528340bfffffff" ] +``` + + + + +## vertexToLatLng + +Returns the latitude and longitude coordinates of the given vertex. + + + + +```c +H3Error vertexToLatLng(H3Index vertex, LatLng *point); +``` + +Returns 0 (`E_SUCCESS`) on success. + + + + +```java +LatLng vertexToLatLng(long vertex); +LatLng vertexToLatLng(String vertex); +``` + + + + +```js +h3.vertexToLatLng(vertex) +``` + +```js live +function example() { + const h = '255283463fffffff'; + return h3.vertexToLatLng(h); +} +``` + + + + +```py +h3.vertex_to_latlng(vertex) +``` + + + + +```sql +h3_vertex_to_latlng(vertex) +``` + + + + +```sh +$ h3 vertexToLatLng --help +h3: Returns the lat, lng pair for the given vertex +H3 4.1.0 + + vertexToLatLng Returns the lat, lng pair for the given vertex + -c, --cell Required. H3 Cell + -h, --help Show this help message. + -f, --format 'json' for [lat, lng], 'wkt' for a WKT POINT, 'newline' for lat\nlng\n (Default: json) +``` + +```bash +$ h3 vertexToLatLng -c 255283463fffffff +[37.4201286777, -122.0377349643] +``` + + + + +## isValidVertex + +Determines if the given H3 index represents a valid H3 vertex. + + + + +```c +int isValidVertex(H3Index vertex); +``` + +Returns 1 if the given index represents a valid H3 vertex. + + + + +```java +boolean isValidVertex(long vertex); +boolean isValidVertex(String vertex); +``` + + + + +```js +h3.isValidVertex(vertex) +``` + +```js live +function example() { + const h = '255283463fffffff'; + return h3.isValidVertex(h); +} +``` + + + + +```py +h3.is_valid_vertex(vertex) +``` + + + + +```sql +h3_is_valid_vertex(vertex) +``` + + + + +```sh +$ h3 isValidVertex --help +h3: Checks if the provided H3 vertex is actually valid +H3 4.1.0 + + isValidVertex Checks if the provided H3 vertex is actually valid + -h, --help Show this help message. + -c, --cell Required. H3 Cell + -f, --format 'json' for true or false, 'numeric' for 1 or 0 (Default: json) +``` + +```bash +$ h3 isValidVertex -c 255283463fffffff +true +``` + + + diff --git a/website/docs/community/applications.md b/website/docs/community/applications.md new file mode 100644 index 000000000..cd455185a --- /dev/null +++ b/website/docs/community/applications.md @@ -0,0 +1,14 @@ +--- +id: applications +title: Applications Using H3 +sidebar_label: Applications Using H3 +slug: /community/applications +--- + +The following applications use H3. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/website/docs/community/applications.md). + +## Visualization + +- [kepler.gl](http://kepler.gl/) - An open source geospatial analysis tool +- [pydeck](https://deckgl.readthedocs.io/) - High-scale spatial rendering in Python, powered by deck.gl +- [h3-viewer](https://h3.chotard.com/) - Debugging tool to visualise h3 on mercator projection, powered by deck.gl diff --git a/website/docs/community/bindings.md b/website/docs/community/bindings.md new file mode 100644 index 000000000..eeebdc85c --- /dev/null +++ b/website/docs/community/bindings.md @@ -0,0 +1,143 @@ +--- +id: bindings +title: Bindings +sidebar_label: Bindings +slug: /community/bindings +--- + +As a C library, bindings can be made to call H3 functions from different programming languages. This page lists different bindings currently available. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/website/docs/community/bindings.md). + +## Athena + +- [daniel-cortez-stevenson/aws-athena-udfs-h3](https://github.com/daniel-cortez-stevenson/aws-athena-udfs-h3) + +## Azure Data Explorer + +- [Functions for Working with H3 Indexes](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/geo-point-to-h3cell-function) + +## BigQuery + +- [CARTO Analytics Toolbox](https://github.com/CartoDB/analytics-toolbox-core#bigquery) + +## C# + +- [entrepreneur-interet-general/h3.standard](https://github.com/entrepreneur-interet-general/H3.Standard) +- [richardvasquez/h3net](https://github.com/RichardVasquez/h3net) - A translation instead of a binding +- [pocketken/H3.net](https://github.com/pocketken/H3.net) - A translation instead of a binding + +## ClickHouse + +- [Functions for Working with H3 Indexes](https://clickhouse.tech/docs/en/sql-reference/functions/geo/h3/) + +## Clojure + +- [Factual/geo](https://github.com/Factual/geo) + +## Dart + +- [festelo/h3_flutter](https://github.com/festelo/h3_flutter) +- [codewithsam110g/h3_flutter_plus](https://github.com/codewithsam110g/h3_flutter_bindings) + +## Databricks + +- [H3 geospatial functions](https://docs.databricks.com/sql/language-manual/sql-ref-h3-geospatial-functions.html) + +## Delphi + +- [SkybuckFlying/h3_delphi](https://github.com/SkybuckFlying/h3_delphi) + +## DuckDB + +- [isaacbrodsky/h3-duckdb](https://github.com/isaacbrodsky/h3-duckdb) + +## ECL + +- [hpcc-systems/HPCC-Platform](https://github.com/hpcc-systems/HPCC-Platform/tree/master/plugins/h3) + +## Erlang + +- [helium/erlang-h3](https://github.com/helium/erlang-h3) + +## Go + +- [uber/h3-go](https://github.com/uber/h3-go) + +## Java + +- [uber/h3-java](https://github.com/uber/h3-java) + +## JavaScript + +- [uber/h3-js](https://github.com/uber/h3-js) +- [dfellis/h3-node](https://github.com/dfellis/h3-node) +- [realPrimoh/h3-reactnative](https://github.com/realPrimoh/h3-reactnative) + +## Julia + +- [wookay/H3.jl](https://github.com/wookay/H3.jl) + +## Kinetica + +- [H3 Functions](https://docs.kinetica.com/7.1/sql/query/#h3-functions) + +## OCaml + +- [travisbrady/ocaml-h3](https://github.com/travisbrady/ocaml-h3) + +## Perl + +- [mrdvt92/perl-Geo-H3](https://metacpan.org/pod/Geo::H3) + +## PHP + +- [neatlife/php-h3](https://github.com/neatlife/php-h3) +- [abler98/h3-php](https://github.com/abler98/h3-php) + +## PostgreSQL + +- [zachasme/h3-pg](https://github.com/zachasme/h3-pg) + +## Presto + +- [foursquare/h3-presto](https://github.com/foursquare/h3-presto) + +## Python + +- [uber/h3-py](https://github.com/uber/h3-py) +- [DahnJ/H3-Pandas](https://github.com/DahnJ/H3-Pandas) +- [filimoa/h3-polars](https://github.com/Filimoa/polars-h3) + +## R + +- [scottmmjackson/h3r](https://github.com/scottmmjackson/h3r) +- [crazycapivara/h3-r](https://github.com/crazycapivara/h3-r) +- [obrl-soil/h3jsr](https://github.com/obrl-soil/h3jsr) + +## Ruby + +- [seanhandley/h3_ruby](https://github.com/seanhandley/h3_ruby) + +## Rust + +- [rustyconover/libh3-sys](https://github.com/rustyconover/libh3-sys) +- [rustyconover/libh3](https://github.com/rustyconover/libh3) +- [nmandery/h3ron](https://github.com/nmandery/h3ron) +- [HydroniumLabs/h3o](https://github.com/HydroniumLabs/h3o) - A translation instead of a binding + +## Snowflake + +- [CARTO Analytics Toolbox](https://github.com/CartoDB/analytics-toolbox-core#snowflake) + +## SQLite3 + +- [isaacbrodsky/h3-sqlite3](https://github.com/isaacbrodsky/h3-sqlite3) + +## SQL Server + +- [tbbuck/H3.net.SqlClr](https://github.com/tbbuck/H3.net.SqlClr) + +## Spark + +- [jchotard/h3spark](https://github.com/JosephChotard/h3spark) (4.x) +- [kevinschaich/h3-pyspark](https://github.com/kevinschaich/h3-pyspark) (3.x) + diff --git a/website/docs/community/libraries.md b/website/docs/community/libraries.md new file mode 100644 index 000000000..8e0f7507c --- /dev/null +++ b/website/docs/community/libraries.md @@ -0,0 +1,20 @@ +--- +id: libraries +title: Libraries Using H3 +sidebar_label: Libraries Using H3 +slug: /community/libraries +--- + +The following libraries use H3 via one of its bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/website/docs/community/libraries.md). + +## JavaScript + +- [uber/geojson2H3](https://github.com/uber/geojson2H3) - Conversion utilities between H3 indexes and GeoJSON + +## Python + +- [nmandery/h3ronpy](https://github.com/nmandery/h3ronpy) - Raster to H3 conversion, smoothing of linked polygons. + +## Rust + +- [nmandery/h3ron](https://github.com/nmandery/h3ron) - Raster to H3 conversion, smoothing of linked polygons. diff --git a/website/docs/community/tutorials.md b/website/docs/community/tutorials.md new file mode 100644 index 000000000..7e78f325b --- /dev/null +++ b/website/docs/community/tutorials.md @@ -0,0 +1,38 @@ +--- +id: tutorials +title: Learning Resources +sidebar_label: Learning Resources +slug: /community/tutorials +--- + +This page lists further learning materials and code walkthroughs for the H3 library and bindings. Contributions to this list are welcome, please feel free to open a [pull request](https://github.com/uber/h3/tree/master/website/docs/community/tutorials.md). + +## Community + +- [H3 Slack workspace](https://join.slack.com/t/h3-core/shared_invite/zt-g6u5r1hf-W_~uVJmfeiWtMQuBGc1NNg) + +## Videos + +- [Introduction to H3](https://www.youtube.com/watch?v=wDuKeUkNLkQ) (June 2019) +- [Engineering an H3-based Geospatial Data Platform at Uber](https://www.youtube.com/watch?v=aCj-YVZ0mlE) +- [Building City Cores with H3](https://www.youtube.com/watch?v=PutOhe8HVNU) +- [H3-js: Hexagons in the Browser](https://www.youtube.com/watch?v=BsMIrBHLfLE&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=16&t=0s) +- [Hexagon Convolution for Data Smoothing & Forecasting](https://www.youtube.com/watch?v=z3PaGIQTFSE&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=14&t=0s) +- [Spatial Intelligence Using Hex](https://www.youtube.com/watch?v=0OlIpNAqokQ&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=18&t=0s) +- [Hierarchical Hexagons in Depth](https://www.youtube.com/watch?v=UILoSqvIM2w&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=15&t=0s) +- [H3: Tiling the Earth with Hexagons](https://www.youtube.com/watch?v=_-265mfMzl4&list=PLLEUtp5eGr7CNf9Bj3w3i30rzaU8lKZeV&index=22&t=0s) (Introduction to H3, November 2018) +- [H3: Tiling the Earth with Hexagons](https://www.youtube.com/watch?v=ay2uwtRO3QE) (Introduction to H3, January 2018) + +## Java + +- [H3 Measurements](https://github.com/isaacbrodsky/h3measurements): Measurements of average cell area, average cell perimeter length, truncation error, and so on. + +## JavaScript + +- [H3 Tutorials on Observable](https://beta.observablehq.com/collection/@nrabinowitz/h3-tutorial) + +## Python + +- [Usage (IPython Notebook)](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/usage.ipynb) +- [Unified Data Layers (IPython Notebook)](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/unified_data_layers.ipynb) +- [H3 API examples on Urban Analytics (IPython Notebook)](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/urban_analytics.ipynb) diff --git a/website/docs/comparisons/admin.md b/website/docs/comparisons/admin.md new file mode 100644 index 000000000..6d4b3f350 --- /dev/null +++ b/website/docs/comparisons/admin.md @@ -0,0 +1,27 @@ +--- +id: admin +title: Admin Boundaries +sidebar_label: Admin Boundaries +slug: /comparisons/admin +--- + +Administrative boundaries, such as ZIP Codes and Census Blocks in the United States, can be used for aggregating and analyzing data. These boundaries have a number of drawbacks for aggregating data. These are primarily related to not having a comparable spatial unit of analysis, being unable to spatially relate data, and being unrelated to the data being analyzed. + +## ZIP Codes + +The article [Stop Using Zip Codes for Geospatial Analysis](https://towardsdatascience.com/stop-using-zip-codes-for-geospatial-analysis-ceacb6e80c38) summarizes a number of problems with using ZIP Codes. In short, ZIP Codes do not represent areas themselves but rather mail delivery routes. They also vary greatly in spatial size when rendered as ZIP Code Tabulation Areas and [change for unrelated reasons](https://fas.org/sgp/crs/misc/RL33488.pdf). + +## Use case specific partitioning + +When using manually drawn partitions, there is usually no spatial unit of analysis which can be compared. Edges of partitions may exhibit boundary effects due to not taking into account neighboring partitions. + +Manually drawn partitions can better incorporate human knowledge, but can require updating as that knowledge changes. It can take a significant amount of time and effort to define and update partitions manually. + +The varying size of partitions means the center of a partition may be unrelated to the center of the data points. + +## ZIP Codes vs H3 comparison + + + +ZIP Codes on the left, H3 on the right. Data: [New York City 2015 Street Tree Census](https://data.cityofnewyork.us/Environment/2015-Street-Tree-Census-Tree-Data/uvpi-gqnh) + diff --git a/website/docs/comparisons/geohash.md b/website/docs/comparisons/geohash.md new file mode 100644 index 000000000..893ccef1f --- /dev/null +++ b/website/docs/comparisons/geohash.md @@ -0,0 +1,24 @@ +--- +id: geohash +title: Geohash +sidebar_label: Geohash +slug: /comparisons/geohash +--- + +[Geohash](https://en.wikipedia.org/wiki/Geohash) is a system for encoding locations using a string of characters, creating a hierarchical, square grid system (a quadtree). + +## Area distortion + +Because Geohash encodes latitude and longitudes pairs, it is subject to significant differences in area at different latitudes. A degree of longitude near a pole represents a significantly smaller distance than a degree of longitude near the equator. + +## Identifiers + +Geohash uses strings for its cell indexes. Because they are strings, they can encode arbitrarily precise cells. + +H3 cell indexes are designed to be 64 bit integers, which can be rendered and transmitted as strings if needed. The integer representation can be used when high performance is needed, as integer operations are usually more performant than string operations. Because indexes are fixed size, H3 has a maximum resolution it can encode. + +## Geohash vs H3 Comparison + + + +Geohash on the left, H3 on the right. Data: [San Francisco Street Tree List](https://data.sfgov.org/City-Infrastructure/Street-Tree-List/tkzw-k3nq) diff --git a/website/docs/comparisons/hexbin.md b/website/docs/comparisons/hexbin.md new file mode 100644 index 000000000..a6be4a508 --- /dev/null +++ b/website/docs/comparisons/hexbin.md @@ -0,0 +1,20 @@ +--- +id: hexbin +title: Hexbin +sidebar_label: Hexbin +slug: /comparisons/hexbin +--- + +Hexbinning is the process of taking coordinates and binning them into hexagonal cells in analytics or mapping software. The size of the hexagons is configurable, and the hexagons can align with the map projection being used. + +Hexbins are generally very computationally cheap to create, and for the best performance can be computed directly on a GPU. Their coordinates, while not hierarchical, support many common operations like finding neighbors and grid distances very efficiently. + +Hexbins have drawbacks in the ability to reuse the grids. The cell identifiers they use are only useful in the specific hexbin grid, and are not portable to another grid, limiting their ability to be used for joining datasets. The cell identifiers are not hierarchical, so relating data at different grid resolutions can be difficult. + +Hexbins are also limited by the projection system they are created on top of. This usually results in discontinuities at the edges of the projections, for example at the anti-meridian or at the poles. + +## Hexbin vs H3 Comparison + + + +Hexbins on the left, H3 on the right. Data: [San Francisco Street Tree List](https://data.sfgov.org/City-Infrastructure/Street-Tree-List/tkzw-k3nq) diff --git a/website/docs/comparisons/placekey.md b/website/docs/comparisons/placekey.md new file mode 100644 index 000000000..e314418cc --- /dev/null +++ b/website/docs/comparisons/placekey.md @@ -0,0 +1,10 @@ +--- +id: placekey +title: Placekey +sidebar_label: Placekey +slug: /comparisons/placekey +--- + +[Placekey](https://www.placekey.io/) is a system for encoding points of interest (POIs), and incorporates H3 in its POI identifier. + +For example, the Placekey for the Ferry Building in San Francisco, `zzw-22y@5vg-7gt-qzz`, contains a What Part (`zzw-22y`) encoding a specific POI, and a Where Part (`5vg-7gt-qzz`) encoding where that POI is. The Where Part is an H3 cell index at resolution 10, using an alternate string encoding. The example Where Part represents the H3 index `8a283082a677fff`. Placekey Where Parts can be losslessly converted to and from their equivalent H3 indexes. diff --git a/website/docs/comparisons/s2.md b/website/docs/comparisons/s2.md new file mode 100644 index 000000000..63a44e6dd --- /dev/null +++ b/website/docs/comparisons/s2.md @@ -0,0 +1,38 @@ +--- +id: s2 +title: S2 +sidebar_label: S2 +slug: /comparisons/s2 +--- + +[S2](https://s2geometry.io/), like H3, implements an open source, hierarchical, discrete, and global grid system. The systems share a number of similarities, including the use of 64 bit integers as cell indexes, making it very efficient to use both of them in big data systems. + +One of the main differences between S2 and H3 is the choice of cell shape. S2 uses square cells while H3 uses hexagonal cells. This leads to important differences in neighbors, subdivision, and visualization. + +## Neighbors + +Squares have two classes of neighbors: those that they share an edge with, and those that they share a point with. This can complicate analysis of moving things in the real world, because they are very unlikely to move in a way aligned with the grid. Instead, the analyst will need to account for different types of neighbors. + +Hexagons have only one class of neighbor, that they share an edge with. This makes running convolutions and smoothing over the data much simpler, since only the grid distance (as opposed to the geographic distance) from a cell needs to be considered. + +## Subdivision + +S2 uses an *aperture 4* system where each cell is subdivided into 4 finer, child cells. Squares subdivide exactly into 4 child squares. This means that when indexing a point to an S2 cell, and then truncating to the parent S2 cell, there is no possibility that the point is not contained in the bounds of the parent cell. + +This differs from H3 where the same operation is approximate. This is the case because hexagons do not exactly subdivide into 7 child hexagons. + +## Visualization + +S2 cells are squares in the system's projection. When those cells are visualized on a map using a projection like the Web Mercator projection, the cells can subjectively appear distorted (i.e. as a quadrilateral rather than square). + +H3 cells have the same non-alignment with the map projection, but in our experience the effect is less noticeable to viewers for hexagons. + +## Links + +* [Geometry on the Sphere: Google's S2 Library](https://docs.google.com/presentation/d/1Hl4KapfAENAOf4gv-pSngKwvS_jwNVHRPZTTDzXXn6Q/edit) + +## S2 vs H3 Comparison + + + +S2 on the left, H3 on the right. Data: [San Francisco Street Tree List](https://data.sfgov.org/City-Infrastructure/Street-Tree-List/tkzw-k3nq) diff --git a/website/docs/core-library/cellToBoundaryDesc.md b/website/docs/core-library/cellToBoundaryDesc.md new file mode 100644 index 000000000..744dd1207 --- /dev/null +++ b/website/docs/core-library/cellToBoundaryDesc.md @@ -0,0 +1,19 @@ +--- +id: cellToBoundaryDesc +title: Generate the cell boundary in latitude/longitude coordinates of an H3Index cell +sidebar_label: Generate the cell boundary in latitude/longitude coordinates of an H3Index cell +slug: /core-library/cellToBoundaryDesc +--- + +This operation is performed by function `cellToBoundary`. See the comments in the function source code for more detail. + +The conversion is performed as a series of coordinate system conversions described below. See the page [Coordinate Systems used by the H3 Core Library](/docs/core-library/coordsystems) for more information on each of these coordinate systems. + +1. We note that the cell vertices are the center points of cells in an aperture 3 grid one resolution finer than the cell resolution, which we term a *substrate* grid. We precalculate the substrate *ijk* coordinates of a cell with *ijk* coordinates (0,0,0), adding additional aperture 3 and aperture 7 (if required, by Class III cell grid) substrate grid resolutions as required to transform the vertex coordinates into a Class II substrate grid. + +
+ +
+ +2. The function `_faceIjkToGeoBoundary` calculates the *ijk* coordinates of the cell center point in the appropriate substrate grid (determined in the last step), and each of the substrate vertices is translated using the cell center point *ijk*. Each vertex *ijk* is then transformed onto the appropriate face and *Hex2d* coordinate system using the approach taken in [finding a cell center point](/docs/core-library/cellToLatLngDesc). If adjacent vertices lie on different icosahedron faces a point is introduced at the intersection of the cell edge and icosahedron face edge. +3. The *Hex2d* coordinates are then converted to latitude/longitude using `_hex2dToGeo`. diff --git a/website/docs/core-library/cellToLatLngDesc.md b/website/docs/core-library/cellToLatLngDesc.md new file mode 100644 index 000000000..7d391194e --- /dev/null +++ b/website/docs/core-library/cellToLatLngDesc.md @@ -0,0 +1,22 @@ +--- +id: cellToLatLngDesc +title: Determine the latitude/longitude coordinates of the center point of an H3Index cell +sidebar_label: Determine the latitude/longitude coordinates of the center point of an H3Index cell +slug: /core-library/cellToLatLngDesc +--- + +This operation is performed by function `cellToLatLng`. See the comments in the function source code for more detail. + +The conversion is performed as a series of coordinate system conversions described below. See the page [Coordinate Systems used by the H3 Core Library](/docs/core-library/coordsystems) for more information on each of these coordinate systems. + +1. The function `_h3ToFaceIjk` then converts the H3 index to the appropriate icosahedron face number and normalized *ijk* coordinate's on that face's coordinate system as follows: + * We start by assuming that the cell center point falls on the same icosahedron face as its base cell. + * It is possible that the cell center point lies on an adjacent face (termed an *overage* in the code), in which case we would need to use a projection centered on that adjacent face instead. We recall that normalized *ijk* coordinates have at most two non-zero components, and that in a face-centered Class II system the sum of those components is a resolution-specific constant value for cells that lie on the edge of that icosahedral face. + We determine whether an overage exists by taking the sum of the *ijk* components, and if there is an overage the positive *ijk* components indicate which adjacent face the cell center lies on. A lookup operation is then performed to find the appropriate rotation and translation to transform the *ijk* coordinates into the adjacent face-centered *ijk* system. + +
+ +
+ +2. The face-centered *ijk* coordinates are then converted into corresponding *Hex2d* coordinates using the function `_ijkToHex2d`. +3. The function `_hex2dToGeo` takes the *Hex2d* coordinates and scales them into face-centered gnomonic coordinates, and then performs an inverse gnomonic projection to get the latitude/longitude coordinates. diff --git a/website/docs/core-library/compilation-options.md b/website/docs/core-library/compilation-options.md new file mode 100644 index 000000000..be1b36cbc --- /dev/null +++ b/website/docs/core-library/compilation-options.md @@ -0,0 +1,117 @@ +--- +id: compilation-options +title: Compilation options +sidebar_label: Compilation options +slug: /core-library/compilation-options +--- + +A number of options in CMake can be set when compiling the H3 core library. These are relevant for building +different ways of using and testing the library and do not affect the underlying algorithms. + +When configuring with CMake, an option may be specified using `-D` on the command line, like so for setting +`CMAKE_BUILD_TYPE` to `Release`: + +```bash +cmake .. -DCMAKE_BUILD_TYPE=Release +``` + +Boolean options should be set to `ON` or `OFF`, like so: + +```bash +cmake .. -DBUILD_TESTING=OFF +``` + +## AUDIT_SOURCE_FILE_LIST + +Whether to glob the list of source files and compare it to the `ALL_SOURCE_FILES` and `EXAMPLE_SOURCE_FILES` lists +defined in CMake. This is a quality control measure to ensure that the source file list in `CMakeLists.txt` actually +matches the sources in the repository and is not missing any files. + +## BUILD_ALLOC_TESTS + +Whether to build the parts of the [test suite](./testing) that exercise the [H3_ALLOC_PREFIX](./custom-alloc) feature. + +## BUILD_BENCHMARKS + +Whether to build the [benchmark suite](./testing#benchmarks). + +## BUILD_COUNTRY_BENCHMARKS + +Whether to build benchmarks that use [Natural Earth](https://github.com/nvkelso/natural-earth-vector/) geometries. + +The geometries will be downloaded at build time using Node. + +## BUILD_FILTERS + +Whether to build the [H3 command line filter](./filters) executables. + +## BUILD_GENERATORS + +Whether to build generator executables used in the development of H3. This is not required for +building the library as the output of these generators is checked in. + +## BUILD_TESTING + +Whether to build the [test suite](./testing). + +## BUILD_FUZZERS + +Whether to build the [fuzzer suite](./testing#fuzzers). + +## ENABLE_LIBFUZZER + +Whether to build the fuzzers with [libFuzzer](https://www.llvm.org/docs/LibFuzzer.html) (this expects to be used with Clang). If OFF, a `main` function suitable for use with [American fuzzy lop](https://lcamtuf.coredump.cx/afl/) is included. + +## CMAKE_BUILD_TYPE + +Should be set to `Release` for production builds, and `Debug` in development. + +## ENABLE_COVERAGE + +Whether to compile `Debug` builds with coverage instrumentation (compatible with GCC, Clang, and lcov). This also excludes defensive code in the library that should not be counted against coverage because it is unreachable. + +## ENABLE_DOCS + +Whether to build the Doxygen documentation. This is not the same as the [H3 website](https://github.com/uber/h3/tree/master/website), +but is rather the documentation for the internal C library functions. + +## ENABLE_FORMAT + +Whether to enable using clang-format-14 to format source files before building. This should be enabled +before submitting patches for H3 as continuous integration will fail if the formatting does not match. + +Only this version of clang-format should be used to format the sources as new releases of clang-format +can change defaults, causing unintended churn of source code formatting. + +## ENABLE_LINTING + +Whether to enable using clang-tidy to lint source files when building. Only invoked when +[Makefile or Ninja CMake generators](https://cmake.org/cmake/help/latest/prop_tgt/LANG_CLANG_TIDY.html) +are used. + +## H3_ALLOC_PREFIX + +Used for directing the library to use a [different set of functions for memory management](./custom-alloc). + +## H3_PREFIX + +Used for [renaming the public API](./usage#function-renaming). + +## PRINT_TEST_FILES + +If enabled, CMake will print which CTest test case corresponds to which input file. + +## ENABLE_WARNINGS + +Whether to enable all compiler warnings. (i.e. [`-Wall`](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wall)) + +## WARNINGS_AS_ERRORS + +Whether to treat compiler warnings as errors. While a useful tool for ensuring software quality, this should not be enabled +for production builds as compiler warnings can change unexpectedly between versions. This is intended to be used with +`ENABLE_WARNINGS` on. + +## WRAP_VALGRIND + +Whether to wrap invocations of the test suite with `valgrind` (if available). + diff --git a/docs/core-library/coordsystems.md b/website/docs/core-library/coordsystems.md similarity index 79% rename from docs/core-library/coordsystems.md rename to website/docs/core-library/coordsystems.md index 4a612f2f2..09bec08d8 100644 --- a/docs/core-library/coordsystems.md +++ b/website/docs/core-library/coordsystems.md @@ -1,26 +1,32 @@ -Coordinate Systems used by the H3 Core Library --- +id: coordsystems +title: Coordinate systems +sidebar_label: Coordinate systems +slug: /core-library/coordsystems +--- + +The H3 Core Library uses the following coordinate systems internally. IJK Coordinates --- -Discrete hexagon planar grid systems naturally have 3 coordinate axes spaced 120° apart. We refer to such a system as an *ijk coordinate system*, for the three coordinate axes *i*, *j*, and *k*. A single *ijk* coordinate triplet is represented in the **H3 Core Library** using the structure type `CoordIJK`. +Discrete hexagon planar grid systems naturally have 3 coordinate axes spaced 120° apart. We refer to such a system as an *ijk coordinate system*, for the three coordinate axes *i*, *j*, and *k*. A single *ijk* coordinate triplet is represented in the H3 Core Library using the structure type `CoordIJK`. Using an *ijk* coordinate system to address hexagon grid cells provides multiple valid addresses for each cell. *Normalizing* an *ijk* address (function `_ijkNormalize`) creates a unique address consisting of the minimal positive *ijk* components; this always results in at most two non-zero components.
- +
FaceIJK Coordinates --- -The **H3 Core Library** centers an *ijk* coordinate system on each face of the icosahedron; the combination of a face number and *ijk* coordinates on that face's coordinate system is represented using the structure type `FaceIJK`. +The H3 Core Library centers an *ijk* coordinate system on each face of the icosahedron; the combination of a face number and *ijk* coordinates on that face's coordinate system is represented using the structure type `FaceIJK`. Each grid resolution is rotated ~19.1° relative to the next coarser resolution. The rotation alternates between counterclockwise and clockwise at each successive resolution, so that each resolution will have one of two possible orientations: *Class II* or *Class III* (using a terminology coined by R. Buckminster Fuller). The base cells, which make up resolution 0, are *Class II*.
- +
Hex2d Coordinates diff --git a/dev-docs/creating_bindings.md b/website/docs/core-library/creating-bindings.md similarity index 76% rename from dev-docs/creating_bindings.md rename to website/docs/core-library/creating-bindings.md index ebd3e79ad..aee6b00e1 100644 --- a/dev-docs/creating_bindings.md +++ b/website/docs/core-library/creating-bindings.md @@ -1,14 +1,19 @@ -# Creating bindings for H3 +--- +id: creating-bindings +title: Creating bindings for H3 +sidebar_label: Creating bindings +slug: /core-library/creating-bindings +--- H3 is a C library, in part to make it simpler to create bindings for different programming languages. Each language usually has its own way to bind to C functions, but this document can serve as a starting point and list of tips. -There may already be [H3 bindings](https://uber.github.io/h3/#/documentation/community/bindings) available for your language of choice. +There may already be [H3 bindings](/docs/community/bindings) available for your language of choice. ## Function naming The `make binding-functions` target produces a file `binding-functions` containing a list of function in the H3 public API, one per line. You can use this as part of your build process to check how much of the H3 public API your bindings expose. This list does not include memory management functions that are needed to allocate arrays to be passed to the H3 API. -Keeping similar names and purposes for functions can make it easier for your users to use the H3 [API Reference](https://uber.github.io/h3/#/documentation/api-reference/). +Keeping similar names and purposes for functions can make it easier for your users to use the H3 [API Reference](/docs/api/indexing). ## Community @@ -16,7 +21,7 @@ When ready, make a [pull request](https://github.com/uber/h3/edit/master/docs/co ## Documentation -To be included in the H3 [API reference](https://uber.github.io/h3/#/documentation/api-reference/), your binding should: +To be included in the H3 [API reference](/docs/api/indexing), your binding should: * Be reasonably up to date with uber/h3. * Include bindings for the relevant functions in the output of `make binding-functions`. For example, `stringToH3` may not be necessary if your bindings only supports string H3 indexes. diff --git a/website/docs/core-library/custom-alloc.md b/website/docs/core-library/custom-alloc.md new file mode 100644 index 000000000..c8f0b2dc6 --- /dev/null +++ b/website/docs/core-library/custom-alloc.md @@ -0,0 +1,51 @@ +--- +id: custom-alloc +title: Memory allocation +sidebar_label: Memory allocation +slug: /core-library/custom-alloc +--- + +H3's approach to memory management is to rely on memory allocated by the caller as much as possible. This allows memory to be managed by an external framework. + +In some cases (for example, `polygonToCells`), H3 allocates heap memory. When this is needed, it uses the standard C memory allocation functions. + +## Custom Memory Allocators + +:::caution + +On some systems, such as Windows, the undefined symbols cannot be undefined at build time. Further changes to the H3 build are needed to provide custom implementations. + +::: + +:::caution + +There are a few algorithms like `kRing` that still use the call stack to recurse and could run out of memory that way. + +::: + +H3 supports replacing the memory management functions (`malloc`, `calloc`, `realloc`, `free`) used by the library at build time. This can be used to integrate H3 within a managed framework. + +When using custom memory allocators, H3 prefixes the names of memory allocation functions with the string you specify. The application linking H3 must have the prefixed replacement functions defined, or you must change the H3 build to link against the prefixed replacement functions. + +When building H3, specify the `H3_ALLOC_PREFIX` option to your prefix of choice, as below: + +```bash +cmake -DH3_ALLOC_PREFIX=my_prefix_ . +``` + +Then, in your application using H3, implement the following functions, replacing `my_prefix_` with the prefix you chose above: + +```c +void* my_prefix_malloc(size_t size); +void* my_prefix_calloc(size_t num, size_t size); +void* my_prefix_realloc(void* ptr, size_t size); +void my_prefix_free(void* ptr); +``` + +:::info + +H3 does not currently use `realloc`. + +::: + +Link to H3 as you would have without the custom allocators. The custom allocators will be used for allocating heap memory in H3. diff --git a/website/docs/core-library/filters.md b/website/docs/core-library/filters.md new file mode 100644 index 000000000..33915f656 --- /dev/null +++ b/website/docs/core-library/filters.md @@ -0,0 +1,51 @@ +--- +id: filters +title: Unix-style Filters for H3 +sidebar_label: Unix-style Filters for H3 +slug: /core-library/filters +--- + +The directory `src/apps/filters` contains unix-style stdin/stdout filters that perform conversions between integer H3 indexes and other useful types. It currently contains the filters listed in the table below. See the header comments in each application source code file for more information. + +Filters are experimental and are not part of the semantic version of the H3 library. + +All latitude/longitude coordinates are in decimal degrees. See the [H3 Index Representations](/docs/core-library/h3indexing) page for information on the integer `H3Index`. + + +| filter | input | outputs | +|------------------|-----------|---------------------------------| +| `latLngToCell` | lat/lng | `H3Index` | +| `cellToLatLng` | `H3Index` | cell center point in lat/lng | +| `cellToBoundary` | `H3Index` | cell boundary in lat/lng | +| `h3ToComponents` | `H3Index` | components | +| `gridDisk` | `H3Index` | surrounding `H3Index` | +| `gridDiskUnsafe` | `H3Index` | surrounding `H3Index`, in order | + +Unix Command Line Examples +--- + +* find the index for coordinates at resolution 5 + + `latLngToCell --resolution 5 --latitude 40.689167 --longitude -74.044444` + +* output the cell center point for `H3Index` 845ad1bffffffff + + `cellToLatLng --index 845ad1bffffffff` + +* output the cell boundary for `H3Index` 845ad1bffffffff + + `cellToBoundary --index 845ad1bffffffff` + +* find the components for the `H3Index` 845ad1bffffffff + + `h3ToComponents --index 845ad1bffffffff` + +* output all indexes within distance 1 of the `H3Index` 845ad1bffffffff + + `kRing -k 1 --origin 845ad1bffffffff` + +* output all hexagon indexes within distance 2 of the `H3Index` 845ad1bffffffff + + `hexRange -k 2 --origin 845ad1bffffffff` + +Note that the filters `cellToLatLng` and `cellToBoundary` take optional arguments that allow them to generate `kml` output. See the header comments in the corresponding source code files for details. diff --git a/website/docs/core-library/latLngToCellDesc.md b/website/docs/core-library/latLngToCellDesc.md new file mode 100644 index 000000000..9d603d846 --- /dev/null +++ b/website/docs/core-library/latLngToCellDesc.md @@ -0,0 +1,18 @@ +--- +id: latLngToCellDesc +title: Conversion from latitude/longitude to containing H3 cell index +sidebar_label: Conversion from latitude/longitude to containing H3 cell index +slug: /core-library/latLngToCellDesc +--- + +This operation is performed by function `latLngToCell`. See the comments in the function for more detail. + +The conversion is performed as a series of coordinate system conversions described below. See the page [Coordinate Systems used by the H3 Core Library](/docs/core-library/coordsystems) for more information on each of these coordinate systems. + +1. The input latitude/longitude coordinate is first converted into the containing icosahedron face and a *Hex2d* coordinate on that face using function `_geoToHex2d`, which determines the correct face and then performs a face-centered gnomonic projection into face-centered polar coordinates. These polar coordinates are then scaled appropriately to a *Hex2d* coordinate on the input grid resolution *r*. +2. The *Hex2d* coordinate is converted into resolution *r* normalized *ijk* coordinates using function `_hex2dToCoordIJK`. +3. The face and face-centered *ijk* coordinates are then converted into an `H3Index` representation using the following steps: + + 1. The H3 index digits are calculated from resolution *r* up to 0, adjusting the *ijk* coordinates at each successively coarser resolution. + 2. When resolution 0 is reached, if the remaining *ijk* coordinates are (0,0,0) then the base cell centered on the face is chosen for the index. + 3. If the remaining resolution 0 *ijk* coordinates are not (0,0,0), then a lookup operation is performed to find the appropriate base cell and the required rotation (if any) to orient the cell in that base cell's coordinate system. The index is then translated and rotated into the coordinate system centered on the new base cell. diff --git a/website/docs/core-library/overview.md b/website/docs/core-library/overview.md new file mode 100644 index 000000000..7fd9c24a0 --- /dev/null +++ b/website/docs/core-library/overview.md @@ -0,0 +1,20 @@ +--- +id: overview +title: Overview of the H3 Geospatial Indexing System +sidebar_label: Overview +slug: /core-library/overview +--- + +The H3 geospatial indexing system is a discrete global grid system (see [Sahr et al., 2003](http://webpages.sou.edu/~sahrk/sqspc/pubs/gdggs03.pdf)) consisting of a multi-precision hexagonal tiling of the sphere with hierarchical indexes. + +The hexagonal grid system is created on the planar faces of a sphere-circumscribed icosahedron, and the grid cells are then projected to the surface of the sphere using an inverse face-centered polyhedral gnomonic projection. The coordinate reference system (CRS) is spherical coordinates with the [WGS84](https://en.wikipedia.org/wiki/WGS84)/[EPSG:4326](https://epsg.io/4326) authalic radius. It is common to use WGS84 CRS data with the H3 library. + +The icosahedron is fixed relative to the sphere using a *Dymaxion* orientation (due to R. Buckminster Fuller). This orientation of a spherical icosahedron places all 12 icosahedron vertices in the ocean. (At the time of H3's development, this was the only known orientation with this property. [Others have since been found](https://richard.science/sci/2019_barnes_dgg_published.pdf).) + +The H3 grid is constructed on the icosahedron by recursively creating increasingly higher precision hexagon grids until the desired resolution is achieved. Note that it is impossible to tile the sphere/icosahedron completely with hexagons; each resolution of an icosahedral hexagon grid must contain exactly 12 pentagons at every resolution, with one pentagon centered on each of the icosahedron vertices. + +The first H3 resolution (resolution 0) consists of 122 cells (110 hexagons and 12 icosahedron vertex-centered pentagons), referred to as the *base cells*. These were chosen to capture as much of the symmetry of the spherical icosahedron as possible. These base cells are assigned numbers from 0 to 121 based on the latitude of their center points; base cell 0 has the northern most center point, while base cell 121 has the southern most center point. + +Each subsequent resolution beyond resolution 0 is created using an aperture 7 resolution spacing (aperture refers to the number of cells in the next finer resolution grid for each cell); as resolution increases the unit length is scaled by `sqrt(7)` and each hexagon has 1/7th the area of a hexagon at the next coarser resolution (as measured on the icosahedron). H3 provides 15 finer grid resolutions in addition to the resolution 0 base cells. The finest resolution, resolution 15, has cells with an area of less than 1 m2. A table detailing the average cell area for each H3 resolution is available [here](/docs/core-library/restable). + +*Note:* you can create KML files to visualize the H3 grids by running the `kml` make target. It will place the files in the `KML` output sub-directory. diff --git a/website/docs/core-library/testing.md b/website/docs/core-library/testing.md new file mode 100644 index 000000000..fd1b63f54 --- /dev/null +++ b/website/docs/core-library/testing.md @@ -0,0 +1,51 @@ +--- +id: testing +title: Testing strategy +sidebar_label: Testing strategy +slug: /core-library/testing +--- + +The H3 developers try to ensure the robustness and reliability of the H3 library. Tools used to do this include defensive code, unit tests with coverage reporting, and fuzzing. + +The H3 library may despite these efforts behave unexpectedly; in these cases the developers +[welcome feedback and contributions](https://github.com/uber/h3/blob/master/CONTRIBUTING.md). + +## Unit testing + +Github Actions are used to run the H3 test suite for every commit. A variety of configurations, described below, are tested. + +Coverage information is collected in Coveralls. Because of the self-contained nature of the H3 library, we seek to have as close to 100% code coverage as possible. + +| Operating system | Compiler | Build type | Processor architecture | Special notes +| ---------------- | ----------- | -------------- | ---------------------- | ------------- +| Linux (Ubuntu) | Clang | Debug, Release | x64 | clang-format-14 is used to ensure all code is consistently formatted +| Linux | Clang | Debug | x64 | An additional copy of the job runs with [Valgrind](https://valgrind.org/) +| Linux | Clang | Debug | x64 | An additional copy of the job runs with coverage reporting, and excerising the `H3_PREFIX` mechanism. +| Linux | gcc | Debug, Release | x64 | +| Mac OS | Apple Clang | Debug, Release | x64 | +| Windows | MSVC | Debug, Release | x64 | Static library +| Windows | MSVC | Debug, Release | x86 | Static library +| Windows | MSVC | Debug, Release | x64 | Dynamic library; testing is not run in this configuration +| Windows | MSVC | Debug, Release | x86 | Dynamic library; testing is not run in this configuration + +## Defensive code + +H3 uses preprocessor macros borrowed from [SQLite's testing methodology](https://www.sqlite.org/testing.html) to include defensive code in the library. Defensive code is code that handles error conditions for which there are no known test cases to demonstrate it. The lack of known test cases means that without the macros, the defensive cases could inappropriately reduce coverage metrics, disincentivizing including them. The macros behave differently, depending on the build configuration: + +* Under release builds of the library (`CMAKE_BUILD_TYPE=Release`), the defensive code is included without modification. These branches are intended to be very simple (usually only `return`ing an error code and possibly `free`ing some resources) and to be visually inspectable. + +* Under debug builds of the library (`CMAKE_BUILD_TYPE=Debug`), the defensive code is included and `assert` calls are included if the defensive code is invoked. Any unit test or fuzzer which can demonstrate the defensive code is actually reached will trigger a test failure and the developers can be alerted to cover the defensive code in unit tests. + +* Under coverage builds of the library (`CMAKE_BUILD_TYPE=Debug ENABLE_COVERAGE=ON`), the defensive code is not included by replacing its condition with a constant value. The compiler removes the defensive code and it is not counted in coverage metrics. This is intended only for determining test coverage of the library. + +## Benchmarks + +H3 uses benchmarks to offer a comparison of the library's performance between revisions. + +Benchmarks are automatically run on Linux x64 with Clang and GCC compilers for each commit in Github Actions. + +## Fuzzers + +H3 uses [fuzzers](https://github.com/uber/h3/tree/master/src/apps/fuzzers) to find novel inputs that crash or result in other undefined behavior. + +On each commit, CI is triggered to run [OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/h3) for H3. OSS-Fuzz regularly runs fuzzers against the latest development version of H3 and reports newly discovered issues to the H3 core maintainers. diff --git a/website/docs/core-library/usage.md b/website/docs/core-library/usage.md new file mode 100644 index 000000000..253a74d01 --- /dev/null +++ b/website/docs/core-library/usage.md @@ -0,0 +1,28 @@ +--- +id: usage +title: Public API +sidebar_label: Public API +slug: /core-library/usage +--- + +The public API of the H3 Core Library is defined in the file [`h3api.h`](https://github.com/uber/h3/blob/master/src/h3lib/include/h3api.h.in). + +## API Versioning + +The functions defined in `h3api.h` adhere to [Semantic Versioning](https://semver.org/). + +## Header preprocessing + +The file `h3api.h.in` is preprocessed into the file `h3api.h` as part of H3's build process. The preprocessing inserts the correct values for the `H3_VERSION_MAJOR`, `H3_VERSION_MINOR`, and `H3_VERSION_PATCH` macros. + +## API preconditions + +The H3 API expects valid input. Behavior of the library may be undefined when given invalid input. Indexes should be validated with `isValidCell` or `isValidDirectedEdge` as appropriate. + +The library attempts to validate inputs and return useful error codes if input is invalid. Which inputs are validated, and how precisely they are +validated, may change between versions of the library. As a result the specific error code returned may change. + +## Function renaming + +The [`H3_PREFIX`](./compilation-options#H3_PREFIX) exists to rename all functions in the H3 public API with a prefix chosen at compile time. The default is to have no prefix. +This can be needed when linking multiple copies of the H3 library in order to avoid naming collisions. Internal functions and symbols are not renamed. diff --git a/website/docs/highlights/aggregation.md b/website/docs/highlights/aggregation.md new file mode 100644 index 000000000..a4eb23b06 --- /dev/null +++ b/website/docs/highlights/aggregation.md @@ -0,0 +1,30 @@ +--- +id: aggregation +title: Aggregation +sidebar_label: Aggregation +slug: /highlights/aggregation +--- + +Analysis of location data, such as locations of cars in a city, can be done by bucketing locations. ([Sahr et al., 2003](http://webpages.sou.edu/~sahrk/sqspc/pubs/gdggs03.pdf)) Using a regular grid provides smooth gradients and the ability to measure differences between cells. + +The cell shape of that grid system is an important consideration. For simplicity, it should be a polygon that tiles regularly: the triangle, the square, or the hexagon. Of these, triangles and squares have neighbors with different distances. Triangles have three different distances, and squares have two different distances. For hexagons, all neighbors are equidistant. + +| Triangle | Square | Hexagon +| -------- | ------ | ------- +| | | +| Triangles have 12 neighbors | Squares have 8 neighbors | Hexagons have 6 neighbors + +This property allows for simpler analysis of movement. Hexagons have the property of expanding rings of neighbors approximating circles: + +
+
+ All six neighbors of a hexagon (ring 1) +
+ +Hexagons are also optimally space-filling. On average, a polygon may be filled with hexagon tiles with a smaller margin of error than would be present with square tiles. + +## References + +* Use case: [H3: Uber’s Hexagonal Hierarchical Spatial Index ](https://eng.uber.com/h3/) +* Observable notebook example: [Intro to h3-js](https://observablehq.com/@nrabinowitz/h3-tutorial-the-h3-js-library?collection=@nrabinowitz/h3-tutorial) +* Jupyter notebook example: [H3 Python API](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/usage.ipynb) diff --git a/website/docs/highlights/flowmodel.md b/website/docs/highlights/flowmodel.md new file mode 100644 index 000000000..781c4ca9e --- /dev/null +++ b/website/docs/highlights/flowmodel.md @@ -0,0 +1,16 @@ +--- +id: flowmodel +title: Flow Modelling +sidebar_label: Flow Modelling +slug: /highlights/flowmodel +--- + +H3's hexagonal grid is well suited to analyzing movement. In addition to the benefits of the hexagonal grid shape, H3 includes other features for modelling flow. + +H3 can create indexes that refer to the movement from one cell to a neighbor. These directed edge indexes share the advantages with their cell index counterparts, such as being 64 bit integers. The use of directed edges makes it possible to associate a weight with a movement in the grid. + +(A planned improvement for the H3 system is to create indexes that refer to the edge between two cells without regards of direction.) + +## Links + +* Observable notebook example: [H3 Travel Times](https://observablehq.com/@nrabinowitz/h3-travel-times) diff --git a/website/docs/highlights/indexing.md b/website/docs/highlights/indexing.md new file mode 100644 index 000000000..965751fa0 --- /dev/null +++ b/website/docs/highlights/indexing.md @@ -0,0 +1,37 @@ +--- +id: indexing +title: Indexing +sidebar_label: Indexing +slug: /highlights/indexing +--- + +H3 is a hierarchical geospatial index. H3 indexes refer to cells by the spatial hierarchy. Every hexagonal cell, up to the maximum resolution supported by H3, has seven child cells below it in this hierarchy. This subdivision is referred to as *aperture 7*. + +
+
+ A parent hexagon approximately contains seven children +
+ +Hexagons do not cleanly subdivide into seven finer hexagons. However, by alternating the orientation of grids a subdivision into seven cells can be approximated. This makes it possible to truncate the precision within a fixed margin of error of an H3 index. It is also possible to determine all the children of a parent H3 index. + +Approximate containment only applies when truncating the precision of an H3 index. The borders of hexagons indexed at a specific resolution are not approximate and not affected by these considerations. For example, indexing points to cells at a certain resolution and finding those cell's neighbors is not affected by approximate containment. + +While geographic containment is approximate, logical containment in the index is exact. It is possible to use H3 as an exact logical index on top of data indexed at a specific resolution. + +This approximation allows for efficiently relating datasets indexed at different resolutions of the H3 grid. The functions for changing precision (`h3ToParent`, `h3ToChildren`) are implemented with only a few bitwise operations, making them very fast. The structure of the H3 index means that geographically close locations will tend to have numerically close indexes. + +The hierarchical structure can also be used in analysis, when the precision or uncertainty for a location needs to be encoded in the spatial index. For example, a point from a GPS receiver could be indexed at a coarser resolution when the precision of the signal is lower, or some cells could be aggregated to a parent cell when there are too few data points in each of the finer cells. + +Hierarchical containment allows for use cases like making contiguous sets of cells "compact" with `compactCells`. It is then possible to `uncompactCells` to the same input set of cells, or to test whether a cell is contained by the compact set. + +| Uncompacted (dense) | Compacted (sparse) +| ----------------- | ---------------- +| | +| California represented by 10633 uncompacted cells | California represented by 901 compacted cells + +In use cases where exact boundaries are needed applications must take care to handle the hierarchical concerns. This can be done by taking care to use the hierarchy as a logical one rather than geographic. Another useful approach is using the grid system as an optimization in addition to a more precise point-in-polygon check. + +## Links + +* Observable notebook example: [H3 Hierarchical (Non)Containment](https://observablehq.com/@nrabinowitz/h3-hierarchical-non-containment?collection=@nrabinowitz/h3) +* Observable notebook example: [Shape simplification with H3](https://observablehq.com/@nrabinowitz/shape-simplification-with-h3?collection=@nrabinowitz/h3) diff --git a/website/docs/highlights/joining.md b/website/docs/highlights/joining.md new file mode 100644 index 000000000..217acae8c --- /dev/null +++ b/website/docs/highlights/joining.md @@ -0,0 +1,16 @@ +--- +id: joining +title: Joining +sidebar_label: Joining +slug: /highlights/joining +--- + +H3, acting as a standard unit of analysis, can be used to join disparate data sets. + +The H3 library contains support for indexing points, lines, and regions into the grid. Other data formats, such as rasters, can be indexed into H3 using combinations of these basic indexing operations. Once data is indexed into H3 indexes, it can be easily joined with other datasets on the H3 index. + +## References + +* Example: [Placekey](https://www.placekey.io/) +* Jupyter notebook example: [Unified Data Layers](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/unified_data_layers.ipynb) +* Observable notebook example: [Suitability Analysis](https://observablehq.com/@nrabinowitz/h3-tutorial-suitability-analysis?collection=@nrabinowitz/h3-tutorial) \ No newline at end of file diff --git a/website/docs/highlights/ml.md b/website/docs/highlights/ml.md new file mode 100644 index 000000000..c31b8af19 --- /dev/null +++ b/website/docs/highlights/ml.md @@ -0,0 +1,14 @@ +--- +id: ml +title: Machine Learning +sidebar_label: Machine Learning +slug: /highlights/ml +--- + +H3 is well suited to applying machine learning to geospatial data. Techniques from computer vision, such as [convolution](https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep-learning-99760835f148#:~:text=Convolution%20is%20the%20first%20layer,and%20a%20filter%20or%20kernel), can be applied to the pixel grid defined by H3. + +H3 has functions for finding neighbors (`kRing`) for use in performing convolution, and functions for transforming indexes to a two dimensional IJ coordinate space on which other computer vision algorithms can be run. + +## Links + +* Jupyter notebook example: [Uber H3 API examples on Urban Analytics in the city of Toulouse (France)](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/urban_analytics.ipynb) diff --git a/website/docs/installation.mdx b/website/docs/installation.mdx new file mode 100644 index 000000000..75dac4144 --- /dev/null +++ b/website/docs/installation.mdx @@ -0,0 +1,201 @@ +--- +id: installation +title: Installation +sidebar_label: Installation +slug: /installation +--- + + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +We recommend using prebuilt [bindings](/docs/community/bindings) if they are available for your programming language. Bindings for Go, Java, JavaScript, Python, and others are available. + +## Package managers + + + + +Using [PyPi](https://pypi.org/project/h3/), run: + +```bash +pip install h3 +``` + +Using [Conda](https://github.com/conda-forge/h3-py-feedstock), run: + +``` +conda config --add channels conda-forge +conda install h3-py +``` + + + + +Using Maven, add the following to your `pom.xml` file: + +```xml + + com.uber + h3 + 4.1.0 + +``` + +Using Gradle, add the following to your build script: + +```gradle +compile("com.uber:h3:4.1.0") +``` + + + + +Using npm, run: + +```bash +npm install h3-js +``` + +Using yarn, run: + +```bash +yarn add h3-js +``` + + + + +Using brew, run: + +```bash +brew install h3 +``` + +This installs the C library and filter applications. + + + + +Using DuckDB, run this to install the [H3 extension](https://duckdb.org/community_extensions/extensions/h3.html): + +```sql +INSTALL h3 FROM community; +``` + +Once installed, the extension can be loaded with: + +```sql +LOAD h3; +``` + + + + +## Install from source + +First, clone the repository or [download the source](https://github.com/uber/h3) +and check out the latest release: + +```bash +git clone https://github.com/uber/h3.git +cd h3 +git checkout v$( + + +First make sure you [have the developer tools installed](http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/) and then run: + +```bash +# Installing the bare build requirements +brew install cmake +# Installing useful tools for development +brew install clang-format lcov doxygen +``` + + + + +```bash +# Installing the bare build requirements +apk add cmake make gcc libtool musl-dev +``` + + + + +```bash +# Installing the bare build requirements +sudo apt install cmake make gcc libtool +# Installing useful tools for development +sudo apt install clang-format cmake-curses-gui lcov doxygen +``` + + + + +You need to install CMake and Visual Studio, including the Visual C++ compiler. We recommend Visual Studio 2017 or later. + +:::info + +You can build H3 as a shared library (DLL) on Windows, but the test suite does not support this configuration because the tests use functions internal to the DLL, and they are not exposed for testing. + +::: + + + + +```bash +# Installing the build requirements +sudo pkg install bash cmake gmake doxygen lcov +``` + + + + +Next, build the library: + +```bash +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release .. +cmake --build . +``` + +Optionally, to run H3's test suite, run: + +``` +ctest +``` + +By default, the filter applications are built when you build H3. Confirm they are working by running: + +``` +./bin/latLngToCell --lat 14 --lng -42 --resolution 2 +``` diff --git a/website/docs/library/errors.md b/website/docs/library/errors.md new file mode 100644 index 000000000..635497fee --- /dev/null +++ b/website/docs/library/errors.md @@ -0,0 +1,68 @@ +--- +id: errors +title: Error handling +sidebar_label: Error handling +slug: /library/errors +--- + +H3 does it's best to be robust to system failures or unexpected inputs, but +some times these cannot be recovered from. H3's way of doing this is to return +an error code to the caller. + +## Example + +This code example checks for an error when calling an H3 function and prints a message if the call did not succeed: + +```c +H3Error err; +H3Index result; + +err = latLngToCell(lat, lng, res, &result); +if (err) { + fprintf(stderr, "Error: %d", err); +} +``` + +## H3Error type + +The type returned by most H3 functions is `H3Error`, a 32 bit integer type with the following properties: + +* `H3Error` will be an integer type of 32 bits, i.e. `uint32_t`. +* `H3Error` with value 0 indicates success (no error). +* No `H3Error` value will set the most significant bit. +* As a result of these properties, no `H3Error` value will set the bits that correspond with the **Mode** bit field in an `H3Index`. + +32 bit return codes with the high bit never set allows for mixing error codes and resulting indexes if desired by the application, after copying the error codes into the result buffer. + +## Table of error codes + +| Value | Name | Description +| ----- | -------------------- | ----------- +| 0 | E_SUCCESS | Success (no error) +| 1 | E_FAILED | The operation failed but a more specific error is not available +| 2 | E_DOMAIN | Argument was outside of acceptable range (when a more specific error code is not available) +| 3 | E_LATLNG_DOMAIN | Latitude or longitude arguments were outside of acceptable range +| 4 | E_RES_DOMAIN | Resolution argument was outside of acceptable range +| 5 | E_CELL_INVALID | `H3Index` cell argument was not valid +| 6 | E_DIR_EDGE_INVALID | `H3Index` directed edge argument was not valid +| 7 | E_UNDIR_EDGE_INVALID | `H3Index` undirected edge argument was not valid +| 8 | E_VERTEX_INVALID | `H3Index` vertex argument was not valid +| 9 | E_PENTAGON | Pentagon distortion was encountered which the algorithm could not handle it +| 10 | E_DUPLICATE_INPUT | Duplicate input was encountered in the arguments and the algorithm could not handle it +| 11 | E_NOT_NEIGHBORS | `H3Index` cell arguments were not neighbors +| 12 | E_RES_MISMATCH | `H3Index` cell arguments had incompatible resolutions +| 13 | E_MEMORY_ALLOC | Necessary memory allocation failed +| 14 | E_MEMORY_BOUNDS | Bounds of provided memory were not large enough +| 15 | E_OPTION_INVALID | Mode or flags argument was not valid + +The H3 library may always add additional error messages. Error messages not recognized by the application should be treated as `E_FAILED`. + +### Bindings + +Bindings translate error codes into the error handling mechanism appropriate to their language. For example, Java will convert error codes into Java Exceptions. + +When possible, it is preferable to retain the error code. When this is not possible it is fine to elide them. Language bindings should include error messages that are formatted as is usual in their language. + +## References + +* [Technical RFC on error handling](https://github.com/uber/h3/blob/master/dev-docs/RFCs/v4.0.0/error-handling-rfc.md) diff --git a/website/docs/library/index/cell.md b/website/docs/library/index/cell.md new file mode 100644 index 000000000..bda7e6aeb --- /dev/null +++ b/website/docs/library/index/cell.md @@ -0,0 +1,96 @@ +--- +id: cell +title: Cell mode +sidebar_label: Cell mode +slug: /library/index/cell +--- + +
+ +
+ +The H3 system assigns a unique hierarchical index to each cell. The H3 index of a resolution *r* cell begins with the appropriate resolution 0 base cell number. This is followed by a sequence of *r* digits 0-6, where each *i*th digit *d*i specifies one of the 7 cells centered on the cell indicated by the coarser resolution digits *d*1 through *d*i-1. A local hexagon coordinate system is assigned to each of the resolution 0 base cells and is used to orient all hierarchical indexing child cells of that base cell. The assignment of digits 0-6 at each resolution uses a *Central Place Indexing* arrangement (see [Sahr, 2014](http://webpages.sou.edu/~sahrk/sqspc/pubs/autocarto14.pdf)). In the case of the 12 pentagonal cells the indexing hierarchy produced by sub-digit 1 is removed at all resolutions. + +Child hexagons are linearly smaller than their parent hexagons. + +
+ +
+ +## H3 Cell Index + +An H3 Cell index (mode 1) represents a cell (hexagon or pentagon) in the H3 grid system at a particular resolution. The components of the H3 Cell index are packed into a 64-bit integer in order, highest bit first, as follows: + +* 1 bit reserved and set to 0, +* 4 bits to indicate the H3 Cell index mode, +* 3 bits reserved and set to 0, +* 4 bits to indicate the cell resolution 0-15, +* 7 bits to indicate the base cell 0-121, +* 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total are reserved for resolutions 1-15) + +The three bits for each unused digit are set to 7. + +## Bit layout of H3Index for cells + +The layout of an `H3Index` is shown below in table form. The interpretation of the "Mode-Dependent" field differs depending on the mode of the index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x30Reserved (0)Mode (1)Reserved (0)ResolutionBase cell
0x20Base cellDigit 1Digit 2Digit 3Digit 4Digit 5
0x10Digit 5Digit 6Digit 7Digit 8Digit 9Digit 10
0x00Digit 10Digit 11Digit 12Digit 13Digit 14Digit 15
+ +## Links + +* Observable notebook example: [H3 Index Inspector](https://observablehq.com/@nrabinowitz/h3-index-inspector?collection=@nrabinowitz/h3) diff --git a/website/docs/library/index/directededge.md b/website/docs/library/index/directededge.md new file mode 100644 index 000000000..20a3dd5da --- /dev/null +++ b/website/docs/library/index/directededge.md @@ -0,0 +1,78 @@ +--- +id: directededge +title: Directed edge mode +sidebar_label: Directed edge mode +slug: /library/index/directededge +--- + +
+ +
+ +An H3 Directed Edge index (mode 2) represents a single directed edge between two cells (an "origin" cell and a neighboring "destination" cell). The components of the H3 Directed Edge index are packed into a 64-bit integer in order, highest bit first, as follows: + +* 1 bit reserved and set to 0, +* 4 bits to indicate the H3 Unidirectional Edge index mode, +* 3 bits to indicate the edge (1-6) of the origin cell, +* Subsequent bits matching the index bits of the [origin cell](./cell#h3-cell-index). + +## Bit layout of H3Index for directed edges + +The layout of an `H3Index` is shown below in table form. The interpretation of the "Mode-Dependent" field differs depending on the mode of the index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x30Reserved (0)Mode (2)EdgeResolutionBase cell
0x20Base cellDigit 1Digit 2Digit 3Digit 4Digit 5
0x10Digit 5Digit 6Digit 7Digit 8Digit 9Digit 10
0x00Digit 10Digit 11Digit 12Digit 13Digit 14Digit 15
diff --git a/website/docs/library/index/h3indexing.md b/website/docs/library/index/h3indexing.md new file mode 100644 index 000000000..610bd68c6 --- /dev/null +++ b/website/docs/library/index/h3indexing.md @@ -0,0 +1,95 @@ +--- +id: h3Indexing +title: H3 Index +sidebar_label: H3 Index +slug: /core-library/h3Indexing +--- + +## Introduction + +The H3 system assigns a unique hierarchical index to each cell. Each directed edge and vertex is assigned an index based on its origin or owner cell, respectively. + +## H3Index Representation + +An `H3Index` is the 64-bit integer representation of an H3 index, which may be one of multiple modes to indicate the concept being indexed. + +* Mode 0 is reserved and indicates an [invalid H3 index](#invalid-index). +* Mode 1 is an *[H3 Cell](../library/index/cell)* (Hexagon/Pentagon) index. +* Mode 2 is an *[H3 Directed Edge](../library/index/directededge)* (Cell A -> Cell B) index. +* Mode 3 is planned to be a bidirectional edge (Cell A <-> Cell B). +* Mode 4 is an *[H3 Vertex](../library/index/vertex)* (i.e. a single vertex of an H3 Cell). + +The canonical string representation of an `H3Index` is the hexadecimal representation of the integer, using lowercase letters. The string representation is variable length (no zero padding) and is not prefixed or suffixed. + +### Invalid Index + +Mode 0 contains a special index, `H3_NULL`, which is unique: it is bit-equivalent to `0`. +This index indicates, *specifically*, an invalid, missing, or uninitialized H3 index; +it is analogous to `NaN` in floating point. +It should be used instead of an arbitrary Mode 0 index, due to its uniqueness and easy identifiability. +A mode 0 index could also indicate an [error code](../library/errors) has been provided instead of a valid H3 index. + +## Bit layout of H3Index + +The layout of an `H3Index` is shown below in table form. The interpretation of the "Mode-Dependent" field differs depending on the mode of the index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x30ReservedModeMode-DependentResolutionBase cell
0x20Base cellDigit 1Digit 2Digit 3Digit 4Digit 5
0x10Digit 5Digit 6Digit 7Digit 8Digit 9Digit 10
0x00Digit 10Digit 11Digit 12Digit 13Digit 14Digit 15
+ +## Links + +* Observable notebook example: [H3 Index Bit Layout](https://observablehq.com/@nrabinowitz/h3-index-bit-layout?collection=@nrabinowitz/h3) diff --git a/website/docs/library/index/vertex.md b/website/docs/library/index/vertex.md new file mode 100644 index 000000000..925ff0a24 --- /dev/null +++ b/website/docs/library/index/vertex.md @@ -0,0 +1,78 @@ +--- +id: vertex +title: Vertex mode +sidebar_label: Vertex mode +slug: /library/index/vertex +--- + +
+ +
+ +An H3 Vertex index (mode 4) represents a single topological vertex in H3 grid system, shared by three cells. Note that this does not include the distortion vertexes occasionally present in a cell's geographic boundary. An H3 Vertex is arbitrarily assigned one of the three neighboring cells as its "owner", which is used to calculate the canonical index and geographic coordinates for the vertex. The components of the H3 Vertex index are packed into a 64-bit integer in order, highest bit first, as follows: + +* 1 bit reserved and set to 0, +* 4 bits to indicate the H3 Vertex index mode, +* 3 bits to indicate the vertex number (0-5) of vertex on the owner cell, +* Subsequent bits matching the index bits of the [owner cell](./cell#h3-cell-index). + +## Bit layout of H3Index for vertexes + +The layout of an `H3Index` for vertexes is shown below in table form. The interpretation of the "Mode-Dependent" field differs depending on the mode of the index. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0F0x0E0x0D0x0C0x0B0x0A0x090x080x070x060x050x040x030x020x010x00
0x30Reserved (0)Mode (4)VertexResolutionBase cell
0x20Base cellDigit 1Digit 2Digit 3Digit 4Digit 5
0x10Digit 5Digit 6Digit 7Digit 8Digit 9Digit 10
0x00Digit 10Digit 11Digit 12Digit 13Digit 14Digit 15
diff --git a/website/docs/library/migrating-3.x.md b/website/docs/library/migrating-3.x.md new file mode 100644 index 000000000..1fcb2e641 --- /dev/null +++ b/website/docs/library/migrating-3.x.md @@ -0,0 +1,28 @@ +--- +id: migrating-3.x +title: Migrating from H3 version 3.x +sidebar_label: Migration guide +slug: /library/migrating-3.x +--- + +The H3 library introduced breaking changes in version 4.0.0, so applications developed against earlier versions +need to be updated before they can use the new library version. Most of the changes relate to function naming, +and some relate to the behavior of the functions. + +The grid itself - the layout of cells, which cell an H3 index refers to, and the structure of an H3 index - is +not changed in 4.0.0. H3 indexes generated by 3.x will be understood the same by 4.0.0, and those generated by 4.0.0 +will be understood the same in 3.x. + +The areas where there are changes include: + +# Function naming + +Many [function names have changed](./migration-3.x/functions.md) between 3.x and 4.0.0. These follow the H3 [terminology](./terminology.md) reference, +and that document explains how each function name has been renamed. These changes were made to make the API more +consistent and predictable. + +# Error codes + +The C library is being changed to more consistently [report errors](./errors.md). This is done via the return code of +functions. Users of the C library will need to adjust some function calls to pass output parameters instead of +using the return value of a function. diff --git a/website/docs/library/migration-3.x/functions.md b/website/docs/library/migration-3.x/functions.md new file mode 100644 index 000000000..5db059830 --- /dev/null +++ b/website/docs/library/migration-3.x/functions.md @@ -0,0 +1,171 @@ +--- +id: functions +title: Function name changes +sidebar_label: Function name changes +slug: /library/migration-3.x/functions +--- + +The following function and structure names changed from 3.x to 4.0.0: + +### General Function Names + +| 3.x name. | 4.0.0 name | +|-------------------------------|-----------------------| +| *Does Not Exist (DNE)* | `isValidIndex` | +| `h3IsValid` | `isValidCell` | +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `h3IsPentagon` | `isPentagon` | +| `h3IsResClassIII` | `isResClassIII` | +| `h3IndexesAreNeighbors` | `areNeighborCells` | +| `h3ToParent` | `cellToParent` | +| `h3ToCenterChild` | `cellToCenterChild` | +| `h3ToChildren` | `cellToChildren` | +| `numHexagons` | `getNumCells` | +| `getRes0Indexes` | `getRes0Cells` | +| `getPentagonIndexes` | `getPentagons` | +| `h3GetBaseCell` | `getBaseCellNumber` | +| `h3GetResolution` | `getResolution` | +| *DNE* | `getMode` | +| `h3GetFaces` | `getIcosahedronFaces` | +| `geoToH3` | `latLngToCell` | +| `h3ToGeo` | `cellToLatLng` | +| `compact` | `compactCells` | +| `uncompact` | `uncompactCells` | +| `polyfill` | `polygonToCells` | + +**Note**: `getResolution` and `getBaseCellNumber` should work for both cells and edges. + + +### H3 Grid Functions + +Many of these functions will have three forms: +- `` +- `Unsafe` +- `Safe` + +The `Unsafe` version is fast, but may fail if it encounters a pentagon. +It should return a failure code in this case. + +The `Safe` version is slower, but will work in all cases. + +The version without either suffix is intended to be the one typically +used. +This version will first attempt the `Unsafe` version, and if +it detects failure, will fall back to the `Safe` version. +Encountering pentagons is rare in most use-cases, so this version +should usually be equivalent to the fast version, but with a guarantee +that it will not fail. + +Initially, we **will not** expose the `Safe` versions to users in the API. +We may expose them in the future if a need becomes clear. + + +#### Distance + +| 3.x name. | 4.0.0 name | +|--------------|-------------------------| +| `h3Distance` | `gridDistance` | +| `h3Line` | `gridPathCells` | +| *DNE* | `gridPathEdges` | +| *DNE* | `gridPathDirectedEdges` | + + +#### Filled-In Disk With Distances + +| 3.x name. | 4.0.0 name | Calls | +|---------------------|---------------------------|---------------------------------------| +| `hexRangeDistances` | `gridDiskDistancesUnsafe` | NONE | +| `_kRingInternal` | `gridDiskDistancesSafe` | NONE | +| `kRingDistances` | `gridDiskDistances` | `hexRangeDistances`, `_kRingInternal` | + + +#### Filled-In Disk Without Distances + +| 3.x name. | 4.0.0 name | Calls | +|--------------|-------------------|---------------------| +| `hexRange` | `gridDiskUnsafe` | `hexRangeDistances` | +| *DNE* | `gridDiskSafe` | | +| `kRing` | `gridDisk` | `kRingDistances` | +| `hexRanges` | `gridDisksUnsafe` | N x `hexRange` | + +#### Hollow Ring + +| 3.x name. | 4.0.0 name | Calls | +|--------------|------------------|----------------------------------| +| `hexRing` | `gridRingUnsafe` | NONE | +| *DNE* | `gridRingSafe` | `gridDiskDistancesSafe` | +| *DNE* | `gridRing` | `gridRingUnsafe`, `gridRingSafe` | + +#### Local IJ + +| 3.x name | 4.0.0 name | +|---------------------------|-----------------| +| `experimentalLocalIjToH3` | `localIjToCell` | +| `experimentalH3ToLocalIj` | `cellToLocalIj` | + +### H3 Edge Types + +Instead of `UnidirectionalEdge`, use the term `DirectedEdge`. + +For a future undirected edge mode, use the term `Edge`. + +| 3.x name. | 4.0.0 name | +|-----------------------------------------------|------------------------------| +| `h3UnidirectionalEdgeIsValid` | `isValidDirectedEdge` | +| `getH3UnidirectionalEdge` | `cellsToDirectedEdge` | +| `getH3IndexesFromUnidirectionalEdge` | `directedEdgeToCells` | +| `getH3UnidirectionalEdgesFromHexagon` | `originToDirectedEdges` | +| *DNE* | `destinationToDirectedEdges` | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | +| `getOriginH3IndexFromUnidirectionalEdge` | `getDirectedEdgeOrigin` | +| `getDestinationH3IndexFromUnidirectionalEdge` | `getDirectedEdgeDestination` | + + +### Area/Length Functions + +| 3.x name. | 4.0.0 name | +|-----------------------|-----------------------------| +| `hexAreaKm2` | `getHexagonAreaAvgKm2` | +| `hexAreaM2` | `getHexagonAreaAvgM2` | +| `edgeLengthKm` | `getHexagonEdgeLengthAvgKm` | +| `edgeLengthM` | `getHexagonEdgeLengthAvgM` | +| *DNE* | `getPentagonAreaAvg*` | +| *DNE* | `getPentagonEdgeLengthAvg*` | +| *DNE* | `cellAreaKm2` | +| *DNE* | `cellAreaM2` | +| `pointDistKm` | `greatCircleDistanceKm` | +| `pointDistM` | `greatCircleDistanceM` | +| `pointDistRads` | `greatCircleDistanceRads` | +| `exactEdgeLengthRads` | `edgeLengthRads` | +| `exactEdgeLengthKm` | `edgeLengthKm` | +| `exactEdgeLengthM` | `edgeLengthM` | + +**Note**: `cellAreaKm2` and `cellAreaM2` would return the actual area of +the passed-in cell. + +## Polygons + +### Data Structures + +- rename `GeoBoundary` to `CellBoundary` to indicate it is space-limited to describing the geometry of cells + +| 3.x name | 4.0.0 name | Notes | +|-------------------|-------------------|-----------------------------------| +| `GeoBoundary` | `CellBoundary` | <= 10 stack-allocated `LatLng`s | +| `GeoCoord` | `LatLng` | | +| `Geofence` | `GeoLoop` | heap-allocated `LatLng`s | +| `GeoPolygon` | `GeoPolygon` | | +| `GeoMultiPolygon` | `GeoMultiPolygon` | currently not used | + + +### Functions + +| 3.x name | 4.0.0 name | Notes | +|-----------------------------------|-----------------------------|----------------------------| +| `h3ToGeoBoundary` | `cellToBoundary` | returns `CellBoundary` | +| *DNE* | `cellToLoop` | returns `GeoLoop` | +| *DNE* | `loopToBoundary` | | +| *DNE* | `boundaryToLoop` | | +| `getH3UnidirectionalEdgeBoundary` | `directedEdgeToBoundary` | returns `CellBoundary` | +| `h3SetToLinkedGeo` | `cellsToLinkedMultiPolygon` | returns `LinkedGeoPolygon` | +| `h3SetToMultiPolygon` | `cellsToMultiPolygon` | bindings only | diff --git a/website/docs/library/restable.md b/website/docs/library/restable.md new file mode 100644 index 000000000..95dd2aedf --- /dev/null +++ b/website/docs/library/restable.md @@ -0,0 +1,253 @@ +--- +id: restable +title: Tables of Cell Statistics Across Resolutions +sidebar_label: Tables of cell stats +slug: /core-library/restable +--- + +## Cell counts + +We list the number of hexagons and pentagons at each H3 resolution. +[There are always exactly $12$ pentagons at every resolution](../core-library/overview.md). + + +| Res | Total number of cells | Number of hexagons | Number of pentagons | +|------:|------------------------:|---------------------:|----------------------:| +| 0 | 122 | 110 | 12 | +| 1 | 842 | 830 | 12 | +| 2 | 5,882 | 5,870 | 12 | +| 3 | 41,162 | 41,150 | 12 | +| 4 | 288,122 | 288,110 | 12 | +| 5 | 2,016,842 | 2,016,830 | 12 | +| 6 | 14,117,882 | 14,117,870 | 12 | +| 7 | 98,825,162 | 98,825,150 | 12 | +| 8 | 691,776,122 | 691,776,110 | 12 | +| 9 | 4,842,432,842 | 4,842,432,830 | 12 | +| 10 | 33,897,029,882 | 33,897,029,870 | 12 | +| 11 | 237,279,209,162 | 237,279,209,150 | 12 | +| 12 | 1,660,954,464,122 | 1,660,954,464,110 | 12 | +| 13 | 11,626,681,248,842 | 11,626,681,248,830 | 12 | +| 14 | 81,386,768,741,882 | 81,386,768,741,870 | 12 | +| 15 | 569,707,381,193,162 | 569,707,381,193,150 | 12 | + + +## Cell areas + +:::caution +Cell areas are computed with a **spherical** model of the earth using the +[authalic radius](https://en.wikipedia.org/wiki/Earth_radius#Authalic_radius) +given by +[WGS84](https://en.wikipedia.org/wiki/WGS84)/[EPSG:4326](https://epsg.io/4326). +::: + +### Average area in km2 + +The area of an H3 cell varies based on its position relative to the +[icosahedron vertices](../core-library/overview.md). +We show the **average** hexagon areas for each resolution. +All pentagons within a resolution have the same area. + + +| Res | Average Hexagon Area (km2) | Pentagon Area* (km2) | Ratio (P/H) | +|------:|---------------------------------------------------:|----------------------------------:|--------------:| +| 0 | 4,357,449.416078381 | 2,562,182.162955496 | 0.5880 | +| 1 | 609,788.441794133 | 328,434.586246469 | 0.5386 | +| 2 | 86,801.780398997 | 44,930.898497879 | 0.5176 | +| 3 | 12,393.434655088 | 6,315.472267516 | 0.5096 | +| 4 | 1,770.347654491 | 896.582383141 | 0.5064 | +| 5 | 252.903858182 | 127.785583023 | 0.5053 | +| 6 | 36.129062164 | 18.238749548 | 0.5048 | +| 7 | 5.161293360 | 2.604669397 | 0.5047 | +| 8 | 0.737327598 | 0.372048038 | 0.5046 | +| 9 | 0.105332513 | 0.053147195 | 0.5046 | +| 10 | 0.015047502 | 0.007592318 | 0.5046 | +| 11 | 0.002149643 | 0.001084609 | 0.5046 | +| 12 | 0.000307092 | 0.000154944 | 0.5046 | +| 13 | 0.000043870 | 0.000022135 | 0.5046 | +| 14 | 0.000006267 | 0.000003162 | 0.5046 | +| 15 | 0.000000895 | 0.000000452 | 0.5046 | + +*: Within a given resolution, all pentagons have the same area. + + +### Average area in m2 + +Here are the same areas, but in m2. + +| Res | Average Hexagon Area (m2) | Pentagon Area* (m2) | +|------:|--------------------------------------------------:|---------------------------------:| +| 0 | 4,357,449,416,078.392 | 2,562,182,162,955.496 | +| 1 | 609,788,441,794.134 | 328,434,586,246.469 | +| 2 | 86,801,780,398.997 | 44,930,898,497.879 | +| 3 | 12,393,434,655.088 | 6,315,472,267.516 | +| 4 | 1,770,347,654.491 | 896,582,383.141 | +| 5 | 252,903,858.182 | 127,785,583.023 | +| 6 | 36,129,062.164 | 18,238,749.548 | +| 7 | 5,161,293.360 | 2,604,669.397 | +| 8 | 737,327.598 | 372,048.038 | +| 9 | 105,332.513 | 53,147.195 | +| 10 | 15,047.502 | 7,592.318 | +| 11 | 2,149.643 | 1,084.609 | +| 12 | 307.092 | 154.944 | +| 13 | 43.870 | 22.135 | +| 14 | 6.267 | 3.162 | +| 15 | 0.895 | 0.452 | + +*: Within a given resolution, all pentagons have the same area. + + +### Hexagon min and max areas + +The area of an H3 cell varies based on its position relative to the +[icosahedron vertices](../core-library/overview.md). +We compute the minimum and maximum values for the **hexagon** areas (excluding +the pentagons) at each resolution, and show their ratio. + + +| Res | Min Hexagon Area (km^2) | Max Hexagon Area (km^2) | Ratio (max/min) | +|------:|-------------------------------------:|-------------------------------------:|------------------:| +| 0 | 4,106,166.334463915 | 4,977,807.027442012 | 1.212276 | +| 1 | 447,684.201817940 | 729,486.875275344 | 1.629468 | +| 2 | 56,786.622889474 | 104,599.807218925 | 1.841980 | +| 3 | 7,725.505769639 | 14,950.773301379 | 1.935248 | +| 4 | 1,084.005635363 | 2,135.986983965 | 1.970457 | +| 5 | 153.766244448 | 305.144308779 | 1.984469 | +| 6 | 21.910021013 | 43.592111685 | 1.989597 | +| 7 | 3.126836030 | 6.227445905 | 1.991613 | +| 8 | 0.446526174 | 0.889635157 | 1.992347 | +| 9 | 0.063780227 | 0.127090737 | 1.992635 | +| 10 | 0.009110981 | 0.018155820 | 1.992740 | +| 11 | 0.001301542 | 0.002593689 | 1.992782 | +| 12 | 0.000185933 | 0.000370527 | 1.992797 | +| 13 | 0.000026562 | 0.000052932 | 1.992802 | +| 14 | 0.000003795 | 0.000007562 | 1.992805 | +| 15 | 0.000000542 | 0.000001080 | 1.992805 | + + +## Edge lengths + +:::caution +Edge lengths are computed with a **spherical** model of the earth using the +[authalic radius](https://en.wikipedia.org/wiki/Earth_radius#Authalic_radius) +given by +[WGS84](https://en.wikipedia.org/wiki/WGS84)/[EPSG:4326](https://epsg.io/4326). +Average edge lengths were calculated exactly for resolutions 0 through 6 and +extrapolated for finer resolutions. +::: + +| Res | Average edge length (Km) | +|----:|-------------------------:| +| 0 | 1281.256011 | +| 1 | 483.0568391 | +| 2 | 182.5129565 | +| 3 | 68.97922179 | +| 4 | 26.07175968 | +| 5 | 9.854090990 | +| 6 | 3.724532667 | +| 7 | 1.406475763 | +| 8 | 0.531414010 | +| 9 | 0.200786148 | +| 10 | 0.075863783 | +| 11 | 0.028663897 | +| 12 | 0.010830188 | +| 13 | 0.004092010 | +| 14 | 0.001546100 | +| 15 | 0.000584169 | + +## Appendix: Methodology + +
+
+ Hexagons have 7 hexagon children. Pentagons have 6 children: 5 hexagons and 1 pentagon. +
+ +### Cell counts + +[By definition](../core-library/overview.md), resolution `0` has $110$ +**hexagons** and $12$ **pentagons**, for a total of $122$ **cells**. + +In fact, *every* H3 resolution has exactly $12$ **pentagons**, which are always +centered at the icosahedron vertices; the number of **hexagons** increases +with each resolution. + +:::tip Formula +Accounting for both **hexagons** and **pentagons**, +the total number of **cells** at resolution $r$ is + +$$ +c(r) = 2 + 120 \cdot 7^r. +$$ +::: + +#### Derivation of the cell count formula + +We can derive the formula above with the following steps. + +First, let $h(n)$ be the number of +children $n \geq 0$ resolution levels below any single **hexagaon**. +Any **hexagon** has $7$ immediate children, so recursion gives us +that + +$$ +h(n) = 7^n. +$$ + +Next, let $p(n)$ be the number of children $n \geq 0$ resolution levels below +any single **pentagon**. +Any **pentagon** has $5$ hexagonal immediate children and $1$ pentagonal +immediate child. +Thus, $p(0) = 1$ and $p(1) = 6$. + +For $n \geq 1$, we get the general recurrence relation + +$$ +\begin{aligned} +p(n) &= 5 \cdot h(n-1) + p(n-1) \\ + &= 5 \cdot 7^{n-1} + p(n-1). +\end{aligned} +$$ + +For $n \geq 0$, after working through the recurrence, we get that + +$$ +\begin{aligned} +p(n) &= 1 + 5 \cdot \sum_{k=1}^n\ 7^{k-1} \\ + &= 1 + 5 \cdot \frac{7^n - 1}{6}, +\end{aligned} +$$ + +using the closed form for a +[geometric series](https://en.wikipedia.org/wiki/Geometric_series). + + +Finally, using the closed forms for $h(n)$ and $p(n)$, +and the fact that ([by definition](../core-library/overview.md)) +resolution `0` has +$12$ **pentagons** and $110$ **hexagons**, +we get the closed form for the total number of **cells** +at resolution $r$ as + +$$ +\begin{aligned} +c(r) &= 12 \cdot p(r) + 110 \cdot h(r) \\ + &= 2 + 120 \cdot 7^r. +\end{aligned} +$$ + +#### Jupyter notebook + +A notebook to produce the cell count table above can be +[found here](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/stats_tables/cell_counts.ipynb). + +### Cell areas + +Cell areas are computed with a **spherical** model of the earth using the +[authalic radius](https://en.wikipedia.org/wiki/Earth_radius#Authalic_radius) +given by +[WGS84](https://en.wikipedia.org/wiki/WGS84)/[EPSG:4326](https://epsg.io/4326). + +The [`h3-py-notebooks` repo](https://github.com/uber/h3-py-notebooks) +has notebooks for producing the +[average cell area table](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/stats_tables/avg_area_table.ipynb) +and the +[min/max area table](https://github.com/uber/h3-py-notebooks/blob/master/notebooks/stats_tables/extreme_hex_area.ipynb). diff --git a/website/docs/library/terminology.md b/website/docs/library/terminology.md new file mode 100644 index 000000000..4c1699094 --- /dev/null +++ b/website/docs/library/terminology.md @@ -0,0 +1,67 @@ +--- +id: terminology +title: Terminology +sidebar_label: Terminology +slug: /library/terminology +--- + +The following are technical terms used by H3. + +- `H3Index`: + - an unsigned 64-bit integer representing *any* H3 object (hexagon, pentagon, directed edge ...) + - often represented as a 15-character (or 16-character) hexadecimal string, like `'8928308280fffff'` + - the full term "H3 index" should be used to avoid confusion with other common uses of "index"; + when a "traditional" index is needed, prefer using "number", "pos", or another term to avoid confusion +- **mode**: + - an integer describing the type of object being represented by an H3 index + - this integer is encoded in the `H3Index` +- **cell** or **H3 cell**: + - a geometric/geographic unit polygon in the H3 grid, corresponding to an `H3Index` of `mode 1` (hexagon or pentagon) + - for functions that can handle either hexagons or pentagons, the more general term "cell" should be used whenever possible +- **hexagon**: + - an H3 **cell** that is a **topological** hexagon + - below, we explain that functions that *only* work with **hexagons** have an `Unsafe` suffix; + these functions are paired with ones having a `Safe` suffix, meaning they can handle **pentagons**, but are slower +- **pentagon**: + - an H3 **cell** that is a **topological** pentagon +- **directed edge**: + - represents a traversal from an origin **cell** to an adjacent destination **cell** + - corresponds to an `H3Index` of `mode 2` +- **grid**: + - the graph with nodes corresponding to H3 cells, and edges given by pairs of adjacent cells + - for example, `gridDistance` is the minimal number of edges in a graph path connecting two cells +- **lat/lng point**: + - a representation of a geographic point in terms of a latitude/longitude pair + - when abbreviating, we use "lng" (instead of "lon") for longitude +- **topological**: + - H3 cells are **topological** pentagons or hexagons, in the sense that they have 5 or 6 neighbors, respectively, in the H3 **grid** + - the majority of **hexagons** are also **geometric** hexagons (similarly with **pentagons**), in that they have 6 edges and vertices when represented as polygons of lat/lng points + - a small number of **hexagons** are not **geometric** hexagons (similarly with **pentagons**), in that they have extra vertices and edges due to distortion around icosahedron boundaries + - for more details, see this [h3-js issue](https://github.com/uber/h3-js/issues/53) or this [Observable post](https://observablehq.com/@fil/h3-oddities) +- **base cell**: + - one of the 122 H3 **cells** (110 hexagons and 12 pentagons) of resolution `0` + - every other cell in H3 is a child of a base cell + - each base cell has a "base cell number" (0--121), which is encoded into the `H3Index` representation of every H3 cell + - there is a one-to-one correspondence between the "base cell number" and the `H3Index` representation of resolution `0` cells + + e.g., base cell 0 has `H3Index` hexadecimal representation `'8001fffffffffff'` +- **boundary**: + - all or part of the list of geometric points that enclose an H3 cell + - may include more than 6 points in the case that a cell is not a geometric hexagon, such as when a hexagon crosses an icosahedron boundary + - may also be used to describe the boundary between two geometric cells, as in the case of an edge + - represented in the H3 codebase with the `CellBoundary` struct (previously `GeoBoundary` before v4.0) +- `H3_NULL`: + - equivalent to `0` and guaranteed to never be a valid `H3Index` (even after any future H3 **modes** are added) + - returned by functions to denote an error, or to denote missing data in arrays of `H3Index` + - analogous to `NaN` in floating point + + +### Use of "hex", "hexagon", "cell", "pentagon", etc. + +We realize that "hex" or "hexagon" will still be used informally to refer to the concept of "cell" (As the development team, we do it ourselves!). +This should be expected in casual, informal discussions of H3. +However, when *precision* is required, we advise the use of strict technical terms like "index", "cell", "hexagon", "pentagon", etc. +In the codebase and in the documentation, strictly correct terminology should *always* be used, as many functions and algorithms distinguish between hexagons and pentagons. + +## References + +* [Technical RFC for naming concepts](https://github.com/uber/h3/blob/master/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md) diff --git a/website/docs/quickstart.md b/website/docs/quickstart.md new file mode 100644 index 000000000..8dab3702e --- /dev/null +++ b/website/docs/quickstart.md @@ -0,0 +1,41 @@ +--- +id: quickstart +title: Quick Start +sidebar_label: Quick Start +slug: /quickstart +--- + +This page shows you how to get started with the functions in H3 that convert points to cell identifiers, and from cell identifiers back to geometry. These are the core indexing functions used in many applications of H3. + +You can run the code on this page directly in your browser. The page uses the JavaScript bindings for H3 to run the code, or follow along with the same API in [your preferred programming language](/docs/community/bindings). + +## Point / cell + +First, we'll take the coordinates of the Ferry Building in San Francisco and find the containing H3 cell: + +```js live +function example() { + const lat = 37.7955; + const lng = -122.3937; + const res = 10; + return h3.latLngToCell(lat, lng, res); +} +``` + +The result is the identifier of the hexagonal cell in H3 containing this point. We can retrieve the center of this cell: + +```js live +function example() { + const h = '8a283082a677fff'; + return h3.cellToLatLng(h); +} +``` + +Note that the result of this example is not our original coordinates. That's because the identifier represents the hexagonal cell, not the coordinates. All points indexed in H3 within the bounds of this cell will have the same identifier. We can find the bounds of this cell: + +```js live +function example() { + const h = '8a283082a677fff'; + return h3.cellToBoundary(h); +} +``` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 000000000..49db94ea5 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,172 @@ +const math = require('remark-math'); +const katex = require('rehype-katex'); + +/** @type {import('@docusaurus/types').DocusaurusConfig} */ +module.exports = { + title: 'H3', + tagline: 'Hexagonal hierarchical geospatial indexing system', + url: 'https://h3geo.org', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'favicon.ico', + organizationName: 'uber', // Usually your GitHub org/user name. + projectName: 'h3', // Usually your repo name. + themes: ['@docusaurus/theme-live-codeblock'], + themeConfig: { + prism: { + additionalLanguages: ['java'], + }, + navbar: { + title: 'H3', + logo: { + alt: 'H3 Logo', + src: 'images/h3Logo-color.svg', + }, + items: [ + { + to: 'docs', + activeBaseRegex: 'docs(/)$', + label: 'About', + position: 'left', + }, + { + to: 'docs/api/indexing', + activeBasePath: 'docs/api', + label: 'API', + position: 'left', + }, + { + to: 'docs/community/bindings', + activeBasePath: 'docs/community', + label: 'Bindings', + position: 'left', + }, + { + to: 'docs/core-library/restable', + label: 'Resolutions', + position: 'left', + }, + { + type: 'docsVersionDropdown', + position: 'right', + dropdownActiveClassDisabled: true, + }, + { + href: 'https://github.com/uber/h3', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Getting Started', + to: 'docs/', + }, + { + label: 'Installation', + to: 'docs/installation', + }, + { + label: 'API Reference', + to: 'docs/api/indexing', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Slack', + href: 'https://join.slack.com/t/h3-core/shared_invite/zt-g6u5r1hf-W_~uVJmfeiWtMQuBGc1NNg', + }, + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/h3', + }, + ], + }, + { + title: 'Bindings', + items: [ + { + label: 'Python', + href: 'https://uber.github.io/h3-py/', + }, + { + label: 'JavaScript', + href: 'https://github.com/uber/h3-js', + }, + { + label: 'More bindings', + href: 'docs/community/bindings', + }, + ], + }, + { + title: 'Source', + items: [ + { + label: 'GitHub', + href: 'https://github.com/uber/h3', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Uber Technologies, Inc. Built with Docusaurus.`, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + remarkPlugins: [math], + rehypePlugins: [katex], + sidebarPath: require.resolve('./sidebars.js'), + editUrl: ({docPath}) => { + // Per docusaurus, apply changes to the "next" version, not the current one + return `https://github.com/uber/h3/edit/master/website/docs/${docPath}`; + }, + lastVersion: 'current', + versions: { + current: { + label: '4.x' + }, + }, + }, + theme: { + customCss: [ + require.resolve('./src/css/custom.css'), + require.resolve('./node_modules/mapbox-gl/dist/mapbox-gl.css'), + ], + }, + }, + ], + ], + stylesheets: [ + { + href: "https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.css", + integrity: "sha384-Um5gpz1odJg5Z4HAmzPtgZKdTBHZdw8S29IecapCSB31ligYPhHQZMIlWLYQGVoc", + crossorigin: "anonymous", + }, + ], + customFields: { + mapboxAccessToken: process.env.MapboxAccessToken + }, + plugins: [ + [ + require.resolve('docusaurus-lunr-search'), + { + 'excludeRoutes': ['docs/3.x/**'], + 'disableVersioning': true, + } + ] + ], +}; diff --git a/website/package.json b/website/package.json index 1321ded70..879384fdf 100644 --- a/website/package.json +++ b/website/package.json @@ -1,18 +1,55 @@ { "name": "h3-website", - "description": "Website for H3", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/uber/h3.git" - }, + "version": "0.0.0", + "private": true, "scripts": { - "start": "ocular start open", - "build": "ocular build", - "lint": "ocular lint" + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle --danger", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "format": "prettier --write src" }, - "license": "Apache-2.0", "dependencies": { - "ocular": "^0.5.5" - } + "@babel/helper-get-function-arity": "^7.16.7", + "@docusaurus/core": "^2.2.0", + "@docusaurus/preset-classic": "^2.2.0", + "@docusaurus/theme-live-codeblock": "^2.2.0", + "@mdx-js/react": "^1.6.22", + "deck.gl": "^9.0.12", + "docusaurus-lunr-search": "^3.6.0", + "global": "^4.4.0", + "h3-js": "4.2.1", + "h3-jsv3": "npm:h3-js@^3.7.1", + "mapbox-gl": "^3.4.0", + "prettier": "^3.2.5", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-map-gl": "^7.1.7", + "rehype-katex": "4", + "remark-math": "3", + "styled-components": "^6.1.9", + "use-location-state": "^3.1.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "volta": { + "node": "16.18.1", + "yarn": "1.22.10" + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/website/scripts/build-to-gh-pages.sh b/website/scripts/build-to-gh-pages.sh deleted file mode 100755 index e44ca753e..000000000 --- a/website/scripts/build-to-gh-pages.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# Copyright 2018 Uber Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This file runs the build of the H3 documentation website and commits the -# results to the `gh-pages` branch. -# -# The script expects to be run from the `website` directory. - -set -ex - -TARGET_BRANCH=gh-pages -CURRENT_COMMIT=`git rev-parse HEAD` - -npm install -npm run build -# The dist directory is not removed because it is gitignore'd. -git checkout "$TARGET_BRANCH" -cd .. -# Copy over the .gitignore file -git checkout $CURRENT_COMMIT -- .gitignore -git rm bundle-*.js styles-*.css -cp -R website/dist/* . -git add . -git commit diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 000000000..a0d3a6615 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,90 @@ +module.exports = { + someSidebar: { + "Getting Started": [ + "README", + { + type: "category", + label: "Highlights", + items: [ + "highlights/aggregation", + "highlights/joining", + "highlights/flowmodel", + "highlights/ml", + "highlights/indexing", + ], + }, + { + type: "category", + label: "Comparisons", + items: [ + "comparisons/s2", + "comparisons/geohash", + "comparisons/hexbin", + "comparisons/admin", + "comparisons/placekey", + ], + }, + "installation", + "quickstart", + // TODO: Add FAQ here + ], + "Concepts and Guides": [ + { + type: "category", + label: "Migrating from 3.x", + items: [ + "library/migrating-3.x", + "library/migration-3.x/functions", + ], + }, + { + type: "category", + label: "Index structure", + items: [ + "library/index/h3Indexing", + "library/index/cell", + "library/index/directededge", + "library/index/vertex", + ], + }, + "library/terminology", + "library/errors", + "library/restable", + ], + "API Reference": [ + "api/indexing", + "api/inspection", + "api/traversal", + "api/hierarchy", + "api/regions", + "api/uniedge", + "api/vertex", + "api/misc", + ], + Community: [ + "community/bindings", + "community/libraries", + "community/tutorials", + "community/applications", + ], + "H3 Internals": [ + "core-library/overview", + "core-library/coordsystems", + "core-library/creating-bindings", + "core-library/filters", + "core-library/compilation-options", + "core-library/testing", + "core-library/custom-alloc", + "core-library/usage", + { + type: "category", + label: "Algorithms", + items: [ + "core-library/latLngToCellDesc", + "core-library/cellToLatLngDesc", + "core-library/cellToBoundaryDesc", + ], + }, + ], + }, +}; diff --git a/website/src/components/common.jsx b/website/src/components/common.jsx new file mode 100644 index 000000000..abd2e0f35 --- /dev/null +++ b/website/src/components/common.jsx @@ -0,0 +1,4 @@ +export const MOBILE_CUTOFF_WINDOW_WIDTH = 480; + +export const isMobile = (props) => + `@media screen and (max-width: ${MOBILE_CUTOFF_WINDOW_WIDTH}px)`; diff --git a/website/src/components/explorer/details.jsx b/website/src/components/explorer/details.jsx new file mode 100644 index 000000000..5c6cf511e --- /dev/null +++ b/website/src/components/explorer/details.jsx @@ -0,0 +1,208 @@ +// Contains code adapted from https://observablehq.com/@nrabinowitz/h3-index-inspector under the ISC license + +import React, { useCallback } from "react"; +import { + cellToBoundary, + cellToParent, + getResolution, + cellToChildren, + gridDisk, + getBaseCellNumber, + isPentagon, + getIcosahedronFaces, + cellToLatLng, + h3IndexToSplitLong, + cellArea, + edgeLength, + originToDirectedEdges, + UNITS, +} from "h3-js"; + +const THREE_BITS = 7; // 1 | 2 | 4 + +function h3IndexToDigits(h) { + const split = h3IndexToSplitLong(h); + const digit1 = (split[1] >> 0xa) & THREE_BITS; + const digit2 = (split[1] >> 0x7) & THREE_BITS; + const digit3 = (split[1] >> 0x4) & THREE_BITS; + const digit4 = (split[1] >> 0x1) & THREE_BITS; + const digit5 = ((split[1] & 0x1) << 2) | ((split[0] >> 0x1e) & 0x3); + const digit6 = (split[0] >> 0x1b) & THREE_BITS; + const digit7 = (split[0] >> 0x18) & THREE_BITS; + const digit8 = (split[0] >> 0x15) & THREE_BITS; + const digit9 = (split[0] >> 0x12) & THREE_BITS; + const digit10 = (split[0] >> 0xf) & THREE_BITS; + const digit11 = (split[0] >> 0xc) & THREE_BITS; + const digit12 = (split[0] >> 0x9) & THREE_BITS; + const digit13 = (split[0] >> 0x6) & THREE_BITS; + const digit14 = (split[0] >> 0x3) & THREE_BITS; + const digit15 = split[0] & THREE_BITS; + return [ + digit1, + digit2, + digit3, + digit4, + digit5, + digit6, + digit7, + digit8, + digit9, + digit10, + digit11, + digit12, + digit13, + digit14, + digit15, + ]; +} + +function cellUnits(hex) { + return getResolution(hex) < 8 + ? { area: UNITS.km2, dist: UNITS.km } + : { area: UNITS.m2, dist: UNITS.m }; +} + +function ClickableH3Index({ hex, setUserInput }) { + const onClick = useCallback(() => { + setUserInput(hex); + }, [hex, setUserInput]); + + return ( + + {hex} + + ); +} + +function ClickableH3IndexList({ hexes, setUserInput, showAll = true }) { + const onShowAllClick = useCallback(() => { + setUserInput(hexes.join(", ")); + }, [hexes, setUserInput]); + return ( + <> + {hexes.map((hex, index) => { + const link = ( + + ); + if (index === 0) { + return link; + } else { + return , {link}; + } + })} + {showAll ? ( + <> +   + + (show all) + + + ) : ( + <> + )} + + ); +} + +export function SelectedHexDetails({ + setUserInput, + splitUserInput, + showNavigation = true, + showDetails = true, +}) { + if (splitUserInput.length === 1) { + const hex = splitUserInput[0]; + const units = cellUnits(hex); + const res = getResolution(hex); + const floatPrecision = res / 3 + 7; + + const baseCell = getBaseCellNumber(hex); + const pent = isPentagon(hex); + const faces = getIcosahedronFaces(hex).join(", "); + const coords = cellToLatLng(hex) + .map((n) => n.toPrecision(floatPrecision)) + .join(", "); + const digits = + res === 0 ? "(none)" : h3IndexToDigits(hex).slice(0, res).join(""); + const boundary = cellToBoundary(hex); + const area = cellArea(hex, units.area).toPrecision(floatPrecision); + const edgeLengths = originToDirectedEdges(hex).map((e) => + edgeLength(e, units.dist), + ); + const meanEdgeLength = ( + edgeLengths.reduce((prev, curr) => + prev !== undefined ? prev + curr : curr, + ) / edgeLengths.length + ).toPrecision(floatPrecision); + const parent = res !== 0 && cellToParent(hex, res - 1); + const children = res !== 15 && cellToChildren(hex, res + 1); + const neighbors = gridDisk(hex, 1).filter((n) => n !== hex); + + return ( +

+ Lat./Lng.: {coords} + {showNavigation ? ( + <> +
+ Parent:{" "} + {parent ? ( + + ) : ( + (none) + )} +
+ Children:{" "} + {children ? ( + + ) : ( + (none) + )} +
+ Neighbors:{" "} + +
+ + ) : ( + <> + )} + {showDetails ? ( +

+ Details + Resolution: {res} +
+ Base cell: {baseCell} +
+ Pentagon: {`${pent}`} +
+ Icosa Face IDs: {faces} +
# of Boundary Verts: {boundary.length} +
+ Cell Area: {area} {units.area} +
+ Mean Edge Length: {meanEdgeLength} {units.dist} +
+ Indexing Digits: {digits} +
+ ) : ( + <> + )} +

+ ); + } else { + return ( +

+ +

+ ); + } +} diff --git a/website/src/components/explorer/index.jsx b/website/src/components/explorer/index.jsx new file mode 100644 index 000000000..a7fa5975c --- /dev/null +++ b/website/src/components/explorer/index.jsx @@ -0,0 +1,180 @@ +// Contains code adapted from https://observablehq.com/@nrabinowitz/h3-index-inspector under the ISC license + +import React, { useCallback, useMemo } from "react"; +import { isValidCell, latLngToCell, getResolution } from "h3-js"; +import { + Banner, + BannerContainer, + HeroExampleContainer, + DemoContainer, +} from "../styled"; +import { useQueryState } from "use-location-state"; +import { SelectedHexDetails } from "./details"; +import { ExplorerMap } from "./map"; +import { WhereAmIButton } from "./where-am-i"; + +function fullyTrim(str) { + if (!str) { + return ""; + } + + return str.trim(); +} + +function fullyUnwrap(str) { + if (!str) { + return ""; + } + + str = str.trim(); + // Remove any JSON wrapper characters + str = str.replaceAll("[", " "); + str = str.replaceAll("]", " "); + str = str.replaceAll('"', " "); + str = str.replaceAll("'", " "); + str = str.replaceAll(",", " "); + + // Remove any Python set wrapper + str = str.replaceAll("{", " "); + str = str.replaceAll("}", " "); + + return str; +} + +function doSplitUserInput(userInput) { + if (userInput) { + // TODO: support WKT, GeoJSON inputs here too + const unwrapAnyArray = fullyUnwrap(userInput); + const split = unwrapAnyArray.split(/\s/).filter((str) => str !== ""); + const result = []; + + for (let i = 0; i < split.length; i++) { + const currentInput = fullyTrim(split[i]); + const nextInput = fullyTrim(split[i + 1]); + + if (isValidCell(currentInput)) { + result.push(currentInput); + } else if ( + i < split.length - 1 && + Number.isFinite(Number.parseFloat(currentInput)) && + Number.isFinite(Number.parseFloat(nextInput)) + ) { + const lat = Number.parseFloat(currentInput); + const lng = Number.parseFloat(nextInput); + + // Note this order is important for picking to work correctly + for (let res = 0; res < 16; res++) { + result.push(latLngToCell(lat, lng, res)); + } + + // consumed, skip next coordinate + i++; + } + } + + return result; + } + + return []; +} + +function zoomToResolution(zoom) { + return Math.max(Math.min(zoom / 1.5, 15), 0); +} + +export default function HomeExporer({ children }) { + const [userInput, setUserInput] = useQueryState("hex", ""); + + const splitUserInput = useMemo(() => { + return doSplitUserInput(userInput); + }, [userInput]); + const userValidHex = useMemo( + () => splitUserInput.map(isValidCell).includes(true), + [splitUserInput], + ); + const constantResolution = useMemo(() => { + const resAsSet = new Set(splitUserInput.map(getResolution)); + if (resAsSet.size === 1) { + return [...resAsSet][0]; + } else { + return undefined; + } + }, [splitUserInput]); + + const objectOnClick = useCallback( + ({ hex }) => { + const asSet = new Set(splitUserInput); + if (!asSet.delete(hex)) { + asSet.add(hex); + } + setUserInput([...asSet].join(", ")); + }, + [splitUserInput, setUserInput], + ); + const coordinateOnClick = useCallback( + ({ coordinate, zoom, resolution }) => { + if (constantResolution !== undefined) { + const asSet = new Set(splitUserInput); + asSet.add( + latLngToCell(coordinate[1], coordinate[0], constantResolution), + ); + setUserInput([...asSet].join(", ")); + } else if (splitUserInput.length === 0) { + const detectedRes = + resolution !== undefined ? resolution : zoomToResolution(zoom); + setUserInput( + `${latLngToCell(coordinate[1], coordinate[0], detectedRes)}`, + ); + } + }, + [splitUserInput, setUserInput, constantResolution], + ); + + // Note: The Layout "wrapper" component adds header and footer etc + return ( + <> + + + + + + + +