commit be0fc11a5c3bd0d5f5b5c006b76647a283bce608 Author: Valknar XXX Date: Sat Oct 25 22:04:41 2025 +0200 A new start diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..51161a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +dist/ +target/ +pkg/ + +.env.* + diff --git a/README.md b/README.md new file mode 100644 index 0000000..53db1af --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# pornsuper + +## Prerequisites + +1. Install node 20.19.1 +2. `corepack enable` +3. `pnpm install` +4. `cargo install wasm-bindgen-cli` diff --git a/package.json b/package.json new file mode 100644 index 0000000..8ce3f39 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "sexy.pivoine.art", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build:bundle": "git pull && pnpm install && pnpm --filter @sexy.pivoine.art/bundle build", + "build:frontend": "git pull && pnpm install && pnpm --filter @sexy.pivoine.art/frontend build", + "dev:data": "cd ../compose/data && docker compose up -d", + "dev:directus": "cd ../compose/sexy && docker compose --env-file=.env.local up -d directus", + "dev": "pnpm dev:data && pnpm dev:directus && pnpm --filter @sexy.pivoine.art/frontend dev" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.17.0+sha512.fce8a3dd29a4ed2ec566fb53efbb04d8c44a0f05bc6f24a73046910fb9c3ce7afa35a0980500668fa3573345bd644644fa98338fa168235c80f4aa17aa17fbef", + "pnpm": { + "onlyBuiltDependencies": [ + "svelte-preprocess", + "vue-demi" + ], + "ignoredBuiltDependencies": [ + "@tailwindcss/oxide", + "node-sass" + ] + } +} diff --git a/packages/bundle/package.json b/packages/bundle/package.json new file mode 100644 index 0000000..7e085d5 --- /dev/null +++ b/packages/bundle/package.json @@ -0,0 +1,54 @@ +{ + "name": "@sexy.pivoine.art/bundle", + "description": "Please enter a description for your extension", + "icon": "extension", + "version": "1.0.0", + "keywords": [ + "directus", + "directus-extension", + "directus-extension-bundle" + ], + "type": "module", + "files": [ + "dist" + ], + "directus:extension": { + "type": "bundle", + "path": { + "app": "dist/app.js", + "api": "dist/api.js" + }, + "entries": [ + { + "name": "endpoint", + "type": "endpoint", + "source": "src/endpoint" + }, + { + "name": "hook", + "type": "hook", + "source": "src/hook" + }, + { + "name": "theme", + "type": "theme", + "source": "src/theme" + } + ], + "host": "^11.11.0" + }, + "scripts": { + "build": "directus-extension build", + "dev": "directus-extension build -w --no-minify", + "link": "directus-extension link", + "validate": "directus-extension validate", + "add": "directus-extension add" + }, + "devDependencies": { + "@directus/extensions-sdk": "16.0.2" + }, + "dependencies": { + "@sindresorhus/slugify": "^3.0.0", + "fluent-ffmpeg": "^2.1.3" + } +} diff --git a/packages/bundle/src/endpoint/index.ts b/packages/bundle/src/endpoint/index.ts new file mode 100644 index 0000000..b64d17c --- /dev/null +++ b/packages/bundle/src/endpoint/index.ts @@ -0,0 +1,61 @@ +const createPolicyFilter = (policy) => ({ + _or: [ + { + policies: { + policy: { + name: { + _eq: policy, + }, + }, + }, + }, + { + role: { + name: { + _eq: policy, + }, + }, + }, + ], +}); + +export default { + id: "sexy", + handler: (router, context) => { + const { services, getSchema } = context; + const { ItemsService } = services; + + router.get("/stats", async (_req, res) => { + const usersService = new ItemsService("directus_users", { + schema: await getSchema(), + }); + const modelsCount = await usersService.readByQuery({ + aggregate: { + count: ["*"], + }, + filter: createPolicyFilter("Model"), + }); + const viewersCount = await usersService.readByQuery({ + aggregate: { + count: ["*"], + }, + filter: createPolicyFilter("Viewer"), + }); + + const videosService = new ItemsService("sexy_videos", { + schema: await getSchema(), + }); + const videosCount = await videosService.readByQuery({ + aggregate: { + count: ["*"], + }, + }); + + res.json({ + models_count: modelsCount[0].count, + viewers_count: viewersCount[0].count, + videos_count: videosCount[0].count, + }); + }); + }, +}; diff --git a/packages/bundle/src/hook/index.ts b/packages/bundle/src/hook/index.ts new file mode 100644 index 0000000..7cf1974 --- /dev/null +++ b/packages/bundle/src/hook/index.ts @@ -0,0 +1,70 @@ +import { createRequire } from "module"; +global.require = createRequire(import.meta.url); +import { defineHook } from "@directus/extensions-sdk"; +import slugify from "@sindresorhus/slugify"; +import ffmpeg from "fluent-ffmpeg"; + +async function processVideo( + meta, + { schema, accountability }, + services, + logger, +) { + const { FilesService } = services; + const itemId = meta.key; + const videoPath = `/directus/uploads/${meta.payload.filename_disk}`; // Adjust path as needed + const videoService = new FilesService({ schema, accountability }); // Replace with your collection name + + try { + const durationInSeconds = await new Promise((resolve, reject) => { + ffmpeg.ffprobe(videoPath, function (err, metadata) { + if (err) { + reject(err); + } + resolve(parseInt(metadata.format.duration)); + }); + }); + // Update the item with the duration + await videoService.updateOne(itemId, { duration: durationInSeconds }); + logger.info(`Video ${itemId} duration updated to ${durationInSeconds}`); + } catch (error) { + logger.error(`Error processing video ${itemId}:`, error); + } +} + +export default defineHook(async ({ filter, action }, { services, logger }) => { + action("files.upload", async (meta, context) => { + await processVideo(meta, context, services, logger); + }); + + filter( + "users.create", + (payload: { + first_name: string; + last_name: string; + artist_name: string; + slug: string; + }) => { + const artist_name = `${payload.first_name}-${new Date().getTime()}`; + const slug = slugify(artist_name); + const join_date = new Date(); + return { ...payload, artist_name, slug, join_date }; + }, + ); + + filter( + "users.update", + (payload: { + first_name: string; + last_name: string; + artist_name: string; + slug: string; + }) => { + if (payload.artist_name) { + const slug = slugify(payload.artist_name); + return { ...payload, slug }; + } + return payload; + }, + ); +}); diff --git a/packages/bundle/src/theme/index.ts b/packages/bundle/src/theme/index.ts new file mode 100644 index 0000000..ed9367e --- /dev/null +++ b/packages/bundle/src/theme/index.ts @@ -0,0 +1,130 @@ +import { defineTheme } from "@directus/extensions-sdk"; +import "./style.css"; + +export default defineTheme({ + id: "@sexy.pivoine.art/theme", + name: "Sexy.Art Dark", + appearance: "dark", + rules: { + borderRadius: "6px", + borderWidth: "2px", + foreground: "#c9d1d9", + foregroundSubdued: "#666672", + foregroundAccent: "#f0f6fc", + background: "#0D1117", + backgroundNormal: "#21262E", + backgroundAccent: "#30363D", + backgroundSubdued: "#161B22", + borderColor: "#21262E", + borderColorAccent: "#30363D", + borderColorSubdued: "#161B22", + primary: "#ce47eb", + secondary: "#613dff", + success: "#87ff66", + warning: "#ffbf66", + danger: "#ff6467", + navigation: { + background: "#21262E", + backgroundAccent: "#30363D", + borderWidth: "0px", + borderColor: "transparent", + project: { + background: "#30363D", + borderWidth: "0px", + borderColor: "transparent", + }, + modules: { + borderWidth: "0px", + borderColor: "transparent", + button: { + foregroundHover: "#fff", + background: "transparent", + backgroundHover: "transparent", + backgroundActive: "#21262E", + }, + }, + list: { + background: "transparent", + backgroundHover: "#30363D", + backgroundActive: "#30363D", + divider: { + borderColor: "#30363D", + }, + }, + }, + header: { + borderWidth: "0px", + borderColor: "transparent", + boxShadow: "0 4px 7px -4px black", + }, + form: { + columnGap: "32px", + rowGap: "40px", + field: { + label: { + fontWeight: "600", + }, + input: { + borderColor: "#21262E", + borderColorHover: "#30363D", + boxShadow: "none", + boxShadowHover: "none", + height: "60px", + padding: "16px", + }, + }, + }, + sidebar: { + background: "#21262E", + borderWidth: "0px", + borderColor: "transparent", + section: { + toggle: { + background: "#30363D", + borderWidth: "0px", + borderColor: "transparent", + }, + form: { + field: { + input: { + height: "52px", + padding: "12px", + }, + }, + }, + }, + }, + public: { + art: { + background: "#21262E", + speed: "1", + }, + }, + popover: { + menu: { + background: "#30363D", + boxShadow: "0px 0px 6px 0px black", + }, + }, + banner: { + background: "#161B22", + padding: "40px", + avatar: { + background: "#fff", + borderRadius: "50%", + }, + headline: { + foreground: "#fff", + }, + title: { + foreground: "#fff", + }, + subtitle: { + foreground: "#969696", + }, + art: { + foreground: "#21262E", + }, + }, + }, +}); diff --git a/packages/bundle/src/theme/style.css b/packages/bundle/src/theme/style.css new file mode 100644 index 0000000..e69de29 diff --git a/packages/bundle/tsconfig.json b/packages/bundle/tsconfig.json new file mode 100644 index 0000000..6485252 --- /dev/null +++ b/packages/bundle/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM"], + "module": "ES2022", + "moduleResolution": "node", + "strict": false, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "noImplicitAny": false, + "noImplicitThis": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUncheckedIndexedAccess": true, + "noUnusedParameters": true, + "alwaysStrict": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "resolveJsonModule": false, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "allowJs": true + }, + "include": ["./src/**/*.ts"] +} diff --git a/packages/buttplug/.cargo/config.toml b/packages/buttplug/.cargo/config.toml new file mode 100644 index 0000000..ecf6510 --- /dev/null +++ b/packages/buttplug/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +rustflags = ['--cfg', 'getrandom_backend="wasm_js"', "--cfg=web_sys_unstable_apis"] \ No newline at end of file diff --git a/packages/buttplug/Cargo.lock b/packages/buttplug/Cargo.lock new file mode 100644 index 0000000..159f414 --- /dev/null +++ b/packages/buttplug/Cargo.lock @@ -0,0 +1,2503 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borrow-or-share" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "buttplug" +version = "9.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6436601fd48d3d8f816602ab3ebb5ced4f8c5037b86c6622e09c0d21b40acfe0" +dependencies = [ + "aes", + "ahash", + "async-stream", + "async-trait", + "buttplug_derive", + "byteorder", + "cfg-if", + "dashmap", + "derivative", + "displaydoc", + "ecb", + "futures", + "futures-util", + "getrandom 0.2.16", + "getset", + "instant", + "jsonschema", + "lazy_static", + "once_cell", + "os_info", + "paste", + "prost", + "prost-build", + "rand", + "regex", + "rusty-xinput", + "serde", + "serde-aux", + "serde_json", + "serde_repr", + "sha2", + "strum", + "strum_macros", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "tracing-futures", + "tracing-subscriber", + "url", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasmtimer", + "windows", +] + +[[package]] +name = "buttplug_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5ee14ebc45f9ef4fb919e11ff6a51decfd6007c7c623107c652c2ab552a211" +dependencies = [ + "quote", + "syn 2.0.106", +] + +[[package]] +name = "buttplug_wasm" +version = "9.0.9" +dependencies = [ + "async-trait", + "buttplug", + "console_error_panic_hook", + "futures", + "futures-util", + "getrandom 0.3.3", + "js-sys", + "log-panics", + "parking_lot 0.11.2", + "tokio", + "tokio-stream", + "tracing", + "tracing-futures", + "tracing-subscriber", + "tracing-wasm", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasmtimer", + "web-sys", +] + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link 0.2.0", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.11", + "serde", +] + +[[package]] +name = "deranged" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.0", +] + +[[package]] +name = "fancy-regex" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fluent-uri" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fraction" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f158e3ff0a1b334408dc9fb811cd99b446986f4d8b741bb08f9df1604085ae7" +dependencies = [ + "lazy_static", + "num", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "getset" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonschema" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b46a0365a611fbf1d2143104dcf910aada96fafd295bab16c60b802bf6fa1d" +dependencies = [ + "ahash", + "base64", + "bytecount", + "email_address", + "fancy-regex", + "fraction", + "idna", + "itoa", + "num-cmp", + "num-traits", + "once_cell", + "percent-encoding", + "referencing", + "regex", + "regex-syntax", + "serde", + "serde_json", + "uuid-simd", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "log-panics" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f9dd8546191c1850ecf67d22f5ff00a935b890d0e84713159a55495cc2ac5f" +dependencies = [ + "backtrace", + "log", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-cmp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "os_info" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" +dependencies = [ + "log", + "plist", + "serde", + "windows-sys 0.52.0", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.11", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.17", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.106", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.106", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-xml" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "referencing" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8eff4fa778b5c2a57e85c5f2fe3a709c52f0e60d23146e2151cbef5893f420e" +dependencies = [ + "ahash", + "fluent-uri", + "once_cell", + "parking_lot 0.12.4", + "percent-encoding", + "serde_json", +] + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.0", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-xinput" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3335c2b62e1e48dd927f6c8941705386e3697fa944aabcb10431bea7ee47ef3" +dependencies = [ + "lazy_static", + "log", + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-aux" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "207f67b28fe90fb596503a9bf0bf1ea5e831e21307658e177c5dfcdfc3ab8a0a" +dependencies = [ + "chrono", + "serde", + "serde-value", + "serde_json", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tempfile" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.0", +] + +[[package]] +name = "thiserror" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "pin-project-lite", + "slab", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "nu-ansi-term", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "uuid-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" +dependencies = [ + "outref", + "uuid", + "vsimd", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "serde", + "serde_json", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.12.4", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] diff --git a/packages/buttplug/Cargo.toml b/packages/buttplug/Cargo.toml new file mode 100644 index 0000000..fab9de4 --- /dev/null +++ b/packages/buttplug/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "buttplug_wasm" +version = "9.0.9" +authors = ["Nonpolynomial Labs, LLC "] +description = "WASM Interop for the Buttplug Intimate Hardware Control Library" +license = "BSD-3-Clause" +homepage = "http://buttplug.io" +repository = "https://github.com/buttplugio/buttplug.git" +readme = "./README.md" +keywords = ["usb", "serial", "hardware", "bluetooth", "teledildonics"] +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] +name = "buttplug_wasm" +path = "src/lib.rs" + +[dependencies] +buttplug = { version = "9.0.9", default-features = false, features = ["wasm"] } +# buttplug = { path = "../../../buttplug/buttplug", default-features = false, features = ["wasm"] } +# buttplug_derive = { path = "../buttplug_derive" } +js-sys = "0.3.80" +tracing-wasm = "0.2.1" +log-panics = { version = "2.1.0", features = ["with-backtrace"] } +console_error_panic_hook = "0.1.7" +wasmtimer = "0.4.3" +wasm-bindgen = { version = "0.2.103", features = ["serde-serialize"] } +tokio = { version = "1.47.1", features = ["sync", "macros", "io-util"] } +tokio-stream = "0.1.17" +tracing = "0.1.41" +tracing-futures = "0.2.5" +tracing-subscriber = { version = "0.3.20", features = ["json"] } +futures = "0.3.31" +futures-util = "0.3.31" +async-trait = "0.1.89" +wasm-bindgen-futures = "0.4.53" +getrandom = { version = "0.3", features = ["wasm_js"] } +parking_lot = { version = "0.11.1", features = ["wasm-bindgen"]} + +[dependencies.web-sys] +version = "0.3.80" +# path = "../../wasm-bindgen/crates/web-sys" +#git = "https://github.com/rustwasm/wasm-bindgen" +features = [ + "Navigator", + "Bluetooth", + "BluetoothDevice", + "BluetoothLeScanFilterInit", + "BluetoothRemoteGattCharacteristic", + "BluetoothRemoteGattServer", + "BluetoothRemoteGattService", + "BinaryType", + "Blob", + "console", + "ErrorEvent", + "Event", + "FileReader", + "MessageEvent", + "ProgressEvent", + "RequestDeviceOptions", + "WebSocket", + "Window" +] diff --git a/packages/buttplug/package.json b/packages/buttplug/package.json new file mode 100644 index 0000000..7512202 --- /dev/null +++ b/packages/buttplug/package.json @@ -0,0 +1,27 @@ +{ + "name": "@sexy.pivoine.art/buttplug", + "version": "1.0.0", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "vite build", + "build:wasm": "wasm-pack build --out-dir wasm --out-name index --target bundler --release" + }, + "dependencies": { + "class-transformer": "^0.5.1", + "eventemitter3": "^5.0.1", + "reflect-metadata": "^0.2.2", + "typescript": "^5.9.2", + "vite": "^7.1.4", + "vite-plugin-wasm": "3.5.0", + "ws": "^8.18.3" + }, + "devDependencies": { + "wasm-pack": "^0.13.1" + } +} diff --git a/packages/buttplug/src/client/ButtplugBrowserWebsocketClientConnector.ts b/packages/buttplug/src/client/ButtplugBrowserWebsocketClientConnector.ts new file mode 100644 index 0000000..00ce763 --- /dev/null +++ b/packages/buttplug/src/client/ButtplugBrowserWebsocketClientConnector.ts @@ -0,0 +1,25 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; + +import { IButtplugClientConnector } from "./IButtplugClientConnector"; +import { ButtplugMessage } from "../core/Messages"; +import { ButtplugBrowserWebsocketConnector } from "../utils/ButtplugBrowserWebsocketConnector"; + +export class ButtplugBrowserWebsocketClientConnector + extends ButtplugBrowserWebsocketConnector + implements IButtplugClientConnector +{ + public send = (msg: ButtplugMessage): void => { + if (!this.Connected) { + throw new Error("ButtplugClient not connected"); + } + this.sendMessage(msg); + }; +} diff --git a/packages/buttplug/src/client/ButtplugClientConnectorException.ts b/packages/buttplug/src/client/ButtplugClientConnectorException.ts new file mode 100644 index 0000000..406f132 --- /dev/null +++ b/packages/buttplug/src/client/ButtplugClientConnectorException.ts @@ -0,0 +1,16 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +import { ButtplugError } from "../core/Exceptions"; +import * as Messages from "../core/Messages"; + +export class ButtplugClientConnectorException extends ButtplugError { + public constructor(message: string) { + super(message, Messages.ErrorClass.ERROR_UNKNOWN); + } +} diff --git a/packages/buttplug/src/client/ButtplugClientDevice.ts b/packages/buttplug/src/client/ButtplugClientDevice.ts new file mode 100644 index 0000000..8a1a7ba --- /dev/null +++ b/packages/buttplug/src/client/ButtplugClientDevice.ts @@ -0,0 +1,401 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; +import * as Messages from "../core/Messages"; +import { + ButtplugDeviceError, + ButtplugError, + ButtplugMessageError, +} from "../core/Exceptions"; +import { EventEmitter } from "eventemitter3"; +import { getMessageClassFromMessage } from "../core/MessageUtils"; + +/** + * Represents an abstract device, capable of taking certain kinds of messages. + */ +export class ButtplugClientDevice extends EventEmitter { + /** + * Return the name of the device. + */ + public get name(): string { + return this._deviceInfo.DeviceName; + } + + /** + * Return the user set name of the device. + */ + public get displayName(): string | undefined { + return this._deviceInfo.DeviceDisplayName; + } + + /** + * Return the index of the device. + */ + public get index(): number { + return this._deviceInfo.DeviceIndex; + } + + /** + * Return the index of the device. + */ + public get messageTimingGap(): number | undefined { + return this._deviceInfo.DeviceMessageTimingGap; + } + + /** + * Return a list of message types the device accepts. + */ + public get messageAttributes(): Messages.MessageAttributes { + return this._deviceInfo.DeviceMessages; + } + + public static fromMsg( + msg: Messages.DeviceInfo, + sendClosure: ( + device: ButtplugClientDevice, + msg: Messages.ButtplugDeviceMessage, + ) => Promise, + ): ButtplugClientDevice { + return new ButtplugClientDevice(msg, sendClosure); + } + + // Map of messages and their attributes (feature count, etc...) + private allowedMsgs: Map = new Map< + string, + Messages.MessageAttributes + >(); + + /** + * @param _index Index of the device, as created by the device manager. + * @param _name Name of the device. + * @param allowedMsgs Buttplug messages the device can receive. + */ + constructor( + private _deviceInfo: Messages.DeviceInfo, + private _sendClosure: ( + device: ButtplugClientDevice, + msg: Messages.ButtplugDeviceMessage, + ) => Promise, + ) { + super(); + _deviceInfo.DeviceMessages.update(); + } + + public async send( + msg: Messages.ButtplugDeviceMessage, + ): Promise { + // Assume we're getting the closure from ButtplugClient, which does all of + // the index/existence/connection/message checks for us. + return await this._sendClosure(this, msg); + } + + public async sendExpectOk( + msg: Messages.ButtplugDeviceMessage, + ): Promise { + const response = await this.send(msg); + switch (getMessageClassFromMessage(response)) { + case Messages.Ok: + return; + case Messages.Error: + throw ButtplugError.FromError(response as Messages.Error); + default: + throw new ButtplugMessageError( + `Message type ${response.constructor} not handled by SendMsgExpectOk`, + ); + } + } + + public async scalar( + scalar: Messages.ScalarSubcommand | Messages.ScalarSubcommand[], + ): Promise { + if (Array.isArray(scalar)) { + await this.sendExpectOk(new Messages.ScalarCmd(scalar, this.index)); + } else { + await this.sendExpectOk(new Messages.ScalarCmd([scalar], this.index)); + } + } + + private async scalarCommandBuilder( + speed: number | number[], + actuator: Messages.ActuatorType, + ) { + const scalarAttrs = this.messageAttributes.ScalarCmd?.filter( + (x) => x.ActuatorType === actuator, + ); + if (!scalarAttrs || scalarAttrs.length === 0) { + throw new ButtplugDeviceError( + `Device ${this.name} has no ${actuator} capabilities`, + ); + } + const cmds: Messages.ScalarSubcommand[] = []; + if (typeof speed === "number") { + scalarAttrs.forEach((x) => + cmds.push(new Messages.ScalarSubcommand(x.Index, speed, actuator)), + ); + } else if (Array.isArray(speed)) { + if (speed.length > scalarAttrs.length) { + throw new ButtplugDeviceError( + `${speed.length} commands send to a device with ${scalarAttrs.length} vibrators`, + ); + } + scalarAttrs.forEach((x, i) => { + cmds.push(new Messages.ScalarSubcommand(x.Index, speed[i], actuator)); + }); + } else { + throw new ButtplugDeviceError( + `${actuator} can only take numbers or arrays of numbers.`, + ); + } + await this.scalar(cmds); + } + + public get vibrateAttributes(): Messages.GenericDeviceMessageAttributes[] { + return ( + this.messageAttributes.ScalarCmd?.filter( + (x) => x.ActuatorType === Messages.ActuatorType.Vibrate, + ) ?? [] + ); + } + + public async vibrate(speed: number | number[]): Promise { + await this.scalarCommandBuilder(speed, Messages.ActuatorType.Vibrate); + } + + public get oscillateAttributes(): Messages.GenericDeviceMessageAttributes[] { + return ( + this.messageAttributes.ScalarCmd?.filter( + (x) => x.ActuatorType === Messages.ActuatorType.Oscillate, + ) ?? [] + ); + } + + public async oscillate(speed: number | number[]): Promise { + await this.scalarCommandBuilder(speed, Messages.ActuatorType.Oscillate); + } + + public get rotateAttributes(): Messages.GenericDeviceMessageAttributes[] { + return this.messageAttributes.RotateCmd ?? []; + } + + public async rotate( + values: number | [number, boolean][], + clockwise?: boolean, + ): Promise { + const rotateAttrs = this.messageAttributes.RotateCmd; + if (!rotateAttrs || rotateAttrs.length === 0) { + throw new ButtplugDeviceError( + `Device ${this.name} has no Rotate capabilities`, + ); + } + let msg: Messages.RotateCmd; + if (typeof values === "number") { + msg = Messages.RotateCmd.Create( + this.index, + new Array(rotateAttrs.length).fill([values, clockwise]), + ); + } else if (Array.isArray(values)) { + msg = Messages.RotateCmd.Create(this.index, values); + } else { + throw new ButtplugDeviceError( + "SendRotateCmd can only take a number and boolean, or an array of number/boolean tuples", + ); + } + await this.sendExpectOk(msg); + } + + public get linearAttributes(): Messages.GenericDeviceMessageAttributes[] { + return this.messageAttributes.LinearCmd ?? []; + } + + public async linear( + values: number | [number, number][], + duration?: number, + ): Promise { + const linearAttrs = this.messageAttributes.LinearCmd; + if (!linearAttrs || linearAttrs.length === 0) { + throw new ButtplugDeviceError( + `Device ${this.name} has no Linear capabilities`, + ); + } + let msg: Messages.LinearCmd; + if (typeof values === "number") { + msg = Messages.LinearCmd.Create( + this.index, + new Array(linearAttrs.length).fill([values, duration]), + ); + } else if (Array.isArray(values)) { + msg = Messages.LinearCmd.Create(this.index, values); + } else { + throw new ButtplugDeviceError( + "SendLinearCmd can only take a number and number, or an array of number/number tuples", + ); + } + await this.sendExpectOk(msg); + } + + public async sensorRead( + sensorIndex: number, + sensorType: Messages.SensorType, + ): Promise { + const response = await this.send( + new Messages.SensorReadCmd(this.index, sensorIndex, sensorType), + ); + switch (getMessageClassFromMessage(response)) { + case Messages.SensorReading: + return (response as Messages.SensorReading).Data; + case Messages.Error: + throw ButtplugError.FromError(response as Messages.Error); + default: + throw new ButtplugMessageError( + `Message type ${response.constructor} not handled by sensorRead`, + ); + } + } + + public get hasBattery(): boolean { + const batteryAttrs = this.messageAttributes.SensorReadCmd?.filter( + (x) => x.SensorType === Messages.SensorType.Battery, + ); + return batteryAttrs !== undefined && batteryAttrs.length > 0; + } + + public async battery(): Promise { + if (!this.hasBattery) { + throw new ButtplugDeviceError( + `Device ${this.name} has no Battery capabilities`, + ); + } + const batteryAttrs = this.messageAttributes.SensorReadCmd?.filter( + (x) => x.SensorType === Messages.SensorType.Battery, + ); + // Find the battery sensor, we'll need its index. + const result = await this.sensorRead( + batteryAttrs![0].Index, + Messages.SensorType.Battery, + ); + return result[0] / 100.0; + } + + public get hasRssi(): boolean { + const rssiAttrs = this.messageAttributes.SensorReadCmd?.filter( + (x) => x.SensorType === Messages.SensorType.RSSI, + ); + return rssiAttrs !== undefined && rssiAttrs.length === 0; + } + + public async rssi(): Promise { + if (!this.hasRssi) { + throw new ButtplugDeviceError( + `Device ${this.name} has no RSSI capabilities`, + ); + } + const rssiAttrs = this.messageAttributes.SensorReadCmd?.filter( + (x) => x.SensorType === Messages.SensorType.RSSI, + ); + // Find the battery sensor, we'll need its index. + const result = await this.sensorRead( + rssiAttrs![0].Index, + Messages.SensorType.RSSI, + ); + return result[0]; + } + + public async rawRead( + endpoint: string, + expectedLength: number, + timeout: number, + ): Promise { + if (!this.messageAttributes.RawReadCmd) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw read capabilities`, + ); + } + if (this.messageAttributes.RawReadCmd.Endpoints.indexOf(endpoint) === -1) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw readable endpoint ${endpoint}`, + ); + } + const response = await this.send( + new Messages.RawReadCmd(this.index, endpoint, expectedLength, timeout), + ); + switch (getMessageClassFromMessage(response)) { + case Messages.RawReading: + return new Uint8Array((response as Messages.RawReading).Data); + case Messages.Error: + throw ButtplugError.FromError(response as Messages.Error); + default: + throw new ButtplugMessageError( + `Message type ${response.constructor} not handled by rawRead`, + ); + } + } + + public async rawWrite( + endpoint: string, + data: Uint8Array, + writeWithResponse: boolean, + ): Promise { + if (!this.messageAttributes.RawWriteCmd) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw write capabilities`, + ); + } + if (this.messageAttributes.RawWriteCmd.Endpoints.indexOf(endpoint) === -1) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw writable endpoint ${endpoint}`, + ); + } + await this.sendExpectOk( + new Messages.RawWriteCmd(this.index, endpoint, data, writeWithResponse), + ); + } + + public async rawSubscribe(endpoint: string): Promise { + if (!this.messageAttributes.RawSubscribeCmd) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw subscribe capabilities`, + ); + } + if ( + this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(endpoint) === -1 + ) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw subscribable endpoint ${endpoint}`, + ); + } + await this.sendExpectOk(new Messages.RawSubscribeCmd(this.index, endpoint)); + } + + public async rawUnsubscribe(endpoint: string): Promise { + // This reuses raw subscribe's info. + if (!this.messageAttributes.RawSubscribeCmd) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw unsubscribe capabilities`, + ); + } + if ( + this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(endpoint) === -1 + ) { + throw new ButtplugDeviceError( + `Device ${this.name} has no raw unsubscribable endpoint ${endpoint}`, + ); + } + await this.sendExpectOk( + new Messages.RawUnsubscribeCmd(this.index, endpoint), + ); + } + + public async stop(): Promise { + await this.sendExpectOk(new Messages.StopDeviceCmd(this.index)); + } + + public emitDisconnected() { + this.emit("deviceremoved"); + } +} diff --git a/packages/buttplug/src/client/ButtplugNodeWebsocketClientConnector.ts b/packages/buttplug/src/client/ButtplugNodeWebsocketClientConnector.ts new file mode 100644 index 0000000..f255b04 --- /dev/null +++ b/packages/buttplug/src/client/ButtplugNodeWebsocketClientConnector.ts @@ -0,0 +1,17 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; + +import { ButtplugBrowserWebsocketClientConnector } from "./ButtplugBrowserWebsocketClientConnector"; +import { WebSocket as NodeWebSocket } from "ws"; + +export class ButtplugNodeWebsocketClientConnector extends ButtplugBrowserWebsocketClientConnector { + protected _websocketConstructor = + NodeWebSocket as unknown as typeof WebSocket; +} diff --git a/packages/buttplug/src/client/Client.ts b/packages/buttplug/src/client/Client.ts new file mode 100644 index 0000000..754e413 --- /dev/null +++ b/packages/buttplug/src/client/Client.ts @@ -0,0 +1,276 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; + +import { ButtplugLogger } from "../core/Logging"; +import { EventEmitter } from "eventemitter3"; +import { ButtplugClientDevice } from "./ButtplugClientDevice"; +import { IButtplugClientConnector } from "./IButtplugClientConnector"; +import { ButtplugMessageSorter } from "../utils/ButtplugMessageSorter"; + +import * as Messages from "../core/Messages"; +import { + ButtplugDeviceError, + ButtplugError, + ButtplugInitError, + ButtplugMessageError, +} from "../core/Exceptions"; +import { ButtplugClientConnectorException } from "./ButtplugClientConnectorException"; +import { getMessageClassFromMessage } from "../core/MessageUtils"; + +export class ButtplugClient extends EventEmitter { + protected _pingTimer: NodeJS.Timeout | null = null; + protected _connector: IButtplugClientConnector | null = null; + protected _devices: Map = new Map(); + protected _clientName: string; + protected _logger = ButtplugLogger.Logger; + protected _isScanning = false; + private _sorter: ButtplugMessageSorter = new ButtplugMessageSorter(true); + + constructor(clientName = "Generic Buttplug Client") { + super(); + this._clientName = clientName; + this._logger.Debug(`ButtplugClient: Client ${clientName} created.`); + } + + public get connected(): boolean { + return this._connector !== null && this._connector.Connected; + } + + public get devices(): ButtplugClientDevice[] { + // While this function doesn't actually send a message, if we don't have a + // connector, we shouldn't have devices. + this.checkConnector(); + const devices: ButtplugClientDevice[] = []; + this._devices.forEach((d) => { + devices.push(d); + }); + return devices; + } + + public get isScanning(): boolean { + return this._isScanning; + } + + public connect = async (connector: IButtplugClientConnector) => { + this._logger.Info( + `ButtplugClient: Connecting using ${connector.constructor.name}`, + ); + await connector.connect(); + this._connector = connector; + this._connector.addListener("message", this.parseMessages); + this._connector.addListener("disconnect", this.disconnectHandler); + await this.initializeConnection(); + }; + + public disconnect = async () => { + this._logger.Debug("ButtplugClient: Disconnect called"); + this.checkConnector(); + await this.shutdownConnection(); + await this._connector!.disconnect(); + }; + + public startScanning = async () => { + this._logger.Debug("ButtplugClient: StartScanning called"); + this._isScanning = true; + await this.sendMsgExpectOk(new Messages.StartScanning()); + }; + + public stopScanning = async () => { + this._logger.Debug("ButtplugClient: StopScanning called"); + this._isScanning = false; + await this.sendMsgExpectOk(new Messages.StopScanning()); + }; + + public stopAllDevices = async () => { + this._logger.Debug("ButtplugClient: StopAllDevices"); + await this.sendMsgExpectOk(new Messages.StopAllDevices()); + }; + + private async sendDeviceMessage( + device: ButtplugClientDevice, + deviceMsg: Messages.ButtplugDeviceMessage, + ): Promise { + this.checkConnector(); + const dev = this._devices.get(device.index); + if (dev === undefined) { + throw ButtplugError.LogAndError( + ButtplugDeviceError, + this._logger, + `Device ${device.index} not available.`, + ); + } + deviceMsg.DeviceIndex = device.index; + return await this.sendMessage(deviceMsg); + } + + protected disconnectHandler = () => { + this._logger.Info("ButtplugClient: Disconnect event receieved."); + this.emit("disconnect"); + }; + + protected parseMessages = (msgs: Messages.ButtplugMessage[]) => { + const leftoverMsgs = this._sorter.ParseIncomingMessages(msgs); + for (const x of leftoverMsgs) { + switch (getMessageClassFromMessage(x)) { + case Messages.DeviceAdded: { + const addedMsg = x as Messages.DeviceAdded; + const addedDevice = ButtplugClientDevice.fromMsg( + addedMsg, + this.sendDeviceMessageClosure, + ); + this._devices.set(addedMsg.DeviceIndex, addedDevice); + this.emit("deviceadded", addedMsg, addedDevice); + break; + } + case Messages.DeviceRemoved: { + const removedMsg = x as Messages.DeviceRemoved; + if (this._devices.has(removedMsg.DeviceIndex)) { + const removedDevice = this._devices.get(removedMsg.DeviceIndex); + removedDevice?.emitDisconnected(); + this._devices.delete(removedMsg.DeviceIndex); + this.emit("deviceremoved", removedMsg, removedDevice); + } + break; + } + case Messages.ScanningFinished: + this._isScanning = false; + this.emit("scanningfinished", x); + break; + } + } + }; + + protected initializeConnection = async (): Promise => { + this.checkConnector(); + const msg = await this.sendMessage( + new Messages.RequestServerInfo( + this._clientName, + Messages.MESSAGE_SPEC_VERSION, + ), + ); + switch (getMessageClassFromMessage(msg)) { + case Messages.ServerInfo: { + const serverinfo = msg as Messages.ServerInfo; + this._logger.Info( + `ButtplugClient: Connected to Server ${serverinfo.ServerName}`, + ); + // TODO: maybe store server name, do something with message template version? + const ping = serverinfo.MaxPingTime; + if (serverinfo.MessageVersion < Messages.MESSAGE_SPEC_VERSION) { + // Disconnect and throw an exception explaining the version mismatch problem. + await this._connector!.disconnect(); + throw ButtplugError.LogAndError( + ButtplugInitError, + this._logger, + `Server protocol version ${serverinfo.MessageVersion} is older than client protocol version ${Messages.MESSAGE_SPEC_VERSION}. Please update server.`, + ); + } + if (ping > 0) { + /* + this._pingTimer = setInterval(async () => { + // If we've disconnected, stop trying to ping the server. + if (!this.Connected) { + await this.ShutdownConnection(); + return; + } + await this.SendMessage(new Messages.Ping()); + } , Math.round(ping / 2)); + */ + } + await this.requestDeviceList(); + return true; + } + case Messages.Error: { + // Disconnect and throw an exception with the error message we got back. + // This will usually only error out if we have a version mismatch that the + // server has detected. + await this._connector!.disconnect(); + const err = msg as Messages.Error; + throw ButtplugError.LogAndError( + ButtplugInitError, + this._logger, + `Cannot connect to server. ${err.ErrorMessage}`, + ); + } + } + return false; + }; + + protected requestDeviceList = async () => { + this.checkConnector(); + this._logger.Debug("ButtplugClient: ReceiveDeviceList called"); + const deviceList = (await this.sendMessage( + new Messages.RequestDeviceList(), + )) as Messages.DeviceList; + deviceList.Devices.forEach((d) => { + if (!this._devices.has(d.DeviceIndex)) { + const device = ButtplugClientDevice.fromMsg( + d, + this.sendDeviceMessageClosure, + ); + this._logger.Debug(`ButtplugClient: Adding Device: ${device}`); + this._devices.set(d.DeviceIndex, device); + this.emit("deviceadded", device); + } else { + this._logger.Debug(`ButtplugClient: Device already added: ${d}`); + } + }); + }; + + protected shutdownConnection = async () => { + await this.stopAllDevices(); + if (this._pingTimer !== null) { + clearInterval(this._pingTimer); + this._pingTimer = null; + } + }; + + protected async sendMessage( + msg: Messages.ButtplugMessage, + ): Promise { + this.checkConnector(); + const p = this._sorter.PrepareOutgoingMessage(msg); + await this._connector!.send(msg); + return await p; + } + + protected checkConnector() { + if (!this.connected) { + throw new ButtplugClientConnectorException( + "ButtplugClient not connected", + ); + } + } + + protected sendMsgExpectOk = async ( + msg: Messages.ButtplugMessage, + ): Promise => { + const response = await this.sendMessage(msg); + switch (getMessageClassFromMessage(response)) { + case Messages.Ok: + return; + case Messages.Error: + throw ButtplugError.FromError(response as Messages.Error); + default: + throw ButtplugError.LogAndError( + ButtplugMessageError, + this._logger, + `Message type ${getMessageClassFromMessage(response)!.constructor} not handled by SendMsgExpectOk`, + ); + } + }; + + protected sendDeviceMessageClosure = async ( + device: ButtplugClientDevice, + msg: Messages.ButtplugDeviceMessage, + ): Promise => { + return await this.sendDeviceMessage(device, msg); + }; +} diff --git a/packages/buttplug/src/client/IButtplugClientConnector.ts b/packages/buttplug/src/client/IButtplugClientConnector.ts new file mode 100644 index 0000000..731df34 --- /dev/null +++ b/packages/buttplug/src/client/IButtplugClientConnector.ts @@ -0,0 +1,18 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +import { ButtplugMessage } from "../core/Messages"; +import { EventEmitter } from "eventemitter3"; + +export interface IButtplugClientConnector extends EventEmitter { + connect: () => Promise; + disconnect: () => Promise; + initialize: () => Promise; + send: (msg: ButtplugMessage) => void; + readonly Connected: boolean; +} diff --git a/packages/buttplug/src/core/Exceptions.ts b/packages/buttplug/src/core/Exceptions.ts new file mode 100644 index 0000000..2f9dfa5 --- /dev/null +++ b/packages/buttplug/src/core/Exceptions.ts @@ -0,0 +1,101 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +import * as Messages from "./Messages"; +import { ButtplugLogger } from "./Logging"; + +export class ButtplugError extends Error { + public get ErrorClass(): Messages.ErrorClass { + return this.errorClass; + } + + public get InnerError(): Error | undefined { + return this.innerError; + } + + public get Id(): number | undefined { + return this.messageId; + } + + public get ErrorMessage(): Messages.ButtplugMessage { + return new Messages.Error(this.message, this.ErrorClass, this.Id); + } + + public static LogAndError( + constructor: new (str: string, num: number) => T, + logger: ButtplugLogger, + message: string, + id: number = Messages.SYSTEM_MESSAGE_ID, + ): T { + logger.Error(message); + return new constructor(message, id); + } + + public static FromError(error: Messages.Error) { + switch (error.ErrorCode) { + case Messages.ErrorClass.ERROR_DEVICE: + return new ButtplugDeviceError(error.ErrorMessage, error.Id); + case Messages.ErrorClass.ERROR_INIT: + return new ButtplugInitError(error.ErrorMessage, error.Id); + case Messages.ErrorClass.ERROR_UNKNOWN: + return new ButtplugUnknownError(error.ErrorMessage, error.Id); + case Messages.ErrorClass.ERROR_PING: + return new ButtplugPingError(error.ErrorMessage, error.Id); + case Messages.ErrorClass.ERROR_MSG: + return new ButtplugMessageError(error.ErrorMessage, error.Id); + default: + throw new Error(`Message type ${error.ErrorCode} not handled`); + } + } + + public errorClass: Messages.ErrorClass = Messages.ErrorClass.ERROR_UNKNOWN; + public innerError: Error | undefined; + public messageId: number | undefined; + + protected constructor( + message: string, + errorClass: Messages.ErrorClass, + id: number = Messages.SYSTEM_MESSAGE_ID, + inner?: Error, + ) { + super(message); + this.errorClass = errorClass; + this.innerError = inner; + this.messageId = id; + } +} + +export class ButtplugInitError extends ButtplugError { + public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) { + super(message, Messages.ErrorClass.ERROR_INIT, id); + } +} + +export class ButtplugDeviceError extends ButtplugError { + public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) { + super(message, Messages.ErrorClass.ERROR_DEVICE, id); + } +} + +export class ButtplugMessageError extends ButtplugError { + public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) { + super(message, Messages.ErrorClass.ERROR_MSG, id); + } +} + +export class ButtplugPingError extends ButtplugError { + public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) { + super(message, Messages.ErrorClass.ERROR_PING, id); + } +} + +export class ButtplugUnknownError extends ButtplugError { + public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) { + super(message, Messages.ErrorClass.ERROR_UNKNOWN, id); + } +} diff --git a/packages/buttplug/src/core/Logging.ts b/packages/buttplug/src/core/Logging.ts new file mode 100644 index 0000000..abcbb50 --- /dev/null +++ b/packages/buttplug/src/core/Logging.ts @@ -0,0 +1,195 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +import { EventEmitter } from "eventemitter3"; + +export enum ButtplugLogLevel { + Off, + Error, + Warn, + Info, + Debug, + Trace, +} + +/** + * Representation of log messages for the internal logging utility. + */ +export class LogMessage { + /** Timestamp for the log message */ + private timestamp: string; + + /** Log Message */ + private logMessage: string; + + /** Log Level */ + private logLevel: ButtplugLogLevel; + + /** + * @param logMessage Log message. + * @param logLevel: Log severity level. + */ + public constructor(logMessage: string, logLevel: ButtplugLogLevel) { + const a = new Date(); + const hour = a.getHours(); + const min = a.getMinutes(); + const sec = a.getSeconds(); + this.timestamp = `${hour}:${min}:${sec}`; + this.logMessage = logMessage; + this.logLevel = logLevel; + } + + /** + * Returns the log message. + */ + public get Message() { + return this.logMessage; + } + + /** + * Returns the log message level. + */ + public get LogLevel() { + return this.logLevel; + } + + /** + * Returns the log message timestamp. + */ + public get Timestamp() { + return this.timestamp; + } + + /** + * Returns a formatted string with timestamp, level, and message. + */ + public get FormattedMessage() { + return `${ButtplugLogLevel[this.logLevel]} : ${this.timestamp} : ${this.logMessage}`; + } +} + +/** + * Simple, global logging utility for the Buttplug client and server. Keeps an + * internal static reference to an instance of itself (singleton pattern, + * basically), and allows message logging throughout the module. + */ +export class ButtplugLogger extends EventEmitter { + /** Singleton instance for the logger */ + protected static sLogger: ButtplugLogger | undefined = undefined; + /** Sets maximum log level to log to console */ + protected maximumConsoleLogLevel: ButtplugLogLevel = ButtplugLogLevel.Off; + /** Sets maximum log level for all log messages */ + protected maximumEventLogLevel: ButtplugLogLevel = ButtplugLogLevel.Off; + + /** + * Returns the stored static instance of the logger, creating one if it + * doesn't currently exist. + */ + public static get Logger(): ButtplugLogger { + if (ButtplugLogger.sLogger === undefined) { + ButtplugLogger.sLogger = new ButtplugLogger(); + } + return this.sLogger!; + } + + /** + * Constructor. Can only be called internally since we regulate ButtplugLogger + * ownership. + */ + protected constructor() { + super(); + } + + /** + * Set the maximum log level to output to console. + */ + public get MaximumConsoleLogLevel() { + return this.maximumConsoleLogLevel; + } + + /** + * Get the maximum log level to output to console. + */ + public set MaximumConsoleLogLevel(buttplugLogLevel: ButtplugLogLevel) { + this.maximumConsoleLogLevel = buttplugLogLevel; + } + + /** + * Set the global maximum log level + */ + public get MaximumEventLogLevel() { + return this.maximumEventLogLevel; + } + + /** + * Get the global maximum log level + */ + public set MaximumEventLogLevel(logLevel: ButtplugLogLevel) { + this.maximumEventLogLevel = logLevel; + } + + /** + * Log new message at Error level. + */ + public Error(msg: string) { + this.AddLogMessage(msg, ButtplugLogLevel.Error); + } + + /** + * Log new message at Warn level. + */ + public Warn(msg: string) { + this.AddLogMessage(msg, ButtplugLogLevel.Warn); + } + + /** + * Log new message at Info level. + */ + public Info(msg: string) { + this.AddLogMessage(msg, ButtplugLogLevel.Info); + } + + /** + * Log new message at Debug level. + */ + public Debug(msg: string) { + this.AddLogMessage(msg, ButtplugLogLevel.Debug); + } + + /** + * Log new message at Trace level. + */ + public Trace(msg: string) { + this.AddLogMessage(msg, ButtplugLogLevel.Trace); + } + + /** + * Checks to see if message should be logged, and if so, adds message to the + * log buffer. May also print message and emit event. + */ + protected AddLogMessage(msg: string, level: ButtplugLogLevel) { + // If nothing wants the log message we have, ignore it. + if ( + level > this.maximumEventLogLevel && + level > this.maximumConsoleLogLevel + ) { + return; + } + const logMsg = new LogMessage(msg, level); + // Clients and console logging may have different needs. For instance, it + // could be that the client requests trace level, while all we want in the + // console is info level. This makes sure the client can't also spam the + // console. + if (level <= this.maximumConsoleLogLevel) { + console.log(logMsg.FormattedMessage); + } + if (level <= this.maximumEventLogLevel) { + this.emit("log", logMsg); + } + } +} diff --git a/packages/buttplug/src/core/MessageUtils.ts b/packages/buttplug/src/core/MessageUtils.ts new file mode 100644 index 0000000..7981b00 --- /dev/null +++ b/packages/buttplug/src/core/MessageUtils.ts @@ -0,0 +1,48 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; +import { plainToInstance } from "class-transformer"; +import * as Messages from "./Messages"; + +function getMessageClass( + type: string, +): (new (...args: unknown[]) => Messages.ButtplugMessage) | null { + for (const value of Object.values(Messages)) { + if (typeof value === "function" && "Name" in value && value.Name === type) { + return value; + } + } + return null; +} + +export function getMessageClassFromMessage( + msg: Messages.ButtplugMessage, +): (new (...args: unknown[]) => Messages.ButtplugMessage) | null { + // Making the bold assumption all message classes have the Name static. Should define a + // requirement for this in the abstract class. + return getMessageClass(Object.getPrototypeOf(msg).constructor.Name); +} + +export function fromJSON(str): Messages.ButtplugMessage[] { + const msgarray: object[] = JSON.parse(str); + const msgs: Messages.ButtplugMessage[] = []; + for (const x of Array.from(msgarray)) { + const type = Object.getOwnPropertyNames(x)[0]; + const cls = getMessageClass(type); + if (cls) { + const msg = plainToInstance( + cls, + x[type], + ); + msg.update(); + msgs.push(msg); + } + } + return msgs; +} diff --git a/packages/buttplug/src/core/Messages.ts b/packages/buttplug/src/core/Messages.ts new file mode 100644 index 0000000..9e84fda --- /dev/null +++ b/packages/buttplug/src/core/Messages.ts @@ -0,0 +1,491 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +// tslint:disable:max-classes-per-file +"use strict"; + +import { instanceToPlain, Type } from "class-transformer"; +import "reflect-metadata"; + +export const SYSTEM_MESSAGE_ID = 0; +export const DEFAULT_MESSAGE_ID = 1; +export const MAX_ID = 4294967295; +export const MESSAGE_SPEC_VERSION = 3; + +export class MessageAttributes { + public ScalarCmd?: Array; + public RotateCmd?: Array; + public LinearCmd?: Array; + public RawReadCmd?: RawDeviceMessageAttributes; + public RawWriteCmd?: RawDeviceMessageAttributes; + public RawSubscribeCmd?: RawDeviceMessageAttributes; + public SensorReadCmd?: Array; + public SensorSubscribeCmd?: Array; + public StopDeviceCmd: {}; + + constructor(data: Partial) { + Object.assign(this, data); + } + + public update() { + this.ScalarCmd?.forEach((x, i) => (x.Index = i)); + this.RotateCmd?.forEach((x, i) => (x.Index = i)); + this.LinearCmd?.forEach((x, i) => (x.Index = i)); + this.SensorReadCmd?.forEach((x, i) => (x.Index = i)); + this.SensorSubscribeCmd?.forEach((x, i) => (x.Index = i)); + } +} + +export enum ActuatorType { + Unknown = "Unknown", + Vibrate = "Vibrate", + Rotate = "Rotate", + Oscillate = "Oscillate", + Constrict = "Constrict", + Inflate = "Inflate", + Position = "Position", +} + +export enum SensorType { + Unknown = "Unknown", + Battery = "Battery", + RSSI = "RSSI", + Button = "Button", + Pressure = "Pressure", + // Temperature, + // Accelerometer, + // Gyro, +} + +export class GenericDeviceMessageAttributes { + public FeatureDescriptor: string; + public ActuatorType: ActuatorType; + public StepCount: number; + public Index = 0; + constructor(data: Partial) { + Object.assign(this, data); + } +} + +export class RawDeviceMessageAttributes { + constructor(public Endpoints: Array) {} +} + +export class SensorDeviceMessageAttributes { + public FeatureDescriptor: string; + public SensorType: SensorType; + public StepRange: Array; + public Index = 0; + constructor(data: Partial) { + Object.assign(this, data); + } +} + +export abstract class ButtplugMessage { + constructor(public Id: number) {} + + // tslint:disable-next-line:ban-types + public get Type(): Function { + return this.constructor; + } + + public toJSON(): string { + return JSON.stringify(this.toProtocolFormat()); + } + + public toProtocolFormat(): object { + const jsonObj = {}; + jsonObj[(this.constructor as unknown as { Name: string }).Name] = + instanceToPlain(this); + return jsonObj; + } + + public update() {} +} + +export abstract class ButtplugDeviceMessage extends ButtplugMessage { + constructor( + public DeviceIndex: number, + public Id: number, + ) { + super(Id); + } +} + +export abstract class ButtplugSystemMessage extends ButtplugMessage { + constructor(public Id: number = SYSTEM_MESSAGE_ID) { + super(Id); + } +} + +export class Ok extends ButtplugSystemMessage { + static Name = "Ok"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export class Ping extends ButtplugMessage { + static Name = "Ping"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export enum ErrorClass { + ERROR_UNKNOWN, + ERROR_INIT, + ERROR_PING, + ERROR_MSG, + ERROR_DEVICE, +} + +export class Error extends ButtplugMessage { + static Name = "Error"; + + constructor( + public ErrorMessage: string, + public ErrorCode: ErrorClass = ErrorClass.ERROR_UNKNOWN, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(Id); + } + + get Schemversion() { + return 0; + } +} + +export class DeviceInfo { + public DeviceIndex: number; + public DeviceName: string; + @Type(() => MessageAttributes) + public DeviceMessages: MessageAttributes; + public DeviceDisplayName?: string; + public DeviceMessageTimingGap?: number; + + constructor(data: Partial) { + Object.assign(this, data); + } +} + +export class DeviceList extends ButtplugMessage { + static Name = "DeviceList"; + + @Type(() => DeviceInfo) + public Devices: DeviceInfo[]; + public Id: number; + + constructor(devices: DeviceInfo[], id: number = DEFAULT_MESSAGE_ID) { + super(id); + this.Devices = devices; + this.Id = id; + } + + public update() { + for (const device of this.Devices) { + device.DeviceMessages.update(); + } + } +} + +export class DeviceAdded extends ButtplugSystemMessage { + static Name = "DeviceAdded"; + + public DeviceIndex: number; + public DeviceName: string; + @Type(() => MessageAttributes) + public DeviceMessages: MessageAttributes; + public DeviceDisplayName?: string; + public DeviceMessageTimingGap?: number; + + constructor(data: Partial) { + super(); + Object.assign(this, data); + } + + public update() { + this.DeviceMessages.update(); + } +} + +export class DeviceRemoved extends ButtplugSystemMessage { + static Name = "DeviceRemoved"; + + constructor(public DeviceIndex: number) { + super(); + } +} + +export class RequestDeviceList extends ButtplugMessage { + static Name = "RequestDeviceList"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export class StartScanning extends ButtplugMessage { + static Name = "StartScanning"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export class StopScanning extends ButtplugMessage { + static Name = "StopScanning"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export class ScanningFinished extends ButtplugSystemMessage { + static Name = "ScanningFinished"; + + constructor() { + super(); + } +} + +export class RequestServerInfo extends ButtplugMessage { + static Name = "RequestServerInfo"; + + constructor( + public ClientName: string, + public MessageVersion: number = 0, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(Id); + } +} + +export class ServerInfo extends ButtplugSystemMessage { + static Name = "ServerInfo"; + + constructor( + public MessageVersion: number, + public MaxPingTime: number, + public ServerName: string, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(); + } +} + +export class StopDeviceCmd extends ButtplugDeviceMessage { + static Name = "StopDeviceCmd"; + + constructor( + public DeviceIndex: number = -1, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class StopAllDevices extends ButtplugMessage { + static Name = "StopAllDevices"; + + constructor(public Id: number = DEFAULT_MESSAGE_ID) { + super(Id); + } +} + +export class GenericMessageSubcommand { + protected constructor(public Index: number) {} +} + +export class ScalarSubcommand extends GenericMessageSubcommand { + constructor( + Index: number, + public Scalar: number, + public ActuatorType: ActuatorType, + ) { + super(Index); + } +} + +export class ScalarCmd extends ButtplugDeviceMessage { + static Name = "ScalarCmd"; + + constructor( + public Scalars: ScalarSubcommand[], + public DeviceIndex: number = -1, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RotateSubcommand extends GenericMessageSubcommand { + constructor( + Index: number, + public Speed: number, + public Clockwise: boolean, + ) { + super(Index); + } +} + +export class RotateCmd extends ButtplugDeviceMessage { + static Name = "RotateCmd"; + + public static Create( + deviceIndex: number, + commands: [number, boolean][], + ): RotateCmd { + const cmdList: RotateSubcommand[] = new Array(); + + let i = 0; + for (const [speed, clockwise] of commands) { + cmdList.push(new RotateSubcommand(i, speed, clockwise)); + ++i; + } + + return new RotateCmd(cmdList, deviceIndex); + } + constructor( + public Rotations: RotateSubcommand[], + public DeviceIndex: number = -1, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class VectorSubcommand extends GenericMessageSubcommand { + constructor( + Index: number, + public Position: number, + public Duration: number, + ) { + super(Index); + } +} + +export class LinearCmd extends ButtplugDeviceMessage { + static Name = "LinearCmd"; + + public static Create( + deviceIndex: number, + commands: [number, number][], + ): LinearCmd { + const cmdList: VectorSubcommand[] = new Array(); + + let i = 0; + for (const cmd of commands) { + cmdList.push(new VectorSubcommand(i, cmd[0], cmd[1])); + ++i; + } + + return new LinearCmd(cmdList, deviceIndex); + } + constructor( + public Vectors: VectorSubcommand[], + public DeviceIndex: number = -1, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class SensorReadCmd extends ButtplugDeviceMessage { + static Name = "SensorReadCmd"; + + constructor( + public DeviceIndex: number, + public SensorIndex: number, + public SensorType: SensorType, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class SensorReading extends ButtplugDeviceMessage { + static Name = "SensorReading"; + + constructor( + public DeviceIndex: number, + public SensorIndex: number, + public SensorType: SensorType, + public Data: number[], + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RawReadCmd extends ButtplugDeviceMessage { + static Name = "RawReadCmd"; + + constructor( + public DeviceIndex: number, + public Endpoint: string, + public ExpectedLength: number, + public Timeout: number, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RawWriteCmd extends ButtplugDeviceMessage { + static Name = "RawWriteCmd"; + + constructor( + public DeviceIndex: number, + public Endpoint: string, + public Data: Uint8Array, + public WriteWithResponse: boolean, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RawSubscribeCmd extends ButtplugDeviceMessage { + static Name = "RawSubscribeCmd"; + + constructor( + public DeviceIndex: number, + public Endpoint: string, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RawUnsubscribeCmd extends ButtplugDeviceMessage { + static Name = "RawUnsubscribeCmd"; + + constructor( + public DeviceIndex: number, + public Endpoint: string, + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} + +export class RawReading extends ButtplugDeviceMessage { + static Name = "RawReading"; + + constructor( + public DeviceIndex: number, + public Endpoint: string, + public Data: number[], + public Id: number = DEFAULT_MESSAGE_ID, + ) { + super(DeviceIndex, Id); + } +} diff --git a/packages/buttplug/src/core/index.d.ts b/packages/buttplug/src/core/index.d.ts new file mode 100644 index 0000000..a970ab3 --- /dev/null +++ b/packages/buttplug/src/core/index.d.ts @@ -0,0 +1,4 @@ +declare module "*.json" { + const content: string; + export default content; +} diff --git a/packages/buttplug/src/index.ts b/packages/buttplug/src/index.ts new file mode 100644 index 0000000..4fb4835 --- /dev/null +++ b/packages/buttplug/src/index.ts @@ -0,0 +1,88 @@ +import { ButtplugMessage } from "./core/Messages"; +import { IButtplugClientConnector } from "./client/IButtplugClientConnector"; +import { fromJSON } from "./core/MessageUtils"; +import { EventEmitter } from "eventemitter3"; + +export * from "./client/Client"; +export * from "./client/ButtplugClientDevice"; +export * from "./client/ButtplugBrowserWebsocketClientConnector"; +export * from "./client/ButtplugNodeWebsocketClientConnector"; +export * from "./client/ButtplugClientConnectorException"; +export * from "./utils/ButtplugMessageSorter"; +export * from "./client/IButtplugClientConnector"; +export * from "./core/Messages"; +export * from "./core/MessageUtils"; +export * from "./core/Logging"; +export * from "./core/Exceptions"; + +export class ButtplugWasmClientConnector + extends EventEmitter + implements IButtplugClientConnector +{ + private static _loggingActivated = false; + private static wasmInstance; + private _connected: boolean = false; + private client; + private serverPtr; + + constructor() { + super(); + } + + public get Connected(): boolean { + return this._connected; + } + + private static maybeLoadWasm = async () => { + if (ButtplugWasmClientConnector.wasmInstance == undefined) { + ButtplugWasmClientConnector.wasmInstance = await import( + "../wasm/index.js" + ); + } + }; + + public static activateLogging = async (logLevel: string = "debug") => { + await ButtplugWasmClientConnector.maybeLoadWasm(); + if (this._loggingActivated) { + console.log("Logging already activated, ignoring."); + return; + } + console.log("Turning on logging."); + ButtplugWasmClientConnector.wasmInstance.buttplug_activate_env_logger( + logLevel, + ); + }; + + public initialize = async (): Promise => {}; + + public connect = async (): Promise => { + await ButtplugWasmClientConnector.maybeLoadWasm(); + //ButtplugWasmClientConnector.wasmInstance.buttplug_activate_env_logger('debug'); + this.client = + ButtplugWasmClientConnector.wasmInstance.buttplug_create_embedded_wasm_server( + (msgs) => { + this.emitMessage(msgs); + }, + this.serverPtr, + ); + this._connected = true; + }; + + public disconnect = async (): Promise => {}; + + public send = (msg: ButtplugMessage): void => { + ButtplugWasmClientConnector.wasmInstance.buttplug_client_send_json_message( + this.client, + new TextEncoder().encode("[" + msg.toJSON() + "]"), + (output) => { + this.emitMessage(output); + }, + ); + }; + + private emitMessage = (msg: Uint8Array) => { + const str = new TextDecoder().decode(msg); + // This needs to use buttplug-js's fromJSON, otherwise we won't resolve the message name correctly. + this.emit("message", fromJSON(str)); + }; +} diff --git a/packages/buttplug/src/lib.rs b/packages/buttplug/src/lib.rs new file mode 100644 index 0000000..e677bdb --- /dev/null +++ b/packages/buttplug/src/lib.rs @@ -0,0 +1,130 @@ +#[macro_use] +extern crate tracing; +#[macro_use] +extern crate futures; + + +mod webbluetooth; +use js_sys; +use tokio_stream::StreamExt; +use crate::webbluetooth::{WebBluetoothCommunicationManagerBuilder}; +use buttplug::{ + core::message::{ButtplugServerMessageCurrent,serializer::vec_to_protocol_json}, + server::{ButtplugServerBuilder,ButtplugServerDowngradeWrapper,device::{ServerDeviceManagerBuilder,configuration::{DeviceConfigurationManager}}}, + util::async_manager, core::message::{BUTTPLUG_CURRENT_MESSAGE_SPEC_VERSION, ButtplugServerMessageVariant, serializer::{ButtplugSerializedMessage, ButtplugMessageSerializer, ButtplugServerJSONSerializer}}, + util::device_configuration::load_protocol_configs +}; + +type FFICallback = js_sys::Function; +type FFICallbackContext = u32; + +#[derive(Clone, Copy)] +pub struct FFICallbackContextWrapper(FFICallbackContext); + +unsafe impl Send for FFICallbackContextWrapper { +} +unsafe impl Sync for FFICallbackContextWrapper { +} + +use console_error_panic_hook; +use tracing_subscriber::{layer::SubscriberExt, Registry}; +use tracing_wasm::{WASMLayer, WASMLayerConfig}; +use wasm_bindgen::prelude::*; +use std::sync::Arc; +use js_sys::Uint8Array; + +pub type ButtplugWASMServer = Arc; + +pub fn send_server_message( + message: &ButtplugServerMessageCurrent, + callback: &FFICallback, +) { + let msg_array = [message.clone()]; + let json_msg = vec_to_protocol_json(&msg_array); + let buf = json_msg.as_bytes(); + { + let this = JsValue::null(); + let uint8buf = unsafe { Uint8Array::new(&Uint8Array::view(buf)) }; + callback.call1(&this, &JsValue::from(uint8buf)); + } +} + +#[no_mangle] +pub fn create_test_dcm(allow_raw_messages: bool) -> DeviceConfigurationManager { + load_protocol_configs(&None, &None, false) + .expect("If this fails, the whole library goes with it.") + .allow_raw_messages(allow_raw_messages) + .finish() + .expect("If this fails, the whole library goes with it.") +} + +#[no_mangle] +#[wasm_bindgen] +pub fn buttplug_create_embedded_wasm_server( + callback: &FFICallback, +) -> *mut ButtplugWASMServer { + console_error_panic_hook::set_once(); + let dcm = create_test_dcm(false); + let mut sdm = ServerDeviceManagerBuilder::new(dcm); + sdm.comm_manager(WebBluetoothCommunicationManagerBuilder::default()); + let builder = ButtplugServerBuilder::new(sdm.finish().unwrap()); + let server = builder.finish().unwrap(); + let wrapper = Arc::new(ButtplugServerDowngradeWrapper::new(server)); + let event_stream = wrapper.server_version_event_stream(); + let callback = callback.clone(); + async_manager::spawn(async move { + pin_mut!(event_stream); + while let Some(message) = event_stream.next().await { + send_server_message(&ButtplugServerMessageCurrent::try_from(message).unwrap(), &callback); + } + }); + + Box::into_raw(Box::new(wrapper)) +} + +#[no_mangle] +#[wasm_bindgen] +pub fn buttplug_free_embedded_wasm_server(ptr: *mut ButtplugWASMServer) { + if !ptr.is_null() { + unsafe { + let _ = Box::from_raw(ptr); + } + } +} + + +#[no_mangle] +#[wasm_bindgen] +pub fn buttplug_client_send_json_message( + server_ptr: *mut ButtplugWASMServer, + buf: &[u8], + callback: &FFICallback, +) { + let server = unsafe { + assert!(!server_ptr.is_null()); + &mut *server_ptr + }; + let callback = callback.clone(); + let serializer = ButtplugServerJSONSerializer::default(); + serializer.force_message_version(&BUTTPLUG_CURRENT_MESSAGE_SPEC_VERSION); + let input_msg = serializer.deserialize(&ButtplugSerializedMessage::Text(std::str::from_utf8(buf).unwrap().to_owned())).unwrap(); + async_manager::spawn(async move { + let msg = input_msg[0].clone(); + let response = server.parse_message(msg).await.unwrap(); + if let ButtplugServerMessageVariant::V3(response) = response { + send_server_message(&response, &callback); + } + + }); +} + +#[no_mangle] +#[wasm_bindgen] +pub fn buttplug_activate_env_logger(_max_level: &str) { + tracing::subscriber::set_global_default( + Registry::default() + //.with(EnvFilter::new(max_level)) + .with(WASMLayer::new(WASMLayerConfig::default())), + ) + .expect("default global"); +} diff --git a/packages/buttplug/src/utils/ButtplugBrowserWebsocketConnector.ts b/packages/buttplug/src/utils/ButtplugBrowserWebsocketConnector.ts new file mode 100644 index 0000000..ea818df --- /dev/null +++ b/packages/buttplug/src/utils/ButtplugBrowserWebsocketConnector.ts @@ -0,0 +1,91 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +"use strict"; + +import { EventEmitter } from "eventemitter3"; +import { ButtplugMessage } from "../core/Messages"; +import { fromJSON } from "../core/MessageUtils"; + +export class ButtplugBrowserWebsocketConnector extends EventEmitter { + protected _ws: WebSocket | undefined; + protected _websocketConstructor: typeof WebSocket | null = null; + + public constructor(private _url: string) { + super(); + } + + public get Connected(): boolean { + return this._ws !== undefined; + } + + public connect = async (): Promise => { + return new Promise((resolve, reject) => { + const ws = new (this._websocketConstructor ?? WebSocket)(this._url); + const onErrorCallback = (event: Event) => { + reject(event); + }; + const onCloseCallback = (event: CloseEvent) => reject(event.reason); + ws.addEventListener("open", async () => { + this._ws = ws; + try { + await this.initialize(); + this._ws.addEventListener("message", (msg) => { + this.parseIncomingMessage(msg); + }); + this._ws.removeEventListener("close", onCloseCallback); + this._ws.removeEventListener("error", onErrorCallback); + this._ws.addEventListener("close", this.disconnect); + resolve(); + } catch (e) { + reject(e); + } + }); + // In websockets, our error rarely tells us much, as for security reasons + // browsers usually only throw Error Code 1006. It's up to those using this + // library to state what the problem might be. + + ws.addEventListener("error", onErrorCallback); + ws.addEventListener("close", onCloseCallback); + }); + }; + + public disconnect = async (): Promise => { + if (!this.Connected) { + return; + } + this._ws!.close(); + this._ws = undefined; + this.emit("disconnect"); + }; + + public sendMessage(msg: ButtplugMessage) { + if (!this.Connected) { + throw new Error("ButtplugBrowserWebsocketConnector not connected"); + } + this._ws!.send("[" + msg.toJSON() + "]"); + } + + public initialize = async (): Promise => { + return Promise.resolve(); + }; + + protected parseIncomingMessage(event: MessageEvent) { + if (typeof event.data === "string") { + const msgs = fromJSON(event.data); + this.emit("message", msgs); + } else if (event.data instanceof Blob) { + // No-op, we only use text message types. + } + } + + protected onReaderLoad(event: Event) { + const msgs = fromJSON((event.target as FileReader).result); + this.emit("message", msgs); + } +} diff --git a/packages/buttplug/src/utils/ButtplugMessageSorter.ts b/packages/buttplug/src/utils/ButtplugMessageSorter.ts new file mode 100644 index 0000000..adc49e3 --- /dev/null +++ b/packages/buttplug/src/utils/ButtplugMessageSorter.ts @@ -0,0 +1,65 @@ +/*! + * Buttplug JS Source Code File - Visit https://buttplug.io for more info about + * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the + * project root for full license information. + * + * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. + */ + +import * as Messages from "../core/Messages"; +import { ButtplugError } from "../core/Exceptions"; + +export class ButtplugMessageSorter { + protected _counter = 1; + protected _waitingMsgs: Map< + number, + [(val: Messages.ButtplugMessage) => void, (err: Error) => void] + > = new Map(); + + public constructor(private _useCounter: boolean) {} + + // One of the places we should actually return a promise, as we need to store + // them while waiting for them to return across the line. + // tslint:disable:promise-function-async + public PrepareOutgoingMessage( + msg: Messages.ButtplugMessage, + ): Promise { + if (this._useCounter) { + msg.Id = this._counter; + // Always increment last, otherwise we might lose sync + this._counter += 1; + } + let res; + let rej; + const msgPromise = new Promise( + (resolve, reject) => { + res = resolve; + rej = reject; + }, + ); + this._waitingMsgs.set(msg.Id, [res, rej]); + return msgPromise; + } + + public ParseIncomingMessages( + msgs: Messages.ButtplugMessage[], + ): Messages.ButtplugMessage[] { + const noMatch: Messages.ButtplugMessage[] = []; + for (const x of msgs) { + if (x.Id !== Messages.SYSTEM_MESSAGE_ID && this._waitingMsgs.has(x.Id)) { + const [res, rej] = this._waitingMsgs.get(x.Id)!; + // If we've gotten back an error, reject the related promise using a + // ButtplugException derived type. + if (x.Type === Messages.Error) { + rej(ButtplugError.FromError(x as Messages.Error)); + continue; + } + res(x); + continue; + } else { + noMatch.push(x); + } + } + return noMatch; + } +} diff --git a/packages/buttplug/src/utils/Utils.ts b/packages/buttplug/src/utils/Utils.ts new file mode 100644 index 0000000..7d460e0 --- /dev/null +++ b/packages/buttplug/src/utils/Utils.ts @@ -0,0 +1,3 @@ +export function getRandomInt(max: number) { + return Math.floor(Math.random() * Math.floor(max)); +} diff --git a/packages/buttplug/src/webbluetooth/mod.rs b/packages/buttplug/src/webbluetooth/mod.rs new file mode 100644 index 0000000..0b4ff31 --- /dev/null +++ b/packages/buttplug/src/webbluetooth/mod.rs @@ -0,0 +1,6 @@ + +mod webbluetooth_hardware; +mod webbluetooth_manager; + +// pub use webbluetooth_hardware::{WebBluetoothHardwareConnector, WebBluetoothHardware}; +pub use webbluetooth_manager::{WebBluetoothCommunicationManagerBuilder}; diff --git a/packages/buttplug/src/webbluetooth/webbluetooth_hardware.rs b/packages/buttplug/src/webbluetooth/webbluetooth_hardware.rs new file mode 100644 index 0000000..cbd18a3 --- /dev/null +++ b/packages/buttplug/src/webbluetooth/webbluetooth_hardware.rs @@ -0,0 +1,432 @@ +use async_trait::async_trait; +use buttplug::{ + core::{ + errors::ButtplugDeviceError, + message::Endpoint, + }, + server::device::{ + configuration::{BluetoothLESpecifier, ProtocolCommunicationSpecifier}, + hardware::{ + Hardware, + HardwareConnector, + HardwareEvent, + HardwareInternal, + HardwareReadCmd, + HardwareReading, + HardwareSpecializer, + HardwareSubscribeCmd, + HardwareUnsubscribeCmd, + HardwareWriteCmd, + }, +}, + util::future::{ButtplugFuture, ButtplugFutureStateShared}, +}; +use futures::future::{self, BoxFuture}; +use js_sys::{DataView, Uint8Array}; +use std::{ + collections::HashMap, + convert::TryFrom, + fmt::{self, Debug}, +}; +use tokio::sync::{broadcast, mpsc}; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; +use wasm_bindgen_futures::{spawn_local, JsFuture}; +use web_sys::{ + BluetoothDevice, + BluetoothRemoteGattCharacteristic, + BluetoothRemoteGattServer, + BluetoothRemoteGattService, + Event, + MessageEvent, +}; + +type WebBluetoothResultFuture = ButtplugFuture>; +type WebBluetoothReadResultFuture = ButtplugFuture>; + +struct BluetoothDeviceWrapper { + pub device: BluetoothDevice +} + + +unsafe impl Send for BluetoothDeviceWrapper { +} +unsafe impl Sync for BluetoothDeviceWrapper { +} + + +pub struct WebBluetoothHardwareConnector { + device: Option, +} + +impl WebBluetoothHardwareConnector { + pub fn new( + device: BluetoothDevice, + ) -> Self { + Self { + device: Some(BluetoothDeviceWrapper { + device, + }) + } + } +} + +impl Debug for WebBluetoothHardwareConnector { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let device = &self.device.as_ref(); + + match device { + Some(device) => { + f.debug_struct("WebBluetoothHardwareCreator") + .field("name", &device.device.name().unwrap()) + .finish() + } + &None => { + f.debug_struct("WebBluetoothHardwareCreator") + .field("name", &"Unknown device") + .finish() + } + } + } +} + +#[async_trait] +impl HardwareConnector for WebBluetoothHardwareConnector { + fn specifier(&self) -> ProtocolCommunicationSpecifier { + let device = &self.device.as_ref(); + + match device { + Some(device) => { + ProtocolCommunicationSpecifier::BluetoothLE(BluetoothLESpecifier::new_from_device( + &device.device.name().unwrap(), + &HashMap::new(), + &[] + )) + } + &None => { + ProtocolCommunicationSpecifier::BluetoothLE(BluetoothLESpecifier::new_from_device( + "Unknown device", + &HashMap::new(), + &[] + )) + } + } + } + + async fn connect(&mut self) -> Result, ButtplugDeviceError> { + Ok(Box::new(WebBluetoothHardwareSpecializer::new(self.device.take().unwrap()))) + } +} + + +pub struct WebBluetoothHardwareSpecializer { + device: Option, +} + +impl WebBluetoothHardwareSpecializer { + fn new(device: BluetoothDeviceWrapper) -> Self { + Self { + device: Some(device), + } + } +} + +#[async_trait] +impl HardwareSpecializer for WebBluetoothHardwareSpecializer { + async fn specialize( + &mut self, + specifiers: &[ProtocolCommunicationSpecifier], + ) -> Result { + let (sender, mut receiver) = mpsc::channel(256); + let (command_sender, command_receiver) = mpsc::channel(256); + let name; + let address; + let event_sender; + // This block limits the lifetime of device. Since the compiler doesn't + // realize we move device in the spawn_local block, it'll complain that + // device's lifetime lives across the channel await, which gets all + // angry because it's a *mut u8. So this limits the visible lifetime to + // before we start waiting for the reply from the event loop. + let protocol = if let ProtocolCommunicationSpecifier::BluetoothLE(btle) = &specifiers[0] { + btle + } else { + panic!("No bluetooth, we quit"); + }; + { + let device = self.device.take().unwrap().device; + name = device.name().unwrap(); + address = device.id(); + let (es, _) = broadcast::channel(256); + event_sender = es; + let event_loop_fut = run_webbluetooth_loop( + device, + protocol.clone(), + sender, + event_sender.clone(), + command_receiver, + ); + spawn_local(async move { + event_loop_fut.await; + }); + } + + match receiver.recv().await.unwrap() { + WebBluetoothEvent::Connected(_) => { + info!("Web Bluetooth device connected, returning device"); + + let device_impl: Box = Box::new(WebBluetoothHardware::new( + event_sender, + receiver, + command_sender, + )); + Ok(Hardware::new(&name, &address, &[], device_impl)) + } + WebBluetoothEvent::Disconnected => Err( + ButtplugDeviceError::DeviceCommunicationError( + "Could not connect to WebBluetooth device".to_string(), + ) + .into(), + ), + } + } +} + +#[derive(Debug, Clone)] +pub enum WebBluetoothEvent { + // This is the only way we have to get our endpoints back to device creation + // right now. My god this is a mess. + Connected(Vec), + Disconnected, +} + +pub enum WebBluetoothDeviceCommand { + Write( + HardwareWriteCmd, + ButtplugFutureStateShared>, + ), + Read( + HardwareReadCmd, + ButtplugFutureStateShared>, + ), + Subscribe( + HardwareSubscribeCmd, + ButtplugFutureStateShared>, + ), + Unsubscribe( + HardwareUnsubscribeCmd, + ButtplugFutureStateShared>, + ), +} + +async fn run_webbluetooth_loop( + device: BluetoothDevice, + btle_protocol: BluetoothLESpecifier, + device_local_event_sender: mpsc::Sender, + device_external_event_sender: broadcast::Sender, + mut device_command_receiver: mpsc::Receiver, +) { + //let device = self.device.take().unwrap(); + let mut char_map = HashMap::new(); + let connect_future = device.gatt().unwrap().connect(); + let server: BluetoothRemoteGattServer = match JsFuture::from(connect_future).await { + Ok(val) => val.into(), + Err(_) => { + device_local_event_sender + .send(WebBluetoothEvent::Disconnected) + .await + .unwrap(); + return; + } + }; + for (service_uuid, service_endpoints) in btle_protocol.services() { + let service = if let Ok(serv) = + JsFuture::from(server.get_primary_service_with_str(&service_uuid.to_string())).await + { + info!( + "Service {} found on device {}", + service_uuid, + device.name().unwrap() + ); + BluetoothRemoteGattService::from(serv) + } else { + info!( + "Service {} not found on device {}", + service_uuid, + device.name().unwrap() + ); + continue; + }; + for (chr_name, chr_uuid) in service_endpoints.iter() { + info!("Connecting chr {} {}", chr_name, chr_uuid.to_string()); + let char: BluetoothRemoteGattCharacteristic = + JsFuture::from(service.get_characteristic_with_str(&chr_uuid.to_string())) + .await + .unwrap() + .into(); + char_map.insert(chr_name.clone(), char); + } + } + { + let event_sender = device_external_event_sender.clone(); + let id = device.id().clone(); + let ondisconnected_callback = Closure::wrap(Box::new(move |_: Event| { + info!("device disconnected!"); + event_sender + .send(HardwareEvent::Disconnected(id.clone())) + .unwrap(); + }) as Box); + // set disconnection event handler on BluetoothDevice + device.set_ongattserverdisconnected(Some(ondisconnected_callback.as_ref().unchecked_ref())); + ondisconnected_callback.forget(); + } + //let web_btle_device = WebBluetoothDeviceImpl::new(device, char_map); + info!("device created!"); + let endpoints = char_map.keys().into_iter().cloned().collect(); + device_local_event_sender + .send(WebBluetoothEvent::Connected(endpoints)) + .await; + while let Some(msg) = device_command_receiver.recv().await { + match msg { + WebBluetoothDeviceCommand::Write(write_cmd, waker) => { + debug!("Writing to endpoint {:?}", write_cmd.endpoint()); + let chr = char_map.get(&write_cmd.endpoint()).unwrap().clone(); + spawn_local(async move { + let uint8buf = unsafe { Uint8Array::new(&Uint8Array::view(&write_cmd.data().clone())) }; + JsFuture::from(chr.write_value_with_u8_array(&uint8buf).unwrap()) + .await + .unwrap(); + waker.set_reply(Ok(())); + }); + } + WebBluetoothDeviceCommand::Read(read_cmd, waker) => { + debug!("Writing to endpoint {:?}", read_cmd.endpoint()); + let chr = char_map.get(&read_cmd.endpoint()).unwrap().clone(); + spawn_local(async move { + let read_value = JsFuture::from(chr.read_value()).await.unwrap(); + let data_view = DataView::try_from(read_value).unwrap(); + let mut body = vec![0; data_view.byte_length() as usize]; + Uint8Array::new(&data_view).copy_to(&mut body[..]); + let reading = HardwareReading::new(read_cmd.endpoint(), &body); + waker.set_reply(Ok(reading)); + }); + } + WebBluetoothDeviceCommand::Subscribe(subscribe_cmd, waker) => { + debug!("Subscribing to endpoint {:?}", subscribe_cmd.endpoint()); + let chr = char_map.get(&subscribe_cmd.endpoint()).unwrap().clone(); + let ep = subscribe_cmd.endpoint(); + let event_sender = device_external_event_sender.clone(); + let id = device.id().clone(); + let onchange_callback = Closure::wrap(Box::new(move |e: MessageEvent| { + let event_chr: BluetoothRemoteGattCharacteristic = + BluetoothRemoteGattCharacteristic::from(JsValue::from(e.target().unwrap())); + let value = Uint8Array::new_with_byte_offset( + &JsValue::from(event_chr.value().unwrap().buffer()), + 0, + ); + let value_vec = value.to_vec(); + debug!("Subscription notification from {}: {:?}", ep, value_vec); + event_sender + .send(HardwareEvent::Notification(id.clone(), ep, value_vec)) + .unwrap(); + }) as Box); + // set message event handler on WebSocket + chr.set_oncharacteristicvaluechanged(Some(onchange_callback.as_ref().unchecked_ref())); + onchange_callback.forget(); + spawn_local(async move { + JsFuture::from(chr.start_notifications()).await.unwrap(); + debug!("Endpoint subscribed"); + waker.set_reply(Ok(())); + }); + } + WebBluetoothDeviceCommand::Unsubscribe(_unsubscribe_cmd, _waker) => {} + } + } + debug!("run_webbluetooth_loop exited!"); +} + + +#[derive(Debug)] +pub struct WebBluetoothHardware { + device_command_sender: mpsc::Sender, + device_event_receiver: mpsc::Receiver, + event_sender: broadcast::Sender, +} +/* +unsafe impl Send for WebBluetoothHardware { +} +unsafe impl Sync for WebBluetoothHardware { +} +*/ + +impl WebBluetoothHardware { + pub fn new( + event_sender: broadcast::Sender, + device_event_receiver: mpsc::Receiver, + device_command_sender: mpsc::Sender, + ) -> Self { + Self { + event_sender, + device_event_receiver, + device_command_sender, + } + } +} + +impl HardwareInternal for WebBluetoothHardware { + fn event_stream(&self) -> broadcast::Receiver { + self.event_sender.subscribe() + } + + fn disconnect(&self) -> BoxFuture<'static, Result<(), ButtplugDeviceError>> { + Box::pin(future::ready(Ok(()))) + } + + fn read_value( + &self, + msg: &HardwareReadCmd, + ) -> BoxFuture<'static, Result> { + let sender = self.device_command_sender.clone(); + let msg = msg.clone(); + Box::pin(async move { + let fut = WebBluetoothReadResultFuture::default(); + let waker = fut.get_state_clone(); + sender + .send(WebBluetoothDeviceCommand::Read(msg, waker)) + .await; + fut.await + }) + } + + fn write_value(&self, msg: &HardwareWriteCmd) -> BoxFuture<'static, Result<(), ButtplugDeviceError>> { + let sender = self.device_command_sender.clone(); + let msg = msg.clone(); + Box::pin(async move { + let fut = WebBluetoothResultFuture::default(); + let waker = fut.get_state_clone(); + sender + .send(WebBluetoothDeviceCommand::Write(msg.clone(), waker)) + .await; + fut.await + }) + } + + fn subscribe(&self, msg: &HardwareSubscribeCmd) -> BoxFuture<'static, Result<(), ButtplugDeviceError>> { + let sender = self.device_command_sender.clone(); + let msg = msg.clone(); + Box::pin(async move { + let fut = WebBluetoothResultFuture::default(); + let waker = fut.get_state_clone(); + sender + .send(WebBluetoothDeviceCommand::Subscribe(msg.clone(), waker)) + .await; + fut.await + }) + } + + fn unsubscribe(&self, _msg: &HardwareUnsubscribeCmd) -> BoxFuture<'static, Result<(), ButtplugDeviceError>> { + Box::pin(async move { + error!("IMPLEMENT UNSUBSCRIBE FOR WEBBLUETOOTH WASM"); + Ok(()) + }) + } +} diff --git a/packages/buttplug/src/webbluetooth/webbluetooth_manager.rs b/packages/buttplug/src/webbluetooth/webbluetooth_manager.rs new file mode 100644 index 0000000..dfb6414 --- /dev/null +++ b/packages/buttplug/src/webbluetooth/webbluetooth_manager.rs @@ -0,0 +1,134 @@ +use super::webbluetooth_hardware::WebBluetoothHardwareConnector; + +use buttplug::{ + core::ButtplugResultFuture, + server::device::{ + configuration::{ProtocolCommunicationSpecifier}, + hardware::communication::{ + HardwareCommunicationManager, HardwareCommunicationManagerBuilder, + HardwareCommunicationManagerEvent, + }, + } +}; +use futures::future; +use js_sys::Array; +use tokio::sync::mpsc::Sender; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::{spawn_local, JsFuture}; +use web_sys::BluetoothDevice; +use crate::create_test_dcm; + +#[derive(Default)] +pub struct WebBluetoothCommunicationManagerBuilder { +} + +impl HardwareCommunicationManagerBuilder for WebBluetoothCommunicationManagerBuilder { + fn finish(&mut self, sender: Sender) -> Box { + Box::new(WebBluetoothCommunicationManager { + sender, + }) + } +} + +pub struct WebBluetoothCommunicationManager { + sender: Sender, +} + +#[wasm_bindgen] +extern "C" { + // Use `js_namespace` here to bind `console.log(..)` instead of just + // `log(..)` + #[wasm_bindgen(js_namespace = console)] + fn log(s: &str); +} + +impl HardwareCommunicationManager for WebBluetoothCommunicationManager { + fn name(&self) -> &'static str { + "WebBluetoothCommunicationManager" + } + + fn can_scan(&self) -> bool { + true + } + + fn start_scanning(&mut self) -> ButtplugResultFuture { + info!("WebBluetooth manager scanning"); + let sender_clone = self.sender.clone(); + spawn_local(async move { + // Build the filter block + let nav = web_sys::window().unwrap().navigator(); + if nav.bluetooth().is_none() { + error!("WebBluetooth is not supported on this browser"); + return; + } + info!("WebBluetooth supported by browser, continuing with scan."); + // HACK: As of buttplug v5, we can't just create a HardwareCommunicationManager anymore. This is + // using a test method to create a filled out DCM, which will work for now because there's no + // way for anyone to add device configurations through FFI yet anyways. + let config_manager = create_test_dcm(false); + let options = web_sys::RequestDeviceOptions::new(); + let filters = Array::new(); + let optional_services = Array::new(); + for vals in config_manager.protocol_device_configurations().iter() { + for config in vals.1 { + if let ProtocolCommunicationSpecifier::BluetoothLE(btle) = &config { + for name in btle.names() { + let filter = web_sys::BluetoothLeScanFilterInit::new(); + if name.contains("*") { + let mut name_clone = name.clone(); + name_clone.pop(); + filter.set_name_prefix(&name_clone); + } else { + filter.set_name(&name); + } + filters.push(&filter.into()); + } + for (service, _) in btle.services() { + optional_services.push(&service.to_string().into()); + } + } + } + } + options.set_filters(&filters.into()); + options.set_optional_services(&optional_services.into()); + let nav = web_sys::window().unwrap().navigator(); + //nav.bluetooth().get_availability(); + //JsFuture::from(nav.bluetooth().request_device()).await; + match JsFuture::from(nav.bluetooth().unwrap().request_device(&options)).await { + Ok(device) => { + let bt_device = BluetoothDevice::from(device); + if bt_device.name().is_none() { + return; + } + let name = bt_device.name().unwrap(); + let address = bt_device.id(); + let device_creator = Box::new(WebBluetoothHardwareConnector::new(bt_device)); + if sender_clone + .send(HardwareCommunicationManagerEvent::DeviceFound { + name, + address, + creator: device_creator, + }) + .await + .is_err() + { + error!("Device manager receiver dropped, cannot send device found message."); + } else { + info!("WebBluetooth device found."); + } + } + Err(e) => { + error!("Error while trying to start bluetooth scan: {:?}", e); + } + }; + let _ = sender_clone + .send(HardwareCommunicationManagerEvent::ScanningFinished) + .await; + }); + Box::pin(future::ready(Ok(()))) + } + + fn stop_scanning(&mut self) -> ButtplugResultFuture { + Box::pin(future::ready(Ok(()))) + } +} diff --git a/packages/buttplug/tsconfig.json b/packages/buttplug/tsconfig.json new file mode 100644 index 0000000..e1bc0b0 --- /dev/null +++ b/packages/buttplug/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "moduleResolution": "bundler", + "esModuleInterop": true, + "skipLibCheck": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true + }, + "include": ["src"] +} diff --git a/packages/buttplug/vite.config.ts b/packages/buttplug/vite.config.ts new file mode 100644 index 0000000..c62e188 --- /dev/null +++ b/packages/buttplug/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vite"; +import path from "path"; +import wasm from "vite-plugin-wasm"; + +export default defineConfig({ + plugins: [wasm()], // include wasm plugin + build: { + lib: { + entry: path.resolve(__dirname, "src/index.ts"), + name: "buttplug", + fileName: "index", + formats: ["es"], // this is important + }, + minify: false, // for demo purposes + target: "esnext", // this is important as well + outDir: "dist", + }, +}); diff --git a/packages/frontend/.dockerignore b/packages/frontend/.dockerignore new file mode 100644 index 0000000..ffdff94 --- /dev/null +++ b/packages/frontend/.dockerignore @@ -0,0 +1,17 @@ +Dockerfile +.dockerignore +.git +.gitignore +.gitattributes +README.md +.npmrc +.prettierrc +.eslintrc.cjs +.graphqlrc +.editorconfig +.svelte-kit +.vscode +node_modules +build +package +**/.env \ No newline at end of file diff --git a/packages/frontend/.env b/packages/frontend/.env new file mode 100644 index 0000000..82523a9 --- /dev/null +++ b/packages/frontend/.env @@ -0,0 +1,6 @@ +PUBLIC_API_URL= +PUBLIC_URL= +PUBLIC_UMAMI_ID= +LETTERSPACE_API_URL= +LETTERSPACE_API_KEY= +LETTERSPACE_LIST_ID= diff --git a/packages/frontend/.gitignore b/packages/frontend/.gitignore new file mode 100644 index 0000000..d525756 --- /dev/null +++ b/packages/frontend/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.svelte-kit/ +build/ \ No newline at end of file diff --git a/packages/frontend/components.json b/packages/frontend/components.json new file mode 100644 index 0000000..c5d91b4 --- /dev/null +++ b/packages/frontend/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" +} diff --git a/packages/frontend/jsrepo.json b/packages/frontend/jsrepo.json new file mode 100644 index 0000000..b2af8c9 --- /dev/null +++ b/packages/frontend/jsrepo.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://unpkg.com/jsrepo@2.4.9/schemas/project-config.json", + "repos": ["@ieedan/shadcn-svelte-extras"], + "includeTests": false, + "includeDocs": false, + "watermark": true, + "formatter": "prettier", + "configFiles": {}, + "paths": { + "*": "$lib/blocks", + "ui": "$lib/components/ui", + "actions": "$lib/actions", + "hooks": "$lib/hooks", + "utils": "$lib/utils" + } +} diff --git a/packages/frontend/package.json b/packages/frontend/package.json new file mode 100644 index 0000000..1441836 --- /dev/null +++ b/packages/frontend/package.json @@ -0,0 +1,50 @@ +{ + "name": "@sexy.pivoine.art/frontend", + "version": "1.0.0", + "author": "valknarogg", + "type": "module", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "start": "node ./build" + }, + "devDependencies": { + "@iconify-json/ri": "^1.2.5", + "@iconify/tailwind4": "^1.0.6", + "@internationalized/date": "^3.8.2", + "@lucide/svelte": "^0.544.0", + "@sveltejs/adapter-node": "^5.3.1", + "@sveltejs/adapter-static": "^3.0.9", + "@sveltejs/kit": "^2.37.0", + "@sveltejs/vite-plugin-svelte": "^6.1.4", + "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "^4.0.0", + "@tsconfig/svelte": "^5.0.5", + "bits-ui": "2.11.0", + "clsx": "^2.1.1", + "glob": "^11.0.3", + "mode-watcher": "^1.1.0", + "prettier-plugin-svelte": "^3.4.0", + "super-sitemap": "^1.0.5", + "svelte": "^5.38.6", + "svelte-sonner": "^1.0.5", + "tailwind-merge": "^3.3.1", + "tailwind-variants": "^1.0.0", + "tailwindcss": "^4.0.0", + "tw-animate-css": "^1.3.8", + "typescript": "^5.9.2", + "vite": "^7.1.4" + }, + "dependencies": { + "@directus/sdk": "^20.0.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.64.6", + "@sexy.pivoine.art/buttplug": "workspace:*", + "javascript-time-ago": "^2.5.11", + "media-chrome": "^4.13.1", + "svelte-i18n": "^4.0.1" + } +} diff --git a/packages/frontend/src/app.css b/packages/frontend/src/app.css new file mode 100644 index 0000000..888eeed --- /dev/null +++ b/packages/frontend/src/app.css @@ -0,0 +1,226 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@plugin "@iconify/tailwind4"; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --animate-vibrate: vibrate 0.3s linear infinite; + --animate-fade-in: fadeIn 0.3s ease-out; + --animate-slide-up: slideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1); + --animate-zoom-in: zoomIn 0.4s cubic-bezier(0.4, 0, 0.2, 1); + --animate-pulse-glow: pulseGlow 2s infinite; + + @keyframes vibrate { + 0% { + transform: translate(0); + } + + 20% { + transform: translate(-2px, 2px); + } + + 40% { + transform: translate(-2px, -2px); + } + + 60% { + transform: translate(2px, 2px); + } + + 80% { + transform: translate(2px, -2px); + } + + 100% { + transform: translate(0); + } + } + + @keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @keyframes slideUp { + 0% { + opacity: 0; + transform: translateY(30px) scale(0.95); + } + + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } + } + + @keyframes zoomIn { + 0% { + opacity: 0; + transform: scale(0.9); + } + + 100% { + opacity: 1; + transform: scale(1); + } + } + + @keyframes pulseGlow { + 0%, + 100% { + boxShadow: 0 0 20px rgba(183, 0, 217, 0.3); + } + + 50% { + boxShadow: 0 0 40px rgba(183, 0, 217, 0.6); + } + } +} + +/* + The default border color has changed to `currentColor` in Tailwind CSS v4, + so weve added these compatibility styles to make sure everything still + looks the same as it did with Tailwind CSS v3. + + If we ever want to remove these styles, we need to add an explicit border + color utility to any element that depends on these defaults. +*/ +@layer base { + * { + @supports (color: color-mix(in lab, red, red)) { + outline-color: color-mix(in oklab, var(--ring) 50%, transparent); + } + } + + * { + border-color: var(--border); + outline-color: var(--ring); + } + + .prose h2 { + @apply text-2xl font-bold mt-8 mb-4 text-foreground; + } + + .prose h3 { + @apply text-xl font-semibold mt-6 mb-3 text-foreground; + } + + .prose p { + @apply mb-4 leading-relaxed; + } + + .prose ul { + @apply mb-4 pl-6; + } + + .prose li { + @apply mb-2; + } +} + +:root { + --default-font-family: "Noto Sans", sans-serif; + --background: oklch(0.98 0.01 320); + --foreground: oklch(0.08 0.02 280); + --muted: oklch(0.95 0.01 280); + --muted-foreground: oklch(0.4 0.02 280); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --card: oklch(0.99 0.005 320); + --card-foreground: oklch(0.08 0.02 280); + --border: oklch(0.85 0.02 280); + --input: oklch(0.922 0 0); + --primary: oklch(56.971% 0.27455 319.257); + --primary-foreground: oklch(0.98 0.01 320); + --secondary: oklch(0.92 0.02 260); + --secondary-foreground: oklch(0.15 0.05 260); + --accent: oklch(0.45 0.35 280); + --accent-foreground: oklch(0.98 0.01 280); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.985 0 0); + --ring: oklch(0.55 0.3 320); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.08 0.02 280); + --foreground: oklch(0.98 0.01 280); + --muted: oklch(0.12 0.03 280); + --muted-foreground: oklch(0.6 0.02 280); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --card: oklch(0.1 0.02 280); + --card-foreground: oklch(0.95 0.01 280); + --border: oklch(0.2 0.05 280); + --input: oklch(1 0 0 / 0.15); + --primary: oklch(0.65 0.25 320); + --primary-foreground: oklch(0.98 0.01 320); + --secondary: oklch(0.15 0.05 260); + --secondary-foreground: oklch(0.9 0.02 260); + --accent: oklch(0.55 0.3 280); + --accent-foreground: oklch(0.98 0.01 280); + --destructive: oklch(0.704 0.191 22.216); + --destructive-foreground: oklch(0.985 0 0); + --ring: oklch(0.65 0.25 320); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 0.1); + --sidebar-ring: oklch(0.556 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + + --font-sans: var(--font-sans); + --font-mono: var(--font-mono); + --font-serif: var(--font-serif); +} diff --git a/packages/frontend/src/app.d.ts b/packages/frontend/src/app.d.ts new file mode 100644 index 0000000..9fced33 --- /dev/null +++ b/packages/frontend/src/app.d.ts @@ -0,0 +1,24 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts + +import type { AuthStatus } from "$lib/types"; + +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + interface Locals { + authStatus: AuthStatus; + } + // interface PageData {} + // interface PageState {} + // interface Platform {} + } + interface Window { + sidebar: { + addPanel: () => void; + }; + opera: object; + } +} + +export {}; diff --git a/packages/frontend/src/app.html b/packages/frontend/src/app.html new file mode 100644 index 0000000..8e033bb --- /dev/null +++ b/packages/frontend/src/app.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + + \ No newline at end of file diff --git a/packages/frontend/src/hooks.server.ts b/packages/frontend/src/hooks.server.ts new file mode 100644 index 0000000..ee50727 --- /dev/null +++ b/packages/frontend/src/hooks.server.ts @@ -0,0 +1,27 @@ +import { isAuthenticated } from "$lib/services"; + +export async function handle({ event, resolve }) { + const { cookies, locals } = event; + + const token = cookies.get("directus_session_token"); + + if (token) { + locals.authStatus = await isAuthenticated(token); + // if (locals.authStatus.authenticated) { + // cookies.set('directus_refresh_token', locals.authStatus.data!.refresh_token!, { + // httpOnly: true, + // secure: true, + // domain: '.pivoine.art', + // path: '/' + // }) + // } + } else { + locals.authStatus = { authenticated: false }; + } + + return await resolve(event, { + filterSerializedResponseHeaders: (key) => { + return key.toLowerCase() === "content-type"; + }, + }); +} diff --git a/packages/frontend/src/lib/components/age-verification-dialog/age-verification-dialog.svelte b/packages/frontend/src/lib/components/age-verification-dialog/age-verification-dialog.svelte new file mode 100644 index 0000000..eba0923 --- /dev/null +++ b/packages/frontend/src/lib/components/age-verification-dialog/age-verification-dialog.svelte @@ -0,0 +1,77 @@ + + + + e.preventDefault()} + showCloseButton={false} + > + +
+
+
+ {$_("age_verification_dialog.age")} +
+
+ {$_("age_verification_dialog.title")} + + {$_("age_verification_dialog.description")} + +
+
+
+
+ + + + +
+ + +
+
+
diff --git a/packages/frontend/src/lib/components/background/peony-background.svelte b/packages/frontend/src/lib/components/background/peony-background.svelte new file mode 100644 index 0000000..fba4f00 --- /dev/null +++ b/packages/frontend/src/lib/components/background/peony-background.svelte @@ -0,0 +1,61 @@ + +
+ +
+
+ + + + + + + + + + + + + + +
+
+
+ + + +
diff --git a/packages/frontend/src/lib/components/burger-menu-button/burger-menu-button.svelte b/packages/frontend/src/lib/components/burger-menu-button/burger-menu-button.svelte new file mode 100644 index 0000000..2869bef --- /dev/null +++ b/packages/frontend/src/lib/components/burger-menu-button/burger-menu-button.svelte @@ -0,0 +1,38 @@ + + + diff --git a/packages/frontend/src/lib/components/device-card/device-card.svelte b/packages/frontend/src/lib/components/device-card/device-card.svelte new file mode 100644 index 0000000..738afb8 --- /dev/null +++ b/packages/frontend/src/lib/components/device-card/device-card.svelte @@ -0,0 +1,165 @@ + + + + +
+
+
+ +
+
+

