├── .npmrc ├── src ├── vite-env.d.ts ├── style.css ├── lib │ ├── smtp.ts │ ├── types.ts │ ├── mock.ts │ ├── utils.ts │ └── quotes.ts ├── components │ ├── icons │ │ ├── Key.vue │ │ ├── GoogleChrome.vue │ │ └── Firefox.vue │ ├── email │ │ ├── HtmlPreview.vue │ │ ├── SpamAssassin.vue │ │ ├── LinksChecker.vue │ │ ├── Header.vue │ │ └── BodyTabs.vue │ ├── MailItem.vue │ ├── StatusBar.vue │ ├── mailbox │ │ └── ButtonDeleteAllEmails.vue │ ├── Mailbox.vue │ ├── SmtpServer.vue │ └── status-bar │ │ └── LicenseStatus.vue ├── assets │ └── vue.svg ├── main.ts ├── route.ts ├── App.vue ├── stores │ ├── license.ts │ └── appStore.ts └── views │ ├── Home.vue │ └── Email.vue ├── src-tauri ├── src │ ├── build.rs │ └── main.rs ├── icons │ ├── icon.ico │ ├── icon.png │ ├── 32x32.png │ ├── icon.icns │ ├── 128x128.png │ ├── StoreLogo.png │ ├── 128x128@2x.png │ ├── Square30x30Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ └── Square310x310Logo.png ├── .gitignore ├── capabilities │ ├── desktop.json │ └── migrated.json ├── rustfmt.toml ├── gen │ └── schemas │ │ └── capabilities.json ├── Cargo.toml └── tauri.conf.json ├── app-icon.png ├── blade-mail-screenshot.png ├── postcss.config.cjs ├── .gitignore ├── .prettierignore ├── tailwind.config.cjs ├── vite.config.ts ├── tsconfig.node.json ├── svelte.config.js ├── .prettierrc ├── index.html ├── README.md ├── tsconfig.json ├── package.json ├── public └── vite.svg ├── .github └── workflows │ └── build.yml └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src-tauri/src/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/app-icon.png -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /blade-mail-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/blade-mail-screenshot.png -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | WixTools 5 | -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangnokia/blademail/HEAD/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | /dist 12 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | "./index.html", 4 | "./src/**/*.{vue,js,ts}",], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [ 9 | require("@tailwindcss/forms") 10 | ], 11 | } 12 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | server: { 7 | port: 4001 8 | }, 9 | plugins: [vue()], 10 | }) 11 | -------------------------------------------------------------------------------- /src-tauri/capabilities/desktop.json: -------------------------------------------------------------------------------- 1 | { 2 | "identifier": "desktop-capability", 3 | "platforms": [ 4 | "macOS", 5 | "windows", 6 | "linux" 7 | ], 8 | "windows": [ 9 | "main" 10 | ], 11 | "permissions": [ 12 | "updater:default" 13 | ] 14 | } -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /src/lib/smtp.ts: -------------------------------------------------------------------------------- 1 | import { invoke } from "@tauri-apps/api/core" 2 | 3 | export enum Action { 4 | Start = "start_server", 5 | Stop = "stop_server", 6 | } 7 | 8 | export function startSmtpServer(): Promise { 9 | return invoke(Action.Start); 10 | } 11 | 12 | export function stopSmtpServer(): Promise { 13 | return invoke(Action.Stop); 14 | } 15 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static' // This was changed from adapter-auto 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | preprocess: vitePreprocess(), 7 | 8 | kit: { 9 | adapter: adapter() 10 | } 11 | }; 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 120, 6 | "tabWidth": 4, 7 | "plugins": [ 8 | "prettier-plugin-svelte" 9 | ], 10 | "pluginSearchDirs": [ 11 | "." 12 | ], 13 | "overrides": [ 14 | { 15 | "files": "*.svelte", 16 | "options": { 17 | "parser": "svelte" 18 | } 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /src-tauri/rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 100 2 | hard_tabs = false 3 | tab_spaces = 4 4 | newline_style = "Auto" 5 | use_small_heuristics = "Default" 6 | reorder_imports = true 7 | reorder_modules = true 8 | remove_nested_parens = true 9 | edition = "2018" 10 | merge_derives = true 11 | use_try_shorthand = false 12 | use_field_init_shorthand = false 13 | force_explicit_abi = true 14 | imports_granularity = "Crate" 15 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blademail 2 | 3 | Blade Mail is an Local SMTP desktop app for debugging and previewing your emails. 4 | 5 | This is the repository of the Blade Mail app. If you like this app, you can buy at [blademail.app](https://blademail.app). I'm only selling the built version of this app. 6 | 7 | **This is not Electron!**, and file size is small! 8 | ![](/blade-mail-screenshot.png) 9 | 10 | ## Development 11 | 12 | Start with `yarn` and `yarn tauri dev`. 13 | -------------------------------------------------------------------------------- /src/components/icons/Key.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import router from './route' 4 | import './style.css' 5 | import App from './App.vue' 6 | 7 | 8 | if (import.meta.hot) { 9 | import.meta.hot.on( 10 | "vite:beforeUpdate", 11 | /* eslint-disable-next-line no-console */ 12 | () => console.clear() 13 | ); 14 | } 15 | 16 | const app = createApp(App) 17 | const pinia = createPinia() 18 | app.use(pinia) 19 | app.use(router) 20 | 21 | app.mount('#app') 22 | -------------------------------------------------------------------------------- /src/route.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from "vue-router"; 2 | import Email from './views/Email.vue' 3 | import Home from './views/Home.vue' 4 | 5 | 6 | const routes = [ 7 | { path: '/', component: Home, name: 'home' }, 8 | { path: '/emails/:id', component: Email, name: 'emails.show', props: true }, 9 | { path: '/:pathMatch(.*)*', name: 'NotFound', component: Home }, 10 | ] 11 | const router = createRouter({ 12 | history: createWebHistory(), 13 | routes: routes 14 | }) 15 | 16 | export default router; -------------------------------------------------------------------------------- /src-tauri/gen/schemas/capabilities.json: -------------------------------------------------------------------------------- 1 | {"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["main"],"permissions":["updater:default"],"platforms":["macOS","windows","linux"]},"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","fs:allow-read-file","fs:allow-write-file","fs:allow-read-dir","fs:allow-mkdir",{"identifier":"fs:scope","allow":["$CACHE/**/*"]},"shell:allow-open",{"identifier":"http:default","allow":[{"url":"https://**/"},{"url":"http://**/"}]},"store:default","http:default"]}} -------------------------------------------------------------------------------- /src/components/email/HtmlPreview.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "preserve", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /src-tauri/capabilities/migrated.json: -------------------------------------------------------------------------------- 1 | { 2 | "identifier": "migrated", 3 | "description": "permissions that were migrated from v1", 4 | "local": true, 5 | "windows": [ 6 | "main" 7 | ], 8 | "permissions": [ 9 | "core:default", 10 | "fs:allow-read-file", 11 | "fs:allow-write-file", 12 | "fs:allow-read-dir", 13 | "fs:allow-mkdir", 14 | { 15 | "identifier": "fs:scope", 16 | "allow": [ 17 | "$CACHE/**/*" 18 | ] 19 | }, 20 | "shell:allow-open", 21 | { 22 | "identifier": "http:default", 23 | "allow": [ 24 | { 25 | "url": "https://**/" 26 | }, 27 | { 28 | "url": "http://**/" 29 | } 30 | ] 31 | }, 32 | "store:default", 33 | "http:default" 34 | ] 35 | } -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 29 | -------------------------------------------------------------------------------- /src/lib/types.ts: -------------------------------------------------------------------------------- 1 | export interface Email { 2 | id: string; 3 | raw: string; 4 | subject: string; 5 | from: [string, string][]; // author of message, not the sender 6 | sender: [string, string]; // [name, email] 7 | to: string[]; 8 | cc?: string[]; 9 | date: Date; 10 | html: string; 11 | text: string; 12 | excerpt: string; 13 | isOpen: boolean; 14 | links: EmailLink[]; 15 | spamReport?: SpamReport; 16 | attachments?: Attachment[]; 17 | }; 18 | 19 | export interface Attachment { 20 | filename: string, 21 | content_type: string, 22 | data: string, 23 | } 24 | 25 | export type EmailLinkStatus = 'ok' | 'error' | 'pending' 26 | 27 | export interface EmailLink { 28 | url: string, 29 | status: EmailLinkStatus 30 | } 31 | 32 | export interface SpamReport { 33 | report: string, 34 | score: number, 35 | rules: { 36 | score: number, 37 | description: string, 38 | }[] 39 | } -------------------------------------------------------------------------------- /src/components/MailItem.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-project", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@tauri-apps/plugin-fs": "~2.2.0", 13 | "@tauri-apps/plugin-http": "~2.2.0", 14 | "@tauri-apps/plugin-shell": "~2.2.0", 15 | "@tauri-apps/plugin-store": "~2.2.0", 16 | "@tauri-apps/plugin-updater": "~2.3.0", 17 | "nanoid": "^5.0.9", 18 | "pinia": "^2.3.0", 19 | "vue": "^3.5.13", 20 | "vue-router": "^4.5.0" 21 | }, 22 | "devDependencies": { 23 | "@tailwindcss/forms": "^0.5.9", 24 | "@tauri-apps/api": "^2.1.1", 25 | "@tauri-apps/cli": "^2.1.0", 26 | "@vitejs/plugin-vue": "^5.2.1", 27 | "autoprefixer": "^10.4.20", 28 | "dayjs": "^1.11.13", 29 | "postcss": "^8.4.49", 30 | "tailwindcss": "^3.4.17", 31 | "typescript": "^5.7.2", 32 | "vite": "^6.0.6", 33 | "vue-tsc": "^2.2.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "app" 3 | version = "0.1.0" 4 | description = "Local debugging email app" 5 | authors = [ "bangnokia" ] 6 | license = "MIT" 7 | repository = "https://github.com/bangnokia/blademail" 8 | default-run = "app" 9 | edition = "2021" 10 | build = "src/build.rs" 11 | 12 | [build-dependencies] 13 | tauri-build = { version = "2", features = [] } 14 | 15 | [dependencies] 16 | serde_json = "1.0" 17 | serde = { version = "1.0", features = [ "derive" ] } 18 | tauri = { version = "2", features = [] } 19 | mailin-embedded = { version = "0.6.1", features = [ "rtls" ] } 20 | email-parser = { version = "0.5.0", features = [ "headers", "mime", "content-disposition" ] } 21 | once_cell = "1.9.0" 22 | tauri-plugin-store = "2" 23 | tauri-plugin-http = "2" 24 | tauri-plugin-shell = "2" 25 | tauri-plugin-fs = "2" 26 | 27 | [features] 28 | default = [ "custom-protocol" ] 29 | custom-protocol = [ "tauri/custom-protocol" ] 30 | 31 | [target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] 32 | tauri-plugin-updater = "2" 33 | -------------------------------------------------------------------------------- /src/stores/license.ts: -------------------------------------------------------------------------------- 1 | import { load } from '@tauri-apps/plugin-store' 2 | import { fetch } from '@tauri-apps/plugin-http' 3 | 4 | export interface License { 5 | value: string 6 | } 7 | 8 | const store = await load('license.txt') 9 | 10 | export async function saveLicense(licenseKey: string): Promise { 11 | await store.set('license', { value: licenseKey }) 12 | } 13 | 14 | export async function getLicense(): Promise { 15 | const result = await store.get('license') 16 | 17 | return result ? result.value : '' 18 | } 19 | 20 | export async function verify(license: string) { 21 | try { 22 | const response = await fetch( 23 | 'https://lab.daudau.cc/api/apps/blade-mail/licenses/verify', 24 | { 25 | method: 'POST', 26 | body: JSON.stringify({ license_key: license }), 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | 'Accept': 'application/json' 30 | } 31 | } 32 | ) 33 | 34 | return response.json() as Promise<{ valid: boolean }> 35 | } catch (ex) { 36 | console.error(ex) 37 | } 38 | 39 | return false 40 | } -------------------------------------------------------------------------------- /src/stores/appStore.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { reactive, ref } from 'vue' 3 | import { Email } from '../lib/types' 4 | 5 | export const useAppStore = defineStore('appStore', () => { 6 | const emails = reactive([]) 7 | const openNewEmail = ref(true) 8 | 9 | function create(email: Email) { 10 | emails.unshift(email) 11 | } 12 | 13 | function find(id: string): Email | undefined { 14 | return emails.find(i => i.id === id) 15 | } 16 | 17 | function markOpenEmail(id: string) { 18 | // find the email by id, then update isOpen property to true 19 | const index = emails.findIndex(i => i.id === id) 20 | if (index === -1) return 21 | emails[index].isOpen = true 22 | } 23 | 24 | function destroy(emailId: string) { 25 | const index = emails.findIndex(i => i.id === emailId) 26 | emails.splice(index, 1) 27 | } 28 | 29 | function destroyAll() { 30 | emails.splice(0, emails.length) 31 | } 32 | 33 | return { 34 | emails, 35 | openNewEmail, 36 | 37 | // actions 38 | create, 39 | find, 40 | destroy, 41 | destroyAll, 42 | markOpenEmail, 43 | } 44 | }) -------------------------------------------------------------------------------- /src/components/StatusBar.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /src/lib/mock.ts: -------------------------------------------------------------------------------- 1 | import { useAppStore } from "../stores/appStore"; 2 | import { Email } from "./types"; 3 | import { nanoid } from "nanoid"; 4 | import { parseUrls } from "./utils"; 5 | 6 | 7 | export function createFakeEmails(count: number) { 8 | const appStore = useAppStore(); 9 | 10 | while (count > 0) { 11 | let email: Email = { 12 | id: nanoid(), 13 | subject: "Test email " + count, 14 | from: [ 15 | ['From user', 'from@blademail.test'] 16 | ], 17 | sender: ['Test user', 'test@blademail.test'], 18 | to: ['to@blademail.test'], 19 | cc: ['cc@blademail.test'], 20 | date: new Date(), 21 | raw: ` 22 | the raw content 23 | `.trim(), 24 | html: ` 25 |

