aletrn commited on
Commit
aa983ad
1 Parent(s): 0f9c611

[feat] add working static frontend

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +7 -0
  2. Dockerfile +9 -6
  3. README.md +3 -3
  4. dockerfiles/dockerfile-lambda-fastsam-api +3 -3
  5. dockerfiles/dockerfile-samgis-base +55 -19
  6. static/.gitignore +38 -0
  7. static/.prettierrc.json +8 -0
  8. static/LICENSE +176 -0
  9. static/NOTICE +0 -0
  10. static/README.md +36 -0
  11. static/app.js +0 -35
  12. static/env.d.ts +1 -0
  13. static/index.html +14 -40
  14. static/package.json +35 -0
  15. static/pnpm-lock.yaml +2063 -0
  16. static/postcss.config.js +7 -0
  17. static/public/api-docs.svg +3 -0
  18. static/public/apple-touch-icon.png +0 -0
  19. static/public/blog.svg +98 -0
  20. static/public/favicon.ico +0 -0
  21. static/public/home-page.svg +3 -0
  22. static/public/icon-192.png +0 -0
  23. static/public/icon-512.png +0 -0
  24. static/public/icon.svg +0 -0
  25. static/public/loader.svg +1 -0
  26. static/public/login.svg +6 -0
  27. static/public/logout.svg +3 -0
  28. static/public/manifest.webmanifest +6 -0
  29. static/public/marker-icon-exclude-2x.png +0 -0
  30. static/public/marker-icon-exclude.png +0 -0
  31. static/public/marker-icon-include-2x.png +0 -0
  32. static/public/marker-icon-include.png +0 -0
  33. static/public/marker-shadow.png +0 -0
  34. static/public/prediction-map-bw.svg +0 -0
  35. static/public/user-profile.svg +60 -0
  36. static/src/App.vue +28 -0
  37. static/src/components/PageFooter.vue +16 -0
  38. static/src/components/PageFooterHyperlink.vue +16 -0
  39. static/src/components/PageLayout.vue +28 -0
  40. static/src/components/PagePredictionMap.vue +224 -0
  41. static/src/components/StatsGrid.vue +17 -0
  42. static/src/components/TableGenericComponent.vue +30 -0
  43. static/src/components/buttons/ButtonComponent.vue +11 -0
  44. static/src/components/buttons/ButtonMapSendRequest.vue +31 -0
  45. static/src/components/constants.ts +236 -0
  46. static/src/components/helpers.ts +253 -0
  47. static/src/components/types.d.ts +50 -0
  48. static/src/input.css +20 -0
  49. static/src/leaflet-custom.css +42 -0
  50. static/src/main.ts +6 -0
.dockerignore CHANGED
@@ -7,3 +7,10 @@ tmp/
7
  __pycache__
8
  .DS_Store
9
  .pytest_cache
 
 
 
 
 
 
 
 
7
  __pycache__
8
  .DS_Store
9
  .pytest_cache
10
+ node_modules
11
+ dist
12
+ static/node_modules
13
+ static/dist
14
+ static/.env*
15
+ .coverage
16
+ .git
Dockerfile CHANGED
@@ -8,10 +8,11 @@ ENV VIRTUAL_ENV=${LAMBDA_TASK_ROOT}/.venv \
8
 
9
  # Set working directory to function root directory
10
  WORKDIR ${LAMBDA_TASK_ROOT}
11
- COPY ./samgis ${LAMBDA_TASK_ROOT}/samgis
12
- COPY ./src ${LAMBDA_TASK_ROOT}/src
13
- COPY ./static ${LAMBDA_TASK_ROOT}/static
14
- COPY ./machine_learning_models ${LAMBDA_TASK_ROOT}/machine_learning_models
 
15
 
16
  RUN ls -l /usr/bin/which
17
  RUN /usr/bin/which python
@@ -32,7 +33,9 @@ RUN python -c "import rasterio"
32
  RUN python -c "import uvicorn"
33
  RUN df -h
34
  RUN ls -l ${LAMBDA_TASK_ROOT}/samgis/
35
- RUN ls -l ${LAMBDA_TASK_ROOT}/src/
36
  RUN ls -l ${LAMBDA_TASK_ROOT}/static/
 
 
37
 
38
- CMD ["uvicorn", "src.fastapi_wrapper:app", "--host", "0.0.0.0", "--port", "7860"]
 
8
 
9
  # Set working directory to function root directory
10
  WORKDIR ${LAMBDA_TASK_ROOT}
11
+
12
+ # don't copy here the "static" folder, is already present because of dist and node_modules folders
13
+ COPY machine_learning_models ${LAMBDA_TASK_ROOT}/machine_learning_models
14
+ COPY samgis ${LAMBDA_TASK_ROOT}/samgis
15
+ COPY wrappers ${LAMBDA_TASK_ROOT}/wrappers
16
 
17
  RUN ls -l /usr/bin/which
18
  RUN /usr/bin/which python
 
33
  RUN python -c "import uvicorn"
34
  RUN df -h
35
  RUN ls -l ${LAMBDA_TASK_ROOT}/samgis/
36
+ RUN ls -l ${LAMBDA_TASK_ROOT}/wrappers/
37
  RUN ls -l ${LAMBDA_TASK_ROOT}/static/
38
+ RUN ls -l ${LAMBDA_TASK_ROOT}/static/dist
39
+ RUN ls -l ${LAMBDA_TASK_ROOT}/static/node_modules
40
 
41
+ CMD ["uvicorn", "wrappers.fastapi_wrapper:app", "--host", "0.0.0.0", "--port", "7860"]
README.md CHANGED
@@ -19,13 +19,13 @@ docker stop $(docker ps -a -q); docker rm $(docker ps -a -q)
19
  docker build . -f dockerfiles/dockerfile-samgis-base --build-arg DEPENDENCY_GROUP=fastapi --tag localhost/samgis-base-fastapi --progress=plain
20
 
21
  # build the image, use the tag "samgis-huggingface"
22
- docker build . --tag samgis-huggingface --progress=plain
23
  ```
24
 
25
  Run the container (keep it on background) and show logs
26
 
27
  ```bash
28
- docker run -d --name samgis-huggingface -p 7860:7860 samgis-huggingface; docker logs -f samgis-huggingface
29
  ```
30
 
31
  Test it with curl:
@@ -58,7 +58,7 @@ docker build . -f dockerfiles/dockerfile-lambda-fastsam-api --tag localhost/lamb
58
  Run the container (keep it on background) and show logs
59
 
60
  ```bash
61
- docker tag localhost/lambda-fastsam-api:latest localhost/lambda-fastsam-api;docker run -d --name lambda-fastsam-api -p 8080:8080 lambda-fastsam-api; docker logs -f lambda-fastsam-api
62
  ```
63
 
64
  Test it with curl:
 
19
  docker build . -f dockerfiles/dockerfile-samgis-base --build-arg DEPENDENCY_GROUP=fastapi --tag localhost/samgis-base-fastapi --progress=plain
20
 
21
  # build the image, use the tag "samgis-huggingface"
22
+ docker build . --tag localhost/samgis-huggingface --progress=plain
23
  ```
24
 
25
  Run the container (keep it on background) and show logs
26
 
27
  ```bash
28
+ docker run -d --name samgis-huggingface -p 7860:7860 localhost/samgis-huggingface; docker logs -f samgis-huggingface
29
  ```
30
 
31
  Test it with curl:
 
58
  Run the container (keep it on background) and show logs
59
 
60
  ```bash
61
+ docker run -d --name lambda-fastsam-api -p 8080:8080 lambda-fastsam-api; docker logs -f lambda-fastsam-api
62
  ```
63
 
64
  Test it with curl:
dockerfiles/dockerfile-lambda-fastsam-api CHANGED
@@ -9,7 +9,7 @@ ENV VIRTUAL_ENV=${LAMBDA_TASK_ROOT}/.venv \
9
  # Set working directory to function root directory
10
  WORKDIR ${LAMBDA_TASK_ROOT}
11
  COPY ./samgis ${LAMBDA_TASK_ROOT}/samgis
12
- COPY ./src ${LAMBDA_TASK_ROOT}/src
13
  COPY ./machine_learning_models ${LAMBDA_TASK_ROOT}/machine_learning_models
14
 
15
  RUN ls -l /usr/bin/which
@@ -30,7 +30,7 @@ RUN python -c "import rasterio"
30
  RUN df -h
31
  RUN ls -l /lambda-entrypoint.sh
32
  RUN ls -l ${LAMBDA_TASK_ROOT}/samgis/
33
- RUN ls -l ${LAMBDA_TASK_ROOT}/src/
34
 
35
  ENTRYPOINT ["/lambda-entrypoint.sh"]
36
- CMD [ "src.lambda_wrapper.lambda_handler" ]
 
9
  # Set working directory to function root directory
10
  WORKDIR ${LAMBDA_TASK_ROOT}
11
  COPY ./samgis ${LAMBDA_TASK_ROOT}/samgis
12
+ COPY ./wrappers ${LAMBDA_TASK_ROOT}/wrappers
13
  COPY ./machine_learning_models ${LAMBDA_TASK_ROOT}/machine_learning_models
14
 
15
  RUN ls -l /usr/bin/which
 
30
  RUN df -h
31
  RUN ls -l /lambda-entrypoint.sh
32
  RUN ls -l ${LAMBDA_TASK_ROOT}/samgis/
33
+ RUN ls -l ${LAMBDA_TASK_ROOT}/wrappers/
34
 
35
  ENTRYPOINT ["/lambda-entrypoint.sh"]
36
+ CMD [ "wrappers.lambda_wrapper.lambda_handler" ]
dockerfiles/dockerfile-samgis-base CHANGED
@@ -1,6 +1,7 @@
1
- # Include global arg in this stage of the build
2
  ARG ARCH="x86_64"
3
  ARG LAMBDA_TASK_ROOT="/var/task"
 
4
  ARG PYTHONPATH="${LAMBDA_TASK_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
5
  ARG POETRY_NO_INTERACTION=1
6
  ARG POETRY_VIRTUALENVS_IN_PROJECT=1
@@ -9,7 +10,7 @@ ARG POETRY_CACHE_DIR=/tmp/poetry_cache
9
  ARG RIE="https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
10
 
11
 
12
- FROM python:3.11-bookworm as builder
13
 
14
  ARG ARCH
15
  ARG LAMBDA_TASK_ROOT
@@ -28,18 +29,16 @@ RUN echo "ARG POETRY_CACHE_DIR: ${POETRY_CACHE_DIR} ..."
28
  RUN echo "ARG PYTHONPATH: $PYTHONPATH ..."
29
  RUN test -n ${DEPENDENCY_GROUP:?}
30
  RUN echo "python DEPENDENCY_GROUP: ${DEPENDENCY_GROUP} ..."
 
31
 
32
  # Set working directory to function root directory
33
  WORKDIR ${LAMBDA_TASK_ROOT}
34
  COPY requirements_poetry.txt pyproject.toml poetry.lock README.md ${LAMBDA_TASK_ROOT}/
35
 
36
  # avoid segment-geospatial exception caused by missing libGL.so.1 library
