diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..3b462cb
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1,23 @@
+node_modules
+
+# Output
+.output
+.vercel
+.netlify
+.wrangler
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/client/.npmrc b/client/.npmrc
new file mode 100644
index 0000000..b6f27f1
--- /dev/null
+++ b/client/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/client/.prettierignore b/client/.prettierignore
new file mode 100644
index 0000000..6562bcb
--- /dev/null
+++ b/client/.prettierignore
@@ -0,0 +1,6 @@
+# Package Managers
+package-lock.json
+pnpm-lock.yaml
+yarn.lock
+bun.lock
+bun.lockb
diff --git a/client/.prettierrc b/client/.prettierrc
new file mode 100644
index 0000000..7ebb855
--- /dev/null
+++ b/client/.prettierrc
@@ -0,0 +1,15 @@
+{
+ "useTabs": true,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "printWidth": 100,
+ "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
+ "overrides": [
+ {
+ "files": "*.svelte",
+ "options": {
+ "parser": "svelte"
+ }
+ }
+ ]
+}
diff --git a/client/README.md b/client/README.md
new file mode 100644
index 0000000..b5b2950
--- /dev/null
+++ b/client/README.md
@@ -0,0 +1,38 @@
+# sv
+
+Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
+
+## Creating a project
+
+If you're seeing this, you've probably already done this step. Congrats!
+
+```bash
+# create a new project in the current directory
+npx sv create
+
+# create a new project in my-app
+npx sv create my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+To create a production version of your app:
+
+```bash
+npm run build
+```
+
+You can preview the production build with `npm run preview`.
+
+> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
diff --git a/client/bun.lock b/client/bun.lock
new file mode 100644
index 0000000..5197b9b
--- /dev/null
+++ b/client/bun.lock
@@ -0,0 +1,847 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "client",
+ "dependencies": {
+ "@lucide/svelte": "^0.510.0",
+ "maplibre-gl": "^5.5.0",
+ },
+ "devDependencies": {
+ "@eslint/compat": "^1.2.5",
+ "@eslint/js": "^9.18.0",
+ "@sveltejs/adapter-auto": "^6.0.0",
+ "@sveltejs/kit": "^2.16.0",
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
+ "@tailwindcss/vite": "^4.1.6",
+ "bits-ui": "^1.4.8",
+ "clsx": "^2.1.1",
+ "eslint": "^9.18.0",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-svelte": "^3.0.0",
+ "globals": "^16.0.0",
+ "paneforge": "^1.0.0-next.5",
+ "prettier": "^3.4.2",
+ "prettier-plugin-svelte": "^3.3.3",
+ "prettier-plugin-tailwindcss": "^0.6.11",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "tailwind-merge": "^3.3.0",
+ "tailwind-variants": "^1.0.0",
+ "tailwindcss": "^4.1.6",
+ "tailwindcss-animate": "^1.0.7",
+ "typescript": "^5.0.0",
+ "typescript-eslint": "^8.20.0",
+ "vaul-svelte": "^1.0.0-next.7",
+ "vite": "^6.2.6",
+ },
+ },
+ },
+ "packages": {
+ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
+
+ "@eslint/compat": ["@eslint/compat@1.2.9", "", { "peerDependencies": { "eslint": "^9.10.0" }, "optionalPeers": ["eslint"] }, "sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="],
+
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.2.2", "", {}, "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg=="],
+
+ "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
+
+ "@eslint/js": ["@eslint/js@9.26.0", "", {}, "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="],
+
+ "@floating-ui/core": ["@floating-ui/core@1.7.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA=="],
+
+ "@floating-ui/dom": ["@floating-ui/dom@1.7.0", "", { "dependencies": { "@floating-ui/core": "^1.7.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg=="],
+
+ "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
+
+ "@internationalized/date": ["@internationalized/date@3.8.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw=="],
+
+ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
+
+ "@lucide/svelte": ["@lucide/svelte@0.510.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-1zj0aj9K+eBK0sMtDQh1HfL2Xv7EY+SemBWFMMmoVN4mZ9Swc3e5cGs20knwdgt46kZnlEI/a29tX//zpl64LA=="],
+
+ "@mapbox/geojson-rewind": ["@mapbox/geojson-rewind@0.5.2", "", { "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" }, "bin": { "geojson-rewind": "geojson-rewind" } }, "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA=="],
+
+ "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="],
+
+ "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="],
+
+ "@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@2.0.6", "", {}, "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA=="],
+
+ "@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.1", "", {}, "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="],
+
+ "@mapbox/vector-tile": ["@mapbox/vector-tile@1.3.1", "", { "dependencies": { "@mapbox/point-geometry": "~0.1.0" } }, "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw=="],
+
+ "@mapbox/whoots-js": ["@mapbox/whoots-js@3.1.0", "", {}, "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="],
+
+ "@maplibre/maplibre-gl-style-spec": ["@maplibre/maplibre-gl-style-spec@23.2.2", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", "quickselect": "^3.0.0", "rw": "^1.3.3", "tinyqueue": "^3.0.0" }, "bin": { "gl-style-migrate": "dist/gl-style-migrate.mjs", "gl-style-validate": "dist/gl-style-validate.mjs", "gl-style-format": "dist/gl-style-format.mjs" } }, "sha512-kLcVlItPCULc20SM6pSVA7u8nST9xmQA8d7utc9j3KB0Tf/xhM4GgCn/QsZcmlbN/wW0ujyomDrvZ3/LbwvAmw=="],
+
+ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.11.2", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ=="],
+
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+
+ "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.2", "", { "os": "android", "cpu": "arm" }, "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.2", "", { "os": "android", "cpu": "arm64" }, "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg=="],
+
+ "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw=="],
+
+ "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.2", "", { "os": "win32", "cpu": "x64" }, "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA=="],
+
+ "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="],
+
+ "@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@6.0.1", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-mcWud3pYGPWM2Pphdj8G9Qiq24nZ8L4LB7coCUckUEy5Y7wOWGJ/enaZ4AtJTcSm5dNK1rIkBRoqt+ae4zlxcQ=="],
+
+ "@sveltejs/kit": ["@sveltejs/kit@2.21.0", "", { "dependencies": { "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-kvu4h9qXduiPk1Q1oqFKDLFGu/7mslEYbVaqpbBcBxjlRJnvNCFwEvEwKt0Mx9TtSi8J77xRelvJobrGlst4nQ=="],
+
+ "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.0.3", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.0", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.15", "vitefu": "^1.0.4" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw=="],
+
+ "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@4.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.0", "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw=="],
+
+ "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="],
+
+ "@tailwindcss/node": ["@tailwindcss/node@4.1.6", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.6" } }, "sha512-ed6zQbgmKsjsVvodAS1q1Ld2BolEuxJOSyyNc+vhkjdmfNUDCmQnlXBfQkHrlzNmslxHsQU/bFmzcEbv4xXsLg=="],
+
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.6", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.6", "@tailwindcss/oxide-darwin-arm64": "4.1.6", "@tailwindcss/oxide-darwin-x64": "4.1.6", "@tailwindcss/oxide-freebsd-x64": "4.1.6", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.6", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.6", "@tailwindcss/oxide-linux-arm64-musl": "4.1.6", "@tailwindcss/oxide-linux-x64-gnu": "4.1.6", "@tailwindcss/oxide-linux-x64-musl": "4.1.6", "@tailwindcss/oxide-wasm32-wasi": "4.1.6", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.6", "@tailwindcss/oxide-win32-x64-msvc": "4.1.6" } }, "sha512-0bpEBQiGx+227fW4G0fLQ8vuvyy5rsB1YIYNapTq3aRsJ9taF3f5cCaovDjN5pUGKKzcpMrZst/mhNaKAPOHOA=="],
+
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.6", "", { "os": "android", "cpu": "arm64" }, "sha512-VHwwPiwXtdIvOvqT/0/FLH/pizTVu78FOnI9jQo64kSAikFSZT7K4pjyzoDpSMaveJTGyAKvDjuhxJxKfmvjiQ=="],
+
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-weINOCcqv1HVBIGptNrk7c6lWgSFFiQMcCpKM4tnVi5x8OY2v1FrV76jwLukfT6pL1hyajc06tyVmZFYXoxvhQ=="],
+
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-3FzekhHG0ww1zQjQ1lPoq0wPrAIVXAbUkWdWM8u5BnYFZgb9ja5ejBqyTgjpo5mfy0hFOoMnMuVDI+7CXhXZaQ=="],
+
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4m5F5lpkBZhVQJq53oe5XgJ+aFYWdrgkMwViHjRsES3KEu2m1udR21B1I77RUqie0ZYNscFzY1v9aDssMBZ/1w=="],
+
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.6", "", { "os": "linux", "cpu": "arm" }, "sha512-qU0rHnA9P/ZoaDKouU1oGPxPWzDKtIfX7eOGi5jOWJKdxieUJdVV+CxWZOpDWlYTd4N3sFQvcnVLJWJ1cLP5TA=="],
+
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-jXy3TSTrbfgyd3UxPQeXC3wm8DAgmigzar99Km9Sf6L2OFfn/k+u3VqmpgHQw5QNfCpPe43em6Q7V76Wx7ogIQ=="],
+
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw=="],
+
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg=="],
+
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A=="],
+
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.6", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.9", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ=="],
+
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-nqpDWk0Xr8ELO/nfRUDjk1pc9wDJ3ObeDdNMHLaymc4PJBWj11gdPCWZFKSK2AVKjJQC7J2EfmSmf47GN7OuLg=="],
+
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-5k9xF33xkfKpo9wCvYcegQ21VwIBU1/qEbYlVukfEIyQbEA47uK8AAwS7NVjNE3vHzcmxMYwd0l6L4pPjjm1rQ=="],
+
+ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.6", "", { "dependencies": { "@tailwindcss/node": "4.1.6", "@tailwindcss/oxide": "4.1.6", "tailwindcss": "4.1.6" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-zjtqjDeY1w3g2beYQtrMAf51n5G7o+UwmyOjtsDMP7t6XyoRMOidcoKP32ps7AkNOHIXEOK0bhIC05dj8oJp4w=="],
+
+ "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
+
+ "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
+
+ "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
+
+ "@types/geojson-vt": ["@types/geojson-vt@3.2.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/mapbox__point-geometry": ["@types/mapbox__point-geometry@0.1.4", "", {}, "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="],
+
+ "@types/mapbox__vector-tile": ["@types/mapbox__vector-tile@1.3.4", "", { "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", "@types/pbf": "*" } }, "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg=="],
+
+ "@types/pbf": ["@types/pbf@3.0.5", "", {}, "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="],
+
+ "@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="],
+
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="],
+
+ "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
+
+ "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "bits-ui": ["bits-ui@1.4.8", "", { "dependencies": { "@floating-ui/core": "^1.6.4", "@floating-ui/dom": "^1.6.7", "@internationalized/date": "^3.5.6", "esm-env": "^1.1.2", "runed": "^0.23.2", "svelte-toolbelt": "^0.7.1", "tabbable": "^6.2.0" }, "peerDependencies": { "svelte": "^5.11.0" } }, "sha512-j34GsdSsJ+ZBl9h/70VkufvrlEgTKQSZvm80eM5VvuhLJWvpfEpn9+k0FVmtDQl9NSPgEVtI9imYhm8nW9Nj/w=="],
+
+ "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="],
+
+ "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
+
+ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
+
+ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
+
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="],
+
+ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
+
+ "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="],
+
+ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
+
+ "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
+ "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
+
+ "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
+
+ "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="],
+
+ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
+
+ "earcut": ["earcut@3.0.1", "", {}, "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw=="],
+
+ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
+
+ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
+
+ "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
+
+ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
+
+ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
+
+ "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
+
+ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
+
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "zod": "^3.24.2" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ=="],
+
+ "eslint-config-prettier": ["eslint-config-prettier@10.1.5", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw=="],
+
+ "eslint-plugin-svelte": ["eslint-plugin-svelte@3.6.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "known-css-properties": "^0.36.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.1.1" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-IIf6Cj6yQuCwL7Qd8bX13BZspz+DQsOkClozMF9EkW20FSxI75Ndd5ZzbviCn32DdXRo9FUWXn+YMIL46qPOOg=="],
+
+ "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
+
+ "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
+
+ "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
+
+ "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
+
+ "esrap": ["esrap@1.4.6", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
+
+ "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
+
+ "eventsource-parser": ["eventsource-parser@3.0.1", "", {}, "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA=="],
+
+ "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="],
+
+ "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
+
+ "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="],
+
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+
+ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
+
+ "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+
+ "geojson-vt": ["geojson-vt@4.0.2", "", {}, "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A=="],
+
+ "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
+
+ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
+
+ "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="],
+
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "global-prefix": ["global-prefix@4.0.0", "", { "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", "which": "^4.0.0" } }, "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA=="],
+
+ "globals": ["globals@16.1.0", "", {}, "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g=="],
+
+ "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
+
+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+
+ "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="],
+
+ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+
+ "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="],
+
+ "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="],
+
+ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
+
+ "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
+
+ "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "json-stringify-pretty-compact": ["json-stringify-pretty-compact@4.0.0", "", {}, "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q=="],
+
+ "kdbush": ["kdbush@4.0.2", "", {}, "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
+
+ "known-css-properties": ["known-css-properties@0.36.0", "", {}, "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA=="],
+
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
+ "lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="],
+
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="],
+
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w=="],
+
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg=="],
+
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg=="],
+
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ=="],
+
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ=="],
+
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg=="],
+
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w=="],
+
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw=="],
+
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="],
+
+ "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="],
+
+ "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
+ "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
+
+ "maplibre-gl": ["maplibre-gl@5.5.0", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^2.0.6", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^23.2.2", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.1", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "global-prefix": "^4.0.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.3.0", "potpack": "^2.0.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0", "vt-pbf": "^3.1.3" } }, "sha512-p8AOPuzzqn1ZA9gcXxKw0IED715we/2Owa/YUr6PANmgMvNMe/JG+V/C1hRra43Wm62Biz+Aa8AgbOLJimA8tA=="],
+
+ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
+
+ "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
+
+ "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
+
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
+
+ "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="],
+
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+
+ "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
+
+ "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
+
+ "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
+
+ "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
+
+ "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
+
+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
+
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "paneforge": ["paneforge@1.0.0-next.5", "", { "dependencies": { "runed": "^0.23.4", "svelte-toolbelt": "^0.7.1" }, "peerDependencies": { "svelte": "^5.20.0" } }, "sha512-1ArDM+GMEO+o6pixEAFobhTkWkyxUDdHyw2bKruvQIXBStJmdRP7HoV4jNBZ/2i9UHDzmczxJzA3D2tKa91phw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="],
+
+ "pbf": ["pbf@3.3.0", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
+
+ "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="],
+
+ "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
+
+ "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="],
+
+ "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="],
+
+ "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="],
+
+ "potpack": ["potpack@2.0.0", "", {}, "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
+
+ "prettier-plugin-svelte": ["prettier-plugin-svelte@3.3.3", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw=="],
+
+ "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.11", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA=="],
+
+ "protocol-buffers-schema": ["protocol-buffers-schema@3.6.0", "", {}, "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="],
+
+ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="],
+
+ "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
+
+ "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
+ "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="],
+
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "rollup": ["rollup@4.40.2", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.2", "@rollup/rollup-android-arm64": "4.40.2", "@rollup/rollup-darwin-arm64": "4.40.2", "@rollup/rollup-darwin-x64": "4.40.2", "@rollup/rollup-freebsd-arm64": "4.40.2", "@rollup/rollup-freebsd-x64": "4.40.2", "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", "@rollup/rollup-linux-arm-musleabihf": "4.40.2", "@rollup/rollup-linux-arm64-gnu": "4.40.2", "@rollup/rollup-linux-arm64-musl": "4.40.2", "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-musl": "4.40.2", "@rollup/rollup-linux-s390x-gnu": "4.40.2", "@rollup/rollup-linux-x64-gnu": "4.40.2", "@rollup/rollup-linux-x64-musl": "4.40.2", "@rollup/rollup-win32-arm64-msvc": "4.40.2", "@rollup/rollup-win32-ia32-msvc": "4.40.2", "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg=="],
+
+ "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "runed": ["runed@0.23.4", "", { "dependencies": { "esm-env": "^1.0.0" }, "peerDependencies": { "svelte": "^5.7.0" } }, "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA=="],
+
+ "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
+
+ "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+
+ "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="],
+
+ "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="],
+
+ "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="],
+
+ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
+
+ "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
+
+ "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
+
+ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
+
+ "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
+
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="],
+
+ "supercluster": ["supercluster@8.0.1", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "svelte": ["svelte@5.28.6", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^1.4.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-9qqr7mw8YR9PAnxGFfzCK6PUlNGtns7wVavrhnxyf3fpB1mP/Ol55Z2UnIapsSzNNl3k9qw7cZ22PdE8+xT/jQ=="],
+
+ "svelte-check": ["svelte-check@4.1.7", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-1jX4BzXrQJhC/Jt3SqYf6Ntu//vmfc6VWp07JkRfK2nn+22yIblspVUo96gzMkg0Zov8lQicxhxsMzOctwcMQQ=="],
+
+ "svelte-eslint-parser": ["svelte-eslint-parser@1.1.3", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-DUc/z/vk+AFVoxGv54+BOBFqUrmUgNg2gSO2YqrE3OL6ro19/0azPmQj/4wN3s9RxuF5l7G0162q/Ddk4LJhZA=="],
+
+ "svelte-toolbelt": ["svelte-toolbelt@0.7.1", "", { "dependencies": { "clsx": "^2.1.1", "runed": "^0.23.2", "style-to-object": "^1.0.8" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ=="],
+
+ "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
+
+ "tailwind-merge": ["tailwind-merge@3.3.0", "", {}, "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ=="],
+
+ "tailwind-variants": ["tailwind-variants@1.0.0", "", { "dependencies": { "tailwind-merge": "3.0.2" }, "peerDependencies": { "tailwindcss": "*" } }, "sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA=="],
+
+ "tailwindcss": ["tailwindcss@4.1.6", "", {}, "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg=="],
+
+ "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="],
+
+ "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
+
+ "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+
+ "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="],
+
+ "tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
+
+ "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="],
+
+ "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
+
+ "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
+
+ "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="],
+
+ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
+
+ "vaul-svelte": ["vaul-svelte@1.0.0-next.7", "", { "dependencies": { "runed": "^0.23.2", "svelte-toolbelt": "^0.7.1" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-7zN7Bi3dFQixvvbUJY9uGDe7Ws/dGZeBQR2pXdXmzQiakjrxBvWo0QrmsX3HK+VH+SZOltz378cmgmCS9f9rSg=="],
+
+ "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="],
+
+ "vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="],
+
+ "vt-pbf": ["vt-pbf@3.1.3", "", { "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", "pbf": "^3.2.1" } }, "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+
+ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+
+ "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
+
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="],
+
+ "zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
+
+ "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+
+ "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.9", "", { "dependencies": { "@emnapi/core": "^1.4.0", "@emnapi/runtime": "^1.4.0", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
+
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "global-prefix/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "tailwind-variants/tailwind-merge": ["tailwind-merge@3.0.2", "", {}, "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw=="],
+
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
+
+ "global-prefix/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="],
+ }
+}
diff --git a/client/components.json b/client/components.json
new file mode 100644
index 0000000..4106aaa
--- /dev/null
+++ b/client/components.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://next.shadcn-svelte.com/schema.json",
+ "style": "default",
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src/app.css",
+ "baseColor": "zinc"
+ },
+ "aliases": {
+ "components": "$lib/components",
+ "utils": "$lib/utils",
+ "ui": "$lib/components/ui",
+ "hooks": "$lib/hooks"
+ },
+ "typescript": true,
+ "registry": "https://next.shadcn-svelte.com/registry"
+}
diff --git a/client/eslint.config.js b/client/eslint.config.js
new file mode 100644
index 0000000..ef07d32
--- /dev/null
+++ b/client/eslint.config.js
@@ -0,0 +1,36 @@
+import prettier from 'eslint-config-prettier';
+import js from '@eslint/js';
+import { includeIgnoreFile } from '@eslint/compat';
+import svelte from 'eslint-plugin-svelte';
+import globals from 'globals';
+import { fileURLToPath } from 'node:url';
+import ts from 'typescript-eslint';
+import svelteConfig from './svelte.config.js';
+
+const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));
+
+export default ts.config(
+ includeIgnoreFile(gitignorePath),
+ js.configs.recommended,
+ ...ts.configs.recommended,
+ ...svelte.configs.recommended,
+ prettier,
+ ...svelte.configs.prettier,
+ {
+ languageOptions: {
+ globals: { ...globals.browser, ...globals.node }
+ },
+ rules: { 'no-undef': 'off' }
+ },
+ {
+ files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
+ languageOptions: {
+ parserOptions: {
+ projectService: true,
+ extraFileExtensions: ['.svelte'],
+ parser: ts.parser,
+ svelteConfig
+ }
+ }
+ }
+);
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 0000000..49075fd
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "client",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "prepare": "svelte-kit sync || echo ''",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "format": "prettier --write .",
+ "lint": "prettier --check . && eslint ."
+ },
+ "devDependencies": {
+ "@eslint/compat": "^1.2.5",
+ "@eslint/js": "^9.18.0",
+ "@sveltejs/adapter-auto": "^6.0.0",
+ "@sveltejs/kit": "^2.16.0",
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
+ "@tailwindcss/vite": "^4.1.6",
+ "bits-ui": "^1.4.8",
+ "clsx": "^2.1.1",
+ "eslint": "^9.18.0",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-svelte": "^3.0.0",
+ "globals": "^16.0.0",
+ "paneforge": "^1.0.0-next.5",
+ "prettier": "^3.4.2",
+ "prettier-plugin-svelte": "^3.3.3",
+ "prettier-plugin-tailwindcss": "^0.6.11",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "tailwind-merge": "^3.3.0",
+ "tailwind-variants": "^1.0.0",
+ "tailwindcss": "^4.1.6",
+ "tailwindcss-animate": "^1.0.7",
+ "typescript": "^5.0.0",
+ "typescript-eslint": "^8.20.0",
+ "vaul-svelte": "^1.0.0-next.7",
+ "vite": "^6.2.6"
+ },
+ "dependencies": {
+ "@lucide/svelte": "^0.510.0",
+ "maplibre-gl": "^5.5.0"
+ }
+}
diff --git a/client/src/app.css b/client/src/app.css
new file mode 100644
index 0000000..d8b13b5
--- /dev/null
+++ b/client/src/app.css
@@ -0,0 +1,75 @@
+@import 'tailwindcss';
+@import 'maplibre-gl/dist/maplibre-gl.css';
+@config "../tailwind.config.ts";
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --primary: 240 5.9% 10%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
+ --destructive: 0 72.2% 50.6%;
+ --destructive-foreground: 0 0% 98%;
+ --ring: 240 10% 3.9%;
+ --radius: 0.5rem;
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 240 5.3% 26.1%;
+ --sidebar-primary: 240 5.9% 10%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 240 4.8% 95.9%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 220 13% 91%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+
+ .dark {
+ --background: 240 10% 3.9%;
+ --foreground: 0 0% 98%;
+ --muted: 240 3.7% 15.9%;
+ --muted-foreground: 240 5% 64.9%;
+ --popover: 240 10% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --card: 240 10% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --border: 240 3.7% 15.9%;
+ --input: 240 3.7% 15.9%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 240 5.9% 10%;
+ --secondary: 240 3.7% 15.9%;
+ --secondary-foreground: 0 0% 98%;
+ --accent: 240 3.7% 15.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --ring: 240 4.9% 83.9%;
+ --sidebar-background: 240 5.9% 10%;
+ --sidebar-foreground: 240 4.8% 95.9%;
+ --sidebar-primary: 224.3 76.3% 48%;
+ --sidebar-primary-foreground: 0 0% 100%;
+ --sidebar-accent: 240 3.7% 15.9%;
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
+ --sidebar-border: 240 3.7% 15.9%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
\ No newline at end of file
diff --git a/client/src/app.d.ts b/client/src/app.d.ts
new file mode 100644
index 0000000..da08e6d
--- /dev/null
+++ b/client/src/app.d.ts
@@ -0,0 +1,13 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+// for information about these interfaces
+declare global {
+ namespace App {
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/client/src/app.html b/client/src/app.html
new file mode 100644
index 0000000..5e6a4be
--- /dev/null
+++ b/client/src/app.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
diff --git a/client/src/lib/Map.svelte b/client/src/lib/Map.svelte
new file mode 100644
index 0000000..e30ad2c
--- /dev/null
+++ b/client/src/lib/Map.svelte
@@ -0,0 +1,61 @@
+
+
+
+
+ {#if map}
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+
+
diff --git a/client/src/lib/ToolbarProductSelector.svelte b/client/src/lib/ToolbarProductSelector.svelte
new file mode 100644
index 0000000..978bbe1
--- /dev/null
+++ b/client/src/lib/ToolbarProductSelector.svelte
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+ {#if selectedPrimaryLayer !== null}
+ {#if pickingSiteForCategory}
+ Select site for {selectedPrimaryLayer}...
+ {:else if selectedSite}
+ {selectedSite} - {selectedPrimaryLayer}
+ {:else}
+ {selectedPrimaryLayer}
+ {/if}
+ {:else if currentlySelectingCategory}
+ Select data at {selectedSite}...
+ {:else}
+ No layer selected
+ {/if}
+
+
+ {#if selectedPrimaryLayer !== null}{:else}
+ Click to select data
+ {/if}
+
+
+
+
+ {#if currentlySelectingCategory && selectedSite}
+
+ Data available at {selectedSite}
+
+ {#each currentlySelectingCategory as data (data.id)}
+ {
+ selectedPrimaryLayer = data.id;
+ }}>{data.layer}
+ {/each}
+
+
+ {/if}
+
+ Radar Source
+
+
+ {#each categories as item (item.id)}
+ {#if item.category}
+ {#if !item.singlesite}
+
+ {item.category}
+
+ {#each item.children as layer (layer.id)}
+ {
+ selectedPrimaryLayer = layer.id;
+ pickingSiteForCategory = false;
+ currentlySelectingCategory = null;
+ selectedSite = null;
+ if (currentlySelectingFor) {
+ if (map.getLayer(`select-${currentlySelectingFor}`)) {
+ map.removeLayer(`select-${currentlySelectingFor}`);
+ }
+ }
+ }}
+ >
+ {layer.layer}
+
+ {/each}
+
+
+ {:else}
+ {
+ if (currentlySelectingFor) {
+ if (map.getLayer(`select-${currentlySelectingFor}`)) {
+ map.removeLayer(`select-${currentlySelectingFor}`);
+ }
+ }
+ selectedPrimaryLayer = item.id;
+ pickingSiteForCategory = true;
+ currentlySelectingCategory = item.children;
+ selectedSite = null;
+ if (!map.getSource(item.id)) {
+ map.addSource(item.id, {
+ type: 'geojson',
+ data: siteListToGeoJson(item.sites)
+ });
+ }
+ map.addLayer({
+ id: `select-${item.id}`,
+ type: 'symbol',
+ source: item.id,
+ layout: {
+ 'icon-image': 'radar-rect-gray',
+ 'text-field': ['get', 'icao'],
+ 'text-size': 13,
+ 'icon-size': 0.23
+ },
+ paint: {
+ 'text-color': '#000000'
+ }
+ });
+ currentlySelectingFor = item.id;
+ map.on('click', `select-${item.id}`, (e) => {
+ if (e && e.features) {
+ map.flyTo({
+ // @ts-expect-error it's fine, shhhh
+ center: e.features[0].geometry.coordinates,
+ zoom: 5
+ });
+ // did we already have a site set?
+ let alreadyHadSite = selectedSite != null;
+ pickingSiteForCategory = false;
+ selectedSite = e.features[0].properties.icao;
+ if (!alreadyHadSite) {
+ selectedPrimaryLayer = null;
+ open = true;
+ } // preserve the layer the user had if they click while already selected.
+ }
+ });
+ map.on('mouseenter', `select-${item.id}`, () => {
+ map.getCanvas().style.cursor = 'pointer';
+ });
+ map.on('mouseleave', `select-${item.id}`, () => {
+ map.getCanvas().style.cursor = '';
+ });
+ }}>{item.category}...
+ {/if}
+ {/if}
+ {/each}
+
+
+
diff --git a/client/src/lib/components/ui/badge/badge.svelte b/client/src/lib/components/ui/badge/badge.svelte
new file mode 100644
index 0000000..da26104
--- /dev/null
+++ b/client/src/lib/components/ui/badge/badge.svelte
@@ -0,0 +1,50 @@
+
+
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/badge/index.ts b/client/src/lib/components/ui/badge/index.ts
new file mode 100644
index 0000000..64e0aa9
--- /dev/null
+++ b/client/src/lib/components/ui/badge/index.ts
@@ -0,0 +1,2 @@
+export { default as Badge } from "./badge.svelte";
+export { badgeVariants, type BadgeVariant } from "./badge.svelte";
diff --git a/client/src/lib/components/ui/button/button.svelte b/client/src/lib/components/ui/button/button.svelte
new file mode 100644
index 0000000..22ab2d0
--- /dev/null
+++ b/client/src/lib/components/ui/button/button.svelte
@@ -0,0 +1,74 @@
+
+
+
+
+{#if href}
+
+ {@render children?.()}
+
+{:else}
+
+{/if}
diff --git a/client/src/lib/components/ui/button/index.ts b/client/src/lib/components/ui/button/index.ts
new file mode 100644
index 0000000..fb585d7
--- /dev/null
+++ b/client/src/lib/components/ui/button/index.ts
@@ -0,0 +1,17 @@
+import Root, {
+ type ButtonProps,
+ type ButtonSize,
+ type ButtonVariant,
+ buttonVariants,
+} from "./button.svelte";
+
+export {
+ Root,
+ type ButtonProps as Props,
+ //
+ Root as Button,
+ buttonVariants,
+ type ButtonProps,
+ type ButtonSize,
+ type ButtonVariant,
+};
diff --git a/client/src/lib/components/ui/checkbox/checkbox.svelte b/client/src/lib/components/ui/checkbox/checkbox.svelte
new file mode 100644
index 0000000..2395094
--- /dev/null
+++ b/client/src/lib/components/ui/checkbox/checkbox.svelte
@@ -0,0 +1,35 @@
+
+
+
+ {#snippet children({ checked, indeterminate })}
+
+ {#if indeterminate}
+
+ {:else}
+
+ {/if}
+
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/checkbox/index.ts b/client/src/lib/components/ui/checkbox/index.ts
new file mode 100644
index 0000000..6d92d94
--- /dev/null
+++ b/client/src/lib/components/ui/checkbox/index.ts
@@ -0,0 +1,6 @@
+import Root from "./checkbox.svelte";
+export {
+ Root,
+ //
+ Root as Checkbox,
+};
diff --git a/client/src/lib/components/ui/command/command-dialog.svelte b/client/src/lib/components/ui/command/command-dialog.svelte
new file mode 100644
index 0000000..be6562b
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-dialog.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
diff --git a/client/src/lib/components/ui/command/command-empty.svelte b/client/src/lib/components/ui/command/command-empty.svelte
new file mode 100644
index 0000000..5d86afe
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-empty.svelte
@@ -0,0 +1,12 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/command-group.svelte b/client/src/lib/components/ui/command/command-group.svelte
new file mode 100644
index 0000000..6ddc667
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-group.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {#if heading}
+
+ {heading}
+
+ {/if}
+
+
diff --git a/client/src/lib/components/ui/command/command-input.svelte b/client/src/lib/components/ui/command/command-input.svelte
new file mode 100644
index 0000000..f012d04
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-input.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
diff --git a/client/src/lib/components/ui/command/command-item.svelte b/client/src/lib/components/ui/command/command-item.svelte
new file mode 100644
index 0000000..afa84fb
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-item.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/command-link-item.svelte b/client/src/lib/components/ui/command/command-link-item.svelte
new file mode 100644
index 0000000..aaaaaca
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-link-item.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/command-list.svelte b/client/src/lib/components/ui/command/command-list.svelte
new file mode 100644
index 0000000..4a07321
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-list.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/command-separator.svelte b/client/src/lib/components/ui/command/command-separator.svelte
new file mode 100644
index 0000000..526777b
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-separator.svelte
@@ -0,0 +1,12 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/command-shortcut.svelte b/client/src/lib/components/ui/command/command-shortcut.svelte
new file mode 100644
index 0000000..f09693d
--- /dev/null
+++ b/client/src/lib/components/ui/command/command-shortcut.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/command/command.svelte b/client/src/lib/components/ui/command/command.svelte
new file mode 100644
index 0000000..feff690
--- /dev/null
+++ b/client/src/lib/components/ui/command/command.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/client/src/lib/components/ui/command/index.ts b/client/src/lib/components/ui/command/index.ts
new file mode 100644
index 0000000..d3dbade
--- /dev/null
+++ b/client/src/lib/components/ui/command/index.ts
@@ -0,0 +1,40 @@
+import { Command as CommandPrimitive } from "bits-ui";
+
+import Root from "./command.svelte";
+import Dialog from "./command-dialog.svelte";
+import Empty from "./command-empty.svelte";
+import Group from "./command-group.svelte";
+import Item from "./command-item.svelte";
+import Input from "./command-input.svelte";
+import List from "./command-list.svelte";
+import Separator from "./command-separator.svelte";
+import Shortcut from "./command-shortcut.svelte";
+import LinkItem from "./command-link-item.svelte";
+
+const Loading = CommandPrimitive.Loading;
+
+export {
+ Root,
+ Dialog,
+ Empty,
+ Group,
+ Item,
+ LinkItem,
+ Input,
+ List,
+ Separator,
+ Shortcut,
+ Loading,
+ //
+ Root as Command,
+ Dialog as CommandDialog,
+ Empty as CommandEmpty,
+ Group as CommandGroup,
+ Item as CommandItem,
+ LinkItem as CommandLinkItem,
+ Input as CommandInput,
+ List as CommandList,
+ Separator as CommandSeparator,
+ Shortcut as CommandShortcut,
+ Loading as CommandLoading,
+};
diff --git a/client/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte b/client/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte
new file mode 100644
index 0000000..4d287cf
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte
@@ -0,0 +1,40 @@
+
+
+
+ {#snippet children({ checked, indeterminate })}
+
+ {#if indeterminate}
+
+ {:else}
+
+ {/if}
+
+ {@render childrenProp?.()}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-content.svelte b/client/src/lib/components/ui/context-menu/context-menu-content.svelte
new file mode 100644
index 0000000..0ace06f
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-content.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-group-heading.svelte b/client/src/lib/components/ui/context-menu/context-menu-group-heading.svelte
new file mode 100644
index 0000000..7a43228
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-group-heading.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-item.svelte b/client/src/lib/components/ui/context-menu/context-menu-item.svelte
new file mode 100644
index 0000000..e8c85c8
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-item.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-radio-item.svelte b/client/src/lib/components/ui/context-menu/context-menu-radio-item.svelte
new file mode 100644
index 0000000..4070b3a
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-radio-item.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#snippet children({ checked })}
+
+ {#if checked}
+
+ {/if}
+
+ {@render childrenProp?.({ checked })}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-separator.svelte b/client/src/lib/components/ui/context-menu/context-menu-separator.svelte
new file mode 100644
index 0000000..7f17bd0
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-separator.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-shortcut.svelte b/client/src/lib/components/ui/context-menu/context-menu-shortcut.svelte
new file mode 100644
index 0000000..f09693d
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-shortcut.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-sub-content.svelte b/client/src/lib/components/ui/context-menu/context-menu-sub-content.svelte
new file mode 100644
index 0000000..f58eb98
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-sub-content.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte b/client/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte
new file mode 100644
index 0000000..8dead06
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/context-menu/index.ts b/client/src/lib/components/ui/context-menu/index.ts
new file mode 100644
index 0000000..d1ccf93
--- /dev/null
+++ b/client/src/lib/components/ui/context-menu/index.ts
@@ -0,0 +1,49 @@
+import { ContextMenu as ContextMenuPrimitive } from "bits-ui";
+
+import Item from "./context-menu-item.svelte";
+import GroupHeading from "./context-menu-group-heading.svelte";
+import Content from "./context-menu-content.svelte";
+import Shortcut from "./context-menu-shortcut.svelte";
+import RadioItem from "./context-menu-radio-item.svelte";
+import Separator from "./context-menu-separator.svelte";
+import SubContent from "./context-menu-sub-content.svelte";
+import SubTrigger from "./context-menu-sub-trigger.svelte";
+import CheckboxItem from "./context-menu-checkbox-item.svelte";
+
+const Sub = ContextMenuPrimitive.Sub;
+const Root = ContextMenuPrimitive.Root;
+const Trigger = ContextMenuPrimitive.Trigger;
+const Group = ContextMenuPrimitive.Group;
+const RadioGroup = ContextMenuPrimitive.RadioGroup;
+
+export {
+ Sub,
+ Root,
+ Item,
+ GroupHeading,
+ Group,
+ Trigger,
+ Content,
+ Shortcut,
+ Separator,
+ RadioItem,
+ SubContent,
+ SubTrigger,
+ RadioGroup,
+ CheckboxItem,
+ //
+ Root as ContextMenu,
+ Sub as ContextMenuSub,
+ Item as ContextMenuItem,
+ GroupHeading as ContextMenuGroupHeading,
+ Group as ContextMenuGroup,
+ Content as ContextMenuContent,
+ Trigger as ContextMenuTrigger,
+ Shortcut as ContextMenuShortcut,
+ RadioItem as ContextMenuRadioItem,
+ Separator as ContextMenuSeparator,
+ RadioGroup as ContextMenuRadioGroup,
+ SubContent as ContextMenuSubContent,
+ SubTrigger as ContextMenuSubTrigger,
+ CheckboxItem as ContextMenuCheckboxItem,
+};
diff --git a/client/src/lib/components/ui/dialog/dialog-content.svelte b/client/src/lib/components/ui/dialog/dialog-content.svelte
new file mode 100644
index 0000000..c4f81a1
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-content.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+ {@render children?.()}
+
+
+ Close
+
+
+
diff --git a/client/src/lib/components/ui/dialog/dialog-description.svelte b/client/src/lib/components/ui/dialog/dialog-description.svelte
new file mode 100644
index 0000000..bc048e4
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-description.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/dialog/dialog-footer.svelte b/client/src/lib/components/ui/dialog/dialog-footer.svelte
new file mode 100644
index 0000000..91ecaba
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-footer.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/dialog/dialog-header.svelte b/client/src/lib/components/ui/dialog/dialog-header.svelte
new file mode 100644
index 0000000..8d1abfc
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-header.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/dialog/dialog-overlay.svelte b/client/src/lib/components/ui/dialog/dialog-overlay.svelte
new file mode 100644
index 0000000..05c30ac
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-overlay.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/dialog/dialog-title.svelte b/client/src/lib/components/ui/dialog/dialog-title.svelte
new file mode 100644
index 0000000..9cf592c
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/dialog-title.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/dialog/index.ts b/client/src/lib/components/ui/dialog/index.ts
new file mode 100644
index 0000000..3286ab7
--- /dev/null
+++ b/client/src/lib/components/ui/dialog/index.ts
@@ -0,0 +1,37 @@
+import { Dialog as DialogPrimitive } from "bits-ui";
+
+import Title from "./dialog-title.svelte";
+import Footer from "./dialog-footer.svelte";
+import Header from "./dialog-header.svelte";
+import Overlay from "./dialog-overlay.svelte";
+import Content from "./dialog-content.svelte";
+import Description from "./dialog-description.svelte";
+
+const Root = DialogPrimitive.Root;
+const Trigger = DialogPrimitive.Trigger;
+const Close = DialogPrimitive.Close;
+const Portal = DialogPrimitive.Portal;
+
+export {
+ Root,
+ Title,
+ Portal,
+ Footer,
+ Header,
+ Trigger,
+ Overlay,
+ Content,
+ Description,
+ Close,
+ //
+ Root as Dialog,
+ Title as DialogTitle,
+ Portal as DialogPortal,
+ Footer as DialogFooter,
+ Header as DialogHeader,
+ Trigger as DialogTrigger,
+ Overlay as DialogOverlay,
+ Content as DialogContent,
+ Description as DialogDescription,
+ Close as DialogClose,
+};
diff --git a/client/src/lib/components/ui/drawer/drawer-content.svelte b/client/src/lib/components/ui/drawer/drawer-content.svelte
new file mode 100644
index 0000000..7f70c6d
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-content.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/drawer/drawer-description.svelte b/client/src/lib/components/ui/drawer/drawer-description.svelte
new file mode 100644
index 0000000..0c917d8
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-description.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/drawer/drawer-footer.svelte b/client/src/lib/components/ui/drawer/drawer-footer.svelte
new file mode 100644
index 0000000..092940b
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-footer.svelte
@@ -0,0 +1,16 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/drawer/drawer-header.svelte b/client/src/lib/components/ui/drawer/drawer-header.svelte
new file mode 100644
index 0000000..d1a1c67
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-header.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/drawer/drawer-nested.svelte b/client/src/lib/components/ui/drawer/drawer-nested.svelte
new file mode 100644
index 0000000..834af94
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-nested.svelte
@@ -0,0 +1,12 @@
+
+
+
diff --git a/client/src/lib/components/ui/drawer/drawer-overlay.svelte b/client/src/lib/components/ui/drawer/drawer-overlay.svelte
new file mode 100644
index 0000000..db6a818
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-overlay.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/drawer/drawer-title.svelte b/client/src/lib/components/ui/drawer/drawer-title.svelte
new file mode 100644
index 0000000..4de1f33
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer-title.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/drawer/drawer.svelte b/client/src/lib/components/ui/drawer/drawer.svelte
new file mode 100644
index 0000000..0cb57ff
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/drawer.svelte
@@ -0,0 +1,12 @@
+
+
+
diff --git a/client/src/lib/components/ui/drawer/index.ts b/client/src/lib/components/ui/drawer/index.ts
new file mode 100644
index 0000000..ee69b87
--- /dev/null
+++ b/client/src/lib/components/ui/drawer/index.ts
@@ -0,0 +1,41 @@
+import { Drawer as DrawerPrimitive } from "vaul-svelte";
+
+import Root from "./drawer.svelte";
+import Content from "./drawer-content.svelte";
+import Description from "./drawer-description.svelte";
+import Overlay from "./drawer-overlay.svelte";
+import Footer from "./drawer-footer.svelte";
+import Header from "./drawer-header.svelte";
+import Title from "./drawer-title.svelte";
+import NestedRoot from "./drawer-nested.svelte";
+
+const Trigger: typeof DrawerPrimitive.Trigger = DrawerPrimitive.Trigger;
+const Portal: typeof DrawerPrimitive.Portal = DrawerPrimitive.Portal;
+const Close: typeof DrawerPrimitive.Close = DrawerPrimitive.Close;
+
+export {
+ Root,
+ NestedRoot,
+ Content,
+ Description,
+ Overlay,
+ Footer,
+ Header,
+ Title,
+ Trigger,
+ Portal,
+ Close,
+
+ //
+ Root as Drawer,
+ NestedRoot as DrawerNestedRoot,
+ Content as DrawerContent,
+ Description as DrawerDescription,
+ Overlay as DrawerOverlay,
+ Footer as DrawerFooter,
+ Header as DrawerHeader,
+ Title as DrawerTitle,
+ Trigger as DrawerTrigger,
+ Portal as DrawerPortal,
+ Close as DrawerClose,
+};
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte
new file mode 100644
index 0000000..c6d23cf
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte
@@ -0,0 +1,40 @@
+
+
+
+ {#snippet children({ checked, indeterminate })}
+
+ {#if indeterminate}
+
+ {:else}
+
+ {/if}
+
+ {@render childrenProp?.()}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte
new file mode 100644
index 0000000..8e65c85
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte
new file mode 100644
index 0000000..84d5cca
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte
new file mode 100644
index 0000000..e616c59
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte
new file mode 100644
index 0000000..9837d5a
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte
@@ -0,0 +1,23 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte
new file mode 100644
index 0000000..2298352
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#snippet children({ checked })}
+
+ {#if checked}
+
+ {/if}
+
+ {@render childrenProp?.({ checked })}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte
new file mode 100644
index 0000000..32fac4b
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte
new file mode 100644
index 0000000..053e2a2
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte
new file mode 100644
index 0000000..8378bc0
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte
new file mode 100644
index 0000000..e559a6c
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/dropdown-menu/index.ts b/client/src/lib/components/ui/dropdown-menu/index.ts
new file mode 100644
index 0000000..40c4502
--- /dev/null
+++ b/client/src/lib/components/ui/dropdown-menu/index.ts
@@ -0,0 +1,50 @@
+import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
+import CheckboxItem from "./dropdown-menu-checkbox-item.svelte";
+import Content from "./dropdown-menu-content.svelte";
+import GroupHeading from "./dropdown-menu-group-heading.svelte";
+import Item from "./dropdown-menu-item.svelte";
+import Label from "./dropdown-menu-label.svelte";
+import RadioItem from "./dropdown-menu-radio-item.svelte";
+import Separator from "./dropdown-menu-separator.svelte";
+import Shortcut from "./dropdown-menu-shortcut.svelte";
+import SubContent from "./dropdown-menu-sub-content.svelte";
+import SubTrigger from "./dropdown-menu-sub-trigger.svelte";
+
+const Sub = DropdownMenuPrimitive.Sub;
+const Root = DropdownMenuPrimitive.Root;
+const Trigger = DropdownMenuPrimitive.Trigger;
+const Group = DropdownMenuPrimitive.Group;
+const RadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+export {
+ CheckboxItem,
+ Content,
+ Root as DropdownMenu,
+ CheckboxItem as DropdownMenuCheckboxItem,
+ Content as DropdownMenuContent,
+ Group as DropdownMenuGroup,
+ GroupHeading as DropdownMenuGroupHeading,
+ Item as DropdownMenuItem,
+ Label as DropdownMenuLabel,
+ RadioGroup as DropdownMenuRadioGroup,
+ RadioItem as DropdownMenuRadioItem,
+ Separator as DropdownMenuSeparator,
+ Shortcut as DropdownMenuShortcut,
+ Sub as DropdownMenuSub,
+ SubContent as DropdownMenuSubContent,
+ SubTrigger as DropdownMenuSubTrigger,
+ Trigger as DropdownMenuTrigger,
+ Group,
+ GroupHeading,
+ Item,
+ Label,
+ RadioGroup,
+ RadioItem,
+ Root,
+ Separator,
+ Shortcut,
+ Sub,
+ SubContent,
+ SubTrigger,
+ Trigger,
+};
diff --git a/client/src/lib/components/ui/hover-card/hover-card-content.svelte b/client/src/lib/components/ui/hover-card/hover-card-content.svelte
new file mode 100644
index 0000000..99d2a09
--- /dev/null
+++ b/client/src/lib/components/ui/hover-card/hover-card-content.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/hover-card/index.ts b/client/src/lib/components/ui/hover-card/index.ts
new file mode 100644
index 0000000..2d0c5c5
--- /dev/null
+++ b/client/src/lib/components/ui/hover-card/index.ts
@@ -0,0 +1,14 @@
+import { LinkPreview as HoverCardPrimitive } from "bits-ui";
+
+import Content from "./hover-card-content.svelte";
+const Root = HoverCardPrimitive.Root;
+const Trigger = HoverCardPrimitive.Trigger;
+
+export {
+ Root,
+ Content,
+ Trigger,
+ Root as HoverCard,
+ Content as HoverCardContent,
+ Trigger as HoverCardTrigger,
+};
diff --git a/client/src/lib/components/ui/input/index.ts b/client/src/lib/components/ui/input/index.ts
new file mode 100644
index 0000000..f47b6d3
--- /dev/null
+++ b/client/src/lib/components/ui/input/index.ts
@@ -0,0 +1,7 @@
+import Root from "./input.svelte";
+
+export {
+ Root,
+ //
+ Root as Input,
+};
diff --git a/client/src/lib/components/ui/input/input.svelte b/client/src/lib/components/ui/input/input.svelte
new file mode 100644
index 0000000..13fa116
--- /dev/null
+++ b/client/src/lib/components/ui/input/input.svelte
@@ -0,0 +1,46 @@
+
+
+{#if type === "file"}
+
+{:else}
+
+{/if}
diff --git a/client/src/lib/components/ui/label/index.ts b/client/src/lib/components/ui/label/index.ts
new file mode 100644
index 0000000..8bfca0b
--- /dev/null
+++ b/client/src/lib/components/ui/label/index.ts
@@ -0,0 +1,7 @@
+import Root from "./label.svelte";
+
+export {
+ Root,
+ //
+ Root as Label,
+};
diff --git a/client/src/lib/components/ui/label/label.svelte b/client/src/lib/components/ui/label/label.svelte
new file mode 100644
index 0000000..247d23c
--- /dev/null
+++ b/client/src/lib/components/ui/label/label.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/index.ts b/client/src/lib/components/ui/menubar/index.ts
new file mode 100644
index 0000000..1ea010c
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/index.ts
@@ -0,0 +1,51 @@
+import { Menubar as MenubarPrimitive } from "bits-ui";
+import Root from "./menubar.svelte";
+import CheckboxItem from "./menubar-checkbox-item.svelte";
+import Content from "./menubar-content.svelte";
+import Item from "./menubar-item.svelte";
+import GroupHeading from "./menubar-group-heading.svelte";
+import RadioItem from "./menubar-radio-item.svelte";
+import Separator from "./menubar-separator.svelte";
+import Shortcut from "./menubar-shortcut.svelte";
+import SubContent from "./menubar-sub-content.svelte";
+import SubTrigger from "./menubar-sub-trigger.svelte";
+import Trigger from "./menubar-trigger.svelte";
+
+const Menu = MenubarPrimitive.Menu;
+const Group = MenubarPrimitive.Group;
+const Sub = MenubarPrimitive.Sub;
+const RadioGroup = MenubarPrimitive.RadioGroup;
+
+export {
+ Root,
+ CheckboxItem,
+ Content,
+ Item,
+ GroupHeading,
+ RadioItem,
+ Separator,
+ Shortcut,
+ SubContent,
+ SubTrigger,
+ Trigger,
+ Menu,
+ Group,
+ Sub,
+ RadioGroup,
+ //
+ Root as Menubar,
+ CheckboxItem as MenubarCheckboxItem,
+ Content as MenubarContent,
+ Item as MenubarItem,
+ GroupHeading as MenubarGroupHeading,
+ RadioItem as MenubarRadioItem,
+ Separator as MenubarSeparator,
+ Shortcut as MenubarShortcut,
+ SubContent as MenubarSubContent,
+ SubTrigger as MenubarSubTrigger,
+ Trigger as MenubarTrigger,
+ Menu as MenubarMenu,
+ Group as MenubarGroup,
+ Sub as MenubarSub,
+ RadioGroup as MenubarRadioGroup,
+};
diff --git a/client/src/lib/components/ui/menubar/menubar-checkbox-item.svelte b/client/src/lib/components/ui/menubar/menubar-checkbox-item.svelte
new file mode 100644
index 0000000..3291dbd
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-checkbox-item.svelte
@@ -0,0 +1,40 @@
+
+
+
+ {#snippet children({ checked, indeterminate })}
+
+ {#if indeterminate}
+
+ {:else}
+
+ {/if}
+
+ {@render childrenProp?.()}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/menubar/menubar-content.svelte b/client/src/lib/components/ui/menubar/menubar-content.svelte
new file mode 100644
index 0000000..6930564
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-content.svelte
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-group-heading.svelte b/client/src/lib/components/ui/menubar/menubar-group-heading.svelte
new file mode 100644
index 0000000..4b89729
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-group-heading.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-item.svelte b/client/src/lib/components/ui/menubar/menubar-item.svelte
new file mode 100644
index 0000000..f475761
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-item.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-radio-item.svelte b/client/src/lib/components/ui/menubar/menubar-radio-item.svelte
new file mode 100644
index 0000000..2d4f84d
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-radio-item.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#snippet children({ checked })}
+
+ {#if checked}
+
+ {/if}
+
+ {@render childrenProp?.({ checked })}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/menubar/menubar-separator.svelte b/client/src/lib/components/ui/menubar/menubar-separator.svelte
new file mode 100644
index 0000000..2a6aa04
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-separator.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-shortcut.svelte b/client/src/lib/components/ui/menubar/menubar-shortcut.svelte
new file mode 100644
index 0000000..b35a95f
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-shortcut.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/menubar/menubar-sub-content.svelte b/client/src/lib/components/ui/menubar/menubar-sub-content.svelte
new file mode 100644
index 0000000..1d68e88
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-sub-content.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-sub-trigger.svelte b/client/src/lib/components/ui/menubar/menubar-sub-trigger.svelte
new file mode 100644
index 0000000..4ce6521
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-sub-trigger.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar-trigger.svelte b/client/src/lib/components/ui/menubar/menubar-trigger.svelte
new file mode 100644
index 0000000..d33965c
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar-trigger.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/menubar/menubar.svelte b/client/src/lib/components/ui/menubar/menubar.svelte
new file mode 100644
index 0000000..55c34c6
--- /dev/null
+++ b/client/src/lib/components/ui/menubar/menubar.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/popover/index.ts b/client/src/lib/components/ui/popover/index.ts
new file mode 100644
index 0000000..63aecf9
--- /dev/null
+++ b/client/src/lib/components/ui/popover/index.ts
@@ -0,0 +1,17 @@
+import { Popover as PopoverPrimitive } from "bits-ui";
+import Content from "./popover-content.svelte";
+const Root = PopoverPrimitive.Root;
+const Trigger = PopoverPrimitive.Trigger;
+const Close = PopoverPrimitive.Close;
+
+export {
+ Root,
+ Content,
+ Trigger,
+ Close,
+ //
+ Root as Popover,
+ Content as PopoverContent,
+ Trigger as PopoverTrigger,
+ Close as PopoverClose,
+};
diff --git a/client/src/lib/components/ui/popover/popover-content.svelte b/client/src/lib/components/ui/popover/popover-content.svelte
new file mode 100644
index 0000000..d2fbace
--- /dev/null
+++ b/client/src/lib/components/ui/popover/popover-content.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/progress/index.ts b/client/src/lib/components/ui/progress/index.ts
new file mode 100644
index 0000000..25eee61
--- /dev/null
+++ b/client/src/lib/components/ui/progress/index.ts
@@ -0,0 +1,7 @@
+import Root from "./progress.svelte";
+
+export {
+ Root,
+ //
+ Root as Progress,
+};
diff --git a/client/src/lib/components/ui/progress/progress.svelte b/client/src/lib/components/ui/progress/progress.svelte
new file mode 100644
index 0000000..5c47770
--- /dev/null
+++ b/client/src/lib/components/ui/progress/progress.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/radio-group/index.ts b/client/src/lib/components/ui/radio-group/index.ts
new file mode 100644
index 0000000..90b33fe
--- /dev/null
+++ b/client/src/lib/components/ui/radio-group/index.ts
@@ -0,0 +1,10 @@
+import Root from "./radio-group.svelte";
+import Item from "./radio-group-item.svelte";
+
+export {
+ Root,
+ Item,
+ //
+ Root as RadioGroup,
+ Item as RadioGroupItem,
+};
diff --git a/client/src/lib/components/ui/radio-group/radio-group-item.svelte b/client/src/lib/components/ui/radio-group/radio-group-item.svelte
new file mode 100644
index 0000000..bab22c0
--- /dev/null
+++ b/client/src/lib/components/ui/radio-group/radio-group-item.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {#snippet children({ checked })}
+
+ {#if checked}
+
+ {/if}
+
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/radio-group/radio-group.svelte b/client/src/lib/components/ui/radio-group/radio-group.svelte
new file mode 100644
index 0000000..5180b31
--- /dev/null
+++ b/client/src/lib/components/ui/radio-group/radio-group.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/client/src/lib/components/ui/resizable/index.ts b/client/src/lib/components/ui/resizable/index.ts
new file mode 100644
index 0000000..2e37f11
--- /dev/null
+++ b/client/src/lib/components/ui/resizable/index.ts
@@ -0,0 +1,13 @@
+import { Pane } from "paneforge";
+import Handle from "./resizable-handle.svelte";
+import PaneGroup from "./resizable-pane-group.svelte";
+
+export {
+ PaneGroup,
+ Pane,
+ Handle,
+ //
+ PaneGroup as ResizablePaneGroup,
+ Pane as ResizablePane,
+ Handle as ResizableHandle,
+};
diff --git a/client/src/lib/components/ui/resizable/resizable-handle.svelte b/client/src/lib/components/ui/resizable/resizable-handle.svelte
new file mode 100644
index 0000000..cf001f0
--- /dev/null
+++ b/client/src/lib/components/ui/resizable/resizable-handle.svelte
@@ -0,0 +1,30 @@
+
+
+div]:rotate-90",
+ className
+ )}
+ {...restProps}
+>
+ {#if withHandle}
+
+
+
+ {/if}
+
diff --git a/client/src/lib/components/ui/resizable/resizable-pane-group.svelte b/client/src/lib/components/ui/resizable/resizable-pane-group.svelte
new file mode 100644
index 0000000..18c690c
--- /dev/null
+++ b/client/src/lib/components/ui/resizable/resizable-pane-group.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/scroll-area/index.ts b/client/src/lib/components/ui/scroll-area/index.ts
new file mode 100644
index 0000000..e86a25b
--- /dev/null
+++ b/client/src/lib/components/ui/scroll-area/index.ts
@@ -0,0 +1,10 @@
+import Scrollbar from "./scroll-area-scrollbar.svelte";
+import Root from "./scroll-area.svelte";
+
+export {
+ Root,
+ Scrollbar,
+ //,
+ Root as ScrollArea,
+ Scrollbar as ScrollAreaScrollbar,
+};
diff --git a/client/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/client/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte
new file mode 100644
index 0000000..b436056
--- /dev/null
+++ b/client/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte
@@ -0,0 +1,29 @@
+
+
+
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/scroll-area/scroll-area.svelte b/client/src/lib/components/ui/scroll-area/scroll-area.svelte
new file mode 100644
index 0000000..9943f83
--- /dev/null
+++ b/client/src/lib/components/ui/scroll-area/scroll-area.svelte
@@ -0,0 +1,32 @@
+
+
+
+
+ {@render children?.()}
+
+ {#if orientation === "vertical" || orientation === "both"}
+
+ {/if}
+ {#if orientation === "horizontal" || orientation === "both"}
+
+ {/if}
+
+
diff --git a/client/src/lib/components/ui/select/index.ts b/client/src/lib/components/ui/select/index.ts
new file mode 100644
index 0000000..f31b8ae
--- /dev/null
+++ b/client/src/lib/components/ui/select/index.ts
@@ -0,0 +1,34 @@
+import { Select as SelectPrimitive } from "bits-ui";
+
+import GroupHeading from "./select-group-heading.svelte";
+import Item from "./select-item.svelte";
+import Content from "./select-content.svelte";
+import Trigger from "./select-trigger.svelte";
+import Separator from "./select-separator.svelte";
+import ScrollDownButton from "./select-scroll-down-button.svelte";
+import ScrollUpButton from "./select-scroll-up-button.svelte";
+
+const Root = SelectPrimitive.Root;
+const Group = SelectPrimitive.Group;
+
+export {
+ Root,
+ Group,
+ GroupHeading,
+ Item,
+ Content,
+ Trigger,
+ Separator,
+ ScrollDownButton,
+ ScrollUpButton,
+ //
+ Root as Select,
+ Group as SelectGroup,
+ GroupHeading as SelectGroupHeading,
+ Item as SelectItem,
+ Content as SelectContent,
+ Trigger as SelectTrigger,
+ Separator as SelectSeparator,
+ ScrollDownButton as SelectScrollDownButton,
+ ScrollUpButton as SelectScrollUpButton,
+};
diff --git a/client/src/lib/components/ui/select/select-content.svelte b/client/src/lib/components/ui/select/select-content.svelte
new file mode 100644
index 0000000..74ee548
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-content.svelte
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ {@render children?.()}
+
+
+
+
diff --git a/client/src/lib/components/ui/select/select-group-heading.svelte b/client/src/lib/components/ui/select/select-group-heading.svelte
new file mode 100644
index 0000000..7984bef
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-group-heading.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/select/select-item.svelte b/client/src/lib/components/ui/select/select-item.svelte
new file mode 100644
index 0000000..9d7f516
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-item.svelte
@@ -0,0 +1,37 @@
+
+
+
+ {#snippet children({ selected, highlighted })}
+
+ {#if selected}
+
+ {/if}
+
+ {#if childrenProp}
+ {@render childrenProp({ selected, highlighted })}
+ {:else}
+ {label || value}
+ {/if}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/select/select-scroll-down-button.svelte b/client/src/lib/components/ui/select/select-scroll-down-button.svelte
new file mode 100644
index 0000000..c17d5d1
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-scroll-down-button.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/select/select-scroll-up-button.svelte b/client/src/lib/components/ui/select/select-scroll-up-button.svelte
new file mode 100644
index 0000000..8ba08c0
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-scroll-up-button.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/select/select-separator.svelte b/client/src/lib/components/ui/select/select-separator.svelte
new file mode 100644
index 0000000..38a3ab0
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-separator.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/client/src/lib/components/ui/select/select-trigger.svelte b/client/src/lib/components/ui/select/select-trigger.svelte
new file mode 100644
index 0000000..ce4e48f
--- /dev/null
+++ b/client/src/lib/components/ui/select/select-trigger.svelte
@@ -0,0 +1,24 @@
+
+
+span]:line-clamp-1",
+ className
+ )}
+ {...restProps}
+>
+ {@render children?.()}
+
+
diff --git a/client/src/lib/components/ui/separator/index.ts b/client/src/lib/components/ui/separator/index.ts
new file mode 100644
index 0000000..82442d2
--- /dev/null
+++ b/client/src/lib/components/ui/separator/index.ts
@@ -0,0 +1,7 @@
+import Root from "./separator.svelte";
+
+export {
+ Root,
+ //
+ Root as Separator,
+};
diff --git a/client/src/lib/components/ui/separator/separator.svelte b/client/src/lib/components/ui/separator/separator.svelte
new file mode 100644
index 0000000..cd823cc
--- /dev/null
+++ b/client/src/lib/components/ui/separator/separator.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/client/src/lib/components/ui/sheet/index.ts b/client/src/lib/components/ui/sheet/index.ts
new file mode 100644
index 0000000..1cf1af1
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/index.ts
@@ -0,0 +1,36 @@
+import { Dialog as SheetPrimitive } from "bits-ui";
+import Overlay from "./sheet-overlay.svelte";
+import Content from "./sheet-content.svelte";
+import Header from "./sheet-header.svelte";
+import Footer from "./sheet-footer.svelte";
+import Title from "./sheet-title.svelte";
+import Description from "./sheet-description.svelte";
+
+const Root = SheetPrimitive.Root;
+const Close = SheetPrimitive.Close;
+const Trigger = SheetPrimitive.Trigger;
+const Portal = SheetPrimitive.Portal;
+
+export {
+ Root,
+ Close,
+ Trigger,
+ Portal,
+ Overlay,
+ Content,
+ Header,
+ Footer,
+ Title,
+ Description,
+ //
+ Root as Sheet,
+ Close as SheetClose,
+ Trigger as SheetTrigger,
+ Portal as SheetPortal,
+ Overlay as SheetOverlay,
+ Content as SheetContent,
+ Header as SheetHeader,
+ Footer as SheetFooter,
+ Title as SheetTitle,
+ Description as SheetDescription,
+};
diff --git a/client/src/lib/components/ui/sheet/sheet-content.svelte b/client/src/lib/components/ui/sheet/sheet-content.svelte
new file mode 100644
index 0000000..27a7ba3
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-content.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+ {@render children?.()}
+
+
+ Close
+
+
+
diff --git a/client/src/lib/components/ui/sheet/sheet-description.svelte b/client/src/lib/components/ui/sheet/sheet-description.svelte
new file mode 100644
index 0000000..885e01f
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-description.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/sheet/sheet-footer.svelte b/client/src/lib/components/ui/sheet/sheet-footer.svelte
new file mode 100644
index 0000000..91ecaba
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-footer.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/sheet/sheet-header.svelte b/client/src/lib/components/ui/sheet/sheet-header.svelte
new file mode 100644
index 0000000..47ea6be
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-header.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/client/src/lib/components/ui/sheet/sheet-overlay.svelte b/client/src/lib/components/ui/sheet/sheet-overlay.svelte
new file mode 100644
index 0000000..faa2de1
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-overlay.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/client/src/lib/components/ui/sheet/sheet-title.svelte b/client/src/lib/components/ui/sheet/sheet-title.svelte
new file mode 100644
index 0000000..25f42fc
--- /dev/null
+++ b/client/src/lib/components/ui/sheet/sheet-title.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/client/src/lib/components/ui/skeleton/index.ts b/client/src/lib/components/ui/skeleton/index.ts
new file mode 100644
index 0000000..186db21
--- /dev/null
+++ b/client/src/lib/components/ui/skeleton/index.ts
@@ -0,0 +1,7 @@
+import Root from "./skeleton.svelte";
+
+export {
+ Root,
+ //
+ Root as Skeleton,
+};
diff --git a/client/src/lib/components/ui/skeleton/skeleton.svelte b/client/src/lib/components/ui/skeleton/skeleton.svelte
new file mode 100644
index 0000000..4089b49
--- /dev/null
+++ b/client/src/lib/components/ui/skeleton/skeleton.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/client/src/lib/components/ui/slider/index.ts b/client/src/lib/components/ui/slider/index.ts
new file mode 100644
index 0000000..820f209
--- /dev/null
+++ b/client/src/lib/components/ui/slider/index.ts
@@ -0,0 +1,7 @@
+import Root from "./slider.svelte";
+
+export {
+ Root,
+ //
+ Root as Slider,
+};
diff --git a/client/src/lib/components/ui/slider/slider.svelte b/client/src/lib/components/ui/slider/slider.svelte
new file mode 100644
index 0000000..8b057dd
--- /dev/null
+++ b/client/src/lib/components/ui/slider/slider.svelte
@@ -0,0 +1,44 @@
+
+
+
+
+ {#snippet children({ thumbs })}
+
+
+
+ {#each thumbs as thumb (thumb)}
+
+ {/each}
+ {/snippet}
+
diff --git a/client/src/lib/components/ui/switch/index.ts b/client/src/lib/components/ui/switch/index.ts
new file mode 100644
index 0000000..f5533db
--- /dev/null
+++ b/client/src/lib/components/ui/switch/index.ts
@@ -0,0 +1,7 @@
+import Root from "./switch.svelte";
+
+export {
+ Root,
+ //
+ Root as Switch,
+};
diff --git a/client/src/lib/components/ui/switch/switch.svelte b/client/src/lib/components/ui/switch/switch.svelte
new file mode 100644
index 0000000..66b8b1e
--- /dev/null
+++ b/client/src/lib/components/ui/switch/switch.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/tabs/index.ts b/client/src/lib/components/ui/tabs/index.ts
new file mode 100644
index 0000000..f1ab372
--- /dev/null
+++ b/client/src/lib/components/ui/tabs/index.ts
@@ -0,0 +1,18 @@
+import { Tabs as TabsPrimitive } from "bits-ui";
+import Content from "./tabs-content.svelte";
+import List from "./tabs-list.svelte";
+import Trigger from "./tabs-trigger.svelte";
+
+const Root = TabsPrimitive.Root;
+
+export {
+ Root,
+ Content,
+ List,
+ Trigger,
+ //
+ Root as Tabs,
+ Content as TabsContent,
+ List as TabsList,
+ Trigger as TabsTrigger,
+};
diff --git a/client/src/lib/components/ui/tabs/tabs-content.svelte b/client/src/lib/components/ui/tabs/tabs-content.svelte
new file mode 100644
index 0000000..f1c0515
--- /dev/null
+++ b/client/src/lib/components/ui/tabs/tabs-content.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/tabs/tabs-list.svelte b/client/src/lib/components/ui/tabs/tabs-list.svelte
new file mode 100644
index 0000000..f03e5fc
--- /dev/null
+++ b/client/src/lib/components/ui/tabs/tabs-list.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/tabs/tabs-trigger.svelte b/client/src/lib/components/ui/tabs/tabs-trigger.svelte
new file mode 100644
index 0000000..f1f5825
--- /dev/null
+++ b/client/src/lib/components/ui/tabs/tabs-trigger.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/client/src/lib/components/ui/textarea/index.ts b/client/src/lib/components/ui/textarea/index.ts
new file mode 100644
index 0000000..ace797a
--- /dev/null
+++ b/client/src/lib/components/ui/textarea/index.ts
@@ -0,0 +1,7 @@
+import Root from "./textarea.svelte";
+
+export {
+ Root,
+ //
+ Root as Textarea,
+};
diff --git a/client/src/lib/components/ui/textarea/textarea.svelte b/client/src/lib/components/ui/textarea/textarea.svelte
new file mode 100644
index 0000000..2616c2c
--- /dev/null
+++ b/client/src/lib/components/ui/textarea/textarea.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/client/src/lib/components/ui/toggle-group/index.ts b/client/src/lib/components/ui/toggle-group/index.ts
new file mode 100644
index 0000000..12b14b9
--- /dev/null
+++ b/client/src/lib/components/ui/toggle-group/index.ts
@@ -0,0 +1,10 @@
+import Root from "./toggle-group.svelte";
+import Item from "./toggle-group-item.svelte";
+
+export {
+ Root,
+ Item,
+ //
+ Root as ToggleGroup,
+ Item as ToggleGroupItem,
+};
diff --git a/client/src/lib/components/ui/toggle-group/toggle-group-item.svelte b/client/src/lib/components/ui/toggle-group/toggle-group-item.svelte
new file mode 100644
index 0000000..8143635
--- /dev/null
+++ b/client/src/lib/components/ui/toggle-group/toggle-group-item.svelte
@@ -0,0 +1,30 @@
+
+
+
diff --git a/client/src/lib/components/ui/toggle-group/toggle-group.svelte b/client/src/lib/components/ui/toggle-group/toggle-group.svelte
new file mode 100644
index 0000000..0886005
--- /dev/null
+++ b/client/src/lib/components/ui/toggle-group/toggle-group.svelte
@@ -0,0 +1,41 @@
+
+
+
+
+
+
diff --git a/client/src/lib/components/ui/toggle/index.ts b/client/src/lib/components/ui/toggle/index.ts
new file mode 100644
index 0000000..8cb2936
--- /dev/null
+++ b/client/src/lib/components/ui/toggle/index.ts
@@ -0,0 +1,13 @@
+import Root from "./toggle.svelte";
+export {
+ toggleVariants,
+ type ToggleSize,
+ type ToggleVariant,
+ type ToggleVariants,
+} from "./toggle.svelte";
+
+export {
+ Root,
+ //
+ Root as Toggle,
+};
diff --git a/client/src/lib/components/ui/toggle/toggle.svelte b/client/src/lib/components/ui/toggle/toggle.svelte
new file mode 100644
index 0000000..b66fa93
--- /dev/null
+++ b/client/src/lib/components/ui/toggle/toggle.svelte
@@ -0,0 +1,51 @@
+
+
+
+
+
diff --git a/client/src/lib/components/ui/tooltip/index.ts b/client/src/lib/components/ui/tooltip/index.ts
new file mode 100644
index 0000000..e9e1fd7
--- /dev/null
+++ b/client/src/lib/components/ui/tooltip/index.ts
@@ -0,0 +1,18 @@
+import { Tooltip as TooltipPrimitive } from "bits-ui";
+import Content from "./tooltip-content.svelte";
+
+const Root = TooltipPrimitive.Root;
+const Trigger = TooltipPrimitive.Trigger;
+const Provider = TooltipPrimitive.Provider;
+
+export {
+ Root,
+ Trigger,
+ Content,
+ Provider,
+ //
+ Root as Tooltip,
+ Content as TooltipContent,
+ Trigger as TooltipTrigger,
+ Provider as TooltipProvider,
+};
diff --git a/client/src/lib/components/ui/tooltip/tooltip-content.svelte b/client/src/lib/components/ui/tooltip/tooltip-content.svelte
new file mode 100644
index 0000000..68ff232
--- /dev/null
+++ b/client/src/lib/components/ui/tooltip/tooltip-content.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/client/src/lib/data/sites.ts b/client/src/lib/data/sites.ts
new file mode 100644
index 0000000..f2716ea
--- /dev/null
+++ b/client/src/lib/data/sites.ts
@@ -0,0 +1,81 @@
+export interface SiteListing {
+ sites: Record;
+}
+export interface Site {
+ id: string;
+ name: string;
+ agency: string;
+ equipment: string;
+ city: string;
+ state: string;
+ county: string;
+ elevation: string;
+ lat: string;
+ long: string;
+}
+
+export interface GeoJsonSite {
+ type: 'Feature';
+ geometry: {
+ type: 'Point';
+ coordinates: [number, number];
+ };
+ properties: {
+ icao: string;
+ name: string;
+ city: string;
+ state: string;
+ };
+}
+
+function convertDMSToDeg(dms: string): number {
+ let negative = false;
+ if (dms.startsWith('-')) {
+ dms = dms.replace('-', '');
+ negative = true;
+ }
+
+ const [s_hr, s_min, s_sec] = dms.split(' ');
+ const [hr, min, sec] = [Number(s_hr), Number(s_min), Number(s_sec)];
+
+ let deg = hr + min / 60 + sec / 3600;
+
+ if (negative) {
+ deg *= -1;
+ }
+
+ return deg;
+}
+
+function siteToGeoJsonFeature(site: Site, icao: string): GeoJsonSite {
+ return {
+ type: 'Feature',
+ geometry: {
+ type: 'Point',
+ coordinates: [convertDMSToDeg(site.long), convertDMSToDeg(site.lat)]
+ },
+ properties: {
+ icao,
+ name: site.name,
+ city: site.city,
+ state: site.state
+ }
+ };
+}
+
+export interface GeoJsonSiteListing {
+ type: 'FeatureCollection';
+ features: GeoJsonSite[];
+}
+
+export function siteListToGeoJson(list: SiteListing): GeoJsonSiteListing {
+ const sites = [];
+ for (const icao of Object.keys(list.sites)) {
+ sites.push(siteToGeoJsonFeature(list.sites[icao], icao));
+ }
+
+ return {
+ type: 'FeatureCollection',
+ features: sites
+ };
+}
diff --git a/client/src/lib/data/wsr88d.json b/client/src/lib/data/wsr88d.json
new file mode 100644
index 0000000..f99658e
--- /dev/null
+++ b/client/src/lib/data/wsr88d.json
@@ -0,0 +1,1924 @@
+{
+ "sites": {
+ "KABR": {
+ "id": "ABR",
+ "name": "ABERDEEN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ABERDEEN",
+ "state": "SD",
+ "county": "BROWN",
+ "elevation": "396.85 m (1299.21 ft)",
+ "lat": "+45 27 21",
+ "long": "-98 24 48"
+ },
+ "KENX": {
+ "id": "ENX",
+ "name": "ALBANY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "EAST BERNE",
+ "state": "NY",
+ "county": "ALBANY",
+ "elevation": "565 m (1853.67 ft)",
+ "lat": "+42 35 11.6",
+ "long": "-74 03 50.7"
+ },
+ "KABX": {
+ "id": "ABX",
+ "name": "ALBUQUERQUE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ALBUQUERQUE",
+ "state": "NM",
+ "county": "BERNALILLO",
+ "elevation": "1789.18 m (5869.42 ft)",
+ "lat": "+35 08 59",
+ "long": "-106 49 26"
+ },
+ "KFDR": {
+ "id": "FDR",
+ "name": "ALTUS AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "FREDERICK",
+ "state": "OK",
+ "county": "TILLMAN",
+ "elevation": "386.18 m (1266.4 ft)",
+ "lat": "+34 21 43.9",
+ "long": "-98 58 36"
+ },
+ "KAMA": {
+ "id": "AMA",
+ "name": "AMARILLO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "AMARILLO",
+ "state": "TX",
+ "county": "POTTER",
+ "elevation": "1104 m (3622.05 ft)",
+ "lat": "+35 14 00",
+ "long": "-101 42 33.4"
+ },
+ "PAHG": {
+ "id": "AHG",
+ "name": "KENAI FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "KENAI",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "73.76 m (239.5 ft)",
+ "lat": "+60 43 33.29",
+ "long": "-151 21 05.28"
+ },
+ "PGUA": {
+ "id": "UAM",
+ "name": "ANDERSEN AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "ANDERSEN AFB",
+ "state": "GU",
+ "county": "N/A",
+ "elevation": "83 m (272.31 ft)",
+ "lat": "+13 27 21",
+ "long": "+144 48 40"
+ },
+ "KFFC": {
+ "id": "FFC",
+ "name": "ATLANTA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PEACHTREE CITY",
+ "state": "GA",
+ "county": "FAYETTE",
+ "elevation": "261.52 m (856.3 ft)",
+ "lat": "+33 21 48.78",
+ "long": "-84 33 57.42"
+ },
+ "KEWX": {
+ "id": "EWX",
+ "name": "AUSTIN/SAN ANTONIO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NEW BRAUNFELS",
+ "state": "TX",
+ "county": "COMAL",
+ "elevation": "204 m (669.29 ft)",
+ "lat": "+29 42 14.6",
+ "long": "-98 01 43"
+ },
+ "KBBX": {
+ "id": "BBX",
+ "name": "BEALE AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "OROVILLE",
+ "state": "CA",
+ "county": "BUTTE",
+ "elevation": "52.73 m (170.6 ft)",
+ "lat": "+39 29 44.3",
+ "long": "-121 37 53.8"
+ },
+ "PABC": {
+ "id": "ABC",
+ "name": "BETHEL FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "BETHEL",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "49.07 m (160.76 ft)",
+ "lat": "+60 47 31",
+ "long": "-161 52 35"
+ },
+ "KBLX": {
+ "id": "BLX",
+ "name": "BILLINGS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BILLINGS",
+ "state": "MT",
+ "county": "YELLOWSTONE",
+ "elevation": "1109 m (3638.45 ft)",
+ "lat": "+45 51 13.6",
+ "long": "-108 36 24.5"
+ },
+ "KBGM": {
+ "id": "BGM",
+ "name": "BINGHAMTON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BINGHAMTON",
+ "state": "NY",
+ "county": "BROOME",
+ "elevation": "489.51 m (1604.33 ft)",
+ "lat": "+42 11 58.9",
+ "long": "-75 59 05"
+ },
+ "KBMX": {
+ "id": "BMX",
+ "name": "BIRMINGHAM",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ALABASTER",
+ "state": "AL",
+ "county": "SHELBY",
+ "elevation": "196.6 m (643.04 ft)",
+ "lat": "+33 10 20.7",
+ "long": "-86 46 12.6"
+ },
+ "KBIS": {
+ "id": "BIS",
+ "name": "BISMARCK",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BISMARCK",
+ "state": "ND",
+ "county": "BURLEIGH",
+ "elevation": "505.36 m (1656.82 ft)",
+ "lat": "+46 46 15",
+ "long": "-100 45 38"
+ },
+ "KCBX": {
+ "id": "CBX",
+ "name": "BOISE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BOISE",
+ "state": "ID",
+ "county": "ADA",
+ "elevation": "942 m (3090.55 ft)",
+ "lat": "+43 29 24.78",
+ "long": "-116 14 09.72"
+ },
+ "KBOX": {
+ "id": "BOX",
+ "name": "BOSTON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "TAUNTON",
+ "state": "MA",
+ "county": "BRISTOL",
+ "elevation": "35.97 m (114.83 ft)",
+ "lat": "+41 57 20.8",
+ "long": "-71 08 12.7"
+ },
+ "KOKX": {
+ "id": "OKX",
+ "name": "BROOKHAVEN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "UPTON",
+ "state": "NY",
+ "county": "SUFFOLK",
+ "elevation": "25.91 m (82.02 ft)",
+ "lat": "+40 51 55.9",
+ "long": "-72 51 50.1"
+ },
+ "KBRO": {
+ "id": "BRO",
+ "name": "BROWNSVILLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BROWNSVILLE",
+ "state": "TX",
+ "county": "CAMERON",
+ "elevation": "7.01 m (22.97 ft)",
+ "lat": "+25 54 57.6",
+ "long": "-97 25 08.28"
+ },
+ "KBUF": {
+ "id": "BUF",
+ "name": "BUFFALO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BUFFALO",
+ "state": "NY",
+ "county": "ERIE",
+ "elevation": "211.23 m (692.26 ft)",
+ "lat": "+42 56 55.64",
+ "long": "-78 44 12.41"
+ },
+ "KCXX": {
+ "id": "CXX",
+ "name": "BURLINGTON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "COLCHESTER",
+ "state": "VT",
+ "county": "CHITTENDEN",
+ "elevation": "96.62 m (314.96 ft)",
+ "lat": "+44 30 39.6",
+ "long": "-73 09 59.15"
+ },
+ "RKSG": {
+ "id": "KSGR4",
+ "name": "CAMP HUMPHREYS",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "CAMP HUMPHREYS",
+ "state": "KO",
+ "county": "N/A",
+ "elevation": "439 m (1440.29 ft)",
+ "lat": "+37 12 27.25",
+ "long": "+127 17 08.02"
+ },
+ "KFDX": {
+ "id": "FDX",
+ "name": "CANNON AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "FIELD",
+ "state": "NM",
+ "county": "CURRY",
+ "elevation": "1417.32 m (4648.95 ft)",
+ "lat": "+34 38 03",
+ "long": "-103 37 08"
+ },
+ "KCBW": {
+ "id": "CBW",
+ "name": "CARIBOU",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "HOULTON",
+ "state": "ME",
+ "county": "AROOSTOOK",
+ "elevation": "227.38 m (744.75 ft)",
+ "lat": "+46 02 21.30",
+ "long": "-67 48 23.15"
+ },
+ "KICX": {
+ "id": "ICX",
+ "name": "CEDAR CITY (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CEDAR CITY",
+ "state": "UT",
+ "county": "IRON",
+ "elevation": "3244 m (10643.04 ft)",
+ "lat": "+37 35 27.78",
+ "long": "-112 51 43.86"
+ },
+ "KCLX": {
+ "id": "CLX",
+ "name": "CHARLESTON, SC",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GRAYS",
+ "state": "SC",
+ "county": "BEAUFORT",
+ "elevation": "35 m (114.83 ft)",
+ "lat": "+32 39 19.9",
+ "long": "-81 02 31.9"
+ },
+ "KRLX": {
+ "id": "RLX",
+ "name": "CHARLESTON, WV",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CHARLESTON",
+ "state": "WV",
+ "county": "KANAWHA",
+ "elevation": "335 m (1099.08 ft)",
+ "lat": "+38 18 40",
+ "long": "-81 43 22"
+ },
+ "KCYS": {
+ "id": "CYS",
+ "name": "CHEYENNE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CHEYENNE",
+ "state": "WY",
+ "county": "LARAMIE",
+ "elevation": "1867.81 m (6125.33 ft)",
+ "lat": "+41 09 06.91",
+ "long": "-104 48 21.71"
+ },
+ "KLOT": {
+ "id": "LOT",
+ "name": "CHICAGO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ROMEOVILLE",
+ "state": "IL",
+ "county": "WILL",
+ "elevation": "202.08 m (662.73 ft)",
+ "lat": "+41 36 16",
+ "long": "-88 05 04"
+ },
+ "KILN": {
+ "id": "ILN",
+ "name": "CINCINNATI",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WILMINGTON",
+ "state": "OH",
+ "county": "CLINTON",
+ "elevation": "321.87 m (1053.15 ft)",
+ "lat": "+39 25 13.74",
+ "long": "-83 49 17.22"
+ },
+ "KCLE": {
+ "id": "CLE",
+ "name": "CLEVELAND",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CLEVELAND",
+ "state": "OH",
+ "county": "CUYAHOGA",
+ "elevation": "232.56 m (761.15 ft)",
+ "lat": "+41 24 47.58",
+ "long": "-81 51 35.52"
+ },
+ "KCAE": {
+ "id": "CAE",
+ "name": "COLUMBIA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WEST COLUMBIA",
+ "state": "SC",
+ "county": "LEXINGTON",
+ "elevation": "70.41 m (229.66 ft)",
+ "lat": "+33 56 55.4",
+ "long": "-81 07 05.8"
+ },
+ "KGWX": {
+ "id": "GWX",
+ "name": "COLUMBUS AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "GREENWOOD SPRINGS",
+ "state": "MS",
+ "county": "MONROE",
+ "elevation": "155 m (508.53 ft)",
+ "lat": "+33 53 48.9",
+ "long": "-88 19 45.1"
+ },
+ "KCRP": {
+ "id": "CRP",
+ "name": "CORPUS CHRISTI",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CORPUS CHRISTI",
+ "state": "TX",
+ "county": "NUECES",
+ "elevation": "13.72 m (42.65 ft)",
+ "lat": "+27 47 02.46",
+ "long": "-97 30 40.5"
+ },
+ "KFWS": {
+ "id": "FWS",
+ "name": "DALLAS/FT WORTH",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "FORT WORTH",
+ "state": "TX",
+ "county": "TARRANT",
+ "elevation": "212 m (695.54 ft)",
+ "lat": "+32 34 22.8",
+ "long": "-97 18 11.34"
+ },
+ "KFTG": {
+ "id": "FTG",
+ "name": "DENVER",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "FRONT RANGE AP",
+ "state": "CO",
+ "county": "ARAPAHOE",
+ "elevation": "1675.49 m (5495.41 ft)",
+ "lat": "+39 47 11.9",
+ "long": "-104 32 44.9"
+ },
+ "KDMX": {
+ "id": "DMX",
+ "name": "DES MOINES",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "JOHNSTON",
+ "state": "IA",
+ "county": "POLK",
+ "elevation": "299.01 m (980.97 ft)",
+ "lat": "+41 43 52.32",
+ "long": "-93 43 22.33"
+ },
+ "KDTX": {
+ "id": "DTX",
+ "name": "DETROIT",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WHITE LAKE",
+ "state": "MI",
+ "county": "OAKLAND",
+ "elevation": "336 m (1102.36 ft)",
+ "lat": "+42 42 00",
+ "long": "-83 28 18"
+ },
+ "KDDC": {
+ "id": "DDC",
+ "name": "DODGE CITY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DODGE CITY",
+ "state": "KS",
+ "county": "FORD",
+ "elevation": "789.43 m (2588.58 ft)",
+ "lat": "+37 45 39",
+ "long": "-99 58 08"
+ },
+ "KDOX": {
+ "id": "DOX",
+ "name": "DOVER AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "ELLENDALE STATE FOREST",
+ "state": "DE",
+ "county": "SUSSEX",
+ "elevation": "15.24 m (49.21 ft)",
+ "lat": "+38 49 32.76",
+ "long": "-75 26 24.42"
+ },
+ "KDLH": {
+ "id": "DLH",
+ "name": "DULUTH",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DULUTH",
+ "state": "MN",
+ "county": "ST LOUIS",
+ "elevation": "435.25 m (1427.17 ft)",
+ "lat": "+46 50 13",
+ "long": "-92 12 35"
+ },
+ "KDYX": {
+ "id": "DYX",
+ "name": "DYESS AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "MORAN",
+ "state": "TX",
+ "county": "SHACKELFORD",
+ "elevation": "462.38 m (1515.75 ft)",
+ "lat": "+32 32 18.6",
+ "long": "-99 15 15.6"
+ },
+ "KEYX": {
+ "id": "EYX",
+ "name": "EDWARDS AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "BORON",
+ "state": "CA",
+ "county": "SAN BERNADINO",
+ "elevation": "846 m (2775.59 ft)",
+ "lat": "+35 05 52.26",
+ "long": "-117 33 38.7"
+ },
+ "KEVX": {
+ "id": "EVX",
+ "name": "EGLIN AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "RED BAY",
+ "state": "FL",
+ "county": "WALTON",
+ "elevation": "42.67 m (137.8 ft)",
+ "lat": "+30 33 54.12",
+ "long": "-85 55 18"
+ },
+ "KEPZ": {
+ "id": "EPZ",
+ "name": "EL PASO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SANTA TERESA",
+ "state": "NM",
+ "county": "DONA ANA",
+ "elevation": "1250.9 m (4101.05 ft)",
+ "lat": "+31 52 23",
+ "long": "-106 41 52.8"
+ },
+ "KLRX": {
+ "id": "LRX",
+ "name": "ELKO (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ELKO",
+ "state": "NV",
+ "county": "LANDER",
+ "elevation": "2067 m (6781.5 ft)",
+ "lat": "+40 44 22.38",
+ "long": "-116 48 09.72"
+ },
+ "KBHX": {
+ "id": "BHX",
+ "name": "EUREKA (BUNKER HILL)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "EUREKA",
+ "state": "CA",
+ "county": "HUMBOLDT",
+ "elevation": "732.13 m (2401.57 ft)",
+ "lat": "+40 29 54.9",
+ "long": "-124 17 31.8"
+ },
+ "PAPD": {
+ "id": "APD",
+ "name": "FAIRBANKS FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "FAIRBANKS",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "790.35 m (2591.86 ft)",
+ "lat": "+65 02 06.41",
+ "long": "-147 30 05.15"
+ },
+ "KMVX": {
+ "id": "MVX",
+ "name": "FARGO/GRAND FORKS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GRAND FORKS",
+ "state": "ND",
+ "county": "TRAILL",
+ "elevation": "300.53 m (984.25 ft)",
+ "lat": "+47 31 40",
+ "long": "-97 19 32"
+ },
+ "KFSX": {
+ "id": "FSX",
+ "name": "FLAGSTAFF (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "FLAGSTAFF",
+ "state": "AZ",
+ "county": "COCONINO",
+ "elevation": "2260.7 m (7414.7 ft)",
+ "lat": "+34 34 27.6",
+ "long": "-111 11 54.4"
+ },
+ "KHPX": {
+ "id": "HPX",
+ "name": "FT CAMPBELL",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "TRENTON",
+ "state": "KY",
+ "county": "TODD",
+ "elevation": "172 m (564.3 ft)",
+ "lat": "+36 44 13.1",
+ "long": "-87 17 08.1"
+ },
+ "KTYX": {
+ "id": "TYX",
+ "name": "FT DRUM",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "MONTAGUE",
+ "state": "NY",
+ "county": "LEWIS",
+ "elevation": "562.66 m (1843.83 ft)",
+ "lat": "+43 45 20.5",
+ "long": "-75 40 47.5"
+ },
+ "KGRK": {
+ "id": "GRK",
+ "name": "FT CAVAZOS",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "GRANGER",
+ "state": "TX",
+ "county": "BELL",
+ "elevation": "163.98 m (534.78 ft)",
+ "lat": "+30 43 18.6",
+ "long": "-97 22 58.6"
+ },
+ "KPOE": {
+ "id": "POE",
+ "name": "FT JOHNSON",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "FT POLK",
+ "state": "LA",
+ "county": "VERNON",
+ "elevation": "124.36 m (406.82 ft)",
+ "lat": "+31 09 19",
+ "long": "-92 58 34"
+ },
+ "KEOX": {
+ "id": "EOX",
+ "name": "FT NOVOSEL",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "ECHO",
+ "state": "AL",
+ "county": "DALE",
+ "elevation": "144 m (472.44 ft)",
+ "lat": "+31 27 38",
+ "long": "-85 27 33.8"
+ },
+ "KGGW": {
+ "id": "GGW",
+ "name": "GLASGOW",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GLASGOW",
+ "state": "MT",
+ "county": "VALLEY",
+ "elevation": "702 m (2303.15 ft)",
+ "lat": "+48 12 22.9",
+ "long": "-106 37 28.9"
+ },
+ "KGLD": {
+ "id": "GLD",
+ "name": "GOODLAND",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GOODLAND",
+ "state": "KS",
+ "county": "SHERMAN",
+ "elevation": "1112.82 m (3648.29 ft)",
+ "lat": "+39 22 01",
+ "long": "-101 42 01"
+ },
+ "KUEX": {
+ "id": "UEX",
+ "name": "GRAND ISLAND",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BLUE HILL",
+ "state": "NE",
+ "county": "WEBSTER",
+ "elevation": "602.28 m (1975.07 ft)",
+ "lat": "+40 19 15",
+ "long": "-98 26 31"
+ },
+ "KGJX": {
+ "id": "GJX",
+ "name": "GRAND JUNCTION (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GRAND JUNCTION",
+ "state": "CO",
+ "county": "MESA",
+ "elevation": "3059 m (10036.09 ft)",
+ "lat": "+39 03 43.81",
+ "long": "-108 12 49.54"
+ },
+ "KGRR": {
+ "id": "GRR",
+ "name": "GRAND RAPIDS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GRAND RAPIDS",
+ "state": "MI",
+ "county": "KENT",
+ "elevation": "237.13 m (777.56 ft)",
+ "lat": "+42 53 38",
+ "long": "-85 32 41.6"
+ },
+ "KTFX": {
+ "id": "TFX",
+ "name": "GREAT FALLS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GREAT FALLS",
+ "state": "MT",
+ "county": "CASCADE",
+ "elevation": "1140 m (3740.16 ft)",
+ "lat": "+47 27 34.5",
+ "long": "-111 23 07.2"
+ },
+ "KGRB": {
+ "id": "GRB",
+ "name": "GREEN BAY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GREEN BAY",
+ "state": "WI",
+ "county": "BROWN",
+ "elevation": "216 m (708.66 ft)",
+ "lat": "+44 29 55.08",
+ "long": "-88 06 40"
+ },
+ "KGSP": {
+ "id": "GSP",
+ "name": "GREER",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GREER",
+ "state": "SC",
+ "county": "SPARTANBURG",
+ "elevation": "291 m (954.72 ft)",
+ "lat": "+34 52 59.9",
+ "long": "-82 13 11.4"
+ },
+ "KHDX": {
+ "id": "HDX",
+ "name": "HOLLOMAN AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "RUIDOSO",
+ "state": "NM",
+ "county": "DONA ANA",
+ "elevation": "1286.87 m (4219.16 ft)",
+ "lat": "+33 04 37.2",
+ "long": "-106 07 12.12"
+ },
+ "KHGX": {
+ "id": "HGX",
+ "name": "HOUSTON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DICKINSON",
+ "state": "TX",
+ "county": "GALVESTON",
+ "elevation": "5.49 m (16.4 ft)",
+ "lat": "+29 28 18.84",
+ "long": "-95 04 43.44"
+ },
+ "KIND": {
+ "id": "IND",
+ "name": "INDIANAPOLIS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "INDIANAPOLIS",
+ "state": "IN",
+ "county": "MARION",
+ "elevation": "240.79 m (787.4 ft)",
+ "lat": "+39 42 27",
+ "long": "-86 16 49"
+ },
+ "KJKL": {
+ "id": "JKL",
+ "name": "JACKSON, KY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "JACKSON",
+ "state": "KY",
+ "county": "BREATHITT",
+ "elevation": "415.75 m (1361.55 ft)",
+ "lat": "+37 35 27",
+ "long": "-83 18 47"
+ },
+ "KJAX": {
+ "id": "JAX",
+ "name": "JACKSONVILLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "JACKSONVILLE",
+ "state": "FL",
+ "county": "DUVAL",
+ "elevation": "19 m (62.34 ft)",
+ "lat": "+30 29 04.68",
+ "long": "-81 42 06.84"
+ },
+ "RODN": {
+ "id": "ODNR5",
+ "name": "KADENA AB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "KADENA AB",
+ "state": "JA",
+ "county": "N/A",
+ "elevation": "91 m (298.56 ft)",
+ "lat": "+26 18 28.08",
+ "long": "+127 54 12.49"
+ },
+ "PHKM": {
+ "id": "HKM",
+ "name": "KAMUELA/KOHALA APT (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "KAMUELA",
+ "state": "HI",
+ "county": "HAWAII",
+ "elevation": "1174 m (3851.71 ft)",
+ "lat": "+20 07 31",
+ "long": "-155 46 40"
+ },
+ "KBYX": {
+ "id": "BYX",
+ "name": "KEY WEST",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BOCA CHICA KEY",
+ "state": "FL",
+ "county": "MONROE",
+ "elevation": "2.44 m (6.56 ft)",
+ "lat": "+24 35 51",
+ "long": "-81 42 11.4"
+ },
+ "PAKC": {
+ "id": "AKC",
+ "name": "KING SALMON FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "KING SALMON",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "19.2 m (62.34 ft)",
+ "lat": "+58 40 46",
+ "long": "-156 37 46"
+ },
+ "KMRX": {
+ "id": "MRX",
+ "name": "KNOXVILLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MORRISTOWN",
+ "state": "TN",
+ "county": "HAMBLEN",
+ "elevation": "407.52 m (1335.3 ft)",
+ "lat": "+36 10 07",
+ "long": "-83 24 07"
+ },
+ "RKJK": {
+ "id": "KJKR4",
+ "name": "KUNSAN AB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "KUNSAN AB",
+ "state": "KO",
+ "county": "N/A",
+ "elevation": "23.77 m (75.46 ft)",
+ "lat": "+35 55 27",
+ "long": "+126 37 20"
+ },
+ "KARX": {
+ "id": "ARX",
+ "name": "LA CROSSE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LA CROSSE",
+ "state": "WI",
+ "county": "LA CROSSE",
+ "elevation": "388.92 m (1272.97 ft)",
+ "lat": "+43 49 22",
+ "long": "-91 11 28"
+ },
+ "KLCH": {
+ "id": "LCH",
+ "name": "LAKE CHARLES",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LAKE CHARLES",
+ "state": "LA",
+ "county": "CALCASIEU",
+ "elevation": "17 m (55.77 ft)",
+ "lat": "+30 07 31.1",
+ "long": "-93 12 57.2"
+ },
+ "KESX": {
+ "id": "ESX",
+ "name": "LAS VEGAS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LAS VEGAS",
+ "state": "NV",
+ "county": "CLARK",
+ "elevation": "1483.46 m (4865.49 ft)",
+ "lat": "+35 42 04.86",
+ "long": "-114 53 29.94"
+ },
+ "KDFX": {
+ "id": "DFX",
+ "name": "LAUGHLIN AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "BRACKETVILLE",
+ "state": "TX",
+ "county": "KINNEY",
+ "elevation": "344.73 m (1128.61 ft)",
+ "lat": "+29 16 23.3",
+ "long": "-100 16 49.2"
+ },
+ "KILX": {
+ "id": "ILX",
+ "name": "LINCOLN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LINCOLN",
+ "state": "IL",
+ "county": "LOGAN",
+ "elevation": "188 m (616.8 ft)",
+ "lat": "+40 09 01.8",
+ "long": "-89 20 12.45"
+ },
+ "KLZK": {
+ "id": "LZK",
+ "name": "LITTLE ROCK",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NORTH LITTLE ROCK",
+ "state": "AR",
+ "county": "PULASKI",
+ "elevation": "173.13 m (567.59 ft)",
+ "lat": "+34 50 11.4",
+ "long": "-92 15 43.9"
+ },
+ "KVTX": {
+ "id": "VTX",
+ "name": "LOS ANGELES",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LOS ANGELES",
+ "state": "CA",
+ "county": "VENTURA",
+ "elevation": "830.88 m (2723.1 ft)",
+ "lat": "+34 24 43.26",
+ "long": "-119 10 43.5"
+ },
+ "KLVX": {
+ "id": "LVX",
+ "name": "LOUISVILLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "FORT KNOX",
+ "state": "KY",
+ "county": "HARDIN",
+ "elevation": "219.15 m (718.5 ft)",
+ "lat": "+37 58 31",
+ "long": "-85 56 38"
+ },
+ "KLBB": {
+ "id": "LBB",
+ "name": "LUBBOCK",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LUBBOCK",
+ "state": "TX",
+ "county": "LUBBOCK",
+ "elevation": "1005 m (3297.24 ft)",
+ "lat": "+33 39 14.9",
+ "long": "-101 48 51"
+ },
+ "KMQT": {
+ "id": "MQT",
+ "name": "MARQUETTE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NEGAUNEE",
+ "state": "MI",
+ "county": "MARQUETTE",
+ "elevation": "430.07 m (1410.76 ft)",
+ "lat": "+46 31 52",
+ "long": "-87 32 54"
+ },
+ "KMXX": {
+ "id": "MXX",
+ "name": "MAXWELL AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "CARRVILLE",
+ "state": "AL",
+ "county": "MACON",
+ "elevation": "136 m (446.19 ft)",
+ "lat": "+32 32 11.94",
+ "long": "-85 47 23.1"
+ },
+ "KMAX": {
+ "id": "MAX",
+ "name": "MEDFORD (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MEDFORD",
+ "state": "OR",
+ "county": "JACKSON",
+ "elevation": "2289.96 m (7509.84 ft)",
+ "lat": "+42 04 52.21",
+ "long": "-122 43 02.53"
+ },
+ "KMLB": {
+ "id": "MLB",
+ "name": "MELBOURNE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MELBOURNE",
+ "state": "FL",
+ "county": "BREVARD",
+ "elevation": "10.67 m (32.81 ft)",
+ "lat": "+28 06 47.5",
+ "long": "-80 39 14.7"
+ },
+ "KNQA": {
+ "id": "NQA",
+ "name": "MEMPHIS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MILLINGTON",
+ "state": "TN",
+ "county": "SHELBY",
+ "elevation": "103 m (337.93 ft)",
+ "lat": "+35 20 41",
+ "long": "-89 52 24"
+ },
+ "KAMX": {
+ "id": "AMX",
+ "name": "MIAMI",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MIAMI",
+ "state": "FL",
+ "county": "DADE",
+ "elevation": "4.27 m (13.12 ft)",
+ "lat": "+25 36 39.9",
+ "long": "-80 24 45.6"
+ },
+ "PAIH": {
+ "id": "AIH",
+ "name": "MIDDLETON ISLAND (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "MIDDLETON ISLAND",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "20.42 m (65.62 ft)",
+ "lat": "+59 27 38.76",
+ "long": "-146 18 12.41"
+ },
+ "KMAF": {
+ "id": "MAF",
+ "name": "MIDLAND/ODESSA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MIDLAND",
+ "state": "TX",
+ "county": "MIDLAND",
+ "elevation": "883 m (2896.98 ft)",
+ "lat": "+31 56 36.46",
+ "long": "-102 11 21.3"
+ },
+ "KMKX": {
+ "id": "MKX",
+ "name": "MILWAUKEE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DOUSMAN",
+ "state": "WI",
+ "county": "WAUKESHA",
+ "elevation": "292 m (958.01 ft)",
+ "lat": "+42 58 04.44",
+ "long": "-88 33 02.4"
+ },
+ "KMPX": {
+ "id": "MPX",
+ "name": "MINNEAPOLIS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CHANHASSEN",
+ "state": "MN",
+ "county": "CARVER",
+ "elevation": "301 m (987.53 ft)",
+ "lat": "+44 50 56",
+ "long": "-93 33 55.9"
+ },
+ "KMBX": {
+ "id": "MBX",
+ "name": "MINOT AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "DEERING",
+ "state": "ND",
+ "county": "MCHENRY",
+ "elevation": "455.07 m (1492.78 ft)",
+ "lat": "+48 23 35",
+ "long": "-100 51 52"
+ },
+ "KMSX": {
+ "id": "MSX",
+ "name": "MISSOULA (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MISSOULA",
+ "state": "MT",
+ "county": "MISSOULA",
+ "elevation": "2417 m (7929.79 ft)",
+ "lat": "+47 02 27.6",
+ "long": "-113 59 10.4"
+ },
+ "KMOB": {
+ "id": "MOB",
+ "name": "MOBILE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "MOBILE",
+ "state": "AL",
+ "county": "MOBILE",
+ "elevation": "63.4 m (206.69 ft)",
+ "lat": "+30 40 46",
+ "long": "-88 14 24"
+ },
+ "PHMO": {
+ "id": "HMO",
+ "name": "MOLOKAI FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "MOLOKAI",
+ "state": "HI",
+ "county": "MOLOKAI",
+ "elevation": "415.44 m (1361.55 ft)",
+ "lat": "+21 07 58",
+ "long": "-157 10 49"
+ },
+ "KVAX": {
+ "id": "VAX",
+ "name": "MOODY AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "SOUTH STOCKTON",
+ "state": "GA",
+ "county": "LANIER",
+ "elevation": "66 m (216.54 ft)",
+ "lat": "+30 53 25",
+ "long": "-83 00 06.5"
+ },
+ "KMHX": {
+ "id": "MHX",
+ "name": "MOREHEAD CITY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NEWPORT",
+ "state": "NC",
+ "county": "CARTERET",
+ "elevation": "9.45 m (29.53 ft)",
+ "lat": "+34 46 33.27",
+ "long": "-76 52 34.28"
+ },
+ "KOHX": {
+ "id": "OHX",
+ "name": "NASHVILLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "OLD HICKORY",
+ "state": "TN",
+ "county": "WILSON",
+ "elevation": "176.48 m (577.43 ft)",
+ "lat": "+36 14 50",
+ "long": "-86 33 45"
+ },
+ "KAPX": {
+ "id": "APX",
+ "name": "NCL MICHIGAN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GAYLORD",
+ "state": "MI",
+ "county": "OTSEGO",
+ "elevation": "446.23 m (1463.25 ft)",
+ "lat": "+44 54 22.86",
+ "long": "-84 43 10.32"
+ },
+ "PAEC": {
+ "id": "AEC",
+ "name": "NOME FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "NOME",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "17.68 m (55.77 ft)",
+ "lat": "+64 30 41",
+ "long": "-165 17 42"
+ },
+ "KAKQ": {
+ "id": "AKQ",
+ "name": "NORFOLK",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WAKEFIELD",
+ "state": "VA",
+ "county": "SUSSEX",
+ "elevation": "48 m (157.48 ft)",
+ "lat": "+36 59 02.58",
+ "long": "-77 00 26.5"
+ },
+ "KTLX": {
+ "id": "TLX",
+ "name": "NORMAN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "OKLAHOMA CITY",
+ "state": "OK",
+ "county": "CLEVELAND",
+ "elevation": "369.72 m (1210.63 ft)",
+ "lat": "+35 20 00.10",
+ "long": "-97 16 39.94"
+ },
+ "KLNX": {
+ "id": "LNX",
+ "name": "NORTH PLATTE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NORTH PLATTE",
+ "state": "NE",
+ "county": "LOGAN",
+ "elevation": "919 m (3015.09 ft)",
+ "lat": "+41 57 28.6",
+ "long": "-100 34 34.4"
+ },
+ "KHTX": {
+ "id": "HTX",
+ "name": "NORTHEAST ALABAMA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "HYTOP",
+ "state": "AL",
+ "county": "JACKSON",
+ "elevation": "537.06 m (1761.81 ft)",
+ "lat": "+34 55 50",
+ "long": "-86 05 01"
+ },
+ "KIWX": {
+ "id": "IWX",
+ "name": "NORTHERN INDIANA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NORTH WEBSTER",
+ "state": "IN",
+ "county": "KOSCIUSKO",
+ "elevation": "292.3 m (958.01 ft)",
+ "lat": "+41 21 31",
+ "long": "-85 42 00"
+ },
+ "KOUN": {
+ "id": "NORO2",
+ "name": "NSSL",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NORMAN",
+ "state": "OK",
+ "county": "CLEVELAND",
+ "elevation": "370 m (1213.91 ft)",
+ "lat": "+35 14 09.81",
+ "long": "-97 27 44.46"
+ },
+ "KOAX": {
+ "id": "OAX",
+ "name": "OMAHA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "VALLEY",
+ "state": "NE",
+ "county": "DOUGLAS",
+ "elevation": "349.91 m (1145.01 ft)",
+ "lat": "+41 19 13.33",
+ "long": "-96 22 00.55"
+ },
+ "KPAH": {
+ "id": "PAH",
+ "name": "PADUCAH",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PADUCAH",
+ "state": "KY",
+ "county": "MCCRACKEN",
+ "elevation": "119.48 m (390.42 ft)",
+ "lat": "+37 04 06",
+ "long": "-88 46 19"
+ },
+ "KPDT": {
+ "id": "PDT",
+ "name": "PENDLETON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PENDLETON",
+ "state": "OR",
+ "county": "UMATILLA",
+ "elevation": "461.77 m (1512.47 ft)",
+ "lat": "+45 41 26.34",
+ "long": "-118 51 10.55"
+ },
+ "KDIX": {
+ "id": "DIX",
+ "name": "PHILADELPHIA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "FORT DIX",
+ "state": "NJ",
+ "county": "BURLINGTON",
+ "elevation": "45.42 m (147.64 ft)",
+ "lat": "+39 56 49.52",
+ "long": "-74 24 38.63"
+ },
+ "KIWA": {
+ "id": "IWA",
+ "name": "PHOENIX",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PHOENIX",
+ "state": "AZ",
+ "county": "MARICOPA",
+ "elevation": "415 m (1361.55 ft)",
+ "lat": "+33 17 21.24",
+ "long": "-111 40 11.7"
+ },
+ "KPBZ": {
+ "id": "PBZ",
+ "name": "PITTSBURGH",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CORAOPOLIS",
+ "state": "PA",
+ "county": "ALLEGHENY",
+ "elevation": "361.19 m (1184.38 ft)",
+ "lat": "+40 31 54.18",
+ "long": "-80 13 04.68"
+ },
+ "KEAX": {
+ "id": "EAX",
+ "name": "PLEASANT HILL",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PLEASANT HILL",
+ "state": "MO",
+ "county": "CASS",
+ "elevation": "303.28 m (994.09 ft)",
+ "lat": "+38 48 36.9",
+ "long": "-94 15 52.1"
+ },
+ "KSFX": {
+ "id": "SFX",
+ "name": "POCATELLO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SPRINGFIELD",
+ "state": "ID",
+ "county": "BINGHAM",
+ "elevation": "1363.68 m (4471.78 ft)",
+ "lat": "+43 06 20.16",
+ "long": "-112 41 10.08"
+ },
+ "KGYX": {
+ "id": "GYX",
+ "name": "PORTLAND, ME",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "GRAY",
+ "state": "ME",
+ "county": "CUMBERLAND",
+ "elevation": "124.66 m (406.82 ft)",
+ "lat": "+43 53 28.7",
+ "long": "-70 15 22.9"
+ },
+ "KRTX": {
+ "id": "RTX",
+ "name": "PORTLAND, OR",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PORTLAND",
+ "state": "OR",
+ "county": "WASHINGTON",
+ "elevation": "492 m (1614.17 ft)",
+ "lat": "+45 42 54.14",
+ "long": "-122 57 54"
+ },
+ "KPUX": {
+ "id": "PUX",
+ "name": "PUEBLO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "PUEBLO",
+ "state": "CO",
+ "county": "PUEBLO",
+ "elevation": "1615 m (5298.56 ft)",
+ "lat": "+38 27 34.38",
+ "long": "-104 10 52.86"
+ },
+ "KDVN": {
+ "id": "DVN",
+ "name": "QUAD CITIES",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DAVENPORT",
+ "state": "IA",
+ "county": "SCOTT",
+ "elevation": "229.82 m (751.31 ft)",
+ "lat": "+41 36 42",
+ "long": "-90 34 51"
+ },
+ "KRAX": {
+ "id": "RAX",
+ "name": "RALEIGH/DURHAM",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CLAYTON",
+ "state": "NC",
+ "county": "WAKE",
+ "elevation": "106.07 m (347.77 ft)",
+ "lat": "+35 39 55.87",
+ "long": "-78 29 23.10"
+ },
+ "KUDX": {
+ "id": "UDX",
+ "name": "RAPID CITY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NEW UNDERWOOD",
+ "state": "SD",
+ "county": "PENNINGTON",
+ "elevation": "939 m (3080.71 ft)",
+ "lat": "+44 07 29",
+ "long": "-102 49 48"
+ },
+ "KRGX": {
+ "id": "RGX",
+ "name": "RENO (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "NIXON",
+ "state": "NV",
+ "county": "WASHOE",
+ "elevation": "2529.54 m (8297.24 ft)",
+ "lat": "+39 45 14.6",
+ "long": "-119 27 43.3"
+ },
+ "KRIW": {
+ "id": "RIW",
+ "name": "RIVERTON/LANDER",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "RIVERTON",
+ "state": "WY",
+ "county": "FREMONT",
+ "elevation": "1697.13 m (5567.59 ft)",
+ "lat": "+43 03 57.92",
+ "long": "-108 28 38.28"
+ },
+ "KFCX": {
+ "id": "FCX",
+ "name": "ROANOKE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "ROANOKE",
+ "state": "VA",
+ "county": "FLOYD",
+ "elevation": "874.17 m (2867.45 ft)",
+ "lat": "+37 01 27.84",
+ "long": "-80 16 26.29"
+ },
+ "KJGX": {
+ "id": "JGX",
+ "name": "ROBINS AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "JEFFERSONVILLE",
+ "state": "GA",
+ "county": "TWIGGS",
+ "elevation": "158.8 m (518.37 ft)",
+ "lat": "+32 40 32.46",
+ "long": "-83 21 03"
+ },
+ "KDAX": {
+ "id": "DAX",
+ "name": "SACRAMENTO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "DAVIS",
+ "state": "CA",
+ "county": "YOLO",
+ "elevation": "9.14 m (29.53 ft)",
+ "lat": "+38 30 04",
+ "long": "-121 40 40.2"
+ },
+ "KMTX": {
+ "id": "MTX",
+ "name": "SALT LAKE CITY (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SALT LAKE CITY",
+ "state": "UT",
+ "county": "SALT LAKE",
+ "elevation": "1975 m (6479.66 ft)",
+ "lat": "+41 15 46",
+ "long": "-112 26 52"
+ },
+ "KSJT": {
+ "id": "SJT",
+ "name": "SAN ANGELO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SAN ANGELO",
+ "state": "TX",
+ "county": "TOM GREEN",
+ "elevation": "576.07 m (1889.76 ft)",
+ "lat": "+31 22 16.6",
+ "long": "-100 29 33"
+ },
+ "KNKX": {
+ "id": "NKX",
+ "name": "SAN DIEGO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SAN DIEGO",
+ "state": "CA",
+ "county": "SAN DIEGO",
+ "elevation": "291.08 m (954.72 ft)",
+ "lat": "+32 55 08.46",
+ "long": "-117 02 30.48"
+ },
+ "KMUX": {
+ "id": "MUX",
+ "name": "SAN FRANCISCO",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LOS GATOS",
+ "state": "CA",
+ "county": "SANTA CLARA",
+ "elevation": "1057.35 m (3467.85 ft)",
+ "lat": "+37 09 18.8",
+ "long": "-121 53 54.4"
+ },
+ "KHNX": {
+ "id": "HNX",
+ "name": "SAN JOAQUIN VALY",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "HANFORD",
+ "state": "CA",
+ "county": "KINGS",
+ "elevation": "74.07 m (242.78 ft)",
+ "lat": "+36 18 51.05",
+ "long": "-119 37 55.7"
+ },
+ "TJUA": {
+ "id": "JUA",
+ "name": "SAN JUAN FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "SAN JUAN",
+ "state": "PR",
+ "county": "N/A",
+ "elevation": "867 m (2844.49 ft)",
+ "lat": "+18 06 56.4",
+ "long": "-66 04 41.4"
+ },
+ "KSOX": {
+ "id": "SOX",
+ "name": "SANTA ANA MTS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SANTA ANA MOUNTAINS",
+ "state": "CA",
+ "county": "ORANGE",
+ "elevation": "927 m (3041.34 ft)",
+ "lat": "+33 49 03.84",
+ "long": "-117 38 09.6"
+ },
+ "KATX": {
+ "id": "ATX",
+ "name": "SEATTLE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "EVERETT",
+ "state": "WA",
+ "county": "ISLAND",
+ "elevation": "161 m (528.22 ft)",
+ "lat": "+48 11 40.6",
+ "long": "-122 29 44.5"
+ },
+ "KSHV": {
+ "id": "SHV",
+ "name": "SHREVEPORT",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SHREVEPORT",
+ "state": "LA",
+ "county": "CADDO",
+ "elevation": "83.21 m (272.31 ft)",
+ "lat": "+32 27 03",
+ "long": "-93 50 28.5"
+ },
+ "KFSD": {
+ "id": "FSD",
+ "name": "SIOUX FALLS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SIOUX FALLS",
+ "state": "SD",
+ "county": "MINNEHAHA",
+ "elevation": "435.86 m (1427.17 ft)",
+ "lat": "+43 35 16",
+ "long": "-96 43 46"
+ },
+ "PACG": {
+ "id": "ACG",
+ "name": "SITKA FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "BIORKA ISLAND",
+ "state": "AK",
+ "county": "N/A",
+ "elevation": "63.09 m (206.69 ft)",
+ "lat": "+56 51 10",
+ "long": "-135 31 45"
+ },
+ "PHKI": {
+ "id": "HKI",
+ "name": "SOUTH KAUAI FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "SOUTH KAUAI",
+ "state": "HI",
+ "county": "KAUAI",
+ "elevation": "69 m (226.38 ft)",
+ "lat": "+21 53 38",
+ "long": "-159 33 09"
+ },
+ "PHWA": {
+ "id": "HWA",
+ "name": "SOUTH SHORE FAA (RDA 1)",
+ "agency": "FAA",
+ "equipment": "RDA",
+ "city": "NAALEHU",
+ "state": "HI",
+ "county": "HAWAII",
+ "elevation": "420.62 m (1377.95 ft)",
+ "lat": "+19 05 42",
+ "long": "-155 34 08"
+ },
+ "KOTX": {
+ "id": "OTX",
+ "name": "SPOKANE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SPOKANE",
+ "state": "WA",
+ "county": "SPOKANE",
+ "elevation": "726.64 m (2381.89 ft)",
+ "lat": "+47 40 49.5",
+ "long": "-117 37 36.4"
+ },
+ "KSGF": {
+ "id": "SGF",
+ "name": "SPRINGFIELD",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SPRINGFIELD",
+ "state": "MO",
+ "county": "GREENE",
+ "elevation": "389.53 m (1276.25 ft)",
+ "lat": "+37 14 06.86",
+ "long": "-93 24 01.51"
+ },
+ "KLSX": {
+ "id": "LSX",
+ "name": "ST LOUIS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WELDON SPRING",
+ "state": "MO",
+ "county": "ST CHARLES",
+ "elevation": "185.32 m (606.96 ft)",
+ "lat": "+38 41 55",
+ "long": "-90 40 58"
+ },
+ "KCCX": {
+ "id": "CCX",
+ "name": "STATE COLLEGE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "STATE COLLEGE",
+ "state": "PA",
+ "county": "CENTRE",
+ "elevation": "733.04 m (2404.86 ft)",
+ "lat": "+40 55 23.4",
+ "long": "-78 00 13.4"
+ },
+ "KLWX": {
+ "id": "LWX",
+ "name": "STERLING",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "STERLING",
+ "state": "VA",
+ "county": "LOUDOUN",
+ "elevation": "88.54 m (288.71 ft)",
+ "lat": "+38 58 34",
+ "long": "-77 29 15"
+ },
+ "KTLH": {
+ "id": "TLH",
+ "name": "TALLAHASSEE",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "TALLAHASSEE",
+ "state": "FL",
+ "county": "LEON",
+ "elevation": "19.2 m (62.34 ft)",
+ "lat": "+30 23 51.3",
+ "long": "-84 19 44.2"
+ },
+ "KTBW": {
+ "id": "TBW",
+ "name": "TAMPA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "RUSKIN",
+ "state": "FL",
+ "county": "HILLSBOROUGH",
+ "elevation": "12.5 m (39.37 ft)",
+ "lat": "+27 42 19.8",
+ "long": "-82 24 06.4"
+ },
+ "KTWX": {
+ "id": "TWX",
+ "name": "TOPEKA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "TOPEKA",
+ "state": "KS",
+ "county": "WABAUNSEE",
+ "elevation": "416.66 m (1364.83 ft)",
+ "lat": "+38 59 49.02",
+ "long": "-96 13 57.18"
+ },
+ "KEMX": {
+ "id": "EMX",
+ "name": "TUCSON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "TUCSON",
+ "state": "AZ",
+ "county": "PIMA",
+ "elevation": "1586.48 m (5203.41 ft)",
+ "lat": "+31 53 37.14",
+ "long": "-110 37 48.9"
+ },
+ "KINX": {
+ "id": "INX",
+ "name": "TULSA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "INOLA",
+ "state": "OK",
+ "county": "ROGERS",
+ "elevation": "203.61 m (666.01 ft)",
+ "lat": "+36 10 30.47",
+ "long": "-95 33 50.98"
+ },
+ "KVNX": {
+ "id": "VNX",
+ "name": "VANCE AFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "CHEROKEE",
+ "state": "OK",
+ "county": "ALFALFA",
+ "elevation": "368.81 m (1207.35 ft)",
+ "lat": "+36 44 26.22",
+ "long": "-98 07 39.78"
+ },
+ "KVBX": {
+ "id": "VBX",
+ "name": "VANDENBERG SFB",
+ "agency": "AFWA",
+ "equipment": "RDA",
+ "city": "ORCUTT",
+ "state": "CA",
+ "county": "SANTA BARBARA",
+ "elevation": "383 m (1256.56 ft)",
+ "lat": "+34 50 18.78",
+ "long": "-120 23 52.50"
+ },
+ "KSRX": {
+ "id": "SRX",
+ "name": "WESTERN ARKANSAS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "CHAFFEE RIDGE",
+ "state": "AR",
+ "county": "SEBASTIAN",
+ "elevation": "200 m (656.17 ft)",
+ "lat": "+35 17 25.5",
+ "long": "-94 21 42.8"
+ },
+ "KICT": {
+ "id": "ICT",
+ "name": "WICHITA",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "WICHITA",
+ "state": "KS",
+ "county": "SEDGWICK",
+ "elevation": "406.91 m (1332.02 ft)",
+ "lat": "+37 39 16",
+ "long": "-97 26 35"
+ },
+ "KLTX": {
+ "id": "LTX",
+ "name": "WILMINGTON",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "SHALLOTTE",
+ "state": "NC",
+ "county": "BRUNSWICK",
+ "elevation": "19.51 m (62.34 ft)",
+ "lat": "+33 59 20.94",
+ "long": "-78 25 44.79"
+ },
+ "KYUX": {
+ "id": "YUX",
+ "name": "YUMA (RDA 1)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "YUMA",
+ "state": "AZ",
+ "county": "PIMA",
+ "elevation": "53.04 m (173.88 ft)",
+ "lat": "+32 29 43.01",
+ "long": "-114 39 24.16"
+ },
+ "KVWX": {
+ "id": "VWX",
+ "name": "EVANSVILLE, IN",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "OWENSVILLE",
+ "state": "IN",
+ "county": "GIBSON",
+ "elevation": "155.75 m (508.53 ft)",
+ "lat": "+38 15 36.9",
+ "long": "-87 43 28.3"
+ },
+ "KDGX": {
+ "id": "DGX",
+ "name": "JACKSON/BRANDON, MS",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "BRANDON",
+ "state": "MS",
+ "county": "RANKIN",
+ "elevation": "150.92 m (492.13 ft)",
+ "lat": "+32 16 47.8",
+ "long": "-89 59 04"
+ },
+ "KLGX": {
+ "id": "LGX",
+ "name": "LANGLEY HILL (NW WASHINGTON)",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "LANGLEY HILL",
+ "state": "WA",
+ "county": "GRAYS HARBOR",
+ "elevation": "76.8 m (249.34 ft)",
+ "lat": "+47 07 01",
+ "long": "-124 06 24"
+ },
+ "KHDC": {
+ "id": "HDC",
+ "name": "HAMMOND",
+ "agency": "NWS",
+ "equipment": "RDA",
+ "city": "HAMMOND",
+ "state": "LA",
+ "county": "TANGIPAHOA",
+ "elevation": "13 m (42.65 ft)",
+ "lat": "+30 31 9.5",
+ "long": "-90 24 26.5"
+ }
+ }
+}
diff --git a/client/src/lib/index.ts b/client/src/lib/index.ts
new file mode 100644
index 0000000..856f2b6
--- /dev/null
+++ b/client/src/lib/index.ts
@@ -0,0 +1 @@
+// place files you want to import through the `$lib` alias in this folder.
diff --git a/client/src/lib/layerList.ts b/client/src/lib/layerList.ts
new file mode 100644
index 0000000..56d24f9
--- /dev/null
+++ b/client/src/lib/layerList.ts
@@ -0,0 +1,27 @@
+import type { SiteListing } from './data/sites';
+
+export type LayerList = Category[];
+export type Category =
+ | {
+ id: string;
+ category: string;
+ singlesite: false;
+ children: PrimaryLayer[];
+ }
+ | {
+ id: string;
+ category: string;
+ singlesite: true;
+ sites: SiteListing;
+ children: PrimaryLayer[];
+ };
+
+export type PrimaryLayer = {
+ id: string;
+ layer: string;
+} & PrimaryLayerSource;
+
+export type PrimaryLayerSource = {
+ type: 'raster';
+ tileUrl: string;
+};
diff --git a/client/src/lib/utils.ts b/client/src/lib/utils.ts
new file mode 100644
index 0000000..ac680b3
--- /dev/null
+++ b/client/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/client/src/routes/+layout.svelte b/client/src/routes/+layout.svelte
new file mode 100644
index 0000000..697cf5a
--- /dev/null
+++ b/client/src/routes/+layout.svelte
@@ -0,0 +1,10 @@
+
+
+
+{@render children()}
+
\ No newline at end of file
diff --git a/client/src/routes/+page.server.ts b/client/src/routes/+page.server.ts
new file mode 100644
index 0000000..a4d201f
--- /dev/null
+++ b/client/src/routes/+page.server.ts
@@ -0,0 +1,55 @@
+import type { PageServerLoad } from './$types';
+import wsr88dsites from '$lib/data/wsr88d.json';
+import type { LayerList } from '$lib/layerList';
+
+export const load: PageServerLoad = () => {
+ const layers: LayerList = [
+ {
+ id: '01JV7H1X1GPP6CD4HPZZEXVDWS',
+ category: 'US-CONUS/National',
+ singlesite: false,
+ children: [
+ {
+ id: '01JV7H238Y1YQW95C3NZA19HF2',
+ layer: 'Composite Reflectivity',
+ type: 'raster',
+ tileUrl:
+ 'https://tiler.weather.ax/grib2/noaa_mrms_composite_reflectivity_qcd_CONUS/{z}/{x}/{y}.png'
+ },
+ {
+ id: '01JV7RZJ7W9KZBJ34CG7YSS0PZ',
+ layer: 'Differential Reflectivity',
+ type: 'raster',
+ tileUrl:
+ 'https://tiler.weather.ax/grib2/noaa_mrms_composite_reflectivity_rhohv_CONUS/{z}/{x}/{y}.png'
+ }
+ ]
+ },
+ {
+ id: '01JV7H29HTF3K0B8BBE3BCNMXX',
+ category: 'US-Singlesite',
+ singlesite: true,
+ sites: wsr88dsites,
+ children: [
+ {
+ id: '01JV7RV67A96V2FECTDB6A0DFG',
+ layer: 'Super Resolution Base Reflectivity (Tilt 1)',
+ type: 'raster',
+ tileUrl:
+ 'https://tiler.weather.ax/grib2/noaa_mrms_composite_reflectivity_qcd/{z}/{x}/{y}.png'
+ },
+ {
+ id: '01JV7SEN0GFB76NR843B1GFW5N',
+ layer: 'Super Resolution Base Velocity (Tilt 1)',
+ type: 'raster',
+ tileUrl:
+ 'https://tiler.weather.ax/grib2/noaa_mrms_composite_reflectivity_qcd/{z}/{x}/{y}.png'
+ }
+ ]
+ }
+ ];
+
+ return {
+ layers
+ };
+};
diff --git a/client/src/routes/+page.svelte b/client/src/routes/+page.svelte
new file mode 100644
index 0000000..bdc90a1
--- /dev/null
+++ b/client/src/routes/+page.svelte
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/client/static/favicon.png b/client/static/favicon.png
new file mode 100644
index 0000000..825b9e6
Binary files /dev/null and b/client/static/favicon.png differ
diff --git a/client/static/radar-rect-gray.svg b/client/static/radar-rect-gray.svg
new file mode 100644
index 0000000..307a44c
--- /dev/null
+++ b/client/static/radar-rect-gray.svg
@@ -0,0 +1,3 @@
+
diff --git a/client/svelte.config.js b/client/svelte.config.js
new file mode 100644
index 0000000..1295460
--- /dev/null
+++ b/client/svelte.config.js
@@ -0,0 +1,18 @@
+import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ // Consult https://svelte.dev/docs/kit/integrations
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+
+ kit: {
+ // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
+ // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
+ // See https://svelte.dev/docs/kit/adapters for more information about adapters.
+ adapter: adapter()
+ }
+};
+
+export default config;
diff --git a/client/tailwind.config.ts b/client/tailwind.config.ts
new file mode 100644
index 0000000..d91ff63
--- /dev/null
+++ b/client/tailwind.config.ts
@@ -0,0 +1,96 @@
+import { fontFamily } from "tailwindcss/defaultTheme";
+import type { Config } from "tailwindcss";
+import tailwindcssAnimate from "tailwindcss-animate";
+
+const config: Config = {
+ darkMode: ["class"],
+ content: ["./src/**/*.{html,js,svelte,ts}"],
+ safelist: ["dark"],
+ theme: {
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px"
+ }
+ },
+ extend: {
+ colors: {
+ border: "hsl(var(--border) / )",
+ input: "hsl(var(--input) / )",
+ ring: "hsl(var(--ring) / )",
+ background: "hsl(var(--background) / )",
+ foreground: "hsl(var(--foreground) / )",
+ primary: {
+ DEFAULT: "hsl(var(--primary) / )",
+ foreground: "hsl(var(--primary-foreground) / )"
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary) / )",
+ foreground: "hsl(var(--secondary-foreground) / )"
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive) / )",
+ foreground: "hsl(var(--destructive-foreground) / )"
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted) / )",
+ foreground: "hsl(var(--muted-foreground) / )"
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent) / )",
+ foreground: "hsl(var(--accent-foreground) / )"
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover) / )",
+ foreground: "hsl(var(--popover-foreground) / )"
+ },
+ card: {
+ DEFAULT: "hsl(var(--card) / )",
+ foreground: "hsl(var(--card-foreground) / )"
+ },
+ sidebar: {
+ DEFAULT: "hsl(var(--sidebar-background))",
+ foreground: "hsl(var(--sidebar-foreground))",
+ primary: "hsl(var(--sidebar-primary))",
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
+ accent: "hsl(var(--sidebar-accent))",
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
+ border: "hsl(var(--sidebar-border))",
+ ring: "hsl(var(--sidebar-ring))",
+ },
+ },
+ borderRadius: {
+ xl: "calc(var(--radius) + 4px)",
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)"
+ },
+ fontFamily: {
+ sans: [...fontFamily.sans]
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--bits-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--bits-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ "caret-blink": {
+ "0%,70%,100%": { opacity: "1" },
+ "20%,50%": { opacity: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ "caret-blink": "caret-blink 1.25s ease-out infinite",
+ },
+ },
+ },
+ plugins: [tailwindcssAnimate],
+};
+
+export default config;
diff --git a/client/tsconfig.json b/client/tsconfig.json
new file mode 100644
index 0000000..0b2d886
--- /dev/null
+++ b/client/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "moduleResolution": "bundler"
+ }
+ // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
+ // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/client/vite.config.ts b/client/vite.config.ts
new file mode 100644
index 0000000..2d35c4f
--- /dev/null
+++ b/client/vite.config.ts
@@ -0,0 +1,7 @@
+import tailwindcss from '@tailwindcss/vite';
+import { sveltekit } from '@sveltejs/kit/vite';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ plugins: [tailwindcss(), sveltekit()]
+});