The html content

26 | daudau.cc 27 | `.trim(), 28 | text: 'The text content', 29 | excerpt: `The short description of email`, 30 | isOpen: false, 31 | links: parseUrls(` 32 |

The html content

33 | daudau.cc 34 | `).map(url => ({ url, status: 'pending' })) 35 | } 36 | 37 | appStore.create(email) 38 | count--; 39 | } 40 | } -------------------------------------------------------------------------------- /src/components/mailbox/ButtonDeleteAllEmails.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/icons/GoogleChrome.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/email/SpamAssassin.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/Mailbox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/SmtpServer.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | -------------------------------------------------------------------------------- /src/components/email/LinksChecker.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "bundle": { 3 | "active": true, 4 | "targets": "all", 5 | "windows": { 6 | "certificateThumbprint": null, 7 | "digestAlgorithm": "sha256", 8 | "timestampUrl": "" 9 | }, 10 | "icon": [ 11 | "icons/32x32.png", 12 | "icons/128x128.png", 13 | "icons/128x128@2x.png", 14 | "icons/icon.icns", 15 | "icons/icon.ico" 16 | ], 17 | "resources": [], 18 | "externalBin": [], 19 | "copyright": "bangnokia © 2022", 20 | "category": "DeveloperTool", 21 | "shortDescription": "", 22 | "longDescription": "", 23 | "macOS": { 24 | "frameworks": [], 25 | "minimumSystemVersion": "", 26 | "exceptionDomain": "", 27 | "signingIdentity": null, 28 | "entitlements": null 29 | }, 30 | "linux": { 31 | "deb": { 32 | "depends": [] 33 | } 34 | }, 35 | "createUpdaterArtifacts": "v1Compatible" 36 | }, 37 | "build": { 38 | "beforeBuildCommand": "pnpm build", 39 | "frontendDist": "../dist", 40 | "beforeDevCommand": "pnpm dev", 41 | "devUrl": "http://localhost:4001" 42 | }, 43 | "productName": "Blade Mail", 44 | "mainBinaryName": "Blade Mail", 45 | "version": "1.0.9", 46 | "identifier": "com.blademail.app", 47 | "plugins": { 48 | "updater": { 49 | "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEEzMjVBM0M3QzRBMTBEM0YKUldRL0RhSEV4Nk1sbzc4N3QvVkZrQVlBVVNBOGo5SFd5NkFkK2l6K3BidFliTDlnSkdxcFpLSmUK", 50 | "endpoints": [ 51 | "https://lab.daudau.cc/api/update/blade-mail/{{target}}/{{arch}}/{{current_version}}" 52 | ] 53 | } 54 | }, 55 | "app": { 56 | "security": { 57 | "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'; connect-src ipc: http://ipc.localhost" 58 | }, 59 | "windows": [ 60 | { 61 | "title": "Blade Mail", 62 | "width": 1000, 63 | "height": 600, 64 | "resizable": true, 65 | "fullscreen": false, 66 | "useHttpsScheme": true 67 | } 68 | ] 69 | } 70 | } -------------------------------------------------------------------------------- /src/components/email/Header.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { Email, SpamReport } from "./types"; 2 | import { cacheDir } from "@tauri-apps/api/path" 3 | import { writeTextFile, mkdir } from "@tauri-apps/plugin-fs"; 4 | import { BaseDirectory } from "@tauri-apps/plugin-fs" 5 | import { fetch } from "@tauri-apps/plugin-http"; 6 | 7 | export function makeExcerpt(email: Email) { 8 | let excerpt = ""; 9 | 10 | if (email.html) { 11 | const text = new DOMParser().parseFromString(email.html, "text/html").body.textContent?.trim(); 12 | excerpt = text ? text.substring(0, 120) : ""; 13 | } else { 14 | excerpt = email.text.substring(0, 120); 15 | } 16 | 17 | return excerpt + "..."; 18 | } 19 | 20 | export function sleep(ms: number) { 21 | return new Promise(resolve => setTimeout(resolve, ms)); 22 | } 23 | 24 | export function parseUrls(html: string): string[] { 25 | const links = []; 26 | const images = []; 27 | const regex = /(]+href=")([^"]+)("[^>]*>)([^<]*)(<\/a>)/g; 28 | let match; 29 | while (match = regex.exec(html)) { 30 | links.push(match[2]); 31 | } 32 | const regex2 = /(]+src=")([^"]+)("[^>]*>)/g; 33 | while (match = regex2.exec(html)) { 34 | images.push(match[2]); 35 | } 36 | return [...new Set(links.concat(images))] 37 | } 38 | 39 | 40 | export async function ensureEmailFileIsWritten(email: Email): Promise { 41 | const fileName = `${email.id}.html`; 42 | const cacheDirPath = await cacheDir(); 43 | const appCacheDir = `${cacheDirPath}/BladeMail`; 44 | 45 | try { 46 | await mkdir("BladeMail", { 47 | dir: BaseDirectory.Cache 48 | }); 49 | } catch (e) { } 50 | 51 | try { 52 | await writeTextFile(`BladeMail/${fileName}`, email.html, { 53 | dir: BaseDirectory.Cache 54 | }); 55 | } catch (e) { 56 | } 57 | 58 | return appCacheDir + "/" + fileName; 59 | } 60 | 61 | export async function checkAliveUrl(url: string): Promise { 62 | try { 63 | const response = await fetch(url, { connectTimeout: 5000 }); 64 | 65 | return response.ok; 66 | } catch (ex) { 67 | } 68 | 69 | return false; 70 | } 71 | 72 | export async function checkSpam(raw: string) { 73 | const response = await fetch( 74 | 'https://spamcheck.postmarkapp.com/filter', 75 | { 76 | body: JSON.stringify({ email: raw }), 77 | headers: { 78 | 'Content-Type': 'application/json', 79 | 'Accept': 'application/json', 80 | }, 81 | 82 | }) 83 | 84 | return response.json() as Promise; 85 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: "publish" 2 | on: 3 | push: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | publish-tauri: 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | platform: [macos-latest, windows-latest, ubuntu-latest] 13 | 14 | runs-on: ${{ matrix.platform }} 15 | steps: 16 | - uses: actions/checkout@v3 17 | - uses: pnpm/action-setup@v2 18 | with: 19 | version: latest 20 | - name: Setup node 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: 18 24 | cache: 'pnpm' 25 | - name: Install Rust stable 26 | uses: actions-rs/toolchain@v1 27 | with: 28 | toolchain: stable 29 | - name: Install webkit2gtk (ubuntu only) 30 | if: matrix.platform == 'ubuntu-latest' 31 | run: | 32 | sudo apt-get update 33 | sudo apt install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libappindicator3-dev patchelf librsvg2-dev 34 | - name: Install app dependencies and build it 35 | run: pnpm install 36 | - uses: tauri-apps/tauri-action@v0 37 | env: 38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 39 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 40 | TAURI_KEY_PASSWORD: "" 41 | # ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} 42 | # APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} 43 | # APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} 44 | # APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_IDENTITY_ID }} 45 | # APPLE_ID: ${{ secrets.APPLE_ID }} 46 | # APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} 47 | with: 48 | tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version 49 | releaseName: "v__VERSION__" 50 | releaseBody: "See the assets to download this version and install." 51 | releaseDraft: true 52 | prerelease: false 53 | 54 | - name: Notification 55 | run: curl "https://ping2.me/@daudau/deploy" --data "message=Blademail is built on ${{ matrix.platform }}" 56 | -------------------------------------------------------------------------------- /src/components/status-bar/LicenseStatus.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | -------------------------------------------------------------------------------- /src/lib/quotes.ts: -------------------------------------------------------------------------------- 1 | export const quotes = [ 2 | "Bạn à, sống đẹp lên - @klx2003", 3 | "Act only according to that maxim whereby you can, at the same time, will that it should become a universal law. - Immanuel Kant", 4 | "An unexamined life is not worth living. - Socrates", 5 | "Be present above all else. - Naval Ravikant", 6 | "Happiness is not something readymade. It comes from your own actions. - Dalai Lama", 7 | "He who is contented is rich. - Laozi", 8 | "I begin to speak only when I am certain what I will say is not better left unsaid. - Cato the Younger", 9 | "If you do not have a consistent goal in life, you can not live it in a consistent way. - Marcus Aurelius", 10 | "It is not the man who has too little, but the man who craves more, that is poor. - Seneca", 11 | "It is quality rather than quantity that matters. - Lucius Annaeus Seneca", 12 | "Knowing is not enough; we must apply. Being willing is not enough; we must do. - Leonardo da Vinci", 13 | "Let all your things have their places; let each part of your business have its time. - Benjamin Franklin", 14 | "No surplus words or unnecessary actions. - Marcus Aurelius", 15 | "Order your soul. Reduce your wants. - Augustine", 16 | "People find pleasure in different ways. I find it in keeping my mind clear. - Marcus Aurelius", 17 | "Simplicity is an acquired taste. - Katharine Gerould", 18 | "Simplicity is the consequence of refined emotiranons. - Jean D'Alembert", 19 | "Simplicity is the essence of happiness. - Cedric Bledsoe", 20 | "Simplicity is the ultimate sophistication. - Leonardo da Vinci", 21 | "Smile, breathe, and go slowly. - Thich Nhat Hanh", 22 | "The only way to do great work is to love what you do. - Steve Jobs", 23 | "The whole future lies in uncertainty: live immediately. - Seneca", 24 | "Very little is needed to make a happy life. - Marcus Aurelius", 25 | "Waste no more time arguing what a good man should be, be one. - Marcus Aurelius", 26 | "Well begun is half done. - Aristotle", 27 | "When there is no desire, all things are at peace. - Laozi", 28 | "Walk as if you are kissing the Earth with your feet. - Thich Nhat Hanh", 29 | "Because you are alive, everything is possible. - Thich Nhat Hanh", 30 | "Breathing in, I calm body and mind. Breathing out, I smile. - Thich Nhat Hanh", 31 | "Life is available only in the present moment. - Thich Nhat Hanh", 32 | "The best way to take care of the future is to take care of the present moment. - Thich Nhat Hanh", 33 | "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less. - Marie Curie", 34 | ]; 35 | 36 | export function randomQuote(): string 37 | { 38 | return quotes[Math.floor(Math.random() * quotes.length)]; 39 | } 40 | -------------------------------------------------------------------------------- /src/views/Email.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | -------------------------------------------------------------------------------- /src/components/email/BodyTabs.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 109 | -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use email_parser::address::Address; 7 | use email_parser::email::Email; 8 | use email_parser::mime::ContentType; 9 | use email_parser::mime::Entity; 10 | use mailin_embedded::response::OK; 11 | use mailin_embedded::{Handler, Response, Server, SslConfig}; 12 | use once_cell::sync::OnceCell; 13 | use serde::Serialize; 14 | use tauri::menu::MenuBuilder; 15 | use tauri::Emitter; 16 | use tauri::Manager; 17 | use tauri::WebviewWindow; 18 | use std::fmt::Debug; 19 | use std::net::TcpListener; 20 | 21 | #[derive(Clone, Debug)] 22 | struct MyHandler { 23 | lines: Vec, 24 | } 25 | 26 | impl MyHandler { 27 | pub fn new() -> MyHandler { 28 | MyHandler { lines: vec![] } 29 | } 30 | } 31 | 32 | impl Handler for MyHandler { 33 | fn data(&mut self, buf: &[u8]) -> std::io::Result<()> { 34 | self.lines.push(String::from_utf8(Vec::from(buf)).unwrap()); 35 | Ok(()) 36 | } 37 | 38 | fn data_end(&mut self) -> Response { 39 | let raw = self.lines.join(""); 40 | let payload = parse(raw); 41 | 42 | // emit email to the UI 43 | let _ = MAIN_WINDOW.get().unwrap().emit("new-email", payload); 44 | OK 45 | } 46 | } 47 | 48 | #[tauri::command] 49 | async fn start_server(address: Option) -> Result { 50 | let mut server = Server::new(MyHandler::new()); 51 | let address = address.unwrap_or("127.0.0.1:1025".into()); 52 | let listener = TcpListener::bind(&address).unwrap(); 53 | 54 | server 55 | .with_name("blade mail") 56 | .with_tcp_listener(listener) 57 | .with_ssl(SslConfig::None) 58 | .unwrap(); 59 | 60 | println!("SMTP server is starting..."); 61 | 62 | match server.serve() { 63 | Ok(_) => Ok("SMTP server started.".into()), 64 | Err(e) => Err(format!("{}", e)), 65 | } 66 | } 67 | 68 | #[tauri::command] 69 | fn stop_server() -> String { 70 | "SMTP server stopped.".into() 71 | } 72 | 73 | // MailBox = (Name: String, EmailAddress: String) 74 | #[derive(Serialize, Clone, Debug)] 75 | struct EmailPayload { 76 | raw: String, 77 | sender: (String, String), 78 | from: Vec<(String, String)>, 79 | to: Option>, 80 | cc: Option>, 81 | subject: String, 82 | // date: String, 83 | // message_id: String, 84 | html: String, 85 | text: String, 86 | attachments: Vec, 87 | } 88 | 89 | #[derive(Serialize, Clone, Debug)] 90 | struct Attachment { 91 | filename: String, 92 | content_type: String, 93 | data: Vec, 94 | } 95 | 96 | fn parse(raw: String) -> EmailPayload { 97 | let email = Email::parse(raw.as_bytes()).unwrap(); 98 | let parsed = email.mime_entity.parse().unwrap(); 99 | 100 | let mut payload = EmailPayload { 101 | raw: raw.clone(), 102 | // message_id: email.message_id.unwrap().to_string(), 103 | from: email 104 | .from 105 | .iter() 106 | .map(|mailbox| { 107 | ( 108 | mailbox.name.as_ref().unwrap().join(" "), 109 | format!("{}@{}", mailbox.address.local_part, mailbox.address.domain), 110 | ) 111 | }) 112 | .collect(), 113 | sender: ( 114 | email.sender.name.unwrap().join(" "), 115 | format!( 116 | "{}@{}", 117 | email.sender.address.local_part, email.sender.address.domain 118 | ), 119 | ), 120 | to: match email.to { 121 | Some(addresses) => addresses 122 | .iter() 123 | .map(|add| match add { 124 | Address::Mailbox(mailbox) => Some(format!( 125 | "{}@{}", 126 | mailbox.address.local_part, mailbox.address.domain 127 | )), 128 | _ => None, 129 | }) 130 | .collect(), 131 | _ => None, 132 | }, 133 | cc: match email.cc { 134 | Some(addresses) => addresses 135 | .iter() 136 | .map(|add| match add { 137 | Address::Mailbox(mailbox) => Some(format!( 138 | "{}@{}", 139 | mailbox.address.local_part, mailbox.address.domain 140 | )), 141 | _ => None, 142 | }) 143 | .collect(), 144 | _ => None, 145 | }, 146 | subject: email.subject.unwrap().to_string(), 147 | html: "".into(), 148 | text: "".into(), 149 | attachments: vec![], 150 | }; 151 | 152 | match parsed { 153 | Entity::Text { subtype, value, .. } => match subtype.to_string().as_str() { 154 | "html" => payload.html = value.to_string(), 155 | "plain" => payload.text = value.to_string(), 156 | _ => println!("unknown text subtype: {}", subtype), 157 | }, 158 | // parsing content of multipart body, when user using markdown, 159 | // there will be a plain text and a html version of the email (maybe it sent from Laravel app) 160 | Entity::Multipart { subtype, content } => { 161 | println!("multipart {:?}", subtype); 162 | for entity in content { 163 | match entity.mime_type { 164 | ContentType::Multipart => { 165 | let parsed = entity.parse().unwrap(); 166 | 167 | match parsed { 168 | Entity::Multipart { subtype, content } => { 169 | for entity in content { 170 | println!("multipart 2 {}", subtype); 171 | match entity.subtype.to_string().as_str() { 172 | "html" => { 173 | payload.html = 174 | String::from_utf8(entity.value.to_vec()).unwrap() 175 | } 176 | "plain" => { 177 | payload.text = 178 | String::from_utf8(entity.value.to_vec()).unwrap() 179 | } 180 | _ => println!("unknown subtype: {}", subtype), 181 | } 182 | println!( 183 | "mime_type: {:#?}, subtype {:#?}, parameters {:#?} disposition {:#?}", 184 | entity.mime_type, entity.subtype.to_string().as_str(), entity.parameters, entity.disposition 185 | ); 186 | } 187 | } 188 | Entity::Text { 189 | subtype: _, 190 | value: _, 191 | } => {} 192 | _ => println!("not multipart or text"), 193 | } 194 | } 195 | ContentType::Text => { 196 | let parsed = entity.parse().unwrap(); 197 | println!("parsing text {:#?}", parsed); 198 | 199 | match parsed { 200 | Entity::Text { subtype, value, .. } => { 201 | println!("text, subtype: {}", subtype); 202 | match subtype.to_string().as_str() { 203 | "html" => payload.html = value.to_string(), 204 | "plain" => payload.text = value.to_string(), 205 | _ => (), 206 | } 207 | } 208 | _ => println!("not text"), 209 | } 210 | } 211 | ContentType::Application => { 212 | let attachment = Attachment { 213 | filename: entity 214 | .parameters 215 | .get("name") 216 | .map_or_else(|| "".to_string(), |name| name.to_string()), 217 | content_type: entity.subtype.to_string(), 218 | data: entity.value.to_vec(), 219 | }; 220 | payload.attachments.push(attachment); 221 | } 222 | _ => println!("not multipart"), 223 | } 224 | } 225 | } 226 | 227 | _ => println!("other {:#?}", parsed), 228 | } 229 | 230 | payload 231 | } 232 | 233 | static MAIN_WINDOW: OnceCell = OnceCell::new(); 234 | 235 | fn main() { 236 | tauri::Builder::default() 237 | .plugin(tauri_plugin_fs::init()) 238 | .plugin(tauri_plugin_shell::init()) 239 | .plugin(tauri_plugin_updater::Builder::new().build()) 240 | .plugin(tauri_plugin_http::init()) 241 | .plugin(tauri_plugin_store::Builder::new().build()) 242 | .setup(|app| { 243 | // how we make app to globaly access from other function 244 | let main_window = app.get_webview_window("main").unwrap(); 245 | let _ = MAIN_WINDOW.set(main_window); 246 | 247 | // build the menu 248 | let handle = app.handle(); 249 | let menu = MenuBuilder::new(handle) 250 | .copy() 251 | .cut() 252 | .separator() 253 | .paste() 254 | .build()?; 255 | 256 | app.set_menu(menu) // set the menu 257 | .expect("error while setting menu"); 258 | 259 | Ok(()) 260 | }) 261 | .plugin(tauri_plugin_store::Builder::default().build()) 262 | .invoke_handler(tauri::generate_handler![start_server, stop_server]) 263 | .run(tauri::generate_context!()) 264 | .expect("error while running tauri application"); 265 | } 266 | -------------------------------------------------------------------------------- /src/components/icons/Firefox.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tauri-apps/plugin-fs': 12 | specifier: ~2.2.0 13 | version: 2.2.0 14 | '@tauri-apps/plugin-http': 15 | specifier: ~2.2.0 16 | version: 2.2.0 17 | '@tauri-apps/plugin-shell': 18 | specifier: ~2.2.0 19 | version: 2.2.0 20 | '@tauri-apps/plugin-store': 21 | specifier: ~2.2.0 22 | version: 2.2.0 23 | '@tauri-apps/plugin-updater': 24 | specifier: ~2.3.0 25 | version: 2.3.0 26 | nanoid: 27 | specifier: ^5.0.9 28 | version: 5.0.9 29 | pinia: 30 | specifier: ^2.3.0 31 | version: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) 32 | vue: 33 | specifier: ^3.5.13 34 | version: 3.5.13(typescript@5.7.2) 35 | vue-router: 36 | specifier: ^4.5.0 37 | version: 4.5.0(vue@3.5.13(typescript@5.7.2)) 38 | devDependencies: 39 | '@tailwindcss/forms': 40 | specifier: ^0.5.9 41 | version: 0.5.9(tailwindcss@3.4.17) 42 | '@tauri-apps/api': 43 | specifier: ^2.1.1 44 | version: 2.1.1 45 | '@tauri-apps/cli': 46 | specifier: ^2.1.0 47 | version: 2.1.0 48 | '@vitejs/plugin-vue': 49 | specifier: ^5.2.1 50 | version: 5.2.1(vite@6.0.6(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@5.7.2)) 51 | autoprefixer: 52 | specifier: ^10.4.20 53 | version: 10.4.20(postcss@8.4.49) 54 | dayjs: 55 | specifier: ^1.11.13 56 | version: 1.11.13 57 | postcss: 58 | specifier: ^8.4.49 59 | version: 8.4.49 60 | tailwindcss: 61 | specifier: ^3.4.17 62 | version: 3.4.17 63 | typescript: 64 | specifier: ^5.7.2 65 | version: 5.7.2 66 | vite: 67 | specifier: ^6.0.6 68 | version: 6.0.6(jiti@1.21.7)(yaml@2.6.1) 69 | vue-tsc: 70 | specifier: ^2.2.0 71 | version: 2.2.0(typescript@5.7.2) 72 | 73 | packages: 74 | 75 | '@alloc/quick-lru@5.2.0': 76 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 77 | engines: {node: '>=10'} 78 | 79 | '@babel/helper-string-parser@7.25.9': 80 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@babel/helper-validator-identifier@7.25.9': 84 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 85 | engines: {node: '>=6.9.0'} 86 | 87 | '@babel/parser@7.26.3': 88 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 89 | engines: {node: '>=6.0.0'} 90 | hasBin: true 91 | 92 | '@babel/types@7.26.3': 93 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 94 | engines: {node: '>=6.9.0'} 95 | 96 | '@esbuild/aix-ppc64@0.24.2': 97 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 98 | engines: {node: '>=18'} 99 | cpu: [ppc64] 100 | os: [aix] 101 | 102 | '@esbuild/android-arm64@0.24.2': 103 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 104 | engines: {node: '>=18'} 105 | cpu: [arm64] 106 | os: [android] 107 | 108 | '@esbuild/android-arm@0.24.2': 109 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 110 | engines: {node: '>=18'} 111 | cpu: [arm] 112 | os: [android] 113 | 114 | '@esbuild/android-x64@0.24.2': 115 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 116 | engines: {node: '>=18'} 117 | cpu: [x64] 118 | os: [android] 119 | 120 | '@esbuild/darwin-arm64@0.24.2': 121 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 122 | engines: {node: '>=18'} 123 | cpu: [arm64] 124 | os: [darwin] 125 | 126 | '@esbuild/darwin-x64@0.24.2': 127 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 128 | engines: {node: '>=18'} 129 | cpu: [x64] 130 | os: [darwin] 131 | 132 | '@esbuild/freebsd-arm64@0.24.2': 133 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 134 | engines: {node: '>=18'} 135 | cpu: [arm64] 136 | os: [freebsd] 137 | 138 | '@esbuild/freebsd-x64@0.24.2': 139 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 140 | engines: {node: '>=18'} 141 | cpu: [x64] 142 | os: [freebsd] 143 | 144 | '@esbuild/linux-arm64@0.24.2': 145 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 146 | engines: {node: '>=18'} 147 | cpu: [arm64] 148 | os: [linux] 149 | 150 | '@esbuild/linux-arm@0.24.2': 151 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 152 | engines: {node: '>=18'} 153 | cpu: [arm] 154 | os: [linux] 155 | 156 | '@esbuild/linux-ia32@0.24.2': 157 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 158 | engines: {node: '>=18'} 159 | cpu: [ia32] 160 | os: [linux] 161 | 162 | '@esbuild/linux-loong64@0.24.2': 163 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 164 | engines: {node: '>=18'} 165 | cpu: [loong64] 166 | os: [linux] 167 | 168 | '@esbuild/linux-mips64el@0.24.2': 169 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 170 | engines: {node: '>=18'} 171 | cpu: [mips64el] 172 | os: [linux] 173 | 174 | '@esbuild/linux-ppc64@0.24.2': 175 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 176 | engines: {node: '>=18'} 177 | cpu: [ppc64] 178 | os: [linux] 179 | 180 | '@esbuild/linux-riscv64@0.24.2': 181 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 182 | engines: {node: '>=18'} 183 | cpu: [riscv64] 184 | os: [linux] 185 | 186 | '@esbuild/linux-s390x@0.24.2': 187 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 188 | engines: {node: '>=18'} 189 | cpu: [s390x] 190 | os: [linux] 191 | 192 | '@esbuild/linux-x64@0.24.2': 193 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 194 | engines: {node: '>=18'} 195 | cpu: [x64] 196 | os: [linux] 197 | 198 | '@esbuild/netbsd-arm64@0.24.2': 199 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 200 | engines: {node: '>=18'} 201 | cpu: [arm64] 202 | os: [netbsd] 203 | 204 | '@esbuild/netbsd-x64@0.24.2': 205 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 206 | engines: {node: '>=18'} 207 | cpu: [x64] 208 | os: [netbsd] 209 | 210 | '@esbuild/openbsd-arm64@0.24.2': 211 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 212 | engines: {node: '>=18'} 213 | cpu: [arm64] 214 | os: [openbsd] 215 | 216 | '@esbuild/openbsd-x64@0.24.2': 217 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 218 | engines: {node: '>=18'} 219 | cpu: [x64] 220 | os: [openbsd] 221 | 222 | '@esbuild/sunos-x64@0.24.2': 223 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 224 | engines: {node: '>=18'} 225 | cpu: [x64] 226 | os: [sunos] 227 | 228 | '@esbuild/win32-arm64@0.24.2': 229 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 230 | engines: {node: '>=18'} 231 | cpu: [arm64] 232 | os: [win32] 233 | 234 | '@esbuild/win32-ia32@0.24.2': 235 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 236 | engines: {node: '>=18'} 237 | cpu: [ia32] 238 | os: [win32] 239 | 240 | '@esbuild/win32-x64@0.24.2': 241 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 242 | engines: {node: '>=18'} 243 | cpu: [x64] 244 | os: [win32] 245 | 246 | '@isaacs/cliui@8.0.2': 247 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 248 | engines: {node: '>=12'} 249 | 250 | '@jridgewell/gen-mapping@0.3.8': 251 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 252 | engines: {node: '>=6.0.0'} 253 | 254 | '@jridgewell/resolve-uri@3.1.2': 255 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 256 | engines: {node: '>=6.0.0'} 257 | 258 | '@jridgewell/set-array@1.2.1': 259 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 260 | engines: {node: '>=6.0.0'} 261 | 262 | '@jridgewell/sourcemap-codec@1.5.0': 263 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 264 | 265 | '@jridgewell/trace-mapping@0.3.25': 266 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 267 | 268 | '@nodelib/fs.scandir@2.1.5': 269 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 270 | engines: {node: '>= 8'} 271 | 272 | '@nodelib/fs.stat@2.0.5': 273 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 274 | engines: {node: '>= 8'} 275 | 276 | '@nodelib/fs.walk@1.2.8': 277 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 278 | engines: {node: '>= 8'} 279 | 280 | '@pkgjs/parseargs@0.11.0': 281 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 282 | engines: {node: '>=14'} 283 | 284 | '@rollup/rollup-android-arm-eabi@4.29.1': 285 | resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} 286 | cpu: [arm] 287 | os: [android] 288 | 289 | '@rollup/rollup-android-arm64@4.29.1': 290 | resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} 291 | cpu: [arm64] 292 | os: [android] 293 | 294 | '@rollup/rollup-darwin-arm64@4.29.1': 295 | resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} 296 | cpu: [arm64] 297 | os: [darwin] 298 | 299 | '@rollup/rollup-darwin-x64@4.29.1': 300 | resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} 301 | cpu: [x64] 302 | os: [darwin] 303 | 304 | '@rollup/rollup-freebsd-arm64@4.29.1': 305 | resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} 306 | cpu: [arm64] 307 | os: [freebsd] 308 | 309 | '@rollup/rollup-freebsd-x64@4.29.1': 310 | resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} 311 | cpu: [x64] 312 | os: [freebsd] 313 | 314 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 315 | resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} 316 | cpu: [arm] 317 | os: [linux] 318 | 319 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 320 | resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} 321 | cpu: [arm] 322 | os: [linux] 323 | 324 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 325 | resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} 326 | cpu: [arm64] 327 | os: [linux] 328 | 329 | '@rollup/rollup-linux-arm64-musl@4.29.1': 330 | resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} 331 | cpu: [arm64] 332 | os: [linux] 333 | 334 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 335 | resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} 336 | cpu: [loong64] 337 | os: [linux] 338 | 339 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 340 | resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} 341 | cpu: [ppc64] 342 | os: [linux] 343 | 344 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 345 | resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} 346 | cpu: [riscv64] 347 | os: [linux] 348 | 349 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 350 | resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} 351 | cpu: [s390x] 352 | os: [linux] 353 | 354 | '@rollup/rollup-linux-x64-gnu@4.29.1': 355 | resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} 356 | cpu: [x64] 357 | os: [linux] 358 | 359 | '@rollup/rollup-linux-x64-musl@4.29.1': 360 | resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} 361 | cpu: [x64] 362 | os: [linux] 363 | 364 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 365 | resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} 366 | cpu: [arm64] 367 | os: [win32] 368 | 369 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 370 | resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} 371 | cpu: [ia32] 372 | os: [win32] 373 | 374 | '@rollup/rollup-win32-x64-msvc@4.29.1': 375 | resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} 376 | cpu: [x64] 377 | os: [win32] 378 | 379 | '@tailwindcss/forms@0.5.9': 380 | resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==} 381 | peerDependencies: 382 | tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20' 383 | 384 | '@tauri-apps/api@2.1.1': 385 | resolution: {integrity: sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==} 386 | 387 | '@tauri-apps/cli-darwin-arm64@2.1.0': 388 | resolution: {integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==} 389 | engines: {node: '>= 10'} 390 | cpu: [arm64] 391 | os: [darwin] 392 | 393 | '@tauri-apps/cli-darwin-x64@2.1.0': 394 | resolution: {integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==} 395 | engines: {node: '>= 10'} 396 | cpu: [x64] 397 | os: [darwin] 398 | 399 | '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': 400 | resolution: {integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==} 401 | engines: {node: '>= 10'} 402 | cpu: [arm] 403 | os: [linux] 404 | 405 | '@tauri-apps/cli-linux-arm64-gnu@2.1.0': 406 | resolution: {integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==} 407 | engines: {node: '>= 10'} 408 | cpu: [arm64] 409 | os: [linux] 410 | 411 | '@tauri-apps/cli-linux-arm64-musl@2.1.0': 412 | resolution: {integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==} 413 | engines: {node: '>= 10'} 414 | cpu: [arm64] 415 | os: [linux] 416 | 417 | '@tauri-apps/cli-linux-x64-gnu@2.1.0': 418 | resolution: {integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==} 419 | engines: {node: '>= 10'} 420 | cpu: [x64] 421 | os: [linux] 422 | 423 | '@tauri-apps/cli-linux-x64-musl@2.1.0': 424 | resolution: {integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==} 425 | engines: {node: '>= 10'} 426 | cpu: [x64] 427 | os: [linux] 428 | 429 | '@tauri-apps/cli-win32-arm64-msvc@2.1.0': 430 | resolution: {integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==} 431 | engines: {node: '>= 10'} 432 | cpu: [arm64] 433 | os: [win32] 434 | 435 | '@tauri-apps/cli-win32-ia32-msvc@2.1.0': 436 | resolution: {integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==} 437 | engines: {node: '>= 10'} 438 | cpu: [ia32] 439 | os: [win32] 440 | 441 | '@tauri-apps/cli-win32-x64-msvc@2.1.0': 442 | resolution: {integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==} 443 | engines: {node: '>= 10'} 444 | cpu: [x64] 445 | os: [win32] 446 | 447 | '@tauri-apps/cli@2.1.0': 448 | resolution: {integrity: sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==} 449 | engines: {node: '>= 10'} 450 | hasBin: true 451 | 452 | '@tauri-apps/plugin-fs@2.2.0': 453 | resolution: {integrity: sha512-+08mApuONKI8/sCNEZ6AR8vf5vI9DXD4YfrQ9NQmhRxYKMLVhRW164vdW5BSLmMpuevftpQ2FVoL9EFkfG9Z+g==} 454 | 455 | '@tauri-apps/plugin-http@2.2.0': 456 | resolution: {integrity: sha512-ZY6sIHhgu8hcu6BkkegoiOEbvOsQFSVcK8J7l+g9RNHrkhl5uzpNIytR4R/H50fj7gyG80DJvrXDx/LBo7Easw==} 457 | 458 | '@tauri-apps/plugin-shell@2.2.0': 459 | resolution: {integrity: sha512-iC3Ic1hLmasoboG7BO+7p+AriSoqAwKrIk+Hpk+S/bjTQdXqbl2GbdclghI4gM32X0bls7xHzIFqhRdrlvJeaA==} 460 | 461 | '@tauri-apps/plugin-store@2.2.0': 462 | resolution: {integrity: sha512-hJTRtuJis4w5fW1dkcgftsYxKXK0+DbAqurZ3CURHG5WkAyyZgbxpeYctw12bbzF9ZbZREXZklPq8mocCC3Sgg==} 463 | 464 | '@tauri-apps/plugin-updater@2.3.0': 465 | resolution: {integrity: sha512-qdzyZEUN69FZQ/nRx51fBub10tT6wffJl3DLVo9q922Gvw8Wk++rZhoD9eethPlZYbog/7RGgT8JkrfLh5BKAg==} 466 | 467 | '@types/estree@1.0.6': 468 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 469 | 470 | '@vitejs/plugin-vue@5.2.1': 471 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 472 | engines: {node: ^18.0.0 || >=20.0.0} 473 | peerDependencies: 474 | vite: ^5.0.0 || ^6.0.0 475 | vue: ^3.2.25 476 | 477 | '@volar/language-core@2.4.11': 478 | resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} 479 | 480 | '@volar/source-map@2.4.11': 481 | resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} 482 | 483 | '@volar/typescript@2.4.11': 484 | resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} 485 | 486 | '@vue/compiler-core@3.5.13': 487 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 488 | 489 | '@vue/compiler-dom@3.5.13': 490 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 491 | 492 | '@vue/compiler-sfc@3.5.13': 493 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 494 | 495 | '@vue/compiler-ssr@3.5.13': 496 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 497 | 498 | '@vue/compiler-vue2@2.7.16': 499 | resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} 500 | 501 | '@vue/devtools-api@6.6.4': 502 | resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} 503 | 504 | '@vue/language-core@2.2.0': 505 | resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} 506 | peerDependencies: 507 | typescript: '*' 508 | peerDependenciesMeta: 509 | typescript: 510 | optional: true 511 | 512 | '@vue/reactivity@3.5.13': 513 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 514 | 515 | '@vue/runtime-core@3.5.13': 516 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 517 | 518 | '@vue/runtime-dom@3.5.13': 519 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 520 | 521 | '@vue/server-renderer@3.5.13': 522 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 523 | peerDependencies: 524 | vue: 3.5.13 525 | 526 | '@vue/shared@3.5.13': 527 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 528 | 529 | alien-signals@0.4.11: 530 | resolution: {integrity: sha512-79GUbcQM5K2zb+HyUMODTgJdVjZWwybDNQRduqP9ks7XZvJylm9uWesOjVcu6/veWsa+XNGVE4xVQ8+RGu8HaA==} 531 | 532 | ansi-regex@5.0.1: 533 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 534 | engines: {node: '>=8'} 535 | 536 | ansi-regex@6.1.0: 537 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 538 | engines: {node: '>=12'} 539 | 540 | ansi-styles@4.3.0: 541 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 542 | engines: {node: '>=8'} 543 | 544 | ansi-styles@6.2.1: 545 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 546 | engines: {node: '>=12'} 547 | 548 | any-promise@1.3.0: 549 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 550 | 551 | anymatch@3.1.3: 552 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 553 | engines: {node: '>= 8'} 554 | 555 | arg@5.0.2: 556 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 557 | 558 | autoprefixer@10.4.20: 559 | resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} 560 | engines: {node: ^10 || ^12 || >=14} 561 | hasBin: true 562 | peerDependencies: 563 | postcss: ^8.1.0 564 | 565 | balanced-match@1.0.2: 566 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 567 | 568 | binary-extensions@2.3.0: 569 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 570 | engines: {node: '>=8'} 571 | 572 | brace-expansion@2.0.1: 573 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 574 | 575 | braces@3.0.3: 576 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 577 | engines: {node: '>=8'} 578 | 579 | browserslist@4.24.3: 580 | resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} 581 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 582 | hasBin: true 583 | 584 | camelcase-css@2.0.1: 585 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 586 | engines: {node: '>= 6'} 587 | 588 | caniuse-lite@1.0.30001690: 589 | resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} 590 | 591 | chokidar@3.6.0: 592 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 593 | engines: {node: '>= 8.10.0'} 594 | 595 | color-convert@2.0.1: 596 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 597 | engines: {node: '>=7.0.0'} 598 | 599 | color-name@1.1.4: 600 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 601 | 602 | commander@4.1.1: 603 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 604 | engines: {node: '>= 6'} 605 | 606 | cross-spawn@7.0.6: 607 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 608 | engines: {node: '>= 8'} 609 | 610 | cssesc@3.0.0: 611 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 612 | engines: {node: '>=4'} 613 | hasBin: true 614 | 615 | csstype@3.1.3: 616 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 617 | 618 | dayjs@1.11.13: 619 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 620 | 621 | de-indent@1.0.2: 622 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 623 | 624 | didyoumean@1.2.2: 625 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 626 | 627 | dlv@1.1.3: 628 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 629 | 630 | eastasianwidth@0.2.0: 631 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 632 | 633 | electron-to-chromium@1.5.76: 634 | resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} 635 | 636 | emoji-regex@8.0.0: 637 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 638 | 639 | emoji-regex@9.2.2: 640 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 641 | 642 | entities@4.5.0: 643 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 644 | engines: {node: '>=0.12'} 645 | 646 | esbuild@0.24.2: 647 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 648 | engines: {node: '>=18'} 649 | hasBin: true 650 | 651 | escalade@3.2.0: 652 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 653 | engines: {node: '>=6'} 654 | 655 | estree-walker@2.0.2: 656 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 657 | 658 | fast-glob@3.3.2: 659 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 660 | engines: {node: '>=8.6.0'} 661 | 662 | fastq@1.18.0: 663 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 664 | 665 | fill-range@7.1.1: 666 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 667 | engines: {node: '>=8'} 668 | 669 | foreground-child@3.3.0: 670 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 671 | engines: {node: '>=14'} 672 | 673 | fraction.js@4.3.7: 674 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 675 | 676 | fsevents@2.3.3: 677 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 678 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 679 | os: [darwin] 680 | 681 | function-bind@1.1.2: 682 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 683 | 684 | glob-parent@5.1.2: 685 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 686 | engines: {node: '>= 6'} 687 | 688 | glob-parent@6.0.2: 689 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 690 | engines: {node: '>=10.13.0'} 691 | 692 | glob@10.4.5: 693 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 694 | hasBin: true 695 | 696 | hasown@2.0.2: 697 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 698 | engines: {node: '>= 0.4'} 699 | 700 | he@1.2.0: 701 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 702 | hasBin: true 703 | 704 | is-binary-path@2.1.0: 705 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 706 | engines: {node: '>=8'} 707 | 708 | is-core-module@2.16.1: 709 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 710 | engines: {node: '>= 0.4'} 711 | 712 | is-extglob@2.1.1: 713 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 714 | engines: {node: '>=0.10.0'} 715 | 716 | is-fullwidth-code-point@3.0.0: 717 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 718 | engines: {node: '>=8'} 719 | 720 | is-glob@4.0.3: 721 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 722 | engines: {node: '>=0.10.0'} 723 | 724 | is-number@7.0.0: 725 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 726 | engines: {node: '>=0.12.0'} 727 | 728 | isexe@2.0.0: 729 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 730 | 731 | jackspeak@3.4.3: 732 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 733 | 734 | jiti@1.21.7: 735 | resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} 736 | hasBin: true 737 | 738 | lilconfig@3.1.3: 739 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 740 | engines: {node: '>=14'} 741 | 742 | lines-and-columns@1.2.4: 743 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 744 | 745 | lru-cache@10.4.3: 746 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 747 | 748 | magic-string@0.30.17: 749 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 750 | 751 | merge2@1.4.1: 752 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 753 | engines: {node: '>= 8'} 754 | 755 | micromatch@4.0.8: 756 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 757 | engines: {node: '>=8.6'} 758 | 759 | mini-svg-data-uri@1.4.4: 760 | resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 761 | hasBin: true 762 | 763 | minimatch@9.0.5: 764 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 765 | engines: {node: '>=16 || 14 >=14.17'} 766 | 767 | minipass@7.1.2: 768 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 769 | engines: {node: '>=16 || 14 >=14.17'} 770 | 771 | muggle-string@0.4.1: 772 | resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 773 | 774 | mz@2.7.0: 775 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 776 | 777 | nanoid@3.3.8: 778 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 779 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 780 | hasBin: true 781 | 782 | nanoid@5.0.9: 783 | resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} 784 | engines: {node: ^18 || >=20} 785 | hasBin: true 786 | 787 | node-releases@2.0.19: 788 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 789 | 790 | normalize-path@3.0.0: 791 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 792 | engines: {node: '>=0.10.0'} 793 | 794 | normalize-range@0.1.2: 795 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 796 | engines: {node: '>=0.10.0'} 797 | 798 | object-assign@4.1.1: 799 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 800 | engines: {node: '>=0.10.0'} 801 | 802 | object-hash@3.0.0: 803 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 804 | engines: {node: '>= 6'} 805 | 806 | package-json-from-dist@1.0.1: 807 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 808 | 809 | path-browserify@1.0.1: 810 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 811 | 812 | path-key@3.1.1: 813 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 814 | engines: {node: '>=8'} 815 | 816 | path-parse@1.0.7: 817 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 818 | 819 | path-scurry@1.11.1: 820 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 821 | engines: {node: '>=16 || 14 >=14.18'} 822 | 823 | picocolors@1.1.1: 824 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 825 | 826 | picomatch@2.3.1: 827 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 828 | engines: {node: '>=8.6'} 829 | 830 | pify@2.3.0: 831 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 832 | engines: {node: '>=0.10.0'} 833 | 834 | pinia@2.3.0: 835 | resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==} 836 | peerDependencies: 837 | typescript: '>=4.4.4' 838 | vue: ^2.7.0 || ^3.5.11 839 | peerDependenciesMeta: 840 | typescript: 841 | optional: true 842 | 843 | pirates@4.0.6: 844 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 845 | engines: {node: '>= 6'} 846 | 847 | postcss-import@15.1.0: 848 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 849 | engines: {node: '>=14.0.0'} 850 | peerDependencies: 851 | postcss: ^8.0.0 852 | 853 | postcss-js@4.0.1: 854 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 855 | engines: {node: ^12 || ^14 || >= 16} 856 | peerDependencies: 857 | postcss: ^8.4.21 858 | 859 | postcss-load-config@4.0.2: 860 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 861 | engines: {node: '>= 14'} 862 | peerDependencies: 863 | postcss: '>=8.0.9' 864 | ts-node: '>=9.0.0' 865 | peerDependenciesMeta: 866 | postcss: 867 | optional: true 868 | ts-node: 869 | optional: true 870 | 871 | postcss-nested@6.2.0: 872 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 873 | engines: {node: '>=12.0'} 874 | peerDependencies: 875 | postcss: ^8.2.14 876 | 877 | postcss-selector-parser@6.1.2: 878 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 879 | engines: {node: '>=4'} 880 | 881 | postcss-value-parser@4.2.0: 882 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 883 | 884 | postcss@8.4.49: 885 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 886 | engines: {node: ^10 || ^12 || >=14} 887 | 888 | queue-microtask@1.2.3: 889 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 890 | 891 | read-cache@1.0.0: 892 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 893 | 894 | readdirp@3.6.0: 895 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 896 | engines: {node: '>=8.10.0'} 897 | 898 | resolve@1.22.10: 899 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 900 | engines: {node: '>= 0.4'} 901 | hasBin: true 902 | 903 | reusify@1.0.4: 904 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 905 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 906 | 907 | rollup@4.29.1: 908 | resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} 909 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 910 | hasBin: true 911 | 912 | run-parallel@1.2.0: 913 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 914 | 915 | shebang-command@2.0.0: 916 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 917 | engines: {node: '>=8'} 918 | 919 | shebang-regex@3.0.0: 920 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 921 | engines: {node: '>=8'} 922 | 923 | signal-exit@4.1.0: 924 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 925 | engines: {node: '>=14'} 926 | 927 | source-map-js@1.2.1: 928 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 929 | engines: {node: '>=0.10.0'} 930 | 931 | string-width@4.2.3: 932 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 933 | engines: {node: '>=8'} 934 | 935 | string-width@5.1.2: 936 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 937 | engines: {node: '>=12'} 938 | 939 | strip-ansi@6.0.1: 940 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 941 | engines: {node: '>=8'} 942 | 943 | strip-ansi@7.1.0: 944 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 945 | engines: {node: '>=12'} 946 | 947 | sucrase@3.35.0: 948 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 949 | engines: {node: '>=16 || 14 >=14.17'} 950 | hasBin: true 951 | 952 | supports-preserve-symlinks-flag@1.0.0: 953 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 954 | engines: {node: '>= 0.4'} 955 | 956 | tailwindcss@3.4.17: 957 | resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} 958 | engines: {node: '>=14.0.0'} 959 | hasBin: true 960 | 961 | thenify-all@1.6.0: 962 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 963 | engines: {node: '>=0.8'} 964 | 965 | thenify@3.3.1: 966 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 967 | 968 | to-regex-range@5.0.1: 969 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 970 | engines: {node: '>=8.0'} 971 | 972 | ts-interface-checker@0.1.13: 973 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 974 | 975 | typescript@5.7.2: 976 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 977 | engines: {node: '>=14.17'} 978 | hasBin: true 979 | 980 | update-browserslist-db@1.1.1: 981 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 982 | hasBin: true 983 | peerDependencies: 984 | browserslist: '>= 4.21.0' 985 | 986 | util-deprecate@1.0.2: 987 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 988 | 989 | vite@6.0.6: 990 | resolution: {integrity: sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==} 991 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 992 | hasBin: true 993 | peerDependencies: 994 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 995 | jiti: '>=1.21.0' 996 | less: '*' 997 | lightningcss: ^1.21.0 998 | sass: '*' 999 | sass-embedded: '*' 1000 | stylus: '*' 1001 | sugarss: '*' 1002 | terser: ^5.16.0 1003 | tsx: ^4.8.1 1004 | yaml: ^2.4.2 1005 | peerDependenciesMeta: 1006 | '@types/node': 1007 | optional: true 1008 | jiti: 1009 | optional: true 1010 | less: 1011 | optional: true 1012 | lightningcss: 1013 | optional: true 1014 | sass: 1015 | optional: true 1016 | sass-embedded: 1017 | optional: true 1018 | stylus: 1019 | optional: true 1020 | sugarss: 1021 | optional: true 1022 | terser: 1023 | optional: true 1024 | tsx: 1025 | optional: true 1026 | yaml: 1027 | optional: true 1028 | 1029 | vscode-uri@3.0.8: 1030 | resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} 1031 | 1032 | vue-demi@0.14.10: 1033 | resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 1034 | engines: {node: '>=12'} 1035 | hasBin: true 1036 | peerDependencies: 1037 | '@vue/composition-api': ^1.0.0-rc.1 1038 | vue: ^3.0.0-0 || ^2.6.0 1039 | peerDependenciesMeta: 1040 | '@vue/composition-api': 1041 | optional: true 1042 | 1043 | vue-router@4.5.0: 1044 | resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} 1045 | peerDependencies: 1046 | vue: ^3.2.0 1047 | 1048 | vue-tsc@2.2.0: 1049 | resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} 1050 | hasBin: true 1051 | peerDependencies: 1052 | typescript: '>=5.0.0' 1053 | 1054 | vue@3.5.13: 1055 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 1056 | peerDependencies: 1057 | typescript: '*' 1058 | peerDependenciesMeta: 1059 | typescript: 1060 | optional: true 1061 | 1062 | which@2.0.2: 1063 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1064 | engines: {node: '>= 8'} 1065 | hasBin: true 1066 | 1067 | wrap-ansi@7.0.0: 1068 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1069 | engines: {node: '>=10'} 1070 | 1071 | wrap-ansi@8.1.0: 1072 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1073 | engines: {node: '>=12'} 1074 | 1075 | yaml@2.6.1: 1076 | resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} 1077 | engines: {node: '>= 14'} 1078 | hasBin: true 1079 | 1080 | snapshots: 1081 | 1082 | '@alloc/quick-lru@5.2.0': {} 1083 | 1084 | '@babel/helper-string-parser@7.25.9': {} 1085 | 1086 | '@babel/helper-validator-identifier@7.25.9': {} 1087 | 1088 | '@babel/parser@7.26.3': 1089 | dependencies: 1090 | '@babel/types': 7.26.3 1091 | 1092 | '@babel/types@7.26.3': 1093 | dependencies: 1094 | '@babel/helper-string-parser': 7.25.9 1095 | '@babel/helper-validator-identifier': 7.25.9 1096 | 1097 | '@esbuild/aix-ppc64@0.24.2': 1098 | optional: true 1099 | 1100 | '@esbuild/android-arm64@0.24.2': 1101 | optional: true 1102 | 1103 | '@esbuild/android-arm@0.24.2': 1104 | optional: true 1105 | 1106 | '@esbuild/android-x64@0.24.2': 1107 | optional: true 1108 | 1109 | '@esbuild/darwin-arm64@0.24.2': 1110 | optional: true 1111 | 1112 | '@esbuild/darwin-x64@0.24.2': 1113 | optional: true 1114 | 1115 | '@esbuild/freebsd-arm64@0.24.2': 1116 | optional: true 1117 | 1118 | '@esbuild/freebsd-x64@0.24.2': 1119 | optional: true 1120 | 1121 | '@esbuild/linux-arm64@0.24.2': 1122 | optional: true 1123 | 1124 | '@esbuild/linux-arm@0.24.2': 1125 | optional: true 1126 | 1127 | '@esbuild/linux-ia32@0.24.2': 1128 | optional: true 1129 | 1130 | '@esbuild/linux-loong64@0.24.2': 1131 | optional: true 1132 | 1133 | '@esbuild/linux-mips64el@0.24.2': 1134 | optional: true 1135 | 1136 | '@esbuild/linux-ppc64@0.24.2': 1137 | optional: true 1138 | 1139 | '@esbuild/linux-riscv64@0.24.2': 1140 | optional: true 1141 | 1142 | '@esbuild/linux-s390x@0.24.2': 1143 | optional: true 1144 | 1145 | '@esbuild/linux-x64@0.24.2': 1146 | optional: true 1147 | 1148 | '@esbuild/netbsd-arm64@0.24.2': 1149 | optional: true 1150 | 1151 | '@esbuild/netbsd-x64@0.24.2': 1152 | optional: true 1153 | 1154 | '@esbuild/openbsd-arm64@0.24.2': 1155 | optional: true 1156 | 1157 | '@esbuild/openbsd-x64@0.24.2': 1158 | optional: true 1159 | 1160 | '@esbuild/sunos-x64@0.24.2': 1161 | optional: true 1162 | 1163 | '@esbuild/win32-arm64@0.24.2': 1164 | optional: true 1165 | 1166 | '@esbuild/win32-ia32@0.24.2': 1167 | optional: true 1168 | 1169 | '@esbuild/win32-x64@0.24.2': 1170 | optional: true 1171 | 1172 | '@isaacs/cliui@8.0.2': 1173 | dependencies: 1174 | string-width: 5.1.2 1175 | string-width-cjs: string-width@4.2.3 1176 | strip-ansi: 7.1.0 1177 | strip-ansi-cjs: strip-ansi@6.0.1 1178 | wrap-ansi: 8.1.0 1179 | wrap-ansi-cjs: wrap-ansi@7.0.0 1180 | 1181 | '@jridgewell/gen-mapping@0.3.8': 1182 | dependencies: 1183 | '@jridgewell/set-array': 1.2.1 1184 | '@jridgewell/sourcemap-codec': 1.5.0 1185 | '@jridgewell/trace-mapping': 0.3.25 1186 | 1187 | '@jridgewell/resolve-uri@3.1.2': {} 1188 | 1189 | '@jridgewell/set-array@1.2.1': {} 1190 | 1191 | '@jridgewell/sourcemap-codec@1.5.0': {} 1192 | 1193 | '@jridgewell/trace-mapping@0.3.25': 1194 | dependencies: 1195 | '@jridgewell/resolve-uri': 3.1.2 1196 | '@jridgewell/sourcemap-codec': 1.5.0 1197 | 1198 | '@nodelib/fs.scandir@2.1.5': 1199 | dependencies: 1200 | '@nodelib/fs.stat': 2.0.5 1201 | run-parallel: 1.2.0 1202 | 1203 | '@nodelib/fs.stat@2.0.5': {} 1204 | 1205 | '@nodelib/fs.walk@1.2.8': 1206 | dependencies: 1207 | '@nodelib/fs.scandir': 2.1.5 1208 | fastq: 1.18.0 1209 | 1210 | '@pkgjs/parseargs@0.11.0': 1211 | optional: true 1212 | 1213 | '@rollup/rollup-android-arm-eabi@4.29.1': 1214 | optional: true 1215 | 1216 | '@rollup/rollup-android-arm64@4.29.1': 1217 | optional: true 1218 | 1219 | '@rollup/rollup-darwin-arm64@4.29.1': 1220 | optional: true 1221 | 1222 | '@rollup/rollup-darwin-x64@4.29.1': 1223 | optional: true 1224 | 1225 | '@rollup/rollup-freebsd-arm64@4.29.1': 1226 | optional: true 1227 | 1228 | '@rollup/rollup-freebsd-x64@4.29.1': 1229 | optional: true 1230 | 1231 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 1232 | optional: true 1233 | 1234 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 1235 | optional: true 1236 | 1237 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 1238 | optional: true 1239 | 1240 | '@rollup/rollup-linux-arm64-musl@4.29.1': 1241 | optional: true 1242 | 1243 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 1244 | optional: true 1245 | 1246 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 1247 | optional: true 1248 | 1249 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 1250 | optional: true 1251 | 1252 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 1253 | optional: true 1254 | 1255 | '@rollup/rollup-linux-x64-gnu@4.29.1': 1256 | optional: true 1257 | 1258 | '@rollup/rollup-linux-x64-musl@4.29.1': 1259 | optional: true 1260 | 1261 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 1262 | optional: true 1263 | 1264 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 1265 | optional: true 1266 | 1267 | '@rollup/rollup-win32-x64-msvc@4.29.1': 1268 | optional: true 1269 | 1270 | '@tailwindcss/forms@0.5.9(tailwindcss@3.4.17)': 1271 | dependencies: 1272 | mini-svg-data-uri: 1.4.4 1273 | tailwindcss: 3.4.17 1274 | 1275 | '@tauri-apps/api@2.1.1': {} 1276 | 1277 | '@tauri-apps/cli-darwin-arm64@2.1.0': 1278 | optional: true 1279 | 1280 | '@tauri-apps/cli-darwin-x64@2.1.0': 1281 | optional: true 1282 | 1283 | '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': 1284 | optional: true 1285 | 1286 | '@tauri-apps/cli-linux-arm64-gnu@2.1.0': 1287 | optional: true 1288 | 1289 | '@tauri-apps/cli-linux-arm64-musl@2.1.0': 1290 | optional: true 1291 | 1292 | '@tauri-apps/cli-linux-x64-gnu@2.1.0': 1293 | optional: true 1294 | 1295 | '@tauri-apps/cli-linux-x64-musl@2.1.0': 1296 | optional: true 1297 | 1298 | '@tauri-apps/cli-win32-arm64-msvc@2.1.0': 1299 | optional: true 1300 | 1301 | '@tauri-apps/cli-win32-ia32-msvc@2.1.0': 1302 | optional: true 1303 | 1304 | '@tauri-apps/cli-win32-x64-msvc@2.1.0': 1305 | optional: true 1306 | 1307 | '@tauri-apps/cli@2.1.0': 1308 | optionalDependencies: 1309 | '@tauri-apps/cli-darwin-arm64': 2.1.0 1310 | '@tauri-apps/cli-darwin-x64': 2.1.0 1311 | '@tauri-apps/cli-linux-arm-gnueabihf': 2.1.0 1312 | '@tauri-apps/cli-linux-arm64-gnu': 2.1.0 1313 | '@tauri-apps/cli-linux-arm64-musl': 2.1.0 1314 | '@tauri-apps/cli-linux-x64-gnu': 2.1.0 1315 | '@tauri-apps/cli-linux-x64-musl': 2.1.0 1316 | '@tauri-apps/cli-win32-arm64-msvc': 2.1.0 1317 | '@tauri-apps/cli-win32-ia32-msvc': 2.1.0 1318 | '@tauri-apps/cli-win32-x64-msvc': 2.1.0 1319 | 1320 | '@tauri-apps/plugin-fs@2.2.0': 1321 | dependencies: 1322 | '@tauri-apps/api': 2.1.1 1323 | 1324 | '@tauri-apps/plugin-http@2.2.0': 1325 | dependencies: 1326 | '@tauri-apps/api': 2.1.1 1327 | 1328 | '@tauri-apps/plugin-shell@2.2.0': 1329 | dependencies: 1330 | '@tauri-apps/api': 2.1.1 1331 | 1332 | '@tauri-apps/plugin-store@2.2.0': 1333 | dependencies: 1334 | '@tauri-apps/api': 2.1.1 1335 | 1336 | '@tauri-apps/plugin-updater@2.3.0': 1337 | dependencies: 1338 | '@tauri-apps/api': 2.1.1 1339 | 1340 | '@types/estree@1.0.6': {} 1341 | 1342 | '@vitejs/plugin-vue@5.2.1(vite@6.0.6(jiti@1.21.7)(yaml@2.6.1))(vue@3.5.13(typescript@5.7.2))': 1343 | dependencies: 1344 | vite: 6.0.6(jiti@1.21.7)(yaml@2.6.1) 1345 | vue: 3.5.13(typescript@5.7.2) 1346 | 1347 | '@volar/language-core@2.4.11': 1348 | dependencies: 1349 | '@volar/source-map': 2.4.11 1350 | 1351 | '@volar/source-map@2.4.11': {} 1352 | 1353 | '@volar/typescript@2.4.11': 1354 | dependencies: 1355 | '@volar/language-core': 2.4.11 1356 | path-browserify: 1.0.1 1357 | vscode-uri: 3.0.8 1358 | 1359 | '@vue/compiler-core@3.5.13': 1360 | dependencies: 1361 | '@babel/parser': 7.26.3 1362 | '@vue/shared': 3.5.13 1363 | entities: 4.5.0 1364 | estree-walker: 2.0.2 1365 | source-map-js: 1.2.1 1366 | 1367 | '@vue/compiler-dom@3.5.13': 1368 | dependencies: 1369 | '@vue/compiler-core': 3.5.13 1370 | '@vue/shared': 3.5.13 1371 | 1372 | '@vue/compiler-sfc@3.5.13': 1373 | dependencies: 1374 | '@babel/parser': 7.26.3 1375 | '@vue/compiler-core': 3.5.13 1376 | '@vue/compiler-dom': 3.5.13 1377 | '@vue/compiler-ssr': 3.5.13 1378 | '@vue/shared': 3.5.13 1379 | estree-walker: 2.0.2 1380 | magic-string: 0.30.17 1381 | postcss: 8.4.49 1382 | source-map-js: 1.2.1 1383 | 1384 | '@vue/compiler-ssr@3.5.13': 1385 | dependencies: 1386 | '@vue/compiler-dom': 3.5.13 1387 | '@vue/shared': 3.5.13 1388 | 1389 | '@vue/compiler-vue2@2.7.16': 1390 | dependencies: 1391 | de-indent: 1.0.2 1392 | he: 1.2.0 1393 | 1394 | '@vue/devtools-api@6.6.4': {} 1395 | 1396 | '@vue/language-core@2.2.0(typescript@5.7.2)': 1397 | dependencies: 1398 | '@volar/language-core': 2.4.11 1399 | '@vue/compiler-dom': 3.5.13 1400 | '@vue/compiler-vue2': 2.7.16 1401 | '@vue/shared': 3.5.13 1402 | alien-signals: 0.4.11 1403 | minimatch: 9.0.5 1404 | muggle-string: 0.4.1 1405 | path-browserify: 1.0.1 1406 | optionalDependencies: 1407 | typescript: 5.7.2 1408 | 1409 | '@vue/reactivity@3.5.13': 1410 | dependencies: 1411 | '@vue/shared': 3.5.13 1412 | 1413 | '@vue/runtime-core@3.5.13': 1414 | dependencies: 1415 | '@vue/reactivity': 3.5.13 1416 | '@vue/shared': 3.5.13 1417 | 1418 | '@vue/runtime-dom@3.5.13': 1419 | dependencies: 1420 | '@vue/reactivity': 3.5.13 1421 | '@vue/runtime-core': 3.5.13 1422 | '@vue/shared': 3.5.13 1423 | csstype: 3.1.3 1424 | 1425 | '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': 1426 | dependencies: 1427 | '@vue/compiler-ssr': 3.5.13 1428 | '@vue/shared': 3.5.13 1429 | vue: 3.5.13(typescript@5.7.2) 1430 | 1431 | '@vue/shared@3.5.13': {} 1432 | 1433 | alien-signals@0.4.11: {} 1434 | 1435 | ansi-regex@5.0.1: {} 1436 | 1437 | ansi-regex@6.1.0: {} 1438 | 1439 | ansi-styles@4.3.0: 1440 | dependencies: 1441 | color-convert: 2.0.1 1442 | 1443 | ansi-styles@6.2.1: {} 1444 | 1445 | any-promise@1.3.0: {} 1446 | 1447 | anymatch@3.1.3: 1448 | dependencies: 1449 | normalize-path: 3.0.0 1450 | picomatch: 2.3.1 1451 | 1452 | arg@5.0.2: {} 1453 | 1454 | autoprefixer@10.4.20(postcss@8.4.49): 1455 | dependencies: 1456 | browserslist: 4.24.3 1457 | caniuse-lite: 1.0.30001690 1458 | fraction.js: 4.3.7 1459 | normalize-range: 0.1.2 1460 | picocolors: 1.1.1 1461 | postcss: 8.4.49 1462 | postcss-value-parser: 4.2.0 1463 | 1464 | balanced-match@1.0.2: {} 1465 | 1466 | binary-extensions@2.3.0: {} 1467 | 1468 | brace-expansion@2.0.1: 1469 | dependencies: 1470 | balanced-match: 1.0.2 1471 | 1472 | braces@3.0.3: 1473 | dependencies: 1474 | fill-range: 7.1.1 1475 | 1476 | browserslist@4.24.3: 1477 | dependencies: 1478 | caniuse-lite: 1.0.30001690 1479 | electron-to-chromium: 1.5.76 1480 | node-releases: 2.0.19 1481 | update-browserslist-db: 1.1.1(browserslist@4.24.3) 1482 | 1483 | camelcase-css@2.0.1: {} 1484 | 1485 | caniuse-lite@1.0.30001690: {} 1486 | 1487 | chokidar@3.6.0: 1488 | dependencies: 1489 | anymatch: 3.1.3 1490 | braces: 3.0.3 1491 | glob-parent: 5.1.2 1492 | is-binary-path: 2.1.0 1493 | is-glob: 4.0.3 1494 | normalize-path: 3.0.0 1495 | readdirp: 3.6.0 1496 | optionalDependencies: 1497 | fsevents: 2.3.3 1498 | 1499 | color-convert@2.0.1: 1500 | dependencies: 1501 | color-name: 1.1.4 1502 | 1503 | color-name@1.1.4: {} 1504 | 1505 | commander@4.1.1: {} 1506 | 1507 | cross-spawn@7.0.6: 1508 | dependencies: 1509 | path-key: 3.1.1 1510 | shebang-command: 2.0.0 1511 | which: 2.0.2 1512 | 1513 | cssesc@3.0.0: {} 1514 | 1515 | csstype@3.1.3: {} 1516 | 1517 | dayjs@1.11.13: {} 1518 | 1519 | de-indent@1.0.2: {} 1520 | 1521 | didyoumean@1.2.2: {} 1522 | 1523 | dlv@1.1.3: {} 1524 | 1525 | eastasianwidth@0.2.0: {} 1526 | 1527 | electron-to-chromium@1.5.76: {} 1528 | 1529 | emoji-regex@8.0.0: {} 1530 | 1531 | emoji-regex@9.2.2: {} 1532 | 1533 | entities@4.5.0: {} 1534 | 1535 | esbuild@0.24.2: 1536 | optionalDependencies: 1537 | '@esbuild/aix-ppc64': 0.24.2 1538 | '@esbuild/android-arm': 0.24.2 1539 | '@esbuild/android-arm64': 0.24.2 1540 | '@esbuild/android-x64': 0.24.2 1541 | '@esbuild/darwin-arm64': 0.24.2 1542 | '@esbuild/darwin-x64': 0.24.2 1543 | '@esbuild/freebsd-arm64': 0.24.2 1544 | '@esbuild/freebsd-x64': 0.24.2 1545 | '@esbuild/linux-arm': 0.24.2 1546 | '@esbuild/linux-arm64': 0.24.2 1547 | '@esbuild/linux-ia32': 0.24.2 1548 | '@esbuild/linux-loong64': 0.24.2 1549 | '@esbuild/linux-mips64el': 0.24.2 1550 | '@esbuild/linux-ppc64': 0.24.2 1551 | '@esbuild/linux-riscv64': 0.24.2 1552 | '@esbuild/linux-s390x': 0.24.2 1553 | '@esbuild/linux-x64': 0.24.2 1554 | '@esbuild/netbsd-arm64': 0.24.2 1555 | '@esbuild/netbsd-x64': 0.24.2 1556 | '@esbuild/openbsd-arm64': 0.24.2 1557 | '@esbuild/openbsd-x64': 0.24.2 1558 | '@esbuild/sunos-x64': 0.24.2 1559 | '@esbuild/win32-arm64': 0.24.2 1560 | '@esbuild/win32-ia32': 0.24.2 1561 | '@esbuild/win32-x64': 0.24.2 1562 | 1563 | escalade@3.2.0: {} 1564 | 1565 | estree-walker@2.0.2: {} 1566 | 1567 | fast-glob@3.3.2: 1568 | dependencies: 1569 | '@nodelib/fs.stat': 2.0.5 1570 | '@nodelib/fs.walk': 1.2.8 1571 | glob-parent: 5.1.2 1572 | merge2: 1.4.1 1573 | micromatch: 4.0.8 1574 | 1575 | fastq@1.18.0: 1576 | dependencies: 1577 | reusify: 1.0.4 1578 | 1579 | fill-range@7.1.1: 1580 | dependencies: 1581 | to-regex-range: 5.0.1 1582 | 1583 | foreground-child@3.3.0: 1584 | dependencies: 1585 | cross-spawn: 7.0.6 1586 | signal-exit: 4.1.0 1587 | 1588 | fraction.js@4.3.7: {} 1589 | 1590 | fsevents@2.3.3: 1591 | optional: true 1592 | 1593 | function-bind@1.1.2: {} 1594 | 1595 | glob-parent@5.1.2: 1596 | dependencies: 1597 | is-glob: 4.0.3 1598 | 1599 | glob-parent@6.0.2: 1600 | dependencies: 1601 | is-glob: 4.0.3 1602 | 1603 | glob@10.4.5: 1604 | dependencies: 1605 | foreground-child: 3.3.0 1606 | jackspeak: 3.4.3 1607 | minimatch: 9.0.5 1608 | minipass: 7.1.2 1609 | package-json-from-dist: 1.0.1 1610 | path-scurry: 1.11.1 1611 | 1612 | hasown@2.0.2: 1613 | dependencies: 1614 | function-bind: 1.1.2 1615 | 1616 | he@1.2.0: {} 1617 | 1618 | is-binary-path@2.1.0: 1619 | dependencies: 1620 | binary-extensions: 2.3.0 1621 | 1622 | is-core-module@2.16.1: 1623 | dependencies: 1624 | hasown: 2.0.2 1625 | 1626 | is-extglob@2.1.1: {} 1627 | 1628 | is-fullwidth-code-point@3.0.0: {} 1629 | 1630 | is-glob@4.0.3: 1631 | dependencies: 1632 | is-extglob: 2.1.1 1633 | 1634 | is-number@7.0.0: {} 1635 | 1636 | isexe@2.0.0: {} 1637 | 1638 | jackspeak@3.4.3: 1639 | dependencies: 1640 | '@isaacs/cliui': 8.0.2 1641 | optionalDependencies: 1642 | '@pkgjs/parseargs': 0.11.0 1643 | 1644 | jiti@1.21.7: {} 1645 | 1646 | lilconfig@3.1.3: {} 1647 | 1648 | lines-and-columns@1.2.4: {} 1649 | 1650 | lru-cache@10.4.3: {} 1651 | 1652 | magic-string@0.30.17: 1653 | dependencies: 1654 | '@jridgewell/sourcemap-codec': 1.5.0 1655 | 1656 | merge2@1.4.1: {} 1657 | 1658 | micromatch@4.0.8: 1659 | dependencies: 1660 | braces: 3.0.3 1661 | picomatch: 2.3.1 1662 | 1663 | mini-svg-data-uri@1.4.4: {} 1664 | 1665 | minimatch@9.0.5: 1666 | dependencies: 1667 | brace-expansion: 2.0.1 1668 | 1669 | minipass@7.1.2: {} 1670 | 1671 | muggle-string@0.4.1: {} 1672 | 1673 | mz@2.7.0: 1674 | dependencies: 1675 | any-promise: 1.3.0 1676 | object-assign: 4.1.1 1677 | thenify-all: 1.6.0 1678 | 1679 | nanoid@3.3.8: {} 1680 | 1681 | nanoid@5.0.9: {} 1682 | 1683 | node-releases@2.0.19: {} 1684 | 1685 | normalize-path@3.0.0: {} 1686 | 1687 | normalize-range@0.1.2: {} 1688 | 1689 | object-assign@4.1.1: {} 1690 | 1691 | object-hash@3.0.0: {} 1692 | 1693 | package-json-from-dist@1.0.1: {} 1694 | 1695 | path-browserify@1.0.1: {} 1696 | 1697 | path-key@3.1.1: {} 1698 | 1699 | path-parse@1.0.7: {} 1700 | 1701 | path-scurry@1.11.1: 1702 | dependencies: 1703 | lru-cache: 10.4.3 1704 | minipass: 7.1.2 1705 | 1706 | picocolors@1.1.1: {} 1707 | 1708 | picomatch@2.3.1: {} 1709 | 1710 | pify@2.3.0: {} 1711 | 1712 | pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)): 1713 | dependencies: 1714 | '@vue/devtools-api': 6.6.4 1715 | vue: 3.5.13(typescript@5.7.2) 1716 | vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) 1717 | optionalDependencies: 1718 | typescript: 5.7.2 1719 | transitivePeerDependencies: 1720 | - '@vue/composition-api' 1721 | 1722 | pirates@4.0.6: {} 1723 | 1724 | postcss-import@15.1.0(postcss@8.4.49): 1725 | dependencies: 1726 | postcss: 8.4.49 1727 | postcss-value-parser: 4.2.0 1728 | read-cache: 1.0.0 1729 | resolve: 1.22.10 1730 | 1731 | postcss-js@4.0.1(postcss@8.4.49): 1732 | dependencies: 1733 | camelcase-css: 2.0.1 1734 | postcss: 8.4.49 1735 | 1736 | postcss-load-config@4.0.2(postcss@8.4.49): 1737 | dependencies: 1738 | lilconfig: 3.1.3 1739 | yaml: 2.6.1 1740 | optionalDependencies: 1741 | postcss: 8.4.49 1742 | 1743 | postcss-nested@6.2.0(postcss@8.4.49): 1744 | dependencies: 1745 | postcss: 8.4.49 1746 | postcss-selector-parser: 6.1.2 1747 | 1748 | postcss-selector-parser@6.1.2: 1749 | dependencies: 1750 | cssesc: 3.0.0 1751 | util-deprecate: 1.0.2 1752 | 1753 | postcss-value-parser@4.2.0: {} 1754 | 1755 | postcss@8.4.49: 1756 | dependencies: 1757 | nanoid: 3.3.8 1758 | picocolors: 1.1.1 1759 | source-map-js: 1.2.1 1760 | 1761 | queue-microtask@1.2.3: {} 1762 | 1763 | read-cache@1.0.0: 1764 | dependencies: 1765 | pify: 2.3.0 1766 | 1767 | readdirp@3.6.0: 1768 | dependencies: 1769 | picomatch: 2.3.1 1770 | 1771 | resolve@1.22.10: 1772 | dependencies: 1773 | is-core-module: 2.16.1 1774 | path-parse: 1.0.7 1775 | supports-preserve-symlinks-flag: 1.0.0 1776 | 1777 | reusify@1.0.4: {} 1778 | 1779 | rollup@4.29.1: 1780 | dependencies: 1781 | '@types/estree': 1.0.6 1782 | optionalDependencies: 1783 | '@rollup/rollup-android-arm-eabi': 4.29.1 1784 | '@rollup/rollup-android-arm64': 4.29.1 1785 | '@rollup/rollup-darwin-arm64': 4.29.1 1786 | '@rollup/rollup-darwin-x64': 4.29.1 1787 | '@rollup/rollup-freebsd-arm64': 4.29.1 1788 | '@rollup/rollup-freebsd-x64': 4.29.1 1789 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 1790 | '@rollup/rollup-linux-arm-musleabihf': 4.29.1 1791 | '@rollup/rollup-linux-arm64-gnu': 4.29.1 1792 | '@rollup/rollup-linux-arm64-musl': 4.29.1 1793 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 1794 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 1795 | '@rollup/rollup-linux-riscv64-gnu': 4.29.1 1796 | '@rollup/rollup-linux-s390x-gnu': 4.29.1 1797 | '@rollup/rollup-linux-x64-gnu': 4.29.1 1798 | '@rollup/rollup-linux-x64-musl': 4.29.1 1799 | '@rollup/rollup-win32-arm64-msvc': 4.29.1 1800 | '@rollup/rollup-win32-ia32-msvc': 4.29.1 1801 | '@rollup/rollup-win32-x64-msvc': 4.29.1 1802 | fsevents: 2.3.3 1803 | 1804 | run-parallel@1.2.0: 1805 | dependencies: 1806 | queue-microtask: 1.2.3 1807 | 1808 | shebang-command@2.0.0: 1809 | dependencies: 1810 | shebang-regex: 3.0.0 1811 | 1812 | shebang-regex@3.0.0: {} 1813 | 1814 | signal-exit@4.1.0: {} 1815 | 1816 | source-map-js@1.2.1: {} 1817 | 1818 | string-width@4.2.3: 1819 | dependencies: 1820 | emoji-regex: 8.0.0 1821 | is-fullwidth-code-point: 3.0.0 1822 | strip-ansi: 6.0.1 1823 | 1824 | string-width@5.1.2: 1825 | dependencies: 1826 | eastasianwidth: 0.2.0 1827 | emoji-regex: 9.2.2 1828 | strip-ansi: 7.1.0 1829 | 1830 | strip-ansi@6.0.1: 1831 | dependencies: 1832 | ansi-regex: 5.0.1 1833 | 1834 | strip-ansi@7.1.0: 1835 | dependencies: 1836 | ansi-regex: 6.1.0 1837 | 1838 | sucrase@3.35.0: 1839 | dependencies: 1840 | '@jridgewell/gen-mapping': 0.3.8 1841 | commander: 4.1.1 1842 | glob: 10.4.5 1843 | lines-and-columns: 1.2.4 1844 | mz: 2.7.0 1845 | pirates: 4.0.6 1846 | ts-interface-checker: 0.1.13 1847 | 1848 | supports-preserve-symlinks-flag@1.0.0: {} 1849 | 1850 | tailwindcss@3.4.17: 1851 | dependencies: 1852 | '@alloc/quick-lru': 5.2.0 1853 | arg: 5.0.2 1854 | chokidar: 3.6.0 1855 | didyoumean: 1.2.2 1856 | dlv: 1.1.3 1857 | fast-glob: 3.3.2 1858 | glob-parent: 6.0.2 1859 | is-glob: 4.0.3 1860 | jiti: 1.21.7 1861 | lilconfig: 3.1.3 1862 | micromatch: 4.0.8 1863 | normalize-path: 3.0.0 1864 | object-hash: 3.0.0 1865 | picocolors: 1.1.1 1866 | postcss: 8.4.49 1867 | postcss-import: 15.1.0(postcss@8.4.49) 1868 | postcss-js: 4.0.1(postcss@8.4.49) 1869 | postcss-load-config: 4.0.2(postcss@8.4.49) 1870 | postcss-nested: 6.2.0(postcss@8.4.49) 1871 | postcss-selector-parser: 6.1.2 1872 | resolve: 1.22.10 1873 | sucrase: 3.35.0 1874 | transitivePeerDependencies: 1875 | - ts-node 1876 | 1877 | thenify-all@1.6.0: 1878 | dependencies: 1879 | thenify: 3.3.1 1880 | 1881 | thenify@3.3.1: 1882 | dependencies: 1883 | any-promise: 1.3.0 1884 | 1885 | to-regex-range@5.0.1: 1886 | dependencies: 1887 | is-number: 7.0.0 1888 | 1889 | ts-interface-checker@0.1.13: {} 1890 | 1891 | typescript@5.7.2: {} 1892 | 1893 | update-browserslist-db@1.1.1(browserslist@4.24.3): 1894 | dependencies: 1895 | browserslist: 4.24.3 1896 | escalade: 3.2.0 1897 | picocolors: 1.1.1 1898 | 1899 | util-deprecate@1.0.2: {} 1900 | 1901 | vite@6.0.6(jiti@1.21.7)(yaml@2.6.1): 1902 | dependencies: 1903 | esbuild: 0.24.2 1904 | postcss: 8.4.49 1905 | rollup: 4.29.1 1906 | optionalDependencies: 1907 | fsevents: 2.3.3 1908 | jiti: 1.21.7 1909 | yaml: 2.6.1 1910 | 1911 | vscode-uri@3.0.8: {} 1912 | 1913 | vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): 1914 | dependencies: 1915 | vue: 3.5.13(typescript@5.7.2) 1916 | 1917 | vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)): 1918 | dependencies: 1919 | '@vue/devtools-api': 6.6.4 1920 | vue: 3.5.13(typescript@5.7.2) 1921 | 1922 | vue-tsc@2.2.0(typescript@5.7.2): 1923 | dependencies: 1924 | '@volar/typescript': 2.4.11 1925 | '@vue/language-core': 2.2.0(typescript@5.7.2) 1926 | typescript: 5.7.2 1927 | 1928 | vue@3.5.13(typescript@5.7.2): 1929 | dependencies: 1930 | '@vue/compiler-dom': 3.5.13 1931 | '@vue/compiler-sfc': 3.5.13 1932 | '@vue/runtime-dom': 3.5.13 1933 | '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) 1934 | '@vue/shared': 3.5.13 1935 | optionalDependencies: 1936 | typescript: 5.7.2 1937 | 1938 | which@2.0.2: 1939 | dependencies: 1940 | isexe: 2.0.0 1941 | 1942 | wrap-ansi@7.0.0: 1943 | dependencies: 1944 | ansi-styles: 4.3.0 1945 | string-width: 4.2.3 1946 | strip-ansi: 6.0.1 1947 | 1948 | wrap-ansi@8.1.0: 1949 | dependencies: 1950 | ansi-styles: 6.2.1 1951 | string-width: 5.1.2 1952 | strip-ansi: 7.1.0 1953 | 1954 | yaml@2.6.1: {} 1955 | --------------------------------------------------------------------------------