diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 1ea50ce..0000000 --- a/.drone.yml +++ /dev/null @@ -1,25 +0,0 @@ -kind: pipeline -type: kubernetes -name: build-apk - -clone: - depth: 1 - -steps: - - name: build - image: cirrusci/flutter:stable - pull: true - commands: - - flutter packages get - - flutter build apk --release --split-per-abi - - mkdir apks - - mv build/app/outputs/apk/*/*/*.apk apks - - - name: Publish APK - image: plugins/gitea-release - settings: - api_key: - from_secret: GITEA_TOKEN -trigger: - event: - - push \ No newline at end of file diff --git a/.gitea/workflows/backed_build-image.yaml b/.gitea/workflows/backed_build-image.yaml new file mode 100644 index 0000000..5542a1f --- /dev/null +++ b/.gitea/workflows/backed_build-image.yaml @@ -0,0 +1,31 @@ +on: + pull_request: + branches: + - main + +name: Build and push docker image + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + + - uses: https://gitea.com/actions/checkout@v4 + + - name: Login to Docker Registry + uses: docker/login-action@v3 + with: + registry: git.kluster.moll.re + username: ${{ gitea.repository_owner }} + password: ${{ secrets.DOCKER_PUSH_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: backend + tags: git.kluster.moll.re/remoll/fast_network_navigation/backend:latest + push: true diff --git a/.gitea/workflows/build-android.yaml b/.gitea/workflows/frontend_build-android.yaml similarity index 56% rename from .gitea/workflows/build-android.yaml rename to .gitea/workflows/frontend_build-android.yaml index 76305b1..a1e2d7e 100644 --- a/.gitea/workflows/build-android.yaml +++ b/.gitea/workflows/frontend_build-android.yaml @@ -1,42 +1,61 @@ -on: push -name: Test, Build and Release apk +on: + pull_request: + branches: + - main + paths: + - frontend/** + + +name: Build and release APK + jobs: build: name: Build APK - runs-on: k8s + runs-on: ubuntu-latest steps: - name: Install prerequisites run: | - sudo apt-get update - sudo apt-get install -y xz-utils unzip + apt-get update + apt-get install -y jq + - uses: https://gitea.com/actions/checkout@v4 + - uses: https://github.com/actions/setup-java@v4 with: java-version: '17' distribution: 'zulu' + - name: Fix flutter SDK folder permission + run: git config --global --add safe.directory "*" + - uses: https://github.com/subosito/flutter-action@v2 with: channel: stable - flutter-version: 3.19.6 + flutter-version: 3.22.0 cache: true + - name: Setup Android SDK uses: https://github.com/android-actions/setup-android@v3 - run: flutter pub get - # - run: flutter test - - run: flutter build apk --debug --split-per-abi - + working-directory: ./frontend + + - run: flutter build apk --release --split-per-abi + working-directory: ./frontend + - name: Release APK uses: https://gitea.com/akkuman/gitea-release-action@v1 with: - files: build/app/outputs/flutter-apk/*.apk + files: ./frontend/build/app/outputs/flutter-apk/*.apk + name: Testing release + release_name: testing tag: testing - release_name: Testing release + tag_name: testing release_body: "This is a testing release." prerelease: true token: ${{ secrets.GITEA_TOKEN }} env: NODE_OPTIONS: '--experimental-fetch' + diff --git a/.gitea/workflows/build-web.yaml b/.gitea/workflows/frontend_build-web.yaml similarity index 61% rename from .gitea/workflows/build-web.yaml rename to .gitea/workflows/frontend_build-web.yaml index cc08a5e..f5980fe 100644 --- a/.gitea/workflows/build-web.yaml +++ b/.gitea/workflows/frontend_build-web.yaml @@ -1,21 +1,34 @@ -on: push -name: Test, Build and Release web +on: + pull_request: + branches: + - main + paths: + - frontend/** + + +name: Build web + jobs: build: name: Build Web - runs-on: k8s + runs-on: ubuntu-latest steps: + - name: Install prerequisites run: | sudo apt-get update sudo apt-get install -y xz-utils - uses: actions/checkout@v4 + - uses: https://github.com/subosito/flutter-action@v2 with: channel: stable flutter-version: 3.19.6 cache: true - - run: flutter pub get - # - run: flutter test + - run: flutter pub get + working-directory: ./frontend + + - run: flutter build web + working-directory: ./frontend diff --git a/.gitignore b/.gitignore index 29a3a50..e934adf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,43 +1 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release +cache/ diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..2e722c1 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,164 @@ +# osm-cache +cache/ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..79dbe76 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3 + +WORKDIR /app +COPY Pipfile Pipfile.lock . + +RUN pip install pipenv +RUN pipenv install --deploy --system + +COPY . /src + +CMD ["pipenv", "run", "python", "/app/src/main.py"] diff --git a/backend/Pipfile b/backend/Pipfile new file mode 100644 index 0000000..62e84e8 --- /dev/null +++ b/backend/Pipfile @@ -0,0 +1,14 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +numpy = "*" +scipy = "*" +fastapi = "*" +osmpythontools = "*" +pydantic = "*" +shapely = "*" + +[dev-packages] diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock new file mode 100644 index 0000000..2e5aac3 --- /dev/null +++ b/backend/Pipfile.lock @@ -0,0 +1,1543 @@ +{ + "_meta": { + "hash": { + "sha256": "0f88c01cde3be9a6332acec33fa0ccf13b6e122a6df8ee5cfefa52ba1e98034f" + }, + "pipfile-spec": 6, + "requires": {}, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, + "anyio": { + "hashes": [ + "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94", + "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7" + ], + "markers": "python_version >= '3.8'", + "version": "==4.4.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", + "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.12.3" + }, + "certifi": { + "hashes": [ + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.6.2" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "contourpy": { + "hashes": [ + "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", + "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", + "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", + "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", + "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", + "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", + "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", + "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", + "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", + "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", + "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", + "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", + "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", + "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", + "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", + "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", + "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", + "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", + "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", + "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", + "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", + "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", + "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", + "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", + "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", + "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", + "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", + "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", + "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", + "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", + "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", + "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", + "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", + "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", + "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", + "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", + "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", + "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", + "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", + "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", + "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", + "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", + "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", + "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" + ], + "markers": "python_version >= '3.9'", + "version": "==1.2.1" + }, + "cycler": { + "hashes": [ + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "dnspython": { + "hashes": [ + "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50", + "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.6.1" + }, + "email-validator": { + "hashes": [ + "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", + "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.0" + }, + "exceptiongroup": { + "hashes": [ + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.1" + }, + "fastapi": { + "hashes": [ + "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0", + "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.111.0" + }, + "fastapi-cli": { + "hashes": [ + "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809", + "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32" + ], + "markers": "python_version >= '3.8'", + "version": "==0.0.4" + }, + "fonttools": { + "hashes": [ + "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d", + "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64", + "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2", + "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4", + "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6", + "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b", + "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f", + "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380", + "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e", + "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749", + "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20", + "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0", + "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4", + "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5", + "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206", + "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9", + "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac", + "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1", + "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce", + "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4", + "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12", + "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca", + "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d", + "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068", + "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796", + "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec", + "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea", + "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f", + "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005", + "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2", + "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06", + "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109", + "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002", + "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9", + "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a", + "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68", + "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6", + "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161", + "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd", + "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d", + "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee", + "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af" + ], + "markers": "python_version >= '3.8'", + "version": "==4.53.0" + }, + "geojson": { + "hashes": [ + "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac", + "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.0" + }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, + "httpcore": { + "hashes": [ + "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61", + "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.5" + }, + "httptools": { + "hashes": [ + "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563", + "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142", + "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d", + "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b", + "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4", + "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb", + "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658", + "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084", + "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2", + "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97", + "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837", + "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3", + "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58", + "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da", + "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d", + "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90", + "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0", + "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1", + "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2", + "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e", + "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0", + "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf", + "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc", + "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3", + "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503", + "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a", + "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3", + "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949", + "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84", + "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb", + "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a", + "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f", + "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e", + "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81", + "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185", + "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3" + ], + "version": "==0.6.1" + }, + "httpx": { + "hashes": [ + "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", + "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5" + ], + "markers": "python_version >= '3.8'", + "version": "==0.27.0" + }, + "idna": { + "hashes": [ + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + ], + "markers": "python_version >= '3.5'", + "version": "==3.7" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "kiwisolver": { + "hashes": [ + "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", + "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", + "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", + "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", + "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", + "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", + "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", + "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", + "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", + "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", + "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", + "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", + "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", + "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", + "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", + "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", + "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", + "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", + "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", + "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", + "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", + "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", + "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", + "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", + "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", + "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", + "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", + "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", + "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", + "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", + "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", + "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", + "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", + "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", + "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", + "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", + "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", + "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", + "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", + "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", + "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", + "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", + "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", + "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", + "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", + "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", + "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", + "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", + "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", + "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", + "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", + "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", + "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", + "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", + "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", + "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", + "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", + "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", + "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", + "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", + "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", + "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", + "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", + "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", + "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", + "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", + "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", + "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", + "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", + "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", + "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", + "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", + "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", + "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", + "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", + "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", + "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", + "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", + "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", + "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", + "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", + "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", + "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", + "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", + "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", + "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", + "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", + "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", + "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", + "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", + "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", + "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", + "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", + "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", + "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", + "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", + "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", + "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", + "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", + "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", + "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", + "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", + "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", + "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" + ], + "markers": "python_version >= '3.7'", + "version": "==1.4.5" + }, + "lxml": { + "hashes": [ + "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3", + "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a", + "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0", + "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b", + "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f", + "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6", + "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73", + "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d", + "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad", + "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b", + "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a", + "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5", + "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab", + "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316", + "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6", + "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df", + "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca", + "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264", + "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8", + "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f", + "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b", + "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3", + "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5", + "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed", + "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab", + "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5", + "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726", + "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d", + "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632", + "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706", + "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8", + "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472", + "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835", + "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf", + "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db", + "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d", + "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545", + "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9", + "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be", + "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe", + "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905", + "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438", + "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db", + "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776", + "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c", + "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed", + "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd", + "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484", + "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d", + "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6", + "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30", + "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182", + "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61", + "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425", + "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb", + "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1", + "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511", + "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e", + "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207", + "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b", + "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585", + "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56", + "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391", + "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85", + "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147", + "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18", + "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1", + "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa", + "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48", + "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3", + "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184", + "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67", + "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7", + "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34", + "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706", + "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8", + "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c", + "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115", + "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009", + "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466", + "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526", + "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d", + "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525", + "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14", + "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3", + "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0", + "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b", + "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1", + "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f", + "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf", + "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf", + "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0", + "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b", + "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff", + "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88", + "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2", + "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40", + "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716", + "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2", + "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2", + "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a", + "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734", + "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87", + "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48", + "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36", + "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b", + "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07", + "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c", + "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573", + "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001", + "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9", + "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3", + "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce", + "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3", + "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04", + "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927", + "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083", + "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d", + "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32", + "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9", + "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f", + "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2", + "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c", + "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d", + "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393", + "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8", + "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6", + "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66", + "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5", + "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97", + "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196", + "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836", + "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae", + "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297", + "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421", + "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6", + "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981", + "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30", + "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30", + "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f", + "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324", + "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b" + ], + "markers": "python_version >= '3.6'", + "version": "==5.2.2" + }, + "markdown-it-py": { + "hashes": [ + "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.0" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "matplotlib": { + "hashes": [ + "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38", + "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321", + "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db", + "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888", + "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463", + "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03", + "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56", + "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4", + "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b", + "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b", + "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85", + "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956", + "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb", + "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd", + "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7", + "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89", + "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152", + "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be", + "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e", + "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0", + "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84", + "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674", + "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382", + "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a", + "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5", + "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf", + "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a", + "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d", + "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241" + ], + "markers": "python_version >= '3.9'", + "version": "==3.9.0" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, + "numpy": { + "hashes": [ + "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", + "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", + "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", + "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", + "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", + "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", + "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", + "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", + "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", + "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", + "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", + "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", + "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", + "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", + "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", + "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", + "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", + "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", + "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", + "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", + "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", + "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", + "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", + "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", + "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", + "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", + "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", + "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", + "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", + "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", + "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", + "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", + "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", + "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", + "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", + "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", + "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", + "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", + "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", + "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", + "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", + "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", + "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", + "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", + "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.0.0" + }, + "orjson": { + "hashes": [ + "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01", + "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa", + "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5", + "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04", + "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d", + "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e", + "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b", + "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b", + "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268", + "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211", + "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c", + "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c", + "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969", + "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a", + "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f", + "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932", + "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26", + "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6", + "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214", + "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2", + "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f", + "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96", + "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a", + "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d", + "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38", + "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807", + "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09", + "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6", + "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e", + "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5", + "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86", + "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63", + "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2", + "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4", + "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595", + "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228", + "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9", + "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7", + "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40", + "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3", + "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139", + "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1", + "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b", + "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47", + "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1", + "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca" + ], + "markers": "python_version >= '3.8'", + "version": "==3.10.5" + }, + "osmpythontools": { + "hashes": [ + "sha256:13ff721f760fdad5dd78b4d1461d286b78bba96ee151a7301ee8c11a0c258be9" + ], + "index": "pypi", + "version": "==0.3.5" + }, + "packaging": { + "hashes": [ + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1" + }, + "pandas": { + "hashes": [ + "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", + "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", + "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", + "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", + "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", + "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", + "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", + "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", + "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", + "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", + "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", + "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", + "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", + "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", + "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", + "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", + "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", + "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", + "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", + "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", + "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", + "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", + "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", + "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", + "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", + "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", + "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", + "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", + "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" + ], + "markers": "python_version >= '3.9'", + "version": "==2.2.2" + }, + "pillow": { + "hashes": [ + "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", + "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", + "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", + "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", + "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", + "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", + "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", + "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", + "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", + "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", + "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", + "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", + "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", + "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", + "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", + "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", + "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", + "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", + "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", + "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", + "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", + "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", + "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", + "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", + "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", + "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", + "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", + "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", + "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", + "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", + "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", + "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", + "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", + "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", + "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", + "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", + "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", + "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", + "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", + "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", + "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", + "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", + "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", + "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", + "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", + "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", + "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", + "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", + "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", + "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", + "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", + "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", + "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", + "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", + "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", + "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", + "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", + "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", + "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", + "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", + "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", + "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", + "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", + "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", + "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", + "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", + "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", + "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", + "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" + ], + "markers": "python_version >= '3.8'", + "version": "==10.3.0" + }, + "pydantic": { + "hashes": [ + "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52", + "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.7.4" + }, + "pydantic-core": { + "hashes": [ + "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3", + "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8", + "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8", + "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30", + "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a", + "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8", + "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d", + "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc", + "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2", + "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab", + "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077", + "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e", + "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9", + "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9", + "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef", + "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1", + "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507", + "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528", + "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558", + "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b", + "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154", + "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724", + "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695", + "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9", + "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851", + "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805", + "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a", + "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5", + "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94", + "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c", + "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d", + "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef", + "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26", + "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2", + "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c", + "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0", + "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2", + "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4", + "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d", + "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2", + "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce", + "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34", + "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f", + "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d", + "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b", + "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07", + "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312", + "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057", + "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d", + "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af", + "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb", + "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd", + "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78", + "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b", + "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223", + "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a", + "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4", + "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5", + "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23", + "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a", + "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4", + "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8", + "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d", + "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443", + "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e", + "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f", + "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e", + "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d", + "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc", + "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443", + "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be", + "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2", + "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee", + "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f", + "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae", + "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864", + "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4", + "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951", + "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.18.4" + }, + "pygments": { + "hashes": [ + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.18.0" + }, + "pyparsing": { + "hashes": [ + "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + ], + "markers": "python_full_version >= '3.6.8'", + "version": "==3.1.2" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "python-dotenv": { + "hashes": [ + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" + ], + "version": "==1.0.1" + }, + "python-multipart": { + "hashes": [ + "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026", + "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215" + ], + "markers": "python_version >= '3.8'", + "version": "==0.0.9" + }, + "pytz": { + "hashes": [ + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + ], + "version": "==2024.1" + }, + "pyyaml": { + "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "version": "==6.0.1" + }, + "rich": { + "hashes": [ + "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", + "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==13.7.1" + }, + "scipy": { + "hashes": [ + "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", + "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", + "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", + "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", + "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", + "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", + "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", + "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", + "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", + "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", + "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", + "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", + "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", + "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", + "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", + "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", + "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", + "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", + "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", + "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", + "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", + "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", + "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", + "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", + "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==1.13.1" + }, + "shapely": { + "hashes": [ + "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f", + "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0", + "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf", + "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6", + "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa", + "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113", + "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9", + "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398", + "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0", + "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65", + "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d", + "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf", + "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242", + "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9", + "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f", + "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7", + "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07", + "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53", + "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328", + "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd", + "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8", + "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879", + "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e", + "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679", + "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47", + "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7", + "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6", + "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc", + "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7", + "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17", + "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b", + "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c", + "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa", + "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30", + "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d", + "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac", + "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58", + "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc", + "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35", + "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c", + "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.0.4" + }, + "shellingham": { + "hashes": [ + "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", + "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" + ], + "markers": "python_version >= '3.7'", + "version": "==1.5.4" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sniffio": { + "hashes": [ + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "soupsieve": { + "hashes": [ + "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", + "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" + ], + "markers": "python_version >= '3.8'", + "version": "==2.5" + }, + "starlette": { + "hashes": [ + "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee", + "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823" + ], + "markers": "python_version >= '3.8'", + "version": "==0.37.2" + }, + "typer": { + "hashes": [ + "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914", + "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482" + ], + "markers": "python_version >= '3.7'", + "version": "==0.12.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version >= '3.8'", + "version": "==4.12.2" + }, + "tzdata": { + "hashes": [ + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" + ], + "markers": "python_version >= '2'", + "version": "==2024.1" + }, + "ujson": { + "hashes": [ + "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e", + "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", + "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6", + "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7", + "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9", + "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd", + "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569", + "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", + "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51", + "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", + "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1", + "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf", + "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", + "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", + "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a", + "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", + "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27", + "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", + "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", + "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", + "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", + "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64", + "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", + "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", + "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", + "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3", + "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb", + "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", + "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", + "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", + "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", + "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", + "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d", + "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd", + "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0", + "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337", + "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753", + "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804", + "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", + "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f", + "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5", + "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", + "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1", + "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", + "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", + "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050", + "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", + "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", + "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8", + "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996", + "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6", + "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", + "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", + "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1", + "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4", + "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b", + "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88", + "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518", + "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5", + "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770", + "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4", + "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a", + "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76", + "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe", + "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", + "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1", + "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5", + "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b", + "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7", + "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8", + "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc", + "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a", + "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", + "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", + "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b", + "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", + "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", + "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746" + ], + "markers": "python_version >= '3.8'", + "version": "==5.10.0" + }, + "uvicorn": { + "extras": [ + "standard" + ], + "hashes": [ + "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81", + "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8" + ], + "markers": "python_version >= '3.8'", + "version": "==0.30.1" + }, + "uvloop": { + "hashes": [ + "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd", + "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec", + "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b", + "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc", + "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797", + "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5", + "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2", + "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d", + "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be", + "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd", + "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12", + "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17", + "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef", + "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24", + "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428", + "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1", + "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849", + "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593", + "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd", + "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67", + "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6", + "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3", + "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd", + "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8", + "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7", + "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533", + "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957", + "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650", + "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e", + "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7", + "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256" + ], + "version": "==0.19.0" + }, + "watchfiles": { + "hashes": [ + "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b", + "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31", + "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1", + "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab", + "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249", + "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd", + "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1", + "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6", + "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71", + "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13", + "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171", + "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1", + "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1", + "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c", + "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971", + "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb", + "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f", + "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6", + "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27", + "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88", + "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843", + "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a", + "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed", + "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84", + "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0", + "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d", + "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2", + "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797", + "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e", + "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35", + "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6", + "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e", + "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2", + "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550", + "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e", + "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c", + "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2", + "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc", + "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6", + "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96", + "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93", + "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562", + "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795", + "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385", + "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f", + "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848", + "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087", + "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec", + "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb", + "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232", + "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696", + "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2", + "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e", + "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67", + "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e", + "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68", + "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb", + "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be", + "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71", + "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c", + "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da", + "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39", + "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea", + "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a", + "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb", + "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099", + "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a", + "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538", + "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72", + "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1", + "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8", + "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d", + "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d", + "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c", + "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86" + ], + "version": "==0.22.0" + }, + "websockets": { + "hashes": [ + "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b", + "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6", + "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", + "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", + "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205", + "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892", + "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53", + "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", + "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", + "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c", + "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd", + "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", + "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931", + "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30", + "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370", + "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be", + "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec", + "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf", + "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62", + "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b", + "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", + "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", + "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123", + "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9", + "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603", + "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", + "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558", + "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", + "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438", + "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137", + "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480", + "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", + "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8", + "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", + "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c", + "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", + "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967", + "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", + "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d", + "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def", + "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", + "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", + "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2", + "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", + "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b", + "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28", + "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7", + "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d", + "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", + "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468", + "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8", + "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae", + "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611", + "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", + "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9", + "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", + "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f", + "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2", + "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077", + "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2", + "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6", + "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374", + "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", + "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", + "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", + "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399", + "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547", + "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", + "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870", + "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", + "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8", + "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7" + ], + "version": "==12.0" + }, + "xarray": { + "hashes": [ + "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", + "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" + ], + "markers": "python_version >= '3.9'", + "version": "==2024.6.0" + } + }, + "develop": {} +} diff --git a/backend/src/amenities/nature.am b/backend/src/amenities/nature.am new file mode 100644 index 0000000..dcc4061 --- /dev/null +++ b/backend/src/amenities/nature.am @@ -0,0 +1,11 @@ +'leisure'='park' +geological +'natural'='geyser' +'natural'='hot_spring' +'natural'='arch' +'natural'='volcano' +'natural'='stone' +'tourism'='alpine_hut' +'tourism'='viewpoint' +'tourism'='zoo' +'waterway'='waterfall' \ No newline at end of file diff --git a/backend/src/amenities/shopping.am b/backend/src/amenities/shopping.am new file mode 100644 index 0000000..14504a0 --- /dev/null +++ b/backend/src/amenities/shopping.am @@ -0,0 +1,2 @@ +'shop'='department_store' +'shop'='mall' \ No newline at end of file diff --git a/backend/src/amenities/sightseeing.am b/backend/src/amenities/sightseeing.am new file mode 100644 index 0000000..33bcb1a --- /dev/null +++ b/backend/src/amenities/sightseeing.am @@ -0,0 +1,8 @@ +'tourism'='museum' +'tourism'='attraction' +'tourism'='gallery' +historic +'amenity'='planetarium' +'amenity'='place_of_worship' +'amenity'='fountain' +'water'='reflecting_pool' \ No newline at end of file diff --git a/backend/src/landmarks_manager.py b/backend/src/landmarks_manager.py new file mode 100644 index 0000000..618e169 --- /dev/null +++ b/backend/src/landmarks_manager.py @@ -0,0 +1,365 @@ +import math as m +import json, os + +from typing import List, Tuple, Optional +from OSMPythonTools.overpass import Overpass, overpassQueryBuilder + +from structs.landmarks import Landmark, LandmarkType +from structs.preferences import Preferences, Preference + + +SIGHTSEEING = LandmarkType(landmark_type='sightseeing') +NATURE = LandmarkType(landmark_type='nature') +SHOPPING = LandmarkType(landmark_type='shopping') + + +# Include the json here +# Create a list of all things to visit given some preferences and a city. Ready for the optimizer +def generate_landmarks(preferences: Preferences, coordinates: Tuple[float, float]) : + + l_sights, l_nature, l_shop = get_amenities() + L = [] + + # List for sightseeing + if preferences.sightseeing.score != 0 : + L1 = get_landmarks(l_sights, SIGHTSEEING, coordinates=coordinates) + correct_score(L1, preferences.sightseeing) + L += L1 + + # List for nature + if preferences.nature.score != 0 : + L2 = get_landmarks(l_nature, NATURE, coordinates=coordinates) + correct_score(L2, preferences.nature) + L += L2 + + # List for shopping + if preferences.shopping.score != 0 : + L3 = get_landmarks(l_shop, SHOPPING, coordinates=coordinates) + correct_score(L3, preferences.shopping) + L += L3 + + L = remove_duplicates(L) + + return L, take_most_important(L) + + +"""def generate_landmarks(preferences: Preferences, city_country: str = None, coordinates: Tuple[float, float] = None) -> Tuple[List[Landmark], List[Landmark]] : + + l_sights, l_nature, l_shop = get_amenities() + L = [] + + # List for sightseeing + if preferences.sightseeing.score != 0 : + L1 = get_landmarks(l_sights, SIGHTSEEING, city_country=city_country, coordinates=coordinates) + correct_score(L1, preferences.sightseeing) + L += L1 + + # List for nature + if preferences.nature.score != 0 : + L2 = get_landmarks(l_nature, NATURE, city_country=city_country, coordinates=coordinates) + correct_score(L2, preferences.nature) + L += L2 + + # List for shopping + if preferences.shopping.score != 0 : + L3 = get_landmarks(l_shop, SHOPPING, city_country=city_country, coordinates=coordinates) + correct_score(L3, preferences.shopping) + L += L3 + + return remove_duplicates(L), take_most_important(L) +""" +# Helper function to gather the amenities list +def get_amenities() -> List[List[str]] : + + # Get the list of amenities from the files + sightseeing = get_list('/amenities/sightseeing.am') + nature = get_list('/amenities/nature.am') + shopping = get_list('/amenities/shopping.am') + + return sightseeing, nature, shopping + + +# Helper function to read a .am file and generate the corresponding list +def get_list(path: str) -> List[str] : + + with open(os.path.dirname(os.path.abspath(__file__)) + path) as f : + content = f.readlines() + + amenities = [] + for line in content : + amenities.append(line.strip('\n')) + + return amenities + + +# Take the most important landmarks from the list +def take_most_important(L: List[Landmark], N = 0) -> List[Landmark] : + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f : + parameters = json.loads(f.read()) + N_important = parameters['N important'] + + L_copy = [] + L_clean = [] + scores = [0]*len(L) + names = [] + name_id = {} + + for i, elem in enumerate(L) : + if elem.name not in names : + names.append(elem.name) + name_id[elem.name] = [i] + L_copy.append(elem) + else : + name_id[elem.name] += [i] + scores = [] + for j in name_id[elem.name] : + scores.append(L[j].attractiveness) + best_id = max(range(len(scores)), key=scores.__getitem__) + t = name_id[elem.name][best_id] + if t == i : + for old in L_copy : + if old.name == elem.name : + old.attractiveness = L[t].attractiveness + + scores = [0]*len(L_copy) + for i, elem in enumerate(L_copy) : + scores[i] = elem.attractiveness + + res = sorted(range(len(scores)), key = lambda sub: scores[sub])[-(N_important-N):] + + for i, elem in enumerate(L_copy) : + if i in res : + L_clean.append(elem) + + return L_clean + + +# Remove duplicate elements and elements with low score +def remove_duplicates(L: List[Landmark]) -> List[Landmark] : + """ + Removes duplicate landmarks based on their names from the given list. + + Parameters: + L (List[Landmark]): A list of Landmark objects. + + Returns: + List[Landmark]: A list of unique Landmark objects based on their names. + """ + + L_clean = [] + names = [] + + for landmark in L : + if landmark.name in names: + continue + + + else : + names.append(landmark.name) + L_clean.append(landmark) + + return L_clean + + +# Correct the score of a list of landmarks by taking into account preference settings +def correct_score(L: List[Landmark], preference: Preference) : + + if len(L) == 0 : + return + + if L[0].type != preference.type : + raise TypeError(f"LandmarkType {preference.type} does not match the type of Landmark {L[0].name}") + + for elem in L : + elem.attractiveness = int(elem.attractiveness*preference.score/500) # arbitrary computation + + +# Function to count elements within a certain radius of a location +def count_elements_within_radius(coordinates: Tuple[float, float], radius: int) -> int: + + lat = coordinates[0] + lon = coordinates[1] + + alpha = (180*radius)/(6371000*m.pi) + bbox = {'latLower':lat-alpha,'lonLower':lon-alpha,'latHigher':lat+alpha,'lonHigher': lon+alpha} + + # Build the query to find elements within the radius + radius_query = overpassQueryBuilder(bbox=[bbox['latLower'],bbox['lonLower'],bbox['latHigher'],bbox['lonHigher']], + elementType=['node', 'way', 'relation']) + + try : + overpass = Overpass() + radius_result = overpass.query(radius_query) + return radius_result.countElements() + + except : + return None + + +# Creates a bounding box around given coordinates +def create_bbox(coordinates: Tuple[float, float], side_length: int) -> Tuple[float, float, float, float]: + + lat = coordinates[0] + lon = coordinates[1] + + # Half the side length in km (since it's a square bbox) + half_side_length_km = side_length / 2.0 + + # Convert distance to degrees + lat_diff = half_side_length_km / 111 # 1 degree latitude is approximately 111 km + lon_diff = half_side_length_km / (111 * m.cos(m.radians(lat))) # Adjust for longitude based on latitude + + # Calculate bbox + min_lat = lat - lat_diff + max_lat = lat + lat_diff + min_lon = lon - lon_diff + max_lon = lon + lon_diff + + return min_lat, min_lon, max_lat, max_lon + + +def get_landmarks(list_amenity: list, landmarktype: LandmarkType, coordinates: Tuple[float, float]) -> List[Landmark] : + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f : + parameters = json.loads(f.read()) + tag_coeff = parameters['tag coeff'] + park_coeff = parameters['park coeff'] + church_coeff = parameters['church coeff'] + radius = parameters['radius close to'] + bbox_side = parameters['city bbox side'] + + # Create bbox around start location + bbox = create_bbox(coordinates, bbox_side) + + # Initialize some variables + N = 0 + L = [] + overpass = Overpass() + + for amenity in list_amenity : + query = overpassQueryBuilder(bbox=bbox, elementType=['way', 'relation'], selector=amenity, includeCenter=True, out='body') + result = overpass.query(query) + N += result.countElements() + + for elem in result.elements(): + + name = elem.tag('name') # Add name + location = (elem.centerLat(), elem.centerLon()) # Add coordinates (lat, lon) + + # skip if unprecise location + if name is None or location[0] is None: + continue + + # skip if unused + if 'disused:leisure' in elem.tags().keys(): + continue + + # skip if part of another building + if 'building:part' in elem.tags().keys() and elem.tag('building:part') == 'yes': + continue + + else : + osm_type = elem.type() # Add type : 'way' or 'relation' + osm_id = elem.id() # Add OSM id + elem_type = landmarktype # Add the landmark type as 'sightseeing + n_tags = len(elem.tags().keys()) # Add number of tags + + # Add score of given landmark based on the number of surrounding elements. Penalty for churches as there are A LOT + if amenity == "'amenity'='place_of_worship'" : + score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*church_coeff) + elif amenity == "'leisure'='park'" : + score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*park_coeff) + else : + score = count_elements_within_radius(location, radius) + n_tags*tag_coeff + + if score is not None : + # Generate the landmark and append it to the list + landmark = Landmark(name=name, type=elem_type, location=location, osm_type=osm_type, osm_id=osm_id, attractiveness=score, must_do=False, n_tags=n_tags) + L.append(landmark) + + return L + + + +"""def get_landmarks(list_amenity: list, landmarktype: LandmarkType, city_country: str = None, coordinates: Tuple[float, float] = None) -> List[Landmark] : + + if city_country is None and coordinates is None : + raise ValueError("Either one of 'city_country' and 'coordinates' arguments must be specified") + + if city_country is not None and coordinates is not None : + raise ValueError("Cannot specify both 'city_country' and 'coordinates' at the same time, please choose either one") + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f : + parameters = json.loads(f.read()) + tag_coeff = parameters['tag coeff'] + park_coeff = parameters['park coeff'] + church_coeff = parameters['church coeff'] + radius = parameters['radius close to'] + bbox_side = parameters['city bbox side'] + + # If city_country is specified : + if city_country is not None : + nominatim = Nominatim() + areaId = nominatim.query(city_country).areaId() + bbox = None + + # If coordinates are specified : + elif coordinates is not None : + bbox = create_bbox(coordinates, bbox_side) + areaId = None + + else : + raise ValueError("Argument number is not corresponding.") + + # Initialize some variables + N = 0 + L = [] + overpass = Overpass() + + for amenity in list_amenity : + query = overpassQueryBuilder(area=areaId, bbox=bbox, elementType=['way', 'relation'], selector=amenity, includeCenter=True, out='body') + result = overpass.query(query) + N += result.countElements() + + for elem in result.elements(): + + name = elem.tag('name') # Add name + location = (elem.centerLat(), elem.centerLon()) # Add coordinates (lat, lon) + + # skip if unprecise location + if name is None or location[0] is None: + continue + + # skip if unused + if 'disused:leisure' in elem.tags().keys(): + continue + + # skip if part of another building + if 'building:part' in elem.tags().keys() and elem.tag('building:part') == 'yes': + continue + + else : + osm_type = elem.type() # Add type : 'way' or 'relation' + osm_id = elem.id() # Add OSM id + elem_type = landmarktype # Add the landmark type as 'sightseeing + n_tags = len(elem.tags().keys()) # Add number of tags + + # Add score of given landmark based on the number of surrounding elements. Penalty for churches as there are A LOT + if amenity == "'amenity'='place_of_worship'" : + score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*church_coeff) + elif amenity == "'leisure'='park'" : + score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*park_coeff) + else : + score = count_elements_within_radius(location, radius) + n_tags*tag_coeff + + if score is not None : + # Generate the landmark and append it to the list + landmark = Landmark(name=name, type=elem_type, location=location, osm_type=osm_type, osm_id=osm_id, attractiveness=score, must_do=False, n_tags=n_tags) + L.append(landmark) + + return L +""" \ No newline at end of file diff --git a/backend/src/main.py b/backend/src/main.py new file mode 100644 index 0000000..692c7f9 --- /dev/null +++ b/backend/src/main.py @@ -0,0 +1,70 @@ +from optimizer import solve_optimization +from refiner import refine_optimization +from landmarks_manager import generate_landmarks +from structs.landmarks import Landmark +from structs.landmarktype import LandmarkType +from structs.preferences import Preferences, Preference +from fastapi import FastAPI, Query, Body +from typing import List + +app = FastAPI() + + +# Assuming frontend is calling like this : +#"http://127.0.0.1:8000/process?param1={param1}¶m2={param2}" +@app.post("/optimizer_coords/{start_lat}/{start_lon}/{finish_lat}/{finish_lon}") +def main1(start_lat: float, start_lon: float, preferences: Preferences = Body(...), finish_lat: float = None, finish_lon: float = None) -> List[Landmark]: + + if preferences is None : + raise ValueError("Please provide preferences in the form of a 'Preference' BaseModel class.") + if bool(start_lat) ^ bool(start_lon) : + raise ValueError("Please provide both latitude and longitude for the starting point") + if bool(finish_lat) ^ bool(finish_lon) : + raise ValueError("Please provide both latitude and longitude for the finish point") + + start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(start_lat, start_lon), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + + if bool(finish_lat) and bool(finish_lon) : + finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(finish_lat, finish_lon), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + else : + finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(start_lat, start_lon), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + + + start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.8375946, 2.2949904), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.8375946, 2.2949904), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + + # Generate the landmarks from the start location + landmarks, landmarks_short = generate_landmarks(preferences=preferences, coordinates=start.location) + + # insert start and finish to the landmarks list + landmarks_short.insert(0, start) + landmarks_short.append(finish) + + + # TODO use these parameters in another way + max_walking_time = 4 # hours + detour = 30 # minutes + + # First stage optimization + base_tour = solve_optimization(landmarks_short, max_walking_time*60, True) + + # Second stage optimization + refined_tour = refine_optimization(landmarks, base_tour, max_walking_time*60+detour, True) + + return refined_tour + + + +# input city, country in the form of 'Paris, France' +@app.post("/test2/{city_country}") +def test2(city_country: str, preferences: Preferences = Body(...)) -> List[Landmark]: + + landmarks = generate_landmarks(city_country, preferences) + + max_steps = 9000000 + + visiting_order = solve_optimization(landmarks, max_steps, True) + + + + diff --git a/backend/src/main_example.py b/backend/src/main_example.py new file mode 100644 index 0000000..1a49305 --- /dev/null +++ b/backend/src/main_example.py @@ -0,0 +1,23 @@ +import fastapi +from dataclasses import dataclass + + +@dataclass +class Destination: + name: str + location: tuple + attractiveness: int + + + +d = Destination() + + + +def get_route() -> list[Destination]: + return {"route": "Hello World"} + +endpoint = ("/get_route", get_route) +end +if __name__ == "__main__": + fastapi.run() diff --git a/backend/src/optimizer.py b/backend/src/optimizer.py new file mode 100644 index 0000000..d45d51b --- /dev/null +++ b/backend/src/optimizer.py @@ -0,0 +1,411 @@ +import numpy as np +import json, os + +from typing import List, Tuple +from scipy.optimize import linprog +from math import radians, sin, cos, acos +from shapely import Polygon + +from structs.landmarks import Landmark + + +# Function to print the result +def print_res(L: List[Landmark], L_tot): + + if len(L) == L_tot: + print('\nAll landmarks can be visited within max_steps, the following order is suggested : ') + else : + print('Could not visit all the landmarks, the following order is suggested : ') + + dist = 0 + for elem in L : + if elem.name != 'start' : + print('- ' + elem.name + ', time to reach = ' + str(elem.time_to_reach)) + dist += elem.time_to_reach + else : + print('- ' + elem.name) + + print("\nMinutes walked : " + str(dist)) + print(f"Visited {len(L)-2} out of {L_tot-2} landmarks") + + +# Prevent the use of a particular solution +def prevent_config(resx, A_ub, b_ub) -> bool: + + for i, elem in enumerate(resx): + resx[i] = round(elem) + + N = len(resx) # Number of edges + L = int(np.sqrt(N)) # Number of landmarks + + nonzeroind = np.nonzero(resx)[0] # the return is a little funky so I use the [0] + nonzero_tup = np.unravel_index(nonzeroind, (L,L)) + + ind_a = nonzero_tup[0].tolist() + vertices_visited = ind_a + vertices_visited.remove(0) + + ones = [1]*L + h = [0]*N + for i in range(L) : + if i in vertices_visited : + h[i*L:i*L+L] = ones + + A_ub = np.vstack((A_ub, h)) + b_ub.append(len(vertices_visited)-1) + + return A_ub, b_ub + + +# Prevent the possibility of a given solution bit +def break_cricle(circle_vertices: list, L: int, A_ub: list, b_ub: list) -> bool: + + if L-1 in circle_vertices : + circle_vertices.remove(L-1) + + h = [0]*L*L + for i in range(L) : + if i in circle_vertices : + h[i*L:i*L+L] = [1]*L + + A_ub = np.vstack((A_ub, h)) + b_ub.append(len(circle_vertices)-1) + + return A_ub, b_ub + + +# Checks if the path is connected, returns a circle if it finds one and the RESULT +def is_connected(resx) -> bool: + + # first round the results to have only 0-1 values + for i, elem in enumerate(resx): + resx[i] = round(elem) + + N = len(resx) # length of res + L = int(np.sqrt(N)) # number of landmarks. CAST INTO INT but should not be a problem because N = L**2 by def. + n_edges = resx.sum() # number of edges + + nonzeroind = np.nonzero(resx)[0] # the return is a little funny so I use the [0] + + nonzero_tup = np.unravel_index(nonzeroind, (L,L)) + + ind_a = nonzero_tup[0].tolist() + ind_b = nonzero_tup[1].tolist() + + edges = [] + edges_visited = [] + vertices_visited = [] + + edge1 = (ind_a[0], ind_b[0]) + edges_visited.append(edge1) + vertices_visited.append(edge1[0]) + + for i, a in enumerate(ind_a) : + edges.append((a, ind_b[i])) # Create the list of edges + + remaining = edges + remaining.remove(edge1) + + break_flag = False + while len(remaining) > 0 and not break_flag: + for edge2 in remaining : + if edge2[0] == edge1[1] : + if edge1[1] in vertices_visited : + edges_visited.append(edge2) + break_flag = True + break + else : + vertices_visited.append(edge1[1]) + edges_visited.append(edge2) + remaining.remove(edge2) + edge1 = edge2 + + elif edge1[1] == L-1 or edge1[1] in vertices_visited: + break_flag = True + break + + vertices_visited.append(edge1[1]) + + + if len(vertices_visited) == n_edges +1 : + return vertices_visited, [] + else: + return vertices_visited, edges_visited + + +# Function that returns the distance in meters from one location to another +def get_distance(p1: Tuple[float, float], p2: Tuple[float, float], detour: float, speed: float) : + + # Compute the straight-line distance in km + if p1 == p2 : + return 0, 0 + else: + dist = 6371.01 * acos(sin(radians(p1[0]))*sin(radians(p2[0])) + cos(radians(p1[0]))*cos(radians(p2[0]))*cos(radians(p1[1]) - radians(p2[1]))) + + # Consider the detour factor for average cityto deterline walking distance (in km) + walk_dist = dist*detour + + # Time to walk this distance (in minutes) + walk_time = walk_dist/speed*60 + + if walk_time > 15 : + walk_time = 5*round(walk_time/5) + else : + walk_time = round(walk_time) + + + return round(walk_dist, 1), walk_time + + +# Initialize A and c. Compute the distances from all landmarks to each other and store attractiveness +# We want to maximize the sightseeing : max(c) st. A*x < b and A_eq*x = b_eq +def init_ub_dist(landmarks: List[Landmark], max_steps: int): + + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + detour = parameters['detour factor'] + speed = parameters['average walking speed'] + + # Objective function coefficients. a*x1 + b*x2 + c*x3 + ... + c = [] + # Coefficients of inequality constraints (left-hand side) + A_ub = [] + + for spot1 in landmarks : + dist_table = [0]*len(landmarks) + c.append(-spot1.attractiveness) + for j, spot2 in enumerate(landmarks) : + t = get_distance(spot1.location, spot2.location, detour, speed)[1] + dist_table[j] = t + A_ub += dist_table + c = c*len(landmarks) + + return c, A_ub, [max_steps] + + +# Constraint to respect only one travel per landmark. Also caps the total number of visited landmarks +def respect_number(L:int, A_ub, b_ub): + + ones = [1]*L + zeros = [0]*L + for i in range(L) : + h = zeros*i + ones + zeros*(L-1-i) + A_ub = np.vstack((A_ub, h)) + b_ub.append(1) + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + max_landmarks = parameters['max landmarks'] + + A_ub = np.vstack((A_ub, ones*L)) + b_ub.append(max_landmarks+1) + + return A_ub, b_ub + + +# Constraint to not have d14 and d41 simultaneously. Does not prevent circular symmetry with more elements +def break_sym(L, A_ub, b_ub): + upper_ind = np.triu_indices(L,0,L) + + up_ind_x = upper_ind[0] + up_ind_y = upper_ind[1] + + for i, _ in enumerate(up_ind_x) : + l = [0]*L*L + if up_ind_x[i] != up_ind_y[i] : + l[up_ind_x[i]*L + up_ind_y[i]] = 1 + l[up_ind_y[i]*L + up_ind_x[i]] = 1 + + A_ub = np.vstack((A_ub,l)) + b_ub.append(1) + + return A_ub, b_ub + + +# Constraint to not stay in position. Removes d11, d22, d33, etc. +def init_eq_not_stay(L: int): + l = [0]*L*L + + for i in range(L) : + for j in range(L) : + if j == i : + l[j + i*L] = 1 + + l = np.array(np.array(l)) + + return [l], [0] + + +# Go through the landmarks and force the optimizer to use landmarks where attractiveness is set to -1 +def respect_user_mustsee(landmarks: List[Landmark], A_eq: list, b_eq: list) : + L = len(landmarks) + + for i, elem in enumerate(landmarks) : + if elem.must_do is True and elem.name not in ['finish', 'start']: + l = [0]*L*L + for j in range(L) : # sets the horizontal ones (go from) + l[j +i*L] = 1 # sets the vertical ones (go to) double check if good + + for k in range(L-1) : + l[k*L+L-1] = 1 + + A_eq = np.vstack((A_eq,l)) + b_eq.append(2) + + return A_eq, b_eq + + +# Constraint to ensure start at start and finish at goal +def respect_start_finish(L: int, A_eq: list, b_eq: list): + ls = [1]*L + [0]*L*(L-1) # sets only horizontal ones for start (go from) + ljump = [0]*L*L + ljump[L-1] = 1 # Prevent start finish jump + lg = [0]*L*L + ll = [0]*L*(L-1) + [1]*L + for k in range(L-1) : # sets only vertical ones for goal (go to) + ll[k*L] = 1 + if k != 0 : # Prevent the shortcut start -> finish + lg[k*L+L-1] = 1 + + + A_eq = np.vstack((A_eq,ls)) + A_eq = np.vstack((A_eq,ljump)) + A_eq = np.vstack((A_eq,lg)) + A_eq = np.vstack((A_eq,ll)) + b_eq.append(1) + b_eq.append(0) + b_eq.append(1) + b_eq.append(0) + + return A_eq, b_eq + + +# Constraint to tie the problem together. Necessary but not sufficient to avoid circles +def respect_order(N: int, A_eq, b_eq): + for i in range(N-1) : # Prevent stacked ones + if i == 0 or i == N-1: # Don't touch start or finish + continue + else : + l = [0]*N + l[i] = -1 + l = l*N + for j in range(N) : + l[i*N + j] = 1 + + A_eq = np.vstack((A_eq,l)) + b_eq.append(0) + + return A_eq, b_eq + + +# Computes the time to reach from each landmark to the next +def add_time_to_reach(order: List[int], landmarks: List[Landmark])->List[Landmark] : + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + detour_factor = parameters['detour factor'] + speed = parameters['average walking speed'] + + j = 0 + L = [] + prev = landmarks[0] + + while(len(L) != len(order)) : + + elem = landmarks[order[j]] + if elem != prev : + elem.time_to_reach = get_distance(elem.location, prev.location, detour_factor, speed)[1] + elem.must_do = True + L.append(elem) + prev = elem + j += 1 + + return L + + +def add_time_to_reach_simple(ordered_visit: List[Landmark])-> List[Landmark] : + + # Read the parameters from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + detour_factor = parameters['detour factor'] + speed = parameters['average walking speed'] + + L = [] + prev = ordered_visit[0] + L.append(prev) + total_dist = 0 + + for elem in ordered_visit[1:] : + elem.time_to_reach = get_distance(elem.location, prev.location, detour_factor, speed)[1] + elem.must_do = True + L.append(elem) + prev = elem + total_dist += get_distance(elem.location, prev.location, detour_factor, speed)[1] + + + return L, total_dist + + +# Main optimization pipeline +def solve_optimization (landmarks :List[Landmark], max_steps: int, printing_details: bool) : + + L = len(landmarks) + + # SET CONSTRAINTS FOR INEQUALITY + c, A_ub, b_ub = init_ub_dist(landmarks, max_steps) # Add the distances from each landmark to the other + A_ub, b_ub = respect_number(L, A_ub, b_ub) # Respect max number of visits (no more possible stops than landmarks). + A_ub, b_ub = break_sym(L, A_ub, b_ub) # break the 'zig-zag' symmetry + + # SET CONSTRAINTS FOR EQUALITY + A_eq, b_eq = init_eq_not_stay(L) # Force solution not to stay in same place + A_eq, b_eq = respect_user_mustsee(landmarks, A_eq, b_eq) # Check if there are user_defined must_see. Also takes care of start/goal + A_eq, b_eq = respect_start_finish(L, A_eq, b_eq) # Force start and finish positions + A_eq, b_eq = respect_order(L, A_eq, b_eq) # Respect order of visit (only works when max_steps is limiting factor) + + # SET BOUNDS FOR DECISION VARIABLE (x can only be 0 or 1) + x_bounds = [(0, 1)]*L*L + + # Solve linear programming problem + res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq = b_eq, bounds=x_bounds, method='highs', integrality=3) + + # Raise error if no solution is found + if not res.success : + raise ArithmeticError("No solution could be found, the problem is overconstrained. Please adapt your must_dos") + + # If there is a solution, we're good to go, just check for connectiveness + else : + order, circle = is_connected(res.x) + i = 0 + timeout = 80 + while len(circle) != 0 and i < timeout: + A_ub, b_ub = prevent_config(res.x, A_ub, b_ub) + A_ub, b_ub = break_cricle(order, len(landmarks), A_ub, b_ub) + res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq = b_eq, bounds=x_bounds, method='highs', integrality=3) + order, circle = is_connected(res.x) + if len(circle) == 0 : + break + print(i) + i += 1 + + if i == timeout : + raise TimeoutError(f"Optimization took too long. No solution found after {timeout} iterations.") + + # Add the times to reach and stop optimizing + L = add_time_to_reach(order, landmarks) + + if printing_details is True : + if i != 0 : + print(f"Neded to recompute paths {i} times because of unconnected loops...") + print_res(L, len(landmarks)) + print("\nTotal score : " + str(int(-res.fun))) + + return L + + + + + + diff --git a/backend/src/parameters/landmarks_manager.params b/backend/src/parameters/landmarks_manager.params new file mode 100644 index 0000000..942c214 --- /dev/null +++ b/backend/src/parameters/landmarks_manager.params @@ -0,0 +1,8 @@ +{ + "city bbox side" : 10, + "radius close to" : 27.5, + "church coeff" : 0.6, + "park coeff" : 1.5, + "tag coeff" : 100, + "N important" : 40 +} \ No newline at end of file diff --git a/backend/src/parameters/optimizer.params b/backend/src/parameters/optimizer.params new file mode 100644 index 0000000..18ca240 --- /dev/null +++ b/backend/src/parameters/optimizer.params @@ -0,0 +1,5 @@ +{ + "detour factor" : 1.4, + "average walking speed" : 4.8, + "max landmarks" : 10 +} \ No newline at end of file diff --git a/backend/src/refiner.py b/backend/src/refiner.py new file mode 100644 index 0000000..dec6101 --- /dev/null +++ b/backend/src/refiner.py @@ -0,0 +1,293 @@ +from collections import defaultdict +from heapq import heappop, heappush +from itertools import permutations +import os, json + +from shapely import buffer, LineString, Point, Polygon, MultiPoint, convex_hull, concave_hull, LinearRing +from typing import List, Tuple +from math import pi + +from structs.landmarks import Landmark +from landmarks_manager import take_most_important +from optimizer import solve_optimization, add_time_to_reach_simple, print_res, get_distance + + +def create_corridor(landmarks: List[Landmark], width: float) : + + corrected_width = (180*width)/(6371000*pi) + + path = create_linestring(landmarks) + obj = buffer(path, corrected_width, join_style="mitre", cap_style="square", mitre_limit=2) + + return obj + + +def create_linestring(landmarks: List[Landmark])->List[Point] : + + points = [] + + for landmark in landmarks : + points.append(Point(landmark.location)) + + return LineString(points) + + +def is_in_area(area: Polygon, coordinates) -> bool : + point = Point(coordinates) + return point.within(area) + + +def is_close_to(location1: Tuple[float], location2: Tuple[float]): + """Determine if two locations are close by rounding their coordinates to 3 decimals.""" + absx = abs(location1[0] - location2[0]) + absy = abs(location1[1] - location2[1]) + + return absx < 0.001 and absy < 0.001 + #return (round(location1[0], 3), round(location1[1], 3)) == (round(location2[0], 3), round(location2[1], 3)) + + +def rearrange(landmarks: List[Landmark]) -> List[Landmark]: + + i = 1 + while i < len(landmarks): + j = i+1 + while j < len(landmarks): + if is_close_to(landmarks[i].location, landmarks[j].location) and landmarks[i].name not in ['start', 'finish'] and landmarks[j].name not in ['start', 'finish']: + # If they are not adjacent, move the j-th element to be adjacent to the i-th element + if j != i + 1: + landmarks.insert(i + 1, landmarks.pop(j)) + break # Move to the next i-th element after rearrangement + j += 1 + i += 1 + + return landmarks + +""" +def find_shortest_path(landmarks: List[Landmark]) -> List[Landmark]: + + # Read from data + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + detour = parameters['detour factor'] + speed = parameters['average walking speed'] + + # Step 1: Build the graph + graph = defaultdict(list) + for i in range(len(landmarks)): + for j in range(len(landmarks)): + if i != j: + distance = get_distance(landmarks[i].location, landmarks[j].location, detour, speed)[1] + graph[i].append((distance, j)) + + # Step 2: Dijkstra's algorithm to find the shortest path from start to finish + start_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'start') + finish_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'finish') + + distances = {i: float('inf') for i in range(len(landmarks))} + previous_nodes = {i: None for i in range(len(landmarks))} + distances[start_idx] = 0 + priority_queue = [(0, start_idx)] + + while priority_queue: + current_distance, current_index = heappop(priority_queue) + + if current_distance > distances[current_index]: + continue + + for neighbor_distance, neighbor_index in graph[current_index]: + distance = current_distance + neighbor_distance + + if distance < distances[neighbor_index]: + distances[neighbor_index] = distance + previous_nodes[neighbor_index] = current_index + heappush(priority_queue, (distance, neighbor_index)) + + # Step 3: Backtrack from finish to start to find the path + path = [] + current_index = finish_idx + while current_index is not None: + path.append(landmarks[current_index]) + current_index = previous_nodes[current_index] + path.reverse() + + return path +""" +""" +def total_path_distance(path: List[Landmark], detour, speed) -> float: + total_distance = 0 + for i in range(len(path) - 1): + total_distance += get_distance(path[i].location, path[i + 1].location, detour, speed)[1] + return total_distance +""" + + +def find_shortest_path_through_all_landmarks(landmarks: List[Landmark]) -> List[Landmark]: + + # Read from data + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + detour = parameters['detour factor'] + speed = parameters['average walking speed'] + + # Step 1: Find 'start' and 'finish' landmarks + start_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'start') + finish_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'finish') + + start_landmark = landmarks[start_idx] + finish_landmark = landmarks[finish_idx] + + + # Step 2: Create a list of unvisited landmarks excluding 'start' and 'finish' + unvisited_landmarks = [lm for i, lm in enumerate(landmarks) if i not in [start_idx, finish_idx]] + + # Step 3: Initialize the path with the 'start' landmark + path = [start_landmark] + coordinates = [landmarks[start_idx].location] + + current_landmark = start_landmark + + # Step 4: Use nearest neighbor heuristic to visit all landmarks + while unvisited_landmarks: + nearest_landmark = min(unvisited_landmarks, key=lambda lm: get_distance(current_landmark.location, lm.location, detour, speed)[1]) + path.append(nearest_landmark) + coordinates.append(nearest_landmark.location) + current_landmark = nearest_landmark + unvisited_landmarks.remove(nearest_landmark) + + # Step 5: Finally add the 'finish' landmark to the path + path.append(finish_landmark) + coordinates.append(landmarks[finish_idx].location) + + path_poly = Polygon(coordinates) + + return path, path_poly + +def get_minor_landmarks(all_landmarks: List[Landmark], visited_landmarks: List[Landmark], width: float) -> List[Landmark] : + + second_order_landmarks = [] + visited_names = [] + area = create_corridor(visited_landmarks, width) + + for visited in visited_landmarks : + visited_names.append(visited.name) + + for landmark in all_landmarks : + if is_in_area(area, landmark.location) and landmark.name not in visited_names: + second_order_landmarks.append(landmark) + + return take_most_important(second_order_landmarks, len(visited_landmarks)) + + + +"""def refine_optimization(landmarks: List[Landmark], base_tour: List[Landmark], max_time: int, print_infos: bool) -> List[Landmark] : + + minor_landmarks = get_minor_landmarks(landmarks, base_tour, 200) + + if print_infos : print("There are " + str(len(minor_landmarks)) + " minor landmarks around the predicted path") + + full_set = base_tour[:-1] + minor_landmarks # create full set of possible landmarks (without finish) + full_set.append(base_tour[-1]) # add finish back + + new_tour = solve_optimization(full_set, max_time, print_infos) + + return new_tour""" + + +def refine_optimization(landmarks: List[Landmark], base_tour: List[Landmark], max_time: int, print_infos: bool) -> List[Landmark] : + + # Read from the file + with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f : + parameters = json.loads(f.read()) + max_landmarks = parameters['max landmarks'] + + if len(base_tour)-2 >= max_landmarks : + return base_tour + + + minor_landmarks = get_minor_landmarks(landmarks, base_tour, 200) + + if print_infos : print("Using " + str(len(minor_landmarks)) + " minor landmarks around the predicted path") + + # full set of visitable landmarks + full_set = base_tour[:-1] + minor_landmarks # create full set of possible landmarks (without finish) + full_set.append(base_tour[-1]) # add finish back + + # get a new tour + new_tour = solve_optimization(full_set, max_time, False) + new_tour, new_dist = add_time_to_reach_simple(new_tour) + + """#if base_tour[0].location == base_tour[-1].location : + if False : + coords = [] # Coordinates of the new tour + coords_dict = {} # maps the location of an element to the element itself. Used to access the elements back once we get the geometry + + # Iterate through the new tour without finish + for elem in new_tour[:-1] : + coords.append(Point(elem.location)) + coords_dict[elem.location] = elem # if start = goal, only finish remains + + # Create a concave polygon using the coordinates + better_tour_poly = concave_hull(MultiPoint(coords)) # Create concave hull with "core" of tour leaving out start and finish + xs, ys = better_tour_poly.exterior.xy + + # reverse the xs and ys + xs.reverse() + ys.reverse() + + better_tour = [] # List of ordered visit + name_index = {} # Maps the name of a landmark to its index in the concave polygon + + # Loop through the polygon and generate the better (ordered) tour + for i,x in enumerate(xs[:-1]) : + better_tour.append(coords_dict[tuple((x,ys[i]))]) + name_index[coords_dict[tuple((x,ys[i]))].name] = i + + + # Scroll the list to have start in front again + start_index = name_index['start'] + better_tour = better_tour[start_index:] + better_tour[:start_index] + + # Append the finish back and correct the time to reach + better_tour.append(new_tour[-1]) + + # Rearrange only if polygon + better_tour = rearrange(better_tour) + + # Add the time to reach + better_tour = add_time_to_reach_simple(better_tour) + """ + + + """ + if not better_poly.is_simple : + + coords_dict = {} + better_tour2 = [] + for elem in better_tour : + coords_dict[elem.location] = elem + + better_poly2 = better_poly.buffer(0) + new_coords = better_poly2.exterior.coords[:] + start_coords = base_tour[0].location + start_index = new_coords. + + #for point in new_coords : + """ + + + better_tour, better_poly = find_shortest_path_through_all_landmarks(new_tour) + better_tour, better_dist = add_time_to_reach_simple(better_tour) + + if new_dist < better_dist : + final_tour = new_tour + else : + final_tour = better_tour + + if print_infos : + print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") + print("\nRefined tour (result of second stage optimization): ") + print_res(final_tour, len(full_set)) + + + + return final_tour diff --git a/backend/src/structs/__init__.py b/backend/src/structs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/structs/landmarks.py b/backend/src/structs/landmarks.py new file mode 100644 index 0000000..94209f3 --- /dev/null +++ b/backend/src/structs/landmarks.py @@ -0,0 +1,20 @@ +from typing import Optional +from pydantic import BaseModel + +from .landmarktype import LandmarkType + + + +# Output to frontend +class Landmark(BaseModel) : + name : str + type: LandmarkType # De facto mapping depending on how the query was executed with overpass. Should still EXACTLY correspond to the preferences + location : tuple + osm_type : str + osm_id : int + attractiveness : int + must_do : bool + n_tags : int + time_to_reach : Optional[int] = 0 + + diff --git a/backend/src/structs/landmarktype.py b/backend/src/structs/landmarktype.py new file mode 100644 index 0000000..8a63a1b --- /dev/null +++ b/backend/src/structs/landmarktype.py @@ -0,0 +1,4 @@ +from pydantic import BaseModel + +class LandmarkType(BaseModel): + landmark_type: str \ No newline at end of file diff --git a/backend/src/structs/preferences.py b/backend/src/structs/preferences.py new file mode 100644 index 0000000..500ebec --- /dev/null +++ b/backend/src/structs/preferences.py @@ -0,0 +1,28 @@ +from pydantic import BaseModel +from .landmarktype import LandmarkType + +class Preference(BaseModel) : + name: str + type: LandmarkType # should match the attributes of the Preferences class + score: int # score could be from 1 to 5 + +# Input for optimization +class Preferences(BaseModel) : + # Sightseeing / History & Culture (Musées, bâtiments historiques, opéras, églises) + sightseeing : Preference + + # Nature (parcs, jardins, rivières, plages) + nature: Preference + + # Shopping (diriger plutôt vers des zones / rues commerçantes) + shopping : Preference + +""" # Food (price low or high. Combien on veut dépenser pour manger à midi/soir) + food_budget : Preference + + # Tolérance au détour (ce qui détermine (+ ou -) le chemin emprunté) + detour_tol : Preference""" + + + + diff --git a/backend/src/tester.py b/backend/src/tester.py new file mode 100644 index 0000000..758e003 --- /dev/null +++ b/backend/src/tester.py @@ -0,0 +1,116 @@ +import pandas as pd + +from typing import List +from landmarks_manager import generate_landmarks +from fastapi.encoders import jsonable_encoder + +from optimizer import solve_optimization +from refiner import refine_optimization +from structs.landmarks import Landmark +from structs.landmarktype import LandmarkType +from structs.preferences import Preferences, Preference + + +# Helper function to create a .txt file with results +def write_data(L: List[Landmark], file_name: str): + + data = pd.DataFrame() + i = 0 + + for landmark in L : + data[i] = jsonable_encoder(landmark) + i += 1 + + data.to_json(file_name, indent = 2, force_ascii=False) + +def test3(city_country: str) -> List[Landmark]: + + + preferences = Preferences( + sightseeing=Preference( + name='sightseeing', + type=LandmarkType(landmark_type='sightseeing'), + score = 5), + nature=Preference( + name='nature', + type=LandmarkType(landmark_type='nature'), + score = 0), + shopping=Preference( + name='shopping', + type=LandmarkType(landmark_type='shopping'), + score = 5)) + + coordinates = None + + landmarks, landmarks_short = generate_landmarks(preferences=preferences, city_country=city_country, coordinates=coordinates) + + #write_data(landmarks) + + start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.2044576, 16.3870242), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.2044576, 16.3870242), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + + + test = landmarks_short + + test.insert(0, start) + test.append(finish) + + max_walking_time = 2 # hours + + visiting_list = solve_optimization(test, max_walking_time*60, True) + + + + + +def test4(coordinates: tuple[float, float]) -> List[Landmark]: + + + preferences = Preferences( + sightseeing=Preference( + name='sightseeing', + type=LandmarkType(landmark_type='sightseeing'), + score = 5), + nature=Preference( + name='nature', + type=LandmarkType(landmark_type='nature'), + score = 5), + shopping=Preference( + name='shopping', + type=LandmarkType(landmark_type='shopping'), + score = 5)) + + + # Create start and finish + start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=coordinates, osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=coordinates, osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.8777055, 2.3640967), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + #start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.847132, 2.312359), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.843185, 2.344533), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.847132, 2.312359), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0) + + # Generate the landmarks from the start location + landmarks, landmarks_short = generate_landmarks(preferences=preferences, coordinates=start.location) + #write_data(landmarks, "landmarks.txt") + + # Insert start and finish to the landmarks list + landmarks_short.insert(0, start) + landmarks_short.append(finish) + + # TODO use these parameters in another way + max_walking_time = 2 # hours + detour = 30 # minutes + + # First stage optimization + base_tour = solve_optimization(landmarks_short, max_walking_time*60, True) + + # Second stage optimization + refined_tour = refine_optimization(landmarks, base_tour, max_walking_time*60+detour, True) + + return refined_tour + + +#test4(tuple((48.8344400, 2.3220540))) # Café Chez César +#test4(tuple((48.8375946, 2.2949904))) # Point random +test4(tuple((47.377859, 8.540585))) # Zurich HB +#test3('Vienna, Austria') \ No newline at end of file diff --git a/deployment/kustomization.yaml b/deployment/kustomization.yaml new file mode 100644 index 0000000..e69de29 diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/frontend/.metadata similarity index 100% rename from .metadata rename to frontend/.metadata diff --git a/analysis_options.yaml b/frontend/analysis_options.yaml similarity index 100% rename from analysis_options.yaml rename to frontend/analysis_options.yaml diff --git a/android/.gitignore b/frontend/android/.gitignore similarity index 100% rename from android/.gitignore rename to frontend/android/.gitignore diff --git a/android/app/build.gradle b/frontend/android/app/build.gradle similarity index 92% rename from android/app/build.gradle rename to frontend/android/app/build.gradle index 21a5169..f6b499e 100644 --- a/android/app/build.gradle +++ b/frontend/android/app/build.gradle @@ -45,6 +45,9 @@ android { applicationId "com.example.fast_network_navigation" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + // Minimum Android version for Google Maps SDK + // https://developers.google.com/maps/flutter-package/config#android + minSdk = 21 minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() diff --git a/android/app/src/debug/AndroidManifest.xml b/frontend/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from android/app/src/debug/AndroidManifest.xml rename to frontend/android/app/src/debug/AndroidManifest.xml diff --git a/android/app/src/main/AndroidManifest.xml b/frontend/android/app/src/main/AndroidManifest.xml similarity index 86% rename from android/app/src/main/AndroidManifest.xml rename to frontend/android/app/src/main/AndroidManifest.xml index fc057fe..f144d58 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/frontend/android/app/src/main/AndroidManifest.xml @@ -28,7 +28,14 @@ This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> + android:value="2" + /> + + + + diff --git a/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt b/frontend/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt similarity index 100% rename from android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt rename to frontend/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from android/app/src/main/res/drawable-v21/launch_background.xml rename to frontend/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/android/app/src/main/res/drawable/launch_background.xml b/frontend/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from android/app/src/main/res/drawable/launch_background.xml rename to frontend/android/app/src/main/res/drawable/launch_background.xml diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/android/app/src/main/res/values-night/styles.xml b/frontend/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from android/app/src/main/res/values-night/styles.xml rename to frontend/android/app/src/main/res/values-night/styles.xml diff --git a/android/app/src/main/res/values/styles.xml b/frontend/android/app/src/main/res/values/styles.xml similarity index 100% rename from android/app/src/main/res/values/styles.xml rename to frontend/android/app/src/main/res/values/styles.xml diff --git a/android/app/src/profile/AndroidManifest.xml b/frontend/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from android/app/src/profile/AndroidManifest.xml rename to frontend/android/app/src/profile/AndroidManifest.xml diff --git a/android/build.gradle b/frontend/android/build.gradle similarity index 100% rename from android/build.gradle rename to frontend/android/build.gradle diff --git a/android/gradle.properties b/frontend/android/gradle.properties similarity index 100% rename from android/gradle.properties rename to frontend/android/gradle.properties diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/frontend/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from android/gradle/wrapper/gradle-wrapper.properties rename to frontend/android/gradle/wrapper/gradle-wrapper.properties diff --git a/android/settings.gradle b/frontend/android/settings.gradle similarity index 100% rename from android/settings.gradle rename to frontend/android/settings.gradle diff --git a/ios/.gitignore b/frontend/ios/.gitignore similarity index 100% rename from ios/.gitignore rename to frontend/ios/.gitignore diff --git a/ios/Flutter/AppFrameworkInfo.plist b/frontend/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from ios/Flutter/AppFrameworkInfo.plist rename to frontend/ios/Flutter/AppFrameworkInfo.plist diff --git a/ios/Flutter/Debug.xcconfig b/frontend/ios/Flutter/Debug.xcconfig similarity index 100% rename from ios/Flutter/Debug.xcconfig rename to frontend/ios/Flutter/Debug.xcconfig diff --git a/ios/Flutter/Release.xcconfig b/frontend/ios/Flutter/Release.xcconfig similarity index 100% rename from ios/Flutter/Release.xcconfig rename to frontend/ios/Flutter/Release.xcconfig diff --git a/ios/Runner.xcodeproj/project.pbxproj b/frontend/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from ios/Runner.xcodeproj/project.pbxproj rename to frontend/ios/Runner.xcodeproj/project.pbxproj diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from ios/Runner.xcworkspace/contents.xcworkspacedata rename to frontend/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/ios/Runner/AppDelegate.swift b/frontend/ios/Runner/AppDelegate.swift similarity index 100% rename from ios/Runner/AppDelegate.swift rename to frontend/ios/Runner/AppDelegate.swift diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from ios/Runner/Base.lproj/LaunchScreen.storyboard rename to frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/ios/Runner/Base.lproj/Main.storyboard b/frontend/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from ios/Runner/Base.lproj/Main.storyboard rename to frontend/ios/Runner/Base.lproj/Main.storyboard diff --git a/ios/Runner/Info.plist b/frontend/ios/Runner/Info.plist similarity index 100% rename from ios/Runner/Info.plist rename to frontend/ios/Runner/Info.plist diff --git a/ios/Runner/Runner-Bridging-Header.h b/frontend/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from ios/Runner/Runner-Bridging-Header.h rename to frontend/ios/Runner/Runner-Bridging-Header.h diff --git a/ios/RunnerTests/RunnerTests.swift b/frontend/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from ios/RunnerTests/RunnerTests.swift rename to frontend/ios/RunnerTests/RunnerTests.swift diff --git a/lib/modules/scaffold.dart b/frontend/lib/layout.dart similarity index 92% rename from lib/modules/scaffold.dart rename to frontend/lib/layout.dart index 34c603c..875ccbc 100644 --- a/lib/modules/scaffold.dart +++ b/frontend/lib/layout.dart @@ -4,9 +4,10 @@ import 'package:fast_network_navigation/modules/overview.dart'; import 'package:fast_network_navigation/modules/profile.dart'; +// BasePage is the scaffold that holds all other pages +// A side drawer is used to switch between pages class BasePage extends StatefulWidget { const BasePage({super.key, required this.title}); - final String title; @override @@ -22,7 +23,7 @@ class _BasePageState extends State { }); } - Widget currentView = MapPage(); + Widget currentView = NavigationOverview(); @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); @@ -51,7 +52,7 @@ class _BasePageState extends State { // Update the state of the app _onItemTapped(0); // Then close the drawer - currentView = MapPage(); + currentView = NavigationOverview(); Navigator.pop(context); }, ), @@ -87,3 +88,4 @@ class _BasePageState extends State { ); } } + diff --git a/lib/main.dart b/frontend/lib/main.dart similarity index 86% rename from lib/main.dart rename to frontend/lib/main.dart index 424c0d5..d818628 100644 --- a/lib/main.dart +++ b/frontend/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:fast_network_navigation/modules/scaffold.dart'; +import 'package:fast_network_navigation/layout.dart'; void main() => runApp(const App()); diff --git a/frontend/lib/modules/destination_card.dart b/frontend/lib/modules/destination_card.dart new file mode 100644 index 0000000..5829c5e --- /dev/null +++ b/frontend/lib/modules/destination_card.dart @@ -0,0 +1,40 @@ + + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + + +class DestinationCard extends StatefulWidget { + final String title; + final String description; + final String image; + bool visited; + + @override + _DestinationCardState createState() => _DestinationCardState(); + + + DestinationCard(this.title, this.description, this.image, this.visited); + + Widget build() { + return Card( + child: ListTile( + leading: Icon(Icons.location_on), + title: Text(title), + subtitle: Text(description), + onTap: () { + // Navigator.pushNamed(context, '/destination'); + }, + ), + ); + } + +} + +class _DestinationCardState extends State { + @override + Widget build(BuildContext context) { + return Card(); + } + +} \ No newline at end of file diff --git a/frontend/lib/modules/map.dart b/frontend/lib/modules/map.dart new file mode 100644 index 0000000..9f7a22d --- /dev/null +++ b/frontend/lib/modules/map.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; + +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +class MapWidget extends StatefulWidget { + @override + State createState() => _MapWidgetState(); +} + +class _MapWidgetState extends State { + late GoogleMapController mapController; + + final LatLng _center = const LatLng(45.521563, -122.677433); + + void _onMapCreated(GoogleMapController controller) { + mapController = controller; + } + void _onCameraIdle() { + // print(mapController.getLatLng()); + } + + @override + Widget build(BuildContext context) { + return GoogleMap( + onMapCreated: _onMapCreated, + initialCameraPosition: CameraPosition( + target: _center, + zoom: 11.0, + ), + onCameraIdle: _onCameraIdle, + ); + } +} + + + + // GeoCode geoCode = GeoCode(); + // String _currentCityName = "..."; + // final Debounce _debounce = Debounce(Duration(seconds: 3)); + + // final LatLng _center = const LatLng(45.521563, -122.677433); + // late GoogleMapController mapController; + + // void _onMapCreated(GoogleMapController controller) { + // mapController = controller; + // } + + // // void _setCurrentCityName() async { + // if (mapController.camera.zoom < 9) { + // return; // Don't bother if the view is too wide + // } + // var currentCoordinates = mapController.camera.center; + // String? city; + + // try{ + // List placemarks = await placemarkFromCoordinates(currentCoordinates.latitude, currentCoordinates.longitude); + // city = placemarks[0].locality.toString(); + // } catch (e) { + // debugPrint("Error: $e"); + // try { + // Address address = await geoCode.reverseGeocoding(latitude: currentCoordinates.latitude, longitude: currentCoordinates.longitude); + + // if (address.city == null || address.city.toString().contains("Throttled!")){ + // throw Exception("Probably rate limited"); + // } + // city = address.city.toString(); + // } catch (e) { + // debugPrint("Error: $e"); + + // } + // } + // if (city != null) { + // setState(() { + // _currentCityName = city!; + // }); + // } else { + // _debounce(() async {_setCurrentCityName();}); + // } + // } + + \ No newline at end of file diff --git a/frontend/lib/modules/navigation.dart b/frontend/lib/modules/navigation.dart new file mode 100644 index 0000000..7bd62ac --- /dev/null +++ b/frontend/lib/modules/navigation.dart @@ -0,0 +1,63 @@ +import 'package:fast_network_navigation/modules/destination_card.dart'; +import 'package:flutter/material.dart'; + + +List loadDestinations() { + List cities = [ + singleDestination( + "New York", + "The Big Apple", + "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/View_of_New_York_City.jpg/800px-View_of_New_York_City.jpg" + ), + singleDestination( + "Los Angeles", + "City of Angels", + "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Los_Angeles_City_Hall_2013.jpg/800px-Los_Angeles_City_Hall_2013.jpg" + ), + singleDestination( + "Chicago", + "The Windy City", + "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg/800px-Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg" + ), + singleDestination( + "San Francisco", + "The Golden City", + "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/San_Francisco_City_Hall_2013.jpg/800px-San_Francisco_City_Hall_2013.jpg" + ), + singleDestination( + "Miami", + "The Magic City", + "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Miami_collage.jpg/800px-Miami_collage.jpg" + ), + singleDestination( + "Las Vegas", + "Sin City", + "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Las_Vegas_Strip.jpg/800px-Las_Vegas_Strip.jpg" + ), + singleDestination( + "Seattle", + "Emerald City", + "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Seattle_Kerry_Park_Skyline.jpg/800px-Seattle_Kerry_Park_Skyline.jpg" + ), + singleDestination( + "Boston", + "Beantown", + "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Boston_skyline_from_Longfellow_Bridge_September_2017_panorama_2.jpg/800px-Boston" + ) + ]; + cities.shuffle(); + return cities; +} + +Widget singleDestination(String title, String description, String image) { + return Card( + child: ListTile( + leading: Icon(Icons.location_on), + title: Text(title), + subtitle: Text(description), + onTap: () { + // Navigator.pushNamed(context, '/destination'); + }, + ), + ); +} \ No newline at end of file diff --git a/lib/modules/overview.dart b/frontend/lib/modules/overview.dart similarity index 54% rename from lib/modules/overview.dart rename to frontend/lib/modules/overview.dart index 7d6c0ed..bfcf18f 100644 --- a/lib/modules/overview.dart +++ b/frontend/lib/modules/overview.dart @@ -1,14 +1,41 @@ import 'package:flutter/material.dart'; -import 'package:flutter_map/flutter_map.dart'; import 'package:sliding_up_panel/sliding_up_panel.dart'; -import 'package:fast_network_navigation/modules/navigation.dart'; +import 'package:geocode/geocode.dart'; +import 'dart:async'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; -class MapPage extends StatefulWidget { +import 'package:fast_network_navigation/modules/navigation.dart'; +import 'package:fast_network_navigation/modules/map.dart'; + + + +class NavigationOverview extends StatefulWidget { @override - _MapPageState createState() => _MapPageState(); + State createState() => _NavigationOverviewState(); } -class _MapPageState extends State { + + +class Debounce { + Duration delay; + Timer? _timer; + + Debounce( + this.delay, + ); + + call(void Function() callback) { + _timer?.cancel(); + _timer = Timer(delay, callback); + } + + dispose() { + _timer?.cancel(); + } +} + + +class _NavigationOverviewState extends State { @override Widget build(BuildContext context) { @@ -17,14 +44,7 @@ class _MapPageState extends State { renderPanelSheet: false, panel: _floatingPanel(theme), collapsed: _floatingCollapsed(theme), - body: FlutterMap( - options: MapOptions( - initialZoom: 11, - ), - children: [ - openStreetMapTileLayer, - ], - ), + body: MapWidget() ); } @@ -59,14 +79,7 @@ class _MapPageState extends State { children: [ Greeting(theme), Text("Got a lot to do today! Here is a rundown:"), - singleDestination(context, "Location 1", "some description", "Further information"), - singleDestination(context, "Location 2", "some description", "Further information"), - singleDestination(context, "Location 3", "some description", "Further information"), - singleDestination(context, "Location 4", "some description", "Further information"), - singleDestination(context, "Location 5", "some description", "Further information"), - singleDestination(context, "Location 6", "some description", "Further information"), - singleDestination(context, "Location 7", "some description", "Further information"), - singleDestination(context, "Location 8", "some description", "Further information"), + ...loadDestinations(), ], ), ), @@ -78,16 +91,9 @@ class _MapPageState extends State { Widget Greeting (ThemeData theme) { return Center( child: Text( - "Explore Kview", + "Explore #todo", style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold), ), ); } } - -TileLayer get openStreetMapTileLayer => TileLayer( - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - userAgentPackageName: 'flutter_map', -); - -// Add a pin to the map diff --git a/frontend/lib/modules/profile.dart b/frontend/lib/modules/profile.dart new file mode 100644 index 0000000..e8beb08 --- /dev/null +++ b/frontend/lib/modules/profile.dart @@ -0,0 +1,91 @@ +import 'package:fast_network_navigation/structs/preferences.dart'; +import 'package:flutter/material.dart'; + + + +class ProfilePage extends StatefulWidget { + @override + _ProfilePageState createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + @override + Widget build(BuildContext context) { + return ListView( + children: [ + // First a round, centered image + Center( + child: CircleAvatar( + radius: 100, + child: Icon(Icons.person, size: 100), + ) + ), + Center( + child: Text('Curious traveler', style: TextStyle(fontSize: 24)) + ), + + Padding( + padding: EdgeInsets.all(10), + ), + + Text('Please rate your preferences for the following activities:'), + + // Now the sliders + ImportanceSliders() + ] + ); + } +} + + + +class ImportanceSliders extends StatefulWidget { + + @override + State createState() => _ImportanceSlidersState(); +} + + +class _ImportanceSlidersState extends State { + + UserPreferences _prefs = UserPreferences(); + + @override + void initState() { + super.initState(); + _prefs.load(); + } + + List _createSliders() { + List sliders = []; + for (SinglePreference pref in _prefs.preferences) { + sliders.add(Card( + child: ListTile( + leading: pref.icon, + title: Text(pref.name), + subtitle: Slider( + value: pref.value.toDouble(), + min: 0, + max: 10, + divisions: 10, + label: pref.value.toString(), + onChanged: (double newValue) { + setState(() { + pref.value = newValue.toInt(); + _prefs.save(); + }); + }, + ) + ), + margin: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 0), + shadowColor: Colors.grey, + )); + } + return sliders; + } + + @override + Widget build(BuildContext context) { + return Column(children: _createSliders()); + } +} diff --git a/frontend/lib/structs/destination.dart b/frontend/lib/structs/destination.dart new file mode 100644 index 0000000..c44fbf9 --- /dev/null +++ b/frontend/lib/structs/destination.dart @@ -0,0 +1,62 @@ +import "package:flutter/material.dart"; + +class Destination { + final double latitude; + final double longitude; + final String name; + final String description; + // final DestinationType type; + final Duration duration; + final bool visited; + + const Destination({ + required this.latitude, + required this.longitude, + required this.name, + required this.description, + // required this.type, + required this.duration, + required this.visited, + }); + + factory Destination.fromJson(Map json) { + return switch (json) { + { + 'lat': double latitude, + 'lon': double longitude, + 'name': String name, + 'description': String description, + // 'type': String type, + 'duration': int duration, + 'visited': bool visited + + } => + Destination( + latitude: latitude, + longitude: longitude, + name: name, + description: description, + // type: "DestinationType.values.firstWhere((element) => element.name == type)", + duration: Duration(minutes: duration), + visited: visited + ), + _ => throw const FormatException('Failed to load destination.'), + }; +} + +} + + +class DestinationType { + final String name; + final String description; + final Icon icon; + + const DestinationType({ + required this.name, + required this.description, + required this.icon, + }); +} + + diff --git a/frontend/lib/structs/preferences.dart b/frontend/lib/structs/preferences.dart new file mode 100644 index 0000000..7746393 --- /dev/null +++ b/frontend/lib/structs/preferences.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + + +class SinglePreference { + String name; + String description; + int value; + Icon icon; + String key; + + SinglePreference({ + required this.name, + required this.description, + required this.value, + required this.icon, + required this.key, + }); +} + + +class UserPreferences { + List preferences = [ + SinglePreference( + name: "Sightseeing", + description: "How much do you like sightseeing?", + value: 0, + icon: Icon(Icons.church), + key: "sightseeing", + ), + SinglePreference( + name: "Shopping", + description: "How much do you like shopping?", + value: 0, + icon: Icon(Icons.shopping_bag), + key: "shopping", + ), + SinglePreference( + name: "Foods & Drinks", + description: "How much do you like eating?", + value: 0, + icon: Icon(Icons.restaurant), + key: "eating", + ), + SinglePreference( + name: "Nightlife", + description: "How much do you like nightlife?", + value: 0, + icon: Icon(Icons.wine_bar), + key: "nightlife", + ), + SinglePreference( + name: "Nature", + description: "How much do you like nature?", + value: 0, + icon: Icon(Icons.landscape), + key: "nature", + ), + SinglePreference( + name: "Culture", + description: "How much do you like culture?", + value: 0, + icon: Icon(Icons.palette), + key: "culture", + ), + ]; + + + void save() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + for (SinglePreference pref in preferences) { + prefs.setInt(pref.key, pref.value); + } + } + + void load() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + for (SinglePreference pref in preferences) { + pref.value = prefs.getInt(pref.key) ?? 0; + } + } +} \ No newline at end of file diff --git a/frontend/lib/structs/route.dart b/frontend/lib/structs/route.dart new file mode 100644 index 0000000..8b46787 --- /dev/null +++ b/frontend/lib/structs/route.dart @@ -0,0 +1,14 @@ +import "package:fast_network_navigation/structs/destination.dart"; + + +class Route { + final String name; + final Duration duration; + final List destinations; + + Route({ + required this.name, + required this.duration, + required this.destinations + }); +} \ No newline at end of file diff --git a/frontend/lib/utils/get_route.dart b/frontend/lib/utils/get_route.dart new file mode 100644 index 0000000..fccf6ac --- /dev/null +++ b/frontend/lib/utils/get_route.dart @@ -0,0 +1,18 @@ +import "package:fast_network_navigation/structs/destination.dart"; +import 'package:http/http.dart' as http; +import 'dart:convert'; + +Future fetchDestination() async { + final response = await http + .get(Uri.parse('https://nav.kluster.moll.re/v1/destination/1')); + + if (response.statusCode == 200) { + // If the server did return a 200 OK response, + // then parse the JSON. + return Destination.fromJson(jsonDecode(response.body) as Map); + } else { + // If the server did not return a 200 OK response, + // then throw an exception. + throw Exception('Failed to load destination'); + } +} \ No newline at end of file diff --git a/linux/.gitignore b/frontend/linux/.gitignore similarity index 100% rename from linux/.gitignore rename to frontend/linux/.gitignore diff --git a/linux/CMakeLists.txt b/frontend/linux/CMakeLists.txt similarity index 100% rename from linux/CMakeLists.txt rename to frontend/linux/CMakeLists.txt diff --git a/linux/flutter/CMakeLists.txt b/frontend/linux/flutter/CMakeLists.txt similarity index 100% rename from linux/flutter/CMakeLists.txt rename to frontend/linux/flutter/CMakeLists.txt diff --git a/linux/flutter/generated_plugin_registrant.cc b/frontend/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from linux/flutter/generated_plugin_registrant.cc rename to frontend/linux/flutter/generated_plugin_registrant.cc diff --git a/linux/flutter/generated_plugin_registrant.h b/frontend/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from linux/flutter/generated_plugin_registrant.h rename to frontend/linux/flutter/generated_plugin_registrant.h diff --git a/linux/flutter/generated_plugins.cmake b/frontend/linux/flutter/generated_plugins.cmake similarity index 100% rename from linux/flutter/generated_plugins.cmake rename to frontend/linux/flutter/generated_plugins.cmake diff --git a/linux/main.cc b/frontend/linux/main.cc similarity index 100% rename from linux/main.cc rename to frontend/linux/main.cc diff --git a/linux/my_application.cc b/frontend/linux/my_application.cc similarity index 100% rename from linux/my_application.cc rename to frontend/linux/my_application.cc diff --git a/linux/my_application.h b/frontend/linux/my_application.h similarity index 100% rename from linux/my_application.h rename to frontend/linux/my_application.h diff --git a/macos/.gitignore b/frontend/macos/.gitignore similarity index 100% rename from macos/.gitignore rename to frontend/macos/.gitignore diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/frontend/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from macos/Flutter/Flutter-Debug.xcconfig rename to frontend/macos/Flutter/Flutter-Debug.xcconfig diff --git a/macos/Flutter/Flutter-Release.xcconfig b/frontend/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from macos/Flutter/Flutter-Release.xcconfig rename to frontend/macos/Flutter/Flutter-Release.xcconfig diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 51% rename from macos/Flutter/GeneratedPluginRegistrant.swift rename to frontend/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..724bb2a 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,8 @@ import FlutterMacOS import Foundation +import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) } diff --git a/macos/Runner.xcodeproj/project.pbxproj b/frontend/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from macos/Runner.xcodeproj/project.pbxproj rename to frontend/macos/Runner.xcodeproj/project.pbxproj diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from macos/Runner.xcworkspace/contents.xcworkspacedata rename to frontend/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/macos/Runner/AppDelegate.swift b/frontend/macos/Runner/AppDelegate.swift similarity index 100% rename from macos/Runner/AppDelegate.swift rename to frontend/macos/Runner/AppDelegate.swift diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/frontend/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from macos/Runner/Base.lproj/MainMenu.xib rename to frontend/macos/Runner/Base.lproj/MainMenu.xib diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/frontend/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from macos/Runner/Configs/AppInfo.xcconfig rename to frontend/macos/Runner/Configs/AppInfo.xcconfig diff --git a/macos/Runner/Configs/Debug.xcconfig b/frontend/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from macos/Runner/Configs/Debug.xcconfig rename to frontend/macos/Runner/Configs/Debug.xcconfig diff --git a/macos/Runner/Configs/Release.xcconfig b/frontend/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from macos/Runner/Configs/Release.xcconfig rename to frontend/macos/Runner/Configs/Release.xcconfig diff --git a/macos/Runner/Configs/Warnings.xcconfig b/frontend/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from macos/Runner/Configs/Warnings.xcconfig rename to frontend/macos/Runner/Configs/Warnings.xcconfig diff --git a/macos/Runner/DebugProfile.entitlements b/frontend/macos/Runner/DebugProfile.entitlements similarity index 100% rename from macos/Runner/DebugProfile.entitlements rename to frontend/macos/Runner/DebugProfile.entitlements diff --git a/macos/Runner/Info.plist b/frontend/macos/Runner/Info.plist similarity index 100% rename from macos/Runner/Info.plist rename to frontend/macos/Runner/Info.plist diff --git a/macos/Runner/MainFlutterWindow.swift b/frontend/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from macos/Runner/MainFlutterWindow.swift rename to frontend/macos/Runner/MainFlutterWindow.swift diff --git a/macos/Runner/Release.entitlements b/frontend/macos/Runner/Release.entitlements similarity index 100% rename from macos/Runner/Release.entitlements rename to frontend/macos/Runner/Release.entitlements diff --git a/macos/RunnerTests/RunnerTests.swift b/frontend/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from macos/RunnerTests/RunnerTests.swift rename to frontend/macos/RunnerTests/RunnerTests.swift diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock new file mode 100644 index 0000000..7c2f396 --- /dev/null +++ b/frontend/pubspec.lock @@ -0,0 +1,530 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + url: "https://pub.dev" + source: hosted + version: "2.0.19" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + geocode: + dependency: "direct main" + description: + name: geocode + sha256: cf9727c369bb3703b97d6e440225962dc27b7f3c686662fe3cdcc91cbfb7074d + url: "https://pub.dev" + source: hosted + version: "1.0.3" + geocoding: + dependency: "direct main" + description: + name: geocoding + sha256: d580c801cba9386b4fac5047c4c785a4e19554f46be42f4f5e5b7deacd088a66 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geocoding_android: + dependency: transitive + description: + name: geocoding_android + sha256: "1b13eca79b11c497c434678fed109c2be020b158cec7512c848c102bc7232603" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + geocoding_ios: + dependency: transitive + description: + name: geocoding_ios + sha256: "94ddba60387501bd1c11e18dca7c5a9e8c645d6e3da9c38b9762434941870c24" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + geocoding_platform_interface: + dependency: transitive + description: + name: geocoding_platform_interface + sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + google_maps: + dependency: transitive + description: + name: google_maps + sha256: "47eef3836b49bb030d5cb3afc60b8451408bf34cf753e571b645d6529eb4251a" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + google_maps_flutter: + dependency: "direct main" + description: + name: google_maps_flutter + sha256: c1972cbad779bc5346c49045f26ae45550a0958b1cbca5b524dd3c8954995d28 + url: "https://pub.dev" + source: hosted + version: "2.6.1" + google_maps_flutter_android: + dependency: transitive + description: + name: google_maps_flutter_android + sha256: "0bcadb80eba39afda77dede89a6caafd3b68f2786b90491eceea4a01c3db181c" + url: "https://pub.dev" + source: hosted + version: "2.8.0" + google_maps_flutter_ios: + dependency: transitive + description: + name: google_maps_flutter_ios + sha256: e5132d17f051600d90d79d9f574b177c24231da702453a036db2490f9ced4646 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + google_maps_flutter_platform_interface: + dependency: transitive + description: + name: google_maps_flutter_platform_interface + sha256: "167af879da4d004cd58771f1469b91dcc3b9b0a2c5334cc6bf71fd41d4b35403" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + google_maps_flutter_web: + dependency: transitive + description: + name: google_maps_flutter_web + sha256: "0c0d5c723d94b295cf86dd1c45ff91d2ac1fff7c05ddca4f01bef9fa0a014690" + url: "https://pub.dev" + source: hosted + version: "0.5.7" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: "direct main" + description: + name: http + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + js_wrapping: + dependency: transitive + description: + name: js_wrapping + sha256: e385980f7c76a8c1c9a560dfb623b890975841542471eade630b2871d243851c + url: "https://pub.dev" + source: hosted + version: "0.7.4" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + sanitize_html: + dependency: transitive + description: + name: sanitize_html + sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + sliding_up_panel: + dependency: "direct main" + description: + name: sliding_up_panel + sha256: "578e90956a6212d1e406373250b2436a0f3afece29aee3c24c8360094d6cf968" + url: "https://pub.dev" + source: hosted + version: "2.0.0+1" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + win32: + dependency: transitive + description: + name: win32 + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + url: "https://pub.dev" + source: hosted + version: "5.5.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/frontend/pubspec.yaml similarity index 94% rename from pubspec.yaml rename to frontend/pubspec.yaml index 507aee5..9f1732c 100644 --- a/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -1,5 +1,5 @@ -name: fast_network_navigation -description: "A new Flutter project." +name: "fast_network_navigation" +description: "An interactive city navigator." # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev @@ -35,8 +35,12 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 - flutter_map: ^6.1.0 sliding_up_panel: ^2.0.0+1 + geocoding: ^3.0.0 + geocode: ^1.0.3 + google_maps_flutter: ^2.6.1 + http: ^1.2.1 + shared_preferences: ^2.2.3 dev_dependencies: flutter_test: @@ -47,7 +51,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^3.0.0 + flutter_lints: ^4.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test/widget_test.dart b/frontend/test/widget_test.dart similarity index 83% rename from test/widget_test.dart rename to frontend/test/widget_test.dart index 1eacbc4..143b24f 100644 --- a/test/widget_test.dart +++ b/frontend/test/widget_test.dart @@ -9,16 +9,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; // import 'package:fast_network_navigation/main.dart'; -import 'package:fast_network_navigation/modules/scaffold.dart'; +import 'package:fast_network_navigation/layout.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(BasePage(title: "City Nav")); - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); + // Verfiy that the title is displayed + expect(find.text('City Nav'), findsOneWidget); // Tap the '+' icon and trigger a frame. await tester.tap(find.byIcon(Icons.add)); diff --git a/web/favicon.png b/frontend/web/favicon.png similarity index 100% rename from web/favicon.png rename to frontend/web/favicon.png diff --git a/web/icons/Icon-192.png b/frontend/web/icons/Icon-192.png similarity index 100% rename from web/icons/Icon-192.png rename to frontend/web/icons/Icon-192.png diff --git a/web/icons/Icon-512.png b/frontend/web/icons/Icon-512.png similarity index 100% rename from web/icons/Icon-512.png rename to frontend/web/icons/Icon-512.png diff --git a/web/icons/Icon-maskable-192.png b/frontend/web/icons/Icon-maskable-192.png similarity index 100% rename from web/icons/Icon-maskable-192.png rename to frontend/web/icons/Icon-maskable-192.png diff --git a/web/icons/Icon-maskable-512.png b/frontend/web/icons/Icon-maskable-512.png similarity index 100% rename from web/icons/Icon-maskable-512.png rename to frontend/web/icons/Icon-maskable-512.png diff --git a/web/index.html b/frontend/web/index.html similarity index 94% rename from web/index.html rename to frontend/web/index.html index 30e08e2..5cbcc91 100644 --- a/web/index.html +++ b/frontend/web/index.html @@ -14,6 +14,7 @@ This is a placeholder for base href that will be replaced by the value of the `--base-href` argument provided to `flutter build`. --> + diff --git a/web/manifest.json b/frontend/web/manifest.json similarity index 100% rename from web/manifest.json rename to frontend/web/manifest.json diff --git a/windows/.gitignore b/frontend/windows/.gitignore similarity index 100% rename from windows/.gitignore rename to frontend/windows/.gitignore diff --git a/windows/CMakeLists.txt b/frontend/windows/CMakeLists.txt similarity index 100% rename from windows/CMakeLists.txt rename to frontend/windows/CMakeLists.txt diff --git a/windows/flutter/CMakeLists.txt b/frontend/windows/flutter/CMakeLists.txt similarity index 100% rename from windows/flutter/CMakeLists.txt rename to frontend/windows/flutter/CMakeLists.txt diff --git a/windows/flutter/generated_plugin_registrant.cc b/frontend/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from windows/flutter/generated_plugin_registrant.cc rename to frontend/windows/flutter/generated_plugin_registrant.cc diff --git a/windows/flutter/generated_plugin_registrant.h b/frontend/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from windows/flutter/generated_plugin_registrant.h rename to frontend/windows/flutter/generated_plugin_registrant.h diff --git a/windows/flutter/generated_plugins.cmake b/frontend/windows/flutter/generated_plugins.cmake similarity index 100% rename from windows/flutter/generated_plugins.cmake rename to frontend/windows/flutter/generated_plugins.cmake diff --git a/windows/runner/CMakeLists.txt b/frontend/windows/runner/CMakeLists.txt similarity index 100% rename from windows/runner/CMakeLists.txt rename to frontend/windows/runner/CMakeLists.txt diff --git a/windows/runner/Runner.rc b/frontend/windows/runner/Runner.rc similarity index 100% rename from windows/runner/Runner.rc rename to frontend/windows/runner/Runner.rc diff --git a/windows/runner/flutter_window.cpp b/frontend/windows/runner/flutter_window.cpp similarity index 100% rename from windows/runner/flutter_window.cpp rename to frontend/windows/runner/flutter_window.cpp diff --git a/windows/runner/flutter_window.h b/frontend/windows/runner/flutter_window.h similarity index 100% rename from windows/runner/flutter_window.h rename to frontend/windows/runner/flutter_window.h diff --git a/windows/runner/main.cpp b/frontend/windows/runner/main.cpp similarity index 100% rename from windows/runner/main.cpp rename to frontend/windows/runner/main.cpp diff --git a/windows/runner/resource.h b/frontend/windows/runner/resource.h similarity index 100% rename from windows/runner/resource.h rename to frontend/windows/runner/resource.h diff --git a/windows/runner/resources/app_icon.ico b/frontend/windows/runner/resources/app_icon.ico similarity index 100% rename from windows/runner/resources/app_icon.ico rename to frontend/windows/runner/resources/app_icon.ico diff --git a/windows/runner/runner.exe.manifest b/frontend/windows/runner/runner.exe.manifest similarity index 100% rename from windows/runner/runner.exe.manifest rename to frontend/windows/runner/runner.exe.manifest diff --git a/windows/runner/utils.cpp b/frontend/windows/runner/utils.cpp similarity index 100% rename from windows/runner/utils.cpp rename to frontend/windows/runner/utils.cpp diff --git a/windows/runner/utils.h b/frontend/windows/runner/utils.h similarity index 100% rename from windows/runner/utils.h rename to frontend/windows/runner/utils.h diff --git a/windows/runner/win32_window.cpp b/frontend/windows/runner/win32_window.cpp similarity index 100% rename from windows/runner/win32_window.cpp rename to frontend/windows/runner/win32_window.cpp diff --git a/windows/runner/win32_window.h b/frontend/windows/runner/win32_window.h similarity index 100% rename from windows/runner/win32_window.h rename to frontend/windows/runner/win32_window.h diff --git a/landmarks.txt b/landmarks.txt new file mode 100644 index 0000000..7ee474a --- /dev/null +++ b/landmarks.txt @@ -0,0 +1,9730 @@ +{ + "0":{ + "name":"Musée du quai Branly - Jacques Chirac", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8609823, + 2.2977973 + ], + "osm_type":"way", + "osm_id":17954721, + "attractiveness":30, + "must_do":false, + "n_tags":30, + "time_to_reach":0 + }, + "1":{ + "name":"Bourse de Commerce — Pinault Collection", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8628167, + 2.3428183 + ], + "osm_type":"way", + "osm_id":19856722, + "attractiveness":32, + "must_do":false, + "n_tags":32, + "time_to_reach":0 + }, + "2":{ + "name":"Galerie de Minéralogie et de Géologie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8418045, + 2.3577296 + ], + "osm_type":"way", + "osm_id":21999357, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "3":{ + "name":"Galeries de Paléontologie et d'Anatomie comparée", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8431475, + 2.3628815 + ], + "osm_type":"way", + "osm_id":21999454, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "4":{ + "name":"Institut du Monde Arabe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8489231, + 2.3572223 + ], + "osm_type":"way", + "osm_id":22870791, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "5":{ + "name":"Jardin Tino Rossi - Musée de la Sculpture en Plein Air", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8474186, + 2.3607371 + ], + "osm_type":"way", + "osm_id":23644147, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "6":{ + "name":"Halle Saint-Pierre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8848435, + 2.3445246 + ], + "osm_type":"way", + "osm_id":45073393, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "7":{ + "name":"Jeu de Paume", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8658156, + 2.3240828 + ], + "osm_type":"way", + "osm_id":54188994, + "attractiveness":21, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "8":{ + "name":"Musée de l'Orangerie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8637655, + 2.3226594 + ], + "osm_type":"way", + "osm_id":54188996, + "attractiveness":24, + "must_do":false, + "n_tags":24, + "time_to_reach":0 + }, + "9":{ + "name":"Atelier Brancusi", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8614029, + 2.3519903 + ], + "osm_type":"way", + "osm_id":55503399, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "10":{ + "name":"Lafayette Anticipations", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8590014, + 2.354757 + ], + "osm_type":"way", + "osm_id":55865819, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "11":{ + "name":"Grand Palais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8661514, + 2.3122667 + ], + "osm_type":"way", + "osm_id":56185523, + "attractiveness":22, + "must_do":false, + "n_tags":22, + "time_to_reach":0 + }, + "12":{ + "name":"Pavillon de l'Arsenal", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8505861, + 2.3621853 + ], + "osm_type":"way", + "osm_id":56186898, + "attractiveness":19, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "13":{ + "name":"Musée de Cluny", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8506604, + 2.3437398 + ], + "osm_type":"way", + "osm_id":56640163, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "14":{ + "name":"Musée d'art et d'histoire du Judaïsme", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8612656, + 2.355418 + ], + "osm_type":"way", + "osm_id":56687783, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "15":{ + "name":"Musée national Picasso-Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8598781, + 2.3620895 + ], + "osm_type":"way", + "osm_id":57745741, + "attractiveness":21, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "16":{ + "name":"Musée Cognacq-Jay", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8581215, + 2.3616628 + ], + "osm_type":"way", + "osm_id":57781649, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "17":{ + "name":"Argonaute", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8945348, + 2.3895646 + ], + "osm_type":"way", + "osm_id":58169110, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "18":{ + "name":"Orangerie du Sénat", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8483243, + 2.3344262 + ], + "osm_type":"way", + "osm_id":62848404, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "19":{ + "name":"Les Réserves du Musée des Arts et Métiers", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9142687, + 2.3604902 + ], + "osm_type":"way", + "osm_id":63992928, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "20":{ + "name":"Musée Ernest-Hébert (en travaux)", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8473326, + 2.3227159 + ], + "osm_type":"way", + "osm_id":64314872, + "attractiveness":10, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "21":{ + "name":"Musée Nissim de Camondo", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8791676, + 2.3124361 + ], + "osm_type":"way", + "osm_id":68353844, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "22":{ + "name":"Musée Cernuschi", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8794667, + 2.312538 + ], + "osm_type":"way", + "osm_id":68353920, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "23":{ + "name":"Musée Jacquemart-André", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8755169, + 2.3105464 + ], + "osm_type":"way", + "osm_id":68804399, + "attractiveness":23, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "24":{ + "name":"Pagoda Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8767479, + 2.3077454 + ], + "osm_type":"way", + "osm_id":68828954, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "25":{ + "name":"Pavillon de Vendôme", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9047868, + 2.3038403 + ], + "osm_type":"way", + "osm_id":74468585, + "attractiveness":17, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "26":{ + "name":"Galerie des Gobelins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8348138, + 2.3528 + ], + "osm_type":"way", + "osm_id":78407170, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "27":{ + "name":"Musée Yves Saint Laurent Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8655978, + 2.2993165 + ], + "osm_type":"way", + "osm_id":79219238, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "28":{ + "name":"Musée d'Art Moderne de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8643053, + 2.297793 + ], + "osm_type":"way", + "osm_id":79219308, + "attractiveness":30, + "must_do":false, + "n_tags":30, + "time_to_reach":0 + }, + "29":{ + "name":"Fondation Cartier pour l'art contemporain", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8373189, + 2.3319319 + ], + "osm_type":"way", + "osm_id":79616736, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "30":{ + "name":"Centre Tignous d'Art Contemporain", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8567341, + 2.4270255 + ], + "osm_type":"way", + "osm_id":81767364, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "31":{ + "name":"Grande Galerie de l'Évolution", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8421181, + 2.3562418 + ], + "osm_type":"way", + "osm_id":83913793, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "32":{ + "name":"Musée national Jean-Jacques Henner", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8829326, + 2.3076157 + ], + "osm_type":"way", + "osm_id":84326105, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "33":{ + "name":"Musée de la Vie Romantique", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.881203, + 2.333519 + ], + "osm_type":"way", + "osm_id":84511123, + "attractiveness":22, + "must_do":false, + "n_tags":22, + "time_to_reach":0 + }, + "34":{ + "name":"Mémorial de la Shoah", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8548862, + 2.3560564 + ], + "osm_type":"way", + "osm_id":124052479, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "35":{ + "name":"Musée Zadkine", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8428133, + 2.3337722 + ], + "osm_type":"way", + "osm_id":153776401, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "36":{ + "name":"Musée de Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8880654, + 2.3406347 + ], + "osm_type":"way", + "osm_id":154679327, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "37":{ + "name":"Crypte Archéologique du Parvis Notre-Dame", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8535851, + 2.3480846 + ], + "osm_type":"way", + "osm_id":159896046, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "38":{ + "name":"Manufacture des Gobelins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8344502, + 2.3520875 + ], + "osm_type":"way", + "osm_id":161119956, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "39":{ + "name":"Musée du Luxembourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8485965, + 2.3340156 + ], + "osm_type":"way", + "osm_id":170226810, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "40":{ + "name":"Institut suédois", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.858226, + 2.3619639 + ], + "osm_type":"way", + "osm_id":243973065, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "41":{ + "name":"Musée national Eugène Delacroix", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8546662, + 2.3353836 + ], + "osm_type":"way", + "osm_id":395785603, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "42":{ + "name":"Géoroom", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8454453, + 2.4238848 + ], + "osm_type":"way", + "osm_id":541473683, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "43":{ + "name":"Musée des Moulages", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8721889, + 2.3681344 + ], + "osm_type":"way", + "osm_id":692817231, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "44":{ + "name":"Grand palais éphémère", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8531684, + 2.3024461 + ], + "osm_type":"way", + "osm_id":854459034, + "attractiveness":19, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "45":{ + "name":"Mémorial de Bobigny", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9095992, + 2.4295813 + ], + "osm_type":"way", + "osm_id":1236950476, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "46":{ + "name":"Hôtel de Sully", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.854635, + 2.3638126 + ], + "osm_type":"relation", + "osm_id":403146, + "attractiveness":14, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "47":{ + "name":"Fondation Henri Cartier-Bresson", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8632278, + 2.3598659 + ], + "osm_type":"relation", + "osm_id":551459, + "attractiveness":22, + "must_do":false, + "n_tags":22, + "time_to_reach":0 + }, + "48":{ + "name":"Hôtel de la Monnaie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.856403, + 2.3388625 + ], + "osm_type":"relation", + "osm_id":967664, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "49":{ + "name":"Musée Bourdelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8432078, + 2.3186583 + ], + "osm_type":"relation", + "osm_id":1212876, + "attractiveness":23, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "50":{ + "name":"Institut Giacometti", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8362008, + 2.3310708 + ], + "osm_type":"relation", + "osm_id":1213090, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "51":{ + "name":"Musée Carnavalet", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8576819, + 2.3627147 + ], + "osm_type":"relation", + "osm_id":2405955, + "attractiveness":25, + "must_do":false, + "n_tags":25, + "time_to_reach":0 + }, + "52":{ + "name":"Petit Palais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8660437, + 2.3149694 + ], + "osm_type":"relation", + "osm_id":2778854, + "attractiveness":37, + "must_do":false, + "n_tags":32, + "time_to_reach":0 + }, + "53":{ + "name":"Sainte-Chapelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8553966, + 2.3450136 + ], + "osm_type":"relation", + "osm_id":3344870, + "attractiveness":57, + "must_do":false, + "n_tags":54, + "time_to_reach":0 + }, + "54":{ + "name":"Musée du Louvre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8611474, + 2.3358637 + ], + "osm_type":"relation", + "osm_id":7515426, + "attractiveness":34, + "must_do":false, + "n_tags":33, + "time_to_reach":0 + }, + "55":{ + "name":"Champ de Mars", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.856163, + 2.2978311 + ], + "osm_type":"way", + "osm_id":4208595, + "attractiveness":38, + "must_do":false, + "n_tags":25, + "time_to_reach":0 + }, + "56":{ + "name":"Jardin des Plantes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8440393, + 2.3596915 + ], + "osm_type":"way", + "osm_id":4221369, + "attractiveness":33, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "57":{ + "name":"Jardin du Palais Royal", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8650062, + 2.3378176 + ], + "osm_type":"way", + "osm_id":4263203, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "58":{ + "name":"Panthéon", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8461887, + 2.3460786 + ], + "osm_type":"way", + "osm_id":16407465, + "attractiveness":38, + "must_do":false, + "n_tags":32, + "time_to_reach":0 + }, + "59":{ + "name":"Jardin Atlantique", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8398756, + 2.3189805 + ], + "osm_type":"way", + "osm_id":16923782, + "attractiveness":20, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "60":{ + "name":"Tour Saint-Jacques", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8579983, + 2.3489178 + ], + "osm_type":"way", + "osm_id":20326709, + "attractiveness":33, + "must_do":false, + "n_tags":31, + "time_to_reach":0 + }, + "61":{ + "name":"Basilique du Sacré-Cœur", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8867961, + 2.3430272 + ], + "osm_type":"way", + "osm_id":23762981, + "attractiveness":42, + "must_do":false, + "n_tags":40, + "time_to_reach":0 + }, + "62":{ + "name":"Collège des Bernardins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8488289, + 2.3520343 + ], + "osm_type":"way", + "osm_id":26584053, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "63":{ + "name":"Ancienne faisanderie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8452279, + 2.3593855 + ], + "osm_type":"way", + "osm_id":42332649, + "attractiveness":6, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "64":{ + "name":"Reptiles", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8457353, + 2.3592527 + ], + "osm_type":"way", + "osm_id":42332651, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "65":{ + "name":"Église Saint-Roch", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8653817, + 2.3326659 + ], + "osm_type":"way", + "osm_id":42722202, + "attractiveness":26, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "66":{ + "name":"Hôtel Lebrun", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8468374, + 2.3526504 + ], + "osm_type":"way", + "osm_id":43020667, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "67":{ + "name":"Pont Neuf", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8565248, + 2.3408132 + ], + "osm_type":"way", + "osm_id":53574149, + "attractiveness":16, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "68":{ + "name":"Pont Neuf", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8578047, + 2.3419414 + ], + "osm_type":"way", + "osm_id":53574164, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "69":{ + "name":"Comédie Française", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8635374, + 2.336193 + ], + "osm_type":"way", + "osm_id":54053052, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "70":{ + "name":"Fontaine Molière", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8654941, + 2.336613 + ], + "osm_type":"way", + "osm_id":54097804, + "attractiveness":10, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "71":{ + "name":"Place Vendôme", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8674726, + 2.3294385 + ], + "osm_type":"way", + "osm_id":54175774, + "attractiveness":11, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "72":{ + "name":"Église de la Madeleine", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8700303, + 2.3244833 + ], + "osm_type":"way", + "osm_id":54180046, + "attractiveness":33, + "must_do":false, + "n_tags":33, + "time_to_reach":0 + }, + "73":{ + "name":"Opéra Garnier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8720294, + 2.3317281 + ], + "osm_type":"way", + "osm_id":54667456, + "attractiveness":26, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "74":{ + "name":"Hôtel de Lauzun", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.851565, + 2.3589627 + ], + "osm_type":"way", + "osm_id":55292128, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "75":{ + "name":"Presbytère", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8463617, + 2.3488355 + ], + "osm_type":"way", + "osm_id":55341527, + "attractiveness":17, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "76":{ + "name":"Centre Georges Pompidou", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8605235, + 2.3524395 + ], + "osm_type":"way", + "osm_id":55503397, + "attractiveness":43, + "must_do":false, + "n_tags":43, + "time_to_reach":0 + }, + "77":{ + "name":"Immeuble Henri Sauvage", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8436578, + 2.3298104 + ], + "osm_type":"way", + "osm_id":63711049, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "78":{ + "name":"Rotonde de la Villette", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8834633, + 2.3695457 + ], + "osm_type":"way", + "osm_id":63971487, + "attractiveness":15, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "79":{ + "name":"Cathédrale Saint-Louis des Invalides", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8556038, + 2.3125832 + ], + "osm_type":"way", + "osm_id":64955027, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "80":{ + "name":"Paris Story", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8723873, + 2.3305146 + ], + "osm_type":"way", + "osm_id":69226411, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "81":{ + "name":"Maison de Tristan Tzara", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8880392, + 2.3356771 + ], + "osm_type":"way", + "osm_id":77780351, + "attractiveness":19, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "82":{ + "name":"Moulin de la Galette", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8876533, + 2.336297 + ], + "osm_type":"way", + "osm_id":77780940, + "attractiveness":17, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "83":{ + "name":"Vigne du Clos Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8882459, + 2.3402042 + ], + "osm_type":"way", + "osm_id":77784652, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "84":{ + "name":"Piscine des Amiraux", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8943494, + 2.3510361 + ], + "osm_type":"way", + "osm_id":78020880, + "attractiveness":20, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "85":{ + "name":"Les Docks - Cité de la Mode et du Design", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8408136, + 2.3699923 + ], + "osm_type":"way", + "osm_id":78535563, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "86":{ + "name":"Grande Volière", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8447239, + 2.3589567 + ], + "osm_type":"way", + "osm_id":83976054, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "87":{ + "name":"École Militaire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8518517, + 2.3048526 + ], + "osm_type":"way", + "osm_id":106312008, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "88":{ + "name":"Église du Dôme", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8550021, + 2.3125391 + ], + "osm_type":"way", + "osm_id":112452790, + "attractiveness":25, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "89":{ + "name":"Grande cascade", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8796564, + 2.3837284 + ], + "osm_type":"way", + "osm_id":125420674, + "attractiveness":3, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "90":{ + "name":"Jardin du Luxembourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8467137, + 2.3363649 + ], + "osm_type":"way", + "osm_id":128206209, + "attractiveness":35, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "91":{ + "name":"Jardin Catherine Labouré", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8510562, + 2.320532 + ], + "osm_type":"way", + "osm_id":148481812, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "92":{ + "name":"École nationale supérieure des beaux-arts", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8571292, + 2.3338015 + ], + "osm_type":"way", + "osm_id":148485612, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "93":{ + "name":"Carrousel de Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8846882, + 2.3432257 + ], + "osm_type":"way", + "osm_id":163689495, + "attractiveness":11, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "94":{ + "name":"Assemblée nationale", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8617532, + 2.317959 + ], + "osm_type":"way", + "osm_id":175448742, + "attractiveness":19, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "95":{ + "name":"Bateaux-Mouches", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.863978, + 2.3058261 + ], + "osm_type":"way", + "osm_id":182821008, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "96":{ + "name":"Cathédrale Notre-Dame de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8529372, + 2.3498701 + ], + "osm_type":"way", + "osm_id":201611261, + "attractiveness":55, + "must_do":false, + "n_tags":54, + "time_to_reach":0 + }, + "97":{ + "name":"Arc de Triomphe du Carrousel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8617276, + 2.3329082 + ], + "osm_type":"way", + "osm_id":227483542, + "attractiveness":16, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "98":{ + "name":"Théâtre équestre Zingaro", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9126799, + 2.4030614 + ], + "osm_type":"way", + "osm_id":244847783, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "99":{ + "name":"Rue du Mont Cenis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8878142, + 2.3416721 + ], + "osm_type":"way", + "osm_id":246993053, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "100":{ + "name":"Cavae des Arènes de Lutèce", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8450776, + 2.352912 + ], + "osm_type":"way", + "osm_id":406229046, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "101":{ + "name":"Méridienne de l'Observatoire de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8365027, + 2.336524 + ], + "osm_type":"way", + "osm_id":515068430, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "102":{ + "name":"Passerelle Mornay", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8492111, + 2.3671376 + ], + "osm_type":"way", + "osm_id":568554914, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "103":{ + "name":"Rue du Mont Cenis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8879175, + 2.3417144 + ], + "osm_type":"way", + "osm_id":897673778, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "104":{ + "name":"Labyrinthe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8353618, + 2.3817702 + ], + "osm_type":"way", + "osm_id":1087988490, + "attractiveness":7, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "105":{ + "name":"Maison à l'enseigne du Faucheur", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8558553, + 2.3568266 + ], + "osm_type":"way", + "osm_id":1123456865, + "attractiveness":13, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "106":{ + "name":"Maison à l'enseigne du Mouton", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8558431, + 2.3568914 + ], + "osm_type":"way", + "osm_id":1123456866, + "attractiveness":13, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "107":{ + "name":"Batman Escape", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8966537, + 2.3889026 + ], + "osm_type":"way", + "osm_id":1242464921, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "108":{ + "name":"Shuffled", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8964051, + 2.3885577 + ], + "osm_type":"way", + "osm_id":1242464922, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "109":{ + "name":"Quiz Room", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8960863, + 2.3889322 + ], + "osm_type":"way", + "osm_id":1242464924, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "110":{ + "name":"Les Grandes Serres du Jardin des Plantes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.84301, + 2.3567734 + ], + "osm_type":"way", + "osm_id":1288442711, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "111":{ + "name":"Palais de Justice de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8556537, + 2.3446072 + ], + "osm_type":"relation", + "osm_id":536982, + "attractiveness":24, + "must_do":false, + "n_tags":24, + "time_to_reach":0 + }, + "112":{ + "name":"Palais de l'Élysée", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8703766, + 2.3166056 + ], + "osm_type":"relation", + "osm_id":1060803, + "attractiveness":32, + "must_do":false, + "n_tags":32, + "time_to_reach":0 + }, + "113":{ + "name":"Hôtel de la Marine", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8669318, + 2.323065 + ], + "osm_type":"relation", + "osm_id":1060822, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "114":{ + "name":"Hôtel des Invalides", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8559525, + 2.3125541 + ], + "osm_type":"relation", + "osm_id":1463538, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "115":{ + "name":"Rotonde de Chartres", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8802542, + 2.3090835 + ], + "osm_type":"relation", + "osm_id":3066029, + "attractiveness":14, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "116":{ + "name":"La Samaritaine", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8592672, + 2.3424349 + ], + "osm_type":"relation", + "osm_id":3075632, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "117":{ + "name":"Palais du Louvre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8614768, + 2.3351677 + ], + "osm_type":"relation", + "osm_id":3262297, + "attractiveness":32, + "must_do":false, + "n_tags":32, + "time_to_reach":0 + }, + "118":{ + "name":"Hôtel de Soubise", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8603506, + 2.3576045 + ], + "osm_type":"relation", + "osm_id":3371164, + "attractiveness":12, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "119":{ + "name":"Mémorial des Martyrs de la Déportation", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8517365, + 2.3524734 + ], + "osm_type":"relation", + "osm_id":9396191, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "120":{ + "name":"Galerie J. Kugel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8616442, + 2.3214268 + ], + "osm_type":"way", + "osm_id":63564054, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "121":{ + "name":"Galerie Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8862806, + 2.3406794 + ], + "osm_type":"way", + "osm_id":70716925, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "122":{ + "name":"Cinémathèque Française", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.837002, + 2.3826461 + ], + "osm_type":"way", + "osm_id":78271385, + "attractiveness":26, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "123":{ + "name":"Espace Louise Michel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8717602, + 2.3914301 + ], + "osm_type":"way", + "osm_id":389174690, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "124":{ + "name":"Galerie Jeanne Bucher", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8548334, + 2.3372317 + ], + "osm_type":"way", + "osm_id":563066953, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "125":{ + "name":"Galerie Lara Vincy", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8551889, + 2.3371175 + ], + "osm_type":"relation", + "osm_id":1401754, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "126":{ + "name":"Pont Alexandre III", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8636423, + 2.3135438 + ], + "osm_type":"way", + "osm_id":17067006, + "attractiveness":20, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "127":{ + "name":"Passage Brady", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8716134, + 2.3537153 + ], + "osm_type":"way", + "osm_id":29709952, + "attractiveness":15, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "128":{ + "name":"Fort de Romainville", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8858276, + 2.4235273 + ], + "osm_type":"way", + "osm_id":38767074, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "129":{ + "name":"Cabinet d'Histoire (Hôtel de Magny)", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8438711, + 2.3567387 + ], + "osm_type":"way", + "osm_id":42332581, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "130":{ + "name":"Fontaine des Innocents", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8606368, + 2.3480233 + ], + "osm_type":"way", + "osm_id":52469222, + "attractiveness":16, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "131":{ + "name":"Ministère de la Justice", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8677422, + 2.3283905 + ], + "osm_type":"way", + "osm_id":54175265, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "132":{ + "name":"Hôtel Saint-Florentin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8667066, + 2.3240813 + ], + "osm_type":"way", + "osm_id":54177935, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "133":{ + "name":"Palais Brongniart", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8691399, + 2.3413669 + ], + "osm_type":"way", + "osm_id":54657155, + "attractiveness":19, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "134":{ + "name":"Théâtre Daunou", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8692654, + 2.3318641 + ], + "osm_type":"way", + "osm_id":54730662, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "135":{ + "name":"Hôtel de Sens", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8535257, + 2.3588733 + ], + "osm_type":"way", + "osm_id":55541122, + "attractiveness":21, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "136":{ + "name":"Hôtel d'Ourscamp", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8555465, + 2.3571206 + ], + "osm_type":"way", + "osm_id":55620201, + "attractiveness":10, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "137":{ + "name":"Pavillon Curie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8442282, + 2.3447813 + ], + "osm_type":"way", + "osm_id":56066139, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "138":{ + "name":"Gustave Flaubert", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8461321, + 2.3392722 + ], + "osm_type":"way", + "osm_id":62874967, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "139":{ + "name":"Charles Baudelaire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8445903, + 2.3347138 + ], + "osm_type":"way", + "osm_id":62874970, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "140":{ + "name":"Regard des Maussins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8775024, + 2.4070003 + ], + "osm_type":"way", + "osm_id":63224543, + "attractiveness":13, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "141":{ + "name":"Temple de la Sybille", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8810739, + 2.3830756 + ], + "osm_type":"way", + "osm_id":63224946, + "attractiveness":7, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "142":{ + "name":"Hôtel de Beauharnais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8609496, + 2.3223731 + ], + "osm_type":"way", + "osm_id":63564160, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "143":{ + "name":"Hôtel de Seignelay", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8611599, + 2.3218256 + ], + "osm_type":"way", + "osm_id":63564188, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "144":{ + "name":"Statue du Maréchal Ney", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8400358, + 2.3363445 + ], + "osm_type":"way", + "osm_id":63844704, + "attractiveness":15, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "145":{ + "name":"Statue de Gribeauval", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8567922, + 2.3117336 + ], + "osm_type":"way", + "osm_id":64955010, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "146":{ + "name":"Restaurant Inter-administratif de La Tour-Maubourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8569213, + 2.3106008 + ], + "osm_type":"way", + "osm_id":64955021, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "147":{ + "name":"Hôtel de Broglie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8594578, + 2.3186134 + ], + "osm_type":"way", + "osm_id":65090089, + "attractiveness":14, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "148":{ + "name":"Hôtel de Choiseul-Praslin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8478008, + 2.3203873 + ], + "osm_type":"way", + "osm_id":65756922, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "149":{ + "name":"Hôtel Perrinet de Jars", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8689989, + 2.3198424 + ], + "osm_type":"way", + "osm_id":67106925, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "150":{ + "name":"Hôtel de Coislin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8671412, + 2.3219906 + ], + "osm_type":"way", + "osm_id":67109756, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "151":{ + "name":"Hôtel de Marigny", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8706645, + 2.3152357 + ], + "osm_type":"way", + "osm_id":67356259, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "152":{ + "name":"Statue équestre de Jeanne D'Arc", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8754445, + 2.3194466 + ], + "osm_type":"way", + "osm_id":67501479, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "153":{ + "name":"Chapelle expiatoire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.873695, + 2.3227605 + ], + "osm_type":"way", + "osm_id":67557301, + "attractiveness":27, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "154":{ + "name":"Ambroise Thomas", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8793316, + 2.3098167 + ], + "osm_type":"way", + "osm_id":68335779, + "attractiveness":12, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "155":{ + "name":"Charles Gounod", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8790161, + 2.3096819 + ], + "osm_type":"way", + "osm_id":68335800, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "156":{ + "name":"Statue de Jules Simon", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8765636, + 2.3181311 + ], + "osm_type":"way", + "osm_id":68507719, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "157":{ + "name":"Hôtel Biron", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8553042, + 2.3158567 + ], + "osm_type":"way", + "osm_id":68568682, + "attractiveness":13, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "158":{ + "name":"Hôtel de Boisgelin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8542063, + 2.3220164 + ], + "osm_type":"way", + "osm_id":68571250, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "159":{ + "name":"Hôtel de Cassini", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8519819, + 2.3209847 + ], + "osm_type":"way", + "osm_id":68571376, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "160":{ + "name":"Monument aux morts de la guerre de 1870", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8508444, + 2.3060662 + ], + "osm_type":"way", + "osm_id":68906600, + "attractiveness":5, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "161":{ + "name":"Lucien Guitry", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8575685, + 2.2987061 + ], + "osm_type":"way", + "osm_id":69034522, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "162":{ + "name":"foyer de l'Union chrétienne des Jeunes Gens de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8735161, + 2.3455333 + ], + "osm_type":"way", + "osm_id":69220148, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "163":{ + "name":"Jules Ferry", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8637034, + 2.3311345 + ], + "osm_type":"way", + "osm_id":69289019, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "164":{ + "name":"Monument de la reconnaissance de la Belgique à la France", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8649226, + 2.3029298 + ], + "osm_type":"way", + "osm_id":69325365, + "attractiveness":6, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "165":{ + "name":"Synagogue Buffault", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8761054, + 2.3425466 + ], + "osm_type":"way", + "osm_id":69417432, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "166":{ + "name":"Regard Saint-Martin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8714699, + 2.3914759 + ], + "osm_type":"way", + "osm_id":70001651, + "attractiveness":14, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "167":{ + "name":"Regard de la Prise des Eaux du Pré Saint-Gervais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8830678, + 2.4035516 + ], + "osm_type":"way", + "osm_id":73248961, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "168":{ + "name":"Monument aux Morts", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8824789, + 2.4117533 + ], + "osm_type":"way", + "osm_id":73429126, + "attractiveness":3, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "169":{ + "name":"Château de Saint-Ouen", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9165342, + 2.3295132 + ], + "osm_type":"way", + "osm_id":73835424, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "170":{ + "name":"Maison du Peuple", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9013075, + 2.3146603 + ], + "osm_type":"way", + "osm_id":74472720, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "171":{ + "name":"Église Saint-Michel des Batignolles", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8890756, + 2.3246346 + ], + "osm_type":"way", + "osm_id":75748771, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "172":{ + "name":"Buste de Frédérick Lemaître", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8689148, + 2.3671974 + ], + "osm_type":"way", + "osm_id":76910105, + "attractiveness":12, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "173":{ + "name":"Barrière du Trône - Philippe Auguste", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8479768, + 2.3984297 + ], + "osm_type":"way", + "osm_id":77385192, + "attractiveness":15, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "174":{ + "name":"Lafayette", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8644688, + 2.3118747 + ], + "osm_type":"way", + "osm_id":77441324, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "175":{ + "name":"Sir Winston Churchill", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8652836, + 2.313998 + ], + "osm_type":"way", + "osm_id":77441386, + "attractiveness":10, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "176":{ + "name":"Chapelle Saint-Louis de la Salpêtrière", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8389393, + 2.3641414 + ], + "osm_type":"way", + "osm_id":78535716, + "attractiveness":19, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "177":{ + "name":"Buste de Johann Strauss", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8685147, + 2.359769 + ], + "osm_type":"way", + "osm_id":78548940, + "attractiveness":8, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "178":{ + "name":"Buste du Baron Taylor", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8684152, + 2.3602387 + ], + "osm_type":"way", + "osm_id":78548956, + "attractiveness":7, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "179":{ + "name":"Maison du Fontainier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8371365, + 2.3361474 + ], + "osm_type":"way", + "osm_id":79611339, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "180":{ + "name":"Laboratoire de Marie Curie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8445397, + 2.3557684 + ], + "osm_type":"way", + "osm_id":83976060, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "181":{ + "name":"Théophile Roussel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8381304, + 2.336329 + ], + "osm_type":"way", + "osm_id":87334030, + "attractiveness":6, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "182":{ + "name":"Albert Ier de Belgique", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8646042, + 2.3182703 + ], + "osm_type":"way", + "osm_id":92316083, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "183":{ + "name":"Hommage à Komitas et aux victimes du Génocide arménien", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8644161, + 2.3098206 + ], + "osm_type":"way", + "osm_id":92316090, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "184":{ + "name":"Monument à Barye", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8500715, + 2.3596846 + ], + "osm_type":"way", + "osm_id":92316091, + "attractiveness":6, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "185":{ + "name":"Flamme de la Liberté", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8641848, + 2.3008761 + ], + "osm_type":"way", + "osm_id":92316094, + "attractiveness":21, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "186":{ + "name":"Enceinte de Philippe Auguste", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8457554, + 2.3498529 + ], + "osm_type":"way", + "osm_id":92316120, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "187":{ + "name":"Statue de Frémiet", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8435606, + 2.3640026 + ], + "osm_type":"way", + "osm_id":95475832, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "188":{ + "name":"Jeanne d'Arc", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8638791, + 2.332187 + ], + "osm_type":"way", + "osm_id":96156233, + "attractiveness":16, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "189":{ + "name":"Passage Brady", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8708984, + 2.3564843 + ], + "osm_type":"way", + "osm_id":111652423, + "attractiveness":13, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "190":{ + "name":"Passage Brady", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8714268, + 2.3544455 + ], + "osm_type":"way", + "osm_id":111652425, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "191":{ + "name":"Passage Brady", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.871183, + 2.3553029 + ], + "osm_type":"way", + "osm_id":111652428, + "attractiveness":15, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "192":{ + "name":"Le Triomphe de la République", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8483868, + 2.3959148 + ], + "osm_type":"way", + "osm_id":114877477, + "attractiveness":15, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "193":{ + "name":"Alfred de Musset - Le Rêve du Poète", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8652022, + 2.3106561 + ], + "osm_type":"way", + "osm_id":115310616, + "attractiveness":7, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "194":{ + "name":"Le Jardin des Souvenirs", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8392848, + 2.3243192 + ], + "osm_type":"way", + "osm_id":116797447, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "195":{ + "name":"Hôtel de Bourvallais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.868132, + 2.3278504 + ], + "osm_type":"way", + "osm_id":148573267, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "196":{ + "name":"Couvent des Cordelières", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8346857, + 2.3474291 + ], + "osm_type":"way", + "osm_id":154161345, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "197":{ + "name":"Enceinte de Charles V", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8496798, + 2.3669734 + ], + "osm_type":"way", + "osm_id":159220788, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "198":{ + "name":"La Naissance des formes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8394586, + 2.3300121 + ], + "osm_type":"way", + "osm_id":169987897, + "attractiveness":11, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "199":{ + "name":"Hôtel de Lassay", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8621594, + 2.317297 + ], + "osm_type":"way", + "osm_id":175448743, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "200":{ + "name":"Pelletier et Caventou", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8440542, + 2.3391841 + ], + "osm_type":"way", + "osm_id":182697269, + "attractiveness":9, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "201":{ + "name":"Monument à Eugène Flachat", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8869533, + 2.3007728 + ], + "osm_type":"way", + "osm_id":208763266, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "202":{ + "name":"Chapelle Notre-Dame-des-Anges", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8462836, + 2.3235558 + ], + "osm_type":"way", + "osm_id":219378497, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "203":{ + "name":"Fontaine du Palmier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8575005, + 2.3472864 + ], + "osm_type":"way", + "osm_id":261092850, + "attractiveness":23, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "204":{ + "name":"Élisabeth Alexandrovna Stroganoff", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8595742, + 2.3949387 + ], + "osm_type":"way", + "osm_id":267099784, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "205":{ + "name":"Félix de Beaujour", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8631336, + 2.3933669 + ], + "osm_type":"way", + "osm_id":312059802, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "206":{ + "name":"Héloïse et Abélard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8591931, + 2.391914 + ], + "osm_type":"way", + "osm_id":313811735, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "207":{ + "name":"René Panhard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8583882, + 2.3956719 + ], + "osm_type":"way", + "osm_id":314136876, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "208":{ + "name":"Gradins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8452977, + 2.3525509 + ], + "osm_type":"way", + "osm_id":406229048, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "209":{ + "name":"Gradins", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8448391, + 2.352799 + ], + "osm_type":"way", + "osm_id":406229049, + "attractiveness":3, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "210":{ + "name":"Monument commémoratif de la campagne de Tunisie 1942-1943", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8626695, + 2.3065038 + ], + "osm_type":"way", + "osm_id":427592604, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "211":{ + "name":"Hôtel du ministre des Affaires étrangères", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8622524, + 2.3161364 + ], + "osm_type":"way", + "osm_id":448794899, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "212":{ + "name":"Aqueduc de la Dhuis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8823637, + 2.4664022 + ], + "osm_type":"way", + "osm_id":511817523, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "213":{ + "name":"Aqueduc Médicis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8330712, + 2.3347603 + ], + "osm_type":"way", + "osm_id":755054078, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "214":{ + "name":"Eugène Carrière", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8894615, + 2.3372122 + ], + "osm_type":"way", + "osm_id":868154414, + "attractiveness":3, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "215":{ + "name":"Folie Janvier N8", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8904535, + 2.392291 + ], + "osm_type":"way", + "osm_id":869111628, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "216":{ + "name":"Folie douce N7", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8913598, + 2.3913515 + ], + "osm_type":"way", + "osm_id":869111631, + "attractiveness":3, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "217":{ + "name":"Colonne Médicis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8625255, + 2.3429926 + ], + "osm_type":"way", + "osm_id":942543401, + "attractiveness":15, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "218":{ + "name":"Casimir Périer", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8600309, + 2.3936438 + ], + "osm_type":"way", + "osm_id":948640834, + "attractiveness":7, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "219":{ + "name":"Tour Montgomery", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8540767, + 2.3607517 + ], + "osm_type":"way", + "osm_id":1029627185, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "220":{ + "name":"Monument bombardement", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9128785, + 2.3392332 + ], + "osm_type":"way", + "osm_id":1087597077, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "221":{ + "name":"Passage Brady", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8710466, + 2.3559617 + ], + "osm_type":"way", + "osm_id":1194238628, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "222":{ + "name":"Famille Boucicaut", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8396133, + 2.3274421 + ], + "osm_type":"way", + "osm_id":1197780546, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "223":{ + "name":"Famille Gautier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8391596, + 2.3267588 + ], + "osm_type":"way", + "osm_id":1197815660, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "224":{ + "name":"Famille Levrat", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8389995, + 2.3266301 + ], + "osm_type":"way", + "osm_id":1197815662, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "225":{ + "name":"Honore Champion", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8388004, + 2.3263708 + ], + "osm_type":"way", + "osm_id":1197824735, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "226":{ + "name":"Famille Raspail", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8386871, + 2.3267555 + ], + "osm_type":"way", + "osm_id":1197824736, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "227":{ + "name":"leon Cinain 1826-1898", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8386236, + 2.3268642 + ], + "osm_type":"way", + "osm_id":1197824741, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "228":{ + "name":"Famille Valentin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8383689, + 2.3269937 + ], + "osm_type":"way", + "osm_id":1197824742, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "229":{ + "name":"Alex Berdal", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8379043, + 2.3267576 + ], + "osm_type":"way", + "osm_id":1197824743, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "230":{ + "name":"François Gérard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8378264, + 2.3266232 + ], + "osm_type":"way", + "osm_id":1197824744, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "231":{ + "name":"Alexandre Duval", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8376084, + 2.3255649 + ], + "osm_type":"way", + "osm_id":1197824749, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "232":{ + "name":"Famille Lormand", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8377157, + 2.3245734 + ], + "osm_type":"way", + "osm_id":1197824751, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "233":{ + "name":"Famille Cohen Jonathan", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8372213, + 2.325048 + ], + "osm_type":"way", + "osm_id":1197824752, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "234":{ + "name":"Famille Reville", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8391171, + 2.3267211 + ], + "osm_type":"way", + "osm_id":1197824760, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "235":{ + "name":"Henri Langlois", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.839361, + 2.3268349 + ], + "osm_type":"way", + "osm_id":1197824761, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "236":{ + "name":"ROITEL ROSSIGNOL CHAVONNET", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8633785, + 2.3910919 + ], + "osm_type":"way", + "osm_id":1210561856, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "237":{ + "name":"Miłosz Magin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8596959, + 2.3928033 + ], + "osm_type":"way", + "osm_id":1210797361, + "attractiveness":8, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "238":{ + "name":"Hyacinthe Loyson", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8607659, + 2.3942863 + ], + "osm_type":"way", + "osm_id":1210797368, + "attractiveness":7, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "239":{ + "name":"Louis Joseph Gay-Lussac", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8606664, + 2.3946804 + ], + "osm_type":"way", + "osm_id":1210797381, + "attractiveness":8, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "240":{ + "name":"Alphonse Daudet", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8601739, + 2.3953057 + ], + "osm_type":"way", + "osm_id":1210797385, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "241":{ + "name":"Gaspard Monge", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8603102, + 2.3936584 + ], + "osm_type":"way", + "osm_id":1211895435, + "attractiveness":11, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "242":{ + "name":"Famille Mure", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.85862, + 2.3933043 + ], + "osm_type":"way", + "osm_id":1211901758, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "243":{ + "name":"Famille Chalier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8621379, + 2.3894202 + ], + "osm_type":"way", + "osm_id":1212094025, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "244":{ + "name":"Mémorial de l'ancienne Gare de Déportation de Bobigny", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9105038, + 2.429875 + ], + "osm_type":"way", + "osm_id":1236950477, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "245":{ + "name":"Hôtel de Gillier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8518195, + 2.3583351 + ], + "osm_type":"relation", + "osm_id":554046, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "246":{ + "name":"Hôtel Lambert", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8509959, + 2.359633 + ], + "osm_type":"relation", + "osm_id":554060, + "attractiveness":15, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "247":{ + "name":"Noviciat des Dominicains", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8561352, + 2.3284496 + ], + "osm_type":"relation", + "osm_id":1002118, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "248":{ + "name":"Hôtel de Crillon", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8676142, + 2.3213457 + ], + "osm_type":"relation", + "osm_id":1060804, + "attractiveness":19, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "249":{ + "name":"Hôtel de Plessis-Bellière", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8673773, + 2.3216352 + ], + "osm_type":"relation", + "osm_id":1060806, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "250":{ + "name":"Hôtel de Matignon", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8544393, + 2.320661 + ], + "osm_type":"relation", + "osm_id":1076880, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "251":{ + "name":"Hôtel de la Païva", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8691584, + 2.3075317 + ], + "osm_type":"relation", + "osm_id":1086118, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "252":{ + "name":"Hôtel Gaillard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8817972, + 2.3105214 + ], + "osm_type":"relation", + "osm_id":1261334, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "253":{ + "name":"Ligne de Petite Ceinture", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8597838, + 2.3341775 + ], + "osm_type":"relation", + "osm_id":1536589, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "254":{ + "name":"Châtelet du Château de Vincennes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8426709, + 2.4347268 + ], + "osm_type":"relation", + "osm_id":1559341, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "255":{ + "name":"Aqueduc de la Dhuis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9609906, + 2.9839389 + ], + "osm_type":"relation", + "osm_id":1599153, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "256":{ + "name":"Porte Saint-Denis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8697934, + 2.3526868 + ], + "osm_type":"relation", + "osm_id":3170072, + "attractiveness":21, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "257":{ + "name":"Hôpital Saint-Louis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8733451, + 2.3678812 + ], + "osm_type":"relation", + "osm_id":10714750, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "258":{ + "name":"Voie Romaine Paris -Dreux", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.7963521, + 1.8559602 + ], + "osm_type":"relation", + "osm_id":15488534, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "259":{ + "name":"Église Saint-Séverin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8520913, + 2.3457237 + ], + "osm_type":"way", + "osm_id":19740659, + "attractiveness":15, + "must_do":false, + "n_tags":25, + "time_to_reach":0 + }, + "260":{ + "name":"Église Saint-Pierre de Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8867199, + 2.3420645 + ], + "osm_type":"way", + "osm_id":23884336, + "attractiveness":8, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "261":{ + "name":"Église Notre-Dame de l'Arche d'Alliance", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8366689, + 2.3085491 + ], + "osm_type":"way", + "osm_id":24303512, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "262":{ + "name":"Église Notre-Dame-de-Lorette", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8764338, + 2.3389235 + ], + "osm_type":"way", + "osm_id":25688622, + "attractiveness":12, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "263":{ + "name":"Église Notre-Dame de Clignancourt", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.89314, + 2.3450441 + ], + "osm_type":"way", + "osm_id":36855293, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "264":{ + "name":"Synagogue de la rue Sainte-Isaure", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8936801, + 2.3438876 + ], + "osm_type":"way", + "osm_id":41506069, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "265":{ + "name":"Synagogue Chivté Israël", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8433943, + 2.3866038 + ], + "osm_type":"way", + "osm_id":42311107, + "attractiveness":3, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "266":{ + "name":"Église Sainte-Hélène", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8965278, + 2.342435 + ], + "osm_type":"way", + "osm_id":48974965, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "267":{ + "name":"Église de la Sainte-Trinité", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8773025, + 2.3313881 + ], + "osm_type":"way", + "osm_id":49872150, + "attractiveness":11, + "must_do":false, + "n_tags":19, + "time_to_reach":0 + }, + "268":{ + "name":"Église Saint-Leu - Saint-Gilles", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8628813, + 2.3500683 + ], + "osm_type":"way", + "osm_id":53933240, + "attractiveness":14, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "269":{ + "name":"Basilique Notre-Dame-des-Victoires", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8667853, + 2.3409551 + ], + "osm_type":"way", + "osm_id":54661742, + "attractiveness":14, + "must_do":false, + "n_tags":24, + "time_to_reach":0 + }, + "270":{ + "name":"Église Notre-Dame-de-Bonne-Nouvelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8695324, + 2.3500407 + ], + "osm_type":"way", + "osm_id":55178129, + "attractiveness":13, + "must_do":false, + "n_tags":22, + "time_to_reach":0 + }, + "271":{ + "name":"Église Saint-Louis-en-l'Île", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8512802, + 2.3575796 + ], + "osm_type":"way", + "osm_id":55314295, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "272":{ + "name":"Église Saint-Étienne-du-Mont", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8465485, + 2.3480584 + ], + "osm_type":"way", + "osm_id":55343672, + "attractiveness":16, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "273":{ + "name":"Église Orthodoxe Roumaine des Saints Archanges", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.849488, + 2.3471975 + ], + "osm_type":"way", + "osm_id":55366403, + "attractiveness":10, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "274":{ + "name":"Église Saint-Merri", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8590777, + 2.3508448 + ], + "osm_type":"way", + "osm_id":55742120, + "attractiveness":16, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "275":{ + "name":"Temple du Marais", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8533048, + 2.3662365 + ], + "osm_type":"way", + "osm_id":56206112, + "attractiveness":11, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "276":{ + "name":"Église Sainte-Elisabeth", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8661005, + 2.3605378 + ], + "osm_type":"way", + "osm_id":56457505, + "attractiveness":11, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "277":{ + "name":"Synagogue Vauquelin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8410205, + 2.3476178 + ], + "osm_type":"way", + "osm_id":56693739, + "attractiveness":3, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "278":{ + "name":"Chapelle de la congrégation du Saint-Esprit", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8428826, + 2.34671 + ], + "osm_type":"way", + "osm_id":56771095, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "279":{ + "name":"Maison Fraternelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8422143, + 2.3484675 + ], + "osm_type":"way", + "osm_id":57380517, + "attractiveness":3, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "280":{ + "name":"Église du Val-de-Grâce", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8405269, + 2.3419263 + ], + "osm_type":"way", + "osm_id":59846865, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "281":{ + "name":"Église Notre-Dame-des-Vertus", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9145379, + 2.3826684 + ], + "osm_type":"way", + "osm_id":61981374, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "282":{ + "name":"Église Saint-Ouen", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9189423, + 2.3315386 + ], + "osm_type":"way", + "osm_id":62003063, + "attractiveness":9, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "283":{ + "name":"Église Saint-Germain des Prés", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8539667, + 2.334463 + ], + "osm_type":"way", + "osm_id":62287173, + "attractiveness":12, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "284":{ + "name":"Chapelle Notre-Dame de la Sagesse", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8356931, + 2.3735362 + ], + "osm_type":"way", + "osm_id":62379741, + "attractiveness":11, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "285":{ + "name":"Église Evangélique Baptiste", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8588762, + 2.3292649 + ], + "osm_type":"way", + "osm_id":63149138, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "286":{ + "name":"Église Saint-Laurent", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.874774, + 2.3583086 + ], + "osm_type":"way", + "osm_id":63200612, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "287":{ + "name":"Chapelle de l'hôpital Saint-Louis", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8740835, + 2.3661993 + ], + "osm_type":"way", + "osm_id":63200644, + "attractiveness":11, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "288":{ + "name":"Église Saint-Joseph-Artisan", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8813655, + 2.3677357 + ], + "osm_type":"way", + "osm_id":63203063, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "289":{ + "name":"Église Saint-Jean-Baptiste de Belleville", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8756563, + 2.3893068 + ], + "osm_type":"way", + "osm_id":63212231, + "attractiveness":15, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "290":{ + "name":"Synagogue Michkenot Israël", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8825966, + 2.3733068 + ], + "osm_type":"way", + "osm_id":63212274, + "attractiveness":3, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "291":{ + "name":"Église Notre-Dame-de-l'Assomption des Buttes-Chaumont", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8840257, + 2.3785052 + ], + "osm_type":"way", + "osm_id":63213611, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "292":{ + "name":"Église Sainte-Claire d'Assise", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8888017, + 2.3950208 + ], + "osm_type":"way", + "osm_id":63234079, + "attractiveness":9, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "293":{ + "name":"Temple Antoiniste", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.878948, + 2.3975957 + ], + "osm_type":"way", + "osm_id":63234870, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "294":{ + "name":"Église Saint-Serge", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8833592, + 2.3837675 + ], + "osm_type":"way", + "osm_id":63237639, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "295":{ + "name":"Église Saint-Joseph des Carmes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8485199, + 2.3302805 + ], + "osm_type":"way", + "osm_id":63370983, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "296":{ + "name":"Mosquée Omar bn El Khattab", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8679659, + 2.3772772 + ], + "osm_type":"way", + "osm_id":63638391, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "297":{ + "name":"Église Réformée du Luxembourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8474963, + 2.3314096 + ], + "osm_type":"way", + "osm_id":63681841, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "298":{ + "name":"Église Saint-Jean-des-Grésillons", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9189774, + 2.3003288 + ], + "osm_type":"way", + "osm_id":63957950, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "299":{ + "name":"Église Sainte-Geneviève", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9082792, + 2.3574826 + ], + "osm_type":"way", + "osm_id":63982213, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "300":{ + "name":"Église Saint-Jacques Saint-Christophe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8892855, + 2.3797641 + ], + "osm_type":"way", + "osm_id":64037954, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "301":{ + "name":"Église Notre-Dame des Foyers", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8869224, + 2.3699944 + ], + "osm_type":"way", + "osm_id":64038747, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "302":{ + "name":"Église Notre-Dame des Champs", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8434561, + 2.3271121 + ], + "osm_type":"way", + "osm_id":64121803, + "attractiveness":6, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "303":{ + "name":"Centre Quaker International", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8458964, + 2.3216199 + ], + "osm_type":"way", + "osm_id":64315031, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "304":{ + "name":"Basilique Sainte-Clotilde", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.858317, + 2.3192039 + ], + "osm_type":"way", + "osm_id":64952290, + "attractiveness":11, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "305":{ + "name":"Église Saint-Yves-des-Quatre-Routes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9195187, + 2.4123168 + ], + "osm_type":"way", + "osm_id":67181873, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "306":{ + "name":"Église anglicane Saint-Michael", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8700841, + 2.3190066 + ], + "osm_type":"way", + "osm_id":67233894, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "307":{ + "name":"Église protestante unie du Saint-Esprit", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.873222, + 2.3198533 + ], + "osm_type":"way", + "osm_id":67350058, + "attractiveness":9, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "308":{ + "name":"Église Saint-Augustin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8761942, + 2.3188756 + ], + "osm_type":"way", + "osm_id":67501490, + "attractiveness":15, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "309":{ + "name":"Église Saint-André de l'Europe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8815247, + 2.3258345 + ], + "osm_type":"way", + "osm_id":68256672, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "310":{ + "name":"Chapelle Baltard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8735777, + 2.3103416 + ], + "osm_type":"way", + "osm_id":68831265, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "311":{ + "name":"Chapelle Notre-Dame de l'Annonciation", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8760259, + 2.3039392 + ], + "osm_type":"way", + "osm_id":68991281, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "312":{ + "name":"Synagogue Rashi", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8744883, + 2.3475592 + ], + "osm_type":"way", + "osm_id":69221039, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "313":{ + "name":"Consistoire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8757851, + 2.3369238 + ], + "osm_type":"way", + "osm_id":69363791, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "314":{ + "name":"Église Luthérienne Saint-Jean", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8574433, + 2.3080496 + ], + "osm_type":"way", + "osm_id":69884208, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "315":{ + "name":"Église Protestante Unie de Paris-Belleville", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8726445, + 2.3819387 + ], + "osm_type":"way", + "osm_id":69999948, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "316":{ + "name":"Église Notre-Dame-des-Otages", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8741661, + 2.4028427 + ], + "osm_type":"way", + "osm_id":70001758, + "attractiveness":9, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "317":{ + "name":"Église Notre-Dame-de-la-Croix", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8686123, + 2.3874809 + ], + "osm_type":"way", + "osm_id":70001850, + "attractiveness":16, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "318":{ + "name":"Église protestante évangélique de Télégraphe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8731202, + 2.4012087 + ], + "osm_type":"way", + "osm_id":70002610, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "319":{ + "name":"Église Saint-Gabriel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8486664, + 2.4060717 + ], + "osm_type":"way", + "osm_id":70147593, + "attractiveness":6, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "320":{ + "name":"Église Protestante Danoise", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8734257, + 2.2991491 + ], + "osm_type":"way", + "osm_id":70187665, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "321":{ + "name":"Cathédrale Saint-Alexandre-Nevsky", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.877618, + 2.3019923 + ], + "osm_type":"way", + "osm_id":70192893, + "attractiveness":14, + "must_do":false, + "n_tags":22, + "time_to_reach":0 + }, + "322":{ + "name":"Temple protestant", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9144278, + 2.3805593 + ], + "osm_type":"way", + "osm_id":72998330, + "attractiveness":6, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "323":{ + "name":"Église Saint-Paul-du-Montfort", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9170219, + 2.4001222 + ], + "osm_type":"way", + "osm_id":73007918, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "324":{ + "name":"Église Saint-Germain", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8928543, + 2.4132525 + ], + "osm_type":"way", + "osm_id":73113040, + "attractiveness":9, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "325":{ + "name":"Assoc Ligue amicale des cultures et de recherche scientifique", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9039706, + 2.3950487 + ], + "osm_type":"way", + "osm_id":73114961, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "326":{ + "name":"Église Sainte-Marthe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9057121, + 2.3951559 + ], + "osm_type":"way", + "osm_id":73119238, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "327":{ + "name":"Oratoire de Padre Pio", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9033824, + 2.3946926 + ], + "osm_type":"way", + "osm_id":73121140, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "328":{ + "name":"Église de la Sainte-Famille", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8859818, + 2.4028045 + ], + "osm_type":"way", + "osm_id":73249060, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "329":{ + "name":"Église Notre-Dame-du-Rosaire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8798767, + 2.4146163 + ], + "osm_type":"way", + "osm_id":73433670, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "330":{ + "name":"Église de Jésus-Christ des saints des derniers jours", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9094149, + 2.3302012 + ], + "osm_type":"way", + "osm_id":73835465, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "331":{ + "name":"Église Notre-Dame-Auxiliatrice", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9011609, + 2.3139807 + ], + "osm_type":"way", + "osm_id":74470553, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "332":{ + "name":"Chapelle Saint-Pierre - Saint-Paul", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.899563, + 2.3657971 + ], + "osm_type":"way", + "osm_id":75220961, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "333":{ + "name":"Église Saint-Joseph des Épinettes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8935748, + 2.3205585 + ], + "osm_type":"way", + "osm_id":75747135, + "attractiveness":8, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "334":{ + "name":"Église de l'Immaculée Conception", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8459791, + 2.4034956 + ], + "osm_type":"way", + "osm_id":77385186, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "335":{ + "name":"Église Sainte-Geneviève des Grandes-Carrières", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.894851, + 2.3340131 + ], + "osm_type":"way", + "osm_id":77670243, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "336":{ + "name":"Chapelle Orthodoxe", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8468946, + 2.3041669 + ], + "osm_type":"way", + "osm_id":77739478, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "337":{ + "name":"Église Saint-Jean de Montmartre", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.884243, + 2.3378793 + ], + "osm_type":"way", + "osm_id":77807770, + "attractiveness":17, + "must_do":false, + "n_tags":27, + "time_to_reach":0 + }, + "338":{ + "name":"Église Saint-Bernard-de-La-Chapelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8860532, + 2.3549746 + ], + "osm_type":"way", + "osm_id":78005074, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "339":{ + "name":"Église Notre-Dame du Bon Conseil", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.895063, + 2.3500907 + ], + "osm_type":"way", + "osm_id":78020496, + "attractiveness":6, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "340":{ + "name":"Église Notre-Dame de Bercy", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8363209, + 2.3872317 + ], + "osm_type":"way", + "osm_id":78271179, + "attractiveness":12, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "341":{ + "name":"Église réformée Port-Royal Quartier Latin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8363739, + 2.3491795 + ], + "osm_type":"way", + "osm_id":78406890, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "342":{ + "name":"Église Saint-Marcel", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8374878, + 2.3592366 + ], + "osm_type":"way", + "osm_id":78534351, + "attractiveness":6, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "343":{ + "name":"Cathédrale Saint-Étienne", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8665953, + 2.2984346 + ], + "osm_type":"way", + "osm_id":79232285, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "344":{ + "name":"Chapelle Saint-Jean", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.835168, + 2.325842 + ], + "osm_type":"way", + "osm_id":79633343, + "attractiveness":4, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "345":{ + "name":"Église Notre-Dame-du-Travail", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8359369, + 2.3170768 + ], + "osm_type":"way", + "osm_id":79687825, + "attractiveness":9, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "346":{ + "name":"Paroisse de Plaisance", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.834375, + 2.3166882 + ], + "osm_type":"way", + "osm_id":79688125, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "347":{ + "name":"Église Orthodoxe Saint-Séraphin de Sarov", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8426176, + 2.3045363 + ], + "osm_type":"way", + "osm_id":80237345, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "348":{ + "name":"Église Saint-Jean-Baptiste-de-La-Salle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.841228, + 2.3124626 + ], + "osm_type":"way", + "osm_id":80266257, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "349":{ + "name":"Église de Tous-les-Saints", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9116813, + 2.4165316 + ], + "osm_type":"way", + "osm_id":81279191, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "350":{ + "name":"Chapelle Notre-Dame-de-l'Étoile", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.913236, + 2.428905 + ], + "osm_type":"way", + "osm_id":81287493, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "351":{ + "name":"Église Saint-Leu-Saint-Gilles", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8703087, + 2.4206749 + ], + "osm_type":"way", + "osm_id":81617177, + "attractiveness":9, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "352":{ + "name":"Chapelle des Saints-Apôtres", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8716935, + 2.4193345 + ], + "osm_type":"way", + "osm_id":81618230, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "353":{ + "name":"Église Saint-André", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8538772, + 2.4228563 + ], + "osm_type":"way", + "osm_id":81831259, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "354":{ + "name":"Église Saint-Denys de la Chapelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.891341, + 2.3603495 + ], + "osm_type":"way", + "osm_id":84153309, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "355":{ + "name":"Église Saint-François-de-Sales (ancienne église)", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8844851, + 2.3048254 + ], + "osm_type":"way", + "osm_id":84317434, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "356":{ + "name":"Église Luthérienne de l'Ascension", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8855199, + 2.3157231 + ], + "osm_type":"way", + "osm_id":84320043, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "357":{ + "name":"Foyer Culturel Myriam Zana", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8816083, + 2.3033735 + ], + "osm_type":"way", + "osm_id":84322557, + "attractiveness":2, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "358":{ + "name":"Église Saint-Charles-de-Monceau", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.882705, + 2.3127685 + ], + "osm_type":"way", + "osm_id":84324974, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "359":{ + "name":"Église Saint-François-de-Sales (nouvelle église)", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8848939, + 2.3050098 + ], + "osm_type":"way", + "osm_id":84326196, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "360":{ + "name":"Mosquée de Drancy", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9199821, + 2.4253046 + ], + "osm_type":"way", + "osm_id":84455398, + "attractiveness":3, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "361":{ + "name":"Chapelle de la Visitation", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8385454, + 2.335793 + ], + "osm_type":"way", + "osm_id":93664894, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "362":{ + "name":"Chapelle Laennec", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8499446, + 2.3217861 + ], + "osm_type":"way", + "osm_id":105220265, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "363":{ + "name":"Basilique Sainte-Jeanne-d’Arc", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8915499, + 2.360526 + ], + "osm_type":"way", + "osm_id":112358505, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "364":{ + "name":"Église Notre-Dame-de-Lourdes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.870752, + 2.3995332 + ], + "osm_type":"way", + "osm_id":112461793, + "attractiveness":7, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "365":{ + "name":"Église Sainte-Marguerite", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8529554, + 2.3813914 + ], + "osm_type":"way", + "osm_id":115804138, + "attractiveness":10, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "366":{ + "name":"Église du Saint-Esprit", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8381748, + 2.3976366 + ], + "osm_type":"way", + "osm_id":130906379, + "attractiveness":12, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "367":{ + "name":"Église Saint-Vincent-de-Paul", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9038936, + 2.3036986 + ], + "osm_type":"way", + "osm_id":133428900, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "368":{ + "name":"Église Notre-Dame-de-Pontmain", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8601441, + 2.4200508 + ], + "osm_type":"way", + "osm_id":133610564, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "369":{ + "name":"Prieuré Saint-Benoît", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8875038, + 2.3421102 + ], + "osm_type":"way", + "osm_id":137884617, + "attractiveness":5, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "370":{ + "name":"Église Protestante Suédoise", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8807628, + 2.3031693 + ], + "osm_type":"way", + "osm_id":137884622, + "attractiveness":6, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "371":{ + "name":"Église luthérienne Saint-Paul", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8908265, + 2.3499846 + ], + "osm_type":"way", + "osm_id":148524233, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "372":{ + "name":"Église Saint-Luc", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8938055, + 2.3754218 + ], + "osm_type":"way", + "osm_id":259039017, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "373":{ + "name":"Église Saint-Paul de la Plaine", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9152153, + 2.3632191 + ], + "osm_type":"way", + "osm_id":284196003, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "374":{ + "name":"Synagogue Kedouchat Levy", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.888419, + 2.3509459 + ], + "osm_type":"way", + "osm_id":329896847, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "375":{ + "name":"Ass Culturelle Fraternité De Pantin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9032414, + 2.3950124 + ], + "osm_type":"way", + "osm_id":400021698, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "376":{ + "name":"Chapelle Saint-Bernard", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8409341, + 2.3211613 + ], + "osm_type":"way", + "osm_id":410503747, + "attractiveness":9, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "377":{ + "name":"Mosquée du foyer", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9002722, + 2.3938434 + ], + "osm_type":"way", + "osm_id":427207483, + "attractiveness":2, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "378":{ + "name":"Cathédrale de la Sainte-Trinité", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8618757, + 2.3010168 + ], + "osm_type":"way", + "osm_id":449077939, + "attractiveness":11, + "must_do":false, + "n_tags":17, + "time_to_reach":0 + }, + "379":{ + "name":"JW - Salle du Royaume", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8776705, + 2.4239713 + ], + "osm_type":"way", + "osm_id":460236839, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "380":{ + "name":"Grande Mosquée de Saint-Ouen Al Hashimi", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.907291, + 2.3257897 + ], + "osm_type":"way", + "osm_id":616809276, + "attractiveness":7, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "381":{ + "name":"Église Notre-Dame-du-Rosaire", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9067198, + 2.3327266 + ], + "osm_type":"way", + "osm_id":774960953, + "attractiveness":4, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "382":{ + "name":"Mosquée Islah", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.9117605, + 2.415003 + ], + "osm_type":"way", + "osm_id":866064131, + "attractiveness":3, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "383":{ + "name":"Grande Mosquée de Gennevilliers", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.919566, + 2.3033097 + ], + "osm_type":"way", + "osm_id":952413288, + "attractiveness":3, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "384":{ + "name":"Église Orthodoxe Notre-Dame-Joie-des-Affligés-et-Sainte-Geneviève", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.848068, + 2.3516065 + ], + "osm_type":"way", + "osm_id":1056837934, + "attractiveness":8, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "385":{ + "name":"Association Culturelle Islamique Kurdes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.874251, + 2.3562294 + ], + "osm_type":"relation", + "osm_id":983065, + "attractiveness":4, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "386":{ + "name":"ACIP Vincennes", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8477171, + 2.4197605 + ], + "osm_type":"relation", + "osm_id":12023085, + "attractiveness":5, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "387":{ + "name":"Fontaine des quatre évêques", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.85087, + 2.3332776 + ], + "osm_type":"way", + "osm_id":40068036, + "attractiveness":8, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "388":{ + "name":"Vivier sud", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8620408, + 2.3297809 + ], + "osm_type":"way", + "osm_id":54201242, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "389":{ + "name":"Monument d'Eugène Delacroix", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.84824, + 2.3355377 + ], + "osm_type":"way", + "osm_id":62848407, + "attractiveness":9, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "390":{ + "name":"Fontaine aux Lions", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8895664, + 2.3922773 + ], + "osm_type":"way", + "osm_id":81752247, + "attractiveness":9, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "391":{ + "name":"Miroir d'Eau", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8678713, + 2.363198 + ], + "osm_type":"way", + "osm_id":313420244, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "392":{ + "name":"La fontaine de la Vierge", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8525605, + 2.3513841 + ], + "osm_type":"way", + "osm_id":948654101, + "attractiveness":6, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "393":{ + "name":"Fontaine de Diane", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8659253, + 2.3169593 + ], + "osm_type":"way", + "osm_id":1136105125, + "attractiveness":10, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "394":{ + "name":"Fontaine Saussure", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8885895, + 2.3075212 + ], + "osm_type":"way", + "osm_id":1255942976, + "attractiveness":2, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "395":{ + "name":"Square Jean Chérioux", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8401918, + 2.3006179 + ], + "osm_type":"way", + "osm_id":14334838, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "396":{ + "name":"Jardin Bargue-Platon", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8374487, + 2.3105347 + ], + "osm_type":"way", + "osm_id":14349803, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "397":{ + "name":"Jardin d'Alleray", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8360274, + 2.3050768 + ], + "osm_type":"way", + "osm_id":14646518, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "398":{ + "name":"Square de la Tour Saint-Jacques", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.857913, + 2.3487608 + ], + "osm_type":"way", + "osm_id":15895172, + "attractiveness":19, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "399":{ + "name":"Square des Missions Étrangères", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.852336, + 2.3243813 + ], + "osm_type":"way", + "osm_id":16190318, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "400":{ + "name":"Jardin Villemin - Mahsa Jîna Amini", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8751484, + 2.3618265 + ], + "osm_type":"way", + "osm_id":16405088, + "attractiveness":16, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "401":{ + "name":"Square Jean XXIII", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8523775, + 2.3503406 + ], + "osm_type":"way", + "osm_id":20444455, + "attractiveness":23, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "402":{ + "name":"Square René Le Gall", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8330074, + 2.3494626 + ], + "osm_type":"way", + "osm_id":22054912, + "attractiveness":35, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "403":{ + "name":"Jardin des Grands-Explorateurs Marco Polo et Robert Cavelier-de-la-Salle", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8416569, + 2.3368712 + ], + "osm_type":"way", + "osm_id":22732250, + "attractiveness":20, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "404":{ + "name":"Square Robert Montagne", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8422649, + 2.3540627 + ], + "osm_type":"way", + "osm_id":22946834, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "405":{ + "name":"Square d'Estienne d'Orves", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8767521, + 2.3316112 + ], + "osm_type":"way", + "osm_id":23272397, + "attractiveness":12, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "406":{ + "name":"Square Roger-Stéphane", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.852784, + 2.3280405 + ], + "osm_type":"way", + "osm_id":23736351, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "407":{ + "name":"Square Sarah Bernhardt", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.849403, + 2.403903 + ], + "osm_type":"way", + "osm_id":23757948, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "408":{ + "name":"Square Émile Chautemps", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8671737, + 2.3538184 + ], + "osm_type":"way", + "osm_id":23981951, + "attractiveness":23, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "409":{ + "name":"Square d'Alleray Labrouste-Saint-Amand", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8358496, + 2.3084018 + ], + "osm_type":"way", + "osm_id":24303537, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "410":{ + "name":"Parc Abel-Mézières", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9160265, + 2.3299291 + ], + "osm_type":"way", + "osm_id":24604305, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "411":{ + "name":"Parc François Mitterrand", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9029374, + 2.324142 + ], + "osm_type":"way", + "osm_id":24606663, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "412":{ + "name":"Jardin Henri-Sauvage", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.894058, + 2.352202 + ], + "osm_type":"way", + "osm_id":25092574, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "413":{ + "name":"Square des Epinettes", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.894366, + 2.3265728 + ], + "osm_type":"way", + "osm_id":25765947, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "414":{ + "name":"Square Claude Nicolas Ledoux", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8343019, + 2.3315563 + ], + "osm_type":"way", + "osm_id":25861852, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "415":{ + "name":"Square Laurent Prache", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8542571, + 2.333953 + ], + "osm_type":"way", + "osm_id":26583593, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "416":{ + "name":"Square Eugène Varlin", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.878076, + 2.3658886 + ], + "osm_type":"way", + "osm_id":26954399, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "417":{ + "name":"Square Henri Christiné", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8779611, + 2.3661926 + ], + "osm_type":"way", + "osm_id":26954406, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "418":{ + "name":"Jardin Claire Motte", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8917722, + 2.3046556 + ], + "osm_type":"way", + "osm_id":27618948, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "419":{ + "name":"Square de Clignancourt", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8930338, + 2.3465149 + ], + "osm_type":"way", + "osm_id":28804468, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "420":{ + "name":"Parc municipal Lucie-Aubrac", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.878186, + 2.4172315 + ], + "osm_type":"way", + "osm_id":28887274, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "421":{ + "name":"Square Aristide Cavaillé-Coll", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8783688, + 2.3517697 + ], + "osm_type":"way", + "osm_id":29700227, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "422":{ + "name":"Place Salvador Allende", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8973902, + 2.400923 + ], + "osm_type":"way", + "osm_id":30066116, + "attractiveness":11, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "423":{ + "name":"Jardin Rachmaninov", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8953201, + 2.3642267 + ], + "osm_type":"way", + "osm_id":30091005, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "424":{ + "name":"Square Serge Reggiani", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8889585, + 2.3791325 + ], + "osm_type":"way", + "osm_id":30097285, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "425":{ + "name":"Square Emmanuel Fleury", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8705546, + 2.411767 + ], + "osm_type":"way", + "osm_id":31150070, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "426":{ + "name":"Square Charles Hermite", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8999857, + 2.3668797 + ], + "osm_type":"way", + "osm_id":31153132, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "427":{ + "name":"Jardin Anaïs Nin", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8993002, + 2.3707214 + ], + "osm_type":"way", + "osm_id":31153158, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "428":{ + "name":"Square de Stalingrad", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9114634, + 2.3835834 + ], + "osm_type":"way", + "osm_id":31159294, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "429":{ + "name":"Parc Eli Lotar", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9180651, + 2.3716982 + ], + "osm_type":"way", + "osm_id":31297128, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "430":{ + "name":"Parc Diderot", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9068122, + 2.3974827 + ], + "osm_type":"way", + "osm_id":31353320, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "431":{ + "name":"Espaces Verts des Courtillères", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9127656, + 2.4115218 + ], + "osm_type":"way", + "osm_id":31353371, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "432":{ + "name":"Square Edmond Pépin", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8837465, + 2.4028979 + ], + "osm_type":"way", + "osm_id":31353825, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "433":{ + "name":"Square d'Anvers - Jean-Claude-Carrière", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8821787, + 2.3443692 + ], + "osm_type":"way", + "osm_id":34675527, + "attractiveness":17, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "434":{ + "name":"Square Marcel Sembat", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8987453, + 2.338316 + ], + "osm_type":"way", + "osm_id":35194283, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "435":{ + "name":"Square Léon-Frapié", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8728678, + 2.4118129 + ], + "osm_type":"way", + "osm_id":35537824, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "436":{ + "name":"Square de la Marseillaise", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8871768, + 2.3975596 + ], + "osm_type":"way", + "osm_id":35631119, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "437":{ + "name":"Square Léon-Serpollet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8921879, + 2.3384235 + ], + "osm_type":"way", + "osm_id":36855294, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "438":{ + "name":"Parc Roger Salengro", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.904745, + 2.311665 + ], + "osm_type":"way", + "osm_id":36894633, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "439":{ + "name":"Jardin des Buttes", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8663875, + 2.4223022 + ], + "osm_type":"way", + "osm_id":36911930, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "440":{ + "name":"Parc des Sports", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9236649, + 2.3024406 + ], + "osm_type":"way", + "osm_id":39838933, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "441":{ + "name":"Parc Chenard et Walcker", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9204775, + 2.3001107 + ], + "osm_type":"way", + "osm_id":39839715, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "442":{ + "name":"Allées Missak-Manouchian", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9197655, + 2.3009839 + ], + "osm_type":"way", + "osm_id":39923800, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "443":{ + "name":"Jardin Ilan-Halimi", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8360513, + 2.401527 + ], + "osm_type":"way", + "osm_id":41917771, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "444":{ + "name":"square Jules Ferry", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8593802, + 2.4175069 + ], + "osm_type":"way", + "osm_id":43103577, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "445":{ + "name":"Parc Robinson", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9088537, + 2.2949154 + ], + "osm_type":"way", + "osm_id":43447638, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "446":{ + "name":"Square Denise Buisson", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8570277, + 2.4271928 + ], + "osm_type":"way", + "osm_id":43476880, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "447":{ + "name":"Square Louise Michel", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8853618, + 2.3438234 + ], + "osm_type":"way", + "osm_id":45189726, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "448":{ + "name":"Square Helbronner", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9106744, + 2.3414253 + ], + "osm_type":"way", + "osm_id":49860508, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "449":{ + "name":"Square Ozanam", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8433483, + 2.3274308 + ], + "osm_type":"way", + "osm_id":50385010, + "attractiveness":19, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "450":{ + "name":"Parc Aimé Césaire", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9101774, + 2.3760838 + ], + "osm_type":"way", + "osm_id":50828902, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "451":{ + "name":"Square des Acrobates", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9167975, + 2.3537291 + ], + "osm_type":"way", + "osm_id":52982345, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "452":{ + "name":"Jardinet place du lieutenant Henri-Karcher", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8632971, + 2.3399434 + ], + "osm_type":"way", + "osm_id":53826866, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "453":{ + "name":"Parc Théodore Monod", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9103645, + 2.309488 + ], + "osm_type":"way", + "osm_id":54380826, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "454":{ + "name":"Square Jacques Bidault", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8698572, + 2.3499616 + ], + "osm_type":"way", + "osm_id":55263339, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "455":{ + "name":"Square Charles Victor Langlois", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8586993, + 2.3580083 + ], + "osm_type":"way", + "osm_id":55848929, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "456":{ + "name":"Jardin Serge Gainsbourg", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8786669, + 2.4080907 + ], + "osm_type":"way", + "osm_id":61320151, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "457":{ + "name":"Square Alban Satragne", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8755522, + 2.3552823 + ], + "osm_type":"way", + "osm_id":61406614, + "attractiveness":15, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "458":{ + "name":"Square Félix Desruelles", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8536974, + 2.3345069 + ], + "osm_type":"way", + "osm_id":62287123, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "459":{ + "name":"Square Marcel Pagnol", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8759354, + 2.3203969 + ], + "osm_type":"way", + "osm_id":67725863, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "460":{ + "name":"Place du Guatémala", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8765224, + 2.3182782 + ], + "osm_type":"way", + "osm_id":68507724, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "461":{ + "name":"Jardin de l’Hôtel Salomon de Rothschild", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8753193, + 2.3027355 + ], + "osm_type":"way", + "osm_id":68995097, + "attractiveness":7, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "462":{ + "name":"Square de la rue Hélène", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8864786, + 2.324743 + ], + "osm_type":"way", + "osm_id":75750052, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "463":{ + "name":"Square des Recollets", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8737963, + 2.363602 + ], + "osm_type":"way", + "osm_id":76910069, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "464":{ + "name":"Square Alain Bashung", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.885345, + 2.3561989 + ], + "osm_type":"way", + "osm_id":78009019, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "465":{ + "name":"Jardin Hector Malot", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8471031, + 2.3769063 + ], + "osm_type":"way", + "osm_id":78146247, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "466":{ + "name":"Les Jardins du Ruisseau", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8974781, + 2.342714 + ], + "osm_type":"way", + "osm_id":86602632, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "467":{ + "name":"Jardin public de l'Observatoire de Paris", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8351004, + 2.3367387 + ], + "osm_type":"way", + "osm_id":87334036, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "468":{ + "name":"Jardin de l'Église Saint-Éloi", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.844863, + 2.3888016 + ], + "osm_type":"way", + "osm_id":93903779, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "469":{ + "name":"Cour Pasteur", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8412766, + 2.3446263 + ], + "osm_type":"way", + "osm_id":95092958, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "470":{ + "name":"Cour aux Ernest", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8418993, + 2.3448331 + ], + "osm_type":"way", + "osm_id":95195271, + "attractiveness":8, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "471":{ + "name":"Square Auguste Mariette-Pacha", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8491483, + 2.345955 + ], + "osm_type":"way", + "osm_id":97602191, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "472":{ + "name":"Square Michel Foucault", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8493381, + 2.3452413 + ], + "osm_type":"way", + "osm_id":97602192, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "473":{ + "name":"Square Yves Coppens", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8489867, + 2.346343 + ], + "osm_type":"way", + "osm_id":97602197, + "attractiveness":8, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "474":{ + "name":"Square de l'Abbé Esquerré", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8503173, + 2.3136601 + ], + "osm_type":"way", + "osm_id":103344111, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "475":{ + "name":"Square des Deux Nèthes", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8856573, + 2.3274074 + ], + "osm_type":"way", + "osm_id":106587163, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "476":{ + "name":"Square Alex Biscarre", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8785098, + 2.33667 + ], + "osm_type":"way", + "osm_id":107257915, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "477":{ + "name":"Square Hector Berlioz", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8831619, + 2.3298581 + ], + "osm_type":"way", + "osm_id":107351766, + "attractiveness":16, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "478":{ + "name":"Point vert de la place Roosevelt, Schaeffer, Noyers", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9173593, + 2.3798109 + ], + "osm_type":"way", + "osm_id":114705404, + "attractiveness":6, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "479":{ + "name":"Jardin de l'Intendant", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8544737, + 2.3109127 + ], + "osm_type":"way", + "osm_id":115022783, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "480":{ + "name":"Square Raoul Nordling", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8526519, + 2.3815603 + ], + "osm_type":"way", + "osm_id":115804160, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "481":{ + "name":"Square Trousseau", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8504057, + 2.3771319 + ], + "osm_type":"way", + "osm_id":118878250, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "482":{ + "name":"Espace Édouard Vaillant", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9019175, + 2.3333031 + ], + "osm_type":"way", + "osm_id":119637302, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "483":{ + "name":"Square Courteline", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8449581, + 2.4022524 + ], + "osm_type":"way", + "osm_id":129890096, + "attractiveness":11, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "484":{ + "name":"Square Van Vollenhoven", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8345779, + 2.4067941 + ], + "osm_type":"way", + "osm_id":131549198, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "485":{ + "name":"Jardinières angles des rues Daumesnil - Charenton", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8423892, + 2.3858724 + ], + "osm_type":"way", + "osm_id":133881479, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "486":{ + "name":"Bois de Vincennes", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8315046, + 2.4347158 + ], + "osm_type":"way", + "osm_id":142107768, + "attractiveness":13, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "487":{ + "name":"Square Monseigneur Maillet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8769508, + 2.3933291 + ], + "osm_type":"way", + "osm_id":149743025, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "488":{ + "name":"Square Sainte-Hélène", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8962254, + 2.3430597 + ], + "osm_type":"way", + "osm_id":155119480, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "489":{ + "name":"Jardin Nelson Mandela", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8626235, + 2.344487 + ], + "osm_type":"way", + "osm_id":159103475, + "attractiveness":23, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "490":{ + "name":"Square Les Z'Arts", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.905328, + 2.3396687 + ], + "osm_type":"way", + "osm_id":161687382, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "491":{ + "name":"Jardin René Binet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8997243, + 2.338398 + ], + "osm_type":"way", + "osm_id":163131785, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "492":{ + "name":"Square Montgolfier", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8933447, + 2.4031291 + ], + "osm_type":"way", + "osm_id":167647007, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "493":{ + "name":"Square de la Madone", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8926884, + 2.3614964 + ], + "osm_type":"way", + "osm_id":180355685, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "494":{ + "name":"Square Ernest-Chausson", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8873875, + 2.3250098 + ], + "osm_type":"way", + "osm_id":180688616, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "495":{ + "name":"Square Curial", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8956419, + 2.374963 + ], + "osm_type":"way", + "osm_id":183821262, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "496":{ + "name":"Square Dampierre-Rouvet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8939967, + 2.384231 + ], + "osm_type":"way", + "osm_id":183821348, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "497":{ + "name":"Square de Montjoie", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9116384, + 2.3594605 + ], + "osm_type":"way", + "osm_id":193160754, + "attractiveness":8, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "498":{ + "name":"Square Diderot", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9079727, + 2.3617019 + ], + "osm_type":"way", + "osm_id":196098232, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "499":{ + "name":"Square Petit", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8850845, + 2.3820568 + ], + "osm_type":"way", + "osm_id":198055405, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "500":{ + "name":"Square Françoise-Hélène Jourda", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8865799, + 2.3622552 + ], + "osm_type":"way", + "osm_id":216269238, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "501":{ + "name":"Square Marc-Seguin", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8919489, + 2.3611955 + ], + "osm_type":"way", + "osm_id":216269243, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "502":{ + "name":"Square de l'Évangile", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8924402, + 2.3618463 + ], + "osm_type":"way", + "osm_id":218118748, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "503":{ + "name":"Square de la Cristallerie", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9133226, + 2.3622312 + ], + "osm_type":"way", + "osm_id":224495131, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "504":{ + "name":"Jardin Pédagogique Debain", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9027795, + 2.3491875 + ], + "osm_type":"way", + "osm_id":227286835, + "attractiveness":6, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "505":{ + "name":"Square Carpeaux", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8916885, + 2.3316484 + ], + "osm_type":"way", + "osm_id":232871805, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "506":{ + "name":"Square René Dewerpe", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9160939, + 2.4313941 + ], + "osm_type":"way", + "osm_id":235877322, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "507":{ + "name":"Square Madeleine Tribolati", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8771593, + 2.3643554 + ], + "osm_type":"way", + "osm_id":241898171, + "attractiveness":15, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "508":{ + "name":"Grand Parc des Docks de Saint-Ouen", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9156406, + 2.3273831 + ], + "osm_type":"way", + "osm_id":241970652, + "attractiveness":10, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "509":{ + "name":"Square Sainte Marguerite", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9019871, + 2.392207 + ], + "osm_type":"way", + "osm_id":245210084, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "510":{ + "name":"Square Raymond-Queneau", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.895822, + 2.3610383 + ], + "osm_type":"way", + "osm_id":245462496, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "511":{ + "name":"Square grand Auger", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.891099, + 2.4005743 + ], + "osm_type":"way", + "osm_id":245948822, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "512":{ + "name":"Square Élisa Borey", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8665355, + 2.3904461 + ], + "osm_type":"way", + "osm_id":256437620, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "513":{ + "name":"Square de la rue des Mûriers", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8647232, + 2.3907489 + ], + "osm_type":"way", + "osm_id":256969688, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "514":{ + "name":"Jardin Jane Vialle", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8951778, + 2.3536558 + ], + "osm_type":"way", + "osm_id":257564771, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "515":{ + "name":"Jardin de la Justice", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8682927, + 2.4085101 + ], + "osm_type":"way", + "osm_id":268400319, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "516":{ + "name":"Jardin Frida Kahlo", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8722619, + 2.4129546 + ], + "osm_type":"way", + "osm_id":270368321, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "517":{ + "name":"La Petite Ceinture du 20e", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8695565, + 2.3888451 + ], + "osm_type":"way", + "osm_id":272547170, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "518":{ + "name":"Square Jean Leclaire", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8960028, + 2.3256518 + ], + "osm_type":"way", + "osm_id":281320579, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "519":{ + "name":"Jardin des Petites Rigoles", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8711431, + 2.3915288 + ], + "osm_type":"way", + "osm_id":286449809, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "520":{ + "name":"Jardin de la rue du Chalet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8740042, + 2.3732939 + ], + "osm_type":"way", + "osm_id":290586931, + "attractiveness":6, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "521":{ + "name":"Square Georges Valbon", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.879081, + 2.4159816 + ], + "osm_type":"way", + "osm_id":293462525, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "522":{ + "name":"Square Henri Sellier", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8835696, + 2.4095194 + ], + "osm_type":"way", + "osm_id":302430135, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "523":{ + "name":"Square Georges Gay", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.88301, + 2.4180549 + ], + "osm_type":"way", + "osm_id":311824309, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "524":{ + "name":"Square Alexandre-Luquet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8712709, + 2.3866251 + ], + "osm_type":"way", + "osm_id":342601519, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "525":{ + "name":"Square Joël Le Tac", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8892411, + 2.338154 + ], + "osm_type":"way", + "osm_id":347398395, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "526":{ + "name":"Square éphémère Le Point Virgule", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9024155, + 2.397356 + ], + "osm_type":"way", + "osm_id":349887549, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "527":{ + "name":"Square Roland Dorgelès", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8884891, + 2.3395705 + ], + "osm_type":"way", + "osm_id":349925623, + "attractiveness":8, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "528":{ + "name":"Parc Marcel Bich", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8970032, + 2.3047018 + ], + "osm_type":"way", + "osm_id":358375852, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "529":{ + "name":"Jardin des Rosiers – Joseph-Migneret", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8572946, + 2.3602516 + ], + "osm_type":"way", + "osm_id":365878540, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "530":{ + "name":"Jardin Léon Zyguel", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8744297, + 2.3953666 + ], + "osm_type":"way", + "osm_id":366942718, + "attractiveness":10, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "531":{ + "name":"Parc Le Temps des Cerises", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9200575, + 2.3537459 + ], + "osm_type":"way", + "osm_id":374922654, + "attractiveness":7, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "532":{ + "name":"Jardin Marcel Joseph-François", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.881282, + 2.4222704 + ], + "osm_type":"way", + "osm_id":394930550, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "533":{ + "name":"Square Anne Franck", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9010357, + 2.391558 + ], + "osm_type":"way", + "osm_id":400470877, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "534":{ + "name":"Square du Landy", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9149267, + 2.3428987 + ], + "osm_type":"way", + "osm_id":429314402, + "attractiveness":8, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "535":{ + "name":"Square Faidherbe", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8842518, + 2.4111958 + ], + "osm_type":"way", + "osm_id":437067246, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "536":{ + "name":"Square Saint-Médard", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8397407, + 2.3505403 + ], + "osm_type":"way", + "osm_id":475591498, + "attractiveness":16, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "537":{ + "name":"Coulée verte", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8403625, + 2.4051868 + ], + "osm_type":"way", + "osm_id":479550070, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "538":{ + "name":"Square Adrien Agnès", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9158677, + 2.3710641 + ], + "osm_type":"way", + "osm_id":495199253, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "539":{ + "name":"Parc Simone Veil", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.877103, + 2.412911 + ], + "osm_type":"way", + "osm_id":537779921, + "attractiveness":10, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "540":{ + "name":"Forêt linéaire Nord", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9008618, + 2.3786064 + ], + "osm_type":"way", + "osm_id":547059083, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "541":{ + "name":"Square Maria Vérone", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8969236, + 2.3358878 + ], + "osm_type":"way", + "osm_id":550244201, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "542":{ + "name":"Square Émilienne Moreau Evrard", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9163056, + 2.3788177 + ], + "osm_type":"way", + "osm_id":566130890, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "543":{ + "name":"jardin Louise-Weber-dite-La-Goulue", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8864089, + 2.3368967 + ], + "osm_type":"way", + "osm_id":570236762, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "544":{ + "name":"Square Nadar", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8859366, + 2.3418689 + ], + "osm_type":"way", + "osm_id":570270071, + "attractiveness":13, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "545":{ + "name":"Square des 31000 et des 45000", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9138493, + 2.3324482 + ], + "osm_type":"way", + "osm_id":579604099, + "attractiveness":6, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "546":{ + "name":"Jardin du Père-Armand-David", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8478674, + 2.3220972 + ], + "osm_type":"way", + "osm_id":588324415, + "attractiveness":10, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "547":{ + "name":"Jardin Hans et Sophie Scholl", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9000696, + 2.320645 + ], + "osm_type":"way", + "osm_id":600611810, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "548":{ + "name":"Square Carnot - Jardin du Roy", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8415458, + 2.4333305 + ], + "osm_type":"way", + "osm_id":623935833, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "549":{ + "name":"Parc Marguerite Yourcenar", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9184843, + 2.3163862 + ], + "osm_type":"way", + "osm_id":627992411, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "550":{ + "name":"Jardins et Vignes", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8900176, + 2.3298673 + ], + "osm_type":"way", + "osm_id":669147415, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "551":{ + "name":"Terrain de boules Boulevard de Reims", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8887271, + 2.2971561 + ], + "osm_type":"way", + "osm_id":671211475, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "552":{ + "name":"Jardin Monica Vitti", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.85383, + 2.3587057 + ], + "osm_type":"way", + "osm_id":680335218, + "attractiveness":8, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "553":{ + "name":"Square Jean Jaurès", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9215624, + 2.4075786 + ], + "osm_type":"way", + "osm_id":712722293, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "554":{ + "name":"Le Moulin de la Palette", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8870941, + 2.3607265 + ], + "osm_type":"way", + "osm_id":740494267, + "attractiveness":4, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "555":{ + "name":"Square du 8 mai 1945", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8909854, + 2.4102454 + ], + "osm_type":"way", + "osm_id":776697805, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "556":{ + "name":"Square partagé Langevin", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8894476, + 2.4147245 + ], + "osm_type":"way", + "osm_id":777256200, + "attractiveness":6, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "557":{ + "name":"Square Vaucanson", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8896788, + 2.4043481 + ], + "osm_type":"way", + "osm_id":777334888, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "558":{ + "name":"Mail Pierre Desproges", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8949999, + 2.4066759 + ], + "osm_type":"way", + "osm_id":777477474, + "attractiveness":17, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "559":{ + "name":"Jardin des Abbesses", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8852479, + 2.3385536 + ], + "osm_type":"way", + "osm_id":778261293, + "attractiveness":9, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "560":{ + "name":"Square Claude Goislot", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9179735, + 2.3927614 + ], + "osm_type":"way", + "osm_id":838326052, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "561":{ + "name":"Square de la Villette", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9030736, + 2.3865783 + ], + "osm_type":"way", + "osm_id":838332060, + "attractiveness":11, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "562":{ + "name":"Square Saganta", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.911422, + 2.3810887 + ], + "osm_type":"way", + "osm_id":838357749, + "attractiveness":15, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "563":{ + "name":"Square Georges Leblanc", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.914215, + 2.4002443 + ], + "osm_type":"way", + "osm_id":838360557, + "attractiveness":10, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "564":{ + "name":"Terrains multisports", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9043937, + 2.3864104 + ], + "osm_type":"way", + "osm_id":839298413, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "565":{ + "name":"Place Bernard Amiot et Bernard Legrand", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9188164, + 2.3036664 + ], + "osm_type":"way", + "osm_id":842441696, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "566":{ + "name":"Parc du rucher d'Aubervilliers", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9091256, + 2.3871926 + ], + "osm_type":"way", + "osm_id":845481131, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "567":{ + "name":"La Petite Ceinture du 19ème", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8958777, + 2.3789437 + ], + "osm_type":"way", + "osm_id":845793683, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "568":{ + "name":"Square Guy Môquet", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9240135, + 2.4134346 + ], + "osm_type":"way", + "osm_id":883901370, + "attractiveness":7, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "569":{ + "name":"Jardin Jean Mercier", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9084547, + 2.3029795 + ], + "osm_type":"way", + "osm_id":887023481, + "attractiveness":5, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "570":{ + "name":"Square Marcel Paul", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9026035, + 2.3256264 + ], + "osm_type":"way", + "osm_id":947255079, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "571":{ + "name":"Jardin Nusch Éluard", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8925863, + 2.3593458 + ], + "osm_type":"way", + "osm_id":958322551, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "572":{ + "name":"Parc Morel (skateboard)", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9004194, + 2.3193783 + ], + "osm_type":"way", + "osm_id":968156415, + "attractiveness":4, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "573":{ + "name":"Promenade Jean-Jacques Sempé", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8495883, + 2.3329384 + ], + "osm_type":"way", + "osm_id":968787390, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "574":{ + "name":"Square Gisèle Halimi", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9171514, + 2.4089031 + ], + "osm_type":"way", + "osm_id":985529205, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "575":{ + "name":"Parc Foucault", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9006799, + 2.3109703 + ], + "osm_type":"way", + "osm_id":1022523481, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "576":{ + "name":"Jardin éphémère", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9030392, + 2.3374987 + ], + "osm_type":"way", + "osm_id":1074618792, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "577":{ + "name":"Square Jacques Manavian", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.899006, + 2.3245959 + ], + "osm_type":"way", + "osm_id":1104894585, + "attractiveness":5, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "578":{ + "name":"Square Henri Sellier", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9027174, + 2.3173947 + ], + "osm_type":"way", + "osm_id":1157423264, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "579":{ + "name":"Jardins du Grand Échiquier", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9175228, + 2.3126717 + ], + "osm_type":"way", + "osm_id":1184461730, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "580":{ + "name":"Parvis de l'Abbé Pierre", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9091508, + 2.4276158 + ], + "osm_type":"way", + "osm_id":1236950475, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "581":{ + "name":"Jardin du Carré Rouge", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9103226, + 2.4259501 + ], + "osm_type":"way", + "osm_id":1236950495, + "attractiveness":3, + "must_do":false, + "n_tags":2, + "time_to_reach":0 + }, + "582":{ + "name":"Square Henri Galli", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8513526, + 2.3618576 + ], + "osm_type":"relation", + "osm_id":2080074, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "583":{ + "name":"Square de l’église Notre-Dame-de-la-Croix", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8687336, + 2.3881113 + ], + "osm_type":"relation", + "osm_id":2100826, + "attractiveness":9, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "584":{ + "name":"Coulée verte du sud parisien", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.7855092, + 2.2944127 + ], + "osm_type":"relation", + "osm_id":2646085, + "attractiveness":12, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "585":{ + "name":"Parc Monceau", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8793706, + 2.3088907 + ], + "osm_type":"relation", + "osm_id":2826933, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "586":{ + "name":"Parc départemental Jean-Moulin - Les Guilands", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8630132, + 2.424942 + ], + "osm_type":"relation", + "osm_id":6530383, + "attractiveness":14, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "587":{ + "name":"Parc de la Villette", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.89352, + 2.3893334 + ], + "osm_type":"relation", + "osm_id":7574623, + "attractiveness":13, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "588":{ + "name":"Les Jardins d'Éole", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8876495, + 2.3662081 + ], + "osm_type":"relation", + "osm_id":11717983, + "attractiveness":9, + "must_do":false, + "n_tags":6, + "time_to_reach":0 + }, + "589":{ + "name":"Jardin Alexandra David-Néel", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8454726, + 2.4228422 + ], + "osm_type":"relation", + "osm_id":11989941, + "attractiveness":6, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "590":{ + "name":"Parc Clichy-Batignolles Martin Luther King", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8911906, + 2.313643 + ], + "osm_type":"relation", + "osm_id":12273749, + "attractiveness":15, + "must_do":false, + "n_tags":10, + "time_to_reach":0 + }, + "591":{ + "name":"Square de la Porte de la Villette", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8998347, + 2.3901654 + ], + "osm_type":"relation", + "osm_id":13014387, + "attractiveness":8, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "592":{ + "name":"Square Rose Guérin\/Heidenheim", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.9075996, + 2.300795 + ], + "osm_type":"relation", + "osm_id":13725453, + "attractiveness":7, + "must_do":false, + "n_tags":3, + "time_to_reach":0 + }, + "593":{ + "name":"Parc zoologique de Paris", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8318246, + 2.4172936 + ], + "osm_type":"way", + "osm_id":26008116, + "attractiveness":8, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "594":{ + "name":"Galerie Lafayette Maison \/ Gourmet", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.8730326, + 2.3306871 + ], + "osm_type":"way", + "osm_id":69224027, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "595":{ + "name":"Printemps", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.8738744, + 2.3290548 + ], + "osm_type":"way", + "osm_id":69224137, + "attractiveness":20, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "596":{ + "name":"Marché Saint-Honoré", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.8670006, + 2.3317785 + ], + "osm_type":"way", + "osm_id":54155008, + "attractiveness":7, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "597":{ + "name":"Passage du Grand-Cerf", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.8648328, + 2.3493274 + ], + "osm_type":"way", + "osm_id":54970437, + "attractiveness":8, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "598":{ + "name":"Centre Commercial Émile Dubois", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.9152909, + 2.4027961 + ], + "osm_type":"way", + "osm_id":73004279, + "attractiveness":5, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "599":{ + "name":"Bistrot des rosiers", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.902197, + 2.3421451 + ], + "osm_type":"way", + "osm_id":73835282, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "600":{ + "name":"Marché Dauphine", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.9018063, + 2.341632 + ], + "osm_type":"way", + "osm_id":73836239, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "601":{ + "name":"Marché Malassis", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.9016795, + 2.3421091 + ], + "osm_type":"way", + "osm_id":73838196, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + }, + "602":{ + "name":"Marché Malik", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.901541, + 2.3400264 + ], + "osm_type":"way", + "osm_id":73839906, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "603":{ + "name":"Centre Commercial de la Grande Porte", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.855103, + 2.4162425 + ], + "osm_type":"way", + "osm_id":81767599, + "attractiveness":4, + "must_do":false, + "n_tags":4, + "time_to_reach":0 + }, + "604":{ + "name":"Avenir", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.9197328, + 2.4219237 + ], + "osm_type":"way", + "osm_id":84437363, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "605":{ + "name":"Marques Avenue", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.9225096, + 2.3303125 + ], + "osm_type":"way", + "osm_id":434347031, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "606":{ + "name":"Qwartz", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.92563, + 2.3290174 + ], + "osm_type":"way", + "osm_id":843953196, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "607":{ + "name":"Galerie Hoche", + "type":{ + "landmark_type":"shopping" + }, + "location":[ + 48.8908975, + 2.4039477 + ], + "osm_type":"relation", + "osm_id":1132674, + "attractiveness":5, + "must_do":false, + "n_tags":5, + "time_to_reach":0 + } +} \ No newline at end of file diff --git a/lib/modules/navigation.dart b/lib/modules/navigation.dart deleted file mode 100644 index f7fcbcf..0000000 --- a/lib/modules/navigation.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter/material.dart'; - -Widget singleDestination(BuildContext context, String title, String description, String image) { - return Card( - child: ListTile( - leading: Icon(Icons.location_on), - title: Text(title), - subtitle: Text(description), - onTap: () { - Navigator.pushNamed(context, '/destination'); - }, - ), - ); -} \ No newline at end of file diff --git a/lib/modules/profile.dart b/lib/modules/profile.dart deleted file mode 100644 index 69bfba4..0000000 --- a/lib/modules/profile.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; - - - -class ProfilePage extends StatefulWidget { - @override - _ProfilePageState createState() => _ProfilePageState(); -} - -class _ProfilePageState extends State { - - double value = 0.0; - void onChanged(double newValue) { - setState(() { - value = newValue; - }); - } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Profile'), - ), - body: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - children: [ - Card( - child: ListTile( - leading: Icon(Icons.notifications_sharp), - title: Text('Notification 1'), - subtitle: Text('This is a first notification'), - ), - ), - Card( - child: ListTile( - leading: Icon(Icons.notifications_sharp), - title: Text('Notification 2'), - subtitle: Text('This is a notification'), - ), - ), - Card( - child: ListTile( - leading: Icon(Icons.outdoor_grill), - title: Text("Eating preference"), - subtitle: Slider.adaptive(value: value, onChanged: onChanged, min: 0, max: 5, divisions: 5, label: value.toInt().toString(),) - - ) - ) - ], - ), - ) - ); - } -} diff --git a/minor_landmarks.txt b/minor_landmarks.txt new file mode 100644 index 0000000..8c3f4ab --- /dev/null +++ b/minor_landmarks.txt @@ -0,0 +1,482 @@ +{ + "0":{ + "name":"Atelier Brancusi", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8614029, + 2.3519903 + ], + "osm_type":"way", + "osm_id":55503399, + "attractiveness":13, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "1":{ + "name":"Musée de Cluny", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8506604, + 2.3437398 + ], + "osm_type":"way", + "osm_id":56640163, + "attractiveness":18, + "must_do":false, + "n_tags":18, + "time_to_reach":0 + }, + "2":{ + "name":"Musée du Luxembourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8485965, + 2.3340156 + ], + "osm_type":"way", + "osm_id":170226810, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "3":{ + "name":"Musée national Eugène Delacroix", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8546662, + 2.3353836 + ], + "osm_type":"way", + "osm_id":395785603, + "attractiveness":15, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "4":{ + "name":"Hôtel de Sully", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.854635, + 2.3638126 + ], + "osm_type":"relation", + "osm_id":403146, + "attractiveness":14, + "must_do":false, + "n_tags":13, + "time_to_reach":0 + }, + "5":{ + "name":"Hôtel de la Monnaie", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.856403, + 2.3388625 + ], + "osm_type":"relation", + "osm_id":967664, + "attractiveness":11, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "6":{ + "name":"Musée Bourdelle", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8432078, + 2.3186583 + ], + "osm_type":"relation", + "osm_id":1212876, + "attractiveness":23, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "7":{ + "name":"Musée Carnavalet", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8576819, + 2.3627147 + ], + "osm_type":"relation", + "osm_id":2405955, + "attractiveness":25, + "must_do":false, + "n_tags":25, + "time_to_reach":0 + }, + "8":{ + "name":"Pont Neuf", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8565248, + 2.3408132 + ], + "osm_type":"way", + "osm_id":53574149, + "attractiveness":16, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "9":{ + "name":"Jardin du Luxembourg", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8467137, + 2.3363649 + ], + "osm_type":"way", + "osm_id":128206209, + "attractiveness":35, + "must_do":false, + "n_tags":23, + "time_to_reach":0 + }, + "10":{ + "name":"Cathédrale Notre-Dame de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8529372, + 2.3498701 + ], + "osm_type":"way", + "osm_id":201611261, + "attractiveness":55, + "must_do":false, + "n_tags":54, + "time_to_reach":0 + }, + "11":{ + "name":"Maison à l'enseigne du Faucheur", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8558553, + 2.3568266 + ], + "osm_type":"way", + "osm_id":1123456865, + "attractiveness":13, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "12":{ + "name":"Maison à l'enseigne du Mouton", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8558431, + 2.3568914 + ], + "osm_type":"way", + "osm_id":1123456866, + "attractiveness":13, + "must_do":false, + "n_tags":11, + "time_to_reach":0 + }, + "13":{ + "name":"Palais de Justice de Paris", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8556537, + 2.3446072 + ], + "osm_type":"relation", + "osm_id":536982, + "attractiveness":24, + "must_do":false, + "n_tags":24, + "time_to_reach":0 + }, + "14":{ + "name":"Mémorial des Martyrs de la Déportation", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8517365, + 2.3524734 + ], + "osm_type":"relation", + "osm_id":9396191, + "attractiveness":21, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "15":{ + "name":"Fontaine des Innocents", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8606368, + 2.3480233 + ], + "osm_type":"way", + "osm_id":52469222, + "attractiveness":16, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "16":{ + "name":"Hôtel de Sens", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8535257, + 2.3588733 + ], + "osm_type":"way", + "osm_id":55541122, + "attractiveness":21, + "must_do":false, + "n_tags":20, + "time_to_reach":0 + }, + "17":{ + "name":"Hôtel d'Ourscamp", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8555465, + 2.3571206 + ], + "osm_type":"way", + "osm_id":55620201, + "attractiveness":10, + "must_do":false, + "n_tags":9, + "time_to_reach":0 + }, + "18":{ + "name":"Hôtel de Choiseul-Praslin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8478008, + 2.3203873 + ], + "osm_type":"way", + "osm_id":65756922, + "attractiveness":12, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "19":{ + "name":"Chapelle Notre-Dame-des-Anges", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8462836, + 2.3235558 + ], + "osm_type":"way", + "osm_id":219378497, + "attractiveness":16, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "20":{ + "name":"Fontaine du Palmier", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8575005, + 2.3472864 + ], + "osm_type":"way", + "osm_id":261092850, + "attractiveness":23, + "must_do":false, + "n_tags":14, + "time_to_reach":0 + }, + "21":{ + "name":"Église Saint-Séverin", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8520913, + 2.3457237 + ], + "osm_type":"way", + "osm_id":19740659, + "attractiveness":15, + "must_do":false, + "n_tags":25, + "time_to_reach":0 + }, + "22":{ + "name":"Église Orthodoxe Roumaine des Saints Archanges", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.849488, + 2.3471975 + ], + "osm_type":"way", + "osm_id":55366403, + "attractiveness":10, + "must_do":false, + "n_tags":16, + "time_to_reach":0 + }, + "23":{ + "name":"Église Saint-Merri", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8590777, + 2.3508448 + ], + "osm_type":"way", + "osm_id":55742120, + "attractiveness":16, + "must_do":false, + "n_tags":26, + "time_to_reach":0 + }, + "24":{ + "name":"Église Saint-Germain des Prés", + "type":{ + "landmark_type":"sightseeing" + }, + "location":[ + 48.8539667, + 2.334463 + ], + "osm_type":"way", + "osm_id":62287173, + "attractiveness":12, + "must_do":false, + "n_tags":21, + "time_to_reach":0 + }, + "25":{ + "name":"Square de la Tour Saint-Jacques", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.857913, + 2.3487608 + ], + "osm_type":"way", + "osm_id":15895172, + "attractiveness":19, + "must_do":false, + "n_tags":12, + "time_to_reach":0 + }, + "26":{ + "name":"Square Jean XXIII", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8523775, + 2.3503406 + ], + "osm_type":"way", + "osm_id":20444455, + "attractiveness":23, + "must_do":false, + "n_tags":15, + "time_to_reach":0 + }, + "27":{ + "name":"Square Félix Desruelles", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8536974, + 2.3345069 + ], + "osm_type":"way", + "osm_id":62287123, + "attractiveness":12, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + }, + "28":{ + "name":"Jardin des Rosiers – Joseph-Migneret", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8572946, + 2.3602516 + ], + "osm_type":"way", + "osm_id":365878540, + "attractiveness":14, + "must_do":false, + "n_tags":8, + "time_to_reach":0 + }, + "29":{ + "name":"Jardin du Père-Armand-David", + "type":{ + "landmark_type":"nature" + }, + "location":[ + 48.8478674, + 2.3220972 + ], + "osm_type":"way", + "osm_id":588324415, + "attractiveness":10, + "must_do":false, + "n_tags":7, + "time_to_reach":0 + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index e8a2cb6..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,333 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" - source: hosted - version: "1.3.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - flutter_map: - dependency: "direct main" - description: - name: flutter_map - sha256: cda8d72135b697f519287258b5294a57ce2f2a5ebf234f0e406aad4dc14c9399 - url: "https://pub.dev" - source: hosted - version: "6.1.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - http: - dependency: transitive - description: - name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" - url: "https://pub.dev" - source: hosted - version: "1.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - intl: - dependency: transitive - description: - name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" - source: hosted - version: "0.19.0" - latlong2: - dependency: transitive - description: - name: latlong2 - sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" - url: "https://pub.dev" - source: hosted - version: "0.9.1" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" - url: "https://pub.dev" - source: hosted - version: "10.0.0" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.dev" - source: hosted - version: "3.0.0" - lists: - dependency: transitive - description: - name: lists - sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - logger: - dependency: transitive - description: - name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" - source: hosted - version: "0.12.16+1" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.dev" - source: hosted - version: "0.8.0" - meta: - dependency: transitive - description: - name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 - url: "https://pub.dev" - source: hosted - version: "1.11.0" - mgrs_dart: - dependency: transitive - description: - name: mgrs_dart - sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 - url: "https://pub.dev" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - polylabel: - dependency: transitive - description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - proj4dart: - dependency: transitive - description: - name: proj4dart - sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e - url: "https://pub.dev" - source: hosted - version: "2.1.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliding_up_panel: - dependency: "direct main" - description: - name: sliding_up_panel - sha256: "578e90956a6212d1e406373250b2436a0f3afece29aee3c24c8360094d6cf968" - url: "https://pub.dev" - source: hosted - version: "2.0.0+1" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.dev" - source: hosted - version: "0.6.1" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - unicode: - dependency: transitive - description: - name: unicode - sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" - url: "https://pub.dev" - source: hosted - version: "0.3.1" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 - url: "https://pub.dev" - source: hosted - version: "13.0.0" - web: - dependency: transitive - description: - name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" - url: "https://pub.dev" - source: hosted - version: "0.5.1" - wkt_parser: - dependency: transitive - description: - name: wkt_parser - sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" - url: "https://pub.dev" - source: hosted - version: "2.0.0" -sdks: - dart: ">=3.3.4 <4.0.0" - flutter: ">=3.10.0"