From 35ea67fd1486b9bd17f608dfa7e76dc64aef87f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sat, 7 Feb 2026 23:07:47 +0900 Subject: [PATCH 01/24] feat: add desktop wrapper with frontend-only packaging --- .gitignore | 12 +- desktop/assets/icon.png | Bin 0 -> 59198 bytes desktop/assets/tray.png | Bin 0 -> 48530 bytes desktop/main.js | 423 +++++++++++++++++++++++++++++ desktop/package.json | 61 +++++ desktop/preload.js | 1 + desktop/resources/backend/.gitkeep | 0 desktop/scripts/build-backend.mjs | 42 +++ desktop/scripts/prepare-webui.mjs | 20 ++ desktop/scripts/sync-version.mjs | 55 ++++ 10 files changed, 613 insertions(+), 1 deletion(-) create mode 100644 desktop/assets/icon.png create mode 100644 desktop/assets/tray.png create mode 100644 desktop/main.js create mode 100644 desktop/package.json create mode 100644 desktop/preload.js create mode 100644 desktop/resources/backend/.gitkeep create mode 100644 desktop/scripts/build-backend.mjs create mode 100644 desktop/scripts/prepare-webui.mjs create mode 100644 desktop/scripts/sync-version.mjs diff --git a/.gitignore b/.gitignore index 9ac4f14294..120747f777 100644 --- a/.gitignore +++ b/.gitignore @@ -32,9 +32,19 @@ tests/astrbot_plugin_openai # Dashboard dashboard/node_modules/ dashboard/dist/ +desktop/node_modules/ +desktop/dist/ +desktop/out/ +desktop/resources/backend/astrbot-backend* +desktop/resources/backend/*.exe +desktop/resources/webui/* +desktop/resources/.pyinstaller/ package-lock.json package.json yarn.lock +!desktop/package.json +!desktop/resources/backend/.gitkeep +!desktop/resources/webui/.gitkeep # Operating System **/.DS_Store @@ -53,4 +63,4 @@ IFLOW.md # genie_tts data CharacterModels/ -GenieData/ \ No newline at end of file +GenieData/ diff --git a/desktop/assets/icon.png b/desktop/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..512d1eaedf84835e5fff19eb8879da1ad6122ffd GIT binary patch literal 59198 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 literal 0 HcmV?d00001 diff --git a/desktop/assets/tray.png b/desktop/assets/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..4fcc92ba63813e7801cd49b4130426e82ed3effe GIT binary patch literal 48530 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 e6@ap!yaYv)&hcOkpBmosW0*X literal 0 HcmV?d00001 diff --git a/desktop/main.js b/desktop/main.js new file mode 100644 index 0000000000..dbc36f56b1 --- /dev/null +++ b/desktop/main.js @@ -0,0 +1,423 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const { + app, + BrowserWindow, + Menu, + Tray, + nativeImage, + shell, + dialog, +} = require('electron'); +const { spawn } = require('child_process'); + +const isMac = process.platform === 'darwin'; +const backendUrl = normalizeUrl( + process.env.ASTRBOT_BACKEND_URL || 'http://127.0.0.1:6185/', +); +const backendAutoStart = process.env.ASTRBOT_BACKEND_AUTO_START !== '0'; +const backendTimeoutMs = Number.parseInt( + process.env.ASTRBOT_BACKEND_TIMEOUT_MS || '20000', + 10, +); + +let mainWindow = null; +let tray = null; +let isQuitting = false; +let backendProcess = null; +let backendConfig = null; + +function getAssetPath(filename) { + if (app.isPackaged) { + const packaged = path.join(process.resourcesPath, 'assets', filename); + if (fs.existsSync(packaged)) { + return packaged; + } + } + return path.join(__dirname, 'assets', filename); +} + +function loadImageSafe(imagePath) { + try { + const image = nativeImage.createFromPath(imagePath); + if (!image.isEmpty()) { + return image; + } + } catch {} + return nativeImage.createEmpty(); +} + +function normalizeUrl(value) { + try { + const url = new URL(value); + if (!url.pathname.endsWith('/')) { + url.pathname += '/'; + } + return url.toString(); + } catch { + return 'http://127.0.0.1:6185/'; + } +} + +function shellQuote(value) { + if (!value) { + return ''; + } + if (process.platform === 'win32') { + return `"${value.replace(/"/g, '\\"')}"`; + } + return `'${value.replace(/'/g, "'\\''")}'`; +} + +function ensureDir(value) { + if (!value) { + return; + } + if (fs.existsSync(value)) { + return; + } + fs.mkdirSync(value, { recursive: true }); +} + +function getPackagedBackendPath() { + if (!app.isPackaged) { + return null; + } + const filename = + process.platform === 'win32' ? 'astrbot-backend.exe' : 'astrbot-backend'; + const candidate = path.join(process.resourcesPath, 'backend', filename); + return fs.existsSync(candidate) ? candidate : null; +} + +function resolveWebuiDir() { + if (process.env.ASTRBOT_WEBUI_DIR) { + return process.env.ASTRBOT_WEBUI_DIR; + } + if (!app.isPackaged) { + return null; + } + const candidate = path.join(process.resourcesPath, 'webui'); + const indexPath = path.join(candidate, 'index.html'); + return fs.existsSync(indexPath) ? candidate : null; +} + +function resolveBackendRoot() { + if (!app.isPackaged) { + return null; + } + return app.getPath('userData'); +} + +function resolveBackendCwd() { + if (!app.isPackaged) { + return path.resolve(__dirname, '..'); + } + return app.getPath('userData'); +} + +function buildDefaultBackendCmd(webuiDir) { + if (app.isPackaged) { + const packagedBackend = getPackagedBackendPath(); + if (!packagedBackend) { + return null; + } + let cmd = shellQuote(packagedBackend); + if (webuiDir) { + cmd += ` --webui-dir ${shellQuote(webuiDir)}`; + } + return cmd; + } + let cmd = 'uv run main.py'; + if (webuiDir) { + cmd += ` --webui-dir ${shellQuote(webuiDir)}`; + } + return cmd; +} + +function resolveBackendConfig() { + const webuiDir = resolveWebuiDir(); + const cmd = + process.env.ASTRBOT_BACKEND_CMD || buildDefaultBackendCmd(webuiDir); + const cwd = process.env.ASTRBOT_BACKEND_CWD || resolveBackendCwd(); + const rootDir = process.env.ASTRBOT_ROOT || resolveBackendRoot(); + ensureDir(cwd); + if (rootDir) { + ensureDir(rootDir); + } + return { + cmd, + cwd, + webuiDir, + rootDir, + }; +} + +function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function pingBackend(timeoutMs = 800) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), timeoutMs); + try { + const response = await fetch(backendUrl, { signal: controller.signal }); + return response.ok; + } catch { + return false; + } finally { + clearTimeout(timeout); + } +} + +async function waitForBackend(maxWaitMs = 20000) { + const start = Date.now(); + while (Date.now() - start < maxWaitMs) { + if (await pingBackend()) { + return true; + } + await delay(600); + } + return false; +} + +function startBackend() { + if (backendProcess) { + return; + } + if (!backendConfig) { + backendConfig = resolveBackendConfig(); + } + if (!backendConfig.cmd) { + return; + } + const env = { + ...process.env, + PYTHONUNBUFFERED: '1', + }; + if (backendConfig.rootDir) { + env.ASTRBOT_ROOT = backendConfig.rootDir; + } + backendProcess = spawn(backendConfig.cmd, { + cwd: backendConfig.cwd, + env, + shell: true, + stdio: 'ignore', + windowsHide: true, + }); + + backendProcess.on('exit', () => { + backendProcess = null; + }); +} + +function stopBackend() { + if (!backendProcess || backendProcess.killed) { + return; + } + if (process.platform === 'win32' && backendProcess.pid) { + spawn('taskkill', ['/pid', `${backendProcess.pid}`, '/t', '/f'], { + stdio: 'ignore', + windowsHide: true, + }); + } else { + backendProcess.kill('SIGTERM'); + } + backendProcess = null; +} + +function createWindow() { + mainWindow = new BrowserWindow({ + width: 1280, + height: 800, + minWidth: 980, + minHeight: 680, + show: false, + autoHideMenuBar: !isMac, + icon: getAssetPath('icon.png'), + webPreferences: { + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + preload: path.join(__dirname, 'preload.js'), + }, + }); + + mainWindow.once('ready-to-show', () => { + mainWindow.show(); + }); + + mainWindow.on('close', (event) => { + if (isQuitting) { + return; + } + event.preventDefault(); + mainWindow.hide(); + }); + + mainWindow.on('minimize', (event) => { + event.preventDefault(); + mainWindow.hide(); + }); + + mainWindow.on('show', () => updateTrayMenu()); + mainWindow.on('hide', () => updateTrayMenu()); + + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + shell.openExternal(url); + return { action: 'deny' }; + }); + + return mainWindow; +} + +function updateTrayMenu() { + if (!tray || !mainWindow) { + return; + } + const isVisible = mainWindow.isVisible(); + const contextMenu = Menu.buildFromTemplate([ + { + label: isVisible ? 'Hide AstrBot' : 'Show AstrBot', + click: () => toggleWindow(), + }, + { + label: 'Reload', + click: () => { + if (mainWindow) { + mainWindow.reload(); + } + }, + }, + { type: 'separator' }, + { + label: 'Quit', + click: () => app.quit(), + }, + ]); + tray.setContextMenu(contextMenu); +} + +function createTray() { + const traySize = isMac ? 18 : 16; + const trayPath = getAssetPath('tray.png'); + let trayImage = loadImageSafe(trayPath); + if (trayImage.isEmpty()) { + trayImage = loadImageSafe(getAssetPath('icon.png')); + } + if (!trayImage.isEmpty()) { + trayImage = trayImage.resize({ width: traySize, height: traySize }); + if (isMac) { + trayImage.setTemplateImage(true); + } + tray = new Tray(trayImage); + } else { + tray = new Tray(nativeImage.createEmpty()); + } + tray.setToolTip('AstrBot'); + tray.on('click', () => toggleWindow()); + updateTrayMenu(); +} + +function showWindow() { + if (!mainWindow) { + return; + } + mainWindow.show(); + mainWindow.focus(); + updateTrayMenu(); +} + +function toggleWindow() { + if (!mainWindow) { + return; + } + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + mainWindow.focus(); + } + updateTrayMenu(); +} + +async function ensureBackend() { + if (!backendConfig) { + backendConfig = resolveBackendConfig(); + } + const running = await pingBackend(); + if (running) { + return true; + } + if (!backendAutoStart || !backendConfig.cmd) { + return false; + } + startBackend(); + return waitForBackend(backendTimeoutMs); +} + +app.setAppUserModelId('com.astrbot.desktop'); + +const gotLock = app.requestSingleInstanceLock(); +if (!gotLock) { + app.quit(); +} else { + app.on('second-instance', () => { + showWindow(); + }); +} + +app.on('before-quit', () => { + isQuitting = true; + stopBackend(); +}); + +app.whenReady().then(async () => { + if (isMac && app.dock) { + const dockIcon = getAssetPath('icon.png'); + if (fs.existsSync(dockIcon)) { + app.dock.setIcon(dockIcon); + } + } + const ready = await ensureBackend(); + + if (!ready) { + await dialog.showMessageBox({ + type: 'error', + title: 'AstrBot startup failed', + message: 'AstrBot backend is not reachable.', + detail: + 'Please start the backend at http://127.0.0.1:6185 and relaunch AstrBot.', + }); + isQuitting = true; + app.quit(); + return; + } + + createWindow(); + createTray(); + + try { + await mainWindow.loadURL(backendUrl); + } catch (error) { + dialog.showMessageBox({ + type: 'error', + title: 'Failed to load AstrBot', + message: 'Unable to load the AstrBot dashboard.', + detail: error instanceof Error ? error.message : String(error), + }); + } +}); + +app.on('activate', () => { + if (mainWindow) { + showWindow(); + } +}); + +app.on('window-all-closed', () => { + if (!isMac) { + app.quit(); + } +}); diff --git a/desktop/package.json b/desktop/package.json new file mode 100644 index 0000000000..a53d7ffaf9 --- /dev/null +++ b/desktop/package.json @@ -0,0 +1,61 @@ +{ + "name": "astrbot-desktop", + "version": "4.3.2", + "description": "AstrBot desktop wrapper", + "private": true, + "main": "main.js", + "author": "AstrBot", + "scripts": { + "dev": "electron .", + "start": "electron .", + "sync:version": "node scripts/sync-version.mjs", + "build:webui": "node scripts/prepare-webui.mjs", + "build:backend": "node scripts/build-backend.mjs", + "dist:full": "npm run build:webui && npm run dist", + "pack": "npm run sync:version && electron-builder --dir", + "dist": "npm run sync:version && electron-builder" + }, + "devDependencies": { + "electron": "^30.0.0", + "electron-builder": "^24.13.0" + }, + "build": { + "appId": "com.astrbot.desktop", + "productName": "AstrBot", + "icon": "assets/icon.png", + "extraResources": [ + { + "from": "resources/webui", + "to": "webui" + }, + { + "from": "assets", + "to": "assets" + } + ], + "files": [ + "**/*", + "!resources/backend{,/**}", + "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}", + "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}", + "!**/node_modules/.bin" + ], + "asar": true, + "directories": { + "buildResources": "assets" + }, + "mac": { + "target": [ + "dmg", + "zip" + ], + "category": "public.app-category.productivity" + }, + "win": { + "target": [ + "nsis", + "zip" + ] + } + } +} diff --git a/desktop/preload.js b/desktop/preload.js new file mode 100644 index 0000000000..ad9a93a7c1 --- /dev/null +++ b/desktop/preload.js @@ -0,0 +1 @@ +'use strict'; diff --git a/desktop/resources/backend/.gitkeep b/desktop/resources/backend/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/desktop/scripts/build-backend.mjs b/desktop/scripts/build-backend.mjs new file mode 100644 index 0000000000..51c035b8e2 --- /dev/null +++ b/desktop/scripts/build-backend.mjs @@ -0,0 +1,42 @@ +import { spawnSync } from 'node:child_process'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDir = path.resolve(__dirname, '..', '..'); +const outputDir = path.join(rootDir, 'desktop', 'resources', 'backend'); +const workDir = path.join(rootDir, 'desktop', 'resources', '.pyinstaller'); + +const args = [ + 'run', + 'python', + '-m', + 'PyInstaller', + '--noconfirm', + '--clean', + '--onefile', + '--name', + 'astrbot-backend', + '--collect-all', + 'aiosqlite', + '--distpath', + outputDir, + '--workpath', + workDir, + '--specpath', + workDir, + path.join(rootDir, 'main.py'), +]; + +const result = spawnSync('uv', args, { + cwd: rootDir, + stdio: 'inherit', + shell: process.platform === 'win32', +}); + +if (result.error) { + console.error('Failed to run uv. Make sure uv and pyinstaller are installed.'); + process.exit(1); +} + +process.exit(result.status ?? 1); diff --git a/desktop/scripts/prepare-webui.mjs b/desktop/scripts/prepare-webui.mjs new file mode 100644 index 0000000000..404ae7ef99 --- /dev/null +++ b/desktop/scripts/prepare-webui.mjs @@ -0,0 +1,20 @@ +import { cp, mkdir, rm } from 'node:fs/promises'; +import { existsSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDir = path.resolve(__dirname, '..', '..'); +const distDir = path.join(rootDir, 'dashboard', 'dist'); +const targetDir = path.join(rootDir, 'desktop', 'resources', 'webui'); + +if (!existsSync(distDir)) { + console.error('dashboard/dist is missing. Run `pnpm --dir dashboard build` first.'); + process.exit(1); +} + +await rm(targetDir, { recursive: true, force: true }); +await mkdir(targetDir, { recursive: true }); +await cp(distDir, targetDir, { recursive: true }); + +console.log(`Copied WebUI to ${targetDir}`); diff --git a/desktop/scripts/sync-version.mjs b/desktop/scripts/sync-version.mjs new file mode 100644 index 0000000000..06711acb30 --- /dev/null +++ b/desktop/scripts/sync-version.mjs @@ -0,0 +1,55 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import { spawnSync } from 'node:child_process'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const rootDir = path.resolve(__dirname, '..', '..'); +const desktopPackagePath = path.join(rootDir, 'desktop', 'package.json'); +const pyprojectPath = path.join(rootDir, 'pyproject.toml'); + +function getGitTag() { + const result = spawnSync('git', ['describe', '--tags', '--abbrev=0'], { + cwd: rootDir, + encoding: 'utf8', + }); + if (result.status === 0) { + const tag = result.stdout.trim(); + return tag.length ? tag : null; + } + return null; +} + +function normalizeTag(tag) { + return tag.replace(/^v/i, ''); +} + +async function getPyprojectVersion() { + try { + const data = await readFile(pyprojectPath, 'utf8'); + const match = data.match(/^\s*version\s*=\s*"([^"]+)"/m); + return match ? match[1] : null; + } catch { + return null; + } +} + +const pkgRaw = await readFile(desktopPackagePath, 'utf8'); +const pkg = JSON.parse(pkgRaw); +const tag = getGitTag(); +const versionFromTag = tag ? normalizeTag(tag) : null; +const version = versionFromTag || (await getPyprojectVersion()) || pkg.version; + +if (!version) { + console.warn('No version found to sync.'); + process.exit(0); +} + +if (pkg.version === version) { + console.log(`Desktop version already ${version}`); + process.exit(0); +} + +pkg.version = version; +await writeFile(desktopPackagePath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf8'); +console.log(`Updated desktop version to ${version}`); From 635990e7012704cf6179b2d71cce2777294dda31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sat, 7 Feb 2026 23:18:18 +0900 Subject: [PATCH 02/24] docs: add desktop build docs and track dashboard lockfile --- README.md | 5 +- README_en.md | 4 + dashboard/pnpm-lock.yaml | 5491 ++++++++++++++++++++++++++++++++++++++ desktop/README.md | 56 + 4 files changed, 5555 insertions(+), 1 deletion(-) create mode 100644 dashboard/pnpm-lock.yaml create mode 100644 desktop/README.md diff --git a/README.md b/README.md index f4640ee439..2def6ca9be 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,10 @@ uv run main.py 或者请参阅官方文档 [通过源码部署 AstrBot](https://astrbot.app/deploy/astrbot/cli.html) 。 +#### 桌面端 Electron 打包 + +桌面端(前端-only 打包)构建流程请参阅:[`desktop/README.md`](desktop/README.md)。 + ## 支持的消息平台 **官方维护** @@ -269,4 +273,3 @@ _陪伴与能力从来不应该是对立面。我们希望创造的是一个既 _私は、高性能ですから!_ - diff --git a/README_en.md b/README_en.md index 54b0fa6053..60d6fa1e4b 100644 --- a/README_en.md +++ b/README_en.md @@ -117,6 +117,10 @@ uv run main.py Or refer to the official documentation: [Deploy AstrBot from Source](https://astrbot.app/deploy/astrbot/cli.html). +#### Desktop Electron Build + +For desktop build steps (frontend-only packaging), see [`desktop/README.md`](desktop/README.md). + ## Supported Messaging Platforms **Officially Maintained** diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml new file mode 100644 index 0000000000..ea8636c615 --- /dev/null +++ b/dashboard/pnpm-lock.yaml @@ -0,0 +1,5491 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@guolao/vue-monaco-editor': + specifier: ^1.5.4 + version: 1.6.0(monaco-editor@0.52.2)(vue@3.3.4) + '@tiptap/starter-kit': + specifier: 2.1.7 + version: 2.1.7(@tiptap/pm@2.27.2) + '@tiptap/vue-3': + specifier: 2.1.7 + version: 2.1.7(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(vue@3.3.4) + apexcharts: + specifier: 3.42.0 + version: 3.42.0 + axios: + specifier: '>=1.6.2 <1.10.0 || >1.10.0 <2.0.0' + version: 1.13.4 + axios-mock-adapter: + specifier: ^1.22.0 + version: 1.22.0(axios@1.13.4) + chance: + specifier: 1.1.11 + version: 1.1.11 + date-fns: + specifier: 2.30.0 + version: 2.30.0 + dompurify: + specifier: ^3.3.1 + version: 3.3.1 + event-source-polyfill: + specifier: ^1.0.31 + version: 1.0.31 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + js-md5: + specifier: ^0.8.3 + version: 0.8.3 + katex: + specifier: ^0.16.27 + version: 0.16.28 + lodash: + specifier: 4.17.21 + version: 4.17.21 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + markstream-vue: + specifier: ^0.0.6 + version: 0.0.6(katex@0.16.28)(mermaid@11.12.2)(shiki@3.22.0)(stream-markdown@0.0.13(shiki@3.22.0))(stream-monaco@0.0.17(monaco-editor@0.52.2))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4) + mermaid: + specifier: ^11.12.2 + version: 11.12.2 + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 + pinia: + specifier: 2.1.6 + version: 2.1.6(typescript@5.1.6)(vue@3.3.4) + pinyin-pro: + specifier: ^3.26.0 + version: 3.28.0 + remixicon: + specifier: 3.5.0 + version: 3.5.0 + shiki: + specifier: ^3.20.0 + version: 3.22.0 + stream-markdown: + specifier: ^0.0.13 + version: 0.0.13(shiki@3.22.0) + stream-monaco: + specifier: ^0.0.17 + version: 0.0.17(monaco-editor@0.52.2) + vee-validate: + specifier: 4.11.3 + version: 4.11.3(vue@3.3.4) + vite-plugin-vuetify: + specifier: 1.0.2 + version: 1.0.2(vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11) + vue: + specifier: 3.3.4 + version: 3.3.4 + vue-i18n: + specifier: ^11.1.5 + version: 11.2.8(vue@3.3.4) + vue-router: + specifier: 4.2.4 + version: 4.2.4(vue@3.3.4) + vue3-apexcharts: + specifier: 1.4.4 + version: 1.4.4(apexcharts@3.42.0)(vue@3.3.4) + vue3-print-nb: + specifier: 0.1.4 + version: 0.1.4 + vuetify: + specifier: 3.7.11 + version: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@1.0.2)(vue@3.3.4) + yup: + specifier: 1.2.0 + version: 1.2.0 + devDependencies: + '@mdi/font': + specifier: 7.2.96 + version: 7.2.96 + '@rushstack/eslint-patch': + specifier: 1.3.3 + version: 1.3.3 + '@types/chance': + specifier: 1.1.3 + version: 1.1.3 + '@types/dompurify': + specifier: ^3.0.5 + version: 3.2.0 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/node': + specifier: ^20.5.7 + version: 20.19.32 + '@vitejs/plugin-vue': + specifier: 4.3.3 + version: 4.3.3(vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4) + '@vue/eslint-config-prettier': + specifier: 8.0.0 + version: 8.0.0(@types/eslint@9.6.1)(eslint@8.48.0)(prettier@3.0.2) + '@vue/eslint-config-typescript': + specifier: 11.0.3 + version: 11.0.3(eslint-plugin-vue@9.17.0(eslint@8.48.0))(eslint@8.48.0)(typescript@5.1.6) + '@vue/tsconfig': + specifier: ^0.4.0 + version: 0.4.0 + eslint: + specifier: 8.48.0 + version: 8.48.0 + eslint-plugin-vue: + specifier: 9.17.0 + version: 9.17.0(eslint@8.48.0) + prettier: + specifier: 3.0.2 + version: 3.0.2 + sass: + specifier: 1.66.1 + version: 1.66.1 + sass-loader: + specifier: 13.3.2 + version: 13.3.2(sass@1.66.1)(webpack@5.105.0) + typescript: + specifier: 5.1.6 + version: 5.1.6 + vite: + specifier: 4.4.9 + version: 4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vue-cli-plugin-vuetify: + specifier: 2.5.8 + version: 2.5.8(sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0))(vue@3.3.4)(vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0))(webpack@5.105.0) + vue-tsc: + specifier: 1.8.8 + version: 1.8.8(typescript@5.1.6) + vuetify-loader: + specifier: ^2.0.0-alpha.9 + version: 2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.48.0': + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@guolao/vue-monaco-editor@1.6.0': + resolution: {integrity: sha512-w2IiJ6eJGGeuIgCK6EKZOAfhHTTUB5aZwslzwGbZ5e89Hb4avx6++GkLTW8p84Sng/arFMjLPPxSBI56cFudyQ==} + peerDependencies: + '@vue/composition-api': ^1.7.2 + monaco-editor: '>=0.43.0' + vue: ^2.6.14 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + + '@intlify/core-base@11.2.8': + resolution: {integrity: sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.2.8': + resolution: {integrity: sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==} + engines: {node: '>= 16'} + + '@intlify/shared@11.2.8': + resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==} + engines: {node: '>= 16'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdi/font@7.2.96': + resolution: {integrity: sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==} + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@monaco-editor/loader@1.7.0': + resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rushstack/eslint-patch@1.3.3': + resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + + '@shikijs/monaco@3.22.0': + resolution: {integrity: sha512-4Bi/Gr5+ZVGmILq4ksyWtNbylfHxYB0BDMLR76UsaKOkWNJ/1w+c2s7bIjYnBNydyLVRlp28qntqEvB9EaJu3g==} + + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tiptap/core@2.27.2': + resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.2': + resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.2': + resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bubble-menu@2.27.2': + resolution: {integrity: sha512-VkwlCOcr0abTBGzjPXklJ92FCowG7InU8+Od9FyApdLNmn0utRYGRhw0Zno6VgE9EYr1JY4BRnuSa5f9wlR72w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.2': + resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.2': + resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.2': + resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.2': + resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.2': + resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-floating-menu@2.27.2': + resolution: {integrity: sha512-GUN6gPIGXS7ngRJOwdSmtBRBDt9Kt9CM/9pSwKebhLJ+honFoNA+Y6IpVyDvvDMdVNgBchiJLs6qA5H97gAePQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.2': + resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.2': + resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.2': + resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.2': + resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.2': + resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.2': + resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-list-item@2.27.2': + resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.2': + resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.2': + resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.2': + resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.2': + resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.2': + resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} + + '@tiptap/starter-kit@2.1.7': + resolution: {integrity: sha512-z2cmJRSC7ImaTGWrHv+xws9y1wIG0OCPosBYpmpwlEfA3JG3axWFmVRJlWnsQV4eSMi3QY3vaPgBAnrR4IxRhQ==} + + '@tiptap/vue-3@2.1.7': + resolution: {integrity: sha512-JJRXWKLJ8mopb0uZV4JXyOW6vKQnarYoCj0hsy9ZT2LhSuLlPXY0D40NAbFVMMbQssewUtgPUFgVZ/TusMEysQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + vue: ^3.0.0 + + '@types/chance@1.1.3': + resolution: {integrity: sha512-X6c6ghhe4/sQh4XzcZWSFaTAUOda38GQHmq9BUanYkOE/EO7ZrkazwKmtsj3xzTjkLWmwULE++23g3d3CCWaWw==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/dompurify@3.2.0': + resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} + deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@20.19.32': + resolution: {integrity: sha512-Ez8QE4DMfhjjTsES9K2dwfV258qBui7qxUsoaixZDiTzbde4U12e1pXGNu/ECsUIOi5/zoCxAQxIhQnaUQ2VvA==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-vue@4.3.3': + resolution: {integrity: sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + + '@volar/language-core@1.10.10': + resolution: {integrity: sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==} + + '@volar/source-map@1.10.10': + resolution: {integrity: sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==} + + '@volar/typescript@1.10.10': + resolution: {integrity: sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==} + + '@vue/compiler-core@3.3.4': + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} + + '@vue/compiler-dom@3.3.4': + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} + + '@vue/compiler-sfc@3.3.4': + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + + '@vue/compiler-ssr@3.3.4': + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/eslint-config-prettier@8.0.0': + resolution: {integrity: sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@vue/eslint-config-typescript@11.0.3': + resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@1.8.8': + resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity-transform@3.3.4': + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + + '@vue/reactivity@3.3.4': + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + + '@vue/reactivity@3.5.27': + resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} + + '@vue/runtime-core@3.3.4': + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + + '@vue/runtime-dom@3.3.4': + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + + '@vue/server-renderer@3.3.4': + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + + '@vue/shared@3.3.4': + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} + + '@vue/tsconfig@0.4.0': + resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} + + '@vue/typescript@1.8.8': + resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} + + '@vuetify/loader-shared@1.7.1': + resolution: {integrity: sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==} + peerDependencies: + vue: ^3.0.0 + vuetify: ^3.0.0-beta.4 + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + alien-signals@2.0.8: + resolution: {integrity: sha512-844G1VLkk0Pe2SJjY0J8vp8ADI73IM4KliNu2OGlYzWpO28NexEUvjHTcFjFX3VXoiUtwTbHxLNI9ImkcoBqzA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apexcharts@3.42.0: + resolution: {integrity: sha512-hYhzZqh2Efny9uiutkGU2M/EarJ4Nn8s6dxZ0C7E7N+SV4d1xjTioXi2NLn4UKVJabZkb3HnpXDoumXgtAymwg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios-mock-adapter@1.22.0: + resolution: {integrity: sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==} + peerDependencies: + axios: '>= 0.17.0' + + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chance@1.1.11: + resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.17.0: + resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-source-polyfill@1.0.31: + resolution: {integrity: sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-md5@0.8.3: + resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + markdown-it-container@4.0.0: + resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} + + markdown-it-footnote@4.0.0: + resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==} + + markdown-it-ins@4.0.0: + resolution: {integrity: sha512-sWbjK2DprrkINE4oYDhHdCijGT+MIDhEupjSHLXe5UXeVr5qmVxs/nTUVtgi0Oh/qtF+QKV0tNWDhQBEPxiMew==} + + markdown-it-mark@4.0.0: + resolution: {integrity: sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg==} + + markdown-it-sub@2.0.0: + resolution: {integrity: sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA==} + + markdown-it-sup@2.0.0: + resolution: {integrity: sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==} + + markdown-it-task-checkbox@1.0.6: + resolution: {integrity: sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==} + + markdown-it-ts@0.0.3: + resolution: {integrity: sha512-nZpRTJj4S6bN0I5wsNBtgzDKx+HYBBSsvKjGdYw7/tPdrzfo3gUTt3ZbeAjPGeZaC6a4LFi4JdhTVeLm3F6TIQ==} + engines: {node: '>=18'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + markstream-vue@0.0.6: + resolution: {integrity: sha512-5YrpNrTRdbO0YvKPx2sNu4pq+y+UZ1CPbf9Znoydt3ZL7c7zfBhmViCij+VmAmBrr3VLAgD2HToU8PAtuWySxg==} + peerDependencies: + '@antv/infographic': ^0.2.3 + katex: '>=0.16.22' + mermaid: '>=11' + shiki: ^3.13.0 + stream-markdown: '>=0.0.13' + stream-monaco: '>=0.0.17' + vue: '>=3.0.0' + vue-i18n: '>=9' + peerDependenciesMeta: + '@antv/infographic': + optional: true + katex: + optional: true + mermaid: + optional: true + shiki: + optional: true + stream-markdown: + optional: true + stream-monaco: + optional: true + vue-i18n: + optional: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pinia@2.1.6: + resolution: {integrity: sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + pinyin-pro@3.28.0: + resolution: {integrity: sha512-mMRty6RisoyYNphJrTo3pnvp3w8OMZBrXm9YSWkxhAfxKj1KZk2y8T2PDIZlDDRsvZ0No+Hz6FI4sZpA6Ey25g==} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.0.2: + resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} + engines: {node: '>=14'} + hasBin: true + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} + + prosemirror-view@1.41.6: + resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + remixicon@3.5.0: + resolution: {integrity: sha512-wNzWGKf4frb3tEmgvP5shry0n1OdTjjEk9RHLuRuAhfA50bvEdpKH1XWNUYrHUSjAQQkkdyIm+lf4mOuysIKTQ==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@13.3.2: + resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + + sass@1.66.1: + resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==} + engines: {node: '>=14.0.0'} + hasBin: true + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + stream-markdown-parser@0.0.59-beta.3: + resolution: {integrity: sha512-F++KEcHsXeWjKLKw8id6L1JVqQH22fslEZRNbt1NAMUwr8KTI/vOE3UuXYGnJDyXt0yv5JXbO4KdXrvMlWM0qQ==} + + stream-markdown@0.0.13: + resolution: {integrity: sha512-XYhBEtKA76L6q3Uegvu8QOiUDAV4bfF1TcP3rot8eK0AR1+WGHBB6IfT9GJeLFJ7+qZgrH+WxQp/8lZ6CXjeeg==} + peerDependencies: + shiki: '>=3.13.0' + + stream-monaco@0.0.17: + resolution: {integrity: sha512-xpMiFAQEDLxRjNOXobomP9vEJmv5tWU8oN54+SHqL+eeHMNugU7fpmUIqZRSh53p+a/ZYt+DE75jgHwlKOXEuQ==} + hasBin: true + peerDependencies: + monaco-editor: ^0.52.2 + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg.draggable.js@2.2.2: + resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==} + engines: {node: '>= 0.8.0'} + + svg.easing.js@2.0.0: + resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==} + engines: {node: '>= 0.8.0'} + + svg.filter.js@2.0.2: + resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==} + engines: {node: '>= 0.8.0'} + + svg.js@2.7.1: + resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==} + + svg.pathmorphing.js@0.1.3: + resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==} + engines: {node: '>= 0.8.0'} + + svg.resize.js@1.4.3: + resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==} + engines: {node: '>= 0.8.0'} + + svg.select.js@2.1.2: + resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==} + engines: {node: '>= 0.8.0'} + + svg.select.js@3.0.1: + resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==} + engines: {node: '>= 0.8.0'} + + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + vee-validate@4.11.3: + resolution: {integrity: sha512-YhWORdZRE1GL6vXKj3r9f+Y8fJH5JMwMUJ4DFS44+WcTtiNXggyE3pyJPlZBqS9AgYGZ47EOv4UczkLxHqufiw==} + peerDependencies: + vue: ^3.3.4 + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-plugin-vuetify@1.0.2: + resolution: {integrity: sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==} + engines: {node: '>=12'} + peerDependencies: + vite: ^2.7.0 || ^3.0.0 || ^4.0.0 + vue: ^3.0.0 + vuetify: ^3.0.0-beta.4 + + vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-cli-plugin-vuetify@2.5.8: + resolution: {integrity: sha512-uqi0/URJETJBbWlQHD1l0pnY7JN8Ytu+AL1fw50HFlGByPa8/xx+mq19GkFXA9FcwFT01IqEc/TkxMPugchomg==} + peerDependencies: + sass-loader: '*' + vue: '*' + vuetify-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + sass-loader: + optional: true + vuetify-loader: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@11.2.8: + resolution: {integrity: sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.2.4: + resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.8: + resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} + hasBin: true + peerDependencies: + typescript: '*' + + vue3-apexcharts@1.4.4: + resolution: {integrity: sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==} + peerDependencies: + apexcharts: '> 3.0.0' + vue: '> 3.0.0' + + vue3-print-nb@0.1.4: + resolution: {integrity: sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==} + + vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + + vuetify-loader@2.0.0-alpha.9: + resolution: {integrity: sha512-M4u2XX9coe1U51jLKek54eJTo7wnroNfglh6sQplRTslhQRKQM3k84oh87D0VHqTzoTzlKPHP0sIWdpklwaEEQ==} + engines: {node: '>=12'} + deprecated: vuetify-loader has been renamed to webpack-plugin-vuetify for Vuetify 3 + peerDependencies: + '@vue/compiler-sfc': ^3.2.6 + vuetify: ^3.0.0-alpha.11 + webpack: ^5.0.0 + + vuetify@3.7.11: + resolution: {integrity: sha512-50Z2SNwPXbkGmve4CwxOs4sySZGgLwQYIDsKx+coSrfIBqz8IyXgxRFQdrvgoehIwUjGTNqaPZymuK5rMFkfHA==} + engines: {node: ^12.20 || >=14.13} + peerDependencies: + typescript: '>=4.7' + vite-plugin-vuetify: '>=1.0.0' + vue: ^3.3.0 + webpack-plugin-vuetify: '>=2.0.0' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + webpack-plugin-vuetify: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yup@1.2.0: + resolution: {integrity: sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.28.6': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@braintree/sanitize-url@7.1.2': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.48.0)': + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.48.0': {} + + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@guolao/vue-monaco-editor@1.6.0(monaco-editor@0.52.2)(vue@3.3.4)': + dependencies: + '@monaco-editor/loader': 1.7.0 + monaco-editor: 0.52.2 + vue: 3.3.4 + vue-demi: 0.14.10(vue@3.3.4) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + + '@intlify/core-base@11.2.8': + dependencies: + '@intlify/message-compiler': 11.2.8 + '@intlify/shared': 11.2.8 + + '@intlify/message-compiler@11.2.8': + dependencies: + '@intlify/shared': 11.2.8 + source-map-js: 1.2.1 + + '@intlify/shared@11.2.8': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdi/font@7.2.96': {} + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@monaco-editor/loader@1.7.0': + dependencies: + state-local: 1.0.7 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgr/core@0.2.9': {} + + '@popperjs/core@2.11.8': {} + + '@remirror/core-constants@3.0.0': {} + + '@rushstack/eslint-patch@1.3.3': {} + + '@shikijs/core@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/monaco@3.22.0': + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/themes@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/types@3.22.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bubble-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-floating-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + tippy.js: 6.3.7 + + '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/pm@2.27.2': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6) + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + '@tiptap/starter-kit@2.1.7(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + transitivePeerDependencies: + - '@tiptap/pm' + + '@tiptap/vue-3@2.1.7(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(vue@3.3.4)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + vue: 3.3.4 + + '@types/chance@1.1.3': {} + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/dompurify@3.2.0': + dependencies: + dompurify: 3.3.1 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.8': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/node@20.19.32': + dependencies: + undici-types: 6.21.0 + + '@types/semver@7.7.1': {} + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6))(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + debug: 4.4.3 + eslint: 8.48.0 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.1.6) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + eslint: 8.48.0 + eslint-scope: 5.1.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@4.3.3(vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)': + dependencies: + vite: 4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vue: 3.3.4 + + '@volar/language-core@1.10.10': + dependencies: + '@volar/source-map': 1.10.10 + + '@volar/source-map@1.10.10': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.10.10': + dependencies: + '@volar/language-core': 1.10.10 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.27': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.27 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.3.4': + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/compiler-dom@3.5.27': + dependencies: + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/compiler-sfc@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.3.4': + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/devtools-api@6.6.4': {} + + '@vue/eslint-config-prettier@8.0.0(@types/eslint@9.6.1)(eslint@8.48.0)(prettier@3.0.2)': + dependencies: + eslint: 8.48.0 + eslint-config-prettier: 8.10.2(eslint@8.48.0) + eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.48.0))(eslint@8.48.0)(prettier@3.0.2) + prettier: 3.0.2 + transitivePeerDependencies: + - '@types/eslint' + + '@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.17.0(eslint@8.48.0))(eslint@8.48.0)(typescript@5.1.6)': + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.48.0)(typescript@5.1.6))(eslint@8.48.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.62.0(eslint@8.48.0)(typescript@5.1.6) + eslint: 8.48.0 + eslint-plugin-vue: 9.17.0(eslint@8.48.0) + vue-eslint-parser: 9.4.3(eslint@8.48.0) + optionalDependencies: + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@1.8.8(typescript@5.1.6)': + dependencies: + '@volar/language-core': 1.10.10 + '@volar/source-map': 1.10.10 + '@vue/compiler-dom': 3.5.27 + '@vue/reactivity': 3.5.27 + '@vue/shared': 3.5.27 + minimatch: 9.0.5 + muggle-string: 0.3.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.1.6 + + '@vue/reactivity-transform@3.3.4': + dependencies: + '@babel/parser': 7.29.0 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + + '@vue/reactivity@3.3.4': + dependencies: + '@vue/shared': 3.3.4 + + '@vue/reactivity@3.5.27': + dependencies: + '@vue/shared': 3.5.27 + + '@vue/runtime-core@3.3.4': + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/runtime-dom@3.3.4': + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.2.3 + + '@vue/server-renderer@3.3.4(vue@3.3.4)': + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + + '@vue/shared@3.3.4': {} + + '@vue/shared@3.5.27': {} + + '@vue/tsconfig@0.4.0': {} + + '@vue/typescript@1.8.8(typescript@5.1.6)': + dependencies: + '@volar/typescript': 1.10.10 + '@vue/language-core': 1.8.8(typescript@5.1.6) + transitivePeerDependencies: + - typescript + + '@vuetify/loader-shared@1.7.1(vue@3.3.4)(vuetify@3.7.11)': + dependencies: + find-cache-dir: 3.3.2 + upath: 2.0.1 + vue: 3.3.4 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@1.0.2)(vue@3.3.4) + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@2.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + apexcharts@3.42.0: + dependencies: + '@yr/monotone-cubic-spline': 1.0.3 + svg.draggable.js: 2.2.2 + svg.easing.js: 2.0.0 + svg.filter.js: 2.0.2 + svg.pathmorphing.js: 0.1.3 + svg.resize.js: 1.4.3 + svg.select.js: 3.0.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asynckit@0.4.0: {} + + axios-mock-adapter@1.22.0(axios@1.13.4): + dependencies: + axios: 1.13.4 + fast-deep-equal: 3.1.3 + is-buffer: 2.0.5 + + axios@1.13.4: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.9.19: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001769 + electron-to-chromium: 1.5.286 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsite@1.0.0: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001769: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chance@1.1.11: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.23 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.6 + + dayjs@1.11.19: {} + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decache@4.6.2: + dependencies: + callsite: 1.0.0 + + deep-is@0.1.4: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.286: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.0.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.2(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@8.48.0))(eslint@8.48.0)(prettier@3.0.2): + dependencies: + eslint: 8.48.0 + prettier: 3.0.2 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 8.10.2(eslint@8.48.0) + + eslint-plugin-vue@9.17.0(eslint@8.48.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + eslint: 8.48.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.4 + vue-eslint-parser: 9.4.3(eslint@8.48.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.48.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.48.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + event-source-polyfill@1.0.31: {} + + events@3.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-loader@6.2.0(webpack@5.105.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.105.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + hachure-fill@0.5.2: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + html-void-elements@3.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + immutable@4.3.7: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + interpret@1.4.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@2.0.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.19.32 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-md5@0.8.3: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + katex@0.16.28: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-runner@4.3.1: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-es@4.17.23: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + markdown-it-container@4.0.0: {} + + markdown-it-footnote@4.0.0: {} + + markdown-it-ins@4.0.0: {} + + markdown-it-mark@4.0.0: {} + + markdown-it-sub@2.0.0: {} + + markdown-it-sup@2.0.0: {} + + markdown-it-task-checkbox@1.0.6: {} + + markdown-it-ts@0.0.3: + dependencies: + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@16.4.2: {} + + markstream-vue@0.0.6(katex@0.16.28)(mermaid@11.12.2)(shiki@3.22.0)(stream-markdown@0.0.13(shiki@3.22.0))(stream-monaco@0.0.17(monaco-editor@0.52.2))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4): + dependencies: + '@floating-ui/dom': 1.7.5 + stream-markdown-parser: 0.0.59-beta.3 + vue: 3.3.4 + optionalDependencies: + katex: 0.16.28 + mermaid: 11.12.2 + shiki: 3.22.0 + stream-markdown: 0.0.13(shiki@3.22.0) + stream-monaco: 0.0.17(monaco-editor@0.52.2) + vue-i18n: 11.2.8(vue@3.3.4) + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.1 + katex: 0.16.28 + khroma: 2.1.0 + lodash-es: 4.17.23 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + monaco-editor@0.52.2: {} + + ms@2.1.3: {} + + muggle-string@0.3.1: {} + + nanoid@3.3.11: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.105.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.105.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + orderedmap@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-manager-detector@1.6.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pinia@2.1.6(typescript@5.1.6)(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + vue-demi: 0.14.10(vue@3.3.4) + optionalDependencies: + typescript: 5.1.6 + + pinyin-pro@3.28.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.0.2: {} + + property-expr@2.0.6: {} + + property-information@7.1.0: {} + + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.11.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.4: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-transform@1.11.0: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.6: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + querystring@0.2.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.6.2: + dependencies: + resolve: 1.22.11 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + remixicon@3.5.0: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + rope-sequence@1.3.4: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0): + dependencies: + neo-async: 2.6.2 + webpack: 5.105.0 + optionalDependencies: + sass: 1.66.1 + + sass@1.66.1: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.1 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + semver@6.3.1: {} + + semver@7.7.4: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + state-local@1.0.7: {} + + stream-markdown-parser@0.0.59-beta.3: + dependencies: + markdown-it-container: 4.0.0 + markdown-it-footnote: 4.0.0 + markdown-it-ins: 4.0.0 + markdown-it-mark: 4.0.0 + markdown-it-sub: 2.0.0 + markdown-it-sup: 2.0.0 + markdown-it-task-checkbox: 1.0.6 + markdown-it-ts: 0.0.3 + + stream-markdown@0.0.13(shiki@3.22.0): + dependencies: + shiki: 3.22.0 + + stream-monaco@0.0.17(monaco-editor@0.52.2): + dependencies: + '@shikijs/monaco': 3.22.0 + alien-signals: 2.0.8 + monaco-editor: 0.52.2 + shiki: 3.22.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + stylis@4.3.6: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg.draggable.js@2.2.2: + dependencies: + svg.js: 2.7.1 + + svg.easing.js@2.0.0: + dependencies: + svg.js: 2.7.1 + + svg.filter.js@2.0.2: + dependencies: + svg.js: 2.7.1 + + svg.js@2.7.1: {} + + svg.pathmorphing.js@0.1.3: + dependencies: + svg.js: 2.7.1 + + svg.resize.js@1.4.3: + dependencies: + svg.js: 2.7.1 + svg.select.js: 2.1.2 + + svg.select.js@2.1.2: + dependencies: + svg.js: 2.7.1 + + svg.select.js@3.0.1: + dependencies: + svg.js: 2.7.1 + + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + + tapable@2.3.0: {} + + terser-webpack-plugin@5.3.16(webpack@5.105.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.46.0 + webpack: 5.105.0 + + terser@5.46.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + tiny-case@1.0.3: {} + + tinyexec@1.0.2: {} + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toposort@2.0.2: {} + + trim-lines@3.0.1: {} + + ts-dedent@2.2.0: {} + + tslib@1.14.1: {} + + tsutils@3.21.0(typescript@5.1.6): + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@2.19.0: {} + + type-fest@4.41.0: {} + + typescript@5.1.6: {} + + uc.micro@2.1.0: {} + + ufo@1.6.3: {} + + undici-types@6.21.0: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + upath@2.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + vee-validate@4.11.3(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + type-fest: 4.41.0 + vue: 3.3.4 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-plugin-vuetify@1.0.2(vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11): + dependencies: + '@vuetify/loader-shared': 1.7.1(vue@3.3.4)(vuetify@3.7.11) + debug: 4.4.3 + upath: 2.0.1 + vite: 4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0) + vue: 3.3.4 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@1.0.2)(vue@3.3.4) + transitivePeerDependencies: + - supports-color + + vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.6 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 20.19.32 + fsevents: 2.3.3 + sass: 1.66.1 + terser: 5.46.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + vue-cli-plugin-vuetify@2.5.8(sass-loader@13.3.2(sass@1.66.1)(webpack@5.105.0))(vue@3.3.4)(vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0))(webpack@5.105.0): + dependencies: + null-loader: 4.0.1(webpack@5.105.0) + semver: 7.7.4 + shelljs: 0.8.5 + vue: 3.3.4 + webpack: 5.105.0 + optionalDependencies: + sass-loader: 13.3.2(sass@1.66.1)(webpack@5.105.0) + vuetify-loader: 2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0) + + vue-demi@0.14.10(vue@3.3.4): + dependencies: + vue: 3.3.4 + + vue-eslint-parser@9.4.3(eslint@8.48.0): + dependencies: + debug: 4.4.3 + eslint: 8.48.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + lodash: 4.17.21 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + vue-i18n@11.2.8(vue@3.3.4): + dependencies: + '@intlify/core-base': 11.2.8 + '@intlify/shared': 11.2.8 + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + + vue-router@4.2.4(vue@3.3.4): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.3.4 + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@1.8.8(typescript@5.1.6): + dependencies: + '@vue/language-core': 1.8.8(typescript@5.1.6) + '@vue/typescript': 1.8.8(typescript@5.1.6) + semver: 7.7.4 + typescript: 5.1.6 + + vue3-apexcharts@1.4.4(apexcharts@3.42.0)(vue@3.3.4): + dependencies: + apexcharts: 3.42.0 + vue: 3.3.4 + + vue3-print-nb@0.1.4: + dependencies: + vue: 3.3.4 + + vue@3.3.4: + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + + vuetify-loader@2.0.0-alpha.9(@vue/compiler-sfc@3.3.4)(vue@3.3.4)(vuetify@3.7.11)(webpack@5.105.0): + dependencies: + '@vue/compiler-sfc': 3.3.4 + '@vuetify/loader-shared': 1.7.1(vue@3.3.4)(vuetify@3.7.11) + decache: 4.6.2 + file-loader: 6.2.0(webpack@5.105.0) + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + null-loader: 4.0.1(webpack@5.105.0) + querystring: 0.2.1 + upath: 2.0.1 + vuetify: 3.7.11(typescript@5.1.6)(vite-plugin-vuetify@1.0.2)(vue@3.3.4) + webpack: 5.105.0 + transitivePeerDependencies: + - vue + + vuetify@3.7.11(typescript@5.1.6)(vite-plugin-vuetify@1.0.2)(vue@3.3.4): + dependencies: + vue: 3.3.4 + optionalDependencies: + typescript: 5.1.6 + vite-plugin-vuetify: 1.0.2(vite@4.4.9(@types/node@20.19.32)(sass@1.66.1)(terser@5.46.0))(vue@3.3.4)(vuetify@3.7.11) + + w3c-keyname@2.2.8: {} + + watchpack@2.5.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webpack-sources@3.3.3: {} + + webpack@5.105.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.19.0 + es-module-lexer: 2.0.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(webpack@5.105.0) + watchpack: 2.5.1 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + yocto-queue@0.1.0: {} + + yup@1.2.0: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + + zwitch@2.0.4: {} diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000000..98db5d3ea1 --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,56 @@ +# AstrBot Desktop (Electron) + +This document describes how to build the Electron desktop app from source. + +## What This Package Contains + +- Electron desktop shell (`desktop/main.js`) +- Bundled WebUI static files (`desktop/resources/webui`) +- App assets (`desktop/assets`) + +Current behavior: + +- Packaging is frontend-only. +- Backend is not bundled in the installer/package. +- If backend is unavailable on app startup, the app will show a startup failure dialog and exit. + +## Prerequisites + +- Python environment ready in repository root (`uv` available) +- Node.js and npm available +- `pnpm` available for WebUI build + +## Build From Scratch + +Run commands from repository root: + +```bash +uv sync +pnpm --dir dashboard install +pnpm --dir dashboard build +npm --prefix desktop ci +npm --prefix desktop run dist:full +``` + +Output files are generated under: + +- `desktop/dist/` + +## Local Run (Development) + +Start backend first: + +```bash +uv run main.py +``` + +Start Electron shell: + +```bash +npm --prefix desktop run dev +``` + +## Notes + +- `dist:full` currently runs WebUI build preparation + Electron packaging. +- If you need backend built-in packaging again, you need to restore backend resource build and packaging config. From dc2dbe8493b0e6f4d45080d67e87977fba6d8592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 00:35:05 +0900 Subject: [PATCH 03/24] fix: track desktop lockfile for npm ci --- .gitignore | 1 + desktop/package-lock.json | 4102 +++++++++++++++++++++++++++++++++++++ 2 files changed, 4103 insertions(+) create mode 100644 desktop/package-lock.json diff --git a/.gitignore b/.gitignore index 120747f777..0a48cb62a3 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ package-lock.json package.json yarn.lock !desktop/package.json +!desktop/package-lock.json !desktop/resources/backend/.gitkeep !desktop/resources/webui/.gitkeep diff --git a/desktop/package-lock.json b/desktop/package-lock.json new file mode 100644 index 0000000000..bdcbbafc40 --- /dev/null +++ b/desktop/package-lock.json @@ -0,0 +1,4102 @@ +{ + "name": "astrbot-desktop", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "astrbot-desktop", + "version": "0.1.0", + "devDependencies": { + "electron": "^30.0.0", + "electron-builder": "^24.13.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.32.tgz", + "integrity": "sha512-Ez8QE4DMfhjjTsES9K2dwfV258qBui7qxUsoaixZDiTzbde4U12e1pXGNu/ECsUIOi5/zoCxAQxIhQnaUQ2VvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-30.5.1.tgz", + "integrity": "sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} From a99f3ab7084cbf4bfbe86f2f09a618755b624d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 00:56:14 +0900 Subject: [PATCH 04/24] fix: allow custom install directory for windows installer --- desktop/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/desktop/package.json b/desktop/package.json index a53d7ffaf9..d6575a2c60 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -56,6 +56,10 @@ "nsis", "zip" ] + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true } } } From f0cf0f3fda13d4c7de570002e0b867f1365d11e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 11:36:09 +0900 Subject: [PATCH 05/24] chore: migrate desktop workflow to pnpm --- .gitignore | 2 +- README.md | 2 +- README_en.md | 2 +- desktop/README.md | 25 +- desktop/package-lock.json | 4102 ------------------------------------- desktop/package.json | 12 +- desktop/pnpm-lock.yaml | 2282 +++++++++++++++++++++ 7 files changed, 2314 insertions(+), 4113 deletions(-) delete mode 100644 desktop/package-lock.json create mode 100644 desktop/pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index 0a48cb62a3..755e4c90ae 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ tests/astrbot_plugin_openai # Dashboard dashboard/node_modules/ dashboard/dist/ +.pnpm-store/ desktop/node_modules/ desktop/dist/ desktop/out/ @@ -43,7 +44,6 @@ package-lock.json package.json yarn.lock !desktop/package.json -!desktop/package-lock.json !desktop/resources/backend/.gitkeep !desktop/resources/webui/.gitkeep diff --git a/README.md b/README.md index 2def6ca9be..135027ac00 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ uv run main.py #### 桌面端 Electron 打包 -桌面端(前端-only 打包)构建流程请参阅:[`desktop/README.md`](desktop/README.md)。 +桌面端(前端-only 打包,`pnpm` 工作流)构建流程请参阅:[`desktop/README.md`](desktop/README.md)。 ## 支持的消息平台 diff --git a/README_en.md b/README_en.md index 60d6fa1e4b..2a0000e471 100644 --- a/README_en.md +++ b/README_en.md @@ -119,7 +119,7 @@ Or refer to the official documentation: [Deploy AstrBot from Source](https://ast #### Desktop Electron Build -For desktop build steps (frontend-only packaging), see [`desktop/README.md`](desktop/README.md). +For desktop build steps (frontend-only packaging, `pnpm` workflow), see [`desktop/README.md`](desktop/README.md). ## Supported Messaging Platforms diff --git a/desktop/README.md b/desktop/README.md index 98db5d3ea1..be4b05f690 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -17,8 +17,13 @@ Current behavior: ## Prerequisites - Python environment ready in repository root (`uv` available) -- Node.js and npm available -- `pnpm` available for WebUI build +- Node.js available +- `pnpm` available + +Desktop dependency management uses `pnpm` with lockfile: + +- `desktop/pnpm-lock.yaml` +- `pnpm --dir desktop install --frozen-lockfile` ## Build From Scratch @@ -28,8 +33,8 @@ Run commands from repository root: uv sync pnpm --dir dashboard install pnpm --dir dashboard build -npm --prefix desktop ci -npm --prefix desktop run dist:full +pnpm --dir desktop install --frozen-lockfile +pnpm --dir desktop run dist:full ``` Output files are generated under: @@ -47,10 +52,20 @@ uv run main.py Start Electron shell: ```bash -npm --prefix desktop run dev +pnpm --dir desktop run dev ``` ## Notes - `dist:full` currently runs WebUI build preparation + Electron packaging. - If you need backend built-in packaging again, you need to restore backend resource build and packaging config. + +## Troubleshooting + +If Electron download times out on restricted networks, configure mirrors before install: + +```bash +export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/" +export ELECTRON_BUILDER_BINARIES_MIRROR="https://npmmirror.com/mirrors/electron-builder-binaries/" +pnpm --dir desktop install --frozen-lockfile +``` diff --git a/desktop/package-lock.json b/desktop/package-lock.json deleted file mode 100644 index bdcbbafc40..0000000000 --- a/desktop/package-lock.json +++ /dev/null @@ -1,4102 +0,0 @@ -{ - "name": "astrbot-desktop", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "astrbot-desktop", - "version": "0.1.0", - "devDependencies": { - "electron": "^30.0.0", - "electron-builder": "^24.13.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", - "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", - "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.32.tgz", - "integrity": "sha512-Ez8QE4DMfhjjTsES9K2dwfV258qBui7qxUsoaixZDiTzbde4U12e1pXGNu/ECsUIOi5/zoCxAQxIhQnaUQ2VvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true, - "license": "MIT" - }, - "node_modules/app-builder-lib": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", - "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.2.1", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.5.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "electron-publish": "24.13.1", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "dmg-builder": "24.13.3", - "electron-builder-squirrel-windows": "24.13.3" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builder-util": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", - "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.4", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", - "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dmg-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", - "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-30.5.1.tgz", - "integrity": "sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", - "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", - "chalk": "^4.1.2", - "dmg-builder": "24.13.3", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder-squirrel-windows": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", - "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "24.13.3", - "archiver": "^5.3.1", - "builder-util": "24.13.1", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-publish": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", - "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/isbinaryfile": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", - "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - } -} diff --git a/desktop/package.json b/desktop/package.json index d6575a2c60..ce16dfbce7 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -5,15 +5,21 @@ "private": true, "main": "main.js", "author": "AstrBot", + "packageManager": "pnpm@10.28.2", + "pnpm": { + "onlyBuiltDependencies": [ + "electron" + ] + }, "scripts": { "dev": "electron .", "start": "electron .", "sync:version": "node scripts/sync-version.mjs", "build:webui": "node scripts/prepare-webui.mjs", "build:backend": "node scripts/build-backend.mjs", - "dist:full": "npm run build:webui && npm run dist", - "pack": "npm run sync:version && electron-builder --dir", - "dist": "npm run sync:version && electron-builder" + "dist:full": "pnpm run build:webui && pnpm run dist", + "pack": "pnpm run sync:version && electron-builder --dir", + "dist": "pnpm run sync:version && electron-builder" }, "devDependencies": { "electron": "^30.0.0", diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml new file mode 100644 index 0000000000..f91a21a863 --- /dev/null +++ b/desktop/pnpm-lock.yaml @@ -0,0 +1,2282 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + electron: + specifier: ^30.0.0 + version: 30.5.1 + electron-builder: + specifier: ^24.13.0 + version: 24.13.3(electron-builder-squirrel-windows@24.13.3) + +packages: + + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@2.2.1': + resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.0.5': + resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.5.1': + resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} + engines: {node: '>=8.6'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.19.33': + resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} + + '@types/node@25.2.2': + resolution: {integrity: sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.13.3: + resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.4: + resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} + engines: {node: '>=12.0.0'} + + builder-util@24.13.1: + resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dmg-builder@24.13.3: + resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@24.13.3: + resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + + electron-builder@24.13.3: + resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.13.1: + resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} + + electron@30.5.1: + resolution: {integrity: sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + +snapshots: + + 7zip-bin@5.2.0: {} + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.2.1': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.0.5': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.5.1': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.23 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 20.19.33 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 25.2.2 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.19.33 + + '@types/ms@2.1.0': {} + + '@types/node@20.19.33': + dependencies: + undici-types: 6.21.0 + + '@types/node@25.2.2': + dependencies: + undici-types: 7.16.0 + + '@types/plist@3.0.5': + dependencies: + '@types/node': 25.2.2 + xmlbuilder: 15.1.1 + optional: true + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.19.33 + + '@types/verror@1.10.11': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.19.33 + optional: true + + '@xmldom/xmldom@0.8.11': {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.2.1 + '@electron/osx-sign': 1.0.5 + '@electron/universal': 1.5.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chromium-pickle-js: 0.2.0 + debug: 4.4.3 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + ejs: 3.1.10 + electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) + electron-publish: 24.13.1 + form-data: 4.0.5 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.7 + js-yaml: 4.1.1 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.4 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + assert-plus@1.0.0: + optional: true + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builder-util-runtime@9.2.4: + dependencies: + debug: 4.4.3 + sax: 1.4.4 + transitivePeerDependencies: + - supports-color + + builder-util@24.13.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.1 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.5.0 + typescript: 5.9.3 + + core-util-is@1.0.2: + optional: true + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: + optional: true + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 + + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + archiver: 5.3.2 + builder-util: 24.13.1 + fs-extra: 10.1.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@24.13.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron@30.5.1: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.19.33 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es6-error@4.1.1: + optional: true + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: + optional: true + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.4 + serialize-error: 7.0.1 + optional: true + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-fullwidth-code-point@3.0.0: {} + + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.flatten@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.union@4.6.0: {} + + lodash@4.17.23: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + node-addon-api@1.7.2: + optional: true + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-cancelable@2.1.1: {} + + package-json-from-dist@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + quick-lru@5.1.1: {} + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.4: {} + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.4: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.4 + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + + stat-mode@1.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + type-fest@0.13.1: + optional: true + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + undici-types@7.16.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 From 78fb066d10cd723b26c44ecb6bcb8d99dae06575 Mon Sep 17 00:00:00 2001 From: zouyonghe <1259085392z@gmail.com> Date: Sun, 8 Feb 2026 11:46:59 +0900 Subject: [PATCH 06/24] fix(desktop): build AppImage only on Linux --- desktop/package.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/desktop/package.json b/desktop/package.json index ce16dfbce7..d68e150380 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "astrbot-desktop", - "version": "4.3.2", + "version": "4.14.5", "description": "AstrBot desktop wrapper", "private": true, "main": "main.js", @@ -50,6 +50,12 @@ "directories": { "buildResources": "assets" }, + "linux": { + "target": [ + "AppImage" + ], + "category": "Utility" + }, "mac": { "target": [ "dmg", From 44fdafb6219161e0063693a9d4c728ef2149a7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 13:46:49 +0900 Subject: [PATCH 07/24] fix(desktop): harden packaged startup and backend bundling --- README.md | 2 +- README_en.md | 2 +- desktop/README.md | 36 +++- desktop/main.js | 268 +++++++++++++++++++++++++----- desktop/package.json | 8 +- desktop/scripts/build-backend.mjs | 14 ++ 6 files changed, 278 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 135027ac00..8e6ae69736 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ uv run main.py #### 桌面端 Electron 打包 -桌面端(前端-only 打包,`pnpm` 工作流)构建流程请参阅:[`desktop/README.md`](desktop/README.md)。 +桌面端(Electron 打包,`pnpm` 工作流)构建流程请参阅:[`desktop/README.md`](desktop/README.md)。 ## 支持的消息平台 diff --git a/README_en.md b/README_en.md index 2a0000e471..2a9bc41db6 100644 --- a/README_en.md +++ b/README_en.md @@ -119,7 +119,7 @@ Or refer to the official documentation: [Deploy AstrBot from Source](https://ast #### Desktop Electron Build -For desktop build steps (frontend-only packaging, `pnpm` workflow), see [`desktop/README.md`](desktop/README.md). +For desktop build steps (Electron packaging, `pnpm` workflow), see [`desktop/README.md`](desktop/README.md). ## Supported Messaging Platforms diff --git a/desktop/README.md b/desktop/README.md index be4b05f690..a67ac6e2d1 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -10,9 +10,9 @@ This document describes how to build the Electron desktop app from source. Current behavior: -- Packaging is frontend-only. -- Backend is not bundled in the installer/package. -- If backend is unavailable on app startup, the app will show a startup failure dialog and exit. +- Backend executable is bundled in the installer/package. +- App startup checks backend availability and auto-starts bundled backend when needed. +- Runtime data is stored under `~/.astrbot` by default, not as a full AstrBot source project. ## Prerequisites @@ -57,11 +57,37 @@ pnpm --dir desktop run dev ## Notes -- `dist:full` currently runs WebUI build preparation + Electron packaging. -- If you need backend built-in packaging again, you need to restore backend resource build and packaging config. +- `dist:full` runs WebUI build + backend build + Electron packaging. +- In packaged app mode, backend data root defaults to `~/.astrbot` (can be overridden by `ASTRBOT_ROOT`). +- Backend build uses `uv run --with pyinstaller ...`, so no manual `PyInstaller` install is required. + +## Runtime Directory Layout + +By default (`ASTRBOT_ROOT` not set), packaged desktop app uses this layout: + +```text +~/.astrbot/ + data/ + config/ # Main configuration + plugins/ # Installed plugins + plugin_data/ # Plugin persistent data + temp/ # Runtime temp files + skills/ # Skill-related runtime data + knowledge_base/ # Knowledge base files + backups/ # Backup data +``` + +The app does not store a full AstrBot source tree in home directory. ## Troubleshooting +Runtime logs: + +- Backend stdout/stderr is written to `~/.astrbot/logs/backend.log` in packaged app mode. +- If UI stays blank, check that log first and then retry launching the app. +- Packaged app defaults to `ASTRBOT_BACKEND_TIMEOUT_MS=0` (wait until backend is reachable). +- Set `ASTRBOT_BACKEND_TIMEOUT_MS` to a positive number only if you need an explicit startup timeout. + If Electron download times out on restricted networks, configure mirrors before install: ```bash diff --git a/desktop/main.js b/desktop/main.js index dbc36f56b1..d0077b3843 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -1,6 +1,7 @@ 'use strict'; const fs = require('fs'); +const os = require('os'); const path = require('path'); const { app, @@ -18,8 +19,17 @@ const backendUrl = normalizeUrl( process.env.ASTRBOT_BACKEND_URL || 'http://127.0.0.1:6185/', ); const backendAutoStart = process.env.ASTRBOT_BACKEND_AUTO_START !== '0'; -const backendTimeoutMs = Number.parseInt( - process.env.ASTRBOT_BACKEND_TIMEOUT_MS || '20000', +const defaultBackendTimeoutMs = app.isPackaged ? 0 : 20000; +const backendTimeoutMsParsed = Number.parseInt( + process.env.ASTRBOT_BACKEND_TIMEOUT_MS || `${defaultBackendTimeoutMs}`, + 10, +); +const backendTimeoutMs = + Number.isFinite(backendTimeoutMsParsed) && backendTimeoutMsParsed >= 0 + ? backendTimeoutMsParsed + : defaultBackendTimeoutMs; +const dashboardTimeoutMs = Number.parseInt( + process.env.ASTRBOT_DASHBOARD_TIMEOUT_MS || '20000', 10, ); @@ -28,6 +38,26 @@ let tray = null; let isQuitting = false; let backendProcess = null; let backendConfig = null; +let backendLogFd = null; +let backendLastExitReason = null; +let backendStartupFailureReason = null; + +app.commandLine.appendSwitch('disable-http-cache'); + +function getElectronLogPath() { + const rootDir = + process.env.ASTRBOT_ROOT || backendConfig?.rootDir || app.getPath('userData'); + return path.join(rootDir, 'logs', 'electron.log'); +} + +function logElectron(message) { + const logPath = getElectronLogPath(); + ensureDir(path.dirname(logPath)); + const line = `[${new Date().toISOString()}] ${message}\n`; + try { + fs.appendFileSync(logPath, line, 'utf8'); + } catch {} +} function getAssetPath(filename) { if (app.isPackaged) { @@ -61,16 +91,6 @@ function normalizeUrl(value) { } } -function shellQuote(value) { - if (!value) { - return ''; - } - if (process.platform === 'win32') { - return `"${value.replace(/"/g, '\\"')}"`; - } - return `'${value.replace(/'/g, "'\\''")}'`; -} - function ensureDir(value) { if (!value) { return; @@ -81,6 +101,16 @@ function ensureDir(value) { fs.mkdirSync(value, { recursive: true }); } +function closeBackendLogFd() { + if (backendLogFd === null) { + return; + } + try { + fs.closeSync(backendLogFd); + } catch {} + backendLogFd = null; +} + function getPackagedBackendPath() { if (!app.isPackaged) { return null; @@ -107,39 +137,53 @@ function resolveBackendRoot() { if (!app.isPackaged) { return null; } - return app.getPath('userData'); + return path.join(os.homedir(), '.astrbot'); } function resolveBackendCwd() { if (!app.isPackaged) { return path.resolve(__dirname, '..'); } - return app.getPath('userData'); + return resolveBackendRoot(); } -function buildDefaultBackendCmd(webuiDir) { +function buildDefaultBackendLaunch(webuiDir) { if (app.isPackaged) { const packagedBackend = getPackagedBackendPath(); if (!packagedBackend) { return null; } - let cmd = shellQuote(packagedBackend); + const args = []; if (webuiDir) { - cmd += ` --webui-dir ${shellQuote(webuiDir)}`; + args.push('--webui-dir', webuiDir); } - return cmd; + return { + cmd: packagedBackend, + args, + shell: false, + }; } - let cmd = 'uv run main.py'; + const args = ['run', 'main.py']; if (webuiDir) { - cmd += ` --webui-dir ${shellQuote(webuiDir)}`; + args.push('--webui-dir', webuiDir); } - return cmd; + return { + cmd: 'uv', + args, + shell: process.platform === 'win32', + }; } function resolveBackendConfig() { const webuiDir = resolveWebuiDir(); - const cmd = - process.env.ASTRBOT_BACKEND_CMD || buildDefaultBackendCmd(webuiDir); + const customCmd = process.env.ASTRBOT_BACKEND_CMD; + const launch = customCmd + ? { + cmd: customCmd, + args: [], + shell: true, + } + : buildDefaultBackendLaunch(webuiDir); const cwd = process.env.ASTRBOT_BACKEND_CWD || resolveBackendCwd(); const rootDir = process.env.ASTRBOT_ROOT || resolveBackendRoot(); ensureDir(cwd); @@ -147,7 +191,9 @@ function resolveBackendConfig() { ensureDir(rootDir); } return { - cmd, + cmd: launch ? launch.cmd : null, + args: launch ? launch.args : [], + shell: launch ? launch.shell : true, cwd, webuiDir, rootDir, @@ -162,8 +208,11 @@ async function pingBackend(timeoutMs = 800) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), timeoutMs); try { - const response = await fetch(backendUrl, { signal: controller.signal }); - return response.ok; + await fetch(backendUrl, { + signal: controller.signal, + redirect: 'manual', + }); + return true; } catch { return false; } finally { @@ -171,15 +220,28 @@ async function pingBackend(timeoutMs = 800) { } } -async function waitForBackend(maxWaitMs = 20000) { +async function waitForBackend(maxWaitMs = 0, failOnProcessExit = false) { const start = Date.now(); - while (Date.now() - start < maxWaitMs) { + while (true) { if (await pingBackend()) { - return true; + return { ok: true, reason: null }; + } + if (failOnProcessExit && !backendProcess) { + return { + ok: false, + reason: + backendLastExitReason || + 'Backend process exited before becoming reachable.', + }; + } + if (maxWaitMs > 0 && Date.now() - start >= maxWaitMs) { + return { + ok: false, + reason: `Timed out after ${maxWaitMs}ms waiting for backend startup.`, + }; } await delay(600); } - return false; } function startBackend() { @@ -192,22 +254,65 @@ function startBackend() { if (!backendConfig.cmd) { return; } + backendLastExitReason = null; const env = { ...process.env, PYTHONUNBUFFERED: '1', }; if (backendConfig.rootDir) { env.ASTRBOT_ROOT = backendConfig.rootDir; + const logsDir = path.join(backendConfig.rootDir, 'logs'); + ensureDir(logsDir); + const logPath = path.join(logsDir, 'backend.log'); + try { + backendLogFd = fs.openSync(logPath, 'a'); + } catch { + backendLogFd = null; + } } - backendProcess = spawn(backendConfig.cmd, { + backendProcess = spawn(backendConfig.cmd, backendConfig.args || [], { cwd: backendConfig.cwd, env, - shell: true, - stdio: 'ignore', + shell: backendConfig.shell, + stdio: + backendLogFd === null + ? 'ignore' + : ['ignore', backendLogFd, backendLogFd], windowsHide: true, }); - backendProcess.on('exit', () => { + if (backendLogFd !== null) { + const launchLine = [backendConfig.cmd, ...(backendConfig.args || [])] + .map((item) => JSON.stringify(item)) + .join(' '); + try { + fs.writeSync( + backendLogFd, + `[${new Date().toISOString()}] [Electron] Start backend ${launchLine}\n`, + ); + } catch {} + } + + backendProcess.on('error', (error) => { + backendLastExitReason = + error instanceof Error ? error.message : String(error); + if (backendLogFd !== null) { + try { + fs.writeSync( + backendLogFd, + `[${new Date().toISOString()}] [Electron] Backend spawn error: ${ + error instanceof Error ? error.message : String(error) + }\n`, + ); + } catch {} + } + closeBackendLogFd(); + backendProcess = null; + }); + + backendProcess.on('exit', (code, signal) => { + backendLastExitReason = `Backend process exited (code=${code ?? 'null'}, signal=${signal ?? 'null'}).`; + closeBackendLogFd(); backendProcess = null; }); } @@ -224,9 +329,33 @@ function stopBackend() { } else { backendProcess.kill('SIGTERM'); } + closeBackendLogFd(); backendProcess = null; } +async function loadDashboard(maxWaitMs = 20000) { + if (!mainWindow) { + return false; + } + const loadUrl = new URL(backendUrl); + loadUrl.searchParams.set('_electron_ts', `${Date.now()}`); + const start = Date.now(); + let lastError = null; + while (maxWaitMs <= 0 || Date.now() - start < maxWaitMs) { + try { + await mainWindow.loadURL(loadUrl.toString()); + return true; + } catch (error) { + lastError = error; + await delay(600); + } + } + if (lastError) { + throw lastError; + } + throw new Error(`Timed out loading ${backendUrl}`); +} + function createWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -244,10 +373,6 @@ function createWindow() { }, }); - mainWindow.once('ready-to-show', () => { - mainWindow.show(); - }); - mainWindow.on('close', (event) => { if (isQuitting) { return; @@ -269,6 +394,39 @@ function createWindow() { return { action: 'deny' }; }); + mainWindow.webContents.on( + 'did-fail-load', + (_event, errorCode, errorDescription, validatedURL, isMainFrame) => { + if (!isMainFrame) { + return; + } + logElectron( + `did-fail-load main-frame code=${errorCode} desc=${errorDescription} url=${validatedURL}`, + ); + }, + ); + + mainWindow.webContents.on('did-finish-load', () => { + logElectron(`did-finish-load url=${mainWindow.webContents.getURL()}`); + }); + + mainWindow.webContents.on('render-process-gone', (_event, details) => { + logElectron( + `render-process-gone reason=${details.reason} exitCode=${details.exitCode}`, + ); + }); + + mainWindow.webContents.on( + 'console-message', + (_event, level, message, line, sourceId) => { + if (level >= 2) { + logElectron( + `renderer-console level=${level} source=${sourceId}:${line} message=${message}`, + ); + } + }, + ); + return mainWindow; } @@ -343,6 +501,7 @@ function toggleWindow() { } async function ensureBackend() { + backendStartupFailureReason = null; if (!backendConfig) { backendConfig = resolveBackendConfig(); } @@ -351,10 +510,17 @@ async function ensureBackend() { return true; } if (!backendAutoStart || !backendConfig.cmd) { + backendStartupFailureReason = + 'Backend auto-start is disabled or backend command is not configured.'; return false; } startBackend(); - return waitForBackend(backendTimeoutMs); + const waitResult = await waitForBackend(backendTimeoutMs, true); + if (!waitResult.ok) { + backendStartupFailureReason = waitResult.reason; + return false; + } + return true; } app.setAppUserModelId('com.astrbot.desktop'); @@ -383,12 +549,24 @@ app.whenReady().then(async () => { const ready = await ensureBackend(); if (!ready) { + const backendLogPath = backendConfig?.rootDir + ? path.join(backendConfig.rootDir, 'logs', 'backend.log') + : null; + const detailLines = []; + if (backendStartupFailureReason) { + detailLines.push(`Reason: ${backendStartupFailureReason}`); + } + detailLines.push( + 'Please start the backend at http://127.0.0.1:6185 and relaunch AstrBot.', + ); + if (backendLogPath) { + detailLines.push(`Backend log: ${backendLogPath}`); + } await dialog.showMessageBox({ type: 'error', title: 'AstrBot startup failed', message: 'AstrBot backend is not reachable.', - detail: - 'Please start the backend at http://127.0.0.1:6185 and relaunch AstrBot.', + detail: detailLines.join('\n'), }); isQuitting = true; app.quit(); @@ -399,14 +577,18 @@ app.whenReady().then(async () => { createTray(); try { - await mainWindow.loadURL(backendUrl); + await mainWindow.webContents.session.clearCache(); + await loadDashboard(dashboardTimeoutMs); + showWindow(); } catch (error) { - dialog.showMessageBox({ + await dialog.showMessageBox({ type: 'error', title: 'Failed to load AstrBot', message: 'Unable to load the AstrBot dashboard.', detail: error instanceof Error ? error.message : String(error), }); + isQuitting = true; + app.quit(); } }); diff --git a/desktop/package.json b/desktop/package.json index d68e150380..adb2e743d9 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "astrbot-desktop", - "version": "4.14.5", + "version": "4.3.2", "description": "AstrBot desktop wrapper", "private": true, "main": "main.js", @@ -17,7 +17,7 @@ "sync:version": "node scripts/sync-version.mjs", "build:webui": "node scripts/prepare-webui.mjs", "build:backend": "node scripts/build-backend.mjs", - "dist:full": "pnpm run build:webui && pnpm run dist", + "dist:full": "pnpm run build:webui && pnpm run build:backend && pnpm run dist", "pack": "pnpm run sync:version && electron-builder --dir", "dist": "pnpm run sync:version && electron-builder" }, @@ -30,6 +30,10 @@ "productName": "AstrBot", "icon": "assets/icon.png", "extraResources": [ + { + "from": "resources/backend", + "to": "backend" + }, { "from": "resources/webui", "to": "webui" diff --git a/desktop/scripts/build-backend.mjs b/desktop/scripts/build-backend.mjs index 51c035b8e2..6c16df39cb 100644 --- a/desktop/scripts/build-backend.mjs +++ b/desktop/scripts/build-backend.mjs @@ -6,9 +6,21 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.resolve(__dirname, '..', '..'); const outputDir = path.join(rootDir, 'desktop', 'resources', 'backend'); const workDir = path.join(rootDir, 'desktop', 'resources', '.pyinstaller'); +const dataSeparator = process.platform === 'win32' ? ';' : ':'; +const kbStopwordsSrc = path.join( + rootDir, + 'astrbot', + 'core', + 'knowledge_base', + 'retrieval', + 'hit_stopwords.txt', +); +const kbStopwordsDest = 'astrbot/core/knowledge_base/retrieval'; const args = [ 'run', + '--with', + 'pyinstaller', 'python', '-m', 'PyInstaller', @@ -19,6 +31,8 @@ const args = [ 'astrbot-backend', '--collect-all', 'aiosqlite', + '--add-data', + `${kbStopwordsSrc}${dataSeparator}${kbStopwordsDest}`, '--distpath', outputDir, '--workpath', From 43a342041821c202656c94080915f38e54ff8821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 14:32:58 +0900 Subject: [PATCH 08/24] fix(desktop): adapt packaged restart and plugin dependency flow --- astrbot/core/updator.py | 10 +- astrbot/core/utils/astrbot_path.py | 6 + astrbot/core/utils/pip_installer.py | 107 +++++++++++++----- .../components/shared/WaitingForRestart.vue | 34 ++++-- dashboard/src/stores/common.js | 10 +- desktop/README.md | 1 + desktop/scripts/build-backend.mjs | 4 + main.py | 24 +++- 8 files changed, 145 insertions(+), 51 deletions(-) diff --git a/astrbot/core/updator.py b/astrbot/core/updator.py index 0a7116a0de..e993cdc8b6 100644 --- a/astrbot/core/updator.py +++ b/astrbot/core/updator.py @@ -57,14 +57,20 @@ def _reboot(self, delay: int = 3): py = sys.executable try: - if "astrbot" in os.path.basename(sys.argv[0]): # 兼容cli + # 仅 CLI 模式走 `python -m astrbot.cli.__main__`, + # 打包后的后端可执行文件需要直接 exec 自身。 + if os.environ.get("ASTRBOT_CLI") == "1": if os.name == "nt": args = [f'"{arg}"' if " " in arg else arg for arg in sys.argv[1:]] else: args = sys.argv[1:] os.execl(sys.executable, py, "-m", "astrbot.cli.__main__", *args) else: - os.execl(sys.executable, py, *sys.argv) + if getattr(sys, "frozen", False): + # Frozen executable should not receive argv[0] as a positional argument. + os.execl(sys.executable, py, *sys.argv[1:]) + else: + os.execl(sys.executable, py, *sys.argv) except Exception as e: logger.error(f"重启失败({py}, {e}),请尝试手动重启。") raise e diff --git a/astrbot/core/utils/astrbot_path.py b/astrbot/core/utils/astrbot_path.py index 1acf0d268f..5ddf98dd29 100644 --- a/astrbot/core/utils/astrbot_path.py +++ b/astrbot/core/utils/astrbot_path.py @@ -10,6 +10,7 @@ WebChat 数据目录路径:固定为数据目录下的 webchat 目录 临时文件目录路径:固定为数据目录下的 temp 目录 Skills 目录路径:固定为数据目录下的 skills 目录 +第三方依赖目录路径:固定为数据目录下的 site-packages 目录 """ import os @@ -69,6 +70,11 @@ def get_astrbot_skills_path() -> str: return os.path.realpath(os.path.join(get_astrbot_data_path(), "skills")) +def get_astrbot_site_packages_path() -> str: + """获取Astrbot第三方依赖目录路径""" + return os.path.realpath(os.path.join(get_astrbot_data_path(), "site-packages")) + + def get_astrbot_knowledge_base_path() -> str: """获取Astrbot知识库根目录路径""" return os.path.realpath(os.path.join(get_astrbot_data_path(), "knowledge_base")) diff --git a/astrbot/core/utils/pip_installer.py b/astrbot/core/utils/pip_installer.py index 663afc0813..58b8a83e7b 100644 --- a/astrbot/core/utils/pip_installer.py +++ b/astrbot/core/utils/pip_installer.py @@ -1,8 +1,14 @@ import asyncio +import contextlib +import importlib +import io import locale import logging +import os import sys +from astrbot.core.utils.astrbot_path import get_astrbot_site_packages_path + logger = logging.getLogger("astrbot") @@ -24,6 +30,25 @@ def _robust_decode(line: bytes) -> str: return line.decode("utf-8", errors="replace").strip() +def _is_frozen_runtime() -> bool: + return bool(getattr(sys, "frozen", False)) + + +def _get_pip_main(): + try: + from pip._internal.cli.main import main as pip_main + except ImportError: + from pip import main as pip_main + return pip_main + + +def _run_pip_main_with_output(pip_main, args: list[str]) -> tuple[int, str]: + stream = io.StringIO() + with contextlib.redirect_stdout(stream), contextlib.redirect_stderr(stream): + result_code = pip_main(args) + return result_code, stream.getvalue() + + class PipInstaller: def __init__(self, pip_install_arg: str, pypi_index_url: str | None = None): self.pip_install_arg = pip_install_arg @@ -45,37 +70,59 @@ async def install( args.extend(["--trusted-host", "mirrors.aliyun.com", "-i", index_url]) + target_site_packages = None + if _is_frozen_runtime(): + target_site_packages = get_astrbot_site_packages_path() + os.makedirs(target_site_packages, exist_ok=True) + args.extend(["--target", target_site_packages]) + if self.pip_install_arg: args.extend(self.pip_install_arg.split()) logger.info(f"Pip 包管理器: pip {' '.join(args)}") - try: - process = await asyncio.create_subprocess_exec( - sys.executable, - "-m", - "pip", - *args, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.STDOUT, - ) - - assert process.stdout is not None - async for line in process.stdout: - logger.info(_robust_decode(line)) - - await process.wait() - - if process.returncode != 0: - raise Exception(f"安装失败,错误码:{process.returncode}") - except FileNotFoundError: - # 没有 pip - from pip import main as pip_main - - result_code = await asyncio.to_thread(pip_main, args) - - # 清除 pip.main 导致的多余的 logging handlers - for handler in logging.root.handlers[:]: - logging.root.removeHandler(handler) - - if result_code != 0: - raise Exception(f"安装失败,错误码:{result_code}") + result_code = None + if _is_frozen_runtime(): + result_code = await self._run_pip_in_process(args) + else: + try: + result_code = await self._run_pip_subprocess(args) + except FileNotFoundError: + result_code = await self._run_pip_in_process(args) + + if result_code != 0: + raise Exception(f"安装失败,错误码:{result_code}") + + if target_site_packages and target_site_packages not in sys.path: + sys.path.insert(0, target_site_packages) + importlib.invalidate_caches() + + async def _run_pip_subprocess(self, args: list[str]) -> int: + process = await asyncio.create_subprocess_exec( + sys.executable, + "-m", + "pip", + *args, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.STDOUT, + ) + + assert process.stdout is not None + async for line in process.stdout: + logger.info(_robust_decode(line)) + + await process.wait() + return process.returncode + + async def _run_pip_in_process(self, args: list[str]) -> int: + pip_main = _get_pip_main() + result_code, output = await asyncio.to_thread( + _run_pip_main_with_output, pip_main, args + ) + for line in output.splitlines(): + line = line.strip() + if line: + logger.info(line) + + for handler in logging.root.handlers[:]: + logging.root.removeHandler(handler) + return result_code diff --git a/dashboard/src/components/shared/WaitingForRestart.vue b/dashboard/src/components/shared/WaitingForRestart.vue index 7daa0bb0ec..2fbda30b2e 100644 --- a/dashboard/src/components/shared/WaitingForRestart.vue +++ b/dashboard/src/components/shared/WaitingForRestart.vue @@ -33,9 +33,15 @@ export default { methods: { async check() { this.newStartTime = -1 - this.startTime = useCommonStore().getStartTime() + this.cnt = 0 this.visible = true this.status = "" + const commonStore = useCommonStore() + try { + this.startTime = await commonStore.fetchStartTime() + } catch (_error) { + this.startTime = commonStore.getStartTime() + } console.log('start wfr') setTimeout(() => { this.timeoutInternal() @@ -50,7 +56,7 @@ export default { this.timeoutInternal() }, 1000) } else { - if (this.cnt == 10) { + if (this.cnt >= 60) { this.status = this.t('core.common.restart.maxRetriesReached') } this.cnt = 0 @@ -60,18 +66,22 @@ export default { } }, async checkStartTime() { - let res = await axios.get('/api/stat/start-time', { timeout: 3000 }) - let newStartTime = res.data.data.start_time - console.log('wfr: checkStartTime', this.newStartTime, this.startTime) - if (this.newStartTime !== this.startTime) { - this.newStartTime = newStartTime - console.log('wfr: restarted') - this.visible = false - // reload - window.location.reload() + try { + let res = await axios.get('/api/stat/start-time', { timeout: 3000 }) + let newStartTime = res.data.data.start_time + console.log('wfr: checkStartTime', newStartTime, this.startTime) + if (this.startTime !== -1 && newStartTime !== this.startTime) { + this.newStartTime = newStartTime + console.log('wfr: restarted') + this.visible = false + // reload + window.location.reload() + } + } catch (_error) { + // backend may be unavailable during restart window } return this.newStartTime } } } - \ No newline at end of file + diff --git a/dashboard/src/stores/common.js b/dashboard/src/stores/common.js index 337d1ba791..a2c5578881 100644 --- a/dashboard/src/stores/common.js +++ b/dashboard/src/stores/common.js @@ -132,13 +132,17 @@ export const useCommonStore = defineStore({ getLogCache() { return this.log_cache }, + async fetchStartTime() { + const res = await axios.get('/api/stat/start-time'); + this.startTime = res.data.data.start_time; + return this.startTime; + }, getStartTime() { if (this.startTime !== -1) { return this.startTime } - axios.get('/api/stat/start-time').then((res) => { - this.startTime = res.data.data.start_time - }) + this.fetchStartTime().catch(() => {}); + return this.startTime }, async getPluginCollections(force = false, customSource = null) { // 获取插件市场数据 diff --git a/desktop/README.md b/desktop/README.md index a67ac6e2d1..0d3d1d6413 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -71,6 +71,7 @@ By default (`ASTRBOT_ROOT` not set), packaged desktop app uses this layout: config/ # Main configuration plugins/ # Installed plugins plugin_data/ # Plugin persistent data + site-packages/ # Plugin dependency installation target in packaged mode temp/ # Runtime temp files skills/ # Skill-related runtime data knowledge_base/ # Knowledge base files diff --git a/desktop/scripts/build-backend.mjs b/desktop/scripts/build-backend.mjs index 6c16df39cb..3321024a6d 100644 --- a/desktop/scripts/build-backend.mjs +++ b/desktop/scripts/build-backend.mjs @@ -31,6 +31,10 @@ const args = [ 'astrbot-backend', '--collect-all', 'aiosqlite', + '--collect-all', + 'pip', + '--collect-submodules', + 'astrbot.api', '--add-data', `${kbStopwordsSrc}${dataSeparator}${kbStopwordsDest}`, '--distpath', diff --git a/main.py b/main.py index 60879f0651..0e01d0e2d7 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,14 @@ from astrbot.core import LogBroker, LogManager, db_helper, logger from astrbot.core.config.default import VERSION from astrbot.core.initial_loader import InitialLoader -from astrbot.core.utils.astrbot_path import get_astrbot_data_path +from astrbot.core.utils.astrbot_path import ( + get_astrbot_config_path, + get_astrbot_data_path, + get_astrbot_plugin_path, + get_astrbot_root, + get_astrbot_site_packages_path, + get_astrbot_temp_path, +) from astrbot.core.utils.io import download_dashboard, get_dashboard_version # 将父目录添加到 sys.path @@ -30,9 +37,18 @@ def check_env(): logger.error("请使用 Python3.10+ 运行本项目。") exit() - os.makedirs("data/config", exist_ok=True) - os.makedirs("data/plugins", exist_ok=True) - os.makedirs("data/temp", exist_ok=True) + astrbot_root = get_astrbot_root() + if astrbot_root not in sys.path: + sys.path.insert(0, astrbot_root) + + site_packages_path = get_astrbot_site_packages_path() + if site_packages_path not in sys.path: + sys.path.insert(0, site_packages_path) + + os.makedirs(get_astrbot_config_path(), exist_ok=True) + os.makedirs(get_astrbot_plugin_path(), exist_ok=True) + os.makedirs(get_astrbot_temp_path(), exist_ok=True) + os.makedirs(site_packages_path, exist_ok=True) # 针对问题 #181 的临时解决方案 mimetypes.add_type("text/javascript", ".js") From 64171821051489eda52d37ecab58bffb19a5787b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 15:25:18 +0900 Subject: [PATCH 09/24] fix(desktop): prevent backend respawn race on quit --- desktop/main.js | 110 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 12 deletions(-) diff --git a/desktop/main.js b/desktop/main.js index d0077b3843..5faa540af5 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -12,7 +12,7 @@ const { shell, dialog, } = require('electron'); -const { spawn } = require('child_process'); +const { spawn, spawnSync } = require('child_process'); const isMac = process.platform === 'darwin'; const backendUrl = normalizeUrl( @@ -36,6 +36,7 @@ const dashboardTimeoutMs = Number.parseInt( let mainWindow = null; let tray = null; let isQuitting = false; +let quitInProgress = false; let backendProcess = null; let backendConfig = null; let backendLogFd = null; @@ -204,6 +205,29 @@ function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } +function waitForProcessExit(child, timeoutMs = 5000) { + if (!child) { + return Promise.resolve('missing'); + } + if (child.exitCode !== null || child.signalCode !== null) { + return Promise.resolve('exited'); + } + return new Promise((resolve) => { + let settled = false; + const finish = (reason) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + resolve(reason); + }; + const timeout = setTimeout(() => finish('timeout'), timeoutMs); + child.once('exit', () => finish('exit')); + child.once('error', () => finish('error')); + }); +} + async function pingBackend(timeoutMs = 800) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), timeoutMs); @@ -245,6 +269,10 @@ async function waitForBackend(maxWaitMs = 0, failOnProcessExit = false) { } function startBackend() { + if (isQuitting || quitInProgress) { + logElectron('Skip backend start because app is quitting.'); + return; + } if (backendProcess) { return; } @@ -317,20 +345,57 @@ function startBackend() { }); } -function stopBackend() { - if (!backendProcess || backendProcess.killed) { +async function stopBackend() { + if (!backendProcess) { return; } - if (process.platform === 'win32' && backendProcess.pid) { - spawn('taskkill', ['/pid', `${backendProcess.pid}`, '/t', '/f'], { - stdio: 'ignore', - windowsHide: true, - }); + const processToStop = backendProcess; + const pid = processToStop.pid; + backendProcess = null; + logElectron(`Stop backend requested pid=${pid ?? 'unknown'}`); + + if (process.platform === 'win32' && pid) { + try { + const result = spawnSync('taskkill', ['/pid', `${pid}`, '/t', '/f'], { + stdio: 'ignore', + windowsHide: true, + }); + if (result.status !== 0) { + logElectron( + `taskkill failed pid=${pid} status=${result.status} signal=${result.signal ?? 'null'}`, + ); + } else { + logElectron(`taskkill completed pid=${pid}`); + } + } catch (error) { + logElectron( + `taskkill threw for pid=${pid}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + await waitForProcessExit(processToStop, 5000); } else { - backendProcess.kill('SIGTERM'); + if (!processToStop.killed) { + try { + processToStop.kill('SIGTERM'); + } catch (error) { + logElectron( + `SIGTERM failed for pid=${pid ?? 'unknown'}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + } + const exitResult = await waitForProcessExit(processToStop, 5000); + if (exitResult === 'timeout' && !processToStop.killed) { + try { + processToStop.kill('SIGKILL'); + } catch {} + await waitForProcessExit(processToStop, 1500); + } } closeBackendLogFd(); - backendProcess = null; } async function loadDashboard(maxWaitMs = 20000) { @@ -534,9 +599,27 @@ if (!gotLock) { }); } -app.on('before-quit', () => { +app.on('before-quit', (event) => { + if (quitInProgress) { + event.preventDefault(); + return; + } + event.preventDefault(); + quitInProgress = true; isQuitting = true; - stopBackend(); + logElectron('before-quit received, stopping backend.'); + stopBackend() + .catch((error) => { + logElectron( + `stopBackend failed: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + }) + .finally(() => { + logElectron('Backend stop finished, exiting app.'); + app.exit(0); + }); }); app.whenReady().then(async () => { @@ -547,6 +630,9 @@ app.whenReady().then(async () => { } } const ready = await ensureBackend(); + if (isQuitting) { + return; + } if (!ready) { const backendLogPath = backendConfig?.rootDir From 470bf7de9555cab9dfccf34bc1c4d8eada684199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 15:56:30 +0900 Subject: [PATCH 10/24] fix(desktop): prefer pyproject version for desktop packaging --- desktop/package.json | 2 +- desktop/scripts/sync-version.mjs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index adb2e743d9..e74b2eaa09 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "astrbot-desktop", - "version": "4.3.2", + "version": "4.14.6", "description": "AstrBot desktop wrapper", "private": true, "main": "main.js", diff --git a/desktop/scripts/sync-version.mjs b/desktop/scripts/sync-version.mjs index 06711acb30..08651d75a0 100644 --- a/desktop/scripts/sync-version.mjs +++ b/desktop/scripts/sync-version.mjs @@ -38,7 +38,18 @@ const pkgRaw = await readFile(desktopPackagePath, 'utf8'); const pkg = JSON.parse(pkgRaw); const tag = getGitTag(); const versionFromTag = tag ? normalizeTag(tag) : null; -const version = versionFromTag || (await getPyprojectVersion()) || pkg.version; +const versionFromPyproject = await getPyprojectVersion(); +const version = versionFromPyproject || versionFromTag || pkg.version; + +if ( + versionFromPyproject && + versionFromTag && + versionFromPyproject !== versionFromTag +) { + console.log( + `Using pyproject version ${versionFromPyproject} (ignoring git tag ${versionFromTag}).`, + ); +} if (!version) { console.warn('No version found to sync.'); From 66fe0ce785bce787421765d62e15699f393a9e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 16:32:13 +0900 Subject: [PATCH 11/24] fix(desktop): improve startup loading UX and reduce flicker --- desktop/main.js | 265 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 252 insertions(+), 13 deletions(-) diff --git a/desktop/main.js b/desktop/main.js index 5faa540af5..95e555bdc0 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -32,6 +32,8 @@ const dashboardTimeoutMs = Number.parseInt( process.env.ASTRBOT_DASHBOARD_TIMEOUT_MS || '20000', 10, ); +const LOCALE_STORAGE_KEY = 'astrbot-locale'; +const SUPPORTED_STARTUP_LOCALES = new Set(['zh-CN', 'en-US']); let mainWindow = null; let tray = null; @@ -148,6 +150,84 @@ function resolveBackendCwd() { return resolveBackendRoot(); } +function normalizeLocale(value) { + if (!value) { + return null; + } + const raw = String(value).trim(); + if (!raw) { + return null; + } + if (SUPPORTED_STARTUP_LOCALES.has(raw)) { + return raw; + } + const lower = raw.toLowerCase(); + if (lower.startsWith('zh')) { + return 'zh-CN'; + } + if (lower.startsWith('en')) { + return 'en-US'; + } + return null; +} + +function getDesktopStatePath() { + const rootDir = + process.env.ASTRBOT_ROOT || + backendConfig?.rootDir || + resolveBackendRoot() || + app.getPath('userData'); + return path.join(rootDir, 'data', 'desktop_state.json'); +} + +function readCachedLocale() { + const statePath = getDesktopStatePath(); + try { + const raw = fs.readFileSync(statePath, 'utf8'); + const parsed = JSON.parse(raw); + return normalizeLocale(parsed?.locale); + } catch { + return null; + } +} + +function writeCachedLocale(locale) { + const normalized = normalizeLocale(locale); + if (!normalized) { + return; + } + const statePath = getDesktopStatePath(); + ensureDir(path.dirname(statePath)); + try { + fs.writeFileSync( + statePath, + `${JSON.stringify({ locale: normalized }, null, 2)}\n`, + 'utf8', + ); + } catch {} +} + +function resolveStartupLocale() { + const cached = readCachedLocale(); + if (cached) { + return cached; + } + return normalizeLocale(app.getLocale()) || 'zh-CN'; +} + +function getStartupTexts(locale) { + if (locale === 'zh-CN') { + return { + title: 'AstrBot 正在启动', + message: '界面很快就会加载完成。', + }; + } + return { + title: 'AstrBot is starting', + message: 'The dashboard will be ready in a moment.', + }; +} + function buildDefaultBackendLaunch(webuiDir) { if (app.isPackaged) { const packagedBackend = getPackagedBackendPath(); @@ -421,6 +501,146 @@ async function loadDashboard(maxWaitMs = 20000) { throw new Error(`Timed out loading ${backendUrl}`); } +async function persistLocaleFromDashboard(timeoutMs = 1200) { + if (!mainWindow || mainWindow.isDestroyed()) { + return; + } + const currentUrl = mainWindow.webContents.getURL(); + if (!currentUrl || !currentUrl.startsWith(backendUrl)) { + return; + } + try { + const localeRaw = await Promise.race([ + mainWindow.webContents.executeJavaScript( + `(() => { + try { + return window.localStorage.getItem('${LOCALE_STORAGE_KEY}') || ''; + } catch { + return ''; + } + })();`, + true, + ), + delay(timeoutMs).then(() => null), + ]); + const locale = normalizeLocale(localeRaw); + if (locale) { + writeCachedLocale(locale); + } + } catch {} +} + +async function loadStartupScreen() { + if (!mainWindow) { + return false; + } + const startupLocale = resolveStartupLocale(); + const startupTexts = getStartupTexts(startupLocale); + let iconUrl = ''; + try { + const iconBuffer = fs.readFileSync(getAssetPath('icon.png')); + iconUrl = `data:image/png;base64,${iconBuffer.toString('base64')}`; + } catch {} + const html = ` + + + + + AstrBot + + + +