+ {device.name} +

+ +
+
+ +
+
+ + + + + + +
+
+
+ + {$_("device_card.battery")} +
+ {#if device.info.hasBattery} + + {device.batteryLevel}% + + {/if} +
+
+
+
+
+ + + + + + {#each device.info.messageAttributes.ScalarCmd as scalarCmd} +
+ + onChange(scalarCmd.Index, val)} + max={scalarCmd.StepCount} + step={1} + /> +
+ {/each} +
+
diff --git a/packages/frontend/src/lib/components/footer/footer.svelte b/packages/frontend/src/lib/components/footer/footer.svelte new file mode 100644 index 0000000..8caea77 --- /dev/null +++ b/packages/frontend/src/lib/components/footer/footer.svelte @@ -0,0 +1,121 @@ + + + diff --git a/packages/frontend/src/lib/components/girls/girls.svelte b/packages/frontend/src/lib/components/girls/girls.svelte new file mode 100644 index 0000000..1dd55b2 --- /dev/null +++ b/packages/frontend/src/lib/components/girls/girls.svelte @@ -0,0 +1,120 @@ +
+ + + Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + +
\ No newline at end of file diff --git a/packages/frontend/src/lib/components/header/header.svelte b/packages/frontend/src/lib/components/header/header.svelte new file mode 100644 index 0000000..d5a20ec --- /dev/null +++ b/packages/frontend/src/lib/components/header/header.svelte @@ -0,0 +1,394 @@ + + +
+
+
+ + + + + + + + + + {#if authStatus.authenticated} +
+
+ + + + + + + + + + +
+
+ {:else} +
+ + +
+ {/if} + (isMobileMenuOpen = !isMobileMenuOpen)} + /> +
+
+ +
+ {#if isMobileMenuOpen} +
+ +
+ + {#if authStatus.authenticated} +
+
+
+ + + + {getUserInitials(authStatus.user!.artist_name)} + + +
+

+ {authStatus.user!.artist_name} +

+

+ {authStatus.user!.email} +

+
+
+ Online +
+
+ + +
+
+ {/if} + +
+

+ {$_('header.navigation')} +

+
+ {#each navLinks as link} + (isMobileMenuOpen = false)} + > + {link.name} +
+ + +
+
+ {/each} +
+
+ + + + + {#if authStatus.authenticated} + + + {/if} +
+
+ {/if} +
+
diff --git a/packages/frontend/src/lib/components/icon/peony-icon.svelte b/packages/frontend/src/lib/components/icon/peony-icon.svelte new file mode 100644 index 0000000..fc45d72 --- /dev/null +++ b/packages/frontend/src/lib/components/icon/peony-icon.svelte @@ -0,0 +1,25 @@ + + + + diff --git a/packages/frontend/src/lib/components/image-viewer/image-viewer.svelte b/packages/frontend/src/lib/components/image-viewer/image-viewer.svelte new file mode 100644 index 0000000..57f797d --- /dev/null +++ b/packages/frontend/src/lib/components/image-viewer/image-viewer.svelte @@ -0,0 +1,280 @@ + + + +
+
+ {#each images as image, index} + + {/each} +
+
+ + +{#if isViewerOpen} +
+ +
+ + +
+ +
+
+
+

+ {currentImage.title} +

+
+ {$_("image_viewer.index", { + values: { + index: currentImageIndex + 1, + size: images.length + } + })} +
+

+ {currentImage.description} +

+
+ + +
+ + +
+
+
+ + +
+ + + + +
+ {#if imageLoading} +
+
+
+ {/if} + {currentImage.title} +
+ + + +
+ + + +
+
+{/if} diff --git a/packages/frontend/src/lib/components/logo/logo.svelte b/packages/frontend/src/lib/components/logo/logo.svelte new file mode 100644 index 0000000..44975d5 --- /dev/null +++ b/packages/frontend/src/lib/components/logo/logo.svelte @@ -0,0 +1,21 @@ + + +
+ +
+ + + diff --git a/packages/frontend/src/lib/components/logout-button/logout-button.svelte b/packages/frontend/src/lib/components/logout-button/logout-button.svelte new file mode 100644 index 0000000..f75da97 --- /dev/null +++ b/packages/frontend/src/lib/components/logout-button/logout-button.svelte @@ -0,0 +1,148 @@ + + +
+ +
+ + + + + +
+ +
+ + + + +
diff --git a/packages/frontend/src/lib/components/meta/meta.svelte b/packages/frontend/src/lib/components/meta/meta.svelte new file mode 100644 index 0000000..d7e2c46 --- /dev/null +++ b/packages/frontend/src/lib/components/meta/meta.svelte @@ -0,0 +1,24 @@ + + + + {$_("head.title", { values: { title } })} + + + + + diff --git a/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-popup.svelte b/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-popup.svelte new file mode 100644 index 0000000..aaeb0c4 --- /dev/null +++ b/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-popup.svelte @@ -0,0 +1,119 @@ + + + + + +
+
+
+ +
+
+ {$_('newsletter_signup.title')} + + {$_('newsletter_signup.description')} + +
+
+
+
+ + + +
+ +
+ + +
+ + + +
+ + +
+ +
+
diff --git a/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-widget.svelte b/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-widget.svelte new file mode 100644 index 0000000..1bbd8db --- /dev/null +++ b/packages/frontend/src/lib/components/newsletter-signup/newsletter-signup-widget.svelte @@ -0,0 +1,26 @@ + + + + + +

{$_('newsletter_signup.title')}

+

+ {$_('newsletter_signup.description')} +

+ + +
+
diff --git a/packages/frontend/src/lib/components/sharing-popup/share-button.svelte b/packages/frontend/src/lib/components/sharing-popup/share-button.svelte new file mode 100644 index 0000000..2d3a2d4 --- /dev/null +++ b/packages/frontend/src/lib/components/sharing-popup/share-button.svelte @@ -0,0 +1,19 @@ + + + diff --git a/packages/frontend/src/lib/components/sharing-popup/share-services.svelte b/packages/frontend/src/lib/components/sharing-popup/share-services.svelte new file mode 100644 index 0000000..9ca41ab --- /dev/null +++ b/packages/frontend/src/lib/components/sharing-popup/share-services.svelte @@ -0,0 +1,110 @@ + + +
+
+

+ {$_("sharing_popup.subtitle")} +

+ +
+ + + + + + + + + + + +
+
+
diff --git a/packages/frontend/src/lib/components/sharing-popup/sharing-popup-button.svelte b/packages/frontend/src/lib/components/sharing-popup/sharing-popup-button.svelte new file mode 100644 index 0000000..087e458 --- /dev/null +++ b/packages/frontend/src/lib/components/sharing-popup/sharing-popup-button.svelte @@ -0,0 +1,19 @@ + + + + diff --git a/packages/frontend/src/lib/components/sharing-popup/sharing-popup.svelte b/packages/frontend/src/lib/components/sharing-popup/sharing-popup.svelte new file mode 100644 index 0000000..f283998 --- /dev/null +++ b/packages/frontend/src/lib/components/sharing-popup/sharing-popup.svelte @@ -0,0 +1,89 @@ + + + + + +
+
+
+ +
+
+ {$_("sharing_popup.title")} + + {$_("sharing_popup.description", { + values: { type: content.type }, + })} + +
+
+
+ + +
+

+ {content.title} +

+

{content.description}

+
+ + {content.type} + + {content.url} +
+
+
+ + + + + + + + + +
+ +
+
+
diff --git a/packages/frontend/src/lib/components/ui/alert/alert-description.svelte b/packages/frontend/src/lib/components/ui/alert/alert-description.svelte new file mode 100644 index 0000000..0d89ee8 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/alert/alert-description.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/alert/alert-title.svelte b/packages/frontend/src/lib/components/ui/alert/alert-title.svelte new file mode 100644 index 0000000..730c97f --- /dev/null +++ b/packages/frontend/src/lib/components/ui/alert/alert-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/alert/alert.svelte b/packages/frontend/src/lib/components/ui/alert/alert.svelte new file mode 100644 index 0000000..21e5fc6 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/alert/alert.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/packages/frontend/src/lib/components/ui/alert/index.ts b/packages/frontend/src/lib/components/ui/alert/index.ts new file mode 100644 index 0000000..97e21b4 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/alert/index.ts @@ -0,0 +1,14 @@ +import Root from "./alert.svelte"; +import Description from "./alert-description.svelte"; +import Title from "./alert-title.svelte"; +export { alertVariants, type AlertVariant } from "./alert.svelte"; + +export { + Root, + Description, + Title, + // + Root as Alert, + Description as AlertDescription, + Title as AlertTitle, +}; diff --git a/packages/frontend/src/lib/components/ui/avatar/avatar-fallback.svelte b/packages/frontend/src/lib/components/ui/avatar/avatar-fallback.svelte new file mode 100644 index 0000000..0b72f59 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/avatar/avatar-fallback.svelte @@ -0,0 +1,17 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/avatar/avatar-image.svelte b/packages/frontend/src/lib/components/ui/avatar/avatar-image.svelte new file mode 100644 index 0000000..2478fc1 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/avatar/avatar-image.svelte @@ -0,0 +1,17 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/avatar/avatar.svelte b/packages/frontend/src/lib/components/ui/avatar/avatar.svelte new file mode 100644 index 0000000..efac1d7 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/avatar/avatar.svelte @@ -0,0 +1,19 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/avatar/index.ts b/packages/frontend/src/lib/components/ui/avatar/index.ts new file mode 100644 index 0000000..d06457b --- /dev/null +++ b/packages/frontend/src/lib/components/ui/avatar/index.ts @@ -0,0 +1,13 @@ +import Root from "./avatar.svelte"; +import Image from "./avatar-image.svelte"; +import Fallback from "./avatar-fallback.svelte"; + +export { + Root, + Image, + Fallback, + // + Root as Avatar, + Image as AvatarImage, + Fallback as AvatarFallback, +}; diff --git a/packages/frontend/src/lib/components/ui/button/button.svelte b/packages/frontend/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..7ffd487 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/button/button.svelte @@ -0,0 +1,86 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/packages/frontend/src/lib/components/ui/button/index.ts b/packages/frontend/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..fb585d7 --- /dev/null +++ b/packages/frontend/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/packages/frontend/src/lib/components/ui/card/card-action.svelte b/packages/frontend/src/lib/components/ui/card/card-action.svelte new file mode 100644 index 0000000..1679859 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-action.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/card-content.svelte b/packages/frontend/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 0000000..bfa440b --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,15 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/card-description.svelte b/packages/frontend/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 0000000..8d36345 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,20 @@ + + +

+ {@render children?.()} +

diff --git a/packages/frontend/src/lib/components/ui/card/card-footer.svelte b/packages/frontend/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 0000000..bcfd3c2 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/card-header.svelte b/packages/frontend/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 0000000..bc92139 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/card-title.svelte b/packages/frontend/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 0000000..9e12de9 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/card.svelte b/packages/frontend/src/lib/components/ui/card/card.svelte new file mode 100644 index 0000000..70c61a8 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/card.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/card/index.ts b/packages/frontend/src/lib/components/ui/card/index.ts new file mode 100644 index 0000000..4d3fce4 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/card/index.ts @@ -0,0 +1,25 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; +import Action from "./card-action.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + Action, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, + Action as CardAction, +}; diff --git a/packages/frontend/src/lib/components/ui/checkbox/checkbox.svelte b/packages/frontend/src/lib/components/ui/checkbox/checkbox.svelte new file mode 100644 index 0000000..fbda558 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,36 @@ + + + + {#snippet children({ checked, indeterminate })} +
+ {#if checked} + + {:else if indeterminate} + + {/if} +
+ {/snippet} +
diff --git a/packages/frontend/src/lib/components/ui/checkbox/index.ts b/packages/frontend/src/lib/components/ui/checkbox/index.ts new file mode 100644 index 0000000..6d92d94 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from "./checkbox.svelte"; +export { + Root, + // + Root as Checkbox, +}; diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-close.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-close.svelte new file mode 100644 index 0000000..091092a --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-close.svelte @@ -0,0 +1,8 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-content.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..50329af --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,43 @@ + + + + + + {@render children?.()} + {#if showCloseButton} + + + Close + + {/if} + + diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-description.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..aa6a0c6 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-footer.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..cddd47a --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-header.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..e74280e --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-overlay.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..704b2db --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-title.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..fd66ac3 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/dialog/dialog-trigger.svelte b/packages/frontend/src/lib/components/ui/dialog/dialog-trigger.svelte new file mode 100644 index 0000000..d7fa2de --- /dev/null +++ b/packages/frontend/src/lib/components/ui/dialog/dialog-trigger.svelte @@ -0,0 +1,8 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/dialog/index.ts b/packages/frontend/src/lib/components/ui/dialog/index.ts new file mode 100644 index 0000000..dce1d9d --- /dev/null +++ b/packages/frontend/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"; +import Trigger from "./dialog-trigger.svelte"; +import Close from "./dialog-close.svelte"; + +const Root = DialogPrimitive.Root; +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/packages/frontend/src/lib/components/ui/file-drop-zone/file-drop-zone.svelte b/packages/frontend/src/lib/components/ui/file-drop-zone/file-drop-zone.svelte new file mode 100644 index 0000000..f230b7c --- /dev/null +++ b/packages/frontend/src/lib/components/ui/file-drop-zone/file-drop-zone.svelte @@ -0,0 +1,185 @@ + + + + + diff --git a/packages/frontend/src/lib/components/ui/file-drop-zone/index.ts b/packages/frontend/src/lib/components/ui/file-drop-zone/index.ts new file mode 100644 index 0000000..6673f9f --- /dev/null +++ b/packages/frontend/src/lib/components/ui/file-drop-zone/index.ts @@ -0,0 +1,29 @@ +/* + Installed from @ieedan/shadcn-svelte-extras +*/ + +import FileDropZone from "./file-drop-zone.svelte"; +import { type FileRejectedReason, type FileDropZoneProps } from "./types"; + +export const displaySize = (bytes: number): string => { + if (bytes < KILOBYTE) return `${bytes.toFixed(0)} B`; + + if (bytes < MEGABYTE) return `${(bytes / KILOBYTE).toFixed(0)} KB`; + + if (bytes < GIGABYTE) return `${(bytes / MEGABYTE).toFixed(0)} MB`; + + return `${(bytes / GIGABYTE).toFixed(0)} GB`; +}; + +// Utilities for working with file sizes +export const BYTE = 1; +export const KILOBYTE = 1024; +export const MEGABYTE = 1024 * KILOBYTE; +export const GIGABYTE = 1024 * MEGABYTE; + +// utilities for limiting accepted files +export const ACCEPT_IMAGE = "image/*"; +export const ACCEPT_VIDEO = "video/*"; +export const ACCEPT_AUDIO = "audio/*"; + +export { FileDropZone, type FileRejectedReason, type FileDropZoneProps }; diff --git a/packages/frontend/src/lib/components/ui/file-drop-zone/types.ts b/packages/frontend/src/lib/components/ui/file-drop-zone/types.ts new file mode 100644 index 0000000..a48ebe6 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/file-drop-zone/types.ts @@ -0,0 +1,51 @@ +/* + Installed from @ieedan/shadcn-svelte-extras +*/ + +import type { WithChildren } from "bits-ui"; +import type { HTMLInputAttributes } from "svelte/elements"; + +export type FileRejectedReason = + | "Maximum file size exceeded" + | "File type not allowed" + | "Maximum files uploaded"; + +export type FileDropZonePropsWithoutHTML = WithChildren<{ + ref?: HTMLInputElement | null; + /** Called with the uploaded files when the user drops or clicks and selects their files. + * + * @param files + */ + onUpload: (files: File[]) => Promise; + /** The maximum amount files allowed to be uploaded */ + maxFiles?: number; + fileCount?: number; + /** The maximum size of a file in bytes */ + maxFileSize?: number; + /** Called when a file does not meet the upload criteria (size, or type) */ + onFileRejected?: (opts: { reason: FileRejectedReason; file: File }) => void; + + // just for extra documentation + /** Takes a comma separated list of one or more file types. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept) + * + * ### Usage + * ```svelte + * + * ``` + * + * ### Common Values + * ```svelte + * + * + * + * ``` + */ + accept?: string; +}>; + +export type FileDropZoneProps = FileDropZonePropsWithoutHTML & + Omit; diff --git a/packages/frontend/src/lib/components/ui/input/index.ts b/packages/frontend/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..f47b6d3 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/packages/frontend/src/lib/components/ui/input/input.svelte b/packages/frontend/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..99078c0 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/input/input.svelte @@ -0,0 +1,57 @@ + + +{#if type === "file"} + +{:else} + +{/if} diff --git a/packages/frontend/src/lib/components/ui/label/index.ts b/packages/frontend/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..8bfca0b --- /dev/null +++ b/packages/frontend/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/packages/frontend/src/lib/components/ui/label/label.svelte b/packages/frontend/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..bbed2bd --- /dev/null +++ b/packages/frontend/src/lib/components/ui/label/label.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/select/index.ts b/packages/frontend/src/lib/components/ui/select/index.ts new file mode 100644 index 0000000..9e8d3e9 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/index.ts @@ -0,0 +1,37 @@ +import { Select as SelectPrimitive } from "bits-ui"; + +import Group from "./select-group.svelte"; +import Label from "./select-label.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"; +import GroupHeading from "./select-group-heading.svelte"; + +const Root = SelectPrimitive.Root; + +export { + Root, + Group, + Label, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + GroupHeading, + // + Root as Select, + Group as SelectGroup, + Label as SelectLabel, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, + GroupHeading as SelectGroupHeading, +}; diff --git a/packages/frontend/src/lib/components/ui/select/select-content.svelte b/packages/frontend/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 0000000..2c4aa57 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,40 @@ + + + + + + + {@render children?.()} + + + + diff --git a/packages/frontend/src/lib/components/ui/select/select-group-heading.svelte b/packages/frontend/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..3963427 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,21 @@ + + + + {@render children?.()} + diff --git a/packages/frontend/src/lib/components/ui/select/select-group.svelte b/packages/frontend/src/lib/components/ui/select/select-group.svelte new file mode 100644 index 0000000..ee6c7d2 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-group.svelte @@ -0,0 +1,8 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/select/select-item.svelte b/packages/frontend/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 0000000..d9e1006 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,38 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/packages/frontend/src/lib/components/ui/select/select-label.svelte b/packages/frontend/src/lib/components/ui/select/select-label.svelte new file mode 100644 index 0000000..4527e3c --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-label.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/packages/frontend/src/lib/components/ui/select/select-scroll-down-button.svelte b/packages/frontend/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..0d6d446 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/packages/frontend/src/lib/components/ui/select/select-scroll-up-button.svelte b/packages/frontend/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..ffac42f --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/packages/frontend/src/lib/components/ui/select/select-separator.svelte b/packages/frontend/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 0000000..4baa845 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,18 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/select/select-trigger.svelte b/packages/frontend/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 0000000..2819e58 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/packages/frontend/src/lib/components/ui/separator/index.ts b/packages/frontend/src/lib/components/ui/separator/index.ts new file mode 100644 index 0000000..82442d2 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/packages/frontend/src/lib/components/ui/separator/separator.svelte b/packages/frontend/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 0000000..6beeca0 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/slider/index.ts b/packages/frontend/src/lib/components/ui/slider/index.ts new file mode 100644 index 0000000..820f209 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/slider/index.ts @@ -0,0 +1,7 @@ +import Root from "./slider.svelte"; + +export { + Root, + // + Root as Slider, +}; diff --git a/packages/frontend/src/lib/components/ui/slider/slider.svelte b/packages/frontend/src/lib/components/ui/slider/slider.svelte new file mode 100644 index 0000000..2c0e9a4 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/slider/slider.svelte @@ -0,0 +1,52 @@ + + + + + {#snippet children({ thumbs })} + + + + {#each thumbs as thumb (thumb)} + + {/each} + {/snippet} + diff --git a/packages/frontend/src/lib/components/ui/sonner/index.ts b/packages/frontend/src/lib/components/ui/sonner/index.ts new file mode 100644 index 0000000..1ad9f4a --- /dev/null +++ b/packages/frontend/src/lib/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/packages/frontend/src/lib/components/ui/sonner/sonner.svelte b/packages/frontend/src/lib/components/ui/sonner/sonner.svelte new file mode 100644 index 0000000..61c9e52 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/sonner/sonner.svelte @@ -0,0 +1,16 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/tabs/index.ts b/packages/frontend/src/lib/components/ui/tabs/index.ts new file mode 100644 index 0000000..12d4327 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,16 @@ +import Root from "./tabs.svelte"; +import Content from "./tabs-content.svelte"; +import List from "./tabs-list.svelte"; +import Trigger from "./tabs-trigger.svelte"; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/packages/frontend/src/lib/components/ui/tabs/tabs-content.svelte b/packages/frontend/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 0000000..b78abe7 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/tabs/tabs-list.svelte b/packages/frontend/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 0000000..139811f --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/tabs/tabs-trigger.svelte b/packages/frontend/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 0000000..75b871a --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/tabs/tabs.svelte b/packages/frontend/src/lib/components/ui/tabs/tabs.svelte new file mode 100644 index 0000000..38a48f0 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/tags-input/index.ts b/packages/frontend/src/lib/components/ui/tags-input/index.ts new file mode 100644 index 0000000..f699c88 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tags-input/index.ts @@ -0,0 +1,9 @@ +/* + Installed from @ieedan/shadcn-svelte-extras +*/ + +import TagsInput from "./tags-input.svelte"; + +export { TagsInput }; + +export type * from "./types"; diff --git a/packages/frontend/src/lib/components/ui/tags-input/tags-input-tag.svelte b/packages/frontend/src/lib/components/ui/tags-input/tags-input-tag.svelte new file mode 100644 index 0000000..60f01e9 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tags-input/tags-input-tag.svelte @@ -0,0 +1,28 @@ + + + + +
+ + {value} + + +
diff --git a/packages/frontend/src/lib/components/ui/tags-input/tags-input.svelte b/packages/frontend/src/lib/components/ui/tags-input/tags-input.svelte new file mode 100644 index 0000000..c35a5ef --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tags-input/tags-input.svelte @@ -0,0 +1,211 @@ + + + + +
+ {#each value as tag, i (tag)} + + {/each} + +
diff --git a/packages/frontend/src/lib/components/ui/tags-input/types.ts b/packages/frontend/src/lib/components/ui/tags-input/types.ts new file mode 100644 index 0000000..4c95fb4 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/tags-input/types.ts @@ -0,0 +1,13 @@ +/* + Installed from @ieedan/shadcn-svelte-extras +*/ + +import type { HTMLInputAttributes } from "svelte/elements"; + +export type TagsInputPropsWithoutHTML = { + value?: string[]; + validate?: (val: string, tags: string[]) => string | undefined; +}; + +export type TagsInputProps = TagsInputPropsWithoutHTML & + Omit; diff --git a/packages/frontend/src/lib/components/ui/textarea/index.ts b/packages/frontend/src/lib/components/ui/textarea/index.ts new file mode 100644 index 0000000..ace797a --- /dev/null +++ b/packages/frontend/src/lib/components/ui/textarea/index.ts @@ -0,0 +1,7 @@ +import Root from "./textarea.svelte"; + +export { + Root, + // + Root as Textarea, +}; diff --git a/packages/frontend/src/lib/components/ui/textarea/textarea.svelte b/packages/frontend/src/lib/components/ui/textarea/textarea.svelte new file mode 100644 index 0000000..4b0c73f --- /dev/null +++ b/packages/frontend/src/lib/components/ui/textarea/textarea.svelte @@ -0,0 +1,22 @@ + + + diff --git a/packages/frontend/src/lib/directus.ts b/packages/frontend/src/lib/directus.ts new file mode 100644 index 0000000..42d2815 --- /dev/null +++ b/packages/frontend/src/lib/directus.ts @@ -0,0 +1,35 @@ +import { authentication, createDirectus, rest } from "@directus/sdk"; +import { PUBLIC_API_URL } from "$env/static/public"; +import type { CurrentUser } from "./types"; + +export const directusApiUrl = PUBLIC_API_URL || "http://localhost:3000/api"; + +export const getDirectusInstance = (fetch?: typeof globalThis.fetch) => { + const options: { globals?: { fetch: typeof globalThis.fetch } } = fetch + ? { globals: { fetch } } + : {}; + const directus = createDirectus(directusApiUrl, options) + .with(rest()) + .with(authentication("session")); + return directus; +}; + +export const getAssetUrl = ( + id: string, + transform?: "mini" | "thumbnail" | "preview" | "medium" | "banner", +) => { + if (!id) { + return null; + } + return `${directusApiUrl}/assets/${id}${transform ? "?transform=" + transform : ""}`; +}; + +export const isModel = (user: CurrentUser) => { + if (user.role.name === "Model") { + return true; + } + if (user.policies.find((p) => p.policy.name === "Model")) { + return true; + } + return false; +}; diff --git a/packages/frontend/src/lib/i18n/index.ts b/packages/frontend/src/lib/i18n/index.ts new file mode 100644 index 0000000..0931b99 --- /dev/null +++ b/packages/frontend/src/lib/i18n/index.ts @@ -0,0 +1,11 @@ +import { init, addMessages } from "svelte-i18n"; +import en from "./locales/en"; + +const defaultLocale = "en"; + +addMessages("en", en); + +init({ + fallbackLocale: defaultLocale, + initialLocale: defaultLocale, +}); diff --git a/packages/frontend/src/lib/i18n/locales/en.ts b/packages/frontend/src/lib/i18n/locales/en.ts new file mode 100644 index 0000000..5a94f70 --- /dev/null +++ b/packages/frontend/src/lib/i18n/locales/en.ts @@ -0,0 +1,877 @@ +export default { + common: { + loading: "Loading...", + error: "Error", + success: "Success", + cancel: "Cancel", + save: "Save", + delete: "Delete", + edit: "Edit", + view: "View", + back: "Back", + next: "Next", + previous: "Previous", + search: "Search", + filter: "Filter", + sort: "Sort", + clear: "Clear", + submit: "Submit", + close: "Close", + open: "Open", + yes: "Yes", + no: "No", + }, + header: { + home: "Home", + models: "Models", + videos: "Videos", + magazine: "Magazine", + about: "About", + login: "Log In", + login_hint: "Return to your passion", + signup: "Sign Up", + signup_hint: "Join now our community", + logout: "Log Out", + logout_hint: "Sign out of your account", + dashboard: "Dashboard", + dashboard_hint: "Your settings and more", + play: "Play", + play_hint: "Bring your toys", + profile: "Profile", + mailto: "sexy@pivoine.art", + x: "bordeaux1981", + youtube: "lovesting", + navigation: "Navigation", + account: "Account", + }, + brand: { + name: "SexyArt", + tagline: "Where Love Meets Artistry", + description: + "The premier destination for artistic adult content, intimate storytelling, and creative expression through video and magazine content.", + }, + home: { + hero: { + title: "Where Love Meets Artistry", + subtitle: "Artistry", + description: + "Experience the most intimate and beautiful love stories through our exclusive video content and magazine features.", + cta_videos: "Explore Videos", + cta_models: "Meet Our Models", + }, + featured_models: { + title: "Featured Models", + description: "Meet our most beloved creators", + rating: "rating", + videos: "videos", + view_profile: "View Profile", + join_community: "Join Our Community", + join_community_description: + "Become part of the most exclusive love and romance community. Access premium content, connect with models, and experience love like never before.", + }, + trending: { + title: "Trending Now", + description: "Most watched romantic content", + views: "views", + trending: "Latest", + }, + community: { + title: "Join Our Community", + description: + "Become part of the most exclusive love and romance community. Access premium content, connect with models, and experience love like never before.", + cta_join: "Start Your Journey", + cta_magazine: "Read Magazine", + }, + }, + me: { + title: "Dashboard", + welcome: "Welcome back, {name}", + view_profile: "View Public Profile", + settings: { + title: "Settings", + profile_title: "Profile Settings", + profile_subtitle: "Update your profile information", + avatar: "Avatar", + first_name: "First Name", + first_name_placeholder: "John", + artist_name: "Artist Name", + artist_name_placeholder: "Johnny", + description: "Description", + description_placeholder: "Your description", + tags: "Tags", + tags_placeholder: "Enter tags", + last_name: "Last Name", + last_name_placeholder: "Doe", + update_profile: "Update Profile", + updating_profile: "Updating Profile...", + toast_update: "Your settings have been updated!", + error: "Heads Up!", + privacy_title: "Privacy & Security", + privacy_subtitle: "Manage your account privacy and security settings", + update_security: "Update Security", + updating_security: "Updating Security...", + password_error: "The password has to match the confirmation password.", + email: "Email", + email_placeholder: "your@email.com", + password: "Password", + password_placeholder: "Create a strong password", + confirm_password: "Confirm Password", + confirm_password_placeholder: "Confirm your password", + }, + }, + auth: { + login: { + title: "Sign In", + description: "Enter your credentials to access your account", + welcome: "Welcome back to your passion", + email: "Email", + email_placeholder: "your@email.com", + password: "Password", + password_placeholder: "Enter your password", + remember_me: "Remember me", + forgot_password: "Forgot password?", + signing_in: "Signing in...", + sign_in: "Sign In", + or_continue: "Or continue with", + google: "Google", + facebook: "Facebook", + no_account: "Don't have an account?", + sign_up_link: "Sign up now", + error: "Heads Up!", + }, + signup: { + title: "Create Account", + description: "Start your journey with us today", + welcome: "Join the most passionate community", + first_name: "First Name", + first_name_placeholder: "John", + last_name: "Last Name", + last_name_placeholder: "Doe", + email: "Email", + email_placeholder: "your@email.com", + account_type: "Account Type", + account_viewer: "Content Viewer", + account_creator: "Content Creator/Model", + password: "Password", + password_placeholder: "Create a strong password", + confirm_password: "Confirm Password", + confirm_password_placeholder: "Confirm your password", + terms_agreement: + "I agree to the {terms} and {privacy}. I confirm I am 18+ years old.", + terms_of_service: "Terms of Service", + privacy_policy: "Privacy Policy", + creating_account: "Creating account...", + create_account: "Create Account", + have_account: "Already have an account?", + sign_in_link: "Sign in here", + error: "Heads Up!", + agree_error: "You must confirm our terms of service and your age.", + password_error: "The password has to match the confirmation password.", + toast_register: "A verification email has been sent to {email}!", + toast_verify: "Your account has been activated!", + }, + password_request: { + title: "Password Request", + description: "Enter your email to reset your password", + welcome: "Return to your passion", + email: "Email", + email_placeholder: "your@email.com", + requesting: "Submitting...", + request: "Submit", + error: "Heads Up!", + toast_request: "A password reset email has been sent to {email}!", + }, + password_reset: { + title: "Password Reset", + description: "Enter your new password", + welcome: "Return to your passion now", + password: "Password", + password_placeholder: "Create a strong password", + confirm_password: "Confirm Password", + confirm_password_placeholder: "Confirm your password", + resetting: "Resetting...", + reset: "Reset", + error: "Heads Up!", + password_error: "The password has to match the confirmation password.", + toast_reset: "Your password has been reset!", + }, + }, + models: { + title: "Our Models", + description: + "Discover the most beautiful and talented creators sharing their passion and artistry.", + search_placeholder: "Search models...", + categories: { + all: "All Categories", + romantic: "Romantic", + artistic: "Artistic", + intimate: "Intimate", + }, + sort: { + popular: "Most Popular", + rating: "Highest Rated", + videos: "Most Videos", + name: "A-Z", + }, + online: "Online", + followers: "followers", + view_profile: "View Profile", + follow: "Follow", + no_results: "No models found matching your criteria.", + clear_filters: "Clear Filters", + back: "Back to Models", + joined: "Joined {join_date}", + comments: "Comments", + videos: "Videos", + photos: "Photos", + }, + videos: { + title: "Your Videos", + description: + "Explore our curated collection of intimate and artistic video content", + search_placeholder: "Search videos or models...", + categories: { + all: "All Categories", + romantic: "Romantic", + artistic: "Artistic", + intimate: "Intimate", + performance: "Performance", + }, + duration: { + all: "Any Duration", + short: "Short (< 10min)", + medium: "Medium (10-20min)", + long: "Long (20min+)", + }, + sort: { + trending: "Trending", + recent: "Most Recent", + popular: "Most Liked", + duration: "By Duration", + name: "A-Z", + }, + premium: "Premium", + views: "views", + watch: "Watch", + no_results: "No videos found matching your criteria.", + clear_filters: "Clear Filters", + comments: "Comments ({comments})", + hide: "Hide", + show: "Show", + add_comment_placeholder: "Add a comment...", + toast_comment: "Your comment has been sent", + comment: "Comment", + commenting: "Commenting...", + error: "Heads Up!", + back: "Back to Videos", + }, + magazine: { + title: "SexyArt Magazine", + description: + "Insights, stories, and inspiration from the world of love, art, and intimate expression", + search_placeholder: "Search articles...", + categories: { + all: "All Categories", + photography: "Photography", + production: "Production", + interview: "Interviews", + psychology: "Psychology", + trends: "Trends", + spotlight: "Spotlight", + }, + sort: { + recent: "Most Recent", + popular: "Most Popular", + featured: "Featured First", + name: "A-Z", + }, + featured: "Featured", + read_time: "{time} min read", + read_article: "Read Article", + no_results: "No articles found matching your criteria.", + clear_filters: "Clear Filters", + back: "Back to Magazine", + }, + tags: { + title: "{tag}", + description: 'Items tagged "{tag}".', + search_placeholder: "Search items...", + categories: { + all: "All Types", + video: "Video", + article: "Article", + model: "Model", + }, + view: "View {category}", + no_results: "No items found matching your criteria.", + clear_filters: "Clear Filters", + }, + dashboard: { + title: "Creator Dashboard", + welcome: "Welcome back, {name}", + view_profile: "View Public Profile", + tabs: { + overview: "Overview", + content: "Content", + upload: "Upload", + settings: "Settings", + }, + stats: { + total_views: "Total Views", + total_likes: "Total Likes", + subscribers: "Subscribers", + earnings: "Earnings", + }, + upload: { + title: "Upload New Content", + description: "Share your latest creations with your audience", + content_type: "Content Type", + video: "Video", + photo: "Photo", + drop_files: "Drop your {type} here or click to browse", + file_types: { + video: "MP4, MOV up to 2GB", + photo: "JPG, PNG up to 10MB", + }, + choose_file: "Choose File", + title_label: "Title", + title_placeholder: "Enter content title", + category: "Category", + description_label: "Description", + description_placeholder: "Describe your content...", + upload_content: "Upload Content", + }, + }, + about: { + title: "About SexyArt", + subtitle: + "Where passion meets artistry, and intimate storytelling becomes a celebration of human connection.", + join_community: "Join Our Community", + stats: { + members: "Active Members", + videos: "Premium Videos", + models: "Featured Models", + experience: "Industry Experience", + yearsFormatted: "{years} years", + }, + story: { + title: "Our Story", + subtitle: + "Born from a vision to transform how intimate content is created, shared, and appreciated", + description_part1: + "SexyArt was founded in 2019 with a simple yet powerful mission: to create a platform where intimate content could be appreciated as an art form, where creators could express their authentic selves, and where viewers could connect with content that celebrates love, passion, and human connection.", + description_part2: + "We recognized that the adult content industry needed a platform that prioritized artistic expression, creator empowerment, and community building. Our founders, coming from backgrounds in photography, digital media, and community management, set out to build something different.", + description_part3: + "Today, SexyArt is home to hundreds of talented creators and thousands of passionate community members who share our vision of elevating intimate content to new artistic heights.", + }, + values: { + title: "Our Values", + subtitle: + "The principles that guide everything we do and shape our community", + authentic_expression: { + title: "Authentic Expression", + description: + "We believe in celebrating genuine love, intimacy, and human connection through artistic expression.", + }, + safety_respect: { + title: "Safety & Respect", + description: + "Creating a secure environment where creators and viewers can explore content with confidence and respect.", + }, + artistic_excellence: { + title: "Artistic Excellence", + description: + "Promoting high-quality, artistic content that elevates intimate storytelling to an art form.", + }, + community_first: { + title: "Community First", + description: + "Building meaningful connections between creators and their audience through shared passion and appreciation.", + }, + }, + team: { + title: "Meet Our Team", + sebastian: { + name: "Sebastian Krüger", + role: "Founder & CEO", + image: "/img/sebastian.jpg", + bio: "Visionary leader with 15+ years in digital media and content creation.", + }, + valknar: { + name: "Valknar", + role: "Creative Director", + image: "/img/valknar.gif", + bio: "DJ and visual storyteller specializing in diffusion AI art.", + }, + subtitle: "The passionate individuals behind SexyArt's success", + }, + mission: { + title: "Our Mission", + description: + "To create the world's most respectful, artistic, and empowering platform for intimate content, where creators can thrive and audiences can discover meaningful connections through the art of love.", + cta_creator: "Become a Creator", + cta_community: "Join Our Community", + }, + contact: { + title: "Get in Touch", + description: + "Have questions about our platform or interested in partnering with us? We'd love to hear from you.", + general: { + title: "General Inquiries", + description: "Questions about our platform or services", + mailto: "sexy@pivoine.art", + }, + creators: { + title: "Creator Support", + description: "Support for our content creators", + mailto: "support@pivoine.art", + }, + }, + }, + faq: { + title: "Frequently Asked Questions", + description: + "Find answers to common questions about SexyArt, our platform, and services", + search_placeholder: "Search frequently asked questions...", + search_results: "Search Results ({count})", + no_results: "No questions found matching your search.", + clear_search: "Clear Search", + getting_started: { + title: "Getting Started", + questions: [ + { + question: "How do I create an account on SexyArt?", + answer: + "Creating an account is simple! Click the 'Join Now' button in the top navigation, fill out the registration form with your email and basic information, verify you're 18+, and agree to our terms. You'll receive a confirmation email to activate your account.", + }, + { + question: "What types of content can I find on SexyArt?", + answer: + "SexyArt features high-quality artistic adult content including intimate photography, romantic videos, artistic nude content, and creative adult entertainment. All content is created by verified models and creators who focus on artistic expression and storytelling.", + }, + { + question: "Is SexyArt safe and secure?", + answer: + "Yes! We use industry-standard encryption, secure payment processing, and strict privacy measures. All creators are verified, and we have comprehensive content moderation. Your personal information and viewing habits are kept completely private.", + }, + { + question: "Can I access SexyArt on mobile devices?", + answer: + "Absolutely! SexyArt is fully responsive and works perfectly on smartphones, tablets, and desktop computers. You can enjoy the same high-quality experience across all your devices.", + }, + ], + }, + creators: { + title: "For Creators & Models", + questions: [ + { + question: "How do I become a creator on SexyArt?", + answer: + "To become a creator, sign up for a Creator account during registration or upgrade your existing account. You'll need to verify your identity, provide tax information, and agree to our creator terms. Once approved, you can start uploading content and building your audience.", + }, + { + question: "How much can I earn as a creator?", + answer: + "Creator earnings vary based on content quality, audience engagement, and marketing efforts. Our creators typically earn between $500-$10,000+ per month. We offer competitive revenue sharing, with creators keeping 70-80% of their earnings after platform fees.", + }, + { + question: "What content guidelines do I need to follow?", + answer: + "All content must feature consenting adults 18+, be original or properly licensed, and comply with our community standards. We prohibit violent, non-consensual, or illegal content. Focus on artistic, creative, and high-quality productions for best results.", + }, + { + question: "How do I promote my content and gain followers?", + answer: + "Use engaging titles and descriptions, post consistently, interact with your audience through comments and messages, collaborate with other creators, and utilize our promotional tools. High-quality content and authentic engagement are key to building a loyal fanbase.", + }, + ], + }, + payments: { + title: "Payments & Subscriptions", + }, + privacy: { + title: "Privacy & Safety", + questions: [ + { + question: "How do you protect my privacy?", + answer: + "We use advanced encryption, never share personal information with third parties, offer anonymous browsing options, and allow you to control your privacy settings. Your viewing history and personal data are kept strictly confidential.", + }, + { + question: "Can I block or report inappropriate content?", + answer: + "Yes! Every piece of content has report and block options. Our moderation team reviews all reports within 24 hours. You can also block specific creators or users to customize your experience.", + }, + { + question: "How do you verify creator identities?", + answer: + "All creators must provide government-issued ID, proof of age (18+), and complete identity verification. We also require signed model releases for all content featuring multiple people. This ensures all content is legal and consensual.", + }, + { + question: "What if I forget my password?", + answer: + "Click 'Forgot Password' on the login page, enter your email address, and we'll send you a secure reset link. For additional security, you can enable two-factor authentication in your account settings.", + }, + ], + }, + technical: { + title: "Technical Support", + questions: [ + { + question: "Why is my video not loading?", + answer: + "Video issues are usually related to internet connection or browser settings. Try refreshing the page, clearing your browser cache, or switching to a different browser. For persistent issues, check our system status page or contact support.", + }, + { + question: "How do I update my account information?", + answer: + "Go to Account Settings from your profile menu. You can update your email, password, payment methods, and privacy preferences. Some changes may require email verification for security.", + }, + { + question: "Can I download content for offline viewing?", + answer: + "Premium subscribers can download select content for offline viewing within our mobile app. Downloaded content expires after 30 days and cannot be shared or transferred to other devices.", + }, + { + question: "How do I contact customer support?", + answer: + "You can reach our support team via email at support@sexyart.com, through the live chat feature (available 24/7), or by submitting a ticket through your account dashboard. We typically respond within 2-4 hours.", + }, + ], + }, + support: { + title: "Still Need Help?", + description: + "Can't find the answer you're looking for? Our support team is here to help you 24/7.", + contact: "Contact Support", + contact_email: "support@pivoine.art", + live_chat: "Live Chat", + }, + }, + imprint: { + title: "Imprint", + description: "Legal information and company details", + company_information: "Company Information", + company_name: { + title: "Company Name", + value: "SexyArt", + }, + legal_form: { + title: "Legal Form", + value: "-", + }, + registration_number: { + title: "Registration Number", + value: "-", + }, + tax_id: { + title: "Registration Tax ID", + value: "-", + }, + contact_information: "Contact Information", + registered_address: "Registered Address", + address: { + company: "SexyArt", + name: "Sebastian Krüger", + street: "Neue Weinsteige 21", + city: "70180 Stuttgart", + country: "Germany", + }, + phone: { + title: "Phone", + value: "+49 (174) 8188918", + }, + email: { + title: "Email", + value: "admin@pivoine.art", + }, + website: { + title: "Website", + value: "pivoine.art", + }, + disclaimer: "Disclaimer", + disclaimer_text: [ + "The information contained on this website is for general information purposes only. While we endeavor to keep the information up to date and correct, we make no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability, or availability with respect to the website or the information, products, services, or related graphics contained on the website for any purpose.", + "This website contains adult content and is intended for mature audiences only. By accessing this site, you confirm that you are at least 18 years of age and that you are legally allowed to view such content in your jurisdiction.", + "All content on this platform is created by consenting adults and is protected by copyright laws. Unauthorized reproduction or distribution of any content is strictly prohibited.", + ], + last_updated: "Last updated: September 5, 2025", + }, + legal: { + title: "Legal Information", + description: "Our commitment to transparency, privacy, and user rights", + privacy: { + title: "Privacy Policy", + last_updated: "Last updated: September 5, 2025", + information: { + title: "1. Information We Collect", + text: [ + "Personal Information: When you create an account, we collect information such as your email address, username, and profile information you choose to provide.", + "Content Information: We collect information about the content you upload, view, and interact with on our platform.", + ], + }, + information_use: { + title: "2. How We Use Your Information", + subtitle: "We use your information to:", + text: [ + "
  • Provide and improve our services
  • Communicate with you about your account and our services
  • Personalize your experience on our platform
  • Ensure platform security and prevent fraud
  • Comply with legal obligations
  • ", + ], + }, + information_sharing: { + title: "3. Information Sharing", + subtitle: + "We do not sell your personal information. We may share your information in the following circumstances:", + text: [ + "
  • With your consent
  • With service providers who help us operate our platform
  • To comply with legal requirements
  • To protect our rights and the safety of our users
  • In connection with a business transaction
  • ", + ], + }, + security: { + title: "4. Data Security", + text: [ + "We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. This includes encryption, secure servers, and regular security audits.", + ], + }, + rights: { + title: "5. Your Rights", + subtitle: "You have the right to:", + text: [ + "
  • Access your personal information
  • Correct inaccurate information
  • Delete your account and personal information
  • Object to processing of your information
  • Data portability
  • Withdraw consent at any time
  • ", + ], + }, + }, + terms: { + title: "Terms of Service", + last_updated: "Last updated: September 5, 2025", + acceptance: { + title: "1. Acceptance of Terms", + text: [ + "By accessing and using SexyArt, you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to abide by the above, please do not use this service.", + ], + }, + age: { + title: "2. Age Restriction", + text: [ + "You must be at least 18 years old to use this service. By using our platform, you represent and warrant that you are at least 18 years of age and have the legal capacity to enter into this agreement.", + ], + }, + accounts: { + title: "3. User Accounts", + subtitle: "When creating an account, you agree to:", + text: [ + "
  • Provide accurate and complete information
  • Maintain the security of your account credentials
  • Accept responsibility for all activities under your account
  • Notify us immediately of any unauthorized use
  • ", + ], + }, + content: { + title: "4. Content Guidelines", + subtitle: + "All content must comply with our community guidelines. Prohibited content includes:", + text: [ + "
  • Content involving minors
  • Non-consensual content
  • Violent or harmful content
  • Copyrighted material without permission
  • Spam or misleading content
  • ", + ], + }, + payment: { + title: "5. Payment Terms", + subtitle: "For paid services:", + text: [ + "
  • All payments are processed securely through third-party providers
  • Subscriptions renew automatically unless cancelled
  • Refunds are subject to our refund policy
  • Prices may change with 30 days notice
  • ", + ], + }, + termination: { + title: "6. Termination", + text: [ + "We reserve the right to terminate or suspend your account at any time for violations of these terms. You may also terminate your account at any time through your account settings.", + ], + }, + }, + community: { + title: "Community Guidelines", + description: "Creating a safe and respectful environment for all", + values: { + title: "Our Community Values", + text: [ + "SexyArt is built on respect, consent, and artistic expression. We believe in creating a space where creators and viewers can connect through shared appreciation for intimate art and storytelling.", + ], + }, + respect: { + title: "Respect and Consent", + text: [ + "
  • All content must be created with full consent of all participants
  • Respect creators' boundaries and content preferences
  • No harassment, bullying, or discriminatory behavior
  • Respect privacy and do not share personal information
  • ", + ], + }, + standards: { + title: "Content Standards", + text: [ + "
  • Content should celebrate love, intimacy, and human connection
  • Artistic and creative expression is encouraged
  • Content must comply with all applicable laws
  • No violent, degrading, or harmful content
  • ", + ], + }, + interaction: { + title: "Community Interaction", + text: [ + "
  • Engage respectfully in comments and messages
  • Support creators through positive feedback
  • Report inappropriate content or behavior
  • Help maintain a welcoming environment for all
  • ", + ], + }, + enforcement: { + title: "Enforcement", + text: [ + "Violations of our community guidelines may result in content removal, account suspension, or permanent ban. We review all reports and take appropriate action to maintain a safe environment.", + ], + }, + }, + cookie: { + title: "Cookie Policy", + description: "How we use cookies and similar technologies", + what: { + title: "What Are Cookies", + text: [ + "Cookies are small text files that are stored on your device when you visit our website. They help us provide you with a better experience by remembering your preferences and improving our services.", + ], + }, + types: { + title: "Types of Cookies We Use", + essential: { + title: "Essential Cookies", + text: [ + "These cookies are necessary for the website to function properly. They enable basic features like page navigation and access to secure areas.", + ], + }, + }, + managing: { + title: "Managing Cookies", + subtitle: "You can control cookies through:", + text: [ + "
  • Your browser settings
  • Third-party opt-out tools
  • ", + "Please note that disabling certain cookies may affect the functionality of our website.", + ], + }, + third_party: { + title: "Third-Party Cookies", + text: [ + "We may use third-party services that set their own cookies. These include analytics providers, payment processors, and content delivery networks. Please refer to their respective privacy policies for more information.", + ], + }, + }, + questions: "Questions About Our Legal Policies?", + questions_description: + "If you have any questions about our legal policies, please don't hesitate to contact us.", + questions_email: "support@pivoine.art", + }, + play: { + title: "SexyPlay", + description: "Bring your toys.", + scan: "Start Scan", + scanning: "Scanning...", + no_results: "No Devices founds", + }, + error: { + not_found: "Oops! Page Not Found", + common: "Oops! An Error Occured", + description: + "The page you're looking for seems to have vanished into the digital void. Don't worry, even in the world of love and art, sometimes we lose our way.", + go_home: "Go Home", + explore_videos: "Explore Videos", + quick_links: "Or try one of these popular sections:", + featured_models: "Featured Models", + magazine: "Magazine", + about_us: "About Us", + }, + footer: { + description: + "The premier destination for artistic adult content, intimate storytelling, and creative expression through video and magazine content.", + quick_links: "Quick Links", + models: "Models", + videos: "Videos", + magazine: "Magazine", + about: "About", + support: "Support", + contact_support: "Contact Support", + contact_support_email: "support@pivoine.art", + model_applications: "Model Applications", + model_applications_email: "sexy@pivoine.art", + contact: { + email: "sexy@pivoine.art", + x: "bordeaux1981", + youtube: "lovesting", + }, + faq: "FAQ", + legal: "Legal", + privacy_policy: "Privacy Policy", + terms_of_service: "Terms of Service", + imprint: "Imprint", + copyright: "© 2025 Valknar. All rights reserved. | 18+ Content Warning", + }, + sharing_popup: { + title: "Share Content", + description: "Choose how you'd like to share this {type}", + subtitle: "Share your content", + share: { + x: "Share on X (Twitter)", + facebook: "Share on Facebook", + email: "Share via Email", + whatsapp: "Share on WhatsApp", + telegram: "Share on Telegram", + copy: "Copy Link to Clipboard", + }, + success: { + x: "Opened X (Twitter) sharing window", + facebook: "Opened Facebook sharing window", + email: "Opened email client", + whatsapp: "Opened WhatsApp sharing", + telegram: "Opened Telegram sharing", + copy: "Copied link to clipboard", + }, + close: "Close", + }, + age_verification_dialog: { + title: "Age Verification", + description: + 'By clicking "Confirm", you verify that you are 18 years or older.', + age: "18+", + confirm: "Confirm", + exit: "Exit", + exit_url: "https://pivoine.art", + }, + newsletter_signup: { + title: "Stay Updated", + description: + "Get the latest articles and insights delivered to your inbox.", + email: "Email", + email_placeholder: "your@email.com", + cta: "Subscribe to Newsletter", + close: "Close", + subscribe: "Subscribe", + subscribing: "Subscribing", + toast_subscribe: "Your email has been added to the newsletter list!", + }, + sharing_popup_button: { + share: "Share", + }, + image_viewer: { + index: "Image {index} of {size}", + previous: "Previous", + next: "Next", + close: "Close", + download: "Download", + }, + device_card: { + active: "Active", + paused: "Paused", + current_value: "Current Value", + battery: "Battery", + last_seen: "Last seen", + connect: "Connect", + disconnect: "Disconnect", + actuator_types: { + unknown: "Unknown", + vibrate: "Vibrate", + rotate: "Rotate", + oscillate: "Oscillate", + constrict: "Constrict", + inflate: "Inflate", + position: "Position", + }, + }, + head: { + title: "SexyArt | {title}", + }, +}; diff --git a/packages/frontend/src/lib/services.ts b/packages/frontend/src/lib/services.ts new file mode 100644 index 0000000..fa4b8d2 --- /dev/null +++ b/packages/frontend/src/lib/services.ts @@ -0,0 +1,402 @@ +import { getDirectusInstance } from "$lib/directus"; +import { + readItems, + registerUser, + updateMe, + readMe, + registerUserVerify, + readUsers, + passwordRequest, + passwordReset, + customEndpoint, + readFolders, + deleteFile, + uploadFiles, + createComment, + readComments, + aggregate, +} from "@directus/sdk"; +import type { Article, Model, Stats, User, Video } from "$lib/types"; +import { PUBLIC_URL || http://localhost:3000 } from "$env/static/public"; + +const userFields = [ + "*", + { + avatar: ["*"], + policies: ["*", { policy: ["name", "id"] }], + role: ["*", { policies: [{ policy: ["name", "id"] }] }], + }, +]; + +export async function isAuthenticated(token: string) { + try { + const directus = getDirectusInstance(fetch); + directus.setToken(token); + const user = await directus.request( + readMe({ + fields: userFields, + }), + ); + return { authenticated: true, user }; + } catch { + return { authenticated: false }; + } +} + +export async function register( + email: string, + password: string, + firstName: string, + lastName: string, +) { + const directus = getDirectusInstance(fetch); + return directus.request( + registerUser(email, password, { + verification_url: `${PUBLIC_URL || http://localhost:3000}/signup/verify`, + first_name: firstName, + last_name: lastName, + }), + ); +} + +export async function verify(token: string, fetch?: typeof globalThis.fetch) { + const directus = fetch + ? getDirectusInstance((args) => fetch(args, { redirect: "manual" })) + : getDirectusInstance(fetch); + return directus.request(registerUserVerify(token)); +} + +export async function login(email: string, password: string) { + const directus = getDirectusInstance(fetch); + return directus.login({ email, password }); +} + +export async function logout() { + const directus = getDirectusInstance(fetch); + return directus.logout(); +} + +export async function requestPassword(email: string) { + const directus = getDirectusInstance(fetch); + return directus.request( + passwordRequest(email, `${PUBLIC_URL || http://localhost:3000}/password/reset`), + ); +} + +export async function resetPassword(token: string, password: string) { + const directus = getDirectusInstance(fetch); + return directus.request(passwordReset(token, password)); +} + +export async function getArticles(fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus.request( + readItems("sexy_articles", { + fields: ["*", "author.*"], + where: { publish_date: { _lte: new Date().toISOString() } }, + sort: ["-publish_date"], + }), + ); +} + +export async function getArticleBySlug( + slug: string, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus + .request( + readItems("sexy_articles", { + fields: ["*", "author.*"], + filter: { slug: { _eq: slug } }, + }), + ) + .then((articles) => { + if (articles.length === 0) { + throw new Error("Article not found"); + } + return articles[0]; + }); +} + +export async function getVideos(fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus + .request( + readItems("sexy_videos", { + fields: [ + "*", + { + models: [ + "*", + { + directus_users_id: ["*"], + }, + ], + }, + "movie.*", + ], + filter: { upload_date: { _lte: new Date().toISOString() } }, + sort: ["-upload_date"], + }), + ) + .then((videos) => { + videos.forEach((video) => { + video.models = video.models.map((u) => u.directus_users_id!); + }); + return videos; + }); +} + +export async function getVideosForModel(id, fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus.request( + readItems("sexy_videos", { + fields: ["*", "movie.*"], + filter: { + models: { + directus_users_id: { + id, + }, + }, + }, + sort: ["-upload_date"], + }), + ); +} + +export async function getFeaturedVideos( + limit: number, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus + .request( + readItems("sexy_videos", { + fields: [ + "*", + { + models: [ + "*", + { + directus_users_id: ["*"], + }, + ], + }, + "movie.*", + ], + filter: { + upload_date: { _lte: new Date().toISOString() }, + featured: true, + }, + sort: ["-upload_date"], + limit, + }), + ) + .then((videos) => { + videos.forEach((video) => { + video.models = video.models.map((u) => u.directus_users_id!); + }); + return videos; + }); +} + +export async function getVideoBySlug( + slug: string, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus + .request( + readItems("sexy_videos", { + fields: [ + "*", + { + models: [ + "*", + { + directus_users_id: ["*"], + }, + ], + }, + "movie.*", + ], + filter: { slug }, + }), + ) + .then((videos) => { + if (videos.length === 0) { + throw new Error("Video not found"); + } + videos[0].models = videos[0].models.map((u) => u.directus_users_id!); + + return videos[0]; + }); +} + +const modelFilter = { + _or: [ + { + policies: { + policy: { + name: { + _eq: "Model", + }, + }, + }, + }, + { + role: { + name: { + _eq: "Model", + }, + }, + }, + ], +}; + +export async function getModels(fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus.request( + readUsers({ + fields: ["*"], + filter: modelFilter, + sort: ["-join_date"], + }), + ); +} + +export async function getFeaturedModels( + limit = 3, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus.request( + readUsers({ + fields: ["*"], + filter: { _and: [modelFilter, { featured: { _eq: true } }] }, + sort: ["-join_date"], + limit, + }), + ); +} + +export async function getModelBySlug( + slug: string, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus + .request( + readUsers({ + fields: [ + "*", + { + photos: [ + "*", + { + directus_files_id: ["*"], + }, + ], + }, + "banner.*", + ], + filter: { _and: [modelFilter, { slug: { _eq: slug } }] }, + }), + ) + .then((models) => { + if (models.length === 0) { + throw new Error("Model not found"); + } + models[0].photos = models[0].photos.map((p) => p.directus_files_id!); + return models[0]; + }); +} + +export async function updateProfile(user: Partial) { + const directus = getDirectusInstance(fetch); + return directus.request(updateMe(user as never)); +} + +export async function getStats(fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus.request( + customEndpoint({ + path: "/sexy/stats", + }), + ); +} + +export async function getFolders(fetch?: typeof globalThis.fetch) { + const directus = getDirectusInstance(fetch); + return directus.request(readFolders()); +} + +export async function removeFile(id: string) { + const directus = getDirectusInstance(fetch); + return directus.request(deleteFile(id)); +} + +export async function uploadFile(data: FormData) { + const directus = getDirectusInstance(fetch); + return directus.request(uploadFiles(data)); +} + +export async function createCommentForVideo(item: string, comment: string) { + const directus = getDirectusInstance(fetch); + return directus.request( + createComment({ + collection: "sexy_videos", + item, + comment, + }), + ); +} + +export async function getCommentsForVideo( + item: string, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus.request( + readComments({ + fields: ["*", { user_created: ["*"] }], + filter: { collection: "sexy_videos", item }, + sort: ["-date_created"], + }), + ); +} + +export async function countCommentsForModel( + user_created: string, + fetch?: typeof globalThis.fetch, +) { + const directus = getDirectusInstance(fetch); + return directus + .request<[{ count: number }]>( + aggregate("directus_comments", { + aggregate: { + count: "*", + }, + query: { + filter: { user_created }, + }, + }), + ) + .then((result) => result[0].count); +} + +export async function getItemsByTag( + category: "video" | "article" | "model", + tag: string, + fetch?: typeof globalThis.fetch, +) { + switch (category) { + case "video": + return getVideos(fetch); + case "model": + return getModels(fetch); + case "article": + return getArticles(fetch); + } +} diff --git a/packages/frontend/src/lib/types.ts b/packages/frontend/src/lib/types.ts new file mode 100644 index 0000000..3405f44 --- /dev/null +++ b/packages/frontend/src/lib/types.ts @@ -0,0 +1,124 @@ +import { ButtplugClientDevice } from "@sexy.pivoine.art/buttplug"; + +export interface User { + id: string; + first_name: string; + last_name: string; + artist_name: string; + slug: string; + email: string; + description: string; + tags: string[]; + avatar: string | File; + password: string; + directus_users_id?: User; +} + +export interface CurrentUser extends User { + avatar: File; + role: { + name: string; + }; + policies: { + policy: { + name: string; + }; + }[]; +} + +export interface AuthStatus { + authenticated: boolean; + user?: CurrentUser; + data?: { + refresh_token: string | null; + }; +} + +export interface File { + id: string; + filesize: number; + title: string; + description: string; + duration: number; + directus_files_id?: File; +} + +export interface Article { + id: string; + slug: string; + title: string; + excerpt: string; + content: string; + image: string; + tags: string[]; + publish_date: Date; + author: { + first_name: string; + last_name: string; + avatar: string; + description?: string; + website?: string; + }; + category: string; + featured?: boolean; +} + +export interface Model { + id: string; + slug: string; + artist_name: string; + description: string; + avatar: string; + category: string; + tags: string[]; + join_date: Date; + featured?: boolean; + photos: File[]; + banner?: File; +} + +export interface Video { + id: string; + slug: string; + title: string; + description: string; + image: string; + movie: File; + models: User[]; + tags: string[]; + upload_date: Date; + premium?: boolean; + featured?: boolean; +} + +export interface Comment { + id: string; + comment: string; + item: string; + user_created: User; + date_created: Date; +} + +export interface Stats { + videos_count: number; + models_count: number; + viewers_count: number; +} + +export interface BluetoothDevice { + id: string; + name: string; + actuatorValues: number[]; + sensorValues: number[]; + batteryLevel: number; + isConnected: boolean; + lastSeen: Date; + info: ButtplugClientDevice; +} + +export interface ShareContent { + title: string; + description: string; + url: string; + type: "video" | "model" | "article" | "link"; +} diff --git a/packages/frontend/src/lib/utils.ts b/packages/frontend/src/lib/utils.ts new file mode 100644 index 0000000..e8a0843 --- /dev/null +++ b/packages/frontend/src/lib/utils.ts @@ -0,0 +1,44 @@ +import { browser } from "$app/environment"; +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } + ? Omit + : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { + ref?: U | null; +}; + +export const calcReadingTime = (text: string) => { + const wordsPerMinute = 200; // Average case. + const textLength = text.split(" ").length; // Split by words + if (textLength > 0) { + return Math.ceil(textLength / wordsPerMinute); + } + return 0; +}; + +export const getUserInitials = (name: string) => { + return name + .split(" ") + .map((word) => word.charAt(0)) + .join("") + .toUpperCase() + .slice(0, 2); +}; + +export const formatVideoDuration = (duration: number) => { + const hours = Math.floor(duration / 3600); + const minutes = Math.floor((duration - hours * 3600) / 60); + const seconds = duration - hours * 3600 - minutes * 60; + + return `${hours < 10 ? "0" + hours : hours}:${minutes < 10 ? "0" + minutes : minutes}:${seconds < 10 ? "0" + seconds : seconds}`; +}; diff --git a/packages/frontend/src/lib/utils/utils.ts b/packages/frontend/src/lib/utils/utils.ts new file mode 100644 index 0000000..8f6b51d --- /dev/null +++ b/packages/frontend/src/lib/utils/utils.ts @@ -0,0 +1,21 @@ +/* + Installed from @ieedan/shadcn-svelte-extras +*/ + +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } + ? Omit + : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { + ref?: U | null; +}; diff --git a/packages/frontend/src/routes/+error.svelte b/packages/frontend/src/routes/+error.svelte new file mode 100644 index 0000000..1a84906 --- /dev/null +++ b/packages/frontend/src/routes/+error.svelte @@ -0,0 +1,123 @@ + + + + +
    + + + +
    +
    + + + + +
    +
    + {page.status} +
    +
    + +
    +
    + + +
    +

    + {page.status === 404 ? $_("error.not_found") : $_("error.common")} +

    +

    + {$_("error.description")} +

    +
    + + +
    + + + +
    + + +
    +

    + {$_("error.quick_links")} +

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    diff --git a/packages/frontend/src/routes/+layout.server.ts b/packages/frontend/src/routes/+layout.server.ts new file mode 100644 index 0000000..c94572d --- /dev/null +++ b/packages/frontend/src/routes/+layout.server.ts @@ -0,0 +1,5 @@ +export async function load({ locals }) { + return { + authStatus: locals.authStatus, + }; +} diff --git a/packages/frontend/src/routes/+layout.svelte b/packages/frontend/src/routes/+layout.svelte new file mode 100644 index 0000000..3b32aa6 --- /dev/null +++ b/packages/frontend/src/routes/+layout.svelte @@ -0,0 +1,78 @@ + + + + {#if import.meta.env.PROD && PUBLIC_UMAMI_ID} + + {/if} + + + + + + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + +
    + + +
    + {@render children()} +
    + + +
    +
    diff --git a/packages/frontend/src/routes/+layout.ts b/packages/frontend/src/routes/+layout.ts new file mode 100644 index 0000000..facc18b --- /dev/null +++ b/packages/frontend/src/routes/+layout.ts @@ -0,0 +1,7 @@ +import TimeAgo from "javascript-time-ago"; +import en from "javascript-time-ago/locale/en"; + +TimeAgo.addDefaultLocale(en); + +export const prerender = false; +export const trailingSlash = "always"; diff --git a/packages/frontend/src/routes/+page.server.ts b/packages/frontend/src/routes/+page.server.ts new file mode 100644 index 0000000..6c5a1f3 --- /dev/null +++ b/packages/frontend/src/routes/+page.server.ts @@ -0,0 +1,7 @@ +import { getFeaturedModels, getFeaturedVideos } from "$lib/services"; +export async function load({ fetch }) { + return { + models: await getFeaturedModels(3, fetch), + videos: await getFeaturedVideos(3, fetch), + }; +} diff --git a/packages/frontend/src/routes/+page.svelte b/packages/frontend/src/routes/+page.svelte new file mode 100644 index 0000000..ee1e98c --- /dev/null +++ b/packages/frontend/src/routes/+page.svelte @@ -0,0 +1,214 @@ + + + + + +
    + +
    + + +
    +
    +

    + {$_('home.hero.title')} +

    + +

    + {$_('home.hero.description')} +

    + +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +

    + {$_('home.featured_models.title')} +

    +

    + {$_('home.featured_models.description')} +

    +
    + +
    + {#each data.models as model} + + +
    + {model.artist_name} + +
    +

    {model.artist_name}

    + + +
    +
    + {/each} +
    +
    +
    + + +
    +
    +
    +

    + {$_('home.trending.title')} +

    + +
    + +
    + {#each data.videos as video} + +
    + {video.title} +
    +
    + {formatVideoDuration(video.movie.duration)} +
    + +
    + + + +
    +
    + +

    + {video.title} +

    + +
    + + {$_('home.trending.trending')} +
    +
    +
    + {/each} +
    +
    +
    + + +
    +
    +
    +

    + {$_('home.featured_models.join_community')} +

    +

    + {$_('home.featured_models.join_community_description')} +

    +
    + + +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/about/+page.server.ts b/packages/frontend/src/routes/about/+page.server.ts new file mode 100644 index 0000000..5964cb2 --- /dev/null +++ b/packages/frontend/src/routes/about/+page.server.ts @@ -0,0 +1,6 @@ +import { getStats } from "$lib/services"; +export async function load({ fetch }) { + return { + stats: await getStats(fetch), + }; +} diff --git a/packages/frontend/src/routes/about/+page.svelte b/packages/frontend/src/routes/about/+page.svelte new file mode 100644 index 0000000..323f23d --- /dev/null +++ b/packages/frontend/src/routes/about/+page.svelte @@ -0,0 +1,312 @@ + + + + +
    + + + +
    +
    +
    +
    +

    + {$_("about.title")} +

    +

    + {$_("about.subtitle")} +

    +
    + +
    +
    +
    +
    + + +
    +
    +
    + {#each stats as stat} +
    +
    + +
    +
    {stat.value}
    +
    {stat.label}
    +
    + {/each} +
    +
    +
    + + +
    +
    +
    +
    +

    + {$_("about.story.title")} +

    +

    + {$_("about.story.subtitle")} +

    +
    + +
    +
    +

    + {$_("about.story.description_part1")} +

    +

    + {$_("about.story.description_part2")} +

    +

    + {$_("about.story.description_part3")} +

    +
    +
    + Our story +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +

    + {$_("about.values.title")} +

    +

    + {$_("about.values.subtitle")} +

    +
    + +
    + {#each values as value} + + +
    +
    + +
    +
    +

    {value.title}

    +

    + {value.description} +

    +
    +
    +
    +
    + {/each} +
    +
    +
    + + +
    +
    +
    +

    + {$_("about.team.title")} +

    +

    + {$_("about.team.subtitle")} +

    +
    + +
    + {#each team as member} + + + {member.name} +

    {member.name}

    +

    {member.role}

    +

    + {member.bio} +

    +
    +
    + {/each} +
    +
    +
    + + +
    +
    +
    +

    + {$_("about.mission.title")} +

    +

    + {$_("about.mission.description")} +

    +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +

    + {$_("about.contact.title")} +

    +

    + {$_("about.contact.description")} +

    +
    + + +

    + {$_("about.contact.general.title")} +

    +

    + {$_("about.contact.general.description")} +

    + {$_("about.contact.general.mailto")} +
    +
    + + +

    + {$_("about.contact.creators.title")} +

    +

    + {$_("about.contact.creators.description")} +

    + {$_("about.contact.creators.mailto")} +
    +
    +
    +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/faq/+page.svelte b/packages/frontend/src/routes/faq/+page.svelte new file mode 100644 index 0000000..35b5f92 --- /dev/null +++ b/packages/frontend/src/routes/faq/+page.svelte @@ -0,0 +1,357 @@ + + + + +
    + + +
    + +
    +

    + {$_("faq.title")} +

    +

    + {$_("faq.description")} +

    +
    + + +
    +
    + + +
    +
    + + {#if searchQuery.trim()} + +
    +

    + {$_("faq.search_results", { + values: { count: filteredQuestions().length }, + })} +

    +
    + {#each filteredQuestions() as question} + + + + {#if expandedItems.has(question.id)} +
    +

    + {question.answer} +

    +
    + {/if} +
    +
    + {/each} +
    + {#if filteredQuestions.length === 0} +
    +

    {$_("faq.no_results")}

    + +
    + {/if} +
    + {:else} + +
    +
    + {#each faqCategories as category} + + + +
    + +
    + {category.title} +
    +
    + +
    + {#each category.questions as question} +
    + + {#if expandedItems.has(question.id)} +
    +

    + {question.answer} +

    +
    + {/if} +
    + {/each} +
    +
    +
    + {/each} +
    +
    + {/if} + + +
    + + +

    {$_("faq.support.title")}

    +

    + {$_("faq.support.description")} +

    +
    + + +
    +
    +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/imprint/+page.svelte b/packages/frontend/src/routes/imprint/+page.svelte new file mode 100644 index 0000000..38e7f26 --- /dev/null +++ b/packages/frontend/src/routes/imprint/+page.svelte @@ -0,0 +1,273 @@ + + + + +
    + + +
    +
    + +
    +

    + {$_("imprint.title")} +

    +

    + {$_("imprint.description")} +

    +
    + + + + + + + {$_("imprint.company_information")} + + + +
    +
    +

    + {$_("imprint.company_name.title")} +

    +

    + {$_("imprint.company_name.value")} +

    +
    +
    +

    + {$_("imprint.legal_form.title")} +

    +

    + {$_("imprint.legal_form.value")} +

    +
    +
    +

    + {$_("imprint.registration_number.title")} +

    +

    + {$_("imprint.registration_number.value")} +

    +
    +
    +

    {$_("imprint.tax_id.title")}

    +

    {$_("imprint.tax_id.value")}

    +
    +
    +
    +
    + + + + + + + {$_("imprint.contact_information")} + + + +
    +
    +

    + {$_("imprint.registered_address")} +

    +
    +

    {$_("imprint.address.company")}

    +

    {$_("imprint.address.name")}

    +

    {$_("imprint.address.street")}

    +

    {$_("imprint.address.city")}

    +

    {$_("imprint.address.country")}

    +
    +
    + +
    + + + +
    +
    + +
    +

    {$_("imprint.phone.title")}

    +

    {$_("imprint.phone.value")}

    +
    +
    +
    + +
    +

    {$_("imprint.email.title")}

    +

    {$_("imprint.email.value")}

    +
    +
    +
    + +
    +

    + {$_("imprint.website.title")} +

    +

    + {$_("imprint.website.value")} +

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + {$_("imprint.disclaimer")} + + +

    + {$_("imprint.disclaimer_text.0")} +

    +

    + {$_("imprint.disclaimer_text.1")} +

    +

    + {$_("imprint.disclaimer_text.2")} +

    +
    +
    + + +
    +

    {$_("imprint.last_updated")}

    +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/legal/+page.svelte b/packages/frontend/src/routes/legal/+page.svelte new file mode 100644 index 0000000..46be1a2 --- /dev/null +++ b/packages/frontend/src/routes/legal/+page.svelte @@ -0,0 +1,437 @@ + + + + +
    + + +
    +
    + +
    +

    + {$_("legal.title")} +

    +

    + {$_("legal.description")} +

    +
    + + + + + + + {$_("legal.privacy.title")} + + + + {$_("legal.terms.title")} + + + + {$_("legal.community.title")} + + + + {$_("legal.cookie.title")} + + + + + + + + + + {$_("legal.privacy.title")} + +

    + {$_("legal.privacy.last_updated")} +

    +
    + +
    +

    + {$_("legal.privacy.information.title")} +

    +
    +

    + {@html $_("legal.privacy.information.text.0")} +

    +

    + {@html $_("legal.privacy.information.text.1")} +

    + + +
    +
    + + + +
    +

    + {$_("legal.privacy.information_use.title")} +

    +
    +

    {$_("legal.privacy.information_use.subtitle")}

    +
      + {@html $_("legal.privacy.information_use.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.privacy.information_sharing.title")} +

    +
    +

    + {$_("legal.privacy.information_sharing.subtitle")} +

    +
      + {@html $_("legal.privacy.information_sharing.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.privacy.security.title")} +

    +

    + {@html $_("legal.privacy.security.text.0")} +

    +
    + + + +
    +

    + {$_("legal.privacy.rights.title")} +

    +
    +

    {$_("legal.privacy.rights.subtitle")}

    +
      + {@html $_("legal.privacy.rights.text.0")} +
    +
    +
    +
    +
    +
    + + + + + + + + {$_("legal.terms.title")} + +

    + {$_("legal.terms.last_updated")} +

    +
    + +
    +

    + {$_("legal.terms.acceptance.title")} +

    +

    + {@html $_("legal.terms.acceptance.text.0")} +

    +
    + + + +
    +

    + {$_("legal.terms.age.title")} +

    +

    + {@html $_("legal.terms.age.text.0")} +

    +
    + + + +
    +

    + {$_("legal.terms.accounts.title")} +

    +
    +

    {$_("legal.terms.accounts.subtitle")}

    +
      + {@html $_("legal.terms.accounts.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.terms.content.title")} +

    +
    +

    + {$_("legal.terms.content.subtitle")} +

    +
      + {@html $_("legal.terms.content.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.terms.payment.title")} +

    +
    +

    {$_("legal.terms.payment.subtitle")}

    +
      + {@html $_("legal.terms.payment.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.terms.termination.title")} +

    +

    + {@html $_("legal.terms.termination.text.0")} +

    +
    +
    +
    +
    + + + + + + + + {$_("legal.community.title")} + +

    + {$_("legal.community.description")} +

    +
    + +
    +

    + {$_("legal.community.values.title")} +

    +

    + {@html $_("legal.community.values.text.0")} +

    +
    + + + +
    +

    + {$_("legal.community.respect.title")} +

    +
    +
      + {@html $_("legal.community.respect.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.community.standards.title")} +

    +
    +
      + {@html $_("legal.community.standards.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.community.interaction.title")} +

    +
    +
      + {@html $_("legal.community.interaction.text.0")} +
    +
    +
    + + + +
    +

    + {$_("legal.community.enforcement.title")} +

    +

    + {@html $_("legal.community.enforcement.text.0")} +

    +
    +
    +
    +
    + + + + + + + + {$_("legal.cookie.title")} + +

    + {$_("legal.cookie.description")} +

    +
    + +
    +

    + {$_("legal.cookie.what.title")} +

    +

    + {@html $_("legal.cookie.what.text.0")} +

    +
    + + + +
    +

    + {$_("legal.cookie.types.title")} +

    +
    +
    +

    + {$_("legal.cookie.types.essential.title")} +

    +

    + {@html $_("legal.cookie.types.essential.text.0")} +

    +
    + +
    +
    + + + +
    +

    + {$_("legal.cookie.managing.title")} +

    +
    +

    {$_("legal.cookie.managing.subtitle")}

    +
      + {@html $_("legal.cookie.managing.text.0")} +
    +

    + {@html $_("legal.cookie.managing.text.1")} +

    +
    +
    + + + +
    +

    + {$_("legal.cookie.third_party.title")} +

    +

    + {@html $_("legal.cookie.third_party.text.0")} +

    +
    +
    +
    +
    +
    + + + + +

    + {$_("legal.questions")} +

    +

    + {$_("legal.questions_description")} +

    + {$_("legal.questions_email")} +
    +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/login/+page.server.ts b/packages/frontend/src/routes/login/+page.server.ts new file mode 100644 index 0000000..c94572d --- /dev/null +++ b/packages/frontend/src/routes/login/+page.server.ts @@ -0,0 +1,5 @@ +export async function load({ locals }) { + return { + authStatus: locals.authStatus, + }; +} diff --git a/packages/frontend/src/routes/login/+page.svelte b/packages/frontend/src/routes/login/+page.svelte new file mode 100644 index 0000000..fc51a26 --- /dev/null +++ b/packages/frontend/src/routes/login/+page.svelte @@ -0,0 +1,224 @@ + + + + +
    + + +
    + +
    +
    + + +
    +

    {$_("auth.login.welcome")}

    +
    + + + + {$_("auth.login.title")} + {$_("auth.login.description")} + + +
    + +
    + + +
    + + +
    + +
    + + +
    +
    + + + + + {#if isError} +
    + + {$_("auth.login.error")} + {error} + +
    + {/if} + + + +
    + + + + + + + + +
    +

    + {$_("auth.login.no_account")}{" "} + {$_("auth.login.sign_up_link")} +

    +
    +
    +
    +
    +
    diff --git a/packages/frontend/src/routes/magazine/+page.server.ts b/packages/frontend/src/routes/magazine/+page.server.ts new file mode 100644 index 0000000..51a648a --- /dev/null +++ b/packages/frontend/src/routes/magazine/+page.server.ts @@ -0,0 +1,6 @@ +import { getArticles } from "$lib/services"; +export async function load({ fetch }) { + return { + articles: await getArticles(fetch), + }; +} diff --git a/packages/frontend/src/routes/magazine/+page.svelte b/packages/frontend/src/routes/magazine/+page.svelte new file mode 100644 index 0000000..210d141 --- /dev/null +++ b/packages/frontend/src/routes/magazine/+page.svelte @@ -0,0 +1,385 @@ + + + + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    + {$_('magazine.title')} +

    +

    + {$_('magazine.description')} +

    + +
    + +
    + + +
    + + + + + + +
    +
    +
    +
    + +
    + + {#if featuredArticle && categoryFilter === 'all' && !searchQuery} + +
    +
    + {featuredArticle.title} +
    + {$_('magazine.featured')} +
    +
    + +
    + + {featuredArticle.category} + +
    +

    + +

    +

    + {featuredArticle.excerpt} +

    +
    +
    + {featuredArticle.author.first_name} +
    +

    {featuredArticle.author.first_name}

    +
    + {timeAgo.format( + new Date(featuredArticle.publish_date) + )} + + {$_('magazine.read_time', { + values: { + time: calcReadingTime(featuredArticle.content) + } + })} + +
    +
    +
    + +
    +
    +
    +
    + {/if} + + +
    + {#each filteredArticles() as article} + +
    + {article.title} +
    + + +
    + {article.category} +
    + + + {#if article.featured} +
    + {$_('magazine.featured')} +
    + {/if} + + + +
    + + +
    +

    + {article.title} +

    +

    + {article.excerpt} +

    +
    + + +
    + {#each article.tags.slice(0, 3) as tag} + + #{tag} + + {/each} +
    + + +
    +
    + {article.author.first_name} +
    +

    {article.author.first_name}

    +
    + + {timeAgo.format(new Date(article.publish_date))} +
    +
    +
    +
    + {$_('magazine.read_time', { + values: { time: calcReadingTime(article.content) } + })} +
    +
    + + + +
    +
    + {/each} +
    + + {#if filteredArticles().length === 0} +
    +

    + {$_('magazine.no_results')} +

    + +
    + {/if} +
    +
    diff --git a/packages/frontend/src/routes/magazine/[slug]/+page.server.ts b/packages/frontend/src/routes/magazine/[slug]/+page.server.ts new file mode 100644 index 0000000..4245a28 --- /dev/null +++ b/packages/frontend/src/routes/magazine/[slug]/+page.server.ts @@ -0,0 +1,12 @@ +import { error } from "@sveltejs/kit"; +import { getArticleBySlug } from "$lib/services.js"; +export async function load({ fetch, params, locals }) { + try { + return { + article: await getArticleBySlug(params.slug, fetch), + authStatus: locals.authStatus, + }; + } catch { + error(404, "Article not found"); + } +} diff --git a/packages/frontend/src/routes/magazine/[slug]/+page.svelte b/packages/frontend/src/routes/magazine/[slug]/+page.svelte new file mode 100644 index 0000000..a56249c --- /dev/null +++ b/packages/frontend/src/routes/magazine/[slug]/+page.svelte @@ -0,0 +1,232 @@ + + + + +
    + + +
    +
    + +
    + +
    + + + +
    + + {data.article.category} + +
    + + +

    + {data.article.title} +

    + + +

    + {data.article.excerpt} +

    + + +
    +
    + + {timeAgo.format(new Date(data.article.publish_date))} +
    +
    + + {$_("magazine.read_time", { + values: { + time: calcReadingTime(data.article.content), + }, + })} +
    + +
    + + + + + +
    + + +
    + {data.article.title} +
    + + + + +
    + {@html data.article.content} +
    +
    +
    + + +
    +
    + + Tags +
    +
    + {#each data.article.tags as tag} + + #{tag} + + {/each} +
    +
    + + + + +
    + {data.article.author.first_name} +
    +

    + About {data.article.author.first_name} +

    + {#if data.article.author.description} +

    + {data.article.author.description} +

    + {/if} + {#if data.article.author.website} + + {/if} +
    +
    +
    +
    +
    + + + +
    +
    +
    diff --git a/packages/frontend/src/routes/me/+page.server.ts b/packages/frontend/src/routes/me/+page.server.ts new file mode 100644 index 0000000..d6f10d7 --- /dev/null +++ b/packages/frontend/src/routes/me/+page.server.ts @@ -0,0 +1,8 @@ +import { getFolders } from "$lib/services"; + +export async function load({ locals, fetch }) { + return { + authStatus: locals.authStatus, + folders: await getFolders(fetch), + }; +} diff --git a/packages/frontend/src/routes/me/+page.svelte b/packages/frontend/src/routes/me/+page.svelte new file mode 100644 index 0000000..32e5660 --- /dev/null +++ b/packages/frontend/src/routes/me/+page.svelte @@ -0,0 +1,469 @@ + + + + +
    + +
    + +
    +
    +
    +

    + {$_("me.title")} +

    +

    + {$_("me.welcome", { + values: { name: data.authStatus.user!.artist_name }, + })} +

    +
    + {#if isModel(data.authStatus.user!)} + + {/if} +
    +
    + + + + + + + {$_("me.settings.title")} + + + + + +
    + + + + {$_("me.settings.profile_title")} + {$_("me.settings.profile_subtitle")} + + +
    +
    + + + {#if avatar} +
    +
    +
    + {avatar.name} +
    +
    + {avatar.name} + {displaySize(avatar.size)} +
    +
    +
    + +
    +
    + {/if} +
    + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    + {#if isCommentError} +
    + + {$_('videos.error')} + {commentError} + +
    + {/if} +
    + +
    +
    +
    + {/if} + + {#if showComments} + +
    + {#each data.comments as comment} +
    + + + + {getUserInitials(data.authStatus.user!.artist_name)} + + +
    +
    + {comment.user_created.artist_name} + {timeAgo.format( + new Date(comment.date_created) + )} +
    +

    {comment.comment}

    +
    + + +
    +
    +
    + {/each} +
    + {/if} + + +
    +
    + + +
    + + + + + + + +
    + + + diff --git a/packages/frontend/static/android-chrome-192x192.png b/packages/frontend/static/android-chrome-192x192.png new file mode 100644 index 0000000..8de4959 Binary files /dev/null and b/packages/frontend/static/android-chrome-192x192.png differ diff --git a/packages/frontend/static/android-chrome-512x512.png b/packages/frontend/static/android-chrome-512x512.png new file mode 100644 index 0000000..091e8e0 Binary files /dev/null and b/packages/frontend/static/android-chrome-512x512.png differ diff --git a/packages/frontend/static/apple-touch-icon.png b/packages/frontend/static/apple-touch-icon.png new file mode 100644 index 0000000..1c1ff68 Binary files /dev/null and b/packages/frontend/static/apple-touch-icon.png differ diff --git a/packages/frontend/static/favicon-16x16.png b/packages/frontend/static/favicon-16x16.png new file mode 100644 index 0000000..10d142c Binary files /dev/null and b/packages/frontend/static/favicon-16x16.png differ diff --git a/packages/frontend/static/favicon-32x32.png b/packages/frontend/static/favicon-32x32.png new file mode 100644 index 0000000..3d60fc5 Binary files /dev/null and b/packages/frontend/static/favicon-32x32.png differ diff --git a/packages/frontend/static/favicon.ico b/packages/frontend/static/favicon.ico new file mode 100644 index 0000000..f69f0f8 Binary files /dev/null and b/packages/frontend/static/favicon.ico differ diff --git a/packages/frontend/static/img/about.webp b/packages/frontend/static/img/about.webp new file mode 100755 index 0000000..c9e1956 Binary files /dev/null and b/packages/frontend/static/img/about.webp differ diff --git a/packages/frontend/static/img/babes.jpg b/packages/frontend/static/img/babes.jpg new file mode 100644 index 0000000..6268b99 Binary files /dev/null and b/packages/frontend/static/img/babes.jpg differ diff --git a/packages/frontend/static/img/kamasutra.jpg b/packages/frontend/static/img/kamasutra.jpg new file mode 100755 index 0000000..c6a147c Binary files /dev/null and b/packages/frontend/static/img/kamasutra.jpg differ diff --git a/packages/frontend/static/img/luna-belle.jpg b/packages/frontend/static/img/luna-belle.jpg new file mode 100644 index 0000000..9b51bd8 Binary files /dev/null and b/packages/frontend/static/img/luna-belle.jpg differ diff --git a/packages/frontend/static/img/palina.jpg b/packages/frontend/static/img/palina.jpg new file mode 100644 index 0000000..608101d Binary files /dev/null and b/packages/frontend/static/img/palina.jpg differ diff --git a/packages/frontend/static/img/sebastian.jpg b/packages/frontend/static/img/sebastian.jpg new file mode 100644 index 0000000..0712fb8 Binary files /dev/null and b/packages/frontend/static/img/sebastian.jpg differ diff --git a/packages/frontend/static/img/valknar.gif b/packages/frontend/static/img/valknar.gif new file mode 100755 index 0000000..dba7c8e Binary files /dev/null and b/packages/frontend/static/img/valknar.gif differ diff --git a/packages/frontend/static/robots.txt b/packages/frontend/static/robots.txt new file mode 100644 index 0000000..9552f91 --- /dev/null +++ b/packages/frontend/static/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://sexy.pivoine.art/sitemap.xml \ No newline at end of file diff --git a/packages/frontend/static/site.webmanifest b/packages/frontend/static/site.webmanifest new file mode 100644 index 0000000..ae9442b --- /dev/null +++ b/packages/frontend/static/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "Sexy.Art", + "short_name": "Sexy.Art", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone", + "start_url": "/" +} diff --git a/packages/frontend/svelte.config.js b/packages/frontend/svelte.config.js new file mode 100644 index 0000000..e3ae082 --- /dev/null +++ b/packages/frontend/svelte.config.js @@ -0,0 +1,12 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; +import adapter from "@sveltejs/adapter-node"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: [vitePreprocess()], + kit: { + adapter: adapter(), + }, +}; + +export default config; diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json new file mode 100644 index 0000000..359df23 --- /dev/null +++ b/packages/frontend/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "noImplicitAny": false, + "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 + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts new file mode 100644 index 0000000..70d37e2 --- /dev/null +++ b/packages/frontend/vite.config.ts @@ -0,0 +1,23 @@ +import path from "path"; +import tailwindcss from "@tailwindcss/vite"; +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; + +export default defineConfig({ + plugins: [sveltekit(), tailwindcss()], + resolve: { + alias: { $lib: path.resolve("./src/lib"), "@": path.resolve("./src/lib") }, + }, + server: { + port: 3000, + proxy: { + "/api": { + rewrite: (path) => path.replace(/^\/api/, ""), + target: "http://localhost:8055", + changeOrigin: true, + secure: false, + ws: true, + }, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..2aa38fb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8189 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + packages/bundle: + dependencies: + '@sindresorhus/slugify': + specifier: ^3.0.0 + version: 3.0.0 + fluent-ffmpeg: + specifier: ^2.1.3 + version: 2.1.3 + devDependencies: + '@directus/extensions-sdk': + specifier: 16.0.2 + version: 16.0.2(@types/node@24.0.15)(@unhead/vue@2.0.12(vue@3.5.18(typescript@5.9.2)))(jiti@2.5.1)(knex@3.1.0)(lightningcss@1.30.1)(pinia@2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)))(sass@1.92.1)(terser@5.43.1)(typescript@5.9.2)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(ws@8.18.3) + + packages/buttplug: + dependencies: + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + eventemitter3: + specifier: ^5.0.1 + version: 5.0.1 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + vite: + specifier: ^7.1.4 + version: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + vite-plugin-wasm: + specifier: 3.5.0 + version: 3.5.0(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + ws: + specifier: ^8.18.3 + version: 8.18.3 + devDependencies: + wasm-pack: + specifier: ^0.13.1 + version: 0.13.1 + + packages/frontend: + dependencies: + '@directus/sdk': + specifier: ^20.0.3 + version: 20.0.3 + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.64.6 + version: 0.64.6(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)) + '@sexy.pivoine.art/buttplug': + specifier: workspace:* + version: link:../buttplug + javascript-time-ago: + specifier: ^2.5.11 + version: 2.5.11 + media-chrome: + specifier: ^4.13.1 + version: 4.13.1(react@19.1.1) + svelte-i18n: + specifier: ^4.0.1 + version: 4.0.1(svelte@5.38.6) + devDependencies: + '@iconify-json/ri': + specifier: ^1.2.5 + version: 1.2.5 + '@iconify/tailwind4': + specifier: ^1.0.6 + version: 1.0.6(tailwindcss@4.1.12) + '@internationalized/date': + specifier: ^3.8.2 + version: 3.8.2 + '@lucide/svelte': + specifier: ^0.544.0 + version: 0.544.0(svelte@5.38.6) + '@sveltejs/adapter-node': + specifier: ^5.3.1 + version: 5.3.1(@sveltejs/kit@2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))) + '@sveltejs/adapter-static': + specifier: ^3.0.9 + version: 3.0.9(@sveltejs/kit@2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))) + '@sveltejs/kit': + specifier: ^2.37.0 + version: 2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.1.4 + version: 6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + '@tailwindcss/forms': + specifier: ^0.5.9 + version: 0.5.10(tailwindcss@4.1.12) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.16(tailwindcss@4.1.12) + '@tailwindcss/vite': + specifier: ^4.0.0 + version: 4.1.12(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + '@tsconfig/svelte': + specifier: ^5.0.5 + version: 5.0.5 + bits-ui: + specifier: 2.11.0 + version: 2.11.0(@internationalized/date@3.8.2)(svelte@5.38.6) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + glob: + specifier: ^11.0.3 + version: 11.0.3 + mode-watcher: + specifier: ^1.1.0 + version: 1.1.0(svelte@5.38.6) + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@5.38.6) + super-sitemap: + specifier: ^1.0.5 + version: 1.0.5(svelte@5.38.6) + svelte: + specifier: ^5.38.6 + version: 5.38.6 + svelte-sonner: + specifier: ^1.0.5 + version: 1.0.5(svelte@5.38.6) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tailwind-variants: + specifier: ^1.0.0 + version: 1.0.0(tailwindcss@4.1.12) + tailwindcss: + specifier: ^4.0.0 + version: 4.1.12 + tw-animate-css: + specifier: ^1.3.8 + version: 1.3.8 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + vite: + specifier: ^7.1.4 + version: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + + '@directus/composables@11.2.3': + resolution: {integrity: sha512-1WvDGVKu8rBF0g0IlFAit4rNO/WPcdne+FeQIPmVIa7iR+TR+BX2YUD6II2nDAmOQWxp9E2wjM6DOL3s3pxfCQ==} + peerDependencies: + vue: 3.5.18 + + '@directus/constants@13.0.3': + resolution: {integrity: sha512-QlixM5TTjjnp4Jgs9dQTY8ifJWrWZPZnPLWpaCfoDaipwr+I6xtlLLVSpALYwpdROi3vcbmZwT0mB9OZ11IxHw==} + + '@directus/extensions-sdk@16.0.2': + resolution: {integrity: sha512-T7VjLxr4yq3VNj0Cku5slPfnnEUeSU07TW0RNxE1KBgg8/Cry6ayGvfqT0ozCpQ7GIwWdvb1UD1Zb5rkUJd+2A==} + engines: {node: '>=20.19.0'} + hasBin: true + + '@directus/extensions@3.0.11': + resolution: {integrity: sha512-i+Kjn0mMiFW4LYZT7WLPRX8XO0GsTwgDoukzddvkhK0kAZ7n/Z6RmFJrjI+x8+cPwv9NP6ZzVycSMqe317Ymmw==} + peerDependencies: + knex: 3.1.0 + pino: 9.7.0 + vue: 3.5.18 + vue-router: 4.5.1 + peerDependenciesMeta: + knex: + optional: true + pino: + optional: true + vue: + optional: true + vue-router: + optional: true + + '@directus/schema@13.0.3': + resolution: {integrity: sha512-Ls3QdpDDbsaI+/JiRH1WvPzc8zMdaQv+Rww2oyF1GFkXGQFb3RvYM3MX9WTU4RpD4/6YWrAeCaz+jeJlNVz/UQ==} + + '@directus/sdk@20.0.3': + resolution: {integrity: sha512-PFTYx8QxYi36L9zjOVldwZ88Iln9pBGtEamEjLGFuYqy1jk5jKJ7qA7827KfeZJkz3EtNNZM6J605I7s/ayD2g==} + engines: {node: '>=22'} + + '@directus/system-data@3.3.0': + resolution: {integrity: sha512-dDoG/lMHly2hivOE73CPndCREuuzB7E84zBFgmmcLsR9UowC0nrohaeJ2U3s3//XwzU+VTkDR7O1n3s8B0xOgg==} + + '@directus/themes@1.1.5': + resolution: {integrity: sha512-UaWOWqdKtqGjcAjKpT54+wVMsV2nGQHxXGPaWOPnf/69XO7T/E30PhrwRQcNnq4kmNdJJdbxIicVAnr7vumVvQ==} + peerDependencies: + '@unhead/vue': 1.11.20 + pinia: 2.3.1 + vue: 3.5.18 + + '@directus/types@13.2.3': + resolution: {integrity: sha512-HtMpB5HnosLGZMjgOrtgTqkdlUv5MMyxOmSsgeL+cgQ6NE7vFxcj2MTiLQCRfs4Fu1ySsIPfffOUMBYlw65TtA==} + peerDependencies: + deep-diff: 1.0.2 + express: 4.21.2 + graphql: 16.11.0 + knex: 3.1.0 + nodemailer: 7.0.5 + openapi3-ts: 4.5.0 + pino: 9.7.0 + sharp: 0.34.3 + vue: 3.5.18 + vue-router: 4.5.1 + ws: 8.18.3 + peerDependenciesMeta: + deep-diff: + optional: true + express: + optional: true + graphql: + optional: true + knex: + optional: true + nodemailer: + optional: true + openapi3-ts: + optional: true + pino: + optional: true + sharp: + optional: true + vue: + optional: true + vue-router: + optional: true + ws: + optional: true + + '@directus/utils@13.0.10': + resolution: {integrity: sha512-DwnTP4YeFMxEsLJcpy+1zljF31xRV5d9NgK9Uj0f5MGSFddq2xCAdeBZUO8B7dtBHBUZ+uU5JQP6UpaotHxv1A==} + peerDependencies: + vue: 3.5.18 + peerDependenciesMeta: + vue: + optional: true + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@formatjs/ecma402-abstract@2.3.4': + resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} + + '@formatjs/fast-memoize@2.2.7': + resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} + + '@formatjs/icu-messageformat-parser@2.11.2': + resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==} + + '@formatjs/icu-skeleton-parser@1.8.14': + resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==} + + '@formatjs/intl-localematcher@0.6.1': + resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} + + '@grpc/grpc-js@1.14.0': + resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.3': + resolution: {integrity: sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==} + engines: {node: '>=14.0.0'} + + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + + '@iconify-json/ri@1.2.5': + resolution: {integrity: sha512-kWGimOXMZrlYusjBKKXYOWcKhbOHusFsmrmRGmjS7rH0BpML5A9/fy8KHZqFOwZfC4M6amObQYbh8BqO5cMC3w==} + + '@iconify/tailwind4@1.0.6': + resolution: {integrity: sha512-43ZXe+bC7CuE2LCgROdqbQeFYJi/J7L/k1UpSy8KDQlWVsWxPzLSWbWhlJx4uRYLOh1NRyw02YlDOgzBOFNd+A==} + peerDependencies: + tailwindcss: '>= 4' + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.2.4': + resolution: {integrity: sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.15': + resolution: {integrity: sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.20': + resolution: {integrity: sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.20': + resolution: {integrity: sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/input@4.2.4': + resolution: {integrity: sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.20': + resolution: {integrity: sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.20': + resolution: {integrity: sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.8.6': + resolution: {integrity: sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.8': + resolution: {integrity: sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.1.3': + resolution: {integrity: sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.3.4': + resolution: {integrity: sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@internationalized/date@3.8.2': + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@lucide/svelte@0.544.0': + resolution: {integrity: sha512-9f9O6uxng2pLB01sxNySHduJN3HTl5p0HDu4H26VR51vhZfiMzyOMe9Mhof3XAk4l813eTtl+/DYRvGyoRR+yw==} + peerDependencies: + svelte: ^5 + + '@opentelemetry/api-logs@0.205.0': + resolution: {integrity: sha512-wBlPk1nFB37Hsm+3Qy73yQSobVn28F4isnWIBvKpd5IUH/eat8bwcL02H9yzmHyyPmukeccSl2mbN5sDQZYnPg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/auto-instrumentations-node@0.64.6': + resolution: {integrity: sha512-8oIzHcEX5uEgJ/5hiStl7MhpPTLk8mywZPHIYWo5UiEiTkvc5uYjv/TyOGeiDhcjzo0nhvm7a6Y+eonq3m1sLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.4.1 + '@opentelemetry/core': ^2.0.0 + + '@opentelemetry/context-async-hooks@2.1.0': + resolution: {integrity: sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.1.0': + resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.205.0': + resolution: {integrity: sha512-jQlw7OHbqZ8zPt+pOrW2KGN7T55P50e3NXBMr4ckPOF+DWDwSy4W7mkG09GpYWlQAQ5C9BXg5gfUlv5ldTgWsw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.205.0': + resolution: {integrity: sha512-5JteMyVWiro4ghF0tHQjfE6OJcF7UBUcoEqX3UIQ5jutKP1H+fxFdyhqjjpmeHMFxzOHaYuLlNR1Bn7FOjGyJg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.205.0': + resolution: {integrity: sha512-q3VS9wS+lpZ01txKxiDGBtBpTNge3YhbVEFDgem9ZQR9eI3EZ68+9tVZH9zJcSxI37nZPJ6lEEZO58yEjYZsVA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.205.0': + resolution: {integrity: sha512-1Vxlo4lUwqSKYX+phFkXHKYR3DolFHxCku6lVMP1H8sVE3oj4wwmwxMzDsJ7zF+sXd8M0FCr+ckK4SnNNKkV+w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.205.0': + resolution: {integrity: sha512-fFxNQ/HbbpLmh1pgU6HUVbFD1kNIjrkoluoKJkh88+gnmpFD92kMQ8WFNjPnSbjg2mNVnEkeKXgCYEowNW+p1w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.205.0': + resolution: {integrity: sha512-qIbNnedw9QfFjwpx4NQvdgjK3j3R2kWH/2T+7WXAm1IfMFe9fwatYxE61i7li4CIJKf8HgUC3GS8Du0C3D+AuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.205.0': + resolution: {integrity: sha512-xsot/Qm9VLDTag4GEwAunD1XR1U8eBHTLAgO7IZNo2JuD/c/vL7xmDP7mQIUr6Lk3gtj/yGGIR2h3vhTeVzv4w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.205.0': + resolution: {integrity: sha512-ZBksUk84CcQOuDJB65yu5A4PORkC4qEsskNwCrPZxDLeWjPOFZNSWt0E0jQxKCY8PskLhjNXJYo12YaqsYvGFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.205.0': + resolution: {integrity: sha512-vr2bwwPCSc9u7rbKc74jR+DXFvyMFQo9o5zs+H/fgbK672Whw/1izUKVf+xfWOdJOvuwTnfWxy+VAY+4TSo74Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.205.0': + resolution: {integrity: sha512-bGtFzqiENO2GpJk988mOBMe0MfeNpTQjbLm/LBijas6VRyEDQarUzdBHpFlu89A25k1+BCntdWGsWTa9Ai4FyA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.1.0': + resolution: {integrity: sha512-0mEI0VDZrrX9t5RE1FhAyGz+jAGt96HSuXu73leswtY3L5YZD11gtcpARY2KAx/s6Z2+rj5Mhj566JsI2C7mfA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-amqplib@0.52.3': + resolution: {integrity: sha512-QlAPNC4lsZ5v1Xy62gRrSk1ow5Bmdm1BDIwiuDUkRjsQ+LjtLfoI5mwGSn6fASYKHqNRBDrYXX4ibmiD/PqNHA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-lambda@0.57.2': + resolution: {integrity: sha512-yT9nUUDW7K0HSXihfhUbMk4sULA4VRqFGCfTGdqTFQ01lS5EMUUscDxCq4DCD3ZFMbK9wwbZxURxdm94x7YkZA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-sdk@0.61.2': + resolution: {integrity: sha512-5tzZ9hcgAx4j+7st9i3pUcmQduRa94gFZGhRRsIQFbH07nIJ1SNwJFMC6WoQ/+WQkwaK/aF5Qw5LS0J+mrI+yg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-bunyan@0.51.4': + resolution: {integrity: sha512-SObxTjC8l/FcxNitNy/+NT1xBEwCXIZkg8CPRMu3f1Q3a095ee89Z3dHInSj/DWZnxH8hUxAhMU+rG3dIuYgkA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cassandra-driver@0.51.3': + resolution: {integrity: sha512-ICwlV29HFQO/vbDw+f1H65+OKkktsHS7huRO430l9q4AE/gGXcaepypwN8QHs0/gX2PFWovVQ7Dw4Rml/4Y86g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.49.2': + resolution: {integrity: sha512-e0Yhz4Q3qb99kqosdNm1OAG1zlswqnTnsBl7wc/p6al6bdaEMSPbSME8pbaKltvHeW0RnmXVvOzu9OD4shvl+Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cucumber@0.21.2': + resolution: {integrity: sha512-G9fiMEmNb1icrRZOTobqEoUNfyoa2qwkABPAhyGWZt290jHfXWPBI2baGhZKsR00Y+X1HGzn12J536acbubqlw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-dataloader@0.23.3': + resolution: {integrity: sha512-DUxM3tsOxuxA12BFzYHgcuRfI885iiI+VptGe3v0uE16hmVeOB7DiVetoOfpPSke/ePtVHmFAR4fgfDuI93ugQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dns@0.49.2': + resolution: {integrity: sha512-J4gyDoXR5s35O0iG/eOZUz3Iu6twFxYiPD5kAI1fAOmkSB60oRjJseOSd9L5UBS5ghD1kTRh9VEIek6PP2w5Gw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.54.3': + resolution: {integrity: sha512-bJeZ5Mtt7medH7i2iTbLdWUKdtrhllJh4Wzf7lonE2VyTxRt848hXn+ZsCjgvtPXCIH5pVF0bgtMCwpI1z+01A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.50.3': + resolution: {integrity: sha512-ZLKIIx+zz7qpoeBlzOENks4u0rjysICIYGXjhyFpS/Jjo5b17FLL3ULACGq0ApCRC+ruVR0Hb2OGyqlVE7oEEQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.25.2': + resolution: {integrity: sha512-KA2Yw7xQPNbRooZvZ7K/zwYG1kshrXEfI6uCTgTJ/hs357kYVIulXYZ8Q65Dkccd0PGzQJ/e4YFx8RW4gQT9WQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.49.2': + resolution: {integrity: sha512-mh32irpVMxWiaHld+Xfuje6uCE1HNJgVKi1w0OBp/Y1WnkGS2E6sDVcWujqX2UnEMmJj5+WYHJBXJJqFVgF8LA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.53.3': + resolution: {integrity: sha512-18PAQESPdHIGs0lvaVdPp2D1tLcQezbxIGGUS3eNszfWRDxfqE/XCcCOyJKSrhBw1djuvE+KVf9ej/DVyV28SQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-grpc@0.205.0': + resolution: {integrity: sha512-IB5eKpb/7/x+tyWUVIIyY5KcAtODy/YbcDKPdnlJl8sMCFPByjNxti/lzOfPajYBPOXsN91g7H7cN0L1aSlerQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.52.3': + resolution: {integrity: sha512-r/9ysT/Fksq4dvJ1DBKcBQ/5Ah8mMxwcsAFxtuRso20tXSGrM9BYKquK8eY7jKvNpfIc5xMRJMhuAD4/NviZdQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.205.0': + resolution: {integrity: sha512-6fOgRlV7ypBuEzCQP7vXkLQxz3UL1FhE24rAlMRbwGvPAnZLvutcG/fq9FI/n+VU23dOpYexocYsXCf5oy/AXw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.53.3': + resolution: {integrity: sha512-afCzr4OSHWDfvVRx5ni92zEgNPoq2akoe+/nubWkGPKHFLsJwYO/ihAaky1i6m9d3tBO571g9rlnUvDlvoKSoQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.15.3': + resolution: {integrity: sha512-2HnNz6kDkuCjiZQHM7lCarzCs8uCMqrr04mhEgDLNDha0Dy341NjDTlWbgtNWNuN5vYeIP8/8g6iw0Ann22DbA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.50.2': + resolution: {integrity: sha512-pSQHrJFNpAs/FPam3FCp+aCWSjiaK4BpnXm70W0q6+T5IvkTVkRWFye80pw1zS4JRMh93U3OcJoKwP1M6nL62A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.54.2': + resolution: {integrity: sha512-xJrP3ayEE4bY9kr7eHvi2P2rou9O+ALUTUo+TcJj2wEp1LFpucY87UyHJrmiJ6proGVgbbDgXJsxn7a5G0ABRA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.50.3': + resolution: {integrity: sha512-6Y2mL7Wk36lspfdOBST3vQQi1grXHvieeAd18LPtljyzCI5gCr6wBKp2Bpj82lMOYZ/O6w8gqIJMv0KjC6ZfSA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-memcached@0.49.3': + resolution: {integrity: sha512-TfK46vWMVc7o5a2QyC64P6HCTdaPuxEIEhtDUWRGSlK0grZp8BKyTXy5kpMD8u7+azzhEmyrHjkm95ld38CuDg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.58.3': + resolution: {integrity: sha512-19MwzolRIceDoZ4LPl2S0h2eI/8nLdA50Bqz6ERF4Uhk5ZUZO5aHNmsIpjJF+zxvXX3Gsa5A8WK0hm5nO5Ng7w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.52.3': + resolution: {integrity: sha512-dieUbMnfwqxR8nNZyr21zFuYJs5zDu7E9uODjowg6ftK14bY638ryDhc2W4Gc4Z89PlxoUkCHunViXQBG6Q0Ew==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.52.3': + resolution: {integrity: sha512-LhAl41NORbYimktfOMYOXJ483YYjL4OsjA9psRDshX56JOhQL/oL88LZbR+Jx4lEnOKMvrKk3VLqBZLa4KPIrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.51.3': + resolution: {integrity: sha512-wHvyPQayIF4tqWpgwALnQAj/aTgTD7GOSEvA4PQZFvqYrUtnWXQ4df9NspLikhH3C8girq3c4s2UGk39LDL3tw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.52.2': + resolution: {integrity: sha512-kL91hPGEjUI08VcDJeNwYKP2EpynAnymF0wr4Irqp5uHeyvE/hTX4R3DmpDP80IZ/aQ5WVxuWiaBlVP7cERu/w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-net@0.49.2': + resolution: {integrity: sha512-rfFpCIxDMMSeUKVg3xCyGGfAANxNP4BHqFAcChWDbFSL8Y9a9ztqR7TPidKgiLb+fbKfrr9ZupwdMeKJH+zsOA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-oracledb@0.31.3': + resolution: {integrity: sha512-8lxYujVWhR+bRUGCZZFTEslRKQOlpjm27wIJvsk3e7Yb1s8g5PMQqUr+7U4hPGJX+GpvF4qszJZe6lX/6pfzbg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.58.3': + resolution: {integrity: sha512-eGyrTHDx3WA9JiCbBQO1OUc8B9InqCJvC87uY1hSuOXU6HtawCEml1epuAVQY3cizK7Tc3IH0EYSR/q4w/kHyw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pino@0.52.3': + resolution: {integrity: sha512-GPFxhqgmW7wNdwq5rGu8vA/YswUdF84m3p00cH12S8rb9MVKUdNdPlUROO85xE0O0yI1yfNkRzZ+l0R4iZIOrg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.54.4': + resolution: {integrity: sha512-/XBICeY+tYZ04YNX6R2UKBgjCqj+xeLUKGJrbu8r4fGHV+hMsjLH9754xtdpuay1fecE7neCu4dX3Fr1NLWIEQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-restify@0.51.2': + resolution: {integrity: sha512-B4LMIDdgIpQw73J1qNoBRnhmvwS/gqnpzCwcddHv0zGNbK/+RntTEFRAZ8erfRYK/Kaz77DqmeoeCTHxatIoqw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-router@0.50.2': + resolution: {integrity: sha512-S0+ZL5cmV4FuCkJq70Ar6pnAHVbSmRH8BziUJ3PIeLKTsx193XKZeHDSo27841GFsrNF7VVWnFEbnYxhynn/MQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-runtime-node@0.19.2': + resolution: {integrity: sha512-sMDfMY5Be0HfK84bEN0M+FgGpyswfP6N90AGyZO3wK14DfvOQ542AWwyHos5vvpRFzDBm57y7OMqyaH//o9jDg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-socket.io@0.52.3': + resolution: {integrity: sha512-Ryy1FJ9EnHjj9HUcLIoIZNqJkq1B4+78sCBBb3IMylzAS+IVdojz7K/9bwHDj4o+o1oHo/G337ML71ZY/Q4krw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.24.3': + resolution: {integrity: sha512-3qVIWFQ0R0EkGU6zIX/jhKFDU2QirLSR5Z44RIcRHw4rDgrpwujoz46moDqvKHysPTA7vMTsHEzg5bP6dgok3w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.16.2': + resolution: {integrity: sha512-JU0TOlwK472KxJl+4Gnf0H7UkZMZJtombC0x1D3dZ6BjES3teOzUEOvupifHmLSgZ7dlMvEK8xBMz5D2La0N5g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation-winston@0.50.2': + resolution: {integrity: sha512-vrS7ozNmB+S3v6z9vyFZXPXQ8ygTdWA9alPnEc10JYupvN1YRKQNspSRkx12dsrqsbkbybo/Dk9SFdbhKGrpeg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.205.0': + resolution: {integrity: sha512-cgvm7tvQdu9Qo7VurJP84wJ7ZV9F6WqDDGZpUc6rUEXwjV7/bXWs0kaYp9v+1Vh1+3TZCD3i6j/lUBcPhu8NhA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.205.0': + resolution: {integrity: sha512-2MN0C1IiKyo34M6NZzD6P9Nv9Dfuz3OJ3rkZwzFmF6xzjDfqqCTatc9v1EpNfaP55iDOCLHFyYNCgs61FFgtUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.205.0': + resolution: {integrity: sha512-AeuLfrciGYffqsp4EUTdYYc6Ee2BQS+hr08mHZk1C524SFWx0WnfcTnV0NFXbVURUNU6DZu1DhS89zRRrcx/hg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.205.0': + resolution: {integrity: sha512-KmObgqPtk9k/XTlWPJHdMbGCylRAmMJNXIRh6VYJmvlRDMfe+DonH41G7eenG8t4FXn3fxOGh14o/WiMRR6vPg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.1.0': + resolution: {integrity: sha512-yOdHmFseIChYanddMMz0mJIFQHyjwbNhoxc65fEAA8yanxcBPwoFDoh1+WBUWAO/Z0NRgk+k87d+aFIzAZhcBw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.1.0': + resolution: {integrity: sha512-QYo7vLyMjrBCUTpwQBF/e+rvP7oGskrSELGxhSvLj5gpM0az9oJnu/0O4l2Nm7LEhAff80ntRYKkAcSwVgvSVQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.8': + resolution: {integrity: sha512-wq3IrSro0/YttSL+CrAhjsH72RhsAAOTNrpm6PJT5CyFaMCQCV6FOgGftxHb+vw4/gvPmYKeNnCxkPpzhkimvw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-aws@2.5.3': + resolution: {integrity: sha512-PpaQBwa0cDi4nHYxgVbmDJWNyBN7WOXH41XfInWN/kAHqVw8nO4L/s4IoN9pEnJSSin3Z9oA1CyIiy2rxj5R3A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.13.2': + resolution: {integrity: sha512-YdRHZHdyDh6QcCkMK3eL/Nf0erN7xrz2TFRhN/DUAPaAzg0fECmq555B4lcxPsK9NeZajVOBvHu3z95ZAKYFdw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-container@0.7.8': + resolution: {integrity: sha512-PW7FjoJxqC2cFbEI3C5rIevSNT9KHcS1mNM7L1CxPXFIBleV0S4nYSolblE5uh+NHw+FIzxy0VETitUfr23TtQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.40.3': + resolution: {integrity: sha512-C796YjBA5P1JQldovApYfFA/8bQwFfpxjUbOtGhn1YZkVTLoNQN+kvBwgALfTPWzug6fWsd0xhn9dzeiUcndag==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resources@2.1.0': + resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.205.0': + resolution: {integrity: sha512-nyqhNQ6eEzPWQU60Nc7+A5LIq8fz3UeIzdEVBQYefB4+msJZ2vuVtRuk9KxPMw1uHoHDtYEwkr2Ct0iG29jU8w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.1.0': + resolution: {integrity: sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.205.0': + resolution: {integrity: sha512-Y4Wcs8scj/Wy1u61pX1ggqPXPtCsGaqx/UnFu7BtRQE1zCQR+b0h56K7I0jz7U2bRlPUZIFdnNLtoaJSMNzz2g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.1.0': + resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.1.0': + resolution: {integrity: sha512-SvVlBFc/jI96u/mmlKm86n9BbTCbQ35nsPoOohqJX6DXH92K0kTe73zGY5r8xoI1QkjR9PizszVJLzMC966y9Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rollup/plugin-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-virtual@3.0.2': + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.50.0': + resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.50.0': + resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.50.0': + resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.50.0': + resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.50.0': + resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.50.0': + resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': + resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.50.0': + resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.50.0': + resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.50.0': + resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': + resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.50.0': + resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.50.0': + resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.50.0': + resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.50.0': + resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.50.0': + resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.50.0': + resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.50.0': + resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.50.0': + resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.50.0': + resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.50.0': + resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sinclair/typebox@0.34.38': + resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@sindresorhus/slugify@3.0.0': + resolution: {integrity: sha512-SCrKh1zS96q+CuH5GumHcyQEVPsM4Ve8oE0E6tw7AAhGq50K8ojbTUOQnX/j9Mhcv/AXiIsbCfquovyGOo5fGw==} + engines: {node: '>=20'} + + '@sindresorhus/transliterate@2.0.0': + resolution: {integrity: sha512-lRx63oCHxeJ90DqIgmbxH1PQmiBDY1wVaLzB4hK0d/xS5BrG1iZO3HdCJS/DQJk6GJ8xHDev8OMI7iGxvE1ZUA==} + engines: {node: '>=20'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-node@5.3.1': + resolution: {integrity: sha512-PSoGfa9atkmuixe7jvuS2tsUohVZF20So87ASzfMRGTTNqEd8s48KAodlv3CzHwq9XO/BM8KsQLpqqsr/6dmuA==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/adapter-static@3.0.9': + resolution: {integrity: sha512-aytHXcMi7lb9ljsWUzXYQ0p5X1z9oWud2olu/EpmH7aCu4m84h7QLvb5Wp+CFirKcwoNnYvYWhyP/L8Vh1ztdw==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.37.0': + resolution: {integrity: sha512-xgKtpjQ6Ry4mdShd01ht5AODUsW7+K1iValPDq7QX8zI1hWOKREH9GjG8SRCN5tC4K7UXmMhuQam7gbLByVcnw==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.1.4': + resolution: {integrity: sha512-4jfkfvsGI+U2OhHX8OPCKtMCf7g7ledXhs3E6UcA4EY0jQWsiVbe83pTAHp9XTifzYNOiD4AJieJUsI0qqxsbw==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/forms@0.5.10': + resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.1.12': + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} + + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.12': + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.1.12': + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tsconfig/svelte@5.0.5': + resolution: {integrity: sha512-48fAnUjKye38FvMiNOj0J9I/4XlQQiZlpe9xaNPfe8vy2Y1hFBt8g1yqf2EGjVvHavo4jf2lC+TQyENCr4BJBQ==} + + '@types/aws-lambda@8.10.152': + resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bunyan@1.8.11': + resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/memcached@2.2.10': + resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + + '@types/node@24.0.15': + resolution: {integrity: sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==} + + '@types/nodemailer@6.4.17': + resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} + + '@types/oracledb@6.5.2': + resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==} + + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.15.5': + resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@unhead/vue@2.0.12': + resolution: {integrity: sha512-WFaiCVbBd39FK6Bx3GQskhgT9s45Vjx6dRQegYheVwU1AnF+FAfJVgWbrl21p6fRJcLAFp0xDz6wE18JYBM0eQ==} + peerDependencies: + vue: '>=3.5.13' + + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.18': + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} + + '@vue/compiler-dom@3.5.18': + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} + + '@vue/compiler-sfc@3.5.18': + resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} + + '@vue/compiler-ssr@3.5.18': + resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.18': + resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} + + '@vue/runtime-core@3.5.18': + resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} + + '@vue/runtime-dom@3.5.18': + resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} + + '@vue/server-renderer@3.5.18': + resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} + peerDependencies: + vue: 3.5.18 + + '@vue/shared@3.5.18': + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-install@1.1.2: + resolution: {integrity: sha512-ZS2cqFHPZOy4wLxvzqfQvDjCOifn+7uCPqNmYRIBM/03+yllON+4fNnsD0VJdW0p97y+E+dTRNPStWNqMBq+9g==} + engines: {node: '>=10'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + bits-ui@2.11.0: + resolution: {integrity: sha512-j/lOFHz6ZDWwj9sOUb6zYSJQdvPc7kr1IRyAdPjln4wOw9UVvKCosbRFEyP4JEzvNFX7HksMG4naDrDHta5bSA==} + engines: {node: '>=20'} + peerDependencies: + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + ce-la-react@0.3.1: + resolution: {integrity: sha512-g0YwpZDPIwTwFumGTzNHcgJA6VhFfFCJkSNdUdC04br2UfU+56JDrJrJva3FZ7MToB4NDHAFBiPE/PZdNl1mQA==} + peerDependencies: + react: '>=17.0.0' + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-declaration-sorter@7.3.0: + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@7.0.9: + resolution: {integrity: sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano@7.1.1: + resolution: {integrity: sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} + + directory-tree@3.5.2: + resolution: {integrity: sha512-DsOqeZEHkZnZrVOJG3mE/J9M6J8PulImiC6I1ZpoprVlfno8GvLOPDMkxiJihklLK7B9aVudG463L1+S/kzjiw==} + engines: {node: '>=10.0'} + hasBin: true + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.187: + resolution: {integrity: sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==} + + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + flat@6.0.1: + resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} + engines: {node: '>=18'} + hasBin: true + + fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + immutable@5.1.3: + resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-in-the-middle@1.14.4: + resolution: {integrity: sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + inquirer@12.9.0: + resolution: {integrity: sha512-LlFVmvWVCun7uEgPB3vups9NzBrjJn48kRNtFGw3xU1H5UXExTEz/oF1JGLaB0fvlkUB+W6JfgLcSEaSdH7RPA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + + intl-messageformat@10.7.16: + resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + javascript-time-ago@2.5.11: + resolution: {integrity: sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==} + + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + + joi@18.0.1: + resolution: {integrity: sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==} + engines: {node: '>= 20'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + knex@3.1.0: + resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + media-chrome@4.13.1: + resolution: {integrity: sha512-jPPwYrFkM4ky27/xNYEeyRPOBC7qvru4Oydy7vQHMHplXLQJmjtcauhlLPvG0O5kkYFEaOBXv5zGYes/UxOoVw==} + + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + micromustache@8.0.3: + resolution: {integrity: sha512-SXjrEPuYNtWq0reR9LR2nHdzdQx/3re9HPcDGjm00L7hi2RsH5KMRBhYEBvPdyQC51RW/2TznjwX/sQLPPyHNw==} + engines: {node: '>=8'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mode-watcher@1.1.0: + resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} + peerDependencies: + svelte: ^5.27.0 + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.4: + resolution: {integrity: sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-convert-values@7.0.7: + resolution: {integrity: sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-comments@7.0.4: + resolution: {integrity: sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-rules@7.0.6: + resolution: {integrity: sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-gradients@7.0.1: + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-params@7.0.4: + resolution: {integrity: sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-selectors@7.0.5: + resolution: {integrity: sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-unicode@7.0.4: + resolution: {integrity: sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-initial@7.0.4: + resolution: {integrity: sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-svgo@7.1.0: + resolution: {integrity: sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.32 + + postcss-unique-selectors@7.0.4: + resolution: {integrity: sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + query-string@9.3.1: + resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==} + engines: {node: '>=18'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + relative-time-format@1.1.6: + resolution: {integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup-plugin-esbuild@6.2.1: + resolution: {integrity: sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA==} + engines: {node: '>=14.18.0'} + peerDependencies: + esbuild: '>=0.18.0' + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + + rollup-plugin-styler@2.0.0: + resolution: {integrity: sha512-u96KK3hfA5RDeZFuE1kW0mu7FKS6sDu0RlGx9vijqQbzlmrzkhkBtge5gXZ6wF0CnTgcn7CfkwKOwIcWVZU/VQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + rollup: ^2.63.0 || ^3.0.0 || ^4.0.0 + + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.50.0: + resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} + engines: {node: '>=0.12.0'} + + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.25.0: + resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.28.0: + resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.29.2: + resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.31.1: + resolution: {integrity: sha512-v3czcTnO+EJjiPvD4dwIqfTdHLZ8oH0zJheKqAHh9QMViY7Qb29UlAMRpX7ZtHh7AFqV60KmfxaJ9QMy+L1igQ==} + peerDependencies: + svelte: ^5.7.0 + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.92.1: + resolution: {integrity: sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + stylehacks@7.0.6: + resolution: {integrity: sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + super-sitemap@1.0.5: + resolution: {integrity: sha512-30cgsnFxPTDSgHlp1rM8PPWw7t5xpiMIVJwcSLB8+jnl9lirAb6ZrAjh+hrvynOvz1RrSzKjHjVLHH+r6+ja1w==} + peerDependencies: + svelte: '>=4.0.0 <6.0.0' + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-i18n@4.0.1: + resolution: {integrity: sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + svelte: ^3 || ^4 || ^5 + + svelte-sonner@1.0.5: + resolution: {integrity: sha512-9dpGPFqKb/QWudYqGnEz93vuY+NgCEvyNvxoCLMVGw6sDN/3oVeKV1xiEirW2E1N3vJEyj5imSBNOGltQHA7mg==} + peerDependencies: + svelte: ^5.0.0 + + svelte-toolbelt@0.10.5: + resolution: {integrity: sha512-8e+eWTgxw1aiLxhDE8Rb1X6AoLitqpJz+WhAul2W7W58C8KoLoJQf1TgQdFPBiCPJ0Jg5y0Zi1uyua9em4VS0w==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + + svelte@5.38.6: + resolution: {integrity: sha512-ltBPlkvqk3bgCK7/N323atUpP3O3Y+DrGV4dcULrsSn4fZaaNnOmdplNznwfdWclAgvSr5rxjtzn/zJhRm6TKg==} + engines: {node: '>=18'} + + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} + hasBin: true + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwind-variants@1.0.0: + resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.3.8: + resolution: {integrity: sha512-Qrk3PZ7l7wUcGYhwZloqfkWCmaXZAoqjkdbIDvzfGshwGtexa/DAs9koXxIkrpEasyevandomzCBAV1Yyop5rw==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unhead@2.0.12: + resolution: {integrity: sha512-5oo0lwz81XDXCmrHGzgmbaNOxM8R9MZ3FkEs2ROHeW8e16xsrv7qXykENlISrcxr3RLPHQEsD1b6js9P2Oj/Ow==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vite-plugin-wasm@3.5.0: + resolution: {integrity: sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==} + peerDependencies: + vite: ^2 || ^3 || ^4 || ^5 || ^6 || ^7 + + vite@7.1.3: + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.1.4: + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue@3.5.18: + resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + wasm-pack@0.13.1: + resolution: {integrity: sha512-P9exD4YkjpDbw68xUhF3MDm/CC/3eTmmthyG5bHJ56kalxOTewOunxTke4SyF8MTXV6jUtNjXggPgrGmMtczGg==} + hasBin: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod@4.0.14: + resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@8.1.1': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.1 + + '@babel/types@7.28.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@directus/composables@11.2.3(vue@3.5.18(typescript@5.9.2))': + dependencies: + '@directus/constants': 13.0.3 + '@directus/utils': 13.0.10(vue@3.5.18(typescript@5.9.2)) + axios: 1.11.0 + lodash-es: 4.17.21 + nanoid: 5.1.5 + vue: 3.5.18(typescript@5.9.2) + transitivePeerDependencies: + - debug + + '@directus/constants@13.0.3': {} + + '@directus/extensions-sdk@16.0.2(@types/node@24.0.15)(@unhead/vue@2.0.12(vue@3.5.18(typescript@5.9.2)))(jiti@2.5.1)(knex@3.1.0)(lightningcss@1.30.1)(pinia@2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)))(sass@1.92.1)(terser@5.43.1)(typescript@5.9.2)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(ws@8.18.3)': + dependencies: + '@directus/composables': 11.2.3(vue@3.5.18(typescript@5.9.2)) + '@directus/constants': 13.0.3 + '@directus/extensions': 3.0.11(knex@3.1.0)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))(ws@8.18.3) + '@directus/themes': 1.1.5(@unhead/vue@2.0.12(vue@3.5.18(typescript@5.9.2)))(pinia@2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2)) + '@directus/types': 13.2.3(knex@3.1.0)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))(ws@8.18.3) + '@directus/utils': 13.0.10(vue@3.5.18(typescript@5.9.2)) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.46.2) + '@rollup/plugin-json': 6.1.0(rollup@4.46.2) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.46.2) + '@rollup/plugin-replace': 6.0.2(rollup@4.46.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.46.2) + '@rollup/plugin-virtual': 3.0.2(rollup@4.46.2) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.3(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))(vue@3.5.18(typescript@5.9.2)) + chalk: 5.4.1 + commander: 14.0.0 + esbuild: 0.25.9 + execa: 9.6.0 + fs-extra: 11.3.0 + inquirer: 12.9.0(@types/node@24.0.15) + ora: 8.2.0 + rollup: 4.46.2 + rollup-plugin-esbuild: 6.2.1(esbuild@0.25.9)(rollup@4.46.2) + rollup-plugin-styler: 2.0.0(rollup@4.46.2)(typescript@5.9.2) + semver: 7.7.2 + vite: 7.1.3(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + vue: 3.5.18(typescript@5.9.2) + transitivePeerDependencies: + - '@types/node' + - '@unhead/vue' + - better-sqlite3 + - debug + - deep-diff + - express + - graphql + - jiti + - knex + - less + - lightningcss + - mysql + - mysql2 + - nodemailer + - openapi3-ts + - pg + - pg-native + - pinia + - pino + - sass + - sass-embedded + - sharp + - sqlite3 + - stylus + - sugarss + - supports-color + - tedious + - terser + - tsx + - typescript + - vue-router + - ws + - yaml + + '@directus/extensions@3.0.11(knex@3.1.0)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))(ws@8.18.3)': + dependencies: + '@directus/constants': 13.0.3 + '@directus/types': 13.2.3(knex@3.1.0)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))(ws@8.18.3) + '@directus/utils': 13.0.10(vue@3.5.18(typescript@5.9.2)) + '@types/express': 4.17.21 + fs-extra: 11.3.0 + lodash-es: 4.17.21 + zod: 4.0.14 + optionalDependencies: + knex: 3.1.0 + vue: 3.5.18(typescript@5.9.2) + vue-router: 4.5.1(vue@3.5.18(typescript@5.9.2)) + transitivePeerDependencies: + - better-sqlite3 + - deep-diff + - express + - graphql + - mysql + - mysql2 + - nodemailer + - openapi3-ts + - pg + - pg-native + - sharp + - sqlite3 + - supports-color + - tedious + - ws + + '@directus/schema@13.0.3': + dependencies: + knex: 3.1.0 + transitivePeerDependencies: + - better-sqlite3 + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + '@directus/sdk@20.0.3': {} + + '@directus/system-data@3.3.0': {} + + '@directus/themes@1.1.5(@unhead/vue@2.0.12(vue@3.5.18(typescript@5.9.2)))(pinia@2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))': + dependencies: + '@directus/utils': 13.0.10(vue@3.5.18(typescript@5.9.2)) + '@unhead/vue': 2.0.12(vue@3.5.18(typescript@5.9.2)) + decamelize: 6.0.0 + flat: 6.0.1 + lodash-es: 4.17.21 + pinia: 2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)) + vue: 3.5.18(typescript@5.9.2) + + '@directus/types@13.2.3(knex@3.1.0)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2))(ws@8.18.3)': + dependencies: + '@directus/constants': 13.0.3 + '@directus/schema': 13.0.3 + '@sinclair/typebox': 0.34.38 + '@types/express': 4.17.21 + '@types/geojson': 7946.0.16 + '@types/nodemailer': 6.4.17 + '@types/ws': 8.18.1 + optionalDependencies: + knex: 3.1.0 + vue: 3.5.18(typescript@5.9.2) + vue-router: 4.5.1(vue@3.5.18(typescript@5.9.2)) + ws: 8.18.3 + transitivePeerDependencies: + - better-sqlite3 + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + '@directus/utils@13.0.10(vue@3.5.18(typescript@5.9.2))': + dependencies: + '@directus/constants': 13.0.3 + '@directus/system-data': 3.3.0 + date-fns: 4.1.0 + fs-extra: 11.3.0 + joi: 18.0.1 + js-yaml: 4.1.0 + lodash-es: 4.17.21 + micromustache: 8.0.3 + optionalDependencies: + vue: 3.5.18(typescript@5.9.2) + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.25.0': + optional: true + + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.25.0': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.25.0': + optional: true + + '@esbuild/android-arm@0.25.9': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.25.0': + optional: true + + '@esbuild/android-x64@0.25.9': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.25.0': + optional: true + + '@esbuild/darwin-arm64@0.25.9': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.25.0': + optional: true + + '@esbuild/darwin-x64@0.25.9': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.9': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.25.0': + optional: true + + '@esbuild/freebsd-x64@0.25.9': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.25.0': + optional: true + + '@esbuild/linux-arm64@0.25.9': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.25.0': + optional: true + + '@esbuild/linux-arm@0.25.9': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.25.0': + optional: true + + '@esbuild/linux-ia32@0.25.9': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.25.0': + optional: true + + '@esbuild/linux-loong64@0.25.9': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.25.0': + optional: true + + '@esbuild/linux-mips64el@0.25.9': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.25.0': + optional: true + + '@esbuild/linux-ppc64@0.25.9': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.25.0': + optional: true + + '@esbuild/linux-riscv64@0.25.9': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.25.0': + optional: true + + '@esbuild/linux-s390x@0.25.9': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.25.0': + optional: true + + '@esbuild/linux-x64@0.25.9': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.9': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.25.0': + optional: true + + '@esbuild/netbsd-x64@0.25.9': + optional: true + + '@esbuild/openbsd-arm64@0.25.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.9': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.25.0': + optional: true + + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.25.0': + optional: true + + '@esbuild/sunos-x64@0.25.9': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.25.0': + optional: true + + '@esbuild/win32-arm64@0.25.9': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.25.0': + optional: true + + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.25.0': + optional: true + + '@esbuild/win32-x64@0.25.9': + optional: true + + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@formatjs/ecma402-abstract@2.3.4': + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/intl-localematcher': 0.6.1 + decimal.js: 10.6.0 + tslib: 2.8.1 + + '@formatjs/fast-memoize@2.2.7': + dependencies: + tslib: 2.8.1 + + '@formatjs/icu-messageformat-parser@2.11.2': + dependencies: + '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/icu-skeleton-parser': 1.8.14 + tslib: 2.8.1 + + '@formatjs/icu-skeleton-parser@1.8.14': + dependencies: + '@formatjs/ecma402-abstract': 2.3.4 + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.6.1': + dependencies: + tslib: 2.8.1 + + '@grpc/grpc-js@1.14.0': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.3': {} + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + + '@iconify-json/ri@1.2.5': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/tailwind4@1.0.6(tailwindcss@4.1.12)': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + tailwindcss: 4.1.12 + transitivePeerDependencies: + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.1 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@inquirer/ansi@1.0.0': {} + + '@inquirer/checkbox@4.2.4(@types/node@24.0.15)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.15) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/confirm@5.1.18(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/core@10.1.15(@types/node@24.0.15)': + dependencies: + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.15) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/core@10.2.2(@types/node@24.0.15)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.15) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/editor@4.2.20(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/external-editor': 1.0.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/expand@4.0.20(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/external-editor@1.0.2(@types/node@24.0.15)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/input@4.2.4(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/number@3.0.20(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/password@4.0.20(@types/node@24.0.15)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/prompts@7.8.6(@types/node@24.0.15)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@24.0.15) + '@inquirer/confirm': 5.1.18(@types/node@24.0.15) + '@inquirer/editor': 4.2.20(@types/node@24.0.15) + '@inquirer/expand': 4.0.20(@types/node@24.0.15) + '@inquirer/input': 4.2.4(@types/node@24.0.15) + '@inquirer/number': 3.0.20(@types/node@24.0.15) + '@inquirer/password': 4.0.20(@types/node@24.0.15) + '@inquirer/rawlist': 4.1.8(@types/node@24.0.15) + '@inquirer/search': 3.1.3(@types/node@24.0.15) + '@inquirer/select': 4.3.4(@types/node@24.0.15) + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/rawlist@4.1.8(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/search@3.1.3(@types/node@24.0.15)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.15) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/select@4.3.4(@types/node@24.0.15)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.0.15) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.15) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.15 + + '@inquirer/type@3.0.8(@types/node@24.0.15)': + optionalDependencies: + '@types/node': 24.0.15 + + '@internationalized/date@3.8.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@lucide/svelte@0.544.0(svelte@5.38.6)': + dependencies: + svelte: 5.38.6 + + '@opentelemetry/api-logs@0.205.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/auto-instrumentations-node@0.64.6(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.61.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.51.4(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.51.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.49.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.21.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.23.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.49.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.54.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.50.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.25.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.49.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.53.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.53.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.15.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.50.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.50.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.49.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.58.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.51.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.52.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.49.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-oracledb': 0.31.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.58.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.54.4(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.51.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.50.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-runtime-node': 0.19.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.52.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.24.3(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.16.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.50.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.31.8(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 2.5.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.13.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.7.8(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.40.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - encoding + - supports-color + + '@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-prometheus@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-grpc@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/instrumentation-amqplib@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-lambda@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/aws-lambda': 8.10.152 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-sdk@0.61.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-bunyan@0.51.4(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@types/bunyan': 1.8.11 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cassandra-driver@0.51.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.49.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cucumber@0.21.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.23.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dns@0.49.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.54.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.50.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.25.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.49.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.53.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-grpc@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.53.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.15.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.50.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.54.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.50.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-memcached@0.49.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@types/memcached': 2.2.10 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.58.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.51.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.52.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-net@0.49.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-oracledb@0.31.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/oracledb': 6.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.58.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.5 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pino@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.54.4(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-restify@0.51.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-router@0.50.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-runtime-node@0.19.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-socket.io@0.52.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.24.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.16.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-winston@0.50.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + import-in-the-middle: 1.14.4 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.205.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/propagator-b3@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/redis-common@0.38.2': {} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.8(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resource-detector-aws@2.5.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-azure@0.13.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/resource-detector-container@0.7.8(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resource-detector-gcp@0.40.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + gcp-metadata: 6.1.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-logs@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.205.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.205.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.205.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/semantic-conventions@1.37.0': {} + + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rolldown/pluginutils@1.0.0-beta.29': {} + + '@rollup/plugin-commonjs@28.0.6(rollup@4.46.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.46.2 + + '@rollup/plugin-commonjs@28.0.6(rollup@4.50.0)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.50.0 + + '@rollup/plugin-json@6.1.0(rollup@4.46.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + optionalDependencies: + rollup: 4.46.2 + + '@rollup/plugin-json@6.1.0(rollup@4.50.0)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) + optionalDependencies: + rollup: 4.50.0 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.46.2 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.50.0)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.50.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.50.0 + + '@rollup/plugin-replace@6.0.2(rollup@4.46.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.46.2 + + '@rollup/plugin-terser@0.4.4(rollup@4.46.2)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.43.1 + optionalDependencies: + rollup: 4.46.2 + + '@rollup/plugin-virtual@3.0.2(rollup@4.46.2)': + optionalDependencies: + rollup: 4.46.2 + + '@rollup/pluginutils@5.2.0(rollup@4.46.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.46.2 + + '@rollup/pluginutils@5.2.0(rollup@4.50.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.50.0 + + '@rollup/rollup-android-arm-eabi@4.46.2': + optional: true + + '@rollup/rollup-android-arm-eabi@4.50.0': + optional: true + + '@rollup/rollup-android-arm64@4.46.2': + optional: true + + '@rollup/rollup-android-arm64@4.50.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.46.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.50.0': + optional: true + + '@rollup/rollup-darwin-x64@4.46.2': + optional: true + + '@rollup/rollup-darwin-x64@4.50.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.50.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.50.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.50.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.50.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.50.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.50.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.50.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.50.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.50.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.50.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.50.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sinclair/typebox@0.34.38': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@sindresorhus/slugify@3.0.0': + dependencies: + '@sindresorhus/transliterate': 2.0.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@2.0.0': {} + + '@standard-schema/spec@1.0.0': {} + + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-node@5.3.1(@sveltejs/kit@2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.6(rollup@4.50.0) + '@rollup/plugin-json': 6.1.0(rollup@4.50.0) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.50.0) + '@sveltejs/kit': 2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + rollup: 4.50.0 + + '@sveltejs/adapter-static@3.0.9(@sveltejs/kit@2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))': + dependencies: + '@sveltejs/kit': 2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + + '@sveltejs/kit@2.37.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.3.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.2 + svelte: 5.38.6 + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + optionalDependencies: + '@opentelemetry/api': 1.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + debug: 4.4.1 + svelte: 5.38.6 + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.4(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)))(svelte@5.38.6)(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + debug: 4.4.1 + deepmerge: 4.3.1 + magic-string: 0.30.17 + svelte: 5.38.6 + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + vitefu: 1.1.1(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/forms@0.5.10(tailwindcss@4.1.12)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 4.1.12 + + '@tailwindcss/node@4.1.12': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.12 + + '@tailwindcss/oxide-android-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide@4.1.12': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.12)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.12 + + '@tailwindcss/vite@4.1.12(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))': + dependencies: + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + + '@tsconfig/svelte@5.0.5': {} + + '@types/aws-lambda@8.10.152': {} + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.0.15 + + '@types/bunyan@1.8.11': + dependencies: + '@types/node': 24.0.15 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.0.15 + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 24.0.15 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 + + '@types/geojson@7946.0.16': {} + + '@types/http-errors@2.0.5': {} + + '@types/memcached@2.2.10': + dependencies: + '@types/node': 24.0.15 + + '@types/mime@1.3.5': {} + + '@types/mysql@2.15.27': + dependencies: + '@types/node': 24.0.15 + + '@types/node@24.0.15': + dependencies: + undici-types: 7.8.0 + + '@types/nodemailer@6.4.17': + dependencies: + '@types/node': 24.0.15 + + '@types/oracledb@6.5.2': + dependencies: + '@types/node': 24.0.15 + + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.15.5 + + '@types/pg@8.15.5': + dependencies: + '@types/node': 24.0.15 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/resolve@1.20.2': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.0.15 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.0.15 + '@types/send': 0.17.5 + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 24.0.15 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.0.15 + + '@unhead/vue@2.0.12(vue@3.5.18(typescript@5.9.2))': + dependencies: + hookable: 5.5.3 + unhead: 2.0.12 + vue: 3.5.18(typescript@5.9.2) + + '@vitejs/plugin-vue@6.0.1(vite@7.1.3(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1))(vue@3.5.18(typescript@5.9.2))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.3(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + vue: 3.5.18(typescript@5.9.2) + + '@vue/compiler-core@3.5.18': + dependencies: + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.18 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.18': + dependencies: + '@vue/compiler-core': 3.5.18 + '@vue/shared': 3.5.18 + + '@vue/compiler-sfc@3.5.18': + dependencies: + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.18 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.18': + dependencies: + '@vue/compiler-dom': 3.5.18 + '@vue/shared': 3.5.18 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.18': + dependencies: + '@vue/shared': 3.5.18 + + '@vue/runtime-core@3.5.18': + dependencies: + '@vue/reactivity': 3.5.18 + '@vue/shared': 3.5.18 + + '@vue/runtime-dom@3.5.18': + dependencies: + '@vue/reactivity': 3.5.18 + '@vue/runtime-core': 3.5.18 + '@vue/shared': 3.5.18 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))': + dependencies: + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 + vue: 3.5.18(typescript@5.9.2) + + '@vue/shared@3.5.18': {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-back@3.1.0: {} + + array-back@4.0.2: {} + + async@0.2.10: {} + + asynckit@0.4.0: {} + + axios@0.26.1: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + + axios@1.11.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + bignumber.js@9.3.1: {} + + binary-install@1.1.2: + dependencies: + axios: 0.26.1 + rimraf: 3.0.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + + bits-ui@2.11.0(@internationalized/date@3.8.2)(svelte@5.38.6): + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/dom': 1.7.2 + '@internationalized/date': 3.8.2 + esm-env: 1.2.2 + runed: 0.31.1(svelte@5.38.6) + svelte: 5.38.6 + svelte-toolbelt: 0.10.5(svelte@5.38.6) + tabbable: 6.2.0 + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + optional: true + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.187 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001727: {} + + ce-la-react@0.3.1(react@19.1.1): + dependencies: + react: 19.1.1 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@5.4.1: {} + + chardet@2.1.0: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + optional: true + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + cjs-module-lexer@1.4.3: {} + + class-transformer@0.5.1: {} + + cli-color@2.0.4: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.17 + timers-ext: 0.1.8 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.19: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@14.0.0: {} + + commander@2.20.3: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + cookie@0.6.0: {} + + cosmiconfig@8.3.6(typescript@5.9.2): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-declaration-sorter@7.3.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@7.0.9(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + css-declaration-sorter: 7.3.0(postcss@8.5.6) + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 10.1.1(postcss@8.5.6) + postcss-colormin: 7.0.4(postcss@8.5.6) + postcss-convert-values: 7.0.7(postcss@8.5.6) + postcss-discard-comments: 7.0.4(postcss@8.5.6) + postcss-discard-duplicates: 7.0.2(postcss@8.5.6) + postcss-discard-empty: 7.0.1(postcss@8.5.6) + postcss-discard-overridden: 7.0.1(postcss@8.5.6) + postcss-merge-longhand: 7.0.5(postcss@8.5.6) + postcss-merge-rules: 7.0.6(postcss@8.5.6) + postcss-minify-font-values: 7.0.1(postcss@8.5.6) + postcss-minify-gradients: 7.0.1(postcss@8.5.6) + postcss-minify-params: 7.0.4(postcss@8.5.6) + postcss-minify-selectors: 7.0.5(postcss@8.5.6) + postcss-normalize-charset: 7.0.1(postcss@8.5.6) + postcss-normalize-display-values: 7.0.1(postcss@8.5.6) + postcss-normalize-positions: 7.0.1(postcss@8.5.6) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.6) + postcss-normalize-string: 7.0.1(postcss@8.5.6) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.6) + postcss-normalize-unicode: 7.0.4(postcss@8.5.6) + postcss-normalize-url: 7.0.1(postcss@8.5.6) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.6) + postcss-ordered-values: 7.0.2(postcss@8.5.6) + postcss-reduce-initial: 7.0.4(postcss@8.5.6) + postcss-reduce-transforms: 7.0.1(postcss@8.5.6) + postcss-svgo: 7.1.0(postcss@8.5.6) + postcss-unique-selectors: 7.0.4(postcss@8.5.6) + + cssnano-utils@5.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@7.1.1(postcss@8.5.6): + dependencies: + cssnano-preset-default: 7.0.9(postcss@8.5.6) + lilconfig: 3.1.3 + postcss: 8.5.6 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + date-fns@4.1.0: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize@6.0.0: {} + + decimal.js@10.6.0: {} + + decode-uri-component@0.4.1: {} + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.0.4: {} + + devalue@5.3.2: {} + + directory-tree@3.5.2: + dependencies: + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.187: {} + + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + + esbuild@0.25.9: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esm@3.2.25: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + estree-walker@2.0.2: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + eventemitter3@5.0.1: {} + + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + exsolve@1.0.7: {} + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend@3.0.2: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + optional: true + + filter-obj@5.1.0: {} + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + flat@6.0.1: {} + + fluent-ffmpeg@2.1.3: + dependencies: + async: 0.2.10 + which: 1.3.1 + + follow-redirects@1.15.9: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + forwarded-parse@2.1.2: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + 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 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + getopts@2.3.0: {} + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + google-logging-utils@0.0.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@3.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookable@5.5.3: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@8.0.1: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + immutable@5.1.3: + optional: true + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-in-the-middle@1.14.4: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.2.4: {} + + inquirer@12.9.0(@types/node@24.0.15): + dependencies: + '@inquirer/core': 10.1.15(@types/node@24.0.15) + '@inquirer/prompts': 7.8.6(@types/node@24.0.15) + '@inquirer/type': 3.0.8(@types/node@24.0.15) + ansi-escapes: 4.3.2 + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 24.0.15 + + interpret@2.2.0: {} + + intl-messageformat@10.7.16: + dependencies: + '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/icu-messageformat-parser': 2.11.2 + tslib: 2.8.1 + + is-arrayish@0.2.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: + optional: true + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-interactive@2.0.0: {} + + is-module@1.0.0: {} + + is-number@7.0.0: + optional: true + + is-plain-obj@4.1.0: {} + + is-promise@2.2.2: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + isexe@2.0.0: {} + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + javascript-time-ago@2.5.11: + dependencies: + relative-time-format: 1.1.6 + + jiti@2.5.1: {} + + joi@18.0.1: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.3 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.0.0 + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-parse-even-better-errors@2.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@4.1.5: {} + + knex@3.1.0: + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.2.0 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.17.21 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.0.2 + tildify: 2.0.0 + transitivePeerDependencies: + - supports-color + + kolorist@1.8.0: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-character@3.0.0: {} + + lodash-es@4.17.21: {} + + lodash.camelcase@4.3.0: {} + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + long@5.3.2: {} + + lru-cache@11.2.2: {} + + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.28: {} + + mdn-data@2.12.2: {} + + media-chrome@4.13.1(react@19.1.1): + dependencies: + ce-la-react: 0.3.1(react@19.1.1) + transitivePeerDependencies: + - react + + memoizee@0.4.17: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.8 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + micromustache@8.0.3: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-function@5.0.1: {} + + mini-svg-data-uri@1.4.4: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mode-watcher@1.1.0(svelte@5.38.6): + dependencies: + runed: 0.25.0(svelte@5.38.6) + svelte: 5.38.6 + svelte-toolbelt: 0.7.1(svelte@5.38.6) + + module-details-from-path@1.0.4: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} + + nanoid@5.1.5: {} + + next-tick@1.1.0: {} + + node-addon-api@7.1.1: + optional: true + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.19: {} + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + ora@8.2.0: + dependencies: + chalk: 5.4.1 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.3.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pg-connection-string@2.6.2: {} + + pg-int8@1.0.1: {} + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: + optional: true + + picomatch@4.0.3: {} + + pinia@2.3.1(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.18(typescript@5.9.2) + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@vue/composition-api' + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss-calc@10.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.7(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-discard-duplicates@7.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-merge-longhand@7.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.6(postcss@8.5.6) + + postcss-merge-rules@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-minify-font-values@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.1(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.5(postcss@8.5.6): + dependencies: + cssesc: 3.0.0 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-normalize-charset@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.2(postcss@8.5.6): + dependencies: + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@7.0.4(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 4.0.0 + + postcss-unique-selectors@7.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6): + dependencies: + prettier: 3.6.2 + svelte: 5.38.6 + + prettier@3.6.2: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 24.0.15 + long: 5.3.2 + + proxy-from-env@1.1.0: {} + + quansync@0.2.11: {} + + query-string@9.3.1: + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react@19.1.1: {} + + readdirp@4.1.2: + optional: true + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + reduce-flatten@2.0.0: {} + + reflect-metadata@0.2.2: {} + + relative-time-format@1.1.6: {} + + require-directory@2.1.1: {} + + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.1 + module-details-from-path: 1.0.4 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup-plugin-esbuild@6.2.1(esbuild@0.25.9)(rollup@4.46.2): + dependencies: + debug: 4.4.1 + es-module-lexer: 1.7.0 + esbuild: 0.25.9 + get-tsconfig: 4.10.1 + rollup: 4.46.2 + unplugin-utils: 0.2.4 + transitivePeerDependencies: + - supports-color + + rollup-plugin-styler@2.0.0(rollup@4.46.2)(typescript@5.9.2): + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + cosmiconfig: 8.3.6(typescript@5.9.2) + cssnano: 7.1.1(postcss@8.5.6) + fs-extra: 11.3.0 + icss-utils: 5.1.0(postcss@8.5.6) + mime-types: 2.1.35 + p-queue: 8.1.1 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss-value-parser: 4.2.0 + query-string: 9.3.1 + resolve: 1.22.10 + resolve.exports: 2.0.3 + rollup: 4.46.2 + source-map-js: 1.2.1 + tslib: 2.8.1 + transitivePeerDependencies: + - typescript + + rollup@4.46.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 + fsevents: 2.3.3 + + rollup@4.50.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.50.0 + '@rollup/rollup-android-arm64': 4.50.0 + '@rollup/rollup-darwin-arm64': 4.50.0 + '@rollup/rollup-darwin-x64': 4.50.0 + '@rollup/rollup-freebsd-arm64': 4.50.0 + '@rollup/rollup-freebsd-x64': 4.50.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 + '@rollup/rollup-linux-arm-musleabihf': 4.50.0 + '@rollup/rollup-linux-arm64-gnu': 4.50.0 + '@rollup/rollup-linux-arm64-musl': 4.50.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 + '@rollup/rollup-linux-ppc64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-gnu': 4.50.0 + '@rollup/rollup-linux-riscv64-musl': 4.50.0 + '@rollup/rollup-linux-s390x-gnu': 4.50.0 + '@rollup/rollup-linux-x64-gnu': 4.50.0 + '@rollup/rollup-linux-x64-musl': 4.50.0 + '@rollup/rollup-openharmony-arm64': 4.50.0 + '@rollup/rollup-win32-arm64-msvc': 4.50.0 + '@rollup/rollup-win32-ia32-msvc': 4.50.0 + '@rollup/rollup-win32-x64-msvc': 4.50.0 + fsevents: 2.3.3 + + run-async@4.0.6: {} + + runed@0.23.4(svelte@5.38.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.6 + + runed@0.25.0(svelte@5.38.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.6 + + runed@0.28.0(svelte@5.38.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.6 + + runed@0.29.2(svelte@5.38.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.6 + + runed@0.31.1(svelte@5.38.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.6 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass@1.92.1: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + optional: true + + sax@1.4.1: {} + + semver@7.7.2: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-cookie-parser@2.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + smob@1.5.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split-on-first@3.0.0: {} + + stdin-discarder@0.2.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@4.0.0: {} + + strnum@1.1.2: {} + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + stylehacks@7.0.6(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + super-sitemap@1.0.5(svelte@5.38.6): + dependencies: + directory-tree: 3.5.2 + fast-xml-parser: 4.5.3 + svelte: 5.38.6 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-i18n@4.0.1(svelte@5.38.6): + dependencies: + cli-color: 2.0.4 + deepmerge: 4.3.1 + esbuild: 0.19.12 + estree-walker: 2.0.2 + intl-messageformat: 10.7.16 + sade: 1.8.1 + svelte: 5.38.6 + tiny-glob: 0.2.9 + + svelte-sonner@1.0.5(svelte@5.38.6): + dependencies: + runed: 0.28.0(svelte@5.38.6) + svelte: 5.38.6 + + svelte-toolbelt@0.10.5(svelte@5.38.6): + dependencies: + clsx: 2.1.1 + runed: 0.29.2(svelte@5.38.6) + style-to-object: 1.0.9 + svelte: 5.38.6 + + svelte-toolbelt@0.7.1(svelte@5.38.6): + dependencies: + clsx: 2.1.1 + runed: 0.23.4(svelte@5.38.6) + style-to-object: 1.0.9 + svelte: 5.38.6 + + svelte@5.38.6: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.4 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 + + svgo@4.0.0: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.4.1 + + tabbable@6.2.0: {} + + table-layout@1.0.2: + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + + tailwind-merge@3.0.2: {} + + tailwind-merge@3.3.1: {} + + tailwind-variants@1.0.0(tailwindcss@4.1.12): + dependencies: + tailwind-merge: 3.0.2 + tailwindcss: 4.1.12 + + tailwindcss@4.1.12: {} + + tapable@2.2.2: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + tarn@3.0.2: {} + + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tildify@2.0.0: {} + + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + optional: true + + totalist@3.0.1: {} + + tr46@0.0.3: {} + + tslib@2.8.1: {} + + tw-animate-css@1.3.8: {} + + type-fest@0.21.3: {} + + type@2.7.3: {} + + typescript@5.9.2: {} + + typical@4.0.0: {} + + typical@5.2.0: {} + + ufo@1.6.1: {} + + undici-types@7.8.0: {} + + unhead@2.0.12: + dependencies: + hookable: 5.5.3 + + unicorn-magic@0.3.0: {} + + universalify@2.0.1: {} + + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + vite-plugin-wasm@3.5.0(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)): + dependencies: + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + + vite@7.1.3(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.15 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.92.1 + terser: 5.43.1 + + vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1): + dependencies: + esbuild: 0.25.0 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.15 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.92.1 + terser: 5.43.1 + + vitefu@1.1.1(vite@7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)): + optionalDependencies: + vite: 7.1.4(@types/node@24.0.15)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1) + + vue-demi@0.14.10(vue@3.5.18(typescript@5.9.2)): + dependencies: + vue: 3.5.18(typescript@5.9.2) + + vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.18(typescript@5.9.2) + optional: true + + vue@3.5.18(typescript@5.9.2): + dependencies: + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-sfc': 3.5.18 + '@vue/runtime-dom': 3.5.18 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2)) + '@vue/shared': 3.5.18 + optionalDependencies: + typescript: 5.9.2 + + wasm-pack@0.13.1: + dependencies: + binary-install: 1.1.2 + transitivePeerDependencies: + - debug + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.3: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yoctocolors-cjs@2.1.2: {} + + yoctocolors@2.1.2: {} + + zimmerframe@1.1.2: {} + + zod@4.0.14: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..eb83d39 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,8 @@ +packages: + - packages/* + +ignoredBuiltDependencies: + - "@tailwindcss/oxide" + +onlyBuiltDependencies: + - svelte-preprocess