37
- RUN apt update && apt install -y libgl1 curl python3-pip && apt clean
38
- RUN echo "check for libGL.so ..."
39
- RUN ls -ld /usr/lib/*-linux-gnu/libGL.so* || echo "libGL.so* not found/1..."
40
- RUN ls -ld /usr/lib/${ARCH}-linux-gnu/libGL.so* || echo "libGL.so* not found/2..."
41
- RUN which python
42
- RUN python --version
43
 
44
  # poetry installation path is NOT within ${LAMBDA_TASK_ROOT}: not needed for runtime docker image
45
  RUN python -m pip install -r ${LAMBDA_TASK_ROOT}/requirements_poetry.txt
@@ -51,11 +50,6 @@ RUN poetry install --with ${DEPENDENCY_GROUP} --no-root
51
 
52
  RUN curl -Lo /usr/local/bin/aws-lambda-rie ${RIE}
53
 
54
- RUN echo "check for libGL.so"
55
- RUN ls -ld /usr/lib/*-linux-gnu/libGL.so* || echo "libGL.so* not found..."
56
- RUN ls -ld ${LAMBDA_TASK_ROOT}/.venv
57
- RUN ls -l ${LAMBDA_TASK_ROOT}/.venv
58
-
59
 
60
  FROM python:3.11-slim-bookworm as runtime
61
 
@@ -65,17 +59,59 @@ ARG LAMBDA_TASK_ROOT
65
  ENV VIRTUAL_ENV=${LAMBDA_TASK_ROOT}/.venv \
66
  PATH="${LAMBDA_TASK_ROOT}/.venv/bin:$PATH"
67
 
68
- RUN echo "COPY --from=builder /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/"
69
- COPY --from=builder /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/
70
- COPY --from=builder ${LAMBDA_TASK_ROOT}/.venv ${LAMBDA_TASK_ROOT}/.venv
71
 
72
  RUN echo "new LAMBDA_TASK_ROOT after hidden venv copy => ${LAMBDA_TASK_ROOT}"
73
  RUN ls -ld ${LAMBDA_TASK_ROOT}/
74
  RUN ls -lA ${LAMBDA_TASK_ROOT}/
75
 
76
- # only used by AWS lambda docker image
77
- COPY --from=builder /usr/local/bin/aws-lambda-rie /usr/local/bin/aws-lambda-rie
78
  RUN chmod +x /usr/local/bin/aws-lambda-rie
79
  COPY ./scripts/lambda-entrypoint.sh /lambda-entrypoint.sh
80
  RUN chmod +x /lambda-entrypoint.sh
81
- RUN ls -l /lambda-entrypoint.sh
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Include global ARGs at the dockerfile top
2
  ARG ARCH="x86_64"
3
  ARG LAMBDA_TASK_ROOT="/var/task"
4
+ ARG FASTAPI_STATIC="${LAMBDA_TASK_ROOT}/static"
5
  ARG PYTHONPATH="${LAMBDA_TASK_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
6
  ARG POETRY_NO_INTERACTION=1
7
  ARG POETRY_VIRTUALENVS_IN_PROJECT=1
 
10
  ARG RIE="https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
11
 
12
 
13
+ FROM python:3.11-bookworm as builder_global
14
 
15
  ARG ARCH
16
  ARG LAMBDA_TASK_ROOT
 
29
  RUN echo "ARG PYTHONPATH: $PYTHONPATH ..."
30
  RUN test -n ${DEPENDENCY_GROUP:?}
31
  RUN echo "python DEPENDENCY_GROUP: ${DEPENDENCY_GROUP} ..."
32
+ RUN echo "arg dep:"
33
 
34
  # Set working directory to function root directory
35
  WORKDIR ${LAMBDA_TASK_ROOT}
36
  COPY requirements_poetry.txt pyproject.toml poetry.lock README.md ${LAMBDA_TASK_ROOT}/
37
 
38
  # avoid segment-geospatial exception caused by missing libGL.so.1 library
39
+ # RUN apt update && apt install -y libgl1 curl python3-pip && apt clean
40
+ RUN apt update && apt install -y libgl1 curl
41
+ RUN apt update && apt install -y python3-pip && apt clean
 
 
 
42
 
43
  # poetry installation path is NOT within ${LAMBDA_TASK_ROOT}: not needed for runtime docker image
44
  RUN python -m pip install -r ${LAMBDA_TASK_ROOT}/requirements_poetry.txt
 
50
 
51
  RUN curl -Lo /usr/local/bin/aws-lambda-rie ${RIE}
52
 
 
 
 
 
 
53
 
54
  FROM python:3.11-slim-bookworm as runtime
55
 
 
59
  ENV VIRTUAL_ENV=${LAMBDA_TASK_ROOT}/.venv \
60
  PATH="${LAMBDA_TASK_ROOT}/.venv/bin:$PATH"
61
 
62
+ RUN echo "COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/"
63
+ COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/
64
+ COPY --from=builder_global ${LAMBDA_TASK_ROOT}/.venv ${LAMBDA_TASK_ROOT}/.venv
65
 
66
  RUN echo "new LAMBDA_TASK_ROOT after hidden venv copy => ${LAMBDA_TASK_ROOT}"
67
  RUN ls -ld ${LAMBDA_TASK_ROOT}/
68
  RUN ls -lA ${LAMBDA_TASK_ROOT}/
69
 
70
+ COPY --from=builder_global /usr/local/bin/aws-lambda-rie /usr/local/bin/aws-lambda-rie
 
71
  RUN chmod +x /usr/local/bin/aws-lambda-rie
72
  COPY ./scripts/lambda-entrypoint.sh /lambda-entrypoint.sh
73
  RUN chmod +x /lambda-entrypoint.sh
74
+
75
+
76
+ ### conditional section
77
+ FROM node:20-slim AS node_fastapi
78
+
79
+ ARG DEPENDENCY_GROUP
80
+ ENV PNPM_HOME="/pnpm"
81
+ ENV PATH="$PNPM_HOME:$PATH"
82
+ RUN corepack enable
83
+
84
+ COPY ./static /appnode
85
+ WORKDIR /appnode
86
+ # RUN if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then echo "pnpm store path:" && pnpm store path; fi
87
+
88
+
89
+ FROM node_fastapi AS node_prod_deps
90
+
91
+ ARG DEPENDENCY_GROUP
92
+ RUN --mount=type=cache,id=pnpm,target=/pnpm/store if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then \
93
+ pnpm install --prod --frozen-lockfile; else \
94
+ echo "DEPENDENCY_GROUP 1: ${DEPENDENCY_GROUP} ..."; fi
95
+ # here multiple conditions concatenated to avoid failing on check
96
+ RUN if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then if [ ! -d /appnode/node_modules ]; then echo "no node_modules folder" && exit 1; fi; fi
97
+
98
+
99
+ FROM node_fastapi AS node_build
100
+
101
+ ARG DEPENDENCY_GROUP
102
+ RUN --mount=type=cache,id=pnpm,target=/pnpm/store if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then \
103
+ pnpm install --frozen-lockfile; else \
104
+ echo "DEPENDENCY_GROUP 2: ${DEPENDENCY_GROUP} ..."; fi
105
+ RUN --mount=type=cache,id=pnpm,target=/pnpm/store if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then \
106
+ pnpm build; fi
107
+ RUN --mount=type=cache,id=pnpm,target=/pnpm/store if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then \
108
+ pnpm tailwindcss -i /appnode/src/input.css -o /appnode/dist/output.css; fi
109
+ RUN if [ "${DEPENDENCY_GROUP}" = "fastapi" ]; then if [ ! -d /appnode/dist ]; then echo "no dist folder" && exit 1; fi; fi
110
+
111
+
112
+ FROM runtime
113
+ ARG FASTAPI_STATIC
114
+ RUN mkdir ${FASTAPI_STATIC}
115
+
116
+ COPY --from=node_prod_deps /appnode/node_modules* ${FASTAPI_STATIC}/node_modules
117
+ COPY --from=node_build /appnode/dist* ${FASTAPI_STATIC}/dist
static/.gitignore ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ .DS_Store
12
+ dist
13
+ dist-ssr
14
+ coverage
15
+ *.local
16
+
17
+ tmp*/*
18
+ /cypress/videos/
19
+ /cypress/screenshots/
20
+ vite.config.ts.*
21
+
22
+ # Editor directories and files
23
+ .vscode/*
24
+ !.vscode/extensions.json
25
+ .idea
26
+ *.suo
27
+ *.ntvs*
28
+ *.njsproj
29
+ *.sln
30
+ *.sw?
31
+
32
+ test-results/
33
+ playwright-report/
34
+
35
+ .env*
36
+
37
+ # cloudflare workers
38
+ .wrangler
static/.prettierrc.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "semi": false,
4
+ "tabWidth": 2,
5
+ "singleQuote": true,
6
+ "printWidth": 100,
7
+ "trailingComma": "none"
8
+ }
static/LICENSE ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
static/NOTICE ADDED
The diff for this file is too large to render. See raw diff
 
static/README.md ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ml-tornidor
2
+
3
+ ## Local development
4
+
5
+ Since I use Cloudflare pages as hosting for this project there are some required steps to do before it's possible to start a local development environment. This project needs to wrap the node commands with the `npx wrangler [...]` utility to emulate a Cloudflare Worker function. Because this worker function is under auth which use some env variables I to write these env variables inline. Every time I changed or added needed some variables I also needed to update the `npx wrangler` command. To avoid this I prepared a js script, executed by [Deno](https://deno.land/), that read the env variables from the `.env` file composing the command:
6
+
7
+ 1. prepare the .env file copying the template.env file
8
+ 2. run the local environment using the command `pnpm dev` or `deno run -A runner.js`
9
+
10
+ In case of new or updated packages Deno installs the dependencies at the first execution. Do it with a execution without the `npx wrangler` wrapper:
11
+
12
+ ```bash
13
+ deno run -A --node-modules-dir npm:vite
14
+ ```
15
+
16
+ In case of problem:
17
+
18
+ 1. try executing again the command `deno run -A --node-modules-dir npm:vite`
19
+
20
+ If this don't solve the problems try to
21
+
22
+ 1. delete the node_modules folder
23
+ 2. reinstall the npm packages with `pnpm install`
24
+ 3. Run again the local development server, this time with the standard command
25
+
26
+ Before to commit try also to build using
27
+
28
+ ```bash
29
+ pnpm build
30
+ ```
31
+
32
+ Then run the preview (change the example variables):
33
+
34
+ ```bash
35
+ npx wrangler pages dev --binding VITE_AUTH0_DOMAIN="example-auth0.eu.auth0.com" API_URL="https://example-aws.execute-api.eu-west-1.amazonaws.com/localhost/lambda-ml-fastsam-api" VITE_AUTH0_AUDIENCE="http://localhost-ml-lambda/" API_DOMAIN=example-aws.execute-api.eu-west-1.amazonaws.com CORS_ALLOWED_DOMAIN=http://localhost:8788 VITE_SATELLITE_NAME="tile-provider.image-type" -- pnpm preview
36
+ ```
static/app.js DELETED
@@ -1,35 +0,0 @@
1
- const jsonBtn = document.getElementById("getJson");
2
- const apiBtn = document.getElementById("getApi");
3
- const output = document.getElementById("output");
4
- const coordsForm = document.getElementById("coords-form");
5
-
6
- function formData2json(dataId, newObj={}) {
7
- const formData = new FormData(dataId);
8
- formData.forEach(function(value, key){
9
- console.log(`formData2json:: key=${key}, value=${value}.`)
10
- newObj[key] = value;
11
- });
12
- return JSON.stringify(newObj);
13
- }
14
-
15
- coordsForm.addEventListener('submit', event => {
16
- event.preventDefault();
17
- console.log("coordsForm::", coordsForm, "#")
18
- const inputJson = formData2json(coordsForm)
19
- console.log("inputJson", inputJson, "#");
20
-
21
- fetch('/infer_samgis', {
22
- method: 'POST', // or 'PUT'
23
- body: inputJson, // a FormData will automatically set the 'Content-Type',
24
- headers: {"Content-Type": "application/json"},
25
- }).then(function (response) {
26
- return response.json();
27
- }).then(function (data) {
28
- console.log("data:", data, "#")
29
- output.innerHTML = JSON.stringify(data)
30
- }).catch(function (err) {
31
- console.log("err:", err, "#")
32
- output.innerHTML = `err:${JSON.stringify(err)}.`;
33
- });
34
- event.preventDefault();
35
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/env.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ /// <reference types="vite/client" />
static/index.html CHANGED
@@ -1,44 +1,18 @@
1
  <!DOCTYPE html>
2
  <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" />
8
- <title>Fetch API</title>
9
- </head>
10
- <body>
11
- <div class="container">
12
- <h1>Fetch API</h1>
13
- <form id="coords-form">
14
- <label>
15
- bbox: x1 <input type="number" id="x-center-form" name="x1" value="-122.1497"/>
16
- </label>
17
- <label>
18
- bbox: x2 <input type="number" id="y-center-form" name="x2" value="37.6311"/>
19
- </label>
20
- <label>
21
- bbox: y1 <input type="number" id="y-center-form" name="y1" value="-122.1203"/>
22
- </label>
23
- <label>
24
- bbox: y2 <input type="number" id="y-center-form" name="y2" value="37.6458"/>
25
- </label>
26
- <br/><br/>
27
- <label>
28
- x point: <input type="number" id="x-form" name="x" value="-122.1419"/>
29
- </label>
30
- <label>
31
- y point: <input type="number" id="y-form" name="y" value="37.6383"/>
32
- </label>
33
- <label>
34
- zoom: <input type="number" id="zoom" name="y" value="6"/>
35
- </label>
36
- <br/><br/>
37
- <button type="submit" id="submit-btn">submit form</button>
38
- </form>
39
- <br><br>
40
- <div id="output"></div>
41
- </div>
42
- <script src="app.js"></script>
43
- </body>
44
  </html>
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <link href="output.css" rel="stylesheet" type="text/css">
7
+ <link href="dist/output.css" rel="stylesheet" type="text/css">
8
+ <link rel="icon" href="/favicon.ico" sizes="32x32">
9
+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
10
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png"><!-- 180×180 -->
11
+ <link rel="manifest" href="/manifest.webmanifest">
12
+ <title>ML on GIS</title>
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ <script type="module" src="/src/main.ts"></script>
17
+ </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  </html>
static/package.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ml-trinca",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "build": "vite build",
8
+ "preview": "vite preview --port 5173",
9
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore"
10
+ },
11
+ "type": "module",
12
+ "dependencies": {
13
+ "@geoman-io/leaflet-geoman-free": "^2.15.0",
14
+ "leaflet": "^1.9.4",
15
+ "leaflet-providers": "^2.0.0",
16
+ "vue": "^3.3.12"
17
+ },
18
+ "devDependencies": {
19
+ "@headlessui/vue": "^1.7.16",
20
+ "@heroicons/vue": "^2.0.18",
21
+ "@tsconfig/node20": "^20.1.2",
22
+ "@types/leaflet": "^1.9.8",
23
+ "@types/node": "^20.10.5",
24
+ "@vitejs/plugin-vue": "^4.5.2",
25
+ "@vue/tsconfig": "^0.5.1",
26
+ "autoprefixer": "^10.4.16",
27
+ "eslint": "^8.56.0",
28
+ "eslint-plugin-vue": "^9.19.2",
29
+ "postcss": "^8.4.32",
30
+ "postcss-import": "^15.1.0",
31
+ "prettier": "^3.1.1",
32
+ "tailwindcss": "^3.3.6",
33
+ "vite": "^5.0.10"
34
+ }
35
+ }
static/pnpm-lock.yaml ADDED
@@ -0,0 +1,2063 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ lockfileVersion: '6.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ dependencies:
8
+ '@geoman-io/leaflet-geoman-free':
9
+ specifier: ^2.15.0
10
+ version: 2.15.0(leaflet@1.9.4)
11
+ leaflet:
12
+ specifier: ^1.9.4
13
+ version: 1.9.4
14
+ leaflet-providers:
15
+ specifier: ^2.0.0
16
+ version: 2.0.0
17
+ vue:
18
+ specifier: ^3.3.12
19
+ version: 3.3.13
20
+
21
+ devDependencies:
22
+ '@headlessui/vue':
23
+ specifier: ^1.7.16
24
+ version: 1.7.16(vue@3.3.13)
25
+ '@heroicons/vue':
26
+ specifier: ^2.0.18
27
+ version: 2.1.1(vue@3.3.13)
28
+ '@tsconfig/node20':
29
+ specifier: ^20.1.2
30
+ version: 20.1.2
31
+ '@types/leaflet':
32
+ specifier: ^1.9.8
33
+ version: 1.9.8
34
+ '@types/node':
35
+ specifier: ^20.10.5
36
+ version: 20.10.5
37
+ '@vitejs/plugin-vue':
38
+ specifier: ^4.5.2
39
+ version: 4.5.2(vite@5.0.10)(vue@3.3.13)
40
+ '@vue/tsconfig':
41
+ specifier: ^0.5.1
42
+ version: 0.5.1
43
+ autoprefixer:
44
+ specifier: ^10.4.16
45
+ version: 10.4.16(postcss@8.4.32)
46
+ eslint:
47
+ specifier: ^8.56.0
48
+ version: 8.56.0
49
+ eslint-plugin-vue:
50
+ specifier: ^9.19.2
51
+ version: 9.19.2(eslint@8.56.0)
52
+ postcss:
53
+ specifier: ^8.4.32
54
+ version: 8.4.32
55
+ postcss-import:
56
+ specifier: ^15.1.0
57
+ version: 15.1.0(postcss@8.4.32)
58
+ prettier:
59
+ specifier: ^3.1.1
60
+ version: 3.1.1
61
+ tailwindcss:
62
+ specifier: ^3.3.6
63
+ version: 3.4.0
64
+ vite:
65
+ specifier: ^5.0.10
66
+ version: 5.0.10(@types/node@20.10.5)
67
+
68
+ packages:
69
+
70
+ /@aashutoshrathi/word-wrap@1.2.6:
71
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
72
+ engines: {node: '>=0.10.0'}
73
+ dev: true
74
+
75
+ /@alloc/quick-lru@5.2.0:
76
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
77
+ engines: {node: '>=10'}
78
+ dev: true
79
+
80
+ /@babel/helper-string-parser@7.23.4:
81
+ resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
82
+ engines: {node: '>=6.9.0'}
83
+
84
+ /@babel/helper-validator-identifier@7.22.20:
85
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
86
+ engines: {node: '>=6.9.0'}
87
+
88
+ /@babel/parser@7.23.6:
89
+ resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==}
90
+ engines: {node: '>=6.0.0'}
91
+ hasBin: true
92
+ dependencies:
93
+ '@babel/types': 7.23.6
94
+
95
+ /@babel/types@7.23.6:
96
+ resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
97
+ engines: {node: '>=6.9.0'}
98
+ dependencies:
99
+ '@babel/helper-string-parser': 7.23.4
100
+ '@babel/helper-validator-identifier': 7.22.20
101
+ to-fast-properties: 2.0.0
102
+
103
+ /@esbuild/aix-ppc64@0.19.10:
104
+ resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==}
105
+ engines: {node: '>=12'}
106
+ cpu: [ppc64]
107
+ os: [aix]
108
+ requiresBuild: true
109
+ dev: true
110
+ optional: true
111
+
112
+ /@esbuild/android-arm64@0.19.10:
113
+ resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==}
114
+ engines: {node: '>=12'}
115
+ cpu: [arm64]
116
+ os: [android]
117
+ requiresBuild: true
118
+ dev: true
119
+ optional: true
120
+
121
+ /@esbuild/android-arm@0.19.10:
122
+ resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==}
123
+ engines: {node: '>=12'}
124
+ cpu: [arm]
125
+ os: [android]
126
+ requiresBuild: true
127
+ dev: true
128
+ optional: true
129
+
130
+ /@esbuild/android-x64@0.19.10:
131
+ resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==}
132
+ engines: {node: '>=12'}
133
+ cpu: [x64]
134
+ os: [android]
135
+ requiresBuild: true
136
+ dev: true
137
+ optional: true
138
+
139
+ /@esbuild/darwin-arm64@0.19.10:
140
+ resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==}
141
+ engines: {node: '>=12'}
142
+ cpu: [arm64]
143
+ os: [darwin]
144
+ requiresBuild: true
145
+ dev: true
146
+ optional: true
147
+
148
+ /@esbuild/darwin-x64@0.19.10:
149
+ resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==}
150
+ engines: {node: '>=12'}
151
+ cpu: [x64]
152
+ os: [darwin]
153
+ requiresBuild: true
154
+ dev: true
155
+ optional: true
156
+
157
+ /@esbuild/freebsd-arm64@0.19.10:
158
+ resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==}
159
+ engines: {node: '>=12'}
160
+ cpu: [arm64]
161
+ os: [freebsd]
162
+ requiresBuild: true
163
+ dev: true
164
+ optional: true
165
+
166
+ /@esbuild/freebsd-x64@0.19.10:
167
+ resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==}
168
+ engines: {node: '>=12'}
169
+ cpu: [x64]
170
+ os: [freebsd]
171
+ requiresBuild: true
172
+ dev: true
173
+ optional: true
174
+
175
+ /@esbuild/linux-arm64@0.19.10:
176
+ resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==}
177
+ engines: {node: '>=12'}
178
+ cpu: [arm64]
179
+ os: [linux]
180
+ requiresBuild: true
181
+ dev: true
182
+ optional: true
183
+
184
+ /@esbuild/linux-arm@0.19.10:
185
+ resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==}
186
+ engines: {node: '>=12'}
187
+ cpu: [arm]
188
+ os: [linux]
189
+ requiresBuild: true
190
+ dev: true
191
+ optional: true
192
+
193
+ /@esbuild/linux-ia32@0.19.10:
194
+ resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==}
195
+ engines: {node: '>=12'}
196
+ cpu: [ia32]
197
+ os: [linux]
198
+ requiresBuild: true
199
+ dev: true
200
+ optional: true
201
+
202
+ /@esbuild/linux-loong64@0.19.10:
203
+ resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==}
204
+ engines: {node: '>=12'}
205
+ cpu: [loong64]
206
+ os: [linux]
207
+ requiresBuild: true
208
+ dev: true
209
+ optional: true
210
+
211
+ /@esbuild/linux-mips64el@0.19.10:
212
+ resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==}
213
+ engines: {node: '>=12'}
214
+ cpu: [mips64el]
215
+ os: [linux]
216
+ requiresBuild: true
217
+ dev: true
218
+ optional: true
219
+
220
+ /@esbuild/linux-ppc64@0.19.10:
221
+ resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==}
222
+ engines: {node: '>=12'}
223
+ cpu: [ppc64]
224
+ os: [linux]
225
+ requiresBuild: true
226
+ dev: true
227
+ optional: true
228
+
229
+ /@esbuild/linux-riscv64@0.19.10:
230
+ resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==}
231
+ engines: {node: '>=12'}
232
+ cpu: [riscv64]
233
+ os: [linux]
234
+ requiresBuild: true
235
+ dev: true
236
+ optional: true
237
+
238
+ /@esbuild/linux-s390x@0.19.10:
239
+ resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==}
240
+ engines: {node: '>=12'}
241
+ cpu: [s390x]
242
+ os: [linux]
243
+ requiresBuild: true
244
+ dev: true
245
+ optional: true
246
+
247
+ /@esbuild/linux-x64@0.19.10:
248
+ resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==}
249
+ engines: {node: '>=12'}
250
+ cpu: [x64]
251
+ os: [linux]
252
+ requiresBuild: true
253
+ dev: true
254
+ optional: true
255
+
256
+ /@esbuild/netbsd-x64@0.19.10:
257
+ resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==}
258
+ engines: {node: '>=12'}
259
+ cpu: [x64]
260
+ os: [netbsd]
261
+ requiresBuild: true
262
+ dev: true
263
+ optional: true
264
+
265
+ /@esbuild/openbsd-x64@0.19.10:
266
+ resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==}
267
+ engines: {node: '>=12'}
268
+ cpu: [x64]
269
+ os: [openbsd]
270
+ requiresBuild: true
271
+ dev: true
272
+ optional: true
273
+
274
+ /@esbuild/sunos-x64@0.19.10:
275
+ resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==}
276
+ engines: {node: '>=12'}
277
+ cpu: [x64]
278
+ os: [sunos]
279
+ requiresBuild: true
280
+ dev: true
281
+ optional: true
282
+
283
+ /@esbuild/win32-arm64@0.19.10:
284
+ resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==}
285
+ engines: {node: '>=12'}
286
+ cpu: [arm64]
287
+ os: [win32]
288
+ requiresBuild: true
289
+ dev: true
290
+ optional: true
291
+
292
+ /@esbuild/win32-ia32@0.19.10:
293
+ resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==}
294
+ engines: {node: '>=12'}
295
+ cpu: [ia32]
296
+ os: [win32]
297
+ requiresBuild: true
298
+ dev: true
299
+ optional: true
300
+
301
+ /@esbuild/win32-x64@0.19.10:
302
+ resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==}
303
+ engines: {node: '>=12'}
304
+ cpu: [x64]
305
+ os: [win32]
306
+ requiresBuild: true
307
+ dev: true
308
+ optional: true
309
+
310
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
311
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
312
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
313
+ peerDependencies:
314
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
315
+ dependencies:
316
+ eslint: 8.56.0
317
+ eslint-visitor-keys: 3.4.3
318
+ dev: true
319
+
320
+ /@eslint-community/regexpp@4.10.0:
321
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
322
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
323
+ dev: true
324
+
325
+ /@eslint/eslintrc@2.1.4:
326
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
327
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
328
+ dependencies:
329
+ ajv: 6.12.6
330
+ debug: 4.3.4
331
+ espree: 9.6.1
332
+ globals: 13.24.0
333
+ ignore: 5.3.0
334
+ import-fresh: 3.3.0
335
+ js-yaml: 4.1.0
336
+ minimatch: 3.1.2
337
+ strip-json-comments: 3.1.1
338
+ transitivePeerDependencies:
339
+ - supports-color
340
+ dev: true
341
+
342
+ /@eslint/js@8.56.0:
343
+ resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
344
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
345
+ dev: true
346
+
347
+ /@geoman-io/leaflet-geoman-free@2.15.0(leaflet@1.9.4):
348
+ resolution: {integrity: sha512-esann1pQ8cCX3pMR7XkXuf1vwwJLz1mAbkeyRWOfoLMKA8LBnbRxChIBZzzwzyGIxybNO93Bl6LaK8wEj8uzlA==}
349
+ peerDependencies:
350
+ leaflet: ^1.2.0
351
+ dependencies:
352
+ '@turf/boolean-contains': 6.5.0
353
+ '@turf/kinks': 6.5.0
354
+ '@turf/line-intersect': 6.5.0
355
+ '@turf/line-split': 6.5.0
356
+ leaflet: 1.9.4
357
+ lodash: 4.17.21
358
+ polygon-clipping: 0.15.3
359
+ dev: false
360
+
361
+ /@headlessui/vue@1.7.16(vue@3.3.13):
362
+ resolution: {integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==}
363
+ engines: {node: '>=10'}
364
+ peerDependencies:
365
+ vue: ^3.2.0
366
+ dependencies:
367
+ vue: 3.3.13
368
+ dev: true
369
+
370
+ /@heroicons/vue@2.1.1(vue@3.3.13):
371
+ resolution: {integrity: sha512-Yi5nh/89L193ALgHyJUQUdNLsKXPrrE3yj5yiR8WAlo7nZyXGxGauQcEAmBsa2XJGMhBMuEdoOiuZ8wEwTBxVQ==}
372
+ peerDependencies:
373
+ vue: '>= 3'
374
+ dependencies:
375
+ vue: 3.3.13
376
+ dev: true
377
+
378
+ /@humanwhocodes/config-array@0.11.13:
379
+ resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
380
+ engines: {node: '>=10.10.0'}
381
+ dependencies:
382
+ '@humanwhocodes/object-schema': 2.0.1
383
+ debug: 4.3.4
384
+ minimatch: 3.1.2
385
+ transitivePeerDependencies:
386
+ - supports-color
387
+ dev: true
388
+
389
+ /@humanwhocodes/module-importer@1.0.1:
390
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
391
+ engines: {node: '>=12.22'}
392
+ dev: true
393
+
394
+ /@humanwhocodes/object-schema@2.0.1:
395
+ resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
396
+ dev: true
397
+
398
+ /@jridgewell/gen-mapping@0.3.3:
399
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
400
+ engines: {node: '>=6.0.0'}
401
+ dependencies:
402
+ '@jridgewell/set-array': 1.1.2
403
+ '@jridgewell/sourcemap-codec': 1.4.15
404
+ '@jridgewell/trace-mapping': 0.3.20
405
+ dev: true
406
+
407
+ /@jridgewell/resolve-uri@3.1.1:
408
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
409
+ engines: {node: '>=6.0.0'}
410
+ dev: true
411
+
412
+ /@jridgewell/set-array@1.1.2:
413
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
414
+ engines: {node: '>=6.0.0'}
415
+ dev: true
416
+
417
+ /@jridgewell/sourcemap-codec@1.4.15:
418
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
419
+
420
+ /@jridgewell/trace-mapping@0.3.20:
421
+ resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
422
+ dependencies:
423
+ '@jridgewell/resolve-uri': 3.1.1
424
+ '@jridgewell/sourcemap-codec': 1.4.15
425
+ dev: true
426
+
427
+ /@nodelib/fs.scandir@2.1.5:
428
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
429
+ engines: {node: '>= 8'}
430
+ dependencies:
431
+ '@nodelib/fs.stat': 2.0.5
432
+ run-parallel: 1.2.0
433
+ dev: true
434
+
435
+ /@nodelib/fs.stat@2.0.5:
436
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
437
+ engines: {node: '>= 8'}
438
+ dev: true
439
+
440
+ /@nodelib/fs.walk@1.2.8:
441
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
442
+ engines: {node: '>= 8'}
443
+ dependencies:
444
+ '@nodelib/fs.scandir': 2.1.5
445
+ fastq: 1.16.0
446
+ dev: true
447
+
448
+ /@rollup/rollup-android-arm-eabi@4.9.1:
449
+ resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==}
450
+ cpu: [arm]
451
+ os: [android]
452
+ requiresBuild: true
453
+ dev: true
454
+ optional: true
455
+
456
+ /@rollup/rollup-android-arm64@4.9.1:
457
+ resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==}
458
+ cpu: [arm64]
459
+ os: [android]
460
+ requiresBuild: true
461
+ dev: true
462
+ optional: true
463
+
464
+ /@rollup/rollup-darwin-arm64@4.9.1:
465
+ resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==}
466
+ cpu: [arm64]
467
+ os: [darwin]
468
+ requiresBuild: true
469
+ dev: true
470
+ optional: true
471
+
472
+ /@rollup/rollup-darwin-x64@4.9.1:
473
+ resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==}
474
+ cpu: [x64]
475
+ os: [darwin]
476
+ requiresBuild: true
477
+ dev: true
478
+ optional: true
479
+
480
+ /@rollup/rollup-linux-arm-gnueabihf@4.9.1:
481
+ resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==}
482
+ cpu: [arm]
483
+ os: [linux]
484
+ requiresBuild: true
485
+ dev: true
486
+ optional: true
487
+
488
+ /@rollup/rollup-linux-arm64-gnu@4.9.1:
489
+ resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==}
490
+ cpu: [arm64]
491
+ os: [linux]
492
+ requiresBuild: true
493
+ dev: true
494
+ optional: true
495
+
496
+ /@rollup/rollup-linux-arm64-musl@4.9.1:
497
+ resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==}
498
+ cpu: [arm64]
499
+ os: [linux]
500
+ requiresBuild: true
501
+ dev: true
502
+ optional: true
503
+
504
+ /@rollup/rollup-linux-riscv64-gnu@4.9.1:
505
+ resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==}
506
+ cpu: [riscv64]
507
+ os: [linux]
508
+ requiresBuild: true
509
+ dev: true
510
+ optional: true
511
+
512
+ /@rollup/rollup-linux-x64-gnu@4.9.1:
513
+ resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==}
514
+ cpu: [x64]
515
+ os: [linux]
516
+ requiresBuild: true
517
+ dev: true
518
+ optional: true
519
+
520
+ /@rollup/rollup-linux-x64-musl@4.9.1:
521
+ resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==}
522
+ cpu: [x64]
523
+ os: [linux]
524
+ requiresBuild: true
525
+ dev: true
526
+ optional: true
527
+
528
+ /@rollup/rollup-win32-arm64-msvc@4.9.1:
529
+ resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==}
530
+ cpu: [arm64]
531
+ os: [win32]
532
+ requiresBuild: true
533
+ dev: true
534
+ optional: true
535
+
536
+ /@rollup/rollup-win32-ia32-msvc@4.9.1:
537
+ resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==}
538
+ cpu: [ia32]
539
+ os: [win32]
540
+ requiresBuild: true
541
+ dev: true
542
+ optional: true
543
+
544
+ /@rollup/rollup-win32-x64-msvc@4.9.1:
545
+ resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==}
546
+ cpu: [x64]
547
+ os: [win32]
548
+ requiresBuild: true
549
+ dev: true
550
+ optional: true
551
+
552
+ /@tsconfig/node20@20.1.2:
553
+ resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==}
554
+ dev: true
555
+
556
+ /@turf/bbox@6.5.0:
557
+ resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==}
558
+ dependencies:
559
+ '@turf/helpers': 6.5.0
560
+ '@turf/meta': 6.5.0
561
+ dev: false
562
+
563
+ /@turf/bearing@6.5.0:
564
+ resolution: {integrity: sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==}
565
+ dependencies:
566
+ '@turf/helpers': 6.5.0
567
+ '@turf/invariant': 6.5.0
568
+ dev: false
569
+
570
+ /@turf/boolean-contains@6.5.0:
571
+ resolution: {integrity: sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==}
572
+ dependencies:
573
+ '@turf/bbox': 6.5.0
574
+ '@turf/boolean-point-in-polygon': 6.5.0
575
+ '@turf/boolean-point-on-line': 6.5.0
576
+ '@turf/helpers': 6.5.0
577
+ '@turf/invariant': 6.5.0
578
+ dev: false
579
+
580
+ /@turf/boolean-point-in-polygon@6.5.0:
581
+ resolution: {integrity: sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==}
582
+ dependencies:
583
+ '@turf/helpers': 6.5.0
584
+ '@turf/invariant': 6.5.0
585
+ dev: false
586
+
587
+ /@turf/boolean-point-on-line@6.5.0:
588
+ resolution: {integrity: sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==}
589
+ dependencies:
590
+ '@turf/helpers': 6.5.0
591
+ '@turf/invariant': 6.5.0
592
+ dev: false
593
+
594
+ /@turf/destination@6.5.0:
595
+ resolution: {integrity: sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==}
596
+ dependencies:
597
+ '@turf/helpers': 6.5.0
598
+ '@turf/invariant': 6.5.0
599
+ dev: false
600
+
601
+ /@turf/distance@6.5.0:
602
+ resolution: {integrity: sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==}
603
+ dependencies:
604
+ '@turf/helpers': 6.5.0
605
+ '@turf/invariant': 6.5.0
606
+ dev: false
607
+
608
+ /@turf/helpers@6.5.0:
609
+ resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==}
610
+ dev: false
611
+
612
+ /@turf/invariant@6.5.0:
613
+ resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==}
614
+ dependencies:
615
+ '@turf/helpers': 6.5.0
616
+ dev: false
617
+
618
+ /@turf/kinks@6.5.0:
619
+ resolution: {integrity: sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==}
620
+ dependencies:
621
+ '@turf/helpers': 6.5.0
622
+ dev: false
623
+
624
+ /@turf/line-intersect@6.5.0:
625
+ resolution: {integrity: sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==}
626
+ dependencies:
627
+ '@turf/helpers': 6.5.0
628
+ '@turf/invariant': 6.5.0
629
+ '@turf/line-segment': 6.5.0
630
+ '@turf/meta': 6.5.0
631
+ geojson-rbush: 3.2.0
632
+ dev: false
633
+
634
+ /@turf/line-segment@6.5.0:
635
+ resolution: {integrity: sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==}
636
+ dependencies:
637
+ '@turf/helpers': 6.5.0
638
+ '@turf/invariant': 6.5.0
639
+ '@turf/meta': 6.5.0
640
+ dev: false
641
+
642
+ /@turf/line-split@6.5.0:
643
+ resolution: {integrity: sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==}
644
+ dependencies:
645
+ '@turf/bbox': 6.5.0
646
+ '@turf/helpers': 6.5.0
647
+ '@turf/invariant': 6.5.0
648
+ '@turf/line-intersect': 6.5.0
649
+ '@turf/line-segment': 6.5.0
650
+ '@turf/meta': 6.5.0
651
+ '@turf/nearest-point-on-line': 6.5.0
652
+ '@turf/square': 6.5.0
653
+ '@turf/truncate': 6.5.0
654
+ geojson-rbush: 3.2.0
655
+ dev: false
656
+
657
+ /@turf/meta@6.5.0:
658
+ resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==}
659
+ dependencies:
660
+ '@turf/helpers': 6.5.0
661
+ dev: false
662
+
663
+ /@turf/nearest-point-on-line@6.5.0:
664
+ resolution: {integrity: sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==}
665
+ dependencies:
666
+ '@turf/bearing': 6.5.0
667
+ '@turf/destination': 6.5.0
668
+ '@turf/distance': 6.5.0
669
+ '@turf/helpers': 6.5.0
670
+ '@turf/invariant': 6.5.0
671
+ '@turf/line-intersect': 6.5.0
672
+ '@turf/meta': 6.5.0
673
+ dev: false
674
+
675
+ /@turf/square@6.5.0:
676
+ resolution: {integrity: sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==}
677
+ dependencies:
678
+ '@turf/distance': 6.5.0
679
+ '@turf/helpers': 6.5.0
680
+ dev: false
681
+
682
+ /@turf/truncate@6.5.0:
683
+ resolution: {integrity: sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==}
684
+ dependencies:
685
+ '@turf/helpers': 6.5.0
686
+ '@turf/meta': 6.5.0
687
+ dev: false
688
+
689
+ /@types/geojson@7946.0.13:
690
+ resolution: {integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==}
691
+ dev: true
692
+
693
+ /@types/geojson@7946.0.8:
694
+ resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==}
695
+ dev: false
696
+
697
+ /@types/leaflet@1.9.8:
698
+ resolution: {integrity: sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==}
699
+ dependencies:
700
+ '@types/geojson': 7946.0.13
701
+ dev: true
702
+
703
+ /@types/node@20.10.5:
704
+ resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==}
705
+ dependencies:
706
+ undici-types: 5.26.5
707
+ dev: true
708
+
709
+ /@ungap/structured-clone@1.2.0:
710
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
711
+ dev: true
712
+
713
+ /@vitejs/plugin-vue@4.5.2(vite@5.0.10)(vue@3.3.13):
714
+ resolution: {integrity: sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==}
715
+ engines: {node: ^14.18.0 || >=16.0.0}
716
+ peerDependencies:
717
+ vite: ^4.0.0 || ^5.0.0
718
+ vue: ^3.2.25
719
+ dependencies:
720
+ vite: 5.0.10(@types/node@20.10.5)
721
+ vue: 3.3.13
722
+ dev: true
723
+
724
+ /@vue/compiler-core@3.3.13:
725
+ resolution: {integrity: sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==}
726
+ dependencies:
727
+ '@babel/parser': 7.23.6
728
+ '@vue/shared': 3.3.13
729
+ estree-walker: 2.0.2
730
+ source-map-js: 1.0.2
731
+
732
+ /@vue/compiler-dom@3.3.13:
733
+ resolution: {integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==}
734
+ dependencies:
735
+ '@vue/compiler-core': 3.3.13
736
+ '@vue/shared': 3.3.13
737
+
738
+ /@vue/compiler-sfc@3.3.13:
739
+ resolution: {integrity: sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==}
740
+ dependencies:
741
+ '@babel/parser': 7.23.6
742
+ '@vue/compiler-core': 3.3.13
743
+ '@vue/compiler-dom': 3.3.13
744
+ '@vue/compiler-ssr': 3.3.13
745
+ '@vue/reactivity-transform': 3.3.13
746
+ '@vue/shared': 3.3.13
747
+ estree-walker: 2.0.2
748
+ magic-string: 0.30.5
749
+ postcss: 8.4.32
750
+ source-map-js: 1.0.2
751
+
752
+ /@vue/compiler-ssr@3.3.13:
753
+ resolution: {integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==}
754
+ dependencies:
755
+ '@vue/compiler-dom': 3.3.13
756
+ '@vue/shared': 3.3.13
757
+
758
+ /@vue/reactivity-transform@3.3.13:
759
+ resolution: {integrity: sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==}
760
+ dependencies:
761
+ '@babel/parser': 7.23.6
762
+ '@vue/compiler-core': 3.3.13
763
+ '@vue/shared': 3.3.13
764
+ estree-walker: 2.0.2
765
+ magic-string: 0.30.5
766
+
767
+ /@vue/reactivity@3.3.13:
768
+ resolution: {integrity: sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==}
769
+ dependencies:
770
+ '@vue/shared': 3.3.13
771
+
772
+ /@vue/runtime-core@3.3.13:
773
+ resolution: {integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==}
774
+ dependencies:
775
+ '@vue/reactivity': 3.3.13
776
+ '@vue/shared': 3.3.13
777
+
778
+ /@vue/runtime-dom@3.3.13:
779
+ resolution: {integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==}
780
+ dependencies:
781
+ '@vue/runtime-core': 3.3.13
782
+ '@vue/shared': 3.3.13
783
+ csstype: 3.1.3
784
+
785
+ /@vue/server-renderer@3.3.13(vue@3.3.13):
786
+ resolution: {integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==}
787
+ peerDependencies:
788
+ vue: 3.3.13
789
+ dependencies:
790
+ '@vue/compiler-ssr': 3.3.13
791
+ '@vue/shared': 3.3.13
792
+ vue: 3.3.13
793
+
794
+ /@vue/shared@3.3.13:
795
+ resolution: {integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==}
796
+
797
+ /@vue/tsconfig@0.5.1:
798
+ resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==}
799
+ dev: true
800
+
801
+ /acorn-jsx@5.3.2(acorn@8.11.2):
802
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
803
+ peerDependencies:
804
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
805
+ dependencies:
806
+ acorn: 8.11.2
807
+ dev: true
808
+
809
+ /acorn@8.11.2:
810
+ resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==}
811
+ engines: {node: '>=0.4.0'}
812
+ hasBin: true
813
+ dev: true
814
+
815
+ /ajv@6.12.6:
816
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
817
+ dependencies:
818
+ fast-deep-equal: 3.1.3
819
+ fast-json-stable-stringify: 2.1.0
820
+ json-schema-traverse: 0.4.1
821
+ uri-js: 4.4.1
822
+ dev: true
823
+
824
+ /ansi-regex@5.0.1:
825
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
826
+ engines: {node: '>=8'}
827
+ dev: true
828
+
829
+ /ansi-styles@4.3.0:
830
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
831
+ engines: {node: '>=8'}
832
+ dependencies:
833
+ color-convert: 2.0.1
834
+ dev: true
835
+
836
+ /any-promise@1.3.0:
837
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
838
+ dev: true
839
+
840
+ /anymatch@3.1.3:
841
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
842
+ engines: {node: '>= 8'}
843
+ dependencies:
844
+ normalize-path: 3.0.0
845
+ picomatch: 2.3.1
846
+ dev: true
847
+
848
+ /arg@5.0.2:
849
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
850
+ dev: true
851
+
852
+ /argparse@2.0.1:
853
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
854
+ dev: true
855
+
856
+ /autoprefixer@10.4.16(postcss@8.4.32):
857
+ resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
858
+ engines: {node: ^10 || ^12 || >=14}
859
+ hasBin: true
860
+ peerDependencies:
861
+ postcss: ^8.1.0
862
+ dependencies:
863
+ browserslist: 4.22.2
864
+ caniuse-lite: 1.0.30001570
865
+ fraction.js: 4.3.7
866
+ normalize-range: 0.1.2
867
+ picocolors: 1.0.0
868
+ postcss: 8.4.32
869
+ postcss-value-parser: 4.2.0
870
+ dev: true
871
+
872
+ /balanced-match@1.0.2:
873
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
874
+ dev: true
875
+
876
+ /binary-extensions@2.2.0:
877
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
878
+ engines: {node: '>=8'}
879
+ dev: true
880
+
881
+ /boolbase@1.0.0:
882
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
883
+ dev: true
884
+
885
+ /brace-expansion@1.1.11:
886
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
887
+ dependencies:
888
+ balanced-match: 1.0.2
889
+ concat-map: 0.0.1
890
+ dev: true
891
+
892
+ /braces@3.0.2:
893
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
894
+ engines: {node: '>=8'}
895
+ dependencies:
896
+ fill-range: 7.0.1
897
+ dev: true
898
+
899
+ /browserslist@4.22.2:
900
+ resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==}
901
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
902
+ hasBin: true
903
+ dependencies:
904
+ caniuse-lite: 1.0.30001570
905
+ electron-to-chromium: 1.4.615
906
+ node-releases: 2.0.14
907
+ update-browserslist-db: 1.0.13(browserslist@4.22.2)
908
+ dev: true
909
+
910
+ /callsites@3.1.0:
911
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
912
+ engines: {node: '>=6'}
913
+ dev: true
914
+
915
+ /camelcase-css@2.0.1:
916
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
917
+ engines: {node: '>= 6'}
918
+ dev: true
919
+
920
+ /caniuse-lite@1.0.30001570:
921
+ resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==}
922
+ dev: true
923
+
924
+ /chalk@4.1.2:
925
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
926
+ engines: {node: '>=10'}
927
+ dependencies:
928
+ ansi-styles: 4.3.0
929
+ supports-color: 7.2.0
930
+ dev: true
931
+
932
+ /chokidar@3.5.3:
933
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
934
+ engines: {node: '>= 8.10.0'}
935
+ dependencies:
936
+ anymatch: 3.1.3
937
+ braces: 3.0.2
938
+ glob-parent: 5.1.2
939
+ is-binary-path: 2.1.0
940
+ is-glob: 4.0.3
941
+ normalize-path: 3.0.0
942
+ readdirp: 3.6.0
943
+ optionalDependencies:
944
+ fsevents: 2.3.3
945
+ dev: true
946
+
947
+ /color-convert@2.0.1:
948
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
949
+ engines: {node: '>=7.0.0'}
950
+ dependencies:
951
+ color-name: 1.1.4
952
+ dev: true
953
+
954
+ /color-name@1.1.4:
955
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
956
+ dev: true
957
+
958
+ /commander@4.1.1:
959
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
960
+ engines: {node: '>= 6'}
961
+ dev: true
962
+
963
+ /concat-map@0.0.1:
964
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
965
+ dev: true
966
+
967
+ /cross-spawn@7.0.3:
968
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
969
+ engines: {node: '>= 8'}
970
+ dependencies:
971
+ path-key: 3.1.1
972
+ shebang-command: 2.0.0
973
+ which: 2.0.2
974
+ dev: true
975
+
976
+ /cssesc@3.0.0:
977
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
978
+ engines: {node: '>=4'}
979
+ hasBin: true
980
+ dev: true
981
+
982
+ /csstype@3.1.3:
983
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
984
+
985
+ /debug@4.3.4:
986
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
987
+ engines: {node: '>=6.0'}
988
+ peerDependencies:
989
+ supports-color: '*'
990
+ peerDependenciesMeta:
991
+ supports-color:
992
+ optional: true
993
+ dependencies:
994
+ ms: 2.1.2
995
+ dev: true
996
+
997
+ /deep-is@0.1.4:
998
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
999
+ dev: true
1000
+
1001
+ /didyoumean@1.2.2:
1002
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
1003
+ dev: true
1004
+
1005
+ /dlv@1.1.3:
1006
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
1007
+ dev: true
1008
+
1009
+ /doctrine@3.0.0:
1010
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
1011
+ engines: {node: '>=6.0.0'}
1012
+ dependencies:
1013
+ esutils: 2.0.3
1014
+ dev: true
1015
+
1016
+ /electron-to-chromium@1.4.615:
1017
+ resolution: {integrity: sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==}
1018
+ dev: true
1019
+
1020
+ /esbuild@0.19.10:
1021
+ resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==}
1022
+ engines: {node: '>=12'}
1023
+ hasBin: true
1024
+ requiresBuild: true
1025
+ optionalDependencies:
1026
+ '@esbuild/aix-ppc64': 0.19.10
1027
+ '@esbuild/android-arm': 0.19.10
1028
+ '@esbuild/android-arm64': 0.19.10
1029
+ '@esbuild/android-x64': 0.19.10
1030
+ '@esbuild/darwin-arm64': 0.19.10
1031
+ '@esbuild/darwin-x64': 0.19.10
1032
+ '@esbuild/freebsd-arm64': 0.19.10
1033
+ '@esbuild/freebsd-x64': 0.19.10
1034
+ '@esbuild/linux-arm': 0.19.10
1035
+ '@esbuild/linux-arm64': 0.19.10
1036
+ '@esbuild/linux-ia32': 0.19.10
1037
+ '@esbuild/linux-loong64': 0.19.10
1038
+ '@esbuild/linux-mips64el': 0.19.10
1039
+ '@esbuild/linux-ppc64': 0.19.10
1040
+ '@esbuild/linux-riscv64': 0.19.10
1041
+ '@esbuild/linux-s390x': 0.19.10
1042
+ '@esbuild/linux-x64': 0.19.10
1043
+ '@esbuild/netbsd-x64': 0.19.10
1044
+ '@esbuild/openbsd-x64': 0.19.10
1045
+ '@esbuild/sunos-x64': 0.19.10
1046
+ '@esbuild/win32-arm64': 0.19.10
1047
+ '@esbuild/win32-ia32': 0.19.10
1048
+ '@esbuild/win32-x64': 0.19.10
1049
+ dev: true
1050
+
1051
+ /escalade@3.1.1:
1052
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
1053
+ engines: {node: '>=6'}
1054
+ dev: true
1055
+
1056
+ /escape-string-regexp@4.0.0:
1057
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1058
+ engines: {node: '>=10'}
1059
+ dev: true
1060
+
1061
+ /eslint-plugin-vue@9.19.2(eslint@8.56.0):
1062
+ resolution: {integrity: sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==}
1063
+ engines: {node: ^14.17.0 || >=16.0.0}
1064
+ peerDependencies:
1065
+ eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
1066
+ dependencies:
1067
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
1068
+ eslint: 8.56.0
1069
+ natural-compare: 1.4.0
1070
+ nth-check: 2.1.1
1071
+ postcss-selector-parser: 6.0.13
1072
+ semver: 7.5.4
1073
+ vue-eslint-parser: 9.3.2(eslint@8.56.0)
1074
+ xml-name-validator: 4.0.0
1075
+ transitivePeerDependencies:
1076
+ - supports-color
1077
+ dev: true
1078
+
1079
+ /eslint-scope@7.2.2:
1080
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
1081
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1082
+ dependencies:
1083
+ esrecurse: 4.3.0
1084
+ estraverse: 5.3.0
1085
+ dev: true
1086
+
1087
+ /eslint-visitor-keys@3.4.3:
1088
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1089
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1090
+ dev: true
1091
+
1092
+ /eslint@8.56.0:
1093
+ resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
1094
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1095
+ hasBin: true
1096
+ dependencies:
1097
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
1098
+ '@eslint-community/regexpp': 4.10.0
1099
+ '@eslint/eslintrc': 2.1.4
1100
+ '@eslint/js': 8.56.0
1101
+ '@humanwhocodes/config-array': 0.11.13
1102
+ '@humanwhocodes/module-importer': 1.0.1
1103
+ '@nodelib/fs.walk': 1.2.8
1104
+ '@ungap/structured-clone': 1.2.0
1105
+ ajv: 6.12.6
1106
+ chalk: 4.1.2
1107
+ cross-spawn: 7.0.3
1108
+ debug: 4.3.4
1109
+ doctrine: 3.0.0
1110
+ escape-string-regexp: 4.0.0
1111
+ eslint-scope: 7.2.2
1112
+ eslint-visitor-keys: 3.4.3
1113
+ espree: 9.6.1
1114
+ esquery: 1.5.0
1115
+ esutils: 2.0.3
1116
+ fast-deep-equal: 3.1.3
1117
+ file-entry-cache: 6.0.1
1118
+ find-up: 5.0.0
1119
+ glob-parent: 6.0.2
1120
+ globals: 13.24.0
1121
+ graphemer: 1.4.0
1122
+ ignore: 5.3.0
1123
+ imurmurhash: 0.1.4
1124
+ is-glob: 4.0.3
1125
+ is-path-inside: 3.0.3
1126
+ js-yaml: 4.1.0
1127
+ json-stable-stringify-without-jsonify: 1.0.1
1128
+ levn: 0.4.1
1129
+ lodash.merge: 4.6.2
1130
+ minimatch: 3.1.2
1131
+ natural-compare: 1.4.0
1132
+ optionator: 0.9.3
1133
+ strip-ansi: 6.0.1
1134
+ text-table: 0.2.0
1135
+ transitivePeerDependencies:
1136
+ - supports-color
1137
+ dev: true
1138
+
1139
+ /espree@9.6.1:
1140
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
1141
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1142
+ dependencies:
1143
+ acorn: 8.11.2
1144
+ acorn-jsx: 5.3.2(acorn@8.11.2)
1145
+ eslint-visitor-keys: 3.4.3
1146
+ dev: true
1147
+
1148
+ /esquery@1.5.0:
1149
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
1150
+ engines: {node: '>=0.10'}
1151
+ dependencies:
1152
+ estraverse: 5.3.0
1153
+ dev: true
1154
+
1155
+ /esrecurse@4.3.0:
1156
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1157
+ engines: {node: '>=4.0'}
1158
+ dependencies:
1159
+ estraverse: 5.3.0
1160
+ dev: true
1161
+
1162
+ /estraverse@5.3.0:
1163
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1164
+ engines: {node: '>=4.0'}
1165
+ dev: true
1166
+
1167
+ /estree-walker@2.0.2:
1168
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1169
+
1170
+ /esutils@2.0.3:
1171
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1172
+ engines: {node: '>=0.10.0'}
1173
+ dev: true
1174
+
1175
+ /fast-deep-equal@3.1.3:
1176
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1177
+ dev: true
1178
+
1179
+ /fast-glob@3.3.2:
1180
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
1181
+ engines: {node: '>=8.6.0'}
1182
+ dependencies:
1183
+ '@nodelib/fs.stat': 2.0.5
1184
+ '@nodelib/fs.walk': 1.2.8
1185
+ glob-parent: 5.1.2
1186
+ merge2: 1.4.1
1187
+ micromatch: 4.0.5
1188
+ dev: true
1189
+
1190
+ /fast-json-stable-stringify@2.1.0:
1191
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1192
+ dev: true
1193
+
1194
+ /fast-levenshtein@2.0.6:
1195
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1196
+ dev: true
1197
+
1198
+ /fastq@1.16.0:
1199
+ resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==}
1200
+ dependencies:
1201
+ reusify: 1.0.4
1202
+ dev: true
1203
+
1204
+ /file-entry-cache@6.0.1:
1205
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1206
+ engines: {node: ^10.12.0 || >=12.0.0}
1207
+ dependencies:
1208
+ flat-cache: 3.2.0
1209
+ dev: true
1210
+
1211
+ /fill-range@7.0.1:
1212
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1213
+ engines: {node: '>=8'}
1214
+ dependencies:
1215
+ to-regex-range: 5.0.1
1216
+ dev: true
1217
+
1218
+ /find-up@5.0.0:
1219
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1220
+ engines: {node: '>=10'}
1221
+ dependencies:
1222
+ locate-path: 6.0.0
1223
+ path-exists: 4.0.0
1224
+ dev: true
1225
+
1226
+ /flat-cache@3.2.0:
1227
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
1228
+ engines: {node: ^10.12.0 || >=12.0.0}
1229
+ dependencies:
1230
+ flatted: 3.2.9
1231
+ keyv: 4.5.4
1232
+ rimraf: 3.0.2
1233
+ dev: true
1234
+
1235
+ /flatted@3.2.9:
1236
+ resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
1237
+ dev: true
1238
+
1239
+ /fraction.js@4.3.7:
1240
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
1241
+ dev: true
1242
+
1243
+ /fs.realpath@1.0.0:
1244
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1245
+ dev: true
1246
+
1247
+ /fsevents@2.3.3:
1248
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1249
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1250
+ os: [darwin]
1251
+ requiresBuild: true
1252
+ dev: true
1253
+ optional: true
1254
+
1255
+ /function-bind@1.1.2:
1256
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1257
+ dev: true
1258
+
1259
+ /geojson-rbush@3.2.0:
1260
+ resolution: {integrity: sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==}
1261
+ dependencies:
1262
+ '@turf/bbox': 6.5.0
1263
+ '@turf/helpers': 6.5.0
1264
+ '@turf/meta': 6.5.0
1265
+ '@types/geojson': 7946.0.8
1266
+ rbush: 3.0.1
1267
+ dev: false
1268
+
1269
+ /glob-parent@5.1.2:
1270
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1271
+ engines: {node: '>= 6'}
1272
+ dependencies:
1273
+ is-glob: 4.0.3
1274
+ dev: true
1275
+
1276
+ /glob-parent@6.0.2:
1277
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1278
+ engines: {node: '>=10.13.0'}
1279
+ dependencies:
1280
+ is-glob: 4.0.3
1281
+ dev: true
1282
+
1283
+ /glob@7.1.6:
1284
+ resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
1285
+ dependencies:
1286
+ fs.realpath: 1.0.0
1287
+ inflight: 1.0.6
1288
+ inherits: 2.0.4
1289
+ minimatch: 3.1.2
1290
+ once: 1.4.0
1291
+ path-is-absolute: 1.0.1
1292
+ dev: true
1293
+
1294
+ /glob@7.2.3:
1295
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1296
+ dependencies:
1297
+ fs.realpath: 1.0.0
1298
+ inflight: 1.0.6
1299
+ inherits: 2.0.4
1300
+ minimatch: 3.1.2
1301
+ once: 1.4.0
1302
+ path-is-absolute: 1.0.1
1303
+ dev: true
1304
+
1305
+ /globals@13.24.0:
1306
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
1307
+ engines: {node: '>=8'}
1308
+ dependencies:
1309
+ type-fest: 0.20.2
1310
+ dev: true
1311
+
1312
+ /graphemer@1.4.0:
1313
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1314
+ dev: true
1315
+
1316
+ /has-flag@4.0.0:
1317
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1318
+ engines: {node: '>=8'}
1319
+ dev: true
1320
+
1321
+ /hasown@2.0.0:
1322
+ resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
1323
+ engines: {node: '>= 0.4'}
1324
+ dependencies:
1325
+ function-bind: 1.1.2
1326
+ dev: true
1327
+
1328
+ /ignore@5.3.0:
1329
+ resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
1330
+ engines: {node: '>= 4'}
1331
+ dev: true
1332
+
1333
+ /import-fresh@3.3.0:
1334
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1335
+ engines: {node: '>=6'}
1336
+ dependencies:
1337
+ parent-module: 1.0.1
1338
+ resolve-from: 4.0.0
1339
+ dev: true
1340
+
1341
+ /imurmurhash@0.1.4:
1342
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1343
+ engines: {node: '>=0.8.19'}
1344
+ dev: true
1345
+
1346
+ /inflight@1.0.6:
1347
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1348
+ dependencies:
1349
+ once: 1.4.0
1350
+ wrappy: 1.0.2
1351
+ dev: true
1352
+
1353
+ /inherits@2.0.4:
1354
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1355
+ dev: true
1356
+
1357
+ /is-binary-path@2.1.0:
1358
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1359
+ engines: {node: '>=8'}
1360
+ dependencies:
1361
+ binary-extensions: 2.2.0
1362
+ dev: true
1363
+
1364
+ /is-core-module@2.13.1:
1365
+ resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
1366
+ dependencies:
1367
+ hasown: 2.0.0
1368
+ dev: true
1369
+
1370
+ /is-extglob@2.1.1:
1371
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1372
+ engines: {node: '>=0.10.0'}
1373
+ dev: true
1374
+
1375
+ /is-glob@4.0.3:
1376
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1377
+ engines: {node: '>=0.10.0'}
1378
+ dependencies:
1379
+ is-extglob: 2.1.1
1380
+ dev: true
1381
+
1382
+ /is-number@7.0.0:
1383
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1384
+ engines: {node: '>=0.12.0'}
1385
+ dev: true
1386
+
1387
+ /is-path-inside@3.0.3:
1388
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1389
+ engines: {node: '>=8'}
1390
+ dev: true
1391
+
1392
+ /isexe@2.0.0:
1393
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1394
+ dev: true
1395
+
1396
+ /jiti@1.21.0:
1397
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
1398
+ hasBin: true
1399
+ dev: true
1400
+
1401
+ /js-yaml@4.1.0:
1402
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1403
+ hasBin: true
1404
+ dependencies:
1405
+ argparse: 2.0.1
1406
+ dev: true
1407
+
1408
+ /json-buffer@3.0.1:
1409
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1410
+ dev: true
1411
+
1412
+ /json-schema-traverse@0.4.1:
1413
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1414
+ dev: true
1415
+
1416
+ /json-stable-stringify-without-jsonify@1.0.1:
1417
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1418
+ dev: true
1419
+
1420
+ /keyv@4.5.4:
1421
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1422
+ dependencies:
1423
+ json-buffer: 3.0.1
1424
+ dev: true
1425
+
1426
+ /leaflet-providers@2.0.0:
1427
+ resolution: {integrity: sha512-CWwKEnHd66Qsx0m4o5q5ZOa60s00B91pMxnlr4Y22msubfs7dhbZhdMIz8bvZQkrZqi67ppI1fsZRS6vtrLcOA==}
1428
+ dev: false
1429
+
1430
+ /leaflet@1.9.4:
1431
+ resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==}
1432
+ dev: false
1433
+
1434
+ /levn@0.4.1:
1435
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1436
+ engines: {node: '>= 0.8.0'}
1437
+ dependencies:
1438
+ prelude-ls: 1.2.1
1439
+ type-check: 0.4.0
1440
+ dev: true
1441
+
1442
+ /lilconfig@2.1.0:
1443
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1444
+ engines: {node: '>=10'}
1445
+ dev: true
1446
+
1447
+ /lilconfig@3.0.0:
1448
+ resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==}
1449
+ engines: {node: '>=14'}
1450
+ dev: true
1451
+
1452
+ /lines-and-columns@1.2.4:
1453
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1454
+ dev: true
1455
+
1456
+ /locate-path@6.0.0:
1457
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1458
+ engines: {node: '>=10'}
1459
+ dependencies:
1460
+ p-locate: 5.0.0
1461
+ dev: true
1462
+
1463
+ /lodash.merge@4.6.2:
1464
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1465
+ dev: true
1466
+
1467
+ /lodash@4.17.21:
1468
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
1469
+
1470
+ /lru-cache@6.0.0:
1471
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
1472
+ engines: {node: '>=10'}
1473
+ dependencies:
1474
+ yallist: 4.0.0
1475
+ dev: true
1476
+
1477
+ /magic-string@0.30.5:
1478
+ resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
1479
+ engines: {node: '>=12'}
1480
+ dependencies:
1481
+ '@jridgewell/sourcemap-codec': 1.4.15
1482
+
1483
+ /merge2@1.4.1:
1484
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1485
+ engines: {node: '>= 8'}
1486
+ dev: true
1487
+
1488
+ /micromatch@4.0.5:
1489
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1490
+ engines: {node: '>=8.6'}
1491
+ dependencies:
1492
+ braces: 3.0.2
1493
+ picomatch: 2.3.1
1494
+ dev: true
1495
+
1496
+ /minimatch@3.1.2:
1497
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1498
+ dependencies:
1499
+ brace-expansion: 1.1.11
1500
+ dev: true
1501
+
1502
+ /ms@2.1.2:
1503
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1504
+ dev: true
1505
+
1506
+ /mz@2.7.0:
1507
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1508
+ dependencies:
1509
+ any-promise: 1.3.0
1510
+ object-assign: 4.1.1
1511
+ thenify-all: 1.6.0
1512
+ dev: true
1513
+
1514
+ /nanoid@3.3.7:
1515
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
1516
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1517
+ hasBin: true
1518
+
1519
+ /natural-compare@1.4.0:
1520
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1521
+ dev: true
1522
+
1523
+ /node-releases@2.0.14:
1524
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
1525
+ dev: true
1526
+
1527
+ /normalize-path@3.0.0:
1528
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1529
+ engines: {node: '>=0.10.0'}
1530
+ dev: true
1531
+
1532
+ /normalize-range@0.1.2:
1533
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1534
+ engines: {node: '>=0.10.0'}
1535
+ dev: true
1536
+
1537
+ /nth-check@2.1.1:
1538
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
1539
+ dependencies:
1540
+ boolbase: 1.0.0
1541
+ dev: true
1542
+
1543
+ /object-assign@4.1.1:
1544
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1545
+ engines: {node: '>=0.10.0'}
1546
+ dev: true
1547
+
1548
+ /object-hash@3.0.0:
1549
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1550
+ engines: {node: '>= 6'}
1551
+ dev: true
1552
+
1553
+ /once@1.4.0:
1554
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1555
+ dependencies:
1556
+ wrappy: 1.0.2
1557
+ dev: true
1558
+
1559
+ /optionator@0.9.3:
1560
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
1561
+ engines: {node: '>= 0.8.0'}
1562
+ dependencies:
1563
+ '@aashutoshrathi/word-wrap': 1.2.6
1564
+ deep-is: 0.1.4
1565
+ fast-levenshtein: 2.0.6
1566
+ levn: 0.4.1
1567
+ prelude-ls: 1.2.1
1568
+ type-check: 0.4.0
1569
+ dev: true
1570
+
1571
+ /p-limit@3.1.0:
1572
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1573
+ engines: {node: '>=10'}
1574
+ dependencies:
1575
+ yocto-queue: 0.1.0
1576
+ dev: true
1577
+
1578
+ /p-locate@5.0.0:
1579
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1580
+ engines: {node: '>=10'}
1581
+ dependencies:
1582
+ p-limit: 3.1.0
1583
+ dev: true
1584
+
1585
+ /parent-module@1.0.1:
1586
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1587
+ engines: {node: '>=6'}
1588
+ dependencies:
1589
+ callsites: 3.1.0
1590
+ dev: true
1591
+
1592
+ /path-exists@4.0.0:
1593
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1594
+ engines: {node: '>=8'}
1595
+ dev: true
1596
+
1597
+ /path-is-absolute@1.0.1:
1598
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1599
+ engines: {node: '>=0.10.0'}
1600
+ dev: true
1601
+
1602
+ /path-key@3.1.1:
1603
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1604
+ engines: {node: '>=8'}
1605
+ dev: true
1606
+
1607
+ /path-parse@1.0.7:
1608
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1609
+ dev: true
1610
+
1611
+ /picocolors@1.0.0:
1612
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1613
+
1614
+ /picomatch@2.3.1:
1615
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1616
+ engines: {node: '>=8.6'}
1617
+ dev: true
1618
+
1619
+ /pify@2.3.0:
1620
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1621
+ engines: {node: '>=0.10.0'}
1622
+ dev: true
1623
+
1624
+ /pirates@4.0.6:
1625
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
1626
+ engines: {node: '>= 6'}
1627
+ dev: true
1628
+
1629
+ /polygon-clipping@0.15.3:
1630
+ resolution: {integrity: sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==}
1631
+ dependencies:
1632
+ splaytree: 3.1.2
1633
+ dev: false
1634
+
1635
+ /postcss-import@15.1.0(postcss@8.4.32):
1636
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1637
+ engines: {node: '>=14.0.0'}
1638
+ peerDependencies:
1639
+ postcss: ^8.0.0
1640
+ dependencies:
1641
+ postcss: 8.4.32
1642
+ postcss-value-parser: 4.2.0
1643
+ read-cache: 1.0.0
1644
+ resolve: 1.22.8
1645
+ dev: true
1646
+
1647
+ /postcss-js@4.0.1(postcss@8.4.32):
1648
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1649
+ engines: {node: ^12 || ^14 || >= 16}
1650
+ peerDependencies:
1651
+ postcss: ^8.4.21
1652
+ dependencies:
1653
+ camelcase-css: 2.0.1
1654
+ postcss: 8.4.32
1655
+ dev: true
1656
+
1657
+ /postcss-load-config@4.0.2(postcss@8.4.32):
1658
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
1659
+ engines: {node: '>= 14'}
1660
+ peerDependencies:
1661
+ postcss: '>=8.0.9'
1662
+ ts-node: '>=9.0.0'
1663
+ peerDependenciesMeta:
1664
+ postcss:
1665
+ optional: true
1666
+ ts-node:
1667
+ optional: true
1668
+ dependencies:
1669
+ lilconfig: 3.0.0
1670
+ postcss: 8.4.32
1671
+ yaml: 2.3.4
1672
+ dev: true
1673
+
1674
+ /postcss-nested@6.0.1(postcss@8.4.32):
1675
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
1676
+ engines: {node: '>=12.0'}
1677
+ peerDependencies:
1678
+ postcss: ^8.2.14
1679
+ dependencies:
1680
+ postcss: 8.4.32
1681
+ postcss-selector-parser: 6.0.13
1682
+ dev: true
1683
+
1684
+ /postcss-selector-parser@6.0.13:
1685
+ resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
1686
+ engines: {node: '>=4'}
1687
+ dependencies:
1688
+ cssesc: 3.0.0
1689
+ util-deprecate: 1.0.2
1690
+ dev: true
1691
+
1692
+ /postcss-value-parser@4.2.0:
1693
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1694
+ dev: true
1695
+
1696
+ /postcss@8.4.32:
1697
+ resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==}
1698
+ engines: {node: ^10 || ^12 || >=14}
1699
+ dependencies:
1700
+ nanoid: 3.3.7
1701
+ picocolors: 1.0.0
1702
+ source-map-js: 1.0.2
1703
+
1704
+ /prelude-ls@1.2.1:
1705
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1706
+ engines: {node: '>= 0.8.0'}
1707
+ dev: true
1708
+
1709
+ /prettier@3.1.1:
1710
+ resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==}
1711
+ engines: {node: '>=14'}
1712
+ hasBin: true
1713
+ dev: true
1714
+
1715
+ /punycode@2.3.1:
1716
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1717
+ engines: {node: '>=6'}
1718
+ dev: true
1719
+
1720
+ /queue-microtask@1.2.3:
1721
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1722
+ dev: true
1723
+
1724
+ /quickselect@2.0.0:
1725
+ resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
1726
+ dev: false
1727
+
1728
+ /rbush@3.0.1:
1729
+ resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==}
1730
+ dependencies:
1731
+ quickselect: 2.0.0
1732
+ dev: false
1733
+
1734
+ /read-cache@1.0.0:
1735
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1736
+ dependencies:
1737
+ pify: 2.3.0
1738
+ dev: true
1739
+
1740
+ /readdirp@3.6.0:
1741
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1742
+ engines: {node: '>=8.10.0'}
1743
+ dependencies:
1744
+ picomatch: 2.3.1
1745
+ dev: true
1746
+
1747
+ /resolve-from@4.0.0:
1748
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1749
+ engines: {node: '>=4'}
1750
+ dev: true
1751
+
1752
+ /resolve@1.22.8:
1753
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
1754
+ hasBin: true
1755
+ dependencies:
1756
+ is-core-module: 2.13.1
1757
+ path-parse: 1.0.7
1758
+ supports-preserve-symlinks-flag: 1.0.0
1759
+ dev: true
1760
+
1761
+ /reusify@1.0.4:
1762
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1763
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1764
+ dev: true
1765
+
1766
+ /rimraf@3.0.2:
1767
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1768
+ hasBin: true
1769
+ dependencies:
1770
+ glob: 7.2.3
1771
+ dev: true
1772
+
1773
+ /rollup@4.9.1:
1774
+ resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==}
1775
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1776
+ hasBin: true
1777
+ optionalDependencies:
1778
+ '@rollup/rollup-android-arm-eabi': 4.9.1
1779
+ '@rollup/rollup-android-arm64': 4.9.1
1780
+ '@rollup/rollup-darwin-arm64': 4.9.1
1781
+ '@rollup/rollup-darwin-x64': 4.9.1
1782
+ '@rollup/rollup-linux-arm-gnueabihf': 4.9.1
1783
+ '@rollup/rollup-linux-arm64-gnu': 4.9.1
1784
+ '@rollup/rollup-linux-arm64-musl': 4.9.1
1785
+ '@rollup/rollup-linux-riscv64-gnu': 4.9.1
1786
+ '@rollup/rollup-linux-x64-gnu': 4.9.1
1787
+ '@rollup/rollup-linux-x64-musl': 4.9.1
1788
+ '@rollup/rollup-win32-arm64-msvc': 4.9.1
1789
+ '@rollup/rollup-win32-ia32-msvc': 4.9.1
1790
+ '@rollup/rollup-win32-x64-msvc': 4.9.1
1791
+ fsevents: 2.3.3
1792
+ dev: true
1793
+
1794
+ /run-parallel@1.2.0:
1795
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1796
+ dependencies:
1797
+ queue-microtask: 1.2.3
1798
+ dev: true
1799
+
1800
+ /semver@7.5.4:
1801
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
1802
+ engines: {node: '>=10'}
1803
+ hasBin: true
1804
+ dependencies:
1805
+ lru-cache: 6.0.0
1806
+ dev: true
1807
+
1808
+ /shebang-command@2.0.0:
1809
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1810
+ engines: {node: '>=8'}
1811
+ dependencies:
1812
+ shebang-regex: 3.0.0
1813
+ dev: true
1814
+
1815
+ /shebang-regex@3.0.0:
1816
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1817
+ engines: {node: '>=8'}
1818
+ dev: true
1819
+
1820
+ /source-map-js@1.0.2:
1821
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1822
+ engines: {node: '>=0.10.0'}
1823
+
1824
+ /splaytree@3.1.2:
1825
+ resolution: {integrity: sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==}
1826
+ dev: false
1827
+
1828
+ /strip-ansi@6.0.1:
1829
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1830
+ engines: {node: '>=8'}
1831
+ dependencies:
1832
+ ansi-regex: 5.0.1
1833
+ dev: true
1834
+
1835
+ /strip-json-comments@3.1.1:
1836
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1837
+ engines: {node: '>=8'}
1838
+ dev: true
1839
+
1840
+ /sucrase@3.34.0:
1841
+ resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
1842
+ engines: {node: '>=8'}
1843
+ hasBin: true
1844
+ dependencies:
1845
+ '@jridgewell/gen-mapping': 0.3.3
1846
+ commander: 4.1.1
1847
+ glob: 7.1.6
1848
+ lines-and-columns: 1.2.4
1849
+ mz: 2.7.0
1850
+ pirates: 4.0.6
1851
+ ts-interface-checker: 0.1.13
1852
+ dev: true
1853
+
1854
+ /supports-color@7.2.0:
1855
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1856
+ engines: {node: '>=8'}
1857
+ dependencies:
1858
+ has-flag: 4.0.0
1859
+ dev: true
1860
+
1861
+ /supports-preserve-symlinks-flag@1.0.0:
1862
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1863
+ engines: {node: '>= 0.4'}
1864
+ dev: true
1865
+
1866
+ /tailwindcss@3.4.0:
1867
+ resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==}
1868
+ engines: {node: '>=14.0.0'}
1869
+ hasBin: true
1870
+ dependencies:
1871
+ '@alloc/quick-lru': 5.2.0
1872
+ arg: 5.0.2
1873
+ chokidar: 3.5.3
1874
+ didyoumean: 1.2.2
1875
+ dlv: 1.1.3
1876
+ fast-glob: 3.3.2
1877
+ glob-parent: 6.0.2
1878
+ is-glob: 4.0.3
1879
+ jiti: 1.21.0
1880
+ lilconfig: 2.1.0
1881
+ micromatch: 4.0.5
1882
+ normalize-path: 3.0.0
1883
+ object-hash: 3.0.0
1884
+ picocolors: 1.0.0
1885
+ postcss: 8.4.32
1886
+ postcss-import: 15.1.0(postcss@8.4.32)
1887
+ postcss-js: 4.0.1(postcss@8.4.32)
1888
+ postcss-load-config: 4.0.2(postcss@8.4.32)
1889
+ postcss-nested: 6.0.1(postcss@8.4.32)
1890
+ postcss-selector-parser: 6.0.13
1891
+ resolve: 1.22.8
1892
+ sucrase: 3.34.0
1893
+ transitivePeerDependencies:
1894
+ - ts-node
1895
+ dev: true
1896
+
1897
+ /text-table@0.2.0:
1898
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
1899
+ dev: true
1900
+
1901
+ /thenify-all@1.6.0:
1902
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
1903
+ engines: {node: '>=0.8'}
1904
+ dependencies:
1905
+ thenify: 3.3.1
1906
+ dev: true
1907
+
1908
+ /thenify@3.3.1:
1909
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
1910
+ dependencies:
1911
+ any-promise: 1.3.0
1912
+ dev: true
1913
+
1914
+ /to-fast-properties@2.0.0:
1915
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1916
+ engines: {node: '>=4'}
1917
+
1918
+ /to-regex-range@5.0.1:
1919
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1920
+ engines: {node: '>=8.0'}
1921
+ dependencies:
1922
+ is-number: 7.0.0
1923
+ dev: true
1924
+
1925
+ /ts-interface-checker@0.1.13:
1926
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1927
+ dev: true
1928
+
1929
+ /type-check@0.4.0:
1930
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1931
+ engines: {node: '>= 0.8.0'}
1932
+ dependencies:
1933
+ prelude-ls: 1.2.1
1934
+ dev: true
1935
+
1936
+ /type-fest@0.20.2:
1937
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
1938
+ engines: {node: '>=10'}
1939
+ dev: true
1940
+
1941
+ /undici-types@5.26.5:
1942
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
1943
+ dev: true
1944
+
1945
+ /update-browserslist-db@1.0.13(browserslist@4.22.2):
1946
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
1947
+ hasBin: true
1948
+ peerDependencies:
1949
+ browserslist: '>= 4.21.0'
1950
+ dependencies:
1951
+ browserslist: 4.22.2
1952
+ escalade: 3.1.1
1953
+ picocolors: 1.0.0
1954
+ dev: true
1955
+
1956
+ /uri-js@4.4.1:
1957
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1958
+ dependencies:
1959
+ punycode: 2.3.1
1960
+ dev: true
1961
+
1962
+ /util-deprecate@1.0.2:
1963
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1964
+ dev: true
1965
+
1966
+ /vite@5.0.10(@types/node@20.10.5):
1967
+ resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==}
1968
+ engines: {node: ^18.0.0 || >=20.0.0}
1969
+ hasBin: true
1970
+ peerDependencies:
1971
+ '@types/node': ^18.0.0 || >=20.0.0
1972
+ less: '*'
1973
+ lightningcss: ^1.21.0
1974
+ sass: '*'
1975
+ stylus: '*'
1976
+ sugarss: '*'
1977
+ terser: ^5.4.0
1978
+ peerDependenciesMeta:
1979
+ '@types/node':
1980
+ optional: true
1981
+ less:
1982
+ optional: true
1983
+ lightningcss:
1984
+ optional: true
1985
+ sass:
1986
+ optional: true
1987
+ stylus:
1988
+ optional: true
1989
+ sugarss:
1990
+ optional: true
1991
+ terser:
1992
+ optional: true
1993
+ dependencies:
1994
+ '@types/node': 20.10.5
1995
+ esbuild: 0.19.10
1996
+ postcss: 8.4.32
1997
+ rollup: 4.9.1
1998
+ optionalDependencies:
1999
+ fsevents: 2.3.3
2000
+ dev: true
2001
+
2002
+ /vue-eslint-parser@9.3.2(eslint@8.56.0):
2003
+ resolution: {integrity: sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==}
2004
+ engines: {node: ^14.17.0 || >=16.0.0}
2005
+ peerDependencies:
2006
+ eslint: '>=6.0.0'
2007
+ dependencies:
2008
+ debug: 4.3.4
2009
+ eslint: 8.56.0
2010
+ eslint-scope: 7.2.2
2011
+ eslint-visitor-keys: 3.4.3
2012
+ espree: 9.6.1
2013
+ esquery: 1.5.0
2014
+ lodash: 4.17.21
2015
+ semver: 7.5.4
2016
+ transitivePeerDependencies:
2017
+ - supports-color
2018
+ dev: true
2019
+
2020
+ /vue@3.3.13:
2021
+ resolution: {integrity: sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==}
2022
+ peerDependencies:
2023
+ typescript: '*'
2024
+ peerDependenciesMeta:
2025
+ typescript:
2026
+ optional: true
2027
+ dependencies:
2028
+ '@vue/compiler-dom': 3.3.13
2029
+ '@vue/compiler-sfc': 3.3.13
2030
+ '@vue/runtime-dom': 3.3.13
2031
+ '@vue/server-renderer': 3.3.13(vue@3.3.13)
2032
+ '@vue/shared': 3.3.13
2033
+
2034
+ /which@2.0.2:
2035
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2036
+ engines: {node: '>= 8'}
2037
+ hasBin: true
2038
+ dependencies:
2039
+ isexe: 2.0.0
2040
+ dev: true
2041
+
2042
+ /wrappy@1.0.2:
2043
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2044
+ dev: true
2045
+
2046
+ /xml-name-validator@4.0.0:
2047
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
2048
+ engines: {node: '>=12'}
2049
+ dev: true
2050
+
2051
+ /yallist@4.0.0:
2052
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
2053
+ dev: true
2054
+
2055
+ /yaml@2.3.4:
2056
+ resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
2057
+ engines: {node: '>= 14'}
2058
+ dev: true
2059
+
2060
+ /yocto-queue@0.1.0:
2061
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2062
+ engines: {node: '>=10'}
2063
+ dev: true
static/postcss.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ 'postcss-import': {},
4
+ tailwindcss: {},
5
+ autoprefixer: {},
6
+ },
7
+ }
static/public/api-docs.svg ADDED
static/public/apple-touch-icon.png ADDED
static/public/blog.svg ADDED
static/public/favicon.ico ADDED
static/public/home-page.svg ADDED
static/public/icon-192.png ADDED
static/public/icon-512.png ADDED
static/public/icon.svg ADDED
static/public/loader.svg ADDED
static/public/login.svg ADDED
static/public/logout.svg ADDED
static/public/manifest.webmanifest ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "icons": [
3
+ { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
4
+ { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
5
+ ]
6
+ }
static/public/marker-icon-exclude-2x.png ADDED
static/public/marker-icon-exclude.png ADDED
static/public/marker-icon-include-2x.png ADDED
static/public/marker-icon-include.png ADDED
static/public/marker-shadow.png ADDED
static/public/prediction-map-bw.svg ADDED
static/public/user-profile.svg ADDED
static/src/App.vue ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <PageLayout page-title="Prediction map page">
3
+ <div>
4
+ <div id="map-container-md">
5
+ <PredictionMap
6
+ :mapName="mapName"
7
+ :mapBounds='[{
8
+ "lat": 46.235421781941776,
9
+ "lng": 9.49699401855469
10
+ }, {
11
+ "lat": 46.1351347810282,
12
+ "lng": 9.32121276855469
13
+ }]'
14
+ description="This page displays predictions made with a remote machine learning model living within an AWS Lambda..."
15
+ />
16
+ </div>
17
+ </div>
18
+ </PageLayout>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { ref } from 'vue'
23
+
24
+ import PredictionMap from '@/components/PagePredictionMap.vue'
25
+ import PageLayout from '@/components/PageLayout.vue'
26
+
27
+ const mapName = ref('prediction-map')
28
+ </script>
static/src/components/PageFooter.vue ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <!-- style 'z-index: 1001' here is needed to avoid override from leafletjs css -->
3
+ <footer class="fixed bottom-0 w-full bg-gray-200 pl-2 font-light text-xs" style="z-index: 9999;">
4
+ <p>
5
+ <span><PageFooterHyperlink path="/">SamGIS</PageFooterHyperlink>: An inference machine learning POC applied to GIS thanks to
6
+ <PageFooterHyperlink path="https://github.com/vietanhdev/samexporter/">SAM Exporter</PageFooterHyperlink>
7
+ and inspired by
8
+ <PageFooterHyperlink path="https://samgeo.gishub.org/">Segment Geospatial</PageFooterHyperlink>
9
+ </span>
10
+ </p>
11
+ </footer>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import PageFooterHyperlink from "@/components/PageFooterHyperlink.vue";
16
+ </script>
static/src/components/PageFooterHyperlink.vue ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <a
3
+ :href="props.path"
4
+ class="underline"
5
+ target="_blank"
6
+ rel="noopener noreferrer"
7
+ >
8
+ <slot />
9
+ </a>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ const props = defineProps<{
14
+ path: string
15
+ }>()
16
+ </script>
static/src/components/PageLayout.vue ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <div class="relative min-h-screen lg:flex">
3
+ <!-- Sidebar -->
4
+
5
+ <main id="content" class="flex-1 z-1 pb-12 ml-[3.3rem] lg:ml-0 mr-4 overflow-y-auto md:pl-1 lg:h-screen">
6
+ <header class="hidden items-center justify-between h-10 ml-2 landscape:md:flex portrait:sd:flex portrait:md:h-12 bg-gray-200 border-b">
7
+ <h2 class="hidden sd:text-sm ml-2 md:block md:text-2xl">{{ props.pageTitle }}</h2>
8
+ </header>
9
+
10
+ <div class="">
11
+ <slot></slot>
12
+ </div>
13
+
14
+ <div class="bottom-0 w-full text-black">
15
+ <Footer></Footer>
16
+ </div>
17
+ </main>
18
+ </div>
19
+
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+ import Footer from "@/components/PageFooter.vue"
24
+
25
+ const props = defineProps<{
26
+ pageTitle: string
27
+ }>()
28
+ </script>
static/src/components/PagePredictionMap.vue ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <div class="h-auto">
3
+
4
+ <div class="grid grid-cols-1 2xl:grid-cols-5 lg:gap-1 lg:border-r">
5
+
6
+ <div class="lg:border-r lg:col-span-3">
7
+ <div id="id-map-cont" class="ml-2 mt-2 md:ml-4 md:mr-4">
8
+ <p class="hidden lg:block">{{ description }}</p>
9
+ <div class="w-full md:pt-1 md:pb-1 lg:hidden portrait:xl:hidden">
10
+ <ButtonMapSendRequest
11
+ class="h-8 text-sm font-extralight min-w-[180px] max-w-[180px]"
12
+ :current-base-map-name="currentBaseMapNameRef"
13
+ :map="map"
14
+ :prompts-array="promptsArrayRef"
15
+ :response-message="responseMessageRef"
16
+ :send-m-l-request="sendMLRequest"
17
+ :waiting-string="waitingString"
18
+ />
19
+ </div>
20
+ <div id="map" class="map-predictions" />
21
+ <ButtonMapSendRequest
22
+ class="h-8 min-w-[240px] max-w-[240px] mt-2 mb-2 hidden sd:h-14 lg:block portrait:xl:block"
23
+ :current-base-map-name="currentBaseMapNameRef"
24
+ :map="map"
25
+ :prompts-array="promptsArrayRef"
26
+ :response-message="responseMessageRef"
27
+ :send-m-l-request="sendMLRequest"
28
+ :waiting-string="waitingString"
29
+ />
30
+
31
+ </div>
32
+ </div>
33
+
34
+ <div class="lg:col-span-2">
35
+ <div class="lg:pl-2 lg:pr-2 lg:border-l lg:border-3">
36
+
37
+ <h1>Map Info</h1>
38
+ <div class="grid grid-cols-1 md:grid-cols-3">
39
+ <StatsGrid :stats-array="[
40
+ {statName: 'current Zoom', statValue: currentZoomRef},
41
+ {statName: 'current map name/type', statValue: currentBaseMapNameRef},
42
+ {statName: 'prompt: points/rectangles number', statValue: promptsArrayRef.length},
43
+ ]" />
44
+ </div>
45
+
46
+ <div v-if="responseMessageRef === waitingString" />
47
+ <h2 v-else-if="responseMessageRef || responseMessageRef == '-'" class="text-lg text-red-600">{{ responseMessageRef }}</h2>
48
+ <div v-else>
49
+ <div class="grid grid-cols-1 md:grid-cols-3">
50
+ <StatsGrid :stats-array="[
51
+ {statName: 'request duration', statValue: `${durationRef.toFixed(2)}s`},
52
+ {statName: 'polygons number', statValue: numberOfPolygonsRef},
53
+ {statName: 'predicted masks number', statValue: numberOfPredictedMasksRef},
54
+ ]" />
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <h1>ML request prompt</h1>
60
+ <div v-if="promptsArrayRef.filter(el => {return el.type === 'point'}).length > 0">
61
+ <TableGenericComponent
62
+ :header="['id', 'data', 'label']"
63
+ :rows="applyFnToObjectWithinArray(promptsArrayRef.filter(el => {return el.type === 'point'}))"
64
+ title="Points"
65
+ row-key="id"
66
+ />
67
+ </div>
68
+ <br />
69
+ <div v-if="promptsArrayRef.filter(el => {return el.type === 'rectangle'}).length > 0">
70
+ <TableGenericComponent
71
+ :header="['id', 'data_ne', 'data_sw']"
72
+ :rows="applyFnToObjectWithinArray(promptsArrayRef.filter(el => {return el.type === 'rectangle'}))"
73
+ title="Rectangles"
74
+ row-key="id"
75
+ class="2md:min-h-[100px]"
76
+ />
77
+ </div>
78
+ </div>
79
+
80
+ </div>
81
+ </div>
82
+ </template>
83
+
84
+ <script lang="ts" setup>
85
+ import {
86
+ control as LeafletControl,
87
+ Evented as LEvented,
88
+ geoJSON as LeafletGeoJSON,
89
+ type LatLng,
90
+ Map as LMap,
91
+ map as LeafletMap,
92
+ tileLayer,
93
+ TileLayer as LTileLayer
94
+ } from 'leaflet'
95
+ import 'leaflet-providers'
96
+ import '@geoman-io/leaflet-geoman-free'
97
+ import { onMounted, ref, type Ref } from 'vue'
98
+
99
+ import {
100
+ durationRef,
101
+ numberOfPolygonsRef,
102
+ numberOfPredictedMasksRef,
103
+ OpenStreetMap,
104
+ prefix,
105
+ responseMessageRef,
106
+ Satellite,
107
+ waitingString
108
+ } from '@/components/constants'
109
+ import {
110
+ applyFnToObjectWithinArray,
111
+ getExtentCurrentViewMapBBox,
112
+ getGeoJSONRequest,
113
+ getSelectedPointCoordinate,
114
+ setGeomanControls,
115
+ updateMapData
116
+ } from '@/components/helpers'
117
+ import type { IBodyLatLngPoints, IPointPrompt, IRectanglePrompt, SourceTileType } from '@/components/types';
118
+ import StatsGrid from '@/components/StatsGrid.vue';
119
+ import TableGenericComponent from '@/components/TableGenericComponent.vue';
120
+ import ButtonMapSendRequest from '@/components/buttons/ButtonMapSendRequest.vue';
121
+
122
+ const currentBaseMapNameRef = ref("")
123
+ const currentMapBBoxRef = ref()
124
+ const currentZoomRef = ref()
125
+ const promptsArrayRef: Ref<Array<IPointPrompt | IRectanglePrompt>> = ref([])
126
+ let map: LMap
127
+ type ServiceTiles = {
128
+ [key: SourceTileType]: LTileLayer;
129
+ };
130
+
131
+ const props = defineProps<{
132
+ mapBounds: Array<LatLng>,
133
+ mapName: string,
134
+ description: string
135
+ }>()
136
+
137
+ const getPopupContentPoint = (leafletEvent: LEvented, label: number): HTMLDivElement => {
138
+ let popupContent: HTMLDivElement = document.createElement('div')
139
+ let currentPointLayer: LatLng = getSelectedPointCoordinate(leafletEvent)
140
+
141
+ popupContent.innerHTML = `<span>lat:${JSON.stringify(currentPointLayer.lat)}<br/>`
142
+ popupContent.innerHTML += `lng:${JSON.stringify(currentPointLayer.lng)}<br/>`
143
+ popupContent.innerHTML += `label:${label}, id:${leafletEvent.layer._leaflet_id}</span>`
144
+
145
+ const popupDiv: HTMLDivElement = document.createElement('div')
146
+ popupDiv.className = 'leaflet-popup-content-inner'
147
+ popupDiv.appendChild(popupContent)
148
+
149
+ return popupDiv
150
+ }
151
+
152
+ const sendMLRequest = async (leafletMap: LMap, promptRequest: Array<IPointPrompt | IRectanglePrompt>, sourceType: SourceTileType = OpenStreetMap) => {
153
+ if (map.pm.globalDragModeEnabled()) {
154
+ map.pm.disableGlobalDragMode()
155
+ }
156
+ if (map.pm.globalEditModeEnabled()) {
157
+ map.pm.disableGlobalEditMode()
158
+ }
159
+ const bodyRequest: IBodyLatLngPoints = {
160
+ bbox: getExtentCurrentViewMapBBox(leafletMap),
161
+ prompt: promptRequest,
162
+ zoom: leafletMap.getZoom(),
163
+ source_type: sourceType
164
+ }
165
+ try {
166
+ const geojsonOutputOnMounted = await getGeoJSONRequest(bodyRequest, '/infer_samgis')
167
+ const featureNew = LeafletGeoJSON(geojsonOutputOnMounted)
168
+ leafletMap.addLayer(featureNew)
169
+ } catch (errGeojsonOutputOnMounted) {
170
+ console.error('sendMLRequest:: sourceType: ', sourceType)
171
+ console.error('sendMLRequest:: promptRequest: ', promptRequest.length, '::', promptRequest)
172
+ console.error('sendMLRequest:: bodyRequest => ', bodyRequest, "#")
173
+ console.error("errGeojsonOutputOnMounted => ", errGeojsonOutputOnMounted)
174
+ }
175
+ }
176
+
177
+ const updateZoomBboxMap = (localMap: LMap) => {
178
+ currentZoomRef.value = localMap.getZoom()
179
+ currentMapBBoxRef.value = getExtentCurrentViewMapBBox(localMap)
180
+ }
181
+
182
+ const getCurrentBasemap = (url: string, providersArray: ServiceTiles) => {
183
+ for (const [key, value] of Object.entries(providersArray)) {
184
+ if (value._url == url) {
185
+ return key
186
+ }
187
+ }
188
+ }
189
+
190
+ onMounted(async () => {
191
+ const osmTile = tileLayer.provider(OpenStreetMap)
192
+ let localVarSatellite: SourceTileType = import.meta.env.VITE_SATELLITE_NAME ? String(import.meta.env.VITE_SATELLITE_NAME) : Satellite
193
+ const satelliteTile = tileLayer.provider(localVarSatellite)
194
+
195
+ let baseMaps: ServiceTiles = { OpenStreetMap: osmTile }
196
+ baseMaps[localVarSatellite] = satelliteTile
197
+ currentBaseMapNameRef.value = OpenStreetMap
198
+
199
+ map = LeafletMap('map', {
200
+ layers: [osmTile]
201
+ })
202
+ map.fitBounds(props.mapBounds)
203
+ map.attributionControl.setPrefix(prefix)
204
+ LeafletControl.scale({ position: 'bottomleft', imperial: false, metric: true }).addTo(map)
205
+
206
+ LeafletControl.layers(baseMaps).addTo(map)
207
+ setGeomanControls(map)
208
+ updateZoomBboxMap(map)
209
+
210
+ map.on('zoomend', (e: LEvented) => {
211
+ updateZoomBboxMap(map)
212
+ })
213
+
214
+ map.on('mouseup', (e: LEvented) => {
215
+ currentMapBBoxRef.value = getExtentCurrentViewMapBBox(map)
216
+ })
217
+
218
+ updateMapData(map, getPopupContentPoint, promptsArrayRef)
219
+ map.on('baselayerchange', (e: LEvented) => {
220
+ currentBaseMapNameRef.value = getCurrentBasemap(e.layer._url, baseMaps)
221
+ })
222
+ })
223
+ </script>
224
+
static/src/components/StatsGrid.vue ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <dl class="grid md:pt-1 md:pb-1" v-for="item in props.statsArray" v-bind:key="item.statName">
3
+ <div class="flex flex-col bg-blue-100 text-center p-1 md:p-2">
4
+ <dt class="order-last font-medium">{{ item.statName }}</dt>
5
+ <dd class="text-lg font-extrabold text-blue-600">{{ item.statValue }}</dd>
6
+ </div>
7
+ </dl>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ const props = defineProps<{
12
+ statsArray: Array<{
13
+ statName: string,
14
+ statValue: string
15
+ }>
16
+ }>()
17
+ </script>
static/src/components/TableGenericComponent.vue ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <table class="min-w-full divide-y-2 divide-gray-200 border border-gray-200 bg-white text-left p-4">
3
+ <caption class="text-2xl bg-blue-100">{{ props.title }}</caption>
4
+ <thead class="text-left">
5
+ <tr class="text-left">
6
+ <th
7
+ class="whitespace-nowrap px-1 py-1 text-gray-900 text-left 2md:font-medium 2md:py-2 2md:px-4"
8
+ v-for="item in props.header"
9
+ :key="item"
10
+ >{{ item }}</th>
11
+ </tr>
12
+ </thead>
13
+
14
+ <tbody class="divide-y divide-gray-200" v-for="row in props.rows" :key="props.rows[props.rowKey]">
15
+ <tr class="odd:bg-gray-50">
16
+ <td v-for="item in row" class="whitespace-nowrap px-1 py-1 text-gray-900 2md:font-medium 2md:py-2 2md:px-4">{{ item }}</td>
17
+ </tr>
18
+ </tbody>
19
+ </table>
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+ const props = defineProps<{
24
+ header: Array<string>,
25
+ rows: Array<Map<string, string>>,
26
+ title: string,
27
+ rowKey: string
28
+ }>()
29
+ </script>
30
+
static/src/components/buttons/ButtonComponent.vue ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <button class="inline-flex items-center p-2" @click="props.click">
3
+ <slot></slot>
4
+ </button>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ const props = defineProps<{
9
+ click: Function
10
+ }>()
11
+ </script>
static/src/components/buttons/ButtonMapSendRequest.vue ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <template>
2
+ <button
3
+ :class="`${props.class} bg-gray-200 bg-opacity-50`"
4
+ :disabled="promptsArray.length == 0 || responseMessage === waitingString"
5
+ v-if="promptsArray.length == 0 || responseMessage === waitingString"
6
+ >{{ responseMessage === waitingString ? responseMessage : '🚫 Empty prompt (disabled)' }}
7
+ </button>
8
+ <button
9
+ :class="`${props.class} bg-blue-300 whitespace-no-wrap overflow-hidden truncate`"
10
+ @click="sendMLRequest(map, promptsArray, currentBaseMapName)"
11
+ v-else
12
+ >
13
+ <span v-if="responseMessage && responseMessage != '-'">{{ responseMessage }}</span>
14
+ <span v-else>🔍 send ML request</span>
15
+ </button>
16
+ </template>
17
+
18
+ <script setup lang="ts">
19
+ import {Map as LMap} from 'leaflet';
20
+ import type { IPointPrompt, IRectanglePrompt } from '@/components/types'
21
+
22
+ const props = defineProps<{
23
+ class: string,
24
+ currentBaseMapName: string,
25
+ promptsArray: Array<IPointPrompt | IRectanglePrompt>,
26
+ responseMessage: string,
27
+ map: LMap,
28
+ sendMLRequest: Function,
29
+ waitingString: string
30
+ }>()
31
+ </script>
static/src/components/constants.ts ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ref } from "vue"
2
+
3
+ export const prefix = " &copy; <a target=\"_blank\" href=\"https://leafletjs.com\">leaflet</a>"
4
+ export const OpenStreetMap = "OpenStreetMap"
5
+ export const Satellite = "OpenStreetMap.HOT"
6
+ export const maxZoom = 20
7
+ export const minZoom = 3
8
+ export const waitingString = "waiting..."
9
+ export const durationRef = ref(0)
10
+ export const numberOfPolygonsRef = ref(0)
11
+ export const numberOfPredictedMasksRef = ref(0)
12
+ export const responseMessageRef = ref("-")
13
+ export const geojsonRef = ref("geojsonOutput-placeholder")
14
+ // modified from https://github.com/for-GET/know-your-http-well/blob/master/json/status-codes.json
15
+ export const htmlStatusMessages = [
16
+ {
17
+ code: 100,
18
+ phrase: 'Continue'
19
+ },
20
+ {
21
+ code: 101,
22
+ phrase: 'Switching Protocols'
23
+ },
24
+ {
25
+ code: 200,
26
+ phrase: 'OK'
27
+ },
28
+ {
29
+ code: 201,
30
+ phrase: 'Created'
31
+ },
32
+ {
33
+ code: 202,
34
+ phrase: 'Accepted'
35
+ },
36
+ {
37
+ code: 203,
38
+ phrase: 'Non-Authoritative Information'
39
+ },
40
+ {
41
+ code: 204,
42
+ phrase: 'No Content'
43
+ },
44
+ {
45
+ code: 205,
46
+ phrase: 'Reset Content'
47
+ },
48
+ {
49
+ code: 206,
50
+ phrase: 'Partial Content'
51
+ },
52
+ {
53
+ code: 300,
54
+ phrase: 'Multiple Choices'
55
+ },
56
+ {
57
+ code: 302,
58
+ phrase: 'Found'
59
+ },
60
+ {
61
+ code: 303,
62
+ phrase: 'See Other'
63
+ },
64
+ {
65
+ code: 304,
66
+ phrase: 'Not Modified'
67
+ },
68
+ {
69
+ code: 305,
70
+ phrase: 'Use Proxy'
71
+ },
72
+ {
73
+ code: 307,
74
+ phrase: 'Temporary Redirect'
75
+ },
76
+ {
77
+ code: 400,
78
+ phrase: 'Bad Request'
79
+ },
80
+ {
81
+ code: 401,
82
+ phrase: 'Unauthorized'
83
+ },
84
+ {
85
+ code: 402,
86
+ phrase: 'Payment Required'
87
+ },
88
+ {
89
+ code: 403,
90
+ phrase: 'Forbidden'
91
+ },
92
+ {
93
+ code: 404,
94
+ phrase: 'Not Found'
95
+ },
96
+ {
97
+ code: 405,
98
+ phrase: 'Method Not Allowed'
99
+ },
100
+ {
101
+ code: 406,
102
+ phrase: 'Not Acceptable'
103
+ },
104
+ {
105
+ code: 407,
106
+ phrase: 'Proxy Authentication Required'
107
+ },
108
+ {
109
+ code: 408,
110
+ phrase: 'Request Timeout'
111
+ },
112
+ {
113
+ code: 409,
114
+ phrase: 'Conflict'
115
+ },
116
+ {
117
+ code: 410,
118
+ phrase: 'Gone'
119
+ },
120
+ {
121
+ code: 411,
122
+ phrase: 'Length Required'
123
+ },
124
+ {
125
+ code: 412,
126
+ phrase: 'Precondition Failed'
127
+ },
128
+ {
129
+ code: 413,
130
+ phrase: 'Payload Too Large'
131
+ },
132
+ {
133
+ code: 414,
134
+ phrase: 'URI Too Long'
135
+ },
136
+ {
137
+ code: 415,
138
+ phrase: 'Unsupported Media Type'
139
+ },
140
+ {
141
+ code: 416,
142
+ phrase: 'Range Not Satisfiable'
143
+ },
144
+ {
145
+ code: 417,
146
+ phrase: 'Expectation Failed'
147
+ },
148
+ {
149
+ code: 418,
150
+ phrase: "I'm a teapot"
151
+ },
152
+ {
153
+ code: 426,
154
+ phrase: 'Upgrade Required'
155
+ },
156
+ {
157
+ code: 500,
158
+ phrase: 'Internal Server Error'
159
+ },
160
+ {
161
+ code: 501,
162
+ phrase: 'Not Implemented'
163
+ },
164
+ {
165
+ code: 502,
166
+ phrase: 'Bad Gateway'
167
+ },
168
+ {
169
+ code: 503,
170
+ phrase: 'Service Unavailable'
171
+ },
172
+ {
173
+ code: 504,
174
+ phrase: 'Gateway Time-out'
175
+ },
176
+ {
177
+ code: 505,
178
+ phrase: 'HTTP Version Not Supported'
179
+ },
180
+ {
181
+ code: 102,
182
+ phrase: 'Processing'
183
+ },
184
+ {
185
+ code: 207,
186
+ phrase: 'Multi-Status'
187
+ },
188
+ {
189
+ code: 226,
190
+ phrase: 'IM Used'
191
+ },
192
+ {
193
+ code: 308,
194
+ phrase: 'Permanent Redirect'
195
+ },
196
+ {
197
+ code: 422,
198
+ phrase: 'Unprocessable Entity'
199
+ },
200
+ {
201
+ code: 423,
202
+ phrase: 'Locked'
203
+ },
204
+ {
205
+ code: 424,
206
+ phrase: 'Failed Dependency'
207
+ },
208
+ {
209
+ code: 428,
210
+ phrase: 'Precondition Required'
211
+ },
212
+ {
213
+ code: 429,
214
+ phrase: 'Too Many Requests'
215
+ },
216
+ {
217
+ code: 431,
218
+ phrase: 'Request Header Fields Too Large'
219
+ },
220
+ {
221
+ code: 451,
222
+ phrase: 'Unavailable For Legal Reasons'
223
+ },
224
+ {
225
+ code: 506,
226
+ phrase: 'Variant Also Negotiates'
227
+ },
228
+ {
229
+ code: 507,
230
+ phrase: 'Insufficient Storage'
231
+ },
232
+ {
233
+ code: 511,
234
+ phrase: 'Network Authentication Required'
235
+ }
236
+ ]
static/src/components/helpers.ts ADDED
@@ -0,0 +1,253 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import L, { icon, Evented as LEvented, type LatLng, Map as LMap } from 'leaflet'
2
+ import {
3
+ responseMessageRef,
4
+ waitingString,
5
+ durationRef,
6
+ numberOfPolygonsRef,
7
+ numberOfPredictedMasksRef
8
+ } from './constants'
9
+ import {
10
+ ExcludeIncludeLabelPrompt as excludeIncludeLabelPrompt,
11
+ type ArrayNumber,
12
+ type BboxLatLng,
13
+ type ExcludeIncludeLabelPrompt,
14
+ type IBodyLatLngPoints,
15
+ type IPointPrompt,
16
+ type IRectanglePrompt, type IRectangleTable, type IPointTable
17
+ } from './types.d'
18
+ import type { Ref } from 'vue'
19
+
20
+
21
+ export const applyFnToObjectWithinArray = (array: Array<IPointPrompt | IRectanglePrompt>): Array<IPointTable | IRectangleTable> => {
22
+ let newArray = []
23
+ for (const el of array) {
24
+ newArray.push(el.type === 'rectangle' ? getUpdatedRectangle(el) : getUpdatedPoint(el))
25
+ }
26
+ return newArray
27
+ }
28
+
29
+ const getUpdatedPoint = (obj: IPointPrompt): IPointTable => {
30
+ return {
31
+ id: obj.id,
32
+ data: obj.data,
33
+ label: obj.label
34
+ }
35
+ }
36
+
37
+ const getUpdatedRectangle = (obj: IRectanglePrompt): IRectangleTable => {
38
+ return {
39
+ id: obj.id,
40
+ data_ne: obj.data.ne,
41
+ data_sw: obj.data.sw,
42
+ }
43
+ }
44
+
45
+ /** get a custom icon given a PNG path with its anchor/size values */
46
+ const getCustomIconMarker = (
47
+ iconUrlNoExt: string,
48
+ shadowUrl = '/marker-shadow.png',
49
+ iconSize: ArrayNumber = [25, 41],
50
+ iconAnchor: ArrayNumber = [12, 41],
51
+ popupAnchor: ArrayNumber = [1, -34],
52
+ tooltipAnchor: ArrayNumber = [5, -25],
53
+ shadowSize: ArrayNumber = [41, 41]
54
+ ): icon => {
55
+ return icon({
56
+ iconUrl: `${iconUrlNoExt}.png`,
57
+ iconRetinaUrl: `${iconUrlNoExt}-2x.png`,
58
+ shadowUrl,
59
+ iconSize,
60
+ iconAnchor,
61
+ popupAnchor,
62
+ shadowSize,
63
+ tooltipAnchor
64
+ })
65
+ }
66
+
67
+ /** get an the leaflet editor geoman.io toolbar with the custom actions to draw/edit/move point and rectangle layers */
68
+ const getCustomGeomanActionsObject = (actionName: string, descriptionAction: string, arrayActions: Array<object>) => {
69
+ return {
70
+ name: actionName,
71
+ block: 'custom',
72
+ title: descriptionAction,
73
+ actions: arrayActions
74
+ }
75
+ }
76
+
77
+ /** prepare the leaflet editor geoman.io toolbar with the custom actions to draw/edit/move point and rectangle layers */
78
+ export function setGeomanControls(localMap: LMap) {
79
+ // leaflet geoman toolbar
80
+ localMap.pm.addControls({
81
+ position: 'topleft',
82
+ drawControls: false,
83
+ rotateMode: false,
84
+ cutPolygon: false,
85
+ customControls: true
86
+ })
87
+
88
+ const actionArray = [{
89
+ onClick(actionEvent: LEvented) {
90
+ console.log('actionEvent:', typeof actionEvent, '|', actionEvent, '')
91
+ },
92
+ name: 'actionName'
93
+ }]
94
+ const includeMarkerControl = localMap.pm.Toolbar.copyDrawControl('Marker',
95
+ getCustomGeomanActionsObject('IncludeMarkerPrompt', 'Marker that add recognition regions from SAM prompt requests', actionArray)
96
+ )
97
+ includeMarkerControl.drawInstance.setOptions({
98
+ markerStyle: { icon: getCustomIconMarker('/marker-icon-include') }
99
+ })
100
+ const excludeMarkerControl = localMap.pm.Toolbar.copyDrawControl('Marker',
101
+ getCustomGeomanActionsObject('ExcludeMarkerPrompt', 'Marker that remove recognition regions from SAM prompt requests', actionArray)
102
+ )
103
+ excludeMarkerControl.drawInstance.setOptions({
104
+ markerStyle: { icon: getCustomIconMarker('/marker-icon-exclude') }
105
+ })
106
+ localMap.pm.Toolbar.copyDrawControl('Rectangle', {
107
+ name: 'RectanglePrompt',
108
+ block: 'custom',
109
+ title: 'Rectangular recognition regions for SAM prompt requests',
110
+ actions: actionArray
111
+ })
112
+ localMap.pm.setPathOptions({
113
+ color: "green",
114
+ fillColor: "green",
115
+ fillOpacity: 0.15,
116
+ })
117
+ }
118
+
119
+ /** get the selected rectangle layer bounding box coordinate */
120
+ export const getSelectedRectangleCoordinatesBBox = (leafletEvent: LEvented): BboxLatLng => {
121
+ const { _northEast, _southWest } = leafletEvent.layer._bounds
122
+ return {
123
+ ne: new L.LatLng(_northEast.lat, _northEast.lng),
124
+ sw: new L.LatLng(_southWest.lat, _southWest.lng)
125
+ }
126
+ }
127
+
128
+ /** get the current selected point coordinate */
129
+ export const getSelectedPointCoordinate = (leafletEvent: LEvented): LatLng => {
130
+ return leafletEvent.layer._latlng
131
+ }
132
+
133
+ /** get the current map bounding box coordinates */
134
+ export const getExtentCurrentViewMapBBox = (leafletMap: LMap): BboxLatLng => {
135
+ const boundaries = leafletMap.getBounds()
136
+ return { ne: boundaries.getNorthEast(), sw: boundaries.getSouthWest() }
137
+ }
138
+
139
+ /** send the ML request to the backend API through the cloudflare proxy function */
140
+ export const getGeoJSONRequest = async (
141
+ requestBody: IBodyLatLngPoints,
142
+ urlApi: string
143
+ ) => {
144
+ responseMessageRef.value = waitingString
145
+ const data = await fetch(urlApi, {
146
+ method: 'POST',
147
+ body: JSON.stringify(requestBody),
148
+ headers: {
149
+ 'Content-type': 'application/json'
150
+ }
151
+ })
152
+ try {
153
+ if (data.status === 200) {
154
+ const output: Object = await data.json()
155
+ try {
156
+ const parsed = JSON.parse(output.body)
157
+ const { geojson, n_predictions, n_shapes_geojson } = parsed.output
158
+
159
+ const parsedGeojson = JSON.parse(geojson)
160
+ durationRef.value = parsed.duration_run
161
+ numberOfPolygonsRef.value = n_shapes_geojson
162
+ numberOfPredictedMasksRef.value = n_predictions
163
+ responseMessageRef.value = ''
164
+ return parsedGeojson
165
+ } catch (errParseOutput1) {
166
+ console.error("errParseOutput1::", errParseOutput1)
167
+ return String(errParseOutput1)
168
+ }
169
+ } else {
170
+ const outputText = await data.text()
171
+ console.error('getGeoJSONRequest => status not 200, outputText', outputText, '#')
172
+ responseMessageRef.value = `error message response: ${outputText}...`
173
+ }
174
+ } catch (errorOtherData) {
175
+ const statusText = data.statusText || 'no response or uncaught exception!'
176
+ console.error(
177
+ 'getGeoJSONRequest => data',
178
+ data,
179
+ 'statusText',
180
+ statusText,
181
+ 'errorOtherData',
182
+ errorOtherData,
183
+ '#'
184
+ )
185
+ responseMessageRef.value = `error status response: ${statusText}...`
186
+ }
187
+ }
188
+
189
+ /** populate a single point ML request prompt, by type (exclude or include), see type ExcludeIncludeLabelPrompt */
190
+ export const getPointPromptElement = (e: LEvented, elementType: ExcludeIncludeLabelPrompt): IPointPrompt|IRectanglePrompt => {
191
+ const currentPointLayer: LatLng = getSelectedPointCoordinate(e)
192
+ return {
193
+ id: e.layer._leaflet_id,
194
+ type: 'point',
195
+ data: currentPointLayer,
196
+ label: elementType
197
+ }
198
+ }
199
+
200
+ /** populate a single rectangle ML request prompt */
201
+ export const getRectanglePromptElement = (e: LEvented) => {
202
+ return {
203
+ id: e.layer._leaflet_id,
204
+ type: 'rectangle',
205
+ data: getSelectedRectangleCoordinatesBBox(e)
206
+ }
207
+ }
208
+
209
+ /** handle different event/layer types (rectangle, point: IncludeMarkerPrompt, ExcludeMarkerPrompt) */
210
+ const updateLayerOnCreateOrEditEvent = (
211
+ event: LEvented,
212
+ getPopupContentPointFn: (arg0: LEvented, arg1: number) => HTMLDivElement,
213
+ promptsArrayRef: Ref) => {
214
+ responseMessageRef.value = '-'
215
+ if (event.shape === 'IncludeMarkerPrompt' || event.shape === 'ExcludeMarkerPrompt') {
216
+ const labelPoint = Number(excludeIncludeLabelPrompt[event.shape])
217
+ const div = getPopupContentPointFn(event, labelPoint)
218
+ event.layer.bindPopup(div).openPopup()
219
+ promptsArrayRef.value.push(getPointPromptElement(event, labelPoint))
220
+ }
221
+ if (event.shape === 'RectanglePrompt') {
222
+ event.layer.bindPopup(`id:${event.layer._leaflet_id}.`).openPopup()
223
+ promptsArrayRef.value.push(getRectanglePromptElement(event))
224
+ }
225
+ }
226
+
227
+ /** listen on the leaflet editor geoman.io events and update its layer properties within the promptsArrayRef vue ref */
228
+ export const updateMapData = (
229
+ localMap: LMap,
230
+ getPopupContentPointFn: (arg0: LEvented, arg1: number) => HTMLDivElement,
231
+ promptsArrayRef: Ref
232
+ ) => {
233
+ localMap.on('pm:create', (e: LEvented) => {
234
+ updateLayerOnCreateOrEditEvent(e, getPopupContentPointFn, promptsArrayRef)
235
+
236
+ // listen to changes on the new layer and update its object within promptsArrayRef
237
+ e.layer.on('pm:edit', function(newEvent: LEvented) {
238
+ promptsArrayRef.value = removeEventFromArrayByIndex(promptsArrayRef.value, newEvent)
239
+ updateLayerOnCreateOrEditEvent(e, getPopupContentPointFn, promptsArrayRef)
240
+ });
241
+ })
242
+ localMap.on('pm:remove', (e: LEvented) => {
243
+ responseMessageRef.value = '-'
244
+ promptsArrayRef.value = removeEventFromArrayByIndex(promptsArrayRef.value, e)
245
+ })
246
+ }
247
+
248
+ /** remove the selected layer from the ML request array prompt */
249
+ const removeEventFromArrayByIndex = (arr: Array<LEvented>, e: LEvented) => {
250
+ return arr.filter((el: LEvented) => {
251
+ return el.id != e.layer._leaflet_id
252
+ })
253
+ }
static/src/components/types.d.ts ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Evented, type LatLng } from "leaflet";
2
+
3
+ export interface BboxLatLng {
4
+ ne: LatLng,
5
+ sw: LatLng
6
+ }
7
+
8
+ export enum ExcludeIncludeLabelPrompt {
9
+ ExcludeMarkerPrompt = 0,
10
+ IncludeMarkerPrompt = 1
11
+ }
12
+ type PointPromptType = "point"
13
+ type RectanglePromptType = "rectangle"
14
+
15
+ export interface IPointPrompt {
16
+ id: Evented.layer._url,
17
+ type: PointPromptType,
18
+ data: LatLng,
19
+ label: ExcludeIncludeLabelPrompt
20
+ }
21
+
22
+ export interface IRectanglePrompt {
23
+ id?: Evented.layer._url,
24
+ type: RectanglePromptType,
25
+ data: BboxLatLng
26
+ }
27
+
28
+ export interface IPointTable {
29
+ id?: Evented.layer._url,
30
+ data: LatLng,
31
+ label: ExcludeIncludeLabelPrompt
32
+ }
33
+
34
+ export interface IRectangleTable {
35
+ id?: Evented.layer._url,
36
+ data_ne: BboxLatLng,
37
+ data_sw: BboxLatLng
38
+ }
39
+
40
+ export interface IBodyLatLngPoints {
41
+ bbox: BboxLatLng,
42
+ prompt: Array<IPointPrompt|IRectanglePrompt>,
43
+ zoom: number,
44
+ source_type: string
45
+ }
46
+
47
+ export type OpenStreetMap = "OpenStreetMap"
48
+ export type Satellite = "Satellite"
49
+ export type SourceTileType = OpenStreetMap | Satellite
50
+ export type ArrayNumber = Array<number>
static/src/input.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "leaflet/dist/leaflet.css";
2
+ @import "leaflet-custom.css";
3
+ @import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
4
+ @tailwind base;
5
+
6
+ @layer base {
7
+ * {
8
+ @apply box-border;
9
+ }
10
+ h1 {
11
+ @apply text-xl font-bold md:text-3xl;
12
+ }
13
+ a {
14
+ @apply underline;
15
+ }
16
+ }
17
+
18
+ @tailwind components;
19
+
20
+ @tailwind utilities;
static/src/leaflet-custom.css ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .map-predictions {
2
+ width: 80%;
3
+ aspect-ratio: 256/171;
4
+ position: relative;
5
+ z-index: 999;
6
+ /*float: left;*/
7
+ }
8
+ a.leaflet-control-layers-toggle {
9
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);
10
+ background-size: 26px 26px;
11
+ }
12
+ .leaflet-retina .leaflet-control-layers-toggle {
13
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);
14
+ background-size: 28px 28px;
15
+ }
16
+ @media only screen and (min-width: 2000px) {
17
+ .map-predictions {
18
+ width: 100%;
19
+ }
20
+ }
21
+ @media only screen and (max-width: 1800px) {
22
+ .map-predictions {
23
+ width: 75%;
24
+ }
25
+ }
26
+ @media only screen and (max-width: 1600px) {
27
+ .map-predictions {
28
+ width: 65%;
29
+ }
30
+ }
31
+ @media only screen and (max-width: 1370px) and (max-height: 920px) and (orientation: landscape) {
32
+ .map-predictions {
33
+ width: 95%;
34
+ }
35
+ }
36
+ @media only screen and (max-width: 810px) and (max-height: 370px) and (orientation: landscape) {
37
+ .map-predictions {
38
+ height: 70%;
39
+ max-height: 70%;
40
+ /*float: right;*/
41
+ }
42
+ }
static/src/main.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { createApp } from "vue";
2
+ import App from "./App.vue";
3
+
4
+ const app = createApp(App);
5
+
6
+ app.mount("#root");