+ +`; + const startupUrl = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`; + await mainWindow.loadURL(startupUrl); + return true; +} + function createWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -428,6 +648,7 @@ function createWindow() { minWidth: 980, minHeight: 680, show: false, + backgroundColor: '#f9fafc', autoHideMenuBar: !isMac, icon: getAssetPath('icon.png'), webPreferences: { @@ -472,7 +693,11 @@ function createWindow() { ); mainWindow.webContents.on('did-finish-load', () => { - logElectron(`did-finish-load url=${mainWindow.webContents.getURL()}`); + const currentUrl = mainWindow.webContents.getURL(); + logElectron(`did-finish-load url=${currentUrl}`); + if (currentUrl.startsWith(backendUrl)) { + void persistLocaleFromDashboard(); + } }); mainWindow.webContents.on('render-process-gone', (_event, details) => { @@ -608,16 +833,21 @@ app.on('before-quit', (event) => { quitInProgress = true; isQuitting = true; logElectron('before-quit received, stopping backend.'); - stopBackend() - .catch((error) => { + persistLocaleFromDashboard() + .catch(() => {}) + .then(() => + stopBackend().catch((error) => { + logElectron( + `stopBackend failed: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + }), + ) + .finally(() => { logElectron( - `stopBackend failed: ${ - error instanceof Error ? error.message : String(error) - }`, + 'Backend stop finished, exiting app.', ); - }) - .finally(() => { - logElectron('Backend stop finished, exiting app.'); app.exit(0); }); }); @@ -629,6 +859,19 @@ app.whenReady().then(async () => { app.dock.setIcon(dockIcon); } } + createWindow(); + createTray(); + try { + await loadStartupScreen(); + } catch (error) { + logElectron( + `failed to load startup screen: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + showWindow(); + const ready = await ensureBackend(); if (isQuitting) { return; @@ -659,11 +902,7 @@ app.whenReady().then(async () => { return; } - createWindow(); - createTray(); - try { - await mainWindow.webContents.session.clearCache(); await loadDashboard(dashboardTimeoutMs); showWindow(); } catch (error) { From b1a9ca728646e12b250a2dc0b6b01a40f523fd42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 16:34:34 +0900 Subject: [PATCH 12/24] ci: add desktop multi-platform release workflow --- .github/workflows/desktop_release.yml | 144 ++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 .github/workflows/desktop_release.yml diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml new file mode 100644 index 0000000000..29db25ce89 --- /dev/null +++ b/.github/workflows/desktop_release.yml @@ -0,0 +1,144 @@ +name: Desktop Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + ref: + description: "Git ref to build (branch/tag/SHA)" + required: false + default: "master" + tag: + description: "Release tag to upload assets to (for example: v4.14.6)" + required: false + +permissions: + contents: write + +jobs: + build-desktop: + name: Build ${{ matrix.name }} + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - name: linux-x64 + runner: ubuntu-24.04 + - name: linux-arm64 + runner: ubuntu-24.04-arm + - name: windows-x64 + runner: windows-2022 + - name: windows-arm64 + runner: windows-11-arm + - name: macos-x64 + runner: macos-13 + - name: macos-arm64 + runner: macos-14 + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ inputs.ref || github.ref }} + + - name: Setup uv + uses: astral-sh/setup-uv@v6 + + - name: Setup Python + uses: actions/setup-python@v6 + with: + python-version: "3.11" + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.28.2 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: 20 + cache: "pnpm" + cache-dependency-path: | + dashboard/pnpm-lock.yaml + desktop/pnpm-lock.yaml + + - name: Install dependencies + run: | + uv sync + pnpm --dir dashboard install --frozen-lockfile + pnpm --dir desktop install --frozen-lockfile + + - name: Build desktop package + run: pnpm --dir desktop run dist:full + + - name: Upload desktop artifacts + uses: actions/upload-artifact@v6 + with: + name: desktop-${{ matrix.name }} + if-no-files-found: error + path: | + desktop/dist/*.AppImage + desktop/dist/*.dmg + desktop/dist/*.zip + desktop/dist/*.exe + desktop/dist/*.blockmap + + publish-release: + name: Publish Release Assets + runs-on: ubuntu-24.04 + needs: build-desktop + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ inputs.ref || github.ref }} + + - name: Download built artifacts + uses: actions/download-artifact@v6 + with: + pattern: desktop-* + path: release-assets + merge-multiple: true + + - name: Resolve release tag + id: tag + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + tag="${GITHUB_REF_NAME}" + elif [ -n "${{ inputs.tag }}" ]; then + tag="${{ inputs.tag }}" + else + tag="$(git describe --tags --abbrev=0)" + fi + if [ -z "$tag" ]; then + echo "Failed to resolve release tag." >&2 + exit 1 + fi + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Ensure release exists + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + tag="${{ steps.tag.outputs.tag }}" + if ! gh release view "$tag" >/dev/null 2>&1; then + gh release create "$tag" --title "$tag" --notes "" + fi + + - name: Upload assets to release + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + tag="${{ steps.tag.outputs.tag }}" + gh release upload "$tag" release-assets/* --clobber From ed2a61600bf29a74ef8ef4e736c52c8b08382991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 16:42:58 +0900 Subject: [PATCH 13/24] ci: fix desktop release build and mac runner labels --- .github/workflows/desktop_release.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index 29db25ce89..3a45d4a6a2 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -34,9 +34,9 @@ jobs: - name: windows-arm64 runner: windows-11-arm - name: macos-x64 - runner: macos-13 + runner: macos-15-intel - name: macos-arm64 - runner: macos-14 + runner: macos-15 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" GH_TOKEN: ${{ github.token }} @@ -76,7 +76,9 @@ jobs: pnpm --dir desktop install --frozen-lockfile - name: Build desktop package - run: pnpm --dir desktop run dist:full + run: | + pnpm --dir dashboard run build + pnpm --dir desktop run dist:full - name: Upload desktop artifacts uses: actions/upload-artifact@v6 From 52759a2c9f48414e8fc9f79fe626b26a85b0ff53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 16:47:53 +0900 Subject: [PATCH 14/24] ci: disable electron-builder auto publish in desktop build --- .github/workflows/desktop_release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index 3a45d4a6a2..4a488901dd 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -78,7 +78,10 @@ jobs: - name: Build desktop package run: | pnpm --dir dashboard run build - pnpm --dir desktop run dist:full + pnpm --dir desktop run build:webui + pnpm --dir desktop run build:backend + pnpm --dir desktop run sync:version + pnpm --dir desktop exec electron-builder --publish never - name: Upload desktop artifacts uses: actions/upload-artifact@v6 From 3644e36c6ee27dd41d78c2475592f488b446ba0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 16:53:07 +0900 Subject: [PATCH 15/24] ci: avoid electron-builder publish path in build matrix --- .github/workflows/desktop_release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index 4a488901dd..ffc660bd12 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -39,7 +39,6 @@ jobs: runner: macos-15 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" - GH_TOKEN: ${{ github.token }} steps: - name: Checkout repository uses: actions/checkout@v6 From 65675333294046acc0cac0256fb410a3dfe33f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 17:13:16 +0900 Subject: [PATCH 16/24] ci: normalize desktop release artifact names --- .github/workflows/desktop_release.yml | 101 ++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 13 deletions(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index ffc660bd12..f1f6a7c5b2 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -27,16 +27,28 @@ jobs: include: - name: linux-x64 runner: ubuntu-24.04 + os: linux + arch: amd64 - name: linux-arm64 runner: ubuntu-24.04-arm + os: linux + arch: arm64 - name: windows-x64 runner: windows-2022 + os: win + arch: amd64 - name: windows-arm64 runner: windows-11-arm + os: win + arch: arm64 - name: macos-x64 runner: macos-15-intel + os: mac + arch: amd64 - name: macos-arm64 runner: macos-15 + os: mac + arch: arm64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" steps: @@ -82,17 +94,80 @@ jobs: pnpm --dir desktop run sync:version pnpm --dir desktop exec electron-builder --publish never - - name: Upload desktop artifacts - uses: actions/upload-artifact@v6 - with: - name: desktop-${{ matrix.name }} - if-no-files-found: error - path: | + - name: Resolve artifact tag + id: tag + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + tag="${GITHUB_REF_NAME}" + elif [ -n "${{ inputs.tag }}" ]; then + tag="${{ inputs.tag }}" + else + tag="$(git describe --tags --abbrev=0)" + fi + if [ -z "$tag" ]; then + echo "Failed to resolve artifact tag." >&2 + exit 1 + fi + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Normalize artifact names + shell: bash + env: + NAME_PREFIX: ${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} + run: | + shopt -s nullglob + out_dir="desktop/dist/release" + mkdir -p "$out_dir" + files=( desktop/dist/*.AppImage desktop/dist/*.dmg desktop/dist/*.zip desktop/dist/*.exe desktop/dist/*.blockmap + ) + if [ ${#files[@]} -eq 0 ]; then + echo "No desktop artifacts found to rename." >&2 + exit 1 + fi + for src in "${files[@]}"; do + file="$(basename "$src")" + case "$file" in + *.exe.blockmap) + dest="$out_dir/${NAME_PREFIX}.exe.blockmap" + ;; + *.dmg.blockmap) + dest="$out_dir/${NAME_PREFIX}.dmg.blockmap" + ;; + *.zip.blockmap) + dest="$out_dir/${NAME_PREFIX}.zip.blockmap" + ;; + *.AppImage) + dest="$out_dir/${NAME_PREFIX}.AppImage" + ;; + *.dmg) + dest="$out_dir/${NAME_PREFIX}.dmg" + ;; + *.exe) + dest="$out_dir/${NAME_PREFIX}.exe" + ;; + *.zip) + dest="$out_dir/${NAME_PREFIX}.zip" + ;; + *) + continue + ;; + esac + cp "$src" "$dest" + done + ls -la "$out_dir" + + - name: Upload desktop artifacts + uses: actions/upload-artifact@v6 + with: + name: ${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} + if-no-files-found: error + path: desktop/dist/release/* publish-release: name: Publish Release Assets @@ -105,13 +180,6 @@ jobs: fetch-depth: 0 ref: ${{ inputs.ref || github.ref }} - - name: Download built artifacts - uses: actions/download-artifact@v6 - with: - pattern: desktop-* - path: release-assets - merge-multiple: true - - name: Resolve release tag id: tag shell: bash @@ -129,6 +197,13 @@ jobs: fi echo "tag=$tag" >> "$GITHUB_OUTPUT" + - name: Download built artifacts + uses: actions/download-artifact@v6 + with: + pattern: ${{ steps.tag.outputs.tag }}-* + path: release-assets + merge-multiple: true + - name: Ensure release exists env: GH_TOKEN: ${{ github.token }} From b6f5c18fa30ad28ea997013346a9f43e33d4ead8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 17:14:32 +0900 Subject: [PATCH 17/24] ci: exclude blockmap files from desktop release assets --- .github/workflows/desktop_release.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index f1f6a7c5b2..7f598c2d6d 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -124,7 +124,6 @@ jobs: desktop/dist/*.dmg desktop/dist/*.zip desktop/dist/*.exe - desktop/dist/*.blockmap ) if [ ${#files[@]} -eq 0 ]; then echo "No desktop artifacts found to rename." >&2 @@ -133,15 +132,6 @@ jobs: for src in "${files[@]}"; do file="$(basename "$src")" case "$file" in - *.exe.blockmap) - dest="$out_dir/${NAME_PREFIX}.exe.blockmap" - ;; - *.dmg.blockmap) - dest="$out_dir/${NAME_PREFIX}.dmg.blockmap" - ;; - *.zip.blockmap) - dest="$out_dir/${NAME_PREFIX}.zip.blockmap" - ;; *.AppImage) dest="$out_dir/${NAME_PREFIX}.AppImage" ;; From a29028f338c511d47a7459a8edabdc033b126e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 17:43:06 +0900 Subject: [PATCH 18/24] ci: prefix desktop release assets with AstrBot and purge blockmaps --- .github/workflows/desktop_release.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/desktop_release.yml index 7f598c2d6d..e5c0b3db2c 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/desktop_release.yml @@ -114,7 +114,7 @@ jobs: - name: Normalize artifact names shell: bash env: - NAME_PREFIX: ${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} + NAME_PREFIX: AstrBot-${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} run: | shopt -s nullglob out_dir="desktop/dist/release" @@ -155,7 +155,7 @@ jobs: - name: Upload desktop artifacts uses: actions/upload-artifact@v6 with: - name: ${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} + name: AstrBot-${{ steps.tag.outputs.tag }}-${{ matrix.arch }}-${{ matrix.os }} if-no-files-found: error path: desktop/dist/release/* @@ -190,7 +190,7 @@ jobs: - name: Download built artifacts uses: actions/download-artifact@v6 with: - pattern: ${{ steps.tag.outputs.tag }}-* + pattern: AstrBot-${{ steps.tag.outputs.tag }}-* path: release-assets merge-multiple: true @@ -204,6 +204,20 @@ jobs: gh release create "$tag" --title "$tag" --notes "" fi + - name: Remove stale desktop assets from release + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + tag="${{ steps.tag.outputs.tag }}" + while IFS= read -r asset; do + case "$asset" in + *.AppImage|*.dmg|*.zip|*.exe|*.blockmap) + gh release delete-asset "$tag" "$asset" -y || true + ;; + esac + done < <(gh release view "$tag" --json assets --jq '.assets[].name') + - name: Upload assets to release env: GH_TOKEN: ${{ github.token }} From 53d629d46a2a1e4a3446ddfd95c4730924755b75 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sun, 8 Feb 2026 16:52:44 +0800 Subject: [PATCH 19/24] feat: add electron bridge types and expose backend control methods in preload script --- dashboard/src/types/electron-bridge.d.ts | 24 +++++ desktop/main.js | 127 ++++++++++++++++++++++- desktop/preload.js | 10 ++ 3 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 dashboard/src/types/electron-bridge.d.ts diff --git a/dashboard/src/types/electron-bridge.d.ts b/dashboard/src/types/electron-bridge.d.ts new file mode 100644 index 0000000000..9bcc18006f --- /dev/null +++ b/dashboard/src/types/electron-bridge.d.ts @@ -0,0 +1,24 @@ +export {}; + +declare global { + interface Window { + astrbotDesktop?: { + isElectron: boolean; + isElectronRuntime: () => Promise; + getBackendState: () => Promise<{ + running: boolean; + spawning: boolean; + restarting: boolean; + canManage: boolean; + }>; + restartBackend: () => Promise<{ + ok: boolean; + reason: string | null; + }>; + stopBackend: () => Promise<{ + ok: boolean; + reason: string | null; + }>; + }; + } +} diff --git a/desktop/main.js b/desktop/main.js index 95e555bdc0..9de2d97d9a 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -11,6 +11,7 @@ const { nativeImage, shell, dialog, + ipcMain, } = require('electron'); const { spawn, spawnSync } = require('child_process'); @@ -44,6 +45,8 @@ let backendConfig = null; let backendLogFd = null; let backendLastExitReason = null; let backendStartupFailureReason = null; +let backendSpawning = false; +let backendRestarting = false; app.commandLine.appendSwitch('disable-http-cache'); @@ -348,6 +351,29 @@ async function waitForBackend(maxWaitMs = 0, failOnProcessExit = false) { } } +function canManageBackend() { + if (!backendConfig) { + backendConfig = resolveBackendConfig(); + } + return Boolean(backendConfig?.cmd); +} + +async function startBackendAndWait(maxWaitMs = backendTimeoutMs) { + if (!canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + backendSpawning = true; + try { + startBackend(); + return await waitForBackend(maxWaitMs, true); + } finally { + backendSpawning = false; + } +} + function startBackend() { if (isQuitting || quitInProgress) { logElectron('Skip backend start because app is quitting.'); @@ -804,8 +830,7 @@ async function ensureBackend() { 'Backend auto-start is disabled or backend command is not configured.'; return false; } - startBackend(); - const waitResult = await waitForBackend(backendTimeoutMs, true); + const waitResult = await startBackendAndWait(backendTimeoutMs); if (!waitResult.ok) { backendStartupFailureReason = waitResult.reason; return false; @@ -813,6 +838,104 @@ async function ensureBackend() { return true; } +ipcMain.handle('astrbot-desktop:is-electron-runtime', async () => true); + +ipcMain.handle('astrbot-desktop:get-backend-state', async () => { + const running = await pingBackend(); + return { + running, + spawning: backendSpawning, + restarting: backendRestarting, + canManage: canManageBackend(), + }; +}); + +ipcMain.handle('astrbot-desktop:restart-backend', async () => { + if (!canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + if (backendSpawning || backendRestarting) { + return { + ok: false, + reason: 'Backend action already in progress.', + }; + } + + backendRestarting = true; + try { + await stopBackend(); + const startResult = await startBackendAndWait(backendTimeoutMs); + if (!startResult.ok) { + return { + ok: false, + reason: startResult.reason || 'Failed to restart backend.', + }; + } + return { + ok: true, + reason: null, + }; + } catch (error) { + return { + ok: false, + reason: error instanceof Error ? error.message : String(error), + }; + } finally { + backendRestarting = false; + } +}); + +ipcMain.handle('astrbot-desktop:stop-backend', async () => { + if (!canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + if (backendSpawning || backendRestarting) { + return { + ok: false, + reason: 'Backend action already in progress.', + }; + } + + try { + if (!backendProcess) { + const running = await pingBackend(); + if (running) { + return { + ok: false, + reason: 'Backend is running but not managed by Electron.', + }; + } + return { + ok: true, + reason: null, + }; + } + await stopBackend(); + const running = await pingBackend(); + if (running) { + return { + ok: false, + reason: 'Backend is still reachable after stop request.', + }; + } + return { + ok: true, + reason: null, + }; + } catch (error) { + return { + ok: false, + reason: error instanceof Error ? error.message : String(error), + }; + } +}); + app.setAppUserModelId('com.astrbot.desktop'); const gotLock = app.requestSingleInstanceLock(); diff --git a/desktop/preload.js b/desktop/preload.js index ad9a93a7c1..f0fdacf348 100644 --- a/desktop/preload.js +++ b/desktop/preload.js @@ -1 +1,11 @@ 'use strict'; + +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('astrbotDesktop', { + isElectron: true, + isElectronRuntime: () => ipcRenderer.invoke('astrbot-desktop:is-electron-runtime'), + getBackendState: () => ipcRenderer.invoke('astrbot-desktop:get-backend-state'), + restartBackend: () => ipcRenderer.invoke('astrbot-desktop:restart-backend'), + stopBackend: () => ipcRenderer.invoke('astrbot-desktop:stop-backend'), +}); From ae7fdf7491bdff5771dfe7d01a5cc8a0a634d196 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sun, 8 Feb 2026 17:01:15 +0800 Subject: [PATCH 20/24] Update startup screen assets and styles - Changed the icon from PNG to SVG format for better scalability. - Updated the border color from #d0d0d0 to #eeeeee for a softer appearance. - Adjusted the width of the startup screen from 460px to 360px for improved responsiveness. --- desktop/assets/icon-no-shadow.svg | 1 + desktop/main.js | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 desktop/assets/icon-no-shadow.svg diff --git a/desktop/assets/icon-no-shadow.svg b/desktop/assets/icon-no-shadow.svg new file mode 100644 index 0000000000..4268e03e22 --- /dev/null +++ b/desktop/assets/icon-no-shadow.svg @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/desktop/main.js b/desktop/main.js index 9de2d97d9a..cc5f1a1b38 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -564,8 +564,8 @@ async function loadStartupScreen() { const startupTexts = getStartupTexts(startupLocale); let iconUrl = ''; try { - const iconBuffer = fs.readFileSync(getAssetPath('icon.png')); - iconUrl = `data:image/png;base64,${iconBuffer.toString('base64')}`; + const iconBuffer = fs.readFileSync(getAssetPath('icon-no-shadow.svg')); + iconUrl = `data:image/svg+xml;base64,${iconBuffer.toString('base64')}`; } catch {} const html = ` @@ -581,7 +581,7 @@ async function loadStartupScreen() { --surface: #ffffff; --text: #1b1c1d; --muted: #556170; - --border: #d0d0d0; + --border: #eeeeee; } body { margin: 0; @@ -599,8 +599,7 @@ async function loadStartupScreen() { border-radius: 14px; background: var(--surface); border: 1px solid var(--border); - box-shadow: 0 12px 34px rgba(0, 0, 0, 0.08); - width: min(460px, calc(100vw - 48px)); + width: min(360px, calc(100vw - 48px)); } .logo { width: 64px; From 04b05eeabea6dcaeac9d26c824a590012572dfc2 Mon Sep 17 00:00:00 2001 From: Soulter <37870767+Soulter@users.noreply.github.com> Date: Sun, 8 Feb 2026 17:49:29 +0800 Subject: [PATCH 21/24] Update .gitignore to include package.json --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 755e4c90ae..40a9d52b86 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,6 @@ desktop/resources/backend/*.exe desktop/resources/webui/* desktop/resources/.pyinstaller/ package-lock.json -package.json yarn.lock !desktop/package.json !desktop/resources/backend/.gitkeep From c9084b8bd7ec8229a709239b8e3ddef28a51de8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 20:33:28 +0900 Subject: [PATCH 22/24] chore: remove desktop gitkeep ignore exceptions --- .gitignore | 3 --- desktop/resources/backend/.gitkeep | 0 2 files changed, 3 deletions(-) delete mode 100644 desktop/resources/backend/.gitkeep diff --git a/.gitignore b/.gitignore index 40a9d52b86..e060b85a6c 100644 --- a/.gitignore +++ b/.gitignore @@ -42,9 +42,6 @@ desktop/resources/webui/* desktop/resources/.pyinstaller/ package-lock.json yarn.lock -!desktop/package.json -!desktop/resources/backend/.gitkeep -!desktop/resources/webui/.gitkeep # Operating System **/.DS_Store diff --git a/desktop/resources/backend/.gitkeep b/desktop/resources/backend/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 From ff8059b956b08ba63960274aa47970b6a81a6623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 20:53:30 +0900 Subject: [PATCH 23/24] docs: update desktop troubleshooting for current runtime behavior --- desktop/README.md | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/desktop/README.md b/desktop/README.md index 0d3d1d6413..12ada92f60 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -82,12 +82,35 @@ The app does not store a full AstrBot source tree in home directory. ## Troubleshooting +Startup behavior: + +- Packaged app shows a local startup page first, then switches to dashboard after backend is reachable. +- If startup page never switches, check logs and timeout settings below. + Runtime logs: -- Backend stdout/stderr is written to `~/.astrbot/logs/backend.log` in packaged app mode. -- If UI stays blank, check that log first and then retry launching the app. -- Packaged app defaults to `ASTRBOT_BACKEND_TIMEOUT_MS=0` (wait until backend is reachable). -- Set `ASTRBOT_BACKEND_TIMEOUT_MS` to a positive number only if you need an explicit startup timeout. +- Electron shell log: `~/.astrbot/logs/electron.log` +- Backend stdout/stderr log: `~/.astrbot/logs/backend.log` +- On backend startup failure, the app dialog also shows the backend reason and backend log path. + +Timeout and loading controls: + +- `ASTRBOT_BACKEND_TIMEOUT_MS` controls how long Electron waits for backend reachability. +- In packaged mode, default is `0` (wait indefinitely). +- In development mode, default is `20000`. +- `ASTRBOT_DASHBOARD_TIMEOUT_MS` controls dashboard page load wait time after backend is ready (default `20000`). +- If you see `Unable to load the AstrBot dashboard.`, increase `ASTRBOT_DASHBOARD_TIMEOUT_MS`. + +Startup page locale: + +- Startup page language follows cached dashboard locale in `~/.astrbot/data/desktop_state.json`. +- Supported startup locales are `zh-CN` and `en-US`. +- Remove that file to reset locale fallback behavior. + +Backend auto-start: + +- `ASTRBOT_BACKEND_AUTO_START=0` disables Electron-managed backend startup. +- When disabled, backend must already be running at `ASTRBOT_BACKEND_URL` before launching app. If Electron download times out on restricted networks, configure mirrors before install: From 99dd29719b89ddc36b7d0f72f404a91c795552f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sun, 8 Feb 2026 21:30:32 +0900 Subject: [PATCH 24/24] refactor(desktop): modularize runtime and harden startup flow --- astrbot/core/utils/pip_installer.py | 15 +- desktop/README.md | 5 +- desktop/lib/backend-manager.js | 504 ++++++++++++++ desktop/lib/common.js | 59 ++ desktop/lib/dashboard-loader.js | 30 + desktop/lib/electron-logger.js | 33 + desktop/lib/locale-service.js | 172 +++++ desktop/lib/startup-screen.js | 116 ++++ desktop/main.js | 1003 +++++---------------------- desktop/scripts/build-backend.mjs | 14 +- 10 files changed, 1109 insertions(+), 842 deletions(-) create mode 100644 desktop/lib/backend-manager.js create mode 100644 desktop/lib/common.js create mode 100644 desktop/lib/dashboard-loader.js create mode 100644 desktop/lib/electron-logger.js create mode 100644 desktop/lib/locale-service.js create mode 100644 desktop/lib/startup-screen.js diff --git a/astrbot/core/utils/pip_installer.py b/astrbot/core/utils/pip_installer.py index 58b8a83e7b..e9e9556d99 100644 --- a/astrbot/core/utils/pip_installer.py +++ b/astrbot/core/utils/pip_installer.py @@ -49,6 +49,17 @@ def _run_pip_main_with_output(pip_main, args: list[str]) -> tuple[int, str]: return result_code, stream.getvalue() +def _cleanup_added_root_handlers(original_handlers: list[logging.Handler]) -> None: + root_logger = logging.getLogger() + original_handler_ids = {id(handler) for handler in original_handlers} + + for handler in list(root_logger.handlers): + if id(handler) not in original_handler_ids: + root_logger.removeHandler(handler) + with contextlib.suppress(Exception): + handler.close() + + class PipInstaller: def __init__(self, pip_install_arg: str, pypi_index_url: str | None = None): self.pip_install_arg = pip_install_arg @@ -115,6 +126,7 @@ async def _run_pip_subprocess(self, args: list[str]) -> int: async def _run_pip_in_process(self, args: list[str]) -> int: pip_main = _get_pip_main() + original_handlers = list(logging.getLogger().handlers) result_code, output = await asyncio.to_thread( _run_pip_main_with_output, pip_main, args ) @@ -123,6 +135,5 @@ async def _run_pip_in_process(self, args: list[str]) -> int: if line: logger.info(line) - for handler in logging.root.handlers[:]: - logging.root.removeHandler(handler) + _cleanup_added_root_handlers(original_handlers) return result_code diff --git a/desktop/README.md b/desktop/README.md index 12ada92f60..b5698e3ee3 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -20,7 +20,7 @@ Current behavior: - Node.js available - `pnpm` available -Desktop dependency management uses `pnpm` with lockfile: +Desktop dependency management uses `pnpm` with a lockfile: - `desktop/pnpm-lock.yaml` - `pnpm --dir desktop install --frozen-lockfile` @@ -96,8 +96,9 @@ Runtime logs: Timeout and loading controls: - `ASTRBOT_BACKEND_TIMEOUT_MS` controls how long Electron waits for backend reachability. -- In packaged mode, default is `0` (wait indefinitely). +- In packaged mode, default is `0` (auto mode with a 5-minute safety cap). - In development mode, default is `20000`. +- If backend startup times out, app shows startup failure dialog and exits. - `ASTRBOT_DASHBOARD_TIMEOUT_MS` controls dashboard page load wait time after backend is ready (default `20000`). - If you see `Unable to load the AstrBot dashboard.`, increase `ASTRBOT_DASHBOARD_TIMEOUT_MS`. diff --git a/desktop/lib/backend-manager.js b/desktop/lib/backend-manager.js new file mode 100644 index 0000000000..753ee4af4b --- /dev/null +++ b/desktop/lib/backend-manager.js @@ -0,0 +1,504 @@ +'use strict'; + +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const { spawn, spawnSync } = require('child_process'); +const { delay, ensureDir, normalizeUrl, waitForProcessExit } = require('./common'); + +const PACKAGED_BACKEND_TIMEOUT_FALLBACK_MS = 5 * 60 * 1000; + +function parseBackendTimeoutMs(app) { + const defaultTimeoutMs = app.isPackaged ? 0 : 20000; + const parsed = Number.parseInt( + process.env.ASTRBOT_BACKEND_TIMEOUT_MS || `${defaultTimeoutMs}`, + 10, + ); + if (Number.isFinite(parsed) && parsed >= 0) { + return parsed; + } + return defaultTimeoutMs; +} + +class BackendManager { + constructor({ app, baseDir, log, shouldSkipStart }) { + this.app = app; + this.baseDir = baseDir; + this.log = typeof log === 'function' ? log : () => {}; + this.shouldSkipStart = + typeof shouldSkipStart === 'function' ? shouldSkipStart : () => false; + + this.backendUrl = normalizeUrl( + process.env.ASTRBOT_BACKEND_URL || 'http://127.0.0.1:6185/', + ); + this.backendAutoStart = process.env.ASTRBOT_BACKEND_AUTO_START !== '0'; + this.backendTimeoutMs = parseBackendTimeoutMs(app); + + this.backendProcess = null; + this.backendConfig = null; + this.backendLogFd = null; + this.backendLastExitReason = null; + this.backendStartupFailureReason = null; + this.backendSpawning = false; + this.backendRestarting = false; + } + + getBackendUrl() { + return this.backendUrl; + } + + getBackendTimeoutMs() { + return this.backendTimeoutMs; + } + + getRootDir() { + return ( + process.env.ASTRBOT_ROOT || + this.backendConfig?.rootDir || + this.resolveBackendRoot() + ); + } + + getBackendLogPath() { + const rootDir = this.getRootDir(); + if (!rootDir) { + return null; + } + return path.join(rootDir, 'logs', 'backend.log'); + } + + getStartupFailureReason() { + return this.backendStartupFailureReason; + } + + isSpawning() { + return this.backendSpawning; + } + + isRestarting() { + return this.backendRestarting; + } + + resolveBackendRoot() { + if (!this.app.isPackaged) { + return null; + } + return path.join(os.homedir(), '.astrbot'); + } + + resolveBackendCwd() { + if (!this.app.isPackaged) { + return path.resolve(this.baseDir, '..'); + } + return this.resolveBackendRoot(); + } + + resolveWebuiDir() { + if (process.env.ASTRBOT_WEBUI_DIR) { + return process.env.ASTRBOT_WEBUI_DIR; + } + if (!this.app.isPackaged) { + return null; + } + const candidate = path.join(process.resourcesPath, 'webui'); + const indexPath = path.join(candidate, 'index.html'); + return fs.existsSync(indexPath) ? candidate : null; + } + + getPackagedBackendPath() { + if (!this.app.isPackaged) { + return null; + } + const filename = + process.platform === 'win32' ? 'astrbot-backend.exe' : 'astrbot-backend'; + const candidate = path.join(process.resourcesPath, 'backend', filename); + return fs.existsSync(candidate) ? candidate : null; + } + + buildDefaultBackendLaunch(webuiDir) { + if (this.app.isPackaged) { + const packagedBackend = this.getPackagedBackendPath(); + if (!packagedBackend) { + return null; + } + const args = []; + if (webuiDir) { + args.push('--webui-dir', webuiDir); + } + return { + cmd: packagedBackend, + args, + shell: false, + }; + } + + const args = ['run', 'main.py']; + if (webuiDir) { + args.push('--webui-dir', webuiDir); + } + return { + cmd: 'uv', + args, + shell: process.platform === 'win32', + }; + } + + resolveBackendConfig() { + const webuiDir = this.resolveWebuiDir(); + const customCmd = process.env.ASTRBOT_BACKEND_CMD; + const launch = customCmd + ? { + cmd: customCmd, + args: [], + shell: true, + } + : this.buildDefaultBackendLaunch(webuiDir); + const cwd = process.env.ASTRBOT_BACKEND_CWD || this.resolveBackendCwd(); + const rootDir = process.env.ASTRBOT_ROOT || this.resolveBackendRoot(); + ensureDir(cwd); + if (rootDir) { + ensureDir(rootDir); + } + this.backendConfig = { + cmd: launch ? launch.cmd : null, + args: launch ? launch.args : [], + shell: launch ? launch.shell : true, + cwd, + webuiDir, + rootDir, + }; + return this.backendConfig; + } + + getBackendConfig() { + if (!this.backendConfig) { + return this.resolveBackendConfig(); + } + return this.backendConfig; + } + + canManageBackend() { + return Boolean(this.getBackendConfig().cmd); + } + + closeBackendLogFd() { + if (this.backendLogFd === null) { + return; + } + try { + fs.closeSync(this.backendLogFd); + } catch {} + this.backendLogFd = null; + } + + async pingBackend(timeoutMs = 800) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), timeoutMs); + try { + await fetch(this.backendUrl, { + signal: controller.signal, + redirect: 'manual', + }); + return true; + } catch { + return false; + } finally { + clearTimeout(timeout); + } + } + + async waitForBackend(maxWaitMs = 0, failOnProcessExit = false) { + const effectiveMaxWaitMs = + maxWaitMs > 0 + ? maxWaitMs + : this.app.isPackaged + ? PACKAGED_BACKEND_TIMEOUT_FALLBACK_MS + : 0; + const start = Date.now(); + while (true) { + if (await this.pingBackend()) { + return { ok: true, reason: null }; + } + if (failOnProcessExit && !this.backendProcess) { + return { + ok: false, + reason: + this.backendLastExitReason || + 'Backend process exited before becoming reachable.', + }; + } + if (effectiveMaxWaitMs > 0 && Date.now() - start >= effectiveMaxWaitMs) { + return { + ok: false, + reason: `Timed out after ${effectiveMaxWaitMs}ms waiting for backend startup.`, + }; + } + await delay(600); + } + } + + startBackend() { + if (this.shouldSkipStart()) { + this.log('Skip backend start because app is quitting.'); + return; + } + if (this.backendProcess) { + return; + } + const backendConfig = this.getBackendConfig(); + if (!backendConfig.cmd) { + return; + } + + this.backendLastExitReason = null; + const env = { + ...process.env, + PYTHONUNBUFFERED: '1', + }; + if (backendConfig.rootDir) { + env.ASTRBOT_ROOT = backendConfig.rootDir; + const logsDir = path.join(backendConfig.rootDir, 'logs'); + ensureDir(logsDir); + const logPath = path.join(logsDir, 'backend.log'); + try { + this.backendLogFd = fs.openSync(logPath, 'a'); + } catch { + this.backendLogFd = null; + } + } + + this.backendProcess = spawn(backendConfig.cmd, backendConfig.args || [], { + cwd: backendConfig.cwd, + env, + shell: backendConfig.shell, + stdio: + this.backendLogFd === null + ? 'ignore' + : ['ignore', this.backendLogFd, this.backendLogFd], + windowsHide: true, + }); + + if (this.backendLogFd !== null) { + const launchLine = [backendConfig.cmd, ...(backendConfig.args || [])] + .map((item) => JSON.stringify(item)) + .join(' '); + try { + fs.writeSync( + this.backendLogFd, + `[${new Date().toISOString()}] [Electron] Start backend ${launchLine}\n`, + ); + } catch {} + } + + this.backendProcess.on('error', (error) => { + this.backendLastExitReason = + error instanceof Error ? error.message : String(error); + if (this.backendLogFd !== null) { + try { + fs.writeSync( + this.backendLogFd, + `[${new Date().toISOString()}] [Electron] Backend spawn error: ${ + error instanceof Error ? error.message : String(error) + }\n`, + ); + } catch {} + } + this.closeBackendLogFd(); + this.backendProcess = null; + }); + + this.backendProcess.on('exit', (code, signal) => { + this.backendLastExitReason = `Backend process exited (code=${code ?? 'null'}, signal=${signal ?? 'null'}).`; + this.closeBackendLogFd(); + this.backendProcess = null; + }); + } + + async startBackendAndWait(maxWaitMs = this.backendTimeoutMs) { + if (!this.canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + this.backendSpawning = true; + try { + this.startBackend(); + return await this.waitForBackend(maxWaitMs, true); + } finally { + this.backendSpawning = false; + } + } + + async stopManagedBackend() { + if (!this.backendProcess) { + return; + } + const processToStop = this.backendProcess; + const pid = processToStop.pid; + this.backendProcess = null; + this.log(`Stop backend requested pid=${pid ?? 'unknown'}`); + + if (process.platform === 'win32' && pid) { + try { + const result = spawnSync('taskkill', ['/pid', `${pid}`, '/t', '/f'], { + stdio: 'ignore', + windowsHide: true, + }); + if (result.status !== 0) { + this.log( + `taskkill failed pid=${pid} status=${result.status} signal=${result.signal ?? 'null'}`, + ); + } else { + this.log(`taskkill completed pid=${pid}`); + } + } catch (error) { + this.log( + `taskkill threw for pid=${pid}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + await waitForProcessExit(processToStop, 5000); + } else { + if (!processToStop.killed) { + try { + processToStop.kill('SIGTERM'); + } catch (error) { + this.log( + `SIGTERM failed for pid=${pid ?? 'unknown'}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + } + const exitResult = await waitForProcessExit(processToStop, 5000); + if (exitResult === 'timeout' && !processToStop.killed) { + try { + processToStop.kill('SIGKILL'); + } catch {} + await waitForProcessExit(processToStop, 1500); + } + } + this.closeBackendLogFd(); + } + + async ensureBackend() { + this.backendStartupFailureReason = null; + + const running = await this.pingBackend(); + if (running) { + return true; + } + if (!this.backendAutoStart || !this.canManageBackend()) { + this.backendStartupFailureReason = + 'Backend auto-start is disabled or backend command is not configured.'; + return false; + } + const waitResult = await this.startBackendAndWait(this.backendTimeoutMs); + if (!waitResult.ok) { + this.backendStartupFailureReason = waitResult.reason; + return false; + } + return true; + } + + async getState() { + return { + running: await this.pingBackend(), + spawning: this.backendSpawning, + restarting: this.backendRestarting, + canManage: this.canManageBackend(), + }; + } + + async restartBackend() { + if (!this.canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + if (this.backendSpawning || this.backendRestarting) { + return { + ok: false, + reason: 'Backend action already in progress.', + }; + } + + this.backendRestarting = true; + try { + await this.stopManagedBackend(); + const startResult = await this.startBackendAndWait(this.backendTimeoutMs); + if (!startResult.ok) { + return { + ok: false, + reason: startResult.reason || 'Failed to restart backend.', + }; + } + return { + ok: true, + reason: null, + }; + } catch (error) { + return { + ok: false, + reason: error instanceof Error ? error.message : String(error), + }; + } finally { + this.backendRestarting = false; + } + } + + async stopBackendForIpc() { + if (!this.canManageBackend()) { + return { + ok: false, + reason: 'Backend command is not configured.', + }; + } + if (this.backendSpawning || this.backendRestarting) { + return { + ok: false, + reason: 'Backend action already in progress.', + }; + } + + try { + if (!this.backendProcess) { + const running = await this.pingBackend(); + if (running) { + return { + ok: false, + reason: 'Backend is running but not managed by Electron.', + }; + } + return { + ok: true, + reason: null, + }; + } + await this.stopManagedBackend(); + const running = await this.pingBackend(); + if (running) { + return { + ok: false, + reason: 'Backend is still reachable after stop request.', + }; + } + return { + ok: true, + reason: null, + }; + } catch (error) { + return { + ok: false, + reason: error instanceof Error ? error.message : String(error), + }; + } + } +} + +module.exports = { + BackendManager, +}; diff --git a/desktop/lib/common.js b/desktop/lib/common.js new file mode 100644 index 0000000000..561eca39eb --- /dev/null +++ b/desktop/lib/common.js @@ -0,0 +1,59 @@ +'use strict'; + +const fs = require('fs'); + +function normalizeUrl(value) { + try { + const url = new URL(value); + if (!url.pathname.endsWith('/')) { + url.pathname += '/'; + } + return url.toString(); + } catch { + return 'http://127.0.0.1:6185/'; + } +} + +function ensureDir(value) { + if (!value) { + return; + } + if (fs.existsSync(value)) { + return; + } + fs.mkdirSync(value, { recursive: true }); +} + +function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function waitForProcessExit(child, timeoutMs = 5000) { + if (!child) { + return Promise.resolve('missing'); + } + if (child.exitCode !== null || child.signalCode !== null) { + return Promise.resolve('exited'); + } + return new Promise((resolve) => { + let settled = false; + const finish = (reason) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + resolve(reason); + }; + const timeout = setTimeout(() => finish('timeout'), timeoutMs); + child.once('exit', () => finish('exit')); + child.once('error', () => finish('error')); + }); +} + +module.exports = { + delay, + ensureDir, + normalizeUrl, + waitForProcessExit, +}; diff --git a/desktop/lib/dashboard-loader.js b/desktop/lib/dashboard-loader.js new file mode 100644 index 0000000000..6e858843fd --- /dev/null +++ b/desktop/lib/dashboard-loader.js @@ -0,0 +1,30 @@ +'use strict'; + +const { delay } = require('./common'); + +async function loadDashboard(mainWindow, backendUrl, maxWaitMs = 20000) { + if (!mainWindow) { + return false; + } + const loadUrl = new URL(backendUrl); + loadUrl.searchParams.set('_electron_ts', `${Date.now()}`); + const start = Date.now(); + let lastError = null; + while (maxWaitMs <= 0 || Date.now() - start < maxWaitMs) { + try { + await mainWindow.loadURL(loadUrl.toString()); + return true; + } catch (error) { + lastError = error; + await delay(600); + } + } + if (lastError) { + throw lastError; + } + throw new Error(`Timed out loading ${backendUrl}`); +} + +module.exports = { + loadDashboard, +}; diff --git a/desktop/lib/electron-logger.js b/desktop/lib/electron-logger.js new file mode 100644 index 0000000000..b8dc73bc6c --- /dev/null +++ b/desktop/lib/electron-logger.js @@ -0,0 +1,33 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const { ensureDir } = require('./common'); + +function createElectronLogger({ app, getRootDir }) { + function getElectronLogPath() { + const rootDir = + process.env.ASTRBOT_ROOT || + (typeof getRootDir === 'function' ? getRootDir() : null) || + app.getPath('userData'); + return path.join(rootDir, 'logs', 'electron.log'); + } + + function logElectron(message) { + const logPath = getElectronLogPath(); + ensureDir(path.dirname(logPath)); + const line = `[${new Date().toISOString()}] ${message}\n`; + try { + fs.appendFileSync(logPath, line, 'utf8'); + } catch {} + } + + return { + getElectronLogPath, + logElectron, + }; +} + +module.exports = { + createElectronLogger, +}; diff --git a/desktop/lib/locale-service.js b/desktop/lib/locale-service.js new file mode 100644 index 0000000000..b917aba3e5 --- /dev/null +++ b/desktop/lib/locale-service.js @@ -0,0 +1,172 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const { delay, ensureDir } = require('./common'); + +const LOCALE_STORAGE_KEY = 'astrbot-locale'; +const SUPPORTED_STARTUP_LOCALES = new Set(['zh-CN', 'en-US']); + +function normalizeLocale(value) { + if (!value) { + return null; + } + const raw = String(value).trim(); + if (!raw) { + return null; + } + if (SUPPORTED_STARTUP_LOCALES.has(raw)) { + return raw; + } + const lower = raw.toLowerCase(); + if (lower.startsWith('zh')) { + return 'zh-CN'; + } + if (lower.startsWith('en')) { + return 'en-US'; + } + return null; +} + +function getStartupTexts(locale) { + if (locale === 'zh-CN') { + return { + title: 'AstrBot 正在启动', + message: '界面很快就会加载完成。', + }; + } + return { + title: 'AstrBot is starting', + message: 'The dashboard will be ready in a moment.', + }; +} + +function getShellTexts(locale) { + if (locale === 'zh-CN') { + return { + trayHide: '隐藏 AstrBot', + trayShow: '显示 AstrBot', + trayReload: '重新加载', + trayQuit: '退出', + startupFailTitle: 'AstrBot 启动失败', + startupFailMessage: 'AstrBot 后端不可达。', + startupFailReasonPrefix: '原因', + startupFailAction: + '请先启动 http://127.0.0.1:6185 的后端服务,然后重新打开 AstrBot。', + startupFailLogPrefix: '后端日志', + dashboardFailTitle: 'AstrBot 加载失败', + dashboardFailMessage: '无法加载 AstrBot 控制台页面。', + }; + } + return { + trayHide: 'Hide AstrBot', + trayShow: 'Show AstrBot', + trayReload: 'Reload', + trayQuit: 'Quit', + startupFailTitle: 'AstrBot startup failed', + startupFailMessage: 'AstrBot backend is not reachable.', + startupFailReasonPrefix: 'Reason', + startupFailAction: + 'Please start the backend at http://127.0.0.1:6185 and relaunch AstrBot.', + startupFailLogPrefix: 'Backend log', + dashboardFailTitle: 'Failed to load AstrBot', + dashboardFailMessage: 'Unable to load the AstrBot dashboard.', + }; +} + +function createLocaleService({ app, getRootDir }) { + function resolveStateRoot() { + const callbackRoot = (() => { + try { + return getRootDir ? getRootDir() : null; + } catch { + return null; + } + })(); + return process.env.ASTRBOT_ROOT || callbackRoot || app.getPath('userData'); + } + + function getDesktopStatePath() { + return path.join(resolveStateRoot(), 'data', 'desktop_state.json'); + } + + function readCachedLocale() { + const statePath = getDesktopStatePath(); + try { + const raw = fs.readFileSync(statePath, 'utf8'); + const parsed = JSON.parse(raw); + return normalizeLocale(parsed?.locale); + } catch { + return null; + } + } + + function writeCachedLocale(locale) { + const normalized = normalizeLocale(locale); + if (!normalized) { + return; + } + const statePath = getDesktopStatePath(); + ensureDir(path.dirname(statePath)); + try { + fs.writeFileSync( + statePath, + `${JSON.stringify({ locale: normalized }, null, 2)}\n`, + 'utf8', + ); + } catch {} + } + + function resolveStartupLocale() { + const cached = readCachedLocale(); + if (cached) { + return cached; + } + return normalizeLocale(app.getLocale()) || 'zh-CN'; + } + + async function persistLocaleFromDashboard( + mainWindow, + backendUrl, + timeoutMs = 1200, + ) { + if (!mainWindow || mainWindow.isDestroyed()) { + return; + } + const currentUrl = mainWindow.webContents.getURL(); + if (!currentUrl || !currentUrl.startsWith(backendUrl)) { + return; + } + try { + const localeRaw = await Promise.race([ + mainWindow.webContents.executeJavaScript( + `(() => { + try { + return window.localStorage.getItem('${LOCALE_STORAGE_KEY}') || ''; + } catch { + return ''; + } + })();`, + true, + ), + delay(timeoutMs).then(() => null), + ]); + const locale = normalizeLocale(localeRaw); + if (locale) { + writeCachedLocale(locale); + } + } catch {} + } + + return { + getShellTexts, + getStartupTexts, + persistLocaleFromDashboard, + resolveStartupLocale, + }; +} + +module.exports = { + createLocaleService, + normalizeLocale, +}; diff --git a/desktop/lib/startup-screen.js b/desktop/lib/startup-screen.js new file mode 100644 index 0000000000..93a342b81d --- /dev/null +++ b/desktop/lib/startup-screen.js @@ -0,0 +1,116 @@ +'use strict'; + +const fs = require('fs'); + +async function loadStartupScreen(mainWindow, { getAssetPath, startupTexts }) { + if (!mainWindow) { + return false; + } + let iconUrl = ''; + try { + const iconBuffer = fs.readFileSync(getAssetPath('icon-no-shadow.svg')); + iconUrl = `data:image/svg+xml;base64,${iconBuffer.toString('base64')}`; + } catch {} + + const html = ` + + + + + AstrBot + + + +
+ ${ + iconUrl + ? `` + : '' + } + +

${startupTexts.title}

+

${startupTexts.message}

+
+ +`; + const startupUrl = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`; + await mainWindow.loadURL(startupUrl); + return true; +} + +module.exports = { + loadStartupScreen, +}; diff --git a/desktop/main.js b/desktop/main.js index cc5f1a1b38..a578fdc813 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -1,7 +1,6 @@ 'use strict'; const fs = require('fs'); -const os = require('os'); const path = require('path'); const { app, @@ -13,57 +12,46 @@ const { dialog, ipcMain, } = require('electron'); -const { spawn, spawnSync } = require('child_process'); + +const { BackendManager } = require('./lib/backend-manager'); +const { loadDashboard } = require('./lib/dashboard-loader'); +const { createElectronLogger } = require('./lib/electron-logger'); +const { createLocaleService } = require('./lib/locale-service'); +const { loadStartupScreen } = require('./lib/startup-screen'); const isMac = process.platform === 'darwin'; -const backendUrl = normalizeUrl( - process.env.ASTRBOT_BACKEND_URL || 'http://127.0.0.1:6185/', -); -const backendAutoStart = process.env.ASTRBOT_BACKEND_AUTO_START !== '0'; -const defaultBackendTimeoutMs = app.isPackaged ? 0 : 20000; -const backendTimeoutMsParsed = Number.parseInt( - process.env.ASTRBOT_BACKEND_TIMEOUT_MS || `${defaultBackendTimeoutMs}`, - 10, -); -const backendTimeoutMs = - Number.isFinite(backendTimeoutMsParsed) && backendTimeoutMsParsed >= 0 - ? backendTimeoutMsParsed - : defaultBackendTimeoutMs; -const dashboardTimeoutMs = Number.parseInt( +const dashboardTimeoutMsParsed = Number.parseInt( process.env.ASTRBOT_DASHBOARD_TIMEOUT_MS || '20000', 10, ); -const LOCALE_STORAGE_KEY = 'astrbot-locale'; -const SUPPORTED_STARTUP_LOCALES = new Set(['zh-CN', 'en-US']); +const dashboardTimeoutMs = Number.isFinite(dashboardTimeoutMsParsed) + ? dashboardTimeoutMsParsed + : 20000; let mainWindow = null; let tray = null; let isQuitting = false; let quitInProgress = false; -let backendProcess = null; -let backendConfig = null; -let backendLogFd = null; -let backendLastExitReason = null; -let backendStartupFailureReason = null; -let backendSpawning = false; -let backendRestarting = false; +let backendManager = null; app.commandLine.appendSwitch('disable-http-cache'); -function getElectronLogPath() { - const rootDir = - process.env.ASTRBOT_ROOT || backendConfig?.rootDir || app.getPath('userData'); - return path.join(rootDir, 'logs', 'electron.log'); -} +const { logElectron } = createElectronLogger({ + app, + getRootDir: () => (backendManager ? backendManager.getRootDir() : null), +}); -function logElectron(message) { - const logPath = getElectronLogPath(); - ensureDir(path.dirname(logPath)); - const line = `[${new Date().toISOString()}] ${message}\n`; - try { - fs.appendFileSync(logPath, line, 'utf8'); - } catch {} -} +backendManager = new BackendManager({ + app, + baseDir: __dirname, + log: logElectron, + shouldSkipStart: () => isQuitting || quitInProgress, +}); + +const localeService = createLocaleService({ + app, + getRootDir: () => backendManager.getRootDir(), +}); function getAssetPath(filename) { if (app.isPackaged) { @@ -85,585 +73,77 @@ function loadImageSafe(imagePath) { return nativeImage.createEmpty(); } -function normalizeUrl(value) { - try { - const url = new URL(value); - if (!url.pathname.endsWith('/')) { - url.pathname += '/'; - } - return url.toString(); - } catch { - return 'http://127.0.0.1:6185/'; - } -} - -function ensureDir(value) { - if (!value) { - return; - } - if (fs.existsSync(value)) { - return; - } - fs.mkdirSync(value, { recursive: true }); -} - -function closeBackendLogFd() { - if (backendLogFd === null) { +function showWindow() { + if (!mainWindow) { return; } - try { - fs.closeSync(backendLogFd); - } catch {} - backendLogFd = null; -} - -function getPackagedBackendPath() { - if (!app.isPackaged) { - return null; - } - const filename = - process.platform === 'win32' ? 'astrbot-backend.exe' : 'astrbot-backend'; - const candidate = path.join(process.resourcesPath, 'backend', filename); - return fs.existsSync(candidate) ? candidate : null; -} - -function resolveWebuiDir() { - if (process.env.ASTRBOT_WEBUI_DIR) { - return process.env.ASTRBOT_WEBUI_DIR; - } - if (!app.isPackaged) { - return null; - } - const candidate = path.join(process.resourcesPath, 'webui'); - const indexPath = path.join(candidate, 'index.html'); - return fs.existsSync(indexPath) ? candidate : null; -} - -function resolveBackendRoot() { - if (!app.isPackaged) { - return null; - } - return path.join(os.homedir(), '.astrbot'); -} - -function resolveBackendCwd() { - if (!app.isPackaged) { - return path.resolve(__dirname, '..'); - } - return resolveBackendRoot(); -} - -function normalizeLocale(value) { - if (!value) { - return null; - } - const raw = String(value).trim(); - if (!raw) { - return null; - } - if (SUPPORTED_STARTUP_LOCALES.has(raw)) { - return raw; - } - const lower = raw.toLowerCase(); - if (lower.startsWith('zh')) { - return 'zh-CN'; - } - if (lower.startsWith('en')) { - return 'en-US'; - } - return null; -} - -function getDesktopStatePath() { - const rootDir = - process.env.ASTRBOT_ROOT || - backendConfig?.rootDir || - resolveBackendRoot() || - app.getPath('userData'); - return path.join(rootDir, 'data', 'desktop_state.json'); -} - -function readCachedLocale() { - const statePath = getDesktopStatePath(); - try { - const raw = fs.readFileSync(statePath, 'utf8'); - const parsed = JSON.parse(raw); - return normalizeLocale(parsed?.locale); - } catch { - return null; - } + mainWindow.show(); + mainWindow.focus(); + updateTrayMenu(); } -function writeCachedLocale(locale) { - const normalized = normalizeLocale(locale); - if (!normalized) { +function toggleWindow() { + if (!mainWindow) { return; } - const statePath = getDesktopStatePath(); - ensureDir(path.dirname(statePath)); - try { - fs.writeFileSync( - statePath, - `${JSON.stringify({ locale: normalized }, null, 2)}\n`, - 'utf8', - ); - } catch {} -} - -function resolveStartupLocale() { - const cached = readCachedLocale(); - if (cached) { - return cached; - } - return normalizeLocale(app.getLocale()) || 'zh-CN'; -} - -function getStartupTexts(locale) { - if (locale === 'zh-CN') { - return { - title: 'AstrBot 正在启动', - message: '界面很快就会加载完成。', - }; - } - return { - title: 'AstrBot is starting', - message: 'The dashboard will be ready in a moment.', - }; -} - -function buildDefaultBackendLaunch(webuiDir) { - if (app.isPackaged) { - const packagedBackend = getPackagedBackendPath(); - if (!packagedBackend) { - return null; - } - const args = []; - if (webuiDir) { - args.push('--webui-dir', webuiDir); - } - return { - cmd: packagedBackend, - args, - shell: false, - }; - } - const args = ['run', 'main.py']; - if (webuiDir) { - args.push('--webui-dir', webuiDir); - } - return { - cmd: 'uv', - args, - shell: process.platform === 'win32', - }; -} - -function resolveBackendConfig() { - const webuiDir = resolveWebuiDir(); - const customCmd = process.env.ASTRBOT_BACKEND_CMD; - const launch = customCmd - ? { - cmd: customCmd, - args: [], - shell: true, - } - : buildDefaultBackendLaunch(webuiDir); - const cwd = process.env.ASTRBOT_BACKEND_CWD || resolveBackendCwd(); - const rootDir = process.env.ASTRBOT_ROOT || resolveBackendRoot(); - ensureDir(cwd); - if (rootDir) { - ensureDir(rootDir); - } - return { - cmd: launch ? launch.cmd : null, - args: launch ? launch.args : [], - shell: launch ? launch.shell : true, - cwd, - webuiDir, - rootDir, - }; -} - -function delay(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -function waitForProcessExit(child, timeoutMs = 5000) { - if (!child) { - return Promise.resolve('missing'); - } - if (child.exitCode !== null || child.signalCode !== null) { - return Promise.resolve('exited'); - } - return new Promise((resolve) => { - let settled = false; - const finish = (reason) => { - if (settled) { - return; - } - settled = true; - clearTimeout(timeout); - resolve(reason); - }; - const timeout = setTimeout(() => finish('timeout'), timeoutMs); - child.once('exit', () => finish('exit')); - child.once('error', () => finish('error')); - }); -} - -async function pingBackend(timeoutMs = 800) { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); - try { - await fetch(backendUrl, { - signal: controller.signal, - redirect: 'manual', - }); - return true; - } catch { - return false; - } finally { - clearTimeout(timeout); - } -} - -async function waitForBackend(maxWaitMs = 0, failOnProcessExit = false) { - const start = Date.now(); - while (true) { - if (await pingBackend()) { - return { ok: true, reason: null }; - } - if (failOnProcessExit && !backendProcess) { - return { - ok: false, - reason: - backendLastExitReason || - 'Backend process exited before becoming reachable.', - }; - } - if (maxWaitMs > 0 && Date.now() - start >= maxWaitMs) { - return { - ok: false, - reason: `Timed out after ${maxWaitMs}ms waiting for backend startup.`, - }; - } - await delay(600); - } -} - -function canManageBackend() { - if (!backendConfig) { - backendConfig = resolveBackendConfig(); - } - return Boolean(backendConfig?.cmd); -} - -async function startBackendAndWait(maxWaitMs = backendTimeoutMs) { - if (!canManageBackend()) { - return { - ok: false, - reason: 'Backend command is not configured.', - }; - } - backendSpawning = true; - try { - startBackend(); - return await waitForBackend(maxWaitMs, true); - } finally { - backendSpawning = false; + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + mainWindow.focus(); } + updateTrayMenu(); } -function startBackend() { - if (isQuitting || quitInProgress) { - logElectron('Skip backend start because app is quitting.'); - return; - } - if (backendProcess) { - return; - } - if (!backendConfig) { - backendConfig = resolveBackendConfig(); - } - if (!backendConfig.cmd) { +function updateTrayMenu() { + if (!tray || !mainWindow) { return; } - backendLastExitReason = null; - const env = { - ...process.env, - PYTHONUNBUFFERED: '1', - }; - if (backendConfig.rootDir) { - env.ASTRBOT_ROOT = backendConfig.rootDir; - const logsDir = path.join(backendConfig.rootDir, 'logs'); - ensureDir(logsDir); - const logPath = path.join(logsDir, 'backend.log'); - try { - backendLogFd = fs.openSync(logPath, 'a'); - } catch { - backendLogFd = null; - } - } - backendProcess = spawn(backendConfig.cmd, backendConfig.args || [], { - cwd: backendConfig.cwd, - env, - shell: backendConfig.shell, - stdio: - backendLogFd === null - ? 'ignore' - : ['ignore', backendLogFd, backendLogFd], - windowsHide: true, - }); - - if (backendLogFd !== null) { - const launchLine = [backendConfig.cmd, ...(backendConfig.args || [])] - .map((item) => JSON.stringify(item)) - .join(' '); - try { - fs.writeSync( - backendLogFd, - `[${new Date().toISOString()}] [Electron] Start backend ${launchLine}\n`, - ); - } catch {} - } - - backendProcess.on('error', (error) => { - backendLastExitReason = - error instanceof Error ? error.message : String(error); - if (backendLogFd !== null) { - try { - fs.writeSync( - backendLogFd, - `[${new Date().toISOString()}] [Electron] Backend spawn error: ${ - error instanceof Error ? error.message : String(error) - }\n`, - ); - } catch {} - } - closeBackendLogFd(); - backendProcess = null; - }); - - backendProcess.on('exit', (code, signal) => { - backendLastExitReason = `Backend process exited (code=${code ?? 'null'}, signal=${signal ?? 'null'}).`; - closeBackendLogFd(); - backendProcess = null; - }); + const shellTexts = localeService.getShellTexts( + localeService.resolveStartupLocale(), + ); + const isVisible = mainWindow.isVisible(); + const contextMenu = Menu.buildFromTemplate([ + { + label: isVisible ? shellTexts.trayHide : shellTexts.trayShow, + click: () => toggleWindow(), + }, + { + label: shellTexts.trayReload, + click: () => { + if (mainWindow) { + mainWindow.reload(); + } + }, + }, + { type: 'separator' }, + { + label: shellTexts.trayQuit, + click: () => app.quit(), + }, + ]); + tray.setContextMenu(contextMenu); } -async function stopBackend() { - if (!backendProcess) { - return; +function createTray() { + const traySize = isMac ? 18 : 16; + const trayPath = getAssetPath('tray.png'); + let trayImage = loadImageSafe(trayPath); + if (trayImage.isEmpty()) { + trayImage = loadImageSafe(getAssetPath('icon.png')); } - const processToStop = backendProcess; - const pid = processToStop.pid; - backendProcess = null; - logElectron(`Stop backend requested pid=${pid ?? 'unknown'}`); - - if (process.platform === 'win32' && pid) { - try { - const result = spawnSync('taskkill', ['/pid', `${pid}`, '/t', '/f'], { - stdio: 'ignore', - windowsHide: true, - }); - if (result.status !== 0) { - logElectron( - `taskkill failed pid=${pid} status=${result.status} signal=${result.signal ?? 'null'}`, - ); - } else { - logElectron(`taskkill completed pid=${pid}`); - } - } catch (error) { - logElectron( - `taskkill threw for pid=${pid}: ${ - error instanceof Error ? error.message : String(error) - }`, - ); + if (!trayImage.isEmpty()) { + trayImage = trayImage.resize({ width: traySize, height: traySize }); + if (isMac) { + trayImage.setTemplateImage(true); } - await waitForProcessExit(processToStop, 5000); + tray = new Tray(trayImage); } else { - if (!processToStop.killed) { - try { - processToStop.kill('SIGTERM'); - } catch (error) { - logElectron( - `SIGTERM failed for pid=${pid ?? 'unknown'}: ${ - error instanceof Error ? error.message : String(error) - }`, - ); - } - } - const exitResult = await waitForProcessExit(processToStop, 5000); - if (exitResult === 'timeout' && !processToStop.killed) { - try { - processToStop.kill('SIGKILL'); - } catch {} - await waitForProcessExit(processToStop, 1500); - } - } - closeBackendLogFd(); -} - -async function loadDashboard(maxWaitMs = 20000) { - if (!mainWindow) { - return false; - } - const loadUrl = new URL(backendUrl); - loadUrl.searchParams.set('_electron_ts', `${Date.now()}`); - const start = Date.now(); - let lastError = null; - while (maxWaitMs <= 0 || Date.now() - start < maxWaitMs) { - try { - await mainWindow.loadURL(loadUrl.toString()); - return true; - } catch (error) { - lastError = error; - await delay(600); - } - } - if (lastError) { - throw lastError; - } - throw new Error(`Timed out loading ${backendUrl}`); -} - -async function persistLocaleFromDashboard(timeoutMs = 1200) { - if (!mainWindow || mainWindow.isDestroyed()) { - return; - } - const currentUrl = mainWindow.webContents.getURL(); - if (!currentUrl || !currentUrl.startsWith(backendUrl)) { - return; - } - try { - const localeRaw = await Promise.race([ - mainWindow.webContents.executeJavaScript( - `(() => { - try { - return window.localStorage.getItem('${LOCALE_STORAGE_KEY}') || ''; - } catch { - return ''; - } - })();`, - true, - ), - delay(timeoutMs).then(() => null), - ]); - const locale = normalizeLocale(localeRaw); - if (locale) { - writeCachedLocale(locale); - } - } catch {} -} - -async function loadStartupScreen() { - if (!mainWindow) { - return false; + tray = new Tray(nativeImage.createEmpty()); } - const startupLocale = resolveStartupLocale(); - const startupTexts = getStartupTexts(startupLocale); - let iconUrl = ''; - try { - const iconBuffer = fs.readFileSync(getAssetPath('icon-no-shadow.svg')); - iconUrl = `data:image/svg+xml;base64,${iconBuffer.toString('base64')}`; - } catch {} - const html = ` - - - - - AstrBot - - - -
- ${ - iconUrl - ? `` - : '' - } - -

${startupTexts.title}

-

${startupTexts.message}

-
- -`; - const startupUrl = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`; - await mainWindow.loadURL(startupUrl); - return true; + tray.setToolTip('AstrBot'); + tray.on('click', () => toggleWindow()); + updateTrayMenu(); } function createWindow() { @@ -720,8 +200,11 @@ function createWindow() { mainWindow.webContents.on('did-finish-load', () => { const currentUrl = mainWindow.webContents.getURL(); logElectron(`did-finish-load url=${currentUrl}`); - if (currentUrl.startsWith(backendUrl)) { - void persistLocaleFromDashboard(); + if (currentUrl.startsWith(backendManager.getBackendUrl())) { + void localeService.persistLocaleFromDashboard( + mainWindow, + backendManager.getBackendUrl(), + ); } }); @@ -745,195 +228,100 @@ function createWindow() { return mainWindow; } -function updateTrayMenu() { - if (!tray || !mainWindow) { - return; - } - const isVisible = mainWindow.isVisible(); - const contextMenu = Menu.buildFromTemplate([ - { - label: isVisible ? 'Hide AstrBot' : 'Show AstrBot', - click: () => toggleWindow(), - }, - { - label: 'Reload', - click: () => { - if (mainWindow) { - mainWindow.reload(); - } - }, - }, - { type: 'separator' }, - { - label: 'Quit', - click: () => app.quit(), - }, - ]); - tray.setContextMenu(contextMenu); -} +function registerIpcHandlers() { + ipcMain.handle('astrbot-desktop:is-electron-runtime', async () => true); -function createTray() { - const traySize = isMac ? 18 : 16; - const trayPath = getAssetPath('tray.png'); - let trayImage = loadImageSafe(trayPath); - if (trayImage.isEmpty()) { - trayImage = loadImageSafe(getAssetPath('icon.png')); - } - if (!trayImage.isEmpty()) { - trayImage = trayImage.resize({ width: traySize, height: traySize }); - if (isMac) { - trayImage.setTemplateImage(true); - } - tray = new Tray(trayImage); - } else { - tray = new Tray(nativeImage.createEmpty()); - } - tray.setToolTip('AstrBot'); - tray.on('click', () => toggleWindow()); - updateTrayMenu(); -} + ipcMain.handle('astrbot-desktop:get-backend-state', async () => { + return backendManager.getState(); + }); -function showWindow() { - if (!mainWindow) { - return; - } - mainWindow.show(); - mainWindow.focus(); - updateTrayMenu(); -} + ipcMain.handle('astrbot-desktop:restart-backend', async () => { + return backendManager.restartBackend(); + }); -function toggleWindow() { - if (!mainWindow) { - return; - } - if (mainWindow.isVisible()) { - mainWindow.hide(); - } else { - mainWindow.show(); - mainWindow.focus(); - } - updateTrayMenu(); + ipcMain.handle('astrbot-desktop:stop-backend', async () => { + return backendManager.stopBackendForIpc(); + }); } -async function ensureBackend() { - backendStartupFailureReason = null; - if (!backendConfig) { - backendConfig = resolveBackendConfig(); - } - const running = await pingBackend(); - if (running) { - return true; - } - if (!backendAutoStart || !backendConfig.cmd) { - backendStartupFailureReason = - 'Backend auto-start is disabled or backend command is not configured.'; - return false; - } - const waitResult = await startBackendAndWait(backendTimeoutMs); - if (!waitResult.ok) { - backendStartupFailureReason = waitResult.reason; - return false; - } - return true; -} +async function startDesktopFlow() { + createWindow(); + createTray(); -ipcMain.handle('astrbot-desktop:is-electron-runtime', async () => true); + try { + const startupTexts = localeService.getStartupTexts( + localeService.resolveStartupLocale(), + ); + await loadStartupScreen(mainWindow, { + getAssetPath, + startupTexts, + }); + } catch (error) { + logElectron( + `failed to load startup screen: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } -ipcMain.handle('astrbot-desktop:get-backend-state', async () => { - const running = await pingBackend(); - return { - running, - spawning: backendSpawning, - restarting: backendRestarting, - canManage: canManageBackend(), - }; -}); + showWindow(); -ipcMain.handle('astrbot-desktop:restart-backend', async () => { - if (!canManageBackend()) { - return { - ok: false, - reason: 'Backend command is not configured.', - }; - } - if (backendSpawning || backendRestarting) { - return { - ok: false, - reason: 'Backend action already in progress.', - }; + const ready = await backendManager.ensureBackend(); + if (isQuitting) { + return; } - backendRestarting = true; - try { - await stopBackend(); - const startResult = await startBackendAndWait(backendTimeoutMs); - if (!startResult.ok) { - return { - ok: false, - reason: startResult.reason || 'Failed to restart backend.', - }; + if (!ready) { + const shellTexts = localeService.getShellTexts( + localeService.resolveStartupLocale(), + ); + const backendLogPath = backendManager.getBackendLogPath(); + const detailLines = []; + const startupFailureReason = backendManager.getStartupFailureReason(); + if (startupFailureReason) { + detailLines.push( + `${shellTexts.startupFailReasonPrefix}: ${startupFailureReason}`, + ); + } + detailLines.push(shellTexts.startupFailAction); + if (backendLogPath) { + detailLines.push(`${shellTexts.startupFailLogPrefix}: ${backendLogPath}`); } - return { - ok: true, - reason: null, - }; - } catch (error) { - return { - ok: false, - reason: error instanceof Error ? error.message : String(error), - }; - } finally { - backendRestarting = false; - } -}); -ipcMain.handle('astrbot-desktop:stop-backend', async () => { - if (!canManageBackend()) { - return { - ok: false, - reason: 'Backend command is not configured.', - }; - } - if (backendSpawning || backendRestarting) { - return { - ok: false, - reason: 'Backend action already in progress.', - }; + await dialog.showMessageBox({ + type: 'error', + title: shellTexts.startupFailTitle, + message: shellTexts.startupFailMessage, + detail: detailLines.join('\n'), + }); + isQuitting = true; + app.quit(); + return; } try { - if (!backendProcess) { - const running = await pingBackend(); - if (running) { - return { - ok: false, - reason: 'Backend is running but not managed by Electron.', - }; - } - return { - ok: true, - reason: null, - }; - } - await stopBackend(); - const running = await pingBackend(); - if (running) { - return { - ok: false, - reason: 'Backend is still reachable after stop request.', - }; - } - return { - ok: true, - reason: null, - }; + await loadDashboard( + mainWindow, + backendManager.getBackendUrl(), + dashboardTimeoutMs, + ); + showWindow(); } catch (error) { - return { - ok: false, - reason: error instanceof Error ? error.message : String(error), - }; + const shellTexts = localeService.getShellTexts( + localeService.resolveStartupLocale(), + ); + await dialog.showMessageBox({ + type: 'error', + title: shellTexts.dashboardFailTitle, + message: shellTexts.dashboardFailMessage, + detail: error instanceof Error ? error.message : String(error), + }); + isQuitting = true; + app.quit(); } -}); +} + +registerIpcHandlers(); app.setAppUserModelId('com.astrbot.desktop'); @@ -955,10 +343,12 @@ app.on('before-quit', (event) => { quitInProgress = true; isQuitting = true; logElectron('before-quit received, stopping backend.'); - persistLocaleFromDashboard() + + localeService + .persistLocaleFromDashboard(mainWindow, backendManager.getBackendUrl()) .catch(() => {}) .then(() => - stopBackend().catch((error) => { + backendManager.stopManagedBackend().catch((error) => { logElectron( `stopBackend failed: ${ error instanceof Error ? error.message : String(error) @@ -967,9 +357,7 @@ app.on('before-quit', (event) => { }), ) .finally(() => { - logElectron( - 'Backend stop finished, exiting app.', - ); + logElectron('Backend stop finished, exiting app.'); app.exit(0); }); }); @@ -981,62 +369,7 @@ app.whenReady().then(async () => { app.dock.setIcon(dockIcon); } } - createWindow(); - createTray(); - try { - await loadStartupScreen(); - } catch (error) { - logElectron( - `failed to load startup screen: ${ - error instanceof Error ? error.message : String(error) - }`, - ); - } - showWindow(); - - const ready = await ensureBackend(); - if (isQuitting) { - return; - } - - if (!ready) { - const backendLogPath = backendConfig?.rootDir - ? path.join(backendConfig.rootDir, 'logs', 'backend.log') - : null; - const detailLines = []; - if (backendStartupFailureReason) { - detailLines.push(`Reason: ${backendStartupFailureReason}`); - } - detailLines.push( - 'Please start the backend at http://127.0.0.1:6185 and relaunch AstrBot.', - ); - if (backendLogPath) { - detailLines.push(`Backend log: ${backendLogPath}`); - } - await dialog.showMessageBox({ - type: 'error', - title: 'AstrBot startup failed', - message: 'AstrBot backend is not reachable.', - detail: detailLines.join('\n'), - }); - isQuitting = true; - app.quit(); - return; - } - - try { - await loadDashboard(dashboardTimeoutMs); - showWindow(); - } catch (error) { - await dialog.showMessageBox({ - type: 'error', - title: 'Failed to load AstrBot', - message: 'Unable to load the AstrBot dashboard.', - detail: error instanceof Error ? error.message : String(error), - }); - isQuitting = true; - app.quit(); - } + await startDesktopFlow(); }); app.on('activate', () => { diff --git a/desktop/scripts/build-backend.mjs b/desktop/scripts/build-backend.mjs index 3321024a6d..aac32bc189 100644 --- a/desktop/scripts/build-backend.mjs +++ b/desktop/scripts/build-backend.mjs @@ -53,8 +53,16 @@ const result = spawnSync('uv', args, { }); if (result.error) { - console.error('Failed to run uv. Make sure uv and pyinstaller are installed.'); - process.exit(1); + console.error(`Failed to run 'uv': ${result.error.message}`); + process.exit(typeof result.status === 'number' ? result.status : 1); } -process.exit(result.status ?? 1); +if (result.status !== 0) { + console.error( + `'uv' exited with status ${result.status} while running PyInstaller. ` + + 'Verify that uv and pyinstaller are installed and that arguments are valid.', + ); + process.exit(result.status ?? 1); +} + +process.exit(0);