From f6807412acc720b7726de666f429f1c3a7e614f6 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 20 Jun 2024 22:00:38 -0300 Subject: [PATCH 01/29] [desktop]: Fix Sky Atlas refresh --- desktop/src/app/atlas/atlas.component.ts | 20 ++++++++++---------- desktop/src/app/image/image.component.html | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index d9714ee2c..816faa56a 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -447,8 +447,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, }) }) - electron.on('DATA.CHANGED', (event) => { - this.loadTabFromData(event) + electron.on('DATA.CHANGED', async (event) => { + await this.loadTabFromData(event) }) this.location = this.preference.selectedLocation.get() @@ -485,14 +485,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } }) - this.route.queryParams.subscribe((e) => { + this.route.queryParams.subscribe(async (e) => { const data = JSON.parse(decodeURIComponent(e.data)) as SkyAtlasData - this.loadTabFromData(data) + await this.loadTabFromData(data) }) } - ngAfterViewInit() { - this.refreshTab() + async ngAfterViewInit() { + await this.refreshTab() this.calendarPanel.onOverlayClick = (e) => { e.stopImmediatePropagation() @@ -504,8 +504,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.refreshTimer?.unsubscribe() } - private loadTabFromData(data?: SkyAtlasData) { - if (data) { + private async loadTabFromData(data?: SkyAtlasData) { + if (data && data.tab) { this.tab = data.tab if (this.tab === SkyAtlasTab.SKY_OBJECT) { @@ -516,8 +516,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.skyObjectFilter.magnitude = data.filter?.magnitude || this.skyObjectFilter.magnitude this.skyObjectFilter.type = data.filter?.type || this.skyObjectFilter.type - this.tabChanged() - this.filterSkyObject() + await this.tabChanged() + await this.filterSkyObject() } } } diff --git a/desktop/src/app/image/image.component.html b/desktop/src/app/image/image.component.html index 08f200f1f..a093b460d 100644 --- a/desktop/src/app/image/image.component.html +++ b/desktop/src/app/image/image.component.html @@ -1377,7 +1377,7 @@ class="pointer-events-none">
- + Date: Sun, 23 Jun 2024 13:56:02 -0300 Subject: [PATCH 02/29] [desktop]: ESLint --- desktop/.prettierrc | 47 +- desktop/.vscode/extensions.json | 3 + desktop/.vscode/launch.json | 46 - desktop/.vscode/settings.json | 58 +- desktop/.vscode/tasks.json | 57 +- desktop/angular.json | 290 +- desktop/angular.webpack.js | 46 +- desktop/app/argument.parser.ts | 4 +- desktop/app/local.storage.ts | 12 +- desktop/app/main.ts | 58 +- desktop/app/package-lock.json | 80 +- desktop/app/package.json | 30 +- desktop/app/preload.ts | 4 +- desktop/app/window.manager.ts | 69 +- desktop/electron-builder.json | 86 +- desktop/eslint.config.mjs | 40 + desktop/package-lock.json | 36356 ++++++++-------- desktop/package.json | 174 +- .../src/app/alignment/alignment.component.ts | 34 +- desktop/src/app/app.component.ts | 16 +- desktop/src/app/atlas/atlas.component.html | 2 + desktop/src/app/atlas/atlas.component.ts | 101 +- .../src/app/autofocus/autofocus.component.ts | 100 +- .../app/calculator/calculator.component.ts | 22 +- .../app/calibration/calibration.component.ts | 59 +- desktop/src/app/camera/camera.component.html | 38 +- desktop/src/app/camera/camera.component.ts | 136 +- .../app/filterwheel/filterwheel.component.ts | 141 +- .../app/flat-wizard/flat-wizard.component.ts | 44 +- desktop/src/app/focuser/focuser.component.ts | 34 +- desktop/src/app/framing/framing.component.ts | 36 +- desktop/src/app/guider/guider.component.ts | 77 +- desktop/src/app/home/home.component.ts | 94 +- desktop/src/app/image/image.component.html | 4 +- desktop/src/app/image/image.component.ts | 469 +- desktop/src/app/indi/indi.component.ts | 58 +- .../indi/property/indi-property.component.ts | 4 +- desktop/src/app/mount/mount.component.html | 3 +- desktop/src/app/mount/mount.component.ts | 141 +- desktop/src/app/rotator/rotator.component.ts | 22 +- .../src/app/sequencer/sequencer.component.ts | 83 +- .../src/app/settings/settings.component.ts | 21 +- desktop/src/main.ts | 4 +- .../device-list-menu.component.ts | 30 +- .../dialog-menu/dialog-menu.component.ts | 6 +- .../histogram/histogram.component.ts | 48 +- .../shared/components/map/map.component.ts | 14 +- .../menu-item/menu-item.component.ts | 6 +- .../shared/components/moon/moon.component.ts | 9 +- .../path-chooser/path-chooser.component.ts | 4 +- .../slide-menu/slide-menu.component.ts | 20 +- desktop/src/shared/constants.ts | 5 +- .../dialogs/location/location.dialog.ts | 4 +- .../interceptors/location.interceptor.ts | 2 +- .../src/shared/pipes/enum-dropdown.pipe.ts | 4 +- desktop/src/shared/pipes/enum.pipe.ts | 15 +- desktop/src/shared/pipes/env.pipe.ts | 2 +- desktop/src/shared/pipes/exposureTime.pipe.ts | 2 +- desktop/src/shared/pipes/win.pipe.ts | 2 +- desktop/src/shared/services/api.service.ts | 184 +- .../shared/services/browser-window.service.ts | 32 +- .../src/shared/services/electron.service.ts | 40 +- desktop/src/shared/services/http.service.ts | 14 +- .../shared/services/local-storage.service.ts | 12 +- desktop/src/shared/services/pinger.service.ts | 18 +- .../src/shared/services/preference.service.ts | 5 + desktop/src/shared/services/prime.service.ts | 6 +- .../shared/services/remote-storage.service.ts | 4 +- .../src/shared/services/storage.service.ts | 2 +- desktop/src/shared/types/app.types.ts | 8 +- desktop/src/shared/types/atlas.types.ts | 8 +- desktop/src/shared/types/autofocus.type.ts | 4 +- desktop/src/shared/types/camera.types.ts | 3 - desktop/src/shared/types/device.types.ts | 6 +- desktop/src/shared/types/mount.types.ts | 12 + desktop/src/shared/types/settings.types.ts | 4 +- desktop/src/shared/utils/angle.ts | 13 +- .../src/shared/utils/bicubic-interpolation.ts | 22 +- desktop/src/shared/utils/comparators.ts | 2 +- desktop/src/shared/utils/ephemeris.ts | 6 +- desktop/src/tsconfig.app.json | 29 +- desktop/src/typings.d.ts | 6 +- desktop/tsconfig.json | 83 +- desktop/tsconfig.serve.json | 57 +- 84 files changed, 20566 insertions(+), 19390 deletions(-) create mode 100644 desktop/.vscode/extensions.json delete mode 100644 desktop/.vscode/launch.json create mode 100644 desktop/eslint.config.mjs diff --git a/desktop/.prettierrc b/desktop/.prettierrc index d5aca1597..0c83ac572 100644 --- a/desktop/.prettierrc +++ b/desktop/.prettierrc @@ -1,28 +1,35 @@ { - "printWidth": 300, + "printWidth": 300, "singleQuote": true, "useTabs": true, "tabWidth": 4, - "bracketSpacing": true, + "bracketSpacing": true, "htmlWhitespaceSensitivity": "ignore", - "bracketSameLine": true, - "singleAttributePerLine": true, - "trailingComma": "all", - "semi": false, - "endOfLine": "lf", + "bracketSameLine": true, + "singleAttributePerLine": true, + "trailingComma": "all", + "semi": false, + "endOfLine": "lf", "overrides": [ - { - "files": "*.html", - "options": { - "parser": "angular" - } - }, - { - "files": "*.scss", - "options": { - "parser": "scss" - } - }, + { + "files": "*.html", + "options": { + "parser": "angular" + } + }, + { + "files": "*.scss", + "options": { + "parser": "scss" + } + }, + { + "files": "*.json", + "excludeFiles": "*-lock.json", + "options": { + "parser": "json" + } + }, { "files": "*.ts", "options": { @@ -30,5 +37,5 @@ "parser": "typescript" } } - ] + ] } diff --git a/desktop/.vscode/extensions.json b/desktop/.vscode/extensions.json new file mode 100644 index 000000000..3537a1c79 --- /dev/null +++ b/desktop/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "angular.ng-template"] +} diff --git a/desktop/.vscode/launch.json b/desktop/.vscode/launch.json deleted file mode 100644 index 728d59ca6..000000000 --- a/desktop/.vscode/launch.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Renderer", - "type": "chrome", - "request": "attach", - "port": 9876, - "url": "http://localhost:4200", - "sourceMaps": true, - "timeout": 10000, - "trace": "verbose", - "sourceMapPathOverrides": { - "webpack:///./*": "${workspaceFolder}/*" - }, - "preLaunchTask": "Build.Renderer" - }, - { - "name": "Main", - "type": "node", - "request": "launch", - "protocol": "inspector", - "cwd": "${workspaceFolder}", - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", - "trace": "verbose", - "runtimeArgs": [ - "--serve", - ".", - "--remote-debugging-port=9876" - ], - "windows": { - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" - }, - "preLaunchTask": "Build.Main" - } - ], - "compounds": [ - { - "name": "Application Debug", - "configurations": [ "Renderer", "Main" ] - } - ] -} \ No newline at end of file diff --git a/desktop/.vscode/settings.json b/desktop/.vscode/settings.json index 60912ea87..144b62e83 100644 --- a/desktop/.vscode/settings.json +++ b/desktop/.vscode/settings.json @@ -1,25 +1,35 @@ { - "editor.formatOnSave": true, - "explorer.excludeGitIgnore": true, - "javascript.format.semicolons": "remove", - "javascript.preferences.quoteStyle": "single", - "typescript.format.semicolons": "remove", - "typescript.preferences.quoteStyle": "single", - "typescript.tsdk": "node_modules/typescript/lib", - "html.format.indentInnerHtml": true, - "html.format.wrapAttributes": "force-aligned", - "html.format.wrapLineLength": 300, - "json.format.keepLines": true, - "editor.codeActionsOnSave": { - "source.organizeImports": "explicit" - }, - "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -} \ No newline at end of file + "editor.formatOnSave": true, + "explorer.excludeGitIgnore": true, + "eslint.lintTask.enable": true, + "javascript.format.semicolons": "remove", + "javascript.preferences.quoteStyle": "single", + "typescript.format.semicolons": "remove", + "typescript.preferences.quoteStyle": "single", + "typescript.tsdk": "node_modules/typescript/lib", + "html.format.indentInnerHtml": true, + "html.format.wrapAttributes": "force-aligned", + "html.format.wrapLineLength": 300, + "json.format.keepLines": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/desktop/.vscode/tasks.json b/desktop/.vscode/tasks.json index 374d5aca7..e93497994 100644 --- a/desktop/.vscode/tasks.json +++ b/desktop/.vscode/tasks.json @@ -1,49 +1,10 @@ { - "version": "2.0.0", - "tasks": [ - { - "label": "Build.Main", - "type": "shell", - "command": "npm run electron:serve-tsc", - "isBackground": false, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": { - "owner": "typescript", - "source": "ts", - "applyTo": "closedDocuments", - "fileLocation": ["relative", "${cwd}"], - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": "^.*", - "endsPattern": "^.*Terminal will be reused by tasks, press any key to close it.*" - } - } - }, - { - "label": "Build.Renderer", - "type": "shell", - "command": "npm run ng:serve", - "isBackground": true, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": { - "owner": "typescript", - "source": "ts", - "applyTo": "closedDocuments", - "fileLocation": ["relative", "${cwd}"], - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": "^.*", - "endsPattern": "^.*Compiled successfully.*" - } - } - } - ] - } \ No newline at end of file + "version": "2.0.0", + "tasks": [ + { + "type": "eslint", + "problemMatcher": ["$eslint-stylish"], + "label": "eslint: lint whole folder" + } + ] +} diff --git a/desktop/angular.json b/desktop/angular.json index 9a9c42ade..122641cd0 100644 --- a/desktop/angular.json +++ b/desktop/angular.json @@ -1,153 +1,139 @@ { - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "cli": { - "schematicCollections": [ - "@angular-eslint/schematics" - ], - "analytics": false - }, - "version": 1, - "newProjectRoot": "projects", - "projects": { - "angular-electron": { - "root": "", - "sourceRoot": "src", - "projectType": "application", - "schematics": { - "@schematics/angular:application": { - "strict": true - }, - "@schematics/angular:component": { - "style": "scss" - } - }, - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-builders/custom-webpack:browser", - "options": { - "outputPath": "dist", - "index": "src/index.html", - "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", - "polyfills": "src/polyfills.ts", - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "node_modules/leaflet/dist/leaflet.css", - "node_modules/primeng/resources/themes/mdc-dark-indigo/theme.css", - "node_modules/primeng/resources/primeng.min.css", - "node_modules/primeflex/primeflex.css", - "node_modules/primeicons/primeicons.css", - "src/styles.scss" - ], - "scripts": [ - "node_modules/chart.js/dist/chart.umd.js" - ], - "customWebpackConfig": { - "path": "./angular.webpack.js", - "replaceDuplicatePlugins": true - } - }, - "configurations": { - "dev": { - "optimization": false, - "outputHashing": "none", - "sourceMap": true, - "namedChunks": false, - "aot": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": false, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.dev.ts" - } - ] - }, - "production": { - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ] - }, - "web": { - "optimization": false, - "outputHashing": "none", - "sourceMap": true, - "namedChunks": false, - "aot": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": false, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.web.ts" - } - ] - }, - "web-production": { - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.web.prod.ts" - } - ] - } - } - }, - "serve": { - "builder": "@angular-builders/custom-webpack:dev-server", - "options": { - "buildTarget": "angular-electron:build" - }, - "configurations": { - "dev": { - "buildTarget": "angular-electron:build:dev" - }, - "production": { - "buildTarget": "angular-electron:build:production" - }, - "web": { - "buildTarget": "angular-electron:build:web" - }, - "web-production": { - "buildTarget": "angular-electron:build:web-production" - } - } - } - } - } - }, - "schematics": { - "@angular-eslint/schematics:application": { - "setParserOptionsProject": true - }, - "@angular-eslint/schematics:library": { - "setParserOptionsProject": true - } - } -} \ No newline at end of file + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "cli": { + "schematicCollections": ["@angular-eslint/schematics"], + "analytics": false + }, + "version": 1, + "newProjectRoot": "projects", + "projects": { + "angular-electron": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + }, + "@schematics/angular:component": { + "style": "scss" + } + }, + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-builders/custom-webpack:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["node_modules/leaflet/dist/leaflet.css", "node_modules/primeng/resources/themes/mdc-dark-indigo/theme.css", "node_modules/primeng/resources/primeng.min.css", "node_modules/primeflex/primeflex.css", "node_modules/primeicons/primeicons.css", "src/styles.scss"], + "scripts": ["node_modules/chart.js/dist/chart.umd.js"], + "customWebpackConfig": { + "path": "./angular.webpack.js", + "replaceDuplicatePlugins": true + } + }, + "configurations": { + "dev": { + "optimization": false, + "outputHashing": "none", + "sourceMap": true, + "namedChunks": false, + "aot": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": false, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.dev.ts" + } + ] + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + }, + "web": { + "optimization": false, + "outputHashing": "none", + "sourceMap": true, + "namedChunks": false, + "aot": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": false, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.web.ts" + } + ] + }, + "web-production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.web.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-builders/custom-webpack:dev-server", + "options": { + "buildTarget": "angular-electron:build" + }, + "configurations": { + "dev": { + "buildTarget": "angular-electron:build:dev" + }, + "production": { + "buildTarget": "angular-electron:build:production" + }, + "web": { + "buildTarget": "angular-electron:build:web" + }, + "web-production": { + "buildTarget": "angular-electron:build:web-production" + } + } + } + } + } + }, + "schematics": { + "@angular-eslint/schematics:application": { + "setParserOptionsProject": true + }, + "@angular-eslint/schematics:library": { + "setParserOptionsProject": true + } + } +} diff --git a/desktop/angular.webpack.js b/desktop/angular.webpack.js index ff1de3245..98f31007e 100644 --- a/desktop/angular.webpack.js +++ b/desktop/angular.webpack.js @@ -1,31 +1,31 @@ -const NodePolyfillPlugin = require("node-polyfill-webpack-plugin") +const NodePolyfillPlugin = require('node-polyfill-webpack-plugin') module.exports = (config, options) => { - config.target = 'electron-renderer' + config.target = 'electron-renderer' - if (options.fileReplacements) { - for (let fileReplacement of options.fileReplacements) { - if (fileReplacement.replace !== 'src/environments/environment.ts') { - continue - } + if (options.fileReplacements) { + for (let fileReplacement of options.fileReplacements) { + if (fileReplacement.replace !== 'src/environments/environment.ts') { + continue + } - let fileReplacementParts = fileReplacement['with'].split('.') - if (fileReplacementParts.length > 1 && ['web'].indexOf(fileReplacementParts[1]) >= 0) { - config.target = 'web' - } - break - } - } + let fileReplacementParts = fileReplacement['with'].split('.') + if (fileReplacementParts.length > 1 && ['web'].indexOf(fileReplacementParts[1]) >= 0) { + config.target = 'web' + } + break + } + } - config.plugins = [ - ...config.plugins, - new NodePolyfillPlugin({ - excludeAliases: ["console"] - }) - ] + config.plugins = [ + ...config.plugins, + new NodePolyfillPlugin({ + excludeAliases: ['console'], + }), + ] - // https://github.com/ryanclark/karma-webpack/issues/497 - config.output.globalObject = 'globalThis' + // https://github.com/ryanclark/karma-webpack/issues/497 + config.output.globalObject = 'globalThis' - return config + return config } diff --git a/desktop/app/argument.parser.ts b/desktop/app/argument.parser.ts index 6bc583ebc..123f64213 100644 --- a/desktop/app/argument.parser.ts +++ b/desktop/app/argument.parser.ts @@ -28,9 +28,9 @@ export class ParsedArgument { } export class ArgumentParser { - static parse(args?: string[]): ParsedArgument { + parse(args: string[]): ParsedArgument { const parsed = parseArgs({ - args: args ?? process.argv.slice(1), + args, allowPositionals: true, options: { serve: { diff --git a/desktop/app/local.storage.ts b/desktop/app/local.storage.ts index cbb288fad..f9bf784c7 100644 --- a/desktop/app/local.storage.ts +++ b/desktop/app/local.storage.ts @@ -1,14 +1,14 @@ import * as fs from 'fs' import { dirname } from 'path' -export class LocalStorage { - private readonly data: T = Object.create(null) +export class LocalStorage> { + private readonly data = Object.create(null) as T constructor(private path: string) { try { console.info(`loading config file at ${path}`) - const parsedData = JSON.parse(fs.readFileSync(path, 'utf8')) + const parsedData = JSON.parse(fs.readFileSync(path, 'utf8')) as unknown if (typeof parsedData === 'object' && !Array.isArray(parsedData) && parsedData) { Object.assign(this.data, parsedData) @@ -30,12 +30,6 @@ export class LocalStorage { this.data[key] = value } - delete(key: K) { - if (this.has(key)) { - delete this.data[key] - } - } - has(key: K | string) { return key in this.data } diff --git a/desktop/app/main.ts b/desktop/app/main.ts index bcc58b87e..ec15fa2dd 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -12,11 +12,12 @@ Object.assign(global, { WebSocket }) app.commandLine.appendSwitch('disable-http-cache') -const args = ArgumentParser.parse() +const argParser = new ArgumentParser() +const parsedArgs = argParser.parse(process.argv.slice(1)) const configPath = resolve(app.getPath('userData'), 'config.json') const storage = new LocalStorage(configPath) -const appIcon = join(__dirname, args.serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) -const windowManager = new WindowManager(args, storage, appIcon) +const appIcon = join(__dirname, parsedArgs.serve ? `../src/assets/icons/nebulosa.png` : `assets/icons/nebulosa.png`) +const windowManager = new WindowManager(parsedArgs, storage, appIcon) let apiProcess: ChildProcessWithoutNullStreams | null process.on('beforeExit', () => { @@ -24,13 +25,13 @@ process.on('beforeExit', () => { apiProcess?.kill() }) -function createApiProcess(port: number = args.port) { +function createApiProcess(port: number = parsedArgs.port) { const apiJar = join(process.resourcesPath, 'api.jar') const apiProcess = spawn('java', ['-jar', apiJar, `--server.port=${port}`]) apiProcess.on('close', (code) => { console.warn(`server process exited with code: ${code}`) - process.exit(code || 0) + process.exit(code ?? 0) }) return apiProcess @@ -38,19 +39,19 @@ function createApiProcess(port: number = args.port) { let started = false -function startApp() { +async function startApp() { if (!started) { started = true try { - if (args.apiMode) { + if (parsedArgs.apiMode) { apiProcess = createApiProcess() - } else if (args.uiMode) { - windowManager.createMainWindow() - } else if (args.serve) { - windowManager.createMainWindow() + } else if (parsedArgs.uiMode) { + await windowManager.createMainWindow() + } else if (parsedArgs.serve) { + await windowManager.createMainWindow() } else { - const splashWindow = windowManager.createSplashWindow() + const splashWindow = await windowManager.createSplashWindow() apiProcess = createApiProcess() @@ -65,10 +66,10 @@ function startApp() { if (match) { const port = parseInt(match[1]) - apiProcess!.stdout!.removeAllListeners('data') - console.info(`server was started at ${args.host}@${port}`) + apiProcess?.stdout.removeAllListeners('data') + console.info(`server was started at ${parsedArgs.host}@${port}`) splashWindow?.close() - windowManager.createMainWindow(apiProcess!, port) + void windowManager.createMainWindow(apiProcess!, port) } } }) @@ -83,11 +84,15 @@ function startApp() { } try { - if (!args.serve) { + if (!parsedArgs.serve) { Menu.setApplicationMenu(null) } - app.on('ready', () => setTimeout(() => startApp(), 400)) + app.on('ready', () => + setTimeout(() => { + void startApp() + }, 400), + ) app.on('window-all-closed', () => { apiProcess?.kill() @@ -97,20 +102,25 @@ try { } }) - app.on('activate', () => startApp()) + app.on('activate', () => { + void startApp() + }) - ipcMain.handle('JSON.WRITE', async (_, data: JsonFile) => { + ipcMain.handle('JSON.WRITE', (_, data: JsonFile) => { try { - const json = JSON.stringify(data.json) - fs.writeFileSync(data.path!, json) - return true + if (data.path) { + const json = JSON.stringify(data.json) + fs.writeFileSync(data.path, json) + return true + } } catch (e) { console.error(e) - return false } + + return false }) - ipcMain.handle('JSON.READ', async (_, path: string) => { + ipcMain.handle('JSON.READ', (_, path: string) => { try { if (fs.existsSync(path)) { const buffer = fs.readFileSync(path) diff --git a/desktop/app/package-lock.json b/desktop/app/package-lock.json index e754a4f40..37d49b0cb 100644 --- a/desktop/app/package-lock.json +++ b/desktop/app/package-lock.json @@ -1,42 +1,42 @@ { - "name": "nebulosa", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "nebulosa", - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "@stomp/stompjs": "7.0.0", - "ws": "8.17.0" - } - }, - "node_modules/@stomp/stompjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", - "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==" - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - } + "name": "nebulosa", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nebulosa", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@stomp/stompjs": "7.0.0", + "ws": "8.17.0" + } + }, + "node_modules/@stomp/stompjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", + "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==" + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } } diff --git a/desktop/app/package.json b/desktop/app/package.json index ae0626ada..1fd979f9e 100644 --- a/desktop/app/package.json +++ b/desktop/app/package.json @@ -1,17 +1,17 @@ { - "name": "nebulosa", - "version": "0.1.0", - "description": "The complete integrated solution for all of your astronomical imaging needs.", - "author": { - "name": "Tiago Melo", - "email": "tiago.henrique.cco@gmail.com" - }, - "homepage": "https://tiagohm.github.io/nebulosa", - "license": "MIT", - "main": "main.js", - "private": true, - "dependencies": { - "@stomp/stompjs": "7.0.0", - "ws": "8.17.0" - } + "name": "nebulosa", + "version": "0.1.0", + "description": "The complete integrated solution for all of your astronomical imaging needs.", + "author": { + "name": "Tiago Melo", + "email": "tiago.henrique.cco@gmail.com" + }, + "homepage": "https://tiagohm.github.io/nebulosa", + "license": "MIT", + "main": "main.js", + "private": true, + "dependencies": { + "@stomp/stompjs": "7.0.0", + "ws": "8.17.0" + } } diff --git a/desktop/app/preload.ts b/desktop/app/preload.ts index e2d230f0d..e7e8fc030 100644 --- a/desktop/app/preload.ts +++ b/desktop/app/preload.ts @@ -1,9 +1,9 @@ function argWith(name: string) { - return process.argv.find((e) => e.startsWith(`--${name}=`))?.split('=')?.[1]! + return process.argv.find((e) => e.startsWith(`--${name}=`))!.split('=')[1] } window.apiHost = argWith('host') window.apiPort = parseInt(argWith('port')) window.id = argWith('id') window.data = JSON.parse(decodeURIComponent(argWith('data'))) -window.preference = JSON.parse(decodeURIComponent(argWith('preference'))) +window.preference = JSON.parse(decodeURIComponent(argWith('preference'))) as never diff --git a/desktop/app/window.manager.ts b/desktop/app/window.manager.ts index 7a04243f5..6b4421106 100644 --- a/desktop/app/window.manager.ts +++ b/desktop/app/window.manager.ts @@ -1,5 +1,5 @@ import { Client } from '@stomp/stompjs' -import { BrowserWindow, dialog, Notification, screen, shell } from 'electron' +import { BrowserWindow, Notification, dialog, screen, shell } from 'electron' import { ChildProcessWithoutNullStreams } from 'node:child_process' import { join } from 'path' import { MessageEvent } from '../src/shared/types/api.types' @@ -10,11 +10,11 @@ import { LocalStorage } from './local.storage' export class ApplicationWindow { constructor( public readonly browserWindow: BrowserWindow, - public readonly open: OpenWindow, + public readonly data: OpenWindow, public readonly parentWindow?: BrowserWindow, public webSocket?: Client, public apiProcess?: ChildProcessWithoutNullStreams, - public resolver?: (data: any) => void, + public resolver?: (data: unknown) => void, ) {} get isParent() { @@ -22,11 +22,11 @@ export class ApplicationWindow { } get isModal() { - return !!this.parentWindow || this.open.id.endsWith('.modal') + return !!this.parentWindow || this.data.id.endsWith('.modal') } get isHome() { - return !this.webSocket || this.open.id === 'home' + return !this.webSocket || this.data.id === 'home' } get windowId() { @@ -34,7 +34,7 @@ export class ApplicationWindow { } get appId() { - return this.open.id + return this.data.id } close() { @@ -71,8 +71,8 @@ export class WindowManager { private host = 'localhost' constructor( - readonly args: ParsedArgument, - readonly storage: LocalStorage, + public readonly args: ParsedArgument, + public readonly storage: LocalStorage, defaultAppIcon: string = 'nebulosa.png', ) { this.appIcon = join(__dirname, args.serve ? `../src/assets/icons/${defaultAppIcon}` : `assets/icons/${defaultAppIcon}`) @@ -80,7 +80,7 @@ export class WindowManager { this.host = args.host } - createWindow(open: OpenWindow, parent?: BrowserWindow) { + async createWindow(open: OpenWindow, parent?: BrowserWindow) { let appWindow = this.windows.get(open.id) if (appWindow) { @@ -127,7 +127,7 @@ export class WindowManager { nodeIntegration: true, allowRunningInsecureContent: this.args.serve, contextIsolation: false, - additionalArguments: [`--host=${this.host}`, `--port=${this.port}`, `--data=${encodedData}`, `--preference=${encodedPreference}`], + additionalArguments: [`--host=${this.host}`, `--port=${this.port}`, `--id=${open.id}`, `--data=${encodedData}`, `--preference=${encodedPreference}`], preload: join(__dirname, 'preload.js'), devTools: this.args.serve, }, @@ -138,14 +138,14 @@ export class WindowManager { } if (this.args.serve) { - browserWindow.loadURL(`http://localhost:4200/${open.path}?data=${encodedData}`) + await browserWindow.loadURL(`http://localhost:4200/${open.path}?data=${encodedData}`) } else { const url = new URL(join('file:', __dirname, `index.html`) + `#/${open.path}?data=${encodedData}`) - browserWindow.loadURL(url.href) + await browserWindow.loadURL(url.href) } browserWindow.webContents.setWindowOpenHandler(({ url }) => { - shell.openExternal(url) + void shell.openExternal(url) return { action: 'deny' } }) @@ -158,7 +158,7 @@ export class WindowManager { this.saveWindowData(appWindow) } - if (browserWindow === homeWindow?.browserWindow || open.id === homeWindow?.open?.id) { + if (browserWindow === homeWindow?.browserWindow || open.id === homeWindow?.data.id) { this.windows.delete('home') for (const [, value] of this.windows) { @@ -171,7 +171,7 @@ export class WindowManager { homeWindow.apiProcess = undefined } else { for (const [key, value] of this.windows) { - if (value.browserWindow === browserWindow || value.open.id === open.id) { + if (value.browserWindow === browserWindow || value.data.id === open.id) { this.windows.delete(key) break } @@ -187,16 +187,16 @@ export class WindowManager { saveWindowData(window: ApplicationWindow) { const [x, y] = window.browserWindow.getPosition() const [width, height] = window.browserWindow.getSize() - this.storage.set(`window.${window.open.id}`, { x, y, width, height }) + this.storage.set(`window.${window.data.id}`, { x, y, width, height }) this.storage.save() } - createMainWindow(apiProcess?: ChildProcessWithoutNullStreams, port: number = this.port, host: string = this.host) { + async createMainWindow(apiProcess?: ChildProcessWithoutNullStreams, port: number = this.port, host: string = this.host) { this.port = port this.host = host const open: OpenWindow = { id: 'home', path: 'home', preference: {} } - const appWindow = this.createWindow(open) + const appWindow = await this.createWindow(open) const webSocket = new Client({ brokerURL: `ws://${host}:${port}/ws`, @@ -232,7 +232,7 @@ export class WindowManager { appWindow.apiProcess = apiProcess } - createSplashWindow() { + async createSplashWindow() { if (!this.args.serve && !this.windows.has('splash')) { const browserWindow = new BrowserWindow({ width: 512, @@ -246,7 +246,7 @@ export class WindowManager { const url = new URL(join('file:', __dirname, 'assets', 'images', 'splash.png')) - browserWindow.loadURL(url.href) + await browserWindow.loadURL(url.href) browserWindow.show() browserWindow.center() @@ -319,17 +319,16 @@ export class WindowManager { } } - handleWindowOpen(event: Electron.IpcMainInvokeEvent, data: OpenWindow) { + async handleWindowOpen(event: Electron.IpcMainInvokeEvent, data: OpenWindow) { if (data.preference.modal) { const parentWindow = this.findWindow(event.sender.id) - const appWindow = this.createWindow(data, parentWindow?.browserWindow) + const appWindow = await this.createWindow(data, parentWindow?.browserWindow) - return new Promise((resolve) => { + return new Promise((resolve) => { appWindow.resolver = resolve }) } else { - const isNew = !this.windows.has(data.id) - const appWindow = this.createWindow(data) + const appWindow = await this.createWindow(data) if (data.preference.bringToFront) { appWindow.browserWindow.show() @@ -337,15 +336,7 @@ export class WindowManager { appWindow.browserWindow.focus() } - return new Promise((resolve) => { - if (isNew) { - appWindow.browserWindow.webContents.once('did-finish-load', () => { - resolve(true) - }) - } else { - resolve(true) - } - }) + return true } } @@ -365,12 +356,12 @@ export class WindowManager { handleWindowResize(event: Electron.IpcMainInvokeEvent, newHeight: number) { const window = this.findWindow(event.sender.id) - if (window && !window.open.preference.resizable && window.open.preference.autoResizable !== false) { - const data = window.open + if (window && !window.data.preference.resizable && window.data.preference.autoResizable !== false) { + const data = window.data const [width] = window.browserWindow.getSize() const maxHeight = screen.getPrimaryDisplay().workAreaSize.height - const height = Math.max(data?.preference.minHeight ?? 0, Math.min(newHeight, maxHeight)) + const height = Math.max(data.preference.minHeight ?? 0, Math.min(newHeight, maxHeight)) // https://github.com/electron/electron/issues/16711#issuecomment-1311824063 window.browserWindow.setResizable(true) @@ -396,13 +387,13 @@ export class WindowManager { handleWindowPin(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) - window?.browserWindow?.setAlwaysOnTop(true) + window?.browserWindow.setAlwaysOnTop(true) return window && window.browserWindow.isAlwaysOnTop() } handleWindowUnpin(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) - window?.browserWindow?.setAlwaysOnTop(false) + window?.browserWindow.setAlwaysOnTop(false) return window && window.browserWindow.isAlwaysOnTop() } diff --git a/desktop/electron-builder.json b/desktop/electron-builder.json index cb3567660..f94f67c50 100644 --- a/desktop/electron-builder.json +++ b/desktop/electron-builder.json @@ -1,51 +1,37 @@ { - "asar": true, - "directories": { - "output": "release/" - }, - "files": [ - "**/*", - "!**/*.ts", - "!*.map", - "!package.json", - "!package-lock.json", - { - "from": "../dist", - "filter": [ - "**/*" - ] - } - ], - "extraResources": [ - "api.jar" - ], - "win": { - "icon": "dist/assets/icons", - "target": [ - "portable" - ] - }, - "portable": { - "splashImage": "dist/assets/images/splash.png" - }, - "mac": { - "icon": "dist/assets/icons", - "target": [ - "dmg" - ] - }, - "linux": { - "icon": "dist/assets/icons", - "category": "Science", - "target": [ - "AppImage", - "deb", - "rpm" - ] - }, - "rpm": { - "depends": [ - "/usr/lib64/libuuid.so.1" - ] - } -} \ No newline at end of file + "asar": true, + "directories": { + "output": "release/" + }, + "files": [ + "**/*", + "!**/*.ts", + "!*.map", + "!package.json", + "!package-lock.json", + { + "from": "../dist", + "filter": ["**/*"] + } + ], + "extraResources": ["api.jar"], + "win": { + "icon": "dist/assets/icons", + "target": ["portable"] + }, + "portable": { + "splashImage": "dist/assets/images/splash.png" + }, + "mac": { + "icon": "dist/assets/icons", + "target": ["dmg"] + }, + "linux": { + "icon": "dist/assets/icons", + "category": "Science", + "target": ["AppImage", "deb", "rpm"] + }, + "rpm": { + "depends": ["/usr/lib64/libuuid.so.1"] + } +} diff --git a/desktop/eslint.config.mjs b/desktop/eslint.config.mjs new file mode 100644 index 000000000..ce99012da --- /dev/null +++ b/desktop/eslint.config.mjs @@ -0,0 +1,40 @@ +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { + files: ['**/*.ts'], + ...eslint.configs.recommended, + }, + ...tseslint.configs.strictTypeChecked.map((config) => { + return { + files: ['**/*.ts'], + ...config, + } + }), + { + languageOptions: { + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + project: './tsconfig.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.ts'], + rules: { + 'no-unused-vars': 'off', + 'no-loss-of-precision': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/no-loss-of-precision': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + }, + }, +) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index b0fe2b0cd..83754afa1 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,17638 +1,18722 @@ { - "name": "nebulosa", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "nebulosa", - "version": "0.1.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@angular/animations": "18.0.3", - "@angular/cdk": "18.0.3", - "@angular/common": "18.0.3", - "@angular/compiler": "18.0.3", - "@angular/core": "18.0.3", - "@angular/forms": "18.0.3", - "@angular/platform-browser": "18.0.3", - "@angular/platform-browser-dynamic": "18.0.3", - "@angular/router": "18.0.3", - "@fontsource/roboto": "5.0.13", - "@mdi/font": "7.4.47", - "chart.js": "4.4.3", - "chartjs-plugin-zoom": "2.0.1", - "hotkeys-js": "3.13.7", - "interactjs": "1.10.27", - "leaflet": "1.9.4", - "moment": "2.30.1", - "panzoom": "9.4.3", - "primeflex": "3.3.1", - "primeicons": "7.0.0", - "primeng": "17.18.1", - "rxjs": "7.8.1", - "tslib": "2.6.3", - "zone.js": "0.14.7" - }, - "devDependencies": { - "@angular-builders/custom-webpack": "18.0.0", - "@angular-devkit/build-angular": "18.0.4", - "@angular/cli": "18.0.4", - "@angular/compiler-cli": "18.0.3", - "@angular/language-service": "18.0.3", - "@types/leaflet": "1.9.12", - "@types/node": "20.14.6", - "@types/uuid": "9.0.8", - "electron": "31.0.1", - "electron-builder": "24.13.3", - "node-polyfill-webpack-plugin": "4.0.0", - "npm-run-all": "4.1.5", - "prettier": "3.3.2", - "ts-node": "10.9.2", - "typescript": "5.4.5", - "wait-on": "7.2.0" - }, - "engines": { - "node": ">= 22.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-builders/common": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-2.0.0.tgz", - "integrity": "sha512-O5YJc++DtJVJhqA/OomRKN2jGYzvU/YXtfrPAqcA9Is3Ob5jvV0L0JHSAjSw/KaLvk/FjBIqoRVcYdLp5LKddA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "^18.0.0", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.1.0" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - } - }, - "node_modules/@angular-builders/custom-webpack": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-18.0.0.tgz", - "integrity": "sha512-XSynPSXHq5+nrh7J2snfrcbvm6YGwUGQRzr7OuO3wURJ6CHOD9C+xEAmvEUWW8c1YjEslVNG7aLtCGz7LA4ymw==", - "dev": true, - "dependencies": { - "@angular-builders/common": "2.0.0", - "@angular-devkit/architect": ">=0.1800.0 < 0.1900.0", - "@angular-devkit/build-angular": "^18.0.0", - "@angular-devkit/core": "^18.0.0", - "lodash": "^4.17.15", - "webpack-merge": "^5.7.3" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1800.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.4.tgz", - "integrity": "sha512-82TKhYnSO8aGIBo5TxPtyUQnZFcbV+qB2bIIYOAKsJgxAVxLeFD6QA6gTmHOZPXw5pBEPUO/+PUwq+Uk5xesgw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.0.4", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.0.4.tgz", - "integrity": "sha512-lFu1NDEUPIUxY+CmZJ3JspqVZDesrvdae5RbqQXCl87RfSy+ZDIa7rOtQxyBQtt2BuQIB9pWQSzCMii5kTHd6w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.4", - "@angular-devkit/build-webpack": "0.1800.4", - "@angular-devkit/core": "18.0.4", - "@angular/build": "18.0.4", - "@babel/core": "7.24.5", - "@babel/generator": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", - "@babel/plugin-transform-async-generator-functions": "7.24.3", - "@babel/plugin-transform-async-to-generator": "7.24.1", - "@babel/plugin-transform-runtime": "7.24.3", - "@babel/preset-env": "7.24.5", - "@babel/runtime": "7.24.5", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "18.0.4", - "@vitejs/plugin-basic-ssl": "1.1.0", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.19", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.21.5", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.22", - "css-loader": "7.1.1", - "esbuild-wasm": "0.21.3", - "fast-glob": "3.3.2", - "http-proxy-middleware": "3.0.0", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", - "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "12.2.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.10", - "mini-css-extract-plugin": "2.9.0", - "mrmime": "2.0.0", - "open": "8.4.2", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.5.0", - "postcss": "8.4.38", - "postcss-loader": "8.1.1", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.77.2", - "sass-loader": "14.2.1", - "semver": "7.6.2", - "source-map-loader": "5.0.0", - "source-map-support": "0.5.21", - "terser": "5.31.0", - "tree-kill": "1.2.2", - "tslib": "2.6.2", - "undici": "6.18.0", - "vite": "5.2.11", - "watchpack": "2.4.1", - "webpack": "5.91.0", - "webpack-dev-middleware": "7.2.1", - "webpack-dev-server": "5.0.4", - "webpack-merge": "5.10.0", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.21.3" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "@web/test-runner": "^0.18.0", - "browser-sync": "^3.0.2", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^18.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@web/test-runner": { - "optional": true - }, - "browser-sync": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "karma": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "protractor": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/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, - "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/@angular-devkit/build-angular/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, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/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 - }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1800.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1800.4.tgz", - "integrity": "sha512-EtWyWH3Hb7Rh8u0Jb4cWJKRxlqiUo4qhHKjU+62E8XplWlajbuld3ltL50a3t8lkZQYYgl7nPt53E5kM/zFVrw==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1800.4", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/core": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.4.tgz", - "integrity": "sha512-8vYvJ5FF2NjFUia00hv8KWakOjOZ+09PbnNqd+lntJBekIg1lHDOF/vNMlVHtU5LiE1aNi9P/69/VXTckPfU9g==", - "dev": true, - "dependencies": { - "ajv": "8.13.0", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.4.tgz", - "integrity": "sha512-hCHmuu/Z1teOQPx1AMJa/gcK6depk+XgU5dIpEvflC+ApW3hglNe2QKaqajDZ+34s+PKAVWa86M8IOV7o/mHuA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.0.4", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.10", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/animations": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.3.tgz", - "integrity": "sha512-Wlll6y7euIXYsOHpTh0hvVTBs7lVnbKDHiyd4Dz7kAMSeE2zyQo6OcRN+FFH3GH9BUi5UooAICNX8dJDfps6Mw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.0.3" - } - }, - "node_modules/@angular/build": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.4.tgz", - "integrity": "sha512-70HQQnbCOXFT5F3ROyWNNfS9A63Fzts5ANJKJY1MJLrn+dgNEG7jdIWjTtvohL3RZz97rlzSq3qRZnfxqf1lsQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.4", - "@babel/core": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", - "@vitejs/plugin-basic-ssl": "1.1.0", - "ansi-colors": "4.1.3", - "browserslist": "^4.23.0", - "critters": "0.0.22", - "esbuild": "0.21.3", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "lmdb": "3.0.8", - "magic-string": "0.30.10", - "mrmime": "2.0.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.5.0", - "sass": "1.77.2", - "semver": "7.6.2", - "undici": "6.18.0", - "vite": "5.2.11", - "watchpack": "2.4.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular/cdk": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.0.3.tgz", - "integrity": "sha512-F6kXAoIWUbvhvbSGnMxrKJZsI7rhGKDXVFFf9m+ZQAbqboSyDbbszux7Em4CEh27LaXYNFltUcKdCQ3hdp7Kig==", - "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, - "peerDependencies": { - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.4.tgz", - "integrity": "sha512-i7DLVIc4HN0CFZZKbEeVeQSADRG1Dt2CwXh/wTUzglRLu/tE7Q+WMrqJ2+lGTT2edZp2KKysM4Gxp+ATAzP8AQ==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1800.4", - "@angular-devkit/core": "18.0.4", - "@angular-devkit/schematics": "18.0.4", - "@schematics/angular": "18.0.4", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", - "npm-package-arg": "11.0.2", - "npm-pick-manifest": "9.0.1", - "ora": "5.4.1", - "pacote": "18.0.6", - "resolve": "1.22.8", - "semver": "7.6.2", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.3.tgz", - "integrity": "sha512-lmT9QbWHduqzpsB0osQFHeSwvQB1iUeNwTVUyMtcs6i46l4qOPtAt2/9DvHUWEUp01EBDxyi385ZI3vD+FHH/w==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.0.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.3.tgz", - "integrity": "sha512-wrXxgBsZX4yTrj/oZ8PDGmvhqj9S2TZfcuivaUitprNC2uBWTVb1UcOS45Qw9YlLB0sYa2AmBudICDqYpb8lfw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.0.3" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.3.tgz", - "integrity": "sha512-mxwQEeP94YBM6C9A2YfkV7ug1sHgh0fU/TSBpQcm5ni4cZiVPu6q/+Ft7hyFTKe2p3tKQme33+xVjsWhtOCx0A==", - "dev": true, - "dependencies": { - "@babel/core": "7.24.7", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/compiler": "18.0.3", - "typescript": ">=5.4 <5.5" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/core": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.3.tgz", - "integrity": "sha512-376hijhEqNpeA+qKncpVTIaZXRdBT6RctEBnFhJ2l57aHPH5S3oaSBQu1k3TEi07FlKOD4XF1+NzX9dvdup1eg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.0" - } - }, - "node_modules/@angular/forms": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.3.tgz", - "integrity": "sha512-+CjDiooUi5FkTP3YQmdO8YRbjZicgLGZonvCdz3mSucLrTY6w3oBocNs6+Kc7fLuO1NKSkFmAfYApBwK3fKBMg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/language-service": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.0.3.tgz", - "integrity": "sha512-urENnMjhSO4Jia7CnbchqN236dOIU6TC3CazwsQoj1Odch9x+iSFkx9Y0jXsiR5r/suK4uqKpK5N8MJ1PxDG1g==", - "dev": true, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.3.tgz", - "integrity": "sha512-1fl/oJOca8BLxLxN0EjwxQZ3xzn3PCCN96ytM54bjdEMiELz+0AcQe5GNKcVjXlwMkibRLl1BP5GIdvnQYqJRA==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "18.0.3", - "@angular/common": "18.0.3", - "@angular/core": "18.0.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.0.3.tgz", - "integrity": "sha512-+kHMn7P552YKk1gkVQNO1QXzHVaIeFiVa1rV1MNvX4DvumKT3puknx1SzcmtxZTX+9ee22OuPuyLNSAKREDAQQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/compiler": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3" - } - }, - "node_modules/@angular/router": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.3.tgz", - "integrity": "sha512-/cglLev0USxUNMc4M+EBFGrqw1EpKq87LUJL3+0Ztr012sVSeOU38ad41fs6pPcMBePBDZIw7KmSXypvUJJFMA==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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, - "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/@develar/schema-utils/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, - "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/@develar/schema-utils/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, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/@develar/schema-utils/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 - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", - "dev": true, - "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.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "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, - "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, - "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/get/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "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, - "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, - "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.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "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, - "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, - "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, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "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, - "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.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "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, - "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.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "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, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", - "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", - "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", - "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", - "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", - "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", - "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", - "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", - "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", - "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", - "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", - "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", - "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", - "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", - "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", - "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", - "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", - "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", - "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", - "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", - "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", - "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", - "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", - "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@fontsource/roboto": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.13.tgz", - "integrity": "sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@interactjs/types": { - "version": "1.10.27", - "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", - "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==" - }, - "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, - "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.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "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 - }, - "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, - "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.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "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, - "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/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", - "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", - "dev": true, - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", - "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", - "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", - "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", - "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", - "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", - "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", - "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "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" - } - ], - "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, - "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, - "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.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@mdi/font": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", - "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==" - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ngtools/webpack": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.0.4.tgz", - "integrity": "sha512-eWQkAuHEnLme01Ey4Z0FoG6upJHYhnJfsCTBnyEB2LTfdyBUk+PC0gwPXInK8oltWjFfiMnCwxrUQvQsvPW7Hg==", - "dev": true, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "typescript": ">=5.4 <5.5", - "webpack": "^5.54.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", - "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.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, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@schematics/angular": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.4.tgz", - "integrity": "sha512-fN4whuym9ZmcQFdTfwLZr4j+NcZ4LzbdLk8XYrYdxt1z8c9ujs5LqJYn0LYc3UWiYl7z2RVc9NOxzNrkiXdwlw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.0.4", - "@angular-devkit/schematics": "18.0.4", - "jsonc-parser": "3.2.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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, - "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, - "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, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "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, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/leaflet": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.12.tgz", - "integrity": "sha512-BK7XS+NyRI291HIo0HCfE18Lp8oA30H1gpi1tf0mF3TgiCEzanQjOqNZ4x126SXzzi2oNSZhZ5axJp1k0iM6jg==", - "dev": true, - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz", - "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "node_modules/@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", - "dev": true, - "optional": true - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "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 - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "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, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/amator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", - "integrity": "sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==", - "dependencies": { - "bezier-easing": "^2.0.3" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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 - }, - "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, - "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/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 - }, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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, - "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, - "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, - "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/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "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, - "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, - "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, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "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, - "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, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "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, - "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 - }, - "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, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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 - }, - "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" - } - ] - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bezier-easing": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", - "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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 - }, - "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, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserify-sign/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 - }, - "node_modules/browserify-sign/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, - "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/browserify-sign/node_modules/readable-stream/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 - }, - "node_modules/browserify-sign/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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/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 - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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" - } - ], - "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, - "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, - "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 - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "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, - "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, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/builder-util/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 - }, - "node_modules/builder-util/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, - "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/builder-util/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/builder-util/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 - }, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/builder-util/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, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/builder-util/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "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, - "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": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chart.js": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", - "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-plugin-zoom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", - "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", - "dependencies": { - "hammerjs": "^2.0.8" - }, - "peerDependencies": { - "chart.js": ">=3.2.0" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "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 - }, - "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" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/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 - }, - "node_modules/cliui/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, - "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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "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, - "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, - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "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, - "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, - "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/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/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 - }, - "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 - }, - "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, - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dev": true, - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "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 - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/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 - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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, - "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, - "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, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - } - }, - "node_modules/critters/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/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, - "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/critters/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/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 - }, - "node_modules/critters/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-loader": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.1.tgz", - "integrity": "sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "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, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "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, - "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, - "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-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": 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, - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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/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 - }, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "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, - "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/dmg-license/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, - "optional": true, - "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/dmg-license/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, - "optional": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", - "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", - "dev": true, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "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 - }, - "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 - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "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, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "31.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.1.tgz", - "integrity": "sha512-2eBcp4iqLkTsml6mMq+iqrS5u3kJ/2mpOLP7Mj7lo0uNK3OyfNqRS9z1ArsHjBF2/HV250Te/O9nKrwQRTX/+g==", - "dev": true, - "hasInstallScript": true, - "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, - "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, - "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, - "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.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-builder/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-builder/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, - "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/electron-builder/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-builder/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 - }, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "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/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-publish/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, - "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/electron-publish/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-publish/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 - }, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.806", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.806.tgz", - "integrity": "sha512-nkoEX2QIB8kwCOtvtgwhXWy2IHVcOLQZu9Qo36uaGB835mdX/h8uLRlosL6QIhLVUnAiicXRW00PwaPZC74Nrg==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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 - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "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, - "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 - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", - "dev": true - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "optional": true - }, - "node_modules/esbuild": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", - "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.3", - "@esbuild/android-arm": "0.21.3", - "@esbuild/android-arm64": "0.21.3", - "@esbuild/android-x64": "0.21.3", - "@esbuild/darwin-arm64": "0.21.3", - "@esbuild/darwin-x64": "0.21.3", - "@esbuild/freebsd-arm64": "0.21.3", - "@esbuild/freebsd-x64": "0.21.3", - "@esbuild/linux-arm": "0.21.3", - "@esbuild/linux-arm64": "0.21.3", - "@esbuild/linux-ia32": "0.21.3", - "@esbuild/linux-loong64": "0.21.3", - "@esbuild/linux-mips64el": "0.21.3", - "@esbuild/linux-ppc64": "0.21.3", - "@esbuild/linux-riscv64": "0.21.3", - "@esbuild/linux-s390x": "0.21.3", - "@esbuild/linux-x64": "0.21.3", - "@esbuild/netbsd-x64": "0.21.3", - "@esbuild/openbsd-x64": "0.21.3", - "@esbuild/sunos-x64": "0.21.3", - "@esbuild/win32-arm64": "0.21.3", - "@esbuild/win32-ia32": "0.21.3", - "@esbuild/win32-x64": "0.21.3" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.21.3.tgz", - "integrity": "sha512-DMOV+eeVra0yVq3XIojfczdEQsz+RiFnpEj7lqs8Gux9mlTpN7yIbw0a4KzLspn0Uhw6UVEH3nUAidSqc/rcQg==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "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" - ], - "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 - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "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 - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "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, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/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, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.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, - "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, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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 - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "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, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "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-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "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, - "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, - "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/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "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, - "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 - }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "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, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "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, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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 - }, - "node_modules/hotkeys-js": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.13.7.tgz", - "integrity": "sha512-ygFIdTqqwG4fFP7kkiYlvayZppeIQX2aPpirsngkv1xM1lP0piDY5QEh68nQnIKvz64hfocxhBaD/uK3sSK1yQ==", - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/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 - }, - "node_modules/hpack.js/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, - "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/hpack.js/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 - }, - "node_modules/hpack.js/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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", - "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.10", - "debug": "^4.3.4", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, - "engines": { - "node": ">=10.18" - } - }, - "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, - "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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.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" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "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 - }, - "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/interactjs": { - "version": "1.10.27", - "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", - "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", - "dependencies": { - "@interactjs/types": "1.10.27" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/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 - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", - "dev": true, - "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 - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/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, - "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/jake/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/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 - }, - "node_modules/jake/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jake/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "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 - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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, - "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, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "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, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.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 - }, - "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, - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/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, - "peer": true - }, - "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, - "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, - "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, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" - }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", - "dev": true, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/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, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lmdb": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", - "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.9.9", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", - "ordered-binary": "^1.4.1", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.8", - "@lmdb/lmdb-darwin-x64": "3.0.8", - "@lmdb/lmdb-linux-arm": "3.0.8", - "@lmdb/lmdb-linux-arm64": "3.0.8", - "@lmdb/lmdb-linux-x64": "3.0.8", - "@lmdb/lmdb-win32-x64": "3.0.8" - } - }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "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, - "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, - "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, - "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, - "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, - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/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, - "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/log-symbols/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/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 - }, - "node_modules/log-symbols/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher/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, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", - "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", - "dev": true, - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.1.2", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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, - "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, - "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, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=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, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, - "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, - "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/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 - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/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 - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/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 - }, - "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, - "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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/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 - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/msgpackr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", - "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/ngraph.events": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", - "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==" - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/nice-napi/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "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, - "optional": true - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-polyfill-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WLk77vLpbcpmTekRj6s6vYxk30XoyaY5MDZ4+9g8OaKoG3Ij+TjOqhpQjVUlfDZBPBgpNATDltaQkzuXSnnkwg==", - "dev": true, - "dependencies": { - "assert": "^2.1.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^5.7.0", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^2.3.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^4.5.2", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "^0.0.1", - "type-fest": "^4.18.2", - "url": "^0.11.3", - "util": "^0.12.5", - "vm-browserify": "^1.1.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "webpack": ">=5" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": 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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz", - "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "dev": true, - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/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, - "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/ora/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/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 - }, - "node_modules/ora/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", - "dev": true - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/panzoom": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/panzoom/-/panzoom-9.4.3.tgz", - "integrity": "sha512-xaxCpElcRbQsUtIdwlrZA90P90+BHip4Vda2BC8MEb4tkI05PmR6cKECdqUCZ85ZvBHjpI9htJrZBxV5Gp/q/w==", - "dependencies": { - "amator": "^1.1.0", - "ngraph.events": "^1.2.2", - "wheel": "^1.0.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", - "dev": true, - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", - "dev": true, - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "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, - "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.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "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 - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/piscina": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", - "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", - "dev": true, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "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, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/primeflex": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/primeflex/-/primeflex-3.3.1.tgz", - "integrity": "sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ==" - }, - "node_modules/primeicons": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", - "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==" - }, - "node_modules/primeng": { - "version": "17.18.1", - "resolved": "https://registry.npmjs.org/primeng/-/primeng-17.18.1.tgz", - "integrity": "sha512-pMuXOgLQw5Xz0w9d3YTp2DAlYR8svK1Jz5gSWAhk6AyH7u7akwL1JX96RXVzLS8v2YeLUCvkMM+QROOvR3yKug==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^17.0.0 || ^18.0.0", - "@angular/core": "^17.0.0 || ^18.0.0", - "@angular/forms": "^17.0.0 || ^18.0.0", - "rxjs": "^6.0.0 || ^7.8.1", - "zone.js": "~0.14.0" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.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 - }, - "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, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "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, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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" - } - ] - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "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/read-config-file/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 - }, - "node_modules/read-config-file/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "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, - "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, - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/resolve-url-loader/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, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "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, - "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/roarr/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, - "optional": true - }, - "node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "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, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "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": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "optional": true - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/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 - }, - "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, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/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, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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/slice-ansi/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, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/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, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/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, - "optional": true - }, - "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, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "engines": { - "node": ">= 6" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "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, - "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, - "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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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, - "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/tar/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, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/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 - }, - "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, - "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, - "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.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "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, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/terser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", - "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/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, - "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/terser-webpack-plugin/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, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/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 - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "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, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/tmp-promise/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-dump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", - "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "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, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", - "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", - "dev": true, - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.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, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "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 - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "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 - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "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/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "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 - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "dev": true, - "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz", - "integrity": "sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "dependencies": { - "typed-assert": "^1.0.8" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack/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, - "peer": true, - "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/webpack/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, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/webpack/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, - "peer": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/wheel": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wheel/-/wheel-1.0.0.tgz", - "integrity": "sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==" - }, - "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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/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 - }, - "node_modules/wrap-ansi/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/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 - }, - "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 - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "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, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "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, - "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, - "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, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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, - "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" - } - }, - "node_modules/zone.js": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", - "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" - } - } + "name": "nebulosa", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nebulosa", + "version": "0.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@angular/animations": "18.0.3", + "@angular/cdk": "18.0.3", + "@angular/common": "18.0.3", + "@angular/compiler": "18.0.3", + "@angular/core": "18.0.3", + "@angular/forms": "18.0.3", + "@angular/platform-browser": "18.0.3", + "@angular/platform-browser-dynamic": "18.0.3", + "@angular/router": "18.0.3", + "@fontsource/roboto": "5.0.13", + "@mdi/font": "7.4.47", + "chart.js": "4.4.3", + "chartjs-plugin-zoom": "2.0.1", + "hotkeys-js": "3.13.7", + "interactjs": "1.10.27", + "leaflet": "1.9.4", + "moment": "2.30.1", + "panzoom": "9.4.3", + "primeflex": "3.3.1", + "primeicons": "7.0.0", + "primeng": "17.18.1", + "rxjs": "7.8.1", + "tslib": "2.6.3", + "zone.js": "0.14.7" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "18.0.0", + "@angular-devkit/build-angular": "18.0.4", + "@angular/cli": "18.0.4", + "@angular/compiler-cli": "18.0.3", + "@angular/language-service": "18.0.3", + "@eslint/js": "9.5.0", + "@types/eslint__js": "8.42.3", + "@types/leaflet": "1.9.12", + "@types/node": "20.14.6", + "@types/uuid": "9.0.8", + "electron": "31.0.1", + "electron-builder": "24.13.3", + "eslint": "8.57.0", + "node-polyfill-webpack-plugin": "4.0.0", + "npm-run-all": "4.1.5", + "prettier": "3.3.2", + "ts-node": "10.9.2", + "typescript": "5.4.5", + "typescript-eslint": "7.13.1", + "wait-on": "7.2.0" + }, + "engines": { + "node": ">= 22.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-builders/common": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-2.0.0.tgz", + "integrity": "sha512-O5YJc++DtJVJhqA/OomRKN2jGYzvU/YXtfrPAqcA9Is3Ob5jvV0L0JHSAjSw/KaLvk/FjBIqoRVcYdLp5LKddA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "^18.0.0", + "ts-node": "^10.0.0", + "tsconfig-paths": "^4.1.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + } + }, + "node_modules/@angular-builders/custom-webpack": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-18.0.0.tgz", + "integrity": "sha512-XSynPSXHq5+nrh7J2snfrcbvm6YGwUGQRzr7OuO3wURJ6CHOD9C+xEAmvEUWW8c1YjEslVNG7aLtCGz7LA4ymw==", + "dev": true, + "dependencies": { + "@angular-builders/common": "2.0.0", + "@angular-devkit/architect": ">=0.1800.0 < 0.1900.0", + "@angular-devkit/build-angular": "^18.0.0", + "@angular-devkit/core": "^18.0.0", + "lodash": "^4.17.15", + "webpack-merge": "^5.7.3" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1800.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.4.tgz", + "integrity": "sha512-82TKhYnSO8aGIBo5TxPtyUQnZFcbV+qB2bIIYOAKsJgxAVxLeFD6QA6gTmHOZPXw5pBEPUO/+PUwq+Uk5xesgw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "18.0.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.0.4.tgz", + "integrity": "sha512-lFu1NDEUPIUxY+CmZJ3JspqVZDesrvdae5RbqQXCl87RfSy+ZDIa7rOtQxyBQtt2BuQIB9pWQSzCMii5kTHd6w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1800.4", + "@angular-devkit/build-webpack": "0.1800.4", + "@angular-devkit/core": "18.0.4", + "@angular/build": "18.0.4", + "@babel/core": "7.24.5", + "@babel/generator": "7.24.5", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.24.5", + "@babel/plugin-transform-async-generator-functions": "7.24.3", + "@babel/plugin-transform-async-to-generator": "7.24.1", + "@babel/plugin-transform-runtime": "7.24.3", + "@babel/preset-env": "7.24.5", + "@babel/runtime": "7.24.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "18.0.4", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.19", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.22", + "css-loader": "7.1.1", + "esbuild-wasm": "0.21.3", + "fast-glob": "3.3.2", + "http-proxy-middleware": "3.0.0", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.22", + "jsonc-parser": "3.2.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "12.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.10", + "mini-css-extract-plugin": "2.9.0", + "mrmime": "2.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.5.0", + "postcss": "8.4.38", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.77.2", + "sass-loader": "14.2.1", + "semver": "7.6.2", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.31.0", + "tree-kill": "1.2.2", + "tslib": "2.6.2", + "undici": "6.18.0", + "vite": "5.2.11", + "watchpack": "2.4.1", + "webpack": "5.91.0", + "webpack-dev-middleware": "7.2.1", + "webpack-dev-server": "5.0.4", + "webpack-merge": "5.10.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.21.3" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^18.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.5" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/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, + "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/@angular-devkit/build-angular/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/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 + }, + "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1800.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1800.4.tgz", + "integrity": "sha512-EtWyWH3Hb7Rh8u0Jb4cWJKRxlqiUo4qhHKjU+62E8XplWlajbuld3ltL50a3t8lkZQYYgl7nPt53E5kM/zFVrw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1800.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/core": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.4.tgz", + "integrity": "sha512-8vYvJ5FF2NjFUia00hv8KWakOjOZ+09PbnNqd+lntJBekIg1lHDOF/vNMlVHtU5LiE1aNi9P/69/VXTckPfU9g==", + "dev": true, + "dependencies": { + "ajv": "8.13.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.4.tgz", + "integrity": "sha512-hCHmuu/Z1teOQPx1AMJa/gcK6depk+XgU5dIpEvflC+ApW3hglNe2QKaqajDZ+34s+PKAVWa86M8IOV7o/mHuA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "18.0.4", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.10", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.3.tgz", + "integrity": "sha512-Wlll6y7euIXYsOHpTh0hvVTBs7lVnbKDHiyd4Dz7kAMSeE2zyQo6OcRN+FFH3GH9BUi5UooAICNX8dJDfps6Mw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.0.3" + } + }, + "node_modules/@angular/build": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.4.tgz", + "integrity": "sha512-70HQQnbCOXFT5F3ROyWNNfS9A63Fzts5ANJKJY1MJLrn+dgNEG7jdIWjTtvohL3RZz97rlzSq3qRZnfxqf1lsQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1800.4", + "@babel/core": "7.24.5", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.24.5", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "browserslist": "^4.23.0", + "critters": "0.0.22", + "esbuild": "0.21.3", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.22", + "lmdb": "3.0.8", + "magic-string": "0.30.10", + "mrmime": "2.0.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.5.0", + "sass": "1.77.2", + "semver": "7.6.2", + "undici": "6.18.0", + "vite": "5.2.11", + "watchpack": "2.4.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "less": "^4.2.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.5" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/cdk": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.0.3.tgz", + "integrity": "sha512-F6kXAoIWUbvhvbSGnMxrKJZsI7rhGKDXVFFf9m+ZQAbqboSyDbbszux7Em4CEh27LaXYNFltUcKdCQ3hdp7Kig==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.4.tgz", + "integrity": "sha512-i7DLVIc4HN0CFZZKbEeVeQSADRG1Dt2CwXh/wTUzglRLu/tE7Q+WMrqJ2+lGTT2edZp2KKysM4Gxp+ATAzP8AQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1800.4", + "@angular-devkit/core": "18.0.4", + "@angular-devkit/schematics": "18.0.4", + "@schematics/angular": "18.0.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.2", + "inquirer": "9.2.22", + "jsonc-parser": "3.2.1", + "npm-package-arg": "11.0.2", + "npm-pick-manifest": "9.0.1", + "ora": "5.4.1", + "pacote": "18.0.6", + "resolve": "1.22.8", + "semver": "7.6.2", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.3.tgz", + "integrity": "sha512-lmT9QbWHduqzpsB0osQFHeSwvQB1iUeNwTVUyMtcs6i46l4qOPtAt2/9DvHUWEUp01EBDxyi385ZI3vD+FHH/w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.0.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.3.tgz", + "integrity": "sha512-wrXxgBsZX4yTrj/oZ8PDGmvhqj9S2TZfcuivaUitprNC2uBWTVb1UcOS45Qw9YlLB0sYa2AmBudICDqYpb8lfw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.0.3" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.3.tgz", + "integrity": "sha512-mxwQEeP94YBM6C9A2YfkV7ug1sHgh0fU/TSBpQcm5ni4cZiVPu6q/+Ft7hyFTKe2p3tKQme33+xVjsWhtOCx0A==", + "dev": true, + "dependencies": { + "@babel/core": "7.24.7", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/compiler": "18.0.3", + "typescript": ">=5.4 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/core": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.3.tgz", + "integrity": "sha512-376hijhEqNpeA+qKncpVTIaZXRdBT6RctEBnFhJ2l57aHPH5S3oaSBQu1k3TEi07FlKOD4XF1+NzX9dvdup1eg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/forms": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.3.tgz", + "integrity": "sha512-+CjDiooUi5FkTP3YQmdO8YRbjZicgLGZonvCdz3mSucLrTY6w3oBocNs6+Kc7fLuO1NKSkFmAfYApBwK3fKBMg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.0.3", + "@angular/core": "18.0.3", + "@angular/platform-browser": "18.0.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.0.3.tgz", + "integrity": "sha512-urENnMjhSO4Jia7CnbchqN236dOIU6TC3CazwsQoj1Odch9x+iSFkx9Y0jXsiR5r/suK4uqKpK5N8MJ1PxDG1g==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.3.tgz", + "integrity": "sha512-1fl/oJOca8BLxLxN0EjwxQZ3xzn3PCCN96ytM54bjdEMiELz+0AcQe5GNKcVjXlwMkibRLl1BP5GIdvnQYqJRA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "18.0.3", + "@angular/common": "18.0.3", + "@angular/core": "18.0.3" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.0.3.tgz", + "integrity": "sha512-+kHMn7P552YKk1gkVQNO1QXzHVaIeFiVa1rV1MNvX4DvumKT3puknx1SzcmtxZTX+9ee22OuPuyLNSAKREDAQQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.0.3", + "@angular/compiler": "18.0.3", + "@angular/core": "18.0.3", + "@angular/platform-browser": "18.0.3" + } + }, + "node_modules/@angular/router": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.3.tgz", + "integrity": "sha512-/cglLev0USxUNMc4M+EBFGrqw1EpKq87LUJL3+0Ztr012sVSeOU38ad41fs6pPcMBePBDZIw7KmSXypvUJJFMA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.0.3", + "@angular/core": "18.0.3", + "@angular/platform-browser": "18.0.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.5", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.5", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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, + "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/@develar/schema-utils/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, + "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/@develar/schema-utils/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@develar/schema-utils/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 + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "dev": true, + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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, + "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, + "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/get/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "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, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "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, + "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, + "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, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "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, + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "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, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", + "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", + "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", + "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", + "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", + "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", + "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", + "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", + "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", + "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", + "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", + "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", + "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", + "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", + "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", + "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", + "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", + "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", + "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", + "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", + "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", + "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", + "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", + "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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, + "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/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz", + "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fontsource/roboto": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.13.tgz", + "integrity": "sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/figures": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", + "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@interactjs/types": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", + "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==" + }, + "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, + "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.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "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 + }, + "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, + "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.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "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, + "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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", + "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", + "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", + "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", + "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", + "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", + "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", + "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "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" + } + ], + "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, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@mdi/font": { + "version": "7.4.47", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", + "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==" + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ngtools/webpack": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.0.4.tgz", + "integrity": "sha512-eWQkAuHEnLme01Ey4Z0FoG6upJHYhnJfsCTBnyEB2LTfdyBUk+PC0gwPXInK8oltWjFfiMnCwxrUQvQsvPW7Hg==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "typescript": ">=5.4 <5.5", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", + "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.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, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.4.tgz", + "integrity": "sha512-fN4whuym9ZmcQFdTfwLZr4j+NcZ4LzbdLk8XYrYdxt1z8c9ujs5LqJYn0LYc3UWiYl7z2RVc9NOxzNrkiXdwlw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "18.0.4", + "@angular-devkit/schematics": "18.0.4", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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, + "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, + "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, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "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, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "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, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "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, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/leaflet": { + "version": "1.9.12", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.12.tgz", + "integrity": "sha512-BK7XS+NyRI291HIo0HCfE18Lp8oA30H1gpi1tf0mF3TgiCEzanQjOqNZ4x126SXzzi2oNSZhZ5axJp1k0iM6jg==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz", + "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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, + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "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, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@types/verror": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "dev": true, + "optional": true + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz", + "integrity": "sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/type-utils": "7.13.1", + "@typescript-eslint/utils": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz", + "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz", + "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz", + "integrity": "sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/utils": "7.13.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz", + "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz", + "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", + "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz", + "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.13.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "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 + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/amator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", + "integrity": "sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==", + "dependencies": { + "bezier-easing": "^2.0.3" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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 + }, + "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, + "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/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 + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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, + "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, + "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, + "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/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "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, + "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, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "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, + "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 + }, + "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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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 + }, + "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" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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 + }, + "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, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/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 + }, + "node_modules/browserify-sign/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, + "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/browserify-sign/node_modules/readable-stream/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 + }, + "node_modules/browserify-sign/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, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/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 + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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" + } + ], + "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, + "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, + "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 + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "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, + "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, + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/builder-util/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 + }, + "node_modules/builder-util/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, + "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/builder-util/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/builder-util/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 + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/builder-util/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, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/builder-util/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", + "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "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, + "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": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-plugin-zoom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", + "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", + "dependencies": { + "hammerjs": "^2.0.8" + }, + "peerDependencies": { + "chart.js": ">=3.2.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "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 + }, + "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" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/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 + }, + "node_modules/cliui/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, + "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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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, + "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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "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, + "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, + "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/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/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 + }, + "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 + }, + "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, + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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 + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/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 + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/critters": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/critters/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/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, + "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/critters/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/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 + }, + "node_modules/critters/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-loader": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.1.tgz", + "integrity": "sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "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, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "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, + "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, + "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-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": 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, + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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/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 + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "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, + "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/dmg-license/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, + "optional": true, + "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/dmg-license/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, + "optional": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", + "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", + "dev": true, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "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 + }, + "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 + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "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, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "31.0.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.1.tgz", + "integrity": "sha512-2eBcp4iqLkTsml6mMq+iqrS5u3kJ/2mpOLP7Mj7lo0uNK3OyfNqRS9z1ArsHjBF2/HV250Te/O9nKrwQRTX/+g==", + "dev": true, + "hasInstallScript": true, + "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, + "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, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/electron-builder/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, + "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/electron-builder/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/electron-builder/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 + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "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/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/electron-publish/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, + "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/electron-publish/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/electron-publish/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 + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.806", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.806.tgz", + "integrity": "sha512-nkoEX2QIB8kwCOtvtgwhXWy2IHVcOLQZu9Qo36uaGB835mdX/h8uLRlosL6QIhLVUnAiicXRW00PwaPZC74Nrg==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "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 + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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, + "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 + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "optional": true + }, + "node_modules/esbuild": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", + "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.3", + "@esbuild/android-arm": "0.21.3", + "@esbuild/android-arm64": "0.21.3", + "@esbuild/android-x64": "0.21.3", + "@esbuild/darwin-arm64": "0.21.3", + "@esbuild/darwin-x64": "0.21.3", + "@esbuild/freebsd-arm64": "0.21.3", + "@esbuild/freebsd-x64": "0.21.3", + "@esbuild/linux-arm": "0.21.3", + "@esbuild/linux-arm64": "0.21.3", + "@esbuild/linux-ia32": "0.21.3", + "@esbuild/linux-loong64": "0.21.3", + "@esbuild/linux-mips64el": "0.21.3", + "@esbuild/linux-ppc64": "0.21.3", + "@esbuild/linux-riscv64": "0.21.3", + "@esbuild/linux-s390x": "0.21.3", + "@esbuild/linux-x64": "0.21.3", + "@esbuild/netbsd-x64": "0.21.3", + "@esbuild/openbsd-x64": "0.21.3", + "@esbuild/sunos-x64": "0.21.3", + "@esbuild/win32-arm64": "0.21.3", + "@esbuild/win32-ia32": "0.21.3", + "@esbuild/win32-x64": "0.21.3" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.21.3.tgz", + "integrity": "sha512-DMOV+eeVra0yVq3XIojfczdEQsz+RiFnpEj7lqs8Gux9mlTpN7yIbw0a4KzLspn0Uhw6UVEH3nUAidSqc/rcQg==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "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.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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, + "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/eslint/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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, + "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/eslint/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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" + ], + "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 + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.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, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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 + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "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-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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, + "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, + "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "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, + "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 + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "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, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/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 + }, + "node_modules/hotkeys-js": { + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.13.7.tgz", + "integrity": "sha512-ygFIdTqqwG4fFP7kkiYlvayZppeIQX2aPpirsngkv1xM1lP0piDY5QEh68nQnIKvz64hfocxhBaD/uK3sSK1yQ==", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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 + }, + "node_modules/hpack.js/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, + "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/hpack.js/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 + }, + "node_modules/hpack.js/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, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", + "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.10", + "debug": "^4.3.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, + "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, + "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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.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" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "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 + }, + "node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.22", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", + "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.2", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/interactjs": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", + "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", + "dependencies": { + "@interactjs/types": "1.10.27" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/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 + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "dev": true, + "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 + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/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, + "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/jake/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/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 + }, + "node_modules/jake/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "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, + "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, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "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, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.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 + }, + "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, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/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, + "peer": true + }, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "dev": true, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lmdb": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", + "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.9.9", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.0.8", + "@lmdb/lmdb-darwin-x64": "3.0.8", + "@lmdb/lmdb-linux-arm": "3.0.8", + "@lmdb/lmdb-linux-arm64": "3.0.8", + "@lmdb/lmdb-linux-x64": "3.0.8", + "@lmdb/lmdb-win32-x64": "3.0.8" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "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, + "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, + "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, + "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, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": 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, + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/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, + "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/log-symbols/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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 + }, + "node_modules/log-symbols/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/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, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.1.2", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "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, + "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, + "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, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=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, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "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, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/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 + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/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 + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/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 + }, + "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, + "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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/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 + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/msgpackr": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", + "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ngraph.events": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", + "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/nice-napi/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "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, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WLk77vLpbcpmTekRj6s6vYxk30XoyaY5MDZ4+9g8OaKoG3Ij+TjOqhpQjVUlfDZBPBgpNATDltaQkzuXSnnkwg==", + "dev": true, + "dependencies": { + "assert": "^2.1.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^5.7.0", + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.3.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.5.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^4.18.2", + "url": "^0.11.3", + "util": "^0.12.5", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", + "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": 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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz", + "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/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, + "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/ora/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/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 + }, + "node_modules/ora/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/panzoom": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/panzoom/-/panzoom-9.4.3.tgz", + "integrity": "sha512-xaxCpElcRbQsUtIdwlrZA90P90+BHip4Vda2BC8MEb4tkI05PmR6cKECdqUCZ85ZvBHjpI9htJrZBxV5Gp/q/w==", + "dependencies": { + "amator": "^1.1.0", + "ngraph.events": "^1.2.2", + "wheel": "^1.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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, + "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.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "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 + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", + "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", + "dev": true, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "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, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/primeflex": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/primeflex/-/primeflex-3.3.1.tgz", + "integrity": "sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ==" + }, + "node_modules/primeicons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", + "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==" + }, + "node_modules/primeng": { + "version": "17.18.1", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-17.18.1.tgz", + "integrity": "sha512-pMuXOgLQw5Xz0w9d3YTp2DAlYR8svK1Jz5gSWAhk6AyH7u7akwL1JX96RXVzLS8v2YeLUCvkMM+QROOvR3yKug==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^17.0.0 || ^18.0.0", + "@angular/core": "^17.0.0 || ^18.0.0", + "@angular/forms": "^17.0.0 || ^18.0.0", + "rxjs": "^6.0.0 || ^7.8.1", + "zone.js": "~0.14.0" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.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 + }, + "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, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "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, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ] + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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/read-config-file/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 + }, + "node_modules/read-config-file/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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, + "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, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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, + "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/roarr/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, + "optional": true + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "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, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sass": { + "version": "1.77.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", + "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", + "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "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": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "optional": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/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 + }, + "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, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/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, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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/slice-ansi/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, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/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, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/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, + "optional": true + }, + "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, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "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, + "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, + "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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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, + "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/tar/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, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/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 + }, + "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, + "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, + "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.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "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, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/terser": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/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, + "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/terser-webpack-plugin/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/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 + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmp-promise/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", + "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "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, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.13.1.tgz", + "integrity": "sha512-pvLEuRs8iS9s3Cnp/Wt//hpK8nKc8hVa3cLljHqzaJJQYP8oys8GUyIFqtlev+2lT/fqMPcyQko+HJ6iYK3nFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.13.1", + "@typescript-eslint/parser": "7.13.1", + "@typescript-eslint/utils": "7.13.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", + "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "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 + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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 + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "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/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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 + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/wait-on": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "dev": true, + "dependencies": { + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz", + "integrity": "sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/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, + "peer": true, + "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/webpack/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, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/webpack/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, + "peer": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/wheel": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wheel/-/wheel-1.0.0.tgz", + "integrity": "sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==" + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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 + }, + "node_modules/wrap-ansi/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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 + }, + "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 + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "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, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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, + "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, + "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, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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, + "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" + } + }, + "node_modules/zone.js": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" + } + } } diff --git a/desktop/package.json b/desktop/package.json index 3c577066c..7ca844d76 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,87 +1,91 @@ { - "name": "nebulosa", - "version": "0.1.0", - "description": "The complete integrated solution for all of your astronomical imaging needs.", - "author": { - "name": "Tiago Melo", - "email": "tiago.henrique.cco@gmail.com" - }, - "homepage": "https://tiagohm.github.io/nebulosa", - "license": "MIT", - "main": "app/main.js", - "private": true, - "scripts": { - "postinstall": "electron-builder install-app-deps", - "ng": "ng", - "start": "npm-run-all -p electron:serve ng:serve", - "ng:serve": "ng serve -c web --hmr", - "build": "npm run electron:serve-tsc && ng build --base-href ./", - "build:dev": "npm run build -- -c dev", - "build:prod": "npm run build -- -c production", - "web:build": "npm run build -- -c web-production", - "electron": "electron", - "electron:serve-tsc": "tsc -p tsconfig.serve.json", - "electron:serve": "wait-on tcp:4200 && npm run electron:serve-tsc && electron . --serve", - "electron:local": "npm run build:prod && electron .", - "electron:build": "npm run build:prod && electron-builder build --publish=never", - "electron:build:deb": "npm run electron:build -- --linux deb", - "electron:build:rpm": "npm run electron:build -- --linux rpm", - "electron:build:app": "npm run electron:build -- --linux AppImage", - "test": "ng test --watch=false", - "test:watch": "ng test", - "lint": "ng lint" - }, - "dependencies": { - "@angular/animations": "18.0.3", - "@angular/cdk": "18.0.3", - "@angular/common": "18.0.3", - "@angular/compiler": "18.0.3", - "@angular/core": "18.0.3", - "@angular/forms": "18.0.3", - "@angular/platform-browser": "18.0.3", - "@angular/platform-browser-dynamic": "18.0.3", - "@angular/router": "18.0.3", - "@fontsource/roboto": "5.0.13", - "@mdi/font": "7.4.47", - "chart.js": "4.4.3", - "chartjs-plugin-zoom": "2.0.1", - "hotkeys-js": "3.13.7", - "interactjs": "1.10.27", - "leaflet": "1.9.4", - "moment": "2.30.1", - "panzoom": "9.4.3", - "primeflex": "3.3.1", - "primeicons": "7.0.0", - "primeng": "17.18.1", - "rxjs": "7.8.1", - "tslib": "2.6.3", - "zone.js": "0.14.7" - }, - "devDependencies": { - "@angular-builders/custom-webpack": "18.0.0", - "@angular-devkit/build-angular": "18.0.4", - "@angular/cli": "18.0.4", - "@angular/compiler-cli": "18.0.3", - "@angular/language-service": "18.0.3", - "@types/leaflet": "1.9.12", - "@types/node": "20.14.6", - "@types/uuid": "9.0.8", - "electron": "31.0.1", - "electron-builder": "24.13.3", - "node-polyfill-webpack-plugin": "4.0.0", - "npm-run-all": "4.1.5", - "prettier": "3.3.2", - "ts-node": "10.9.2", - "typescript": "5.4.5", - "wait-on": "7.2.0" - }, - "overrides": { - "axios": "1.6.2" - }, - "engines": { - "node": ">= 22.0.0" - }, - "browserslist": [ - "chrome 114" - ] + "name": "nebulosa", + "version": "0.1.0", + "description": "The complete integrated solution for all of your astronomical imaging needs.", + "author": { + "name": "Tiago Melo", + "email": "tiago.henrique.cco@gmail.com" + }, + "homepage": "https://tiagohm.github.io/nebulosa", + "license": "MIT", + "main": "app/main.js", + "private": true, + "scripts": { + "postinstall": "electron-builder install-app-deps", + "ng": "ng", + "start": "npm-run-all -p electron:serve ng:serve", + "ng:serve": "ng serve -c web --hmr", + "build": "npm run electron:serve-tsc && ng build --base-href ./", + "build:dev": "npm run build -- -c dev", + "build:prod": "npm run build -- -c production", + "web:build": "npm run build -- -c web-production", + "electron": "electron", + "electron:serve-tsc": "tsc -p tsconfig.serve.json", + "electron:serve": "wait-on tcp:4200 && npm run electron:serve-tsc && electron . --serve", + "electron:local": "npm run build:prod && electron .", + "electron:build": "npm run build:prod && electron-builder build --publish=never", + "electron:build:deb": "npm run electron:build -- --linux deb", + "electron:build:rpm": "npm run electron:build -- --linux rpm", + "electron:build:app": "npm run electron:build -- --linux AppImage", + "lint": "npx eslint .", + "prettier:ts": "npx prettier '**/*.ts' --write", + "prettier:html": "npx prettier '**/*.html' --write", + "prettier:scss": "npx prettier '**/*.scss' --write", + "prettier:json": "npx prettier '**/*.json' --write" + }, + "dependencies": { + "@angular/animations": "18.0.3", + "@angular/cdk": "18.0.3", + "@angular/common": "18.0.3", + "@angular/compiler": "18.0.3", + "@angular/core": "18.0.3", + "@angular/forms": "18.0.3", + "@angular/platform-browser": "18.0.3", + "@angular/platform-browser-dynamic": "18.0.3", + "@angular/router": "18.0.3", + "@fontsource/roboto": "5.0.13", + "@mdi/font": "7.4.47", + "chart.js": "4.4.3", + "chartjs-plugin-zoom": "2.0.1", + "hotkeys-js": "3.13.7", + "interactjs": "1.10.27", + "leaflet": "1.9.4", + "moment": "2.30.1", + "panzoom": "9.4.3", + "primeflex": "3.3.1", + "primeicons": "7.0.0", + "primeng": "17.18.1", + "rxjs": "7.8.1", + "tslib": "2.6.3", + "zone.js": "0.14.7" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "18.0.0", + "@angular-devkit/build-angular": "18.0.4", + "@angular/cli": "18.0.4", + "@angular/compiler-cli": "18.0.3", + "@angular/language-service": "18.0.3", + "@eslint/js": "9.5.0", + "@types/eslint__js": "8.42.3", + "@types/leaflet": "1.9.12", + "@types/node": "20.14.6", + "@types/uuid": "9.0.8", + "electron": "31.0.1", + "electron-builder": "24.13.3", + "eslint": "8.57.0", + "node-polyfill-webpack-plugin": "4.0.0", + "npm-run-all": "4.1.5", + "prettier": "3.3.2", + "ts-node": "10.9.2", + "typescript": "5.4.5", + "typescript-eslint": "7.13.1", + "wait-on": "7.2.0" + }, + "overrides": { + "axios": "1.6.2" + }, + "engines": { + "node": ">= 22.0.0" + }, + "browserslist": ["chrome 114"] } diff --git a/desktop/src/app/alignment/alignment.component.ts b/desktop/src/app/alignment/alignment.component.ts index 02e23cdd9..ac45c5c0b 100644 --- a/desktop/src/app/alignment/alignment.component.ts +++ b/desktop/src/app/alignment/alignment.component.ts @@ -71,7 +71,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { @ViewChild('cameraExposure') private readonly cameraExposure!: CameraExposureComponent - private autoResizeTimeout?: any + private autoResizeTimeout?: number constructor( app: AppComponent, @@ -171,9 +171,9 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { }) }) - electron.on('TPPA.ELAPSED', (event) => { - if (event.camera.id === this.camera?.id) { - ngZone.run(() => { + electron.on('TPPA.ELAPSED', async (event) => { + if (event.camera.id === this.camera.id) { + await ngZone.run(async () => { this.status = event.state this.running = event.state !== 'FINISHED' this.pausingOrPaused = event.state === 'PAUSING' || event.state === 'PAUSED' @@ -188,10 +188,10 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { this.tppaAltitudeErrorDirection = event.altitudeErrorDirection this.tppaTotalError = event.totalError clearTimeout(this.autoResizeTimeout) - this.autoResizeTimeout = electron.autoResizeWindow() + this.autoResizeTimeout = await electron.autoResizeWindow() } else if (event.state === 'FINISHED') { this.cameraExposure.reset() - electron.autoResizeWindow() + await electron.autoResizeWindow() } else if (event.state === 'SOLVED' || event.state === 'SLEWED') { this.tppaFailed = false this.tppaRightAscension = event.rightAscension @@ -208,7 +208,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { }) electron.on('DARV.ELAPSED', (event) => { - if (event.camera.id === this.camera?.id) { + if (event.camera.id === this.camera.id) { ngZone.run(() => { this.status = event.state this.running = this.cameraExposure.handleCameraCaptureEvent(event.capture) @@ -234,22 +234,22 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { } @HostListener('window:unload') - async ngOnDestroy() { + ngOnDestroy() { this.pinger.unregister(this) - this.darvStop() - this.tppaStop() + void this.darvStop() + void this.tppaStop() } - ping() { - if (this.camera.id) this.api.cameraListen(this.camera) - if (this.mount.id) this.api.mountListen(this.mount) - if (this.guideOutput.id) this.api.guideOutputListen(this.guideOutput) + async ping() { + if (this.camera.id) await this.api.cameraListen(this.camera) + if (this.mount.id) await this.api.mountListen(this.mount) + if (this.guideOutput.id) await this.api.guideOutputListen(this.guideOutput) } async cameraChanged() { if (this.camera.id) { - this.ping() + await this.ping() const camera = await this.api.camera(this.camera.id) Object.assign(this.camera, camera) @@ -258,7 +258,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { async mountChanged() { if (this.mount.id) { - this.ping() + await this.ping() const mount = await this.api.mount(this.mount.id) Object.assign(this.mount, mount) @@ -268,7 +268,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { async guideOutputChanged() { if (this.guideOutput.id) { - this.ping() + await this.ping() const guideOutput = await this.api.guideOutput(this.guideOutput.id) Object.assign(this.guideOutput, guideOutput) diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index d9f0f44c0..af6e56b1f 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -1,6 +1,5 @@ import { AfterViewInit, Component } from '@angular/core' import { Title } from '@angular/platform-browser' -import { ActivatedRoute } from '@angular/router' import { APP_CONFIG } from '../environments/environment' import { MenuItem } from '../shared/components/menu-item/menu-item.component' import { ElectronService } from '../shared/services/electron.service' @@ -29,7 +28,6 @@ export class AppComponent implements AfterViewInit { constructor( private windowTitle: Title, - private route: ActivatedRoute, private electron: ElectronService, ) { console.info('APP_CONFIG', APP_CONFIG) @@ -43,25 +41,25 @@ export class AppComponent implements AfterViewInit { async ngAfterViewInit() { if (window.preference.autoResizable !== false) { - this.electron.autoResizeWindow() + await this.electron.autoResizeWindow() } } pin() { this.pinned = !this.pinned - if (this.pinned) this.electron.pinWindow() - else this.electron.unpinWindow() + if (this.pinned) return this.electron.pinWindow() + else return this.electron.unpinWindow() } minimize() { - this.electron.minimizeWindow() + return this.electron.minimizeWindow() } maximize() { - this.electron.maximizeWindow() + return this.electron.maximizeWindow() } - close(data?: any) { - this.electron.closeWindow({ id: window.id, data }) + close(data?: unknown) { + return this.electron.closeWindow({ id: window.id, data }) } } diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 45ffb6322..340a31db3 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -644,6 +644,7 @@ @@ -653,6 +654,7 @@ diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index 816faa56a..b02090ed4 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -8,7 +8,7 @@ import { ListboxChangeEvent } from 'primeng/listbox' import { OverlayPanel } from 'primeng/overlaypanel' import { Subscription, timer } from 'rxjs' import { DeviceListMenuComponent } from '../../shared/components/device-list-menu/device-list-menu.component' -import { MenuItem } from '../../shared/components/menu-item/menu-item.component' +import { SlideMenuItem } from '../../shared/components/menu-item/menu-item.component' import { ONE_DECIMAL_PLACE_FORMATTER, TWO_DIGITS_FORMATTER } from '../../shared/constants' import { SkyObjectPipe } from '../../shared/pipes/skyObject.pipe' import { ApiService } from '../../shared/services/api.service' @@ -16,7 +16,7 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' -import { Angle, CONSTELLATIONS, CloseApproach, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' +import { Angle, CONSTELLATIONS, CloseApproach, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, MinorPlanetSearchItem, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' import { Mount } from '../../shared/types/mount.types' import { AppComponent } from '../app.component' @@ -385,7 +385,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, const hours = ((value as number) + 12) % 24 const h = Math.trunc(hours) const m = Math.trunc((hours - h) * 60) - return m === 0 ? `${TWO_DIGITS_FORMATTER.format(h)}` : '' + return m === 0 ? TWO_DIGITS_FORMATTER.format(h) : '' }, }, grid: { @@ -399,17 +399,20 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private static readonly DEFAULT_SATELLITE_FILTERS: SatelliteGroupType[] = ['AMATEUR', 'BEIDOU', 'GALILEO', 'GLO_OPS', 'GNSS', 'GPS_OPS', 'ONEWEB', 'SCIENCE', 'STARLINK', 'STATIONS', 'VISUAL'] - readonly ephemerisModel: MenuItem[] = [ + readonly ephemerisModel: SlideMenuItem[] = [ { icon: 'mdi mdi-magnify', label: 'Find sky objects around this object', - command: () => { + slideMenu: [], + command: async () => { this.skyObjectFilter.rightAscension = this.bodyPosition.rightAscensionJ2000 this.skyObjectFilter.declination = this.bodyPosition.declinationJ2000 if (this.skyObjectFilter.radius <= 0) this.skyObjectFilter.radius = 4 + this.tab = SkyAtlasTab.SKY_OBJECT - this.tabChanged() - this.filterSkyObject() + + await this.tabChanged() + await this.filterSkyObject() }, }, ] @@ -440,10 +443,10 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, }, }) - electron.on('LOCATION.CHANGED', (event) => { - ngZone.run(() => { + electron.on('LOCATION.CHANGED', async (event) => { + await ngZone.run(() => { this.location = event - this.refreshTab(true, true) + return this.refreshTab(true, true) }) }) @@ -479,14 +482,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, const now = new Date() const initialDelay = 60 * 1000 - (now.getSeconds() * 1000 + now.getMilliseconds()) - this.refreshTimer = timer(initialDelay, 60 * 1000).subscribe(() => { + this.refreshTimer = timer(initialDelay, 60 * 1000).subscribe(async () => { if (!this.useManualDateTime) { - this.refreshTab() + await this.refreshTab() } }) this.route.queryParams.subscribe(async (e) => { - const data = JSON.parse(decodeURIComponent(e.data)) as SkyAtlasData + const data = JSON.parse(decodeURIComponent(e['data'] as string)) as SkyAtlasData await this.loadTabFromData(data) }) } @@ -548,9 +551,9 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } - minorPlanetChoosen(event: ListboxChangeEvent) { - this.minorPlanetSearchText = event.value.pdes - this.searchMinorPlanet() + async minorPlanetChoosen(event: ListboxChangeEvent) { + this.minorPlanetSearchText = (event.value as MinorPlanetSearchItem).pdes + await this.searchMinorPlanet() this.showMinorPlanetChoiceDialog = false } @@ -568,28 +571,28 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } - closeApproachChanged() { + async closeApproachChanged() { if (this.closeApproach) { this.minorPlanetSearchText = this.closeApproach.designation this.minorPlanetTab = 0 - this.searchMinorPlanet() + await this.searchMinorPlanet() } } - async starChanged() { - await this.refreshTab(false, true) + starChanged() { + return this.refreshTab(false, true) } - async dsoChanged() { - await this.refreshTab(false, true) + dsoChanged() { + return this.refreshTab(false, true) } - async skyObjectChanged() { - await this.refreshTab(false, true) + skyObjectChanged() { + return this.refreshTab(false, true) } - async satelliteChanged() { - await this.refreshTab(false, true) + satelliteChanged() { + return this.refreshTab(false, true) } showSkyObjectFilterDialog() { @@ -610,10 +613,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async filterSkyObject() { - if (!this.skyObjectFilter) return - await this.searchSkyObject() - this.showSkyObjectFilter = false } @@ -639,14 +639,15 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, resetSatelliteFilter() { const preference = this.preference.skyAtlasPreference.get() - preference.satellites = [] + const satellites = [] for (const group of SATELLITE_GROUPS) { const enabled = AtlasComponent.DEFAULT_SATELLITE_FILTERS.includes(group) - preference.satellites!.push({ group, enabled }) + satellites.push({ group, enabled }) this.satelliteSearchGroup.set(group, enabled) } + preference.satellites = satellites this.preference.skyAtlasPreference.set(preference) } @@ -665,26 +666,26 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } - async mountGoTo() { - this.executeMount((mount) => { - this.api.mountGoTo(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) + mountGoTo() { + return this.executeMount((mount) => { + return this.api.mountGoTo(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) }) } - async mountSlew() { - this.executeMount((mount) => { - this.api.mountSlew(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) + mountSlew() { + return this.executeMount((mount) => { + return this.api.mountSlew(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) }) } - async mountSync() { - this.executeMount((mount) => { - this.api.mountSync(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) + mountSync() { + return this.executeMount((mount) => { + return this.api.mountSync(mount, this.bodyPosition.rightAscension, this.bodyPosition.declination, false) }) } frame() { - this.browserWindow.openFraming({ + return this.browserWindow.openFraming({ rightAscension: this.bodyPosition.rightAscensionJ2000, declination: this.bodyPosition.declinationJ2000, }) @@ -706,10 +707,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.app.subTitle = `${this.location.name} · ${moment(this.dateTime).format('YYYY-MM-DD HH:mm')}` try { - if (this.tab === undefined) { - this.tab = SkyAtlasTab.SUN - } - // Sun. if (this.tab === SkyAtlasTab.SUN) { this.name = 'Sun' @@ -772,7 +769,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } // Satellite. - else if (this.tab === SkyAtlasTab.SATELLITE) { + else { this.tags = [] if (this.satellite) { @@ -823,7 +820,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, [twilight.civilDawn[1], 90], [24.0, 90], ] - this.chart?.refresh() + this.chart.refresh() } if (this.refreshTabCount === 1 || refreshChart) { @@ -887,7 +884,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, return } - this.chart?.refresh() + this.chart.refresh() } private static belowZeroPoints(points: [number, number][]) { @@ -898,21 +895,21 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } - private async executeMount(action: (mount: Mount) => void) { + private async executeMount(action: (mount: Mount) => void | Promise) { if (await this.prime.confirm('Are you sure that you want to proceed?')) { - return + return false } const mounts = await this.api.mounts() if (mounts.length === 1) { - action(mounts[0]) + await action(mounts[0]) return true } else { const mount = await this.deviceMenu.show(mounts) if (mount && mount !== 'NONE' && mount.connected) { - action(mount) + await action(mount) return true } } diff --git a/desktop/src/app/autofocus/autofocus.component.ts b/desktop/src/app/autofocus/autofocus.component.ts index e0f619830..063abf6d2 100644 --- a/desktop/src/app/autofocus/autofocus.component.ts +++ b/desktop/src/app/autofocus/autofocus.component.ts @@ -8,7 +8,7 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { Pingable, Pinger } from '../../shared/services/pinger.service' import { PreferenceService } from '../../shared/services/preference.service' -import { AutoFocusPreference, AutoFocusRequest, AutoFocusState, CurveChart, EMPTY_AUTO_FOCUS_PREFERENCE } from '../../shared/types/autofocus.type' +import { AutoFocusChart, AutoFocusPreference, AutoFocusRequest, AutoFocusState, EMPTY_AUTO_FOCUS_PREFERENCE } from '../../shared/types/autofocus.type' import { Camera, EMPTY_CAMERA, EMPTY_CAMERA_START_CAPTURE, updateCameraStartCaptureFromCamera } from '../../shared/types/camera.types' import { EMPTY_FOCUSER, Focuser } from '../../shared/types/focuser.types' import { deviceComparator } from '../../shared/utils/comparators' @@ -60,10 +60,10 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { }, callbacks: { title: (item) => { - return `${item[0].parsed.x.toFixed(0)}` + return item[0]?.parsed.x.toFixed(0) }, label: (item) => { - return `${item.parsed.y.toFixed(1)}` + return item.parsed.y.toFixed(1) }, }, }, @@ -209,6 +209,30 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { ], } + private get trendLineLeftDataset() { + return this.chartData.datasets[0] + } + + private get trendLineRightDataset() { + return this.chartData.datasets[1] + } + + private get parabolicDataset() { + return this.chartData.datasets[2] + } + + private get hyperbolicDataset() { + return this.chartData.datasets[3] + } + + private get focusPointsDataset() { + return this.chartData.datasets[4] + } + + private get predictedFocusPointsDataset() { + return this.chartData.datasets[5] + } + constructor( app: AppComponent, private api: ApiService, @@ -287,8 +311,8 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { this.cameraExposure.handleCameraCaptureEvent(event.capture, true) } - if (event.state === 'CURVE_FITTED') { - this.focusPoints.push(event.focusPoint!) + if (event.state === 'CURVE_FITTED' && event.focusPoint) { + this.focusPoints.push(event.focusPoint) } else if (event.state === 'ANALYSED') { this.starCount = event.starCount this.starHFD = event.starHFD @@ -311,19 +335,19 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { } @HostListener('window:unload') - async ngOnDestroy() { + ngOnDestroy() { this.pinger.unregister(this) - this.stop() + void this.stop() } - ping() { - if (this.camera.id) this.api.cameraListen(this.camera) - if (this.focuser.id) this.api.focuserListen(this.focuser) + async ping() { + if (this.camera.id) await this.api.cameraListen(this.camera) + if (this.focuser.id) await this.api.focuserListen(this.focuser) } async cameraChanged() { if (this.camera.id) { - this.ping() + await this.ping() const camera = await this.api.camera(this.camera.id) Object.assign(this.camera, camera) @@ -333,7 +357,7 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { async focuserChanged() { if (this.focuser.id) { - this.ping() + await this.ping() const focuser = await this.api.focuser(this.focuser.id) Object.assign(this.focuser, focuser) @@ -366,69 +390,69 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { return this.browserWindow.openCameraImage(this.camera, 'ALIGNMENT') } - private updateChart(data: CurveChart) { + private updateChart(data: AutoFocusChart) { if (data.trendLine) { - this.chartData.datasets[0].data = data.trendLine.left.points - this.chartData.datasets[1].data = data.trendLine.right.points + this.trendLineLeftDataset.data = data.trendLine.left.points + this.trendLineRightDataset.data = data.trendLine.right.points } else { - this.chartData.datasets[0].data = [] - this.chartData.datasets[1].data = [] + this.trendLineLeftDataset.data = [] + this.trendLineRightDataset.data = [] } if (data.parabolic) { - this.chartData.datasets[2].data = data.parabolic.points + this.parabolicDataset.data = data.parabolic.points } else { - this.chartData.datasets[2].data = [] + this.parabolicDataset.data = [] } if (data.hyperbolic) { - this.chartData.datasets[3].data = data.hyperbolic.points + this.hyperbolicDataset.data = data.hyperbolic.points } else { - this.chartData.datasets[3].data = [] + this.hyperbolicDataset.data = [] } - this.chartData.datasets[4].data = this.focusPoints + this.focusPointsDataset.data = this.focusPoints if (data.predictedFocusPoint) { - this.chartData.datasets[5].data = [data.predictedFocusPoint] + this.predictedFocusPointsDataset.data = [data.predictedFocusPoint] } else { - this.chartData.datasets[5].data = [] + this.predictedFocusPointsDataset.data = [] } const scales = this.chartOptions.scales! - scales.x!.min = Math.max(0, data.minX - this.stepSizeForScale) - scales.x!.max = data.maxX + this.stepSizeForScale - scales.y!.max = (data.maxY || 19) + 1 + scales['x']!.min = Math.max(0, data.minX - this.stepSizeForScale) + scales['x']!.max = data.maxX + this.stepSizeForScale + scales['y']!.max = (data.maxY || 19) + 1 const zoom = this.chartOptions.plugins!.zoom! - zoom.limits!.x!.min = scales.x!.min - zoom.limits!.x!.max = scales.x!.max - zoom.limits!.y!.max = scales.y!.max + zoom.limits!['x']!.min = scales['x']!.min + zoom.limits!['x']!.max = scales['x']!.max + zoom.limits!['y']!.max = scales['y']!.max - this.chart?.refresh() + this.chart.refresh() } private clearChart() { this.focusPoints = [] - for (let i = 0; i < this.chartData.datasets.length; i++) { - this.chartData.datasets[i].data = [] + for (const dataset of this.chartData.datasets) { + dataset.data = [] } - this.chart?.refresh() + this.chart.refresh() } private loadPreference() { - const preference = this.preference.autoFocusPreference.get() + const preference: Partial = this.preference.autoFocusPreference.get() this.request.fittingMode = preference.fittingMode ?? 'HYPERBOLIC' this.request.initialOffsetSteps = preference.initialOffsetSteps ?? 4 this.request.rSquaredThreshold = preference.rSquaredThreshold ?? 0.5 this.request.stepSize = preference.stepSize ?? 100 this.request.totalNumberOfAttempts = preference.totalNumberOfAttempts ?? 1 - this.request.backlashCompensation.mode = preference.backlashCompensation.mode ?? 'NONE' - this.request.backlashCompensation.backlashIn = preference.backlashCompensation.backlashIn ?? 0 - this.request.backlashCompensation.backlashOut = preference.backlashCompensation.backlashOut ?? 0 + this.request.backlashCompensation.mode = preference.backlashCompensation?.mode ?? 'NONE' + this.request.backlashCompensation.backlashIn = preference.backlashCompensation?.backlashIn ?? 0 + this.request.backlashCompensation.backlashOut = preference.backlashCompensation?.backlashOut ?? 0 if (this.camera.id) { const cameraPreference = this.preference.cameraPreference(this.camera).get() diff --git a/desktop/src/app/calculator/calculator.component.ts b/desktop/src/app/calculator/calculator.component.ts index 707b86ee3..6f43b6c6e 100644 --- a/desktop/src/app/calculator/calculator.component.ts +++ b/desktop/src/app/calculator/calculator.component.ts @@ -10,7 +10,7 @@ import { FormulaComponent } from './formula/formula.component' styleUrls: ['./calculator.component.scss'], }) export class CalculatorComponent { - readonly formulae: { component: Type; formula: CalculatorFormula }[] = [ + readonly formulae: { component: Type; formula: CalculatorFormula }[] = [ { component: FormulaComponent, formula: { @@ -35,6 +35,8 @@ export class CalculatorComponent { calculate: (aperture, focalRatio) => { if (aperture && focalRatio) { return aperture * focalRatio + } else { + return undefined } }, }, @@ -64,6 +66,8 @@ export class CalculatorComponent { calculate: (focalLength, aperture) => { if (focalLength && aperture) { return focalLength / aperture + } else { + return undefined } }, }, @@ -88,6 +92,8 @@ export class CalculatorComponent { calculate: (aperture) => { if (aperture) { return 116 / aperture + } else { + return undefined } }, }, @@ -112,6 +118,8 @@ export class CalculatorComponent { calculate: (aperture) => { if (aperture) { return 138 / aperture + } else { + return undefined } }, }, @@ -135,6 +143,8 @@ export class CalculatorComponent { calculate: (aperture) => { if (aperture) { return 2.7 + 5 * Math.log10(aperture) + } else { + return undefined } }, }, @@ -163,6 +173,8 @@ export class CalculatorComponent { calculate: (larger, smaller) => { if (larger && smaller) { return Math.pow(larger, 2) / Math.pow(smaller, 2) + } else { + return undefined } }, tip: 'Compare against the human eye by putting 7 in the smaller telescope aperture box. 7mm is the aproximate maximum aperture of the human eye.', @@ -193,6 +205,8 @@ export class CalculatorComponent { calculate: (pixelSize, focalLength) => { if (pixelSize && focalLength) { return (pixelSize / focalLength) * 206.265 + } else { + return undefined } }, }, @@ -201,7 +215,7 @@ export class CalculatorComponent { formula = this.formulae[0] - private autoResizeTimeout: any + private autoResizeTimeout: number | undefined constructor( app: AppComponent, @@ -210,8 +224,8 @@ export class CalculatorComponent { app.title = 'Calculator' } - formulaChanged() { + async formulaChanged() { clearTimeout(this.autoResizeTimeout) - this.autoResizeTimeout = this.electron.autoResizeWindow() + this.autoResizeTimeout = await this.electron.autoResizeWindow() } } diff --git a/desktop/src/app/calibration/calibration.component.ts b/desktop/src/app/calibration/calibration.component.ts index 76201748f..58468e8df 100644 --- a/desktop/src/app/calibration/calibration.component.ts +++ b/desktop/src/app/calibration/calibration.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, HostListener, OnDestroy } from '@angular/core' +import { AfterViewInit, Component } from '@angular/core' import { dirname } from 'path' import { TreeDragDropService, TreeNode } from 'primeng/api' import { TreeNodeDropEvent } from 'primeng/tree' @@ -25,7 +25,7 @@ export type TreeNodeData = { type: 'NAME'; data: string } | { type: 'GROUP'; dat styleUrls: ['./calibration.component.scss'], providers: [TreeDragDropService], }) -export class CalibrationComponent implements AfterViewInit, OnDestroy { +export class CalibrationComponent implements AfterViewInit { readonly frames: CalibrationNode[] = [] showNewGroupDialog = false @@ -42,13 +42,10 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { app.title = 'Calibration' } - ngAfterViewInit() { - this.load() + async ngAfterViewInit() { + await this.load() } - @HostListener('window:unload') - ngOnDestroy() {} - private makeTreeNode(key: string, label: string, data: TreeNodeData, parent?: CalibrationNode): CalibrationNode { const draggable = data.type === 'FRAME' const droppable = data.type === 'NAME' @@ -58,7 +55,7 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { addGroup(name: string) { const node = this.frames.find((e) => e.label === name) ?? this.makeTreeNode(`group-${name}`, name, { type: 'NAME', data: name }) - if (this.frames.indexOf(node) < 0) { + if (!this.frames.includes(node)) { this.frames.push(node) } @@ -97,7 +94,7 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { if (path) { preference.openPath = dirname(path) this.preference.calibrationPreference.set(preference) - this.upload(node, path) + await this.upload(node, path) } } } @@ -110,7 +107,7 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { if (path) { preference.openPath = path this.preference.calibrationPreference.set(preference) - this.upload(node, path) + await this.upload(node, path) } } } @@ -120,8 +117,8 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { const frames = await this.api.uploadCalibrationFrame(node.data.data, path) if (frames.length > 0) { - this.electron.calibrationChanged() - this.load() + await this.electron.calibrationChanged() + await this.load() } } } @@ -137,22 +134,24 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { const groups = await this.api.calibrationFrames(name) for (const group of groups) { - const frameGroupNode = this.addFrameGroup(nameNode, group)! + const frameGroupNode = this.addFrameGroup(nameNode, group) - for (const frame of group.frames) { - this.addFrame(frameGroupNode, frame) + if (frameGroupNode) { + for (const frame of group.frames) { + this.addFrame(frameGroupNode, frame) + } } } } } openImage(frame: CalibrationFrame) { - this.browserWindow.openImage({ path: frame.path, source: 'PATH' }) + return this.browserWindow.openImage({ path: frame.path, source: 'PATH' }) } - toggleCalibrationFrame(node: CalibrationNode, enabled: boolean) { + async toggleCalibrationFrame(node: CalibrationNode, enabled: boolean) { if (node.data.type === 'FRAME') { - this.api.editCalibrationFrame(node.data.data) + await this.api.editCalibrationFrame(node.data.data) } } @@ -175,7 +174,7 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { if (idx >= 0) { this.frames.splice(idx, 1) console.info('frame deleted', node) - this.electron.calibrationChanged() + await this.electron.calibrationChanged() } } } @@ -198,12 +197,16 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { const frames: CalibrationFrame[] = [] function recursive(node: TreeNode) { - if (node.data!.type === 'NAME' || node.data!.type === 'GROUP') { - for (const child of node.children!) { - recursive(child) + if (node.data) { + if (node.data.type === 'NAME' || node.data.type === 'GROUP') { + if (node.children) { + for (const child of node.children) { + recursive(child) + } + } + } else { + frames.push(node.data.data) } - } else { - frames.push(node.data!.data) } } @@ -230,11 +233,11 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { for (const frame of frames) { frame.name = this.newGroupName await this.api.editCalibrationFrame(frame) - this.electron.calibrationChanged() + await this.electron.calibrationChanged() } this.showNewGroupDialog = false - this.load() + await this.load() } this.newGroupName = node.data.data @@ -253,8 +256,8 @@ export class CalibrationComponent implements AfterViewInit, OnDestroy { if (dragNode.data.type === 'FRAME' && dropNode.data.type === 'NAME' && dragNode.data.data.name !== dropNode.data.data) { dragNode.data.data.name = dropNode.data.data await this.api.editCalibrationFrame(dragNode.data.data) - this.electron.calibrationChanged() - this.load() + await this.electron.calibrationChanged() + await this.load() } } } diff --git a/desktop/src/app/camera/camera.component.html b/desktop/src/app/camera/camera.component.html index 1e30ae29f..f1ad36178 100644 --- a/desktop/src/app/camera/camera.component.html +++ b/desktop/src/app/camera/camera.component.html @@ -568,18 +568,22 @@ -
-
- Enabled - + +
+ Live Stacking +
+ Enabled + +
+
+
Live Stacker
-
- 32-bits (slower) +
+ 32-bit (slower)
-
- - - - -
{ this.showDitherDialog = true }, } - private readonly liveStackingMenuItem: MenuItem = { + private readonly liveStackingMenuItem: SlideMenuItem = { icon: 'mdi mdi-image-multiple', label: 'Live Stacking', + slideMenu: [], command: () => { this.showLiveStackingDialog = true }, } - private readonly snoopDevicesMenuItem: MenuItem = { + private readonly snoopDevicesMenuItem: SlideMenuItem = { icon: 'mdi mdi-connection', label: 'Snoop Devices', slideMenu: [ @@ -120,7 +122,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { ], } - readonly cameraModel: MenuItem[] = [this.ditherMenuItem, this.liveStackingMenuItem, this.snoopDevicesMenuItem] + readonly cameraModel: SlideMenuItem[] = [this.ditherMenuItem, this.liveStackingMenuItem, this.snoopDevicesMenuItem] hasDewHeater = false setpointTemperature = 0.0 @@ -165,7 +167,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { ] @ViewChild('cameraExposure') - private readonly cameraExposure!: CameraExposureComponent + private readonly cameraExposure?: CameraExposureComponent get status() { return this.cameraExposure?.state ?? 'IDLE' @@ -185,7 +187,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { private pinger: Pinger, ngZone: NgZone, ) { - if (app) app.title = 'Camera' + app.title = 'Camera' electron.on('CAMERA.UPDATED', (event) => { if (event.device.id === this.camera.id) { @@ -207,7 +209,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { electron.on('CAMERA.CAPTURE_ELAPSED', (event) => { if (event.camera.id === this.camera.id) { ngZone.run(() => { - this.running = this.cameraExposure.handleCameraCaptureEvent(event) + this.running = this.cameraExposure?.handleCameraCaptureEvent(event) ?? false }) } }) @@ -215,7 +217,9 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { electron.on('MOUNT.UPDATED', (event) => { if (event.device.id === this.equipment.mount?.id) { ngZone.run(() => { - Object.assign(this.equipment.mount!, event.device) + if (this.equipment.mount) { + Object.assign(this.equipment.mount, event.device) + } }) } }) @@ -223,7 +227,9 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { electron.on('WHEEL.UPDATED', (event) => { if (event.device.id === this.equipment.wheel?.id) { ngZone.run(() => { - Object.assign(this.equipment.wheel!, event.device) + if (this.equipment.wheel) { + Object.assign(this.equipment.wheel, event.device) + } }) } }) @@ -231,7 +237,9 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { electron.on('FOCUSER.UPDATED', (event) => { if (event.device.id === this.equipment.focuser?.id) { ngZone.run(() => { - Object.assign(this.equipment.focuser!, event.device) + if (this.equipment.focuser) { + Object.assign(this.equipment.focuser, event.device) + } }) } }) @@ -239,13 +247,15 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { electron.on('ROTATOR.UPDATED', (event) => { if (event.device.id === this.equipment.rotator?.id) { ngZone.run(() => { - Object.assign(this.equipment.rotator!, event.device) + if (this.equipment.rotator) { + Object.assign(this.equipment.rotator, event.device) + } }) } }) - electron.on('CALIBRATION.CHANGED', () => { - ngZone.run(() => this.loadCalibrationGroups()) + electron.on('CALIBRATION.CHANGED', async () => { + await ngZone.run(() => this.loadCalibrationGroups()) }) electron.on('ROI.SELECTED', (event) => { @@ -264,12 +274,12 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { ngAfterContentInit() { this.route.queryParams.subscribe(async (e) => { - const decodedData = JSON.parse(decodeURIComponent(e.data)) + const decodedData = JSON.parse(decodeURIComponent(e['data'] as string)) as unknown if (this.app.modal) { - await this.loadCameraStartCaptureForDialogMode(decodedData) + await this.loadCameraStartCaptureForDialogMode(decodedData as CameraDialogInput) } else { - await this.cameraChanged(decodedData) + await this.cameraChanged(decodedData as Camera) } this.pinger.register(this, 30000) @@ -283,16 +293,16 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } @HostListener('window:unload') - async ngOnDestroy() { + ngOnDestroy() { this.pinger.unregister(this) if (this.mode === 'CAPTURE') { - await this.abortCapture() + void this.abortCapture() } } ping() { - this.api.cameraListen(this.camera) + return this.api.cameraListen(this.camera) } private async loadCameraStartCaptureForDialogMode(data?: CameraDialogInput) { @@ -328,9 +338,8 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { this.update() } - if (this.app) { - this.app.subTitle = camera?.name ?? '' - } + this.app.subTitle = camera?.name ?? '' + if (this.mode !== 'CAPTURE') { this.app.subTitle += ` · ${this.mode}` } @@ -345,19 +354,22 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } const makeItem = (selected: boolean, command: () => void, device?: Device) => { - return { + return { icon: device ? 'mdi mdi-connection' : 'mdi mdi-close', label: device?.name ?? 'None', selected, - command: async (event: MenuItemCommandEvent) => { + slideMenu: [], + command: (event: MenuItemCommandEvent) => { command() buildStartTooltip() this.preference.equipmentForDevice(this.camera).set(this.equipment) event.parentItem?.slideMenu?.forEach((item) => (item.selected = item === event.item)) }, - } + } as SlideMenuItem } + const slideMenu = this.snoopDevicesMenuItem.slideMenu + // MOUNT const mounts = await this.api.mounts() @@ -367,10 +379,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { return makeItem(this.equipment.mount?.name === mount?.name, () => (this.equipment.mount = mount), mount) } - this.snoopDevicesMenuItem.slideMenu![0].slideMenu!.push(makeMountItem()) + slideMenu[0]?.slideMenu.push(makeMountItem()) for (const mount of mounts) { - this.snoopDevicesMenuItem.slideMenu![0].slideMenu!.push(makeMountItem(mount)) + slideMenu[0]?.slideMenu.push(makeMountItem(mount)) } // FILTER WHEEL @@ -382,10 +394,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { return makeItem(this.equipment.wheel?.name === wheel?.name, () => (this.equipment.wheel = wheel), wheel) } - this.snoopDevicesMenuItem.slideMenu![1].slideMenu!.push(makeWheelItem()) + slideMenu[1]?.slideMenu.push(makeWheelItem()) for (const wheel of wheels) { - this.snoopDevicesMenuItem.slideMenu![1].slideMenu!.push(makeWheelItem(wheel)) + slideMenu[1]?.slideMenu.push(makeWheelItem(wheel)) } // FOCUSER @@ -397,10 +409,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { return makeItem(this.equipment.focuser?.name === focuser?.name, () => (this.equipment.focuser = focuser), focuser) } - this.snoopDevicesMenuItem.slideMenu![2].slideMenu!.push(makeFocuserItem()) + slideMenu[2]?.slideMenu.push(makeFocuserItem()) for (const focuser of focusers) { - this.snoopDevicesMenuItem.slideMenu![2].slideMenu!.push(makeFocuserItem(focuser)) + slideMenu[2]?.slideMenu.push(makeFocuserItem(focuser)) } // ROTATOR @@ -412,10 +424,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { return makeItem(this.equipment.rotator?.name === rotator?.name, () => (this.equipment.rotator = rotator), rotator) } - this.snoopDevicesMenuItem.slideMenu![3].slideMenu!.push(makeRotatorItem()) + slideMenu[3]?.slideMenu.push(makeRotatorItem()) for (const rotator of rotators) { - this.snoopDevicesMenuItem.slideMenu![3].slideMenu!.push(makeRotatorItem(rotator)) + slideMenu[3]?.slideMenu.push(makeRotatorItem(rotator)) } buildStartTooltip() @@ -430,23 +442,25 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } const makeItem = (name?: string) => { - return { + return { label: name ?? 'None', icon: name ? 'mdi mdi-wrench' : 'mdi mdi-close', selected: this.request.calibrationGroup === name, + slideMenu: [], command: () => { this.request.calibrationGroup = name this.savePreference() - this.loadCalibrationGroups() + void this.loadCalibrationGroups() }, - } + } as SlideMenuItem } - const menu: MenuItem[] = [] + const menu: SlideMenuItem[] = [] menu.push({ icon: 'mdi mdi-wrench', label: 'Open Calibration', + slideMenu: [], command: () => { return this.browserWindow.openCalibration({ bringToFront: true }) }, @@ -464,9 +478,9 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { connect() { if (this.camera.connected) { - this.api.cameraDisconnect(this.camera) + return this.api.cameraDisconnect(this.camera) } else { - this.api.cameraConnect(this.camera) + return this.api.cameraConnect(this.camera) } } @@ -503,21 +517,19 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { applySetpointTemperature() { this.savePreference() - this.api.cameraSetpointTemperature(this.camera, this.setpointTemperature) + return this.api.cameraSetpointTemperature(this.camera, this.setpointTemperature) } toggleCooler() { - this.api.cameraCooler(this.camera, this.camera.cooler) + return this.api.cameraCooler(this.camera, this.camera.cooler) } fullsize() { - if (this.camera) { - this.request.x = this.camera.minX - this.request.y = this.camera.minY - this.request.width = this.camera.maxWidth - this.request.height = this.camera.maxHeight - this.savePreference() - } + this.request.x = this.camera.minX + this.request.y = this.camera.minY + this.request.width = this.camera.maxWidth + this.request.height = this.camera.maxHeight + this.savePreference() } openCameraImage() { @@ -654,12 +666,12 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } apply() { - this.app.close(this.makeCameraStartCapture()) + return this.app.close(this.makeCameraStartCapture()) } private loadPreference() { if (this.mode === 'CAPTURE' && this.camera.name) { - const preference = this.preference.cameraPreference(this.camera).get() + const preference: Partial = this.preference.cameraPreference(this.camera).get() this.request.autoSave = preference.autoSave ?? false this.savePath = preference.savePath ?? '' @@ -682,14 +694,18 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { this.request.offset = preference.offset ?? 0 this.request.frameFormat = preference.frameFormat ?? (this.camera.frameFormats[0] || '') this.request.calibrationGroup = preference.calibrationGroup - - if (preference.dither) { - Object.assign(this.request.dither, preference.dither) - } - - if (preference.liveStacking) { - Object.assign(this.request.liveStacking, preference.liveStacking) - } + this.request.dither.enabled = preference.dither?.enabled ?? false + this.request.dither.amount = preference.dither?.amount ?? 1.5 + this.request.dither.raOnly = preference.dither?.raOnly ?? false + this.request.dither.afterExposures = preference.dither?.afterExposures ?? 1 + this.request.liveStacking.enabled = preference.liveStacking?.enabled ?? false + this.request.liveStacking.type = preference.liveStacking?.type ?? 'SIRIL' + this.request.liveStacking.executablePath = preference.liveStacking?.executablePath ?? '' + this.request.liveStacking.dark = preference.liveStacking?.dark + this.request.liveStacking.flat = preference.liveStacking?.flat + this.request.liveStacking.bias = preference.liveStacking?.bias + this.request.liveStacking.use32Bits = preference.liveStacking?.use32Bits ?? false + this.request.liveStacking.slot = preference.liveStacking?.slot ?? 1 Object.assign(this.equipment, this.preference.equipmentForDevice(this.camera).get()) } diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index aa4c5a78e..e2c9394e1 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -67,17 +67,17 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab private pinger: Pinger, ngZone: NgZone, ) { - if (app) app.title = 'Filter Wheel' + app.title = 'Filter Wheel' - electron.on('WHEEL.UPDATED', (event) => { + electron.on('WHEEL.UPDATED', async (event) => { if (event.device.id === this.wheel.id) { - ngZone.run(() => { + await ngZone.run(async () => { const wasConnected = this.wheel.connected Object.assign(this.wheel, event.device) this.update() if (wasConnected !== event.device.connected) { - electron.autoResizeWindow(1000) + await electron.autoResizeWindow(1000) } }) } @@ -94,7 +94,9 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab electron.on('FOCUSER.UPDATED', (event) => { if (event.device.id === this.focuser?.id) { ngZone.run(() => { - Object.assign(this.focuser!, event.device) + if (this.focuser) { + Object.assign(this.focuser, event.device) + } }) } }) @@ -114,64 +116,64 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } }) - this.subscription = this.filterChangedPublisher.pipe(debounceTime(1500)).subscribe((filter) => { + this.subscription = this.filterChangedPublisher.pipe(debounceTime(1500)).subscribe(async (filter) => { this.savePreference() - this.electron.send('WHEEL.RENAMED', { wheel: this.wheel, filter }) + await this.electron.send('WHEEL.RENAMED', { wheel: this.wheel, filter }) }) hotkeys('enter', (event) => { event.preventDefault() - this.moveToSelectedFilter() + void this.moveToSelectedFilter() }) hotkeys('up', (event) => { event.preventDefault() - this.moveUp() + void this.moveUp() }) hotkeys('down', (event) => { event.preventDefault() - this.moveDown() + void this.moveDown() }) hotkeys('1', (event) => { event.preventDefault() - this.moveToPosition(1) + void this.moveToPosition(1) }) hotkeys('2', (event) => { event.preventDefault() - this.moveToPosition(2) + void this.moveToPosition(2) }) hotkeys('3', (event) => { event.preventDefault() - this.moveToPosition(3) + void this.moveToPosition(3) }) hotkeys('4', (event) => { event.preventDefault() - this.moveToPosition(4) + void this.moveToPosition(4) }) hotkeys('5', (event) => { event.preventDefault() - this.moveToPosition(5) + void this.moveToPosition(5) }) hotkeys('6', (event) => { event.preventDefault() - this.moveToPosition(6) + void this.moveToPosition(6) }) hotkeys('7', (event) => { event.preventDefault() - this.moveToPosition(7) + void this.moveToPosition(7) }) hotkeys('8', (event) => { event.preventDefault() - this.moveToPosition(8) + void this.moveToPosition(8) }) hotkeys('9', (event) => { event.preventDefault() - this.moveToPosition(9) + void this.moveToPosition(9) }) } async ngAfterContentInit() { this.route.queryParams.subscribe(async (e) => { - const decodedData = JSON.parse(decodeURIComponent(e.data)) + const decodedData = JSON.parse(decodeURIComponent(e['data'] as string)) as unknown if (this.app.modal) { const request = decodedData as WheelDialogInput @@ -179,7 +181,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab this.mode = request.mode await this.wheelChanged(request.wheel) } else { - await this.wheelChanged(decodedData) + await this.wheelChanged(decodedData as FilterWheel) } this.pinger.register(this, 30000) @@ -189,7 +191,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab if (this.focusers.length === 1) { this.focuser = this.focusers[0] - this.focuserChanged() + await this.focuserChanged() } } @@ -199,34 +201,32 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab this.subscription?.unsubscribe() } - ping() { - this.api.wheelListen(this.wheel) - if (this.focuser) this.api.focuserListen(this.focuser) + async ping() { + await this.api.wheelListen(this.wheel) + if (this.focuser) await this.api.focuserListen(this.focuser) } async wheelChanged(wheel?: FilterWheel) { if (wheel && wheel.id) { wheel = await this.api.wheel(wheel.id) - this.ping() + await this.ping() Object.assign(this.wheel, wheel) this.loadPreference() this.update() - this.electron.autoResizeWindow() + await this.electron.autoResizeWindow() } - if (this.app) { - this.app.subTitle = wheel?.name ?? '' - } + this.app.subTitle = wheel?.name ?? '' } connect() { if (this.wheel.connected) { - this.api.wheelDisconnect(this.wheel) + return this.api.wheelDisconnect(this.wheel) } else { - this.api.wheelConnect(this.wheel) + return this.api.wheelConnect(this.wheel) } } @@ -236,20 +236,22 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab async moveTo(filter: FilterSlot) { try { - this.moving = true + if (this.currentFilter) { + this.moving = true - const currentFocusOffset = this.focusOffsetForFilter(this.currentFilter!) - const nextFocusOffset = this.focusOffsetForFilter(filter) + const currentFocusOffset = this.focusOffsetForFilter(this.currentFilter) + const nextFocusOffset = this.focusOffsetForFilter(filter) - await this.api.wheelMoveTo(this.wheel, filter.position) + await this.api.wheelMoveTo(this.wheel, filter.position) - const offset = nextFocusOffset - currentFocusOffset + const offset = nextFocusOffset - currentFocusOffset - if (this.focuser && offset !== 0) { - console.info('moving focuser %d steps', offset) + if (this.focuser && offset !== 0) { + console.info('moving focuser %d steps', offset) - if (offset < 0) this.api.focuserMoveIn(this.focuser, -offset) - else this.api.focuserMoveOut(this.focuser, offset) + if (offset < 0) await this.api.focuserMoveIn(this.focuser, -offset) + else await this.api.focuserMoveOut(this.focuser, offset) + } } } catch (e) { console.error(e) @@ -257,51 +259,49 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } } - moveToSelectedFilter() { + async moveToSelectedFilter() { if (this.filter) { - this.moveTo(this.filter) + await this.moveTo(this.filter) } } moveUp() { - this.moveToPosition(this.wheel.position - 1) + return this.moveToPosition(this.wheel.position - 1) } moveDown() { - this.moveToPosition(this.wheel.position + 1) + return this.moveToPosition(this.wheel.position + 1) } - moveToIndex(index: number) { + async moveToIndex(index: number) { if (!this.moving) { - if (index >= 0 && index < this.filters.length) { - this.moveTo(this.filters[index]) - } else if (index < 0) { - this.moveToIndex(this.filters.length + index) - } else { - this.moveToIndex(index % this.filters.length) - } + index = + index >= 0 && index < this.filters.length ? index + : index < 0 ? this.filters.length + index + : index % this.filters.length + + await this.moveTo(this.filters[index]) } } - moveToPosition(position: number) { + async moveToPosition(position: number) { if (!this.moving) { - if (position >= 1 && position <= this.wheel.count) { - for (const filter of this.filters) { - if (filter.position === position) { - this.moveTo(filter) - break - } + position = + position >= 1 && position <= this.wheel.count ? position + : position < 1 ? this.wheel.count + position + : position % this.wheel.count + + for (const filter of this.filters) { + if (filter.position === position) { + await this.moveTo(filter) + break } - } else if (position < 1) { - this.moveToPosition(this.wheel.count + position) - } else { - this.moveToPosition(position % this.wheel.count) } } } shutterToggled(filter: FilterSlot, event: CheckboxChangeEvent) { - this.filters.forEach((e) => (e.dark = event.checked && e === filter)) + this.filters.forEach((e) => (e.dark = !!event.checked && e === filter)) this.filterChangedPublisher.next(structuredClone(filter)) } @@ -311,9 +311,9 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } } - focuserChanged() { + async focuserChanged() { if (this.focuser) { - this.ping() + await this.ping() this.focusOffsetMax = this.focuser.maxPosition this.focusOffsetMin = -this.focusOffsetMax @@ -358,7 +358,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab this.filters = [] return } else if (this.wheel.count !== this.filters.length) { - filters = new Array(this.wheel.count) + filters = new Array(this.wheel.count) } else { filters = this.filters filtersChanged = false @@ -400,7 +400,8 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } this.preference.wheelPreference(this.wheel).set(preference) - this.api.wheelSync(this.wheel, preference.names!) + + // TODO: this.api.wheelSync(this.wheel, preference.names!) } } @@ -412,7 +413,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } apply() { - this.app.close(this.makeCameraStartCapture()) + return this.app.close(this.makeCameraStartCapture()) } static async showAsDialog(window: BrowserWindowService, mode: WheelDialogMode, wheel: FilterWheel, request: CameraStartCapture) { diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.ts b/desktop/src/app/flat-wizard/flat-wizard.component.ts index 38f0021ee..4135c6721 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.ts +++ b/desktop/src/app/flat-wizard/flat-wizard.component.ts @@ -65,29 +65,29 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { app.title = 'Flat Wizard' electron.on('FLAT_WIZARD.ELAPSED', (event) => { - ngZone.run(() => { - if (event.state === 'EXPOSURING' && event.capture && event.capture.camera?.id === this.camera?.id) { + return ngZone.run(async () => { + if (event.state === 'EXPOSURING' && event.capture && event.capture.camera.id === this.camera.id) { this.running = true - this.cameraExposure.handleCameraCaptureEvent(event.capture!, true) + this.cameraExposure.handleCameraCaptureEvent(event.capture, true) } else if (event.state === 'CAPTURED') { this.running = false this.savedPath = event.savedPath - this.electron.autoResizeWindow() + await this.electron.autoResizeWindow() this.prime.message(`Flat frame captured`) } else if (event.state === 'FAILED') { this.running = false this.savedPath = undefined - this.electron.autoResizeWindow() + await this.electron.autoResizeWindow() this.prime.message(`Failed to find an optimal exposure time from given parameters`, 'error') } }) }) - electron.on('CAMERA.UPDATED', (event) => { + electron.on('CAMERA.UPDATED', async (event) => { if (event.device.id === this.camera.id) { - ngZone.run(() => { + await ngZone.run(() => { Object.assign(this.camera, event.device) - this.cameraChanged() + return this.cameraChanged() }) } }) @@ -113,11 +113,11 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { }) }) - electron.on('WHEEL.UPDATED', (event) => { + electron.on('WHEEL.UPDATED', async (event) => { if (event.device.id === this.wheel.id) { - ngZone.run(() => { + await ngZone.run(() => { Object.assign(this.wheel, event.device) - this.wheelChanged() + return this.wheelChanged() }) } }) @@ -154,12 +154,12 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { @HostListener('window:unload') ngOnDestroy() { this.pinger.unregister(this) - this.stop() + void this.stop() } - ping() { - if (this.camera.id) this.api.cameraListen(this.camera) - if (this.wheel.id) this.api.wheelListen(this.wheel) + async ping() { + if (this.camera.id) await this.api.cameraListen(this.camera) + if (this.wheel.id) await this.api.wheelListen(this.wheel) } async showCameraDialog() { @@ -168,9 +168,9 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { } } - cameraChanged() { + async cameraChanged() { if (this.camera.id) { - this.ping() + await this.ping() const cameraPreference = this.preference.cameraPreference(this.camera).get() this.request.capture = this.preference.cameraStartCaptureForFlatWizard(this.camera).get(cameraPreference) @@ -184,9 +184,9 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { } } - wheelChanged() { + async wheelChanged() { if (this.wheel.id) { - this.ping() + await this.ping() let filters: FilterSlot[] = [] let filtersChanged = true @@ -195,7 +195,7 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { this.filters = [] return } else if (this.wheel.count !== this.filters.length) { - filters = new Array(this.wheel.count) + filters = new Array(this.wheel.count) } else { filters = this.filters filtersChanged = false @@ -223,11 +223,11 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { await this.browserWindow.openCameraImage(this.camera, 'FLAT_WIZARD') // TODO: Iniciar para cada filtro selecionado. Usar os eventos para percorrer (se houver filtro). // Se Falhar, interrompe todo o fluxo. - this.api.flatWizardStart(this.camera, this.request) + await this.api.flatWizardStart(this.camera, this.request) } stop() { - this.api.flatWizardStop(this.camera) + return this.api.flatWizardStop(this.camera) } savePreference() { diff --git a/desktop/src/app/focuser/focuser.component.ts b/desktop/src/app/focuser/focuser.component.ts index 817235b04..d3075681f 100644 --- a/desktop/src/app/focuser/focuser.component.ts +++ b/desktop/src/app/focuser/focuser.component.ts @@ -50,35 +50,35 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { hotkeys('left', (event) => { event.preventDefault() - this.moveIn() + void this.moveIn() }) hotkeys('ctrl+left', (event) => { event.preventDefault() - this.moveIn(2) + void this.moveIn(2) }) hotkeys('alt+left', (event) => { event.preventDefault() - this.moveIn(0.5) + void this.moveIn(0.5) }) hotkeys('right', (event) => { event.preventDefault() - this.moveOut() + void this.moveOut() }) hotkeys('ctrl+right', (event) => { event.preventDefault() - this.moveOut(2) + void this.moveOut(2) }) hotkeys('alt+right', (event) => { event.preventDefault() - this.moveOut(0.5) + void this.moveOut(0.5) }) hotkeys('space', (event) => { event.preventDefault() - this.abort() + void this.abort() }) hotkeys('enter', (event) => { event.preventDefault() - this.moveTo() + void this.moveTo() }) hotkeys('up', (event) => { event.preventDefault() @@ -98,9 +98,9 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { }) } - async ngAfterViewInit() { + ngAfterViewInit() { this.route.queryParams.subscribe(async (e) => { - const focuser = JSON.parse(decodeURIComponent(e.data)) as Focuser + const focuser = JSON.parse(decodeURIComponent(e['data'] as string)) as Focuser await this.focuserChanged(focuser) this.pinger.register(this, 30000) }) @@ -109,11 +109,11 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { @HostListener('window:unload') ngOnDestroy() { this.pinger.unregister(this) - this.abort() + void this.abort() } ping() { - this.api.focuserListen(this.focuser) + return this.api.focuserListen(this.focuser) } async focuserChanged(focuser?: Focuser) { @@ -125,16 +125,14 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { this.update() } - if (this.app) { - this.app.subTitle = focuser?.name ?? '' - } + this.app.subTitle = focuser?.name ?? '' } connect() { if (this.focuser.connected) { - this.api.focuserDisconnect(this.focuser) + return this.api.focuserDisconnect(this.focuser) } else { - this.api.focuserConnect(this.focuser) + return this.api.focuserConnect(this.focuser) } } @@ -170,7 +168,7 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { } abort() { - this.api.focuserAbort(this.focuser) + return this.api.focuserAbort(this.focuser) } private update() { diff --git a/desktop/src/app/framing/framing.component.ts b/desktop/src/app/framing/framing.component.ts index 021614190..409eb81c4 100644 --- a/desktop/src/app/framing/framing.component.ts +++ b/desktop/src/app/framing/framing.component.ts @@ -63,7 +63,7 @@ export class FramingComponent implements AfterViewInit, OnDestroy { app.title = 'Framing' electron.on('DATA.CHANGED', (event: FramingData) => { - ngZone.run(() => this.frameFromData(event)) + return ngZone.run(() => this.frameFromData(event)) }) this.loadPreference() @@ -71,40 +71,32 @@ export class FramingComponent implements AfterViewInit, OnDestroy { async ngAfterViewInit() { this.hipsSurveys = await this.api.hipsSurveys() + this.hipsSurvey = this.hipsSurveys.find((e) => e.id === this.hipsSurvey?.id) ?? this.hipsSurveys[0] - if (this.hipsSurvey) { - this.hipsSurvey = this.hipsSurveys.find((e) => e.id === this.hipsSurvey!.id) - } - - if (!this.hipsSurvey) { - this.hipsSurvey = this.hipsSurveys[0] - } - - this.electron.autoResizeWindow() + await this.electron.autoResizeWindow() this.route.queryParams.subscribe((e) => { - const data = JSON.parse(decodeURIComponent(e.data)) as FramingData - this.frameFromData(data) + const data = JSON.parse(decodeURIComponent(e['data'] as string)) as FramingData + return this.frameFromData(data) }) } @HostListener('window:unload') ngOnDestroy() { - this.closeFrameImage() - this.electron.closeWindow({ id: this.frameId }) + void this.closeFrameImage() + void this.electron.closeWindow({ id: this.frameId }) } - private frameFromData(data: FramingData) { - console.info(data) - this.rightAscension = data.rightAscension ?? this.rightAscension - this.declination = data.declination ?? this.declination + private async frameFromData(data: FramingData) { + this.rightAscension = data.rightAscension || this.rightAscension + this.declination = data.declination || this.declination this.width = data.width || this.width this.height = data.height || this.height this.fov = data.fov || this.fov if (data.rotation === 0 || data.rotation) this.rotation = data.rotation if (data.rightAscension && data.declination) { - this.frame() + await this.frame() } } @@ -116,17 +108,17 @@ export class FramingComponent implements AfterViewInit, OnDestroy { this.loading = true try { - const path = await this.api.frame(this.rightAscension, this.declination, this.width, this.height, this.fov, this.rotation, this.hipsSurvey!) + const path = await this.api.frame(this.rightAscension, this.declination, this.width, this.height, this.fov, this.rotation, this.hipsSurvey) const title = `Framing ・ ${this.rightAscension} ・ ${this.declination}` this.framePath = path this.frameId = await this.browserWindow.openImage({ path, source: 'FRAMING', id: 'framing', title }) this.savePreference() - } catch (e: any) { + } catch (e) { console.error(e) - this.prime.message(e.message || 'Failed to retrieve the image', 'error') + this.prime.message('Failed to retrieve the image', 'error') } finally { this.loading = false } diff --git a/desktop/src/app/guider/guider.component.ts b/desktop/src/app/guider/guider.component.ts index 827ea28dd..dea7bf050 100644 --- a/desktop/src/app/guider/guider.component.ts +++ b/desktop/src/app/guider/guider.component.ts @@ -120,6 +120,7 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { return '' }, label: (context) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition const barType = context.dataset.type === 'bar' const raType = context.datasetIndex === 0 || context.datasetIndex === 2 const scale = barType ? this.phdDurationScale : 1.0 @@ -206,6 +207,8 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { return a.toFixed(0) } } + + return undefined }, }, grid: { @@ -229,8 +232,10 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { electron.on('GUIDE_OUTPUT.UPDATED', (event) => { if (event.device.id === this.guideOutput?.id) { ngZone.run(() => { - Object.assign(this.guideOutput!, event.device) - this.update() + if (this.guideOutput) { + Object.assign(this.guideOutput, event.device) + this.update() + } }) } }) @@ -295,9 +300,9 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { const settle = await this.api.getGuidingSettle() - this.settleAmount = settle.amount ?? 1.5 - this.settleTime = settle.time ?? 10 - this.settleTimeout = settle.timeout ?? 30 + this.settleAmount = settle.amount + this.settleTime = settle.time + this.settleTimeout = settle.timeout this.guideOutputs = await this.api.guideOutputs() @@ -314,8 +319,8 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { this.pinger.unregister(this) } - ping() { - if (this.guideOutput) this.api.guideOutputListen(this.guideOutput) + async ping() { + if (this.guideOutput) await this.api.guideOutputListen(this.guideOutput) } private processGuiderStatus(event: Guider) { @@ -343,7 +348,7 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { } const startId = this.phdGuideHistory[0].id - const guideSteps = this.phdGuideHistory.filter((e) => e.guideStep) + const guideSteps = this.phdGuideHistory.filter((e) => e.guideStep !== undefined) const scale = this.yAxisUnit === 'ARCSEC' ? this.pixelScale : 1.0 let maxDuration = 0 @@ -370,12 +375,12 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { this.chartData.datasets[2].data = this.phdGuideHistory.map((e) => (e.guideStep?.raDuration ?? 0) / durationScale(e.guideStep?.raDirection)) this.chartData.datasets[3].data = this.phdGuideHistory.map((e) => (e.guideStep?.decDuration ?? 0) / durationScale(e.guideStep?.decDirection)) - this.chart?.refresh() + this.chart.refresh() } async guideOutputChanged() { if (this.guideOutput?.id) { - this.ping() + await this.ping() const guideOutput = await this.api.guideOutput(this.guideOutput.id) Object.assign(this.guideOutput, guideOutput) @@ -384,37 +389,41 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { } } - guidePulseStart(...directions: GuideDirection[]) { - for (const direction of directions) { - switch (direction) { - case 'NORTH': - this.api.guideOutputPulse(this.guideOutput!, direction, this.guideNorthDuration * 1000) - break - case 'SOUTH': - this.api.guideOutputPulse(this.guideOutput!, direction, this.guideSouthDuration * 1000) - break - case 'WEST': - this.api.guideOutputPulse(this.guideOutput!, direction, this.guideWestDuration * 1000) - break - case 'EAST': - this.api.guideOutputPulse(this.guideOutput!, direction, this.guideEastDuration * 1000) - break + async guidePulseStart(...directions: GuideDirection[]) { + if (this.guideOutput) { + for (const direction of directions) { + switch (direction) { + case 'NORTH': + await this.api.guideOutputPulse(this.guideOutput, direction, this.guideNorthDuration * 1000) + break + case 'SOUTH': + await this.api.guideOutputPulse(this.guideOutput, direction, this.guideSouthDuration * 1000) + break + case 'WEST': + await this.api.guideOutputPulse(this.guideOutput, direction, this.guideWestDuration * 1000) + break + case 'EAST': + await this.api.guideOutputPulse(this.guideOutput, direction, this.guideEastDuration * 1000) + break + } } } } - guidePulseStop() { - this.api.guideOutputPulse(this.guideOutput!, 'NORTH', 0) - this.api.guideOutputPulse(this.guideOutput!, 'SOUTH', 0) - this.api.guideOutputPulse(this.guideOutput!, 'WEST', 0) - this.api.guideOutputPulse(this.guideOutput!, 'EAST', 0) + async guidePulseStop() { + if (this.guideOutput) { + await this.api.guideOutputPulse(this.guideOutput, 'NORTH', 0) + await this.api.guideOutputPulse(this.guideOutput, 'SOUTH', 0) + await this.api.guideOutputPulse(this.guideOutput, 'WEST', 0) + await this.api.guideOutputPulse(this.guideOutput, 'EAST', 0) + } } guidingConnect() { if (this.connected) { - this.api.guidingDisconnect() + return this.api.guidingDisconnect() } else { - this.api.guidingConnect(this.host, this.port) + return this.api.guidingConnect(this.host, this.port) } } @@ -433,11 +442,11 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { guidingClearHistory() { this.phdGuideHistory.length = 0 - this.api.guidingClearHistory() + return this.api.guidingClearHistory() } guidingStop() { - this.api.guidingStop() + return this.api.guidingStop() } private update() { diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index bd05ba531..a2c4ca8c5 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -1,8 +1,8 @@ -import { AfterContentInit, Component, HostListener, NgZone, OnDestroy, ViewChild } from '@angular/core' +import { AfterContentInit, Component, NgZone, ViewChild } from '@angular/core' import { dirname } from 'path' import { DeviceChooserComponent } from '../../shared/components/device-chooser/device-chooser.component' import { DeviceConnectionCommandEvent, DeviceListMenuComponent } from '../../shared/components/device-list-menu/device-list-menu.component' -import { MenuItem } from '../../shared/components/menu-item/menu-item.component' +import { MenuItem, SlideMenuItem } from '../../shared/components/menu-item/menu-item.component' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' @@ -25,12 +25,16 @@ type MappedDevice = { ROTATOR: Rotator } +function scrollPageOf(element: Element) { + return parseInt(element.getAttribute('scroll-page') || '0') +} + @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], }) -export class HomeComponent implements AfterContentInit, OnDestroy { +export class HomeComponent implements AfterContentInit { @ViewChild('deviceMenu') private readonly deviceMenu!: DeviceListMenuComponent @@ -119,12 +123,13 @@ export class HomeComponent implements AfterContentInit, OnDestroy { readonly deviceModel: MenuItem[] = [] - readonly imageModel: MenuItem[] = [ + readonly imageModel: SlideMenuItem[] = [ { icon: 'mdi mdi-image-plus', label: 'Open new image', + slideMenu: [], command: () => { - this.openImage(true) + return this.openImage(true) }, }, ] @@ -245,10 +250,10 @@ export class HomeComponent implements AfterContentInit, OnDestroy { }, ) - electron.on('CONNECTION.CLOSED', (event) => { + electron.on('CONNECTION.CLOSED', async (event) => { if (this.connection?.id === event.id) { - ngZone.run(() => { - this.updateConnection() + await ngZone.run(() => { + return this.updateConnection() }) } }) @@ -273,9 +278,6 @@ export class HomeComponent implements AfterContentInit, OnDestroy { } } - @HostListener('window:unload') - ngOnDestroy() {} - addConnection() { this.newConnection = [structuredClone(EMPTY_CONNECTION_DETAILS), undefined] this.showConnectionDialog = true @@ -339,13 +341,13 @@ export class HomeComponent implements AfterContentInit, OnDestroy { async disconnect() { try { - if (this.connection && this.connection.connected) { - await this.api.disconnect(this.connection.id!) + if (this.connection?.id && this.connection.connected) { + await this.api.disconnect(this.connection.id) } } catch (e) { console.error(e) } finally { - this.updateConnection() + await this.updateConnection() } } @@ -353,12 +355,12 @@ export class HomeComponent implements AfterContentInit, OnDestroy { return this.cameras.find((e) => e.id === id) || this.mounts.find((e) => e.id === id) || this.wheels.find((e) => e.id === id) || this.focusers.find((e) => e.id === id) || this.rotators.find((e) => e.id === id) } - protected async deviceConnected(event: DeviceConnectionCommandEvent) { - DeviceChooserComponent.handleConnectDevice(this.api, event.device, event.item) + protected deviceConnected(event: DeviceConnectionCommandEvent) { + return DeviceChooserComponent.handleConnectDevice(this.api, event.device, event.item) } - protected async deviceDisconnected(event: DeviceConnectionCommandEvent) { - DeviceChooserComponent.handleDisconnectDevice(this.api, event.device, event.item) + protected deviceDisconnected(event: DeviceConnectionCommandEvent) { + return DeviceChooserComponent.handleDisconnectDevice(this.api, event.device, event.item) } private async openDevice(type: K) { @@ -378,26 +380,26 @@ export class HomeComponent implements AfterContentInit, OnDestroy { const device = await this.deviceMenu.show(devices) if (device && device !== 'NONE') { - this.openDeviceWindow(type, device as any) + await this.openDeviceWindow(type, device as never) } } - private openDeviceWindow(type: K, device: MappedDevice[K]) { + private async openDeviceWindow(type: K, device: MappedDevice[K]) { switch (type) { case 'MOUNT': - this.browserWindow.openMount(device as Mount, { bringToFront: true }) + await this.browserWindow.openMount(device as Mount, { bringToFront: true }) break case 'CAMERA': - this.browserWindow.openCamera(device as Camera, { bringToFront: true }) + await this.browserWindow.openCamera(device as Camera, { bringToFront: true }) break case 'FOCUSER': - this.browserWindow.openFocuser(device as Focuser, { bringToFront: true }) + await this.browserWindow.openFocuser(device as Focuser, { bringToFront: true }) break case 'WHEEL': - this.browserWindow.openWheel(device as FilterWheel, { bringToFront: true }) + await this.browserWindow.openWheel(device as FilterWheel, { bringToFront: true }) break case 'ROTATOR': - this.browserWindow.openRotator(device as Rotator, { bringToFront: true }) + await this.browserWindow.openRotator(device as Rotator, { bringToFront: true }) break } } @@ -410,61 +412,61 @@ export class HomeComponent implements AfterContentInit, OnDestroy { if (path) { preference.imagePath = dirname(path) this.preference.homePreference.set(preference) - this.browserWindow.openImage({ path, source: 'PATH' }) + await this.browserWindow.openImage({ path, source: 'PATH' }) } } else { const camera = await this.imageMenu.show(this.cameras) if (camera && camera !== 'NONE') { - this.browserWindow.openCameraImage(camera) + await this.browserWindow.openCameraImage(camera) } } } - open(type: HomeWindowType) { + async open(type: HomeWindowType) { switch (type) { case 'MOUNT': case 'CAMERA': case 'FOCUSER': case 'WHEEL': case 'ROTATOR': - this.openDevice(type) + await this.openDevice(type) break case 'GUIDER': - this.browserWindow.openGuider({ bringToFront: true }) + await this.browserWindow.openGuider({ bringToFront: true }) break case 'SKY_ATLAS': - this.browserWindow.openSkyAtlas(undefined, { bringToFront: true }) + await this.browserWindow.openSkyAtlas(undefined, { bringToFront: true }) break case 'FRAMING': - this.browserWindow.openFraming(undefined, { bringToFront: true }) + await this.browserWindow.openFraming(undefined, { bringToFront: true }) break case 'ALIGNMENT': - this.browserWindow.openAlignment({ bringToFront: true }) + await this.browserWindow.openAlignment({ bringToFront: true }) break case 'SEQUENCER': - this.browserWindow.openSequencer({ bringToFront: true }) + await this.browserWindow.openSequencer({ bringToFront: true }) break case 'AUTO_FOCUS': - this.browserWindow.openAutoFocus({ bringToFront: true }) + await this.browserWindow.openAutoFocus({ bringToFront: true }) break case 'FLAT_WIZARD': - this.browserWindow.openFlatWizard({ bringToFront: true }) + await this.browserWindow.openFlatWizard({ bringToFront: true }) break case 'INDI': - this.browserWindow.openINDI(undefined, { bringToFront: true }) + await this.browserWindow.openINDI(undefined, { bringToFront: true }) break case 'IMAGE': - this.openImage() + await this.openImage() break case 'SETTINGS': - this.browserWindow.openSettings() + await this.browserWindow.openSettings() break case 'CALCULATOR': - this.browserWindow.openCalculator() + await this.browserWindow.openCalculator() break case 'ABOUT': - this.browserWindow.openAbout() + await this.browserWindow.openAbout() break } } @@ -472,7 +474,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { private async updateConnection() { if (this.connection && this.connection.id) { try { - const status = await this.api.connectionStatus(this.connection.id!) + const status = await this.api.connectionStatus(this.connection.id) if (status && !this.connection.connected) { this.connection.connectedAt = Date.now() @@ -515,10 +517,6 @@ export class HomeComponent implements AfterContentInit, OnDestroy { } } - private scrollPageOf(element: Element) { - return parseInt(element.getAttribute('scroll-page') || '0') - } - scrolled(event: Event) { function isVisible(element: Element) { const bound = element.getBoundingClientRect() @@ -533,7 +531,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { const child = scrollChidren[i] if (isVisible(child)) { - page = Math.max(page, this.scrollPageOf(child)) + page = Math.max(page, scrollPageOf(child)) } } @@ -552,7 +550,7 @@ export class HomeComponent implements AfterContentInit, OnDestroy { for (let i = 0; i < scrollChidren.length; i++) { const child = scrollChidren[i] - if (this.scrollPageOf(child) === page) { + if (scrollPageOf(child) === page) { child.scrollIntoView({ behavior: 'smooth' }) break } diff --git a/desktop/src/app/image/image.component.html b/desktop/src/app/image/image.component.html index a093b460d..7c2ef6d5c 100644 --- a/desktop/src/app/image/image.component.html +++ b/desktop/src/app/image/image.component.html @@ -214,8 +214,8 @@
diff --git a/desktop/src/app/image/image.component.ts b/desktop/src/app/image/image.component.ts index f0921e2b0..fb08686d8 100644 --- a/desktop/src/app/image/image.component.ts +++ b/desktop/src/app/image/image.component.ts @@ -1,6 +1,6 @@ import { AfterViewInit, Component, ElementRef, HostListener, NgZone, OnDestroy, ViewChild, computed, model } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { Interactable } from '@interactjs/types/index' +import { DragEvent, Interactable, ResizeEvent } from '@interactjs/types/index' import hotkeys from 'hotkeys-js' import interact from 'interactjs' import createPanZoom, { PanZoom } from 'panzoom' @@ -67,7 +67,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { private readonly deviceMenu!: DeviceListMenuComponent @ViewChild('histogram') - private readonly histogram!: HistogramComponent + private readonly histogram?: HistogramComponent @ViewChild('detectedStarCanvas') private readonly detectedStarCanvas!: ElementRef @@ -260,7 +260,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { icon: 'mdi mdi-auto-fix', selected: true, command: () => { - this.toggleStretch() + return this.toggleStretch() }, } @@ -280,7 +280,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { command: () => { this.transformation.mirrorHorizontal = !this.transformation.mirrorHorizontal this.horizontalMirrorMenuItem.selected = this.transformation.mirrorHorizontal - this.loadImage() + void this.loadImage() }, } @@ -291,7 +291,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { command: () => { this.transformation.mirrorVertical = !this.transformation.mirrorVertical this.verticalMirrorMenuItem.selected = this.transformation.mirrorVertical - this.loadImage() + void this.loadImage() }, } @@ -300,7 +300,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { icon: 'mdi mdi-invert-colors', selected: false, command: () => { - this.invertImage() + return this.invertImage() }, } @@ -315,7 +315,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { label: 'Statistics', command: () => { this.showStatisticsDialog = true - this.computeHistogram() + return this.computeHistogram() }, } @@ -332,9 +332,13 @@ export class ImageComponent implements AfterViewInit, OnDestroy { icon: 'mdi mdi-telescope', disabled: true, command: () => { - this.executeMount((mount) => { - this.api.pointMountHere(mount, this.imagePath!, this.imageMouseX, this.imageMouseY) - }) + const path = this.imagePath + + if (path) { + void this.executeMount((mount) => { + return this.api.pointMountHere(mount, path, this.imageMouseX, this.imageMouseY) + }) + } }, } @@ -346,7 +350,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { const coordinate = this.mouseCoordinateInterpolation?.interpolate(this.imageMouseX, this.imageMouseY, false, false) if (coordinate) { - this.frame(coordinate) + void this.frame(coordinate) } }, } @@ -371,7 +375,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { }, check: (event) => { event.originalEvent?.stopImmediatePropagation() - this.annotation.visible = event.checked + this.annotation.visible = !!event.checked }, } @@ -385,7 +389,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.starDetection.showDialog = true }, check: (event) => { - this.starDetection.visible = event.checked + this.starDetection.visible = !!event.checked event.originalEvent?.stopImmediatePropagation() }, } @@ -399,12 +403,18 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.roiInteractable.unset() this.roiInteractable = undefined } else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call this.roiInteractable = interact(this.roi.nativeElement) .origin({ x: 0, y: 0 }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access .resizable({ edges: { left: true, right: true, bottom: true, top: true }, inertia: true, - listeners: { move: (event: any) => this.roiResizableMove(event) }, + listeners: { + move: (event: ResizeEvent) => { + this.roiResizableMove(event) + }, + }, modifiers: [ interact.modifiers.restrictEdges({ outer: 'parent', @@ -414,8 +424,13 @@ export class ImageComponent implements AfterViewInit, OnDestroy { }), ], }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access .draggable({ - listeners: { move: (event: any) => this.roiDraggableMove(event) }, + listeners: { + move: (event: DragEvent) => { + this.roiDraggableMove(event) + }, + }, inertia: true, modifiers: [ interact.modifiers.restrictRect({ @@ -496,11 +511,15 @@ export class ImageComponent implements AfterViewInit, OnDestroy { splitButtonMenu: [ { label: 'RAW', - command: () => this.changeLiveStackingMode('RAW'), + command: () => { + return this.changeLiveStackingMode('RAW') + }, }, { label: 'STACKED', - command: () => this.changeLiveStackingMode('STACKED'), + command: () => { + return this.changeLiveStackingMode('STACKED') + }, }, ], } @@ -528,25 +547,33 @@ export class ImageComponent implements AfterViewInit, OnDestroy { app.topMenu.push({ icon: 'mdi mdi-minus', label: 'Zoom Out', - command: () => this.zoomOut(), + command: () => { + this.zoomOut() + }, }) app.topMenu.push({ icon: 'mdi mdi-plus', label: 'Zoom In', - command: () => this.zoomIn(), + command: () => { + this.zoomIn() + }, }) app.topMenu.push({ icon: 'mdi mdi-numeric-0', label: 'Reset Zoom', - command: () => this.resetZoom(false), + command: () => { + this.resetZoom(false) + }, }) app.topMenu.push({ icon: 'mdi mdi-fit-to-screen', label: 'Fit to Screen', - command: () => this.resetZoom(true), + command: () => { + this.resetZoom(true) + }, }) this.stretchShadow.subscribe((value) => { @@ -563,13 +590,13 @@ export class ImageComponent implements AfterViewInit, OnDestroy { electron.on('CAMERA.CAPTURE_ELAPSED', async (event) => { if (event.state === 'EXPOSURE_FINISHED' && event.camera.id === this.imageData.camera?.id) { - ngZone.run(() => { + await ngZone.run(async () => { if (this.liveStackingMode === 'NONE') { if (event.liveStackedPath) { - this.changeLiveStackingMode('STACKED') + await this.changeLiveStackingMode('STACKED') } } else if (!event.liveStackedPath) { - this.changeLiveStackingMode('NONE') + await this.changeLiveStackingMode('NONE') } this.imageData.path = event.savedPath @@ -578,30 +605,31 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.imageData.exposureCount = event.exposureCount this.clearOverlay() - this.loadImage(true) + + await this.loadImage(true) }) } }) - electron.on('DATA.CHANGED', async (event: OpenImage) => { - ngZone.run(() => { - this.loadImageFromOpenImage(event) + electron.on('DATA.CHANGED', (event: OpenImage) => { + return ngZone.run(() => { + return this.loadImageFromOpenImage(event) }) }) - electron.on('CALIBRATION.CHANGED', () => { - ngZone.run(() => { - this.loadCalibrationGroups() + electron.on('CALIBRATION.CHANGED', async () => { + return ngZone.run(() => { + return this.loadCalibrationGroups() }) }) hotkeys('ctrl+a', (event) => { event.preventDefault() - this.toggleStretch() + void this.toggleStretch() }) hotkeys('ctrl+i', (event) => { event.preventDefault() - this.invertImage() + void this.invertImage() }) hotkeys('ctrl+x', (event) => { event.preventDefault() @@ -626,13 +654,13 @@ export class ImageComponent implements AfterViewInit, OnDestroy { hotkeys('f12', (event) => { if (this.app.showTopBar) { event.preventDefault() - this.enterFullscreen() + void this.enterFullscreen() } }) hotkeys('escape', (event) => { if (!this.app.showTopBar) { event.preventDefault() - this.exitFullscreen() + void this.exitFullscreen() } }) @@ -643,25 +671,29 @@ export class ImageComponent implements AfterViewInit, OnDestroy { await this.loadCalibrationGroups() this.route.queryParams.subscribe((e) => { - const data = JSON.parse(decodeURIComponent(e.data)) as OpenImage - this.loadImageFromOpenImage(data) + const data = JSON.parse(decodeURIComponent(e['data'] as string)) as OpenImage + return this.loadImageFromOpenImage(data) }) } @HostListener('window:unload') - ngOnDestroy() { - this.closeImage(true) + async ngOnDestroy() { + await this.closeImage(true) this.roiInteractable?.unset() } private markCalibrationGroupItem(name?: string) { - this.calibrationMenuItem.items![2].disabled = !this.imageInfo?.camera?.id - this.calibrationMenuItem.items![2].selected = this.calibrationViaCamera + const items = this.calibrationMenuItem.items - for (let i = 3; i < this.calibrationMenuItem.items!.length; i++) { - const item = this.calibrationMenuItem.items![i] - item.selected = !this.calibrationViaCamera && item.data === name + if (items) { + items[2].disabled = !this.imageInfo?.camera?.id + items[2].selected = this.calibrationViaCamera + + for (let i = 3; i < items.length; i++) { + const item = items[i] + item.selected = !this.calibrationViaCamera && item.data === name + } } } @@ -685,11 +717,11 @@ export class ImageComponent implements AfterViewInit, OnDestroy { icon, selected: !this.calibrationViaCamera && this.transformation.calibrationGroup === name, data: name, - command: async () => { + command: () => { this.calibrationViaCamera = false this.transformation.calibrationGroup = name this.markCalibrationGroupItem(name) - await this.loadImage() + void this.loadImage() }, } } @@ -699,7 +731,9 @@ export class ImageComponent implements AfterViewInit, OnDestroy { menu.push({ label: 'Open', icon: 'mdi mdi-wrench', - command: () => this.browserWindow.openCalibration(), + command: () => { + return this.browserWindow.openCalibration() + }, }) menu.push(SEPARATOR_MENU_ITEM) @@ -710,11 +744,11 @@ export class ImageComponent implements AfterViewInit, OnDestroy { selected: this.calibrationViaCamera, disabled: !this.imageInfo?.camera?.id, data: 0, - command: async () => { + command: () => { if (this.imageInfo?.camera?.id) { this.calibrationViaCamera = !this.calibrationViaCamera this.markCalibrationGroupItem(this.transformation.calibrationGroup) - await this.loadImage() + void this.loadImage() } }, }) @@ -730,7 +764,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.menu.cd.markForCheck() if (reloadImage) { - this.loadImage() + await this.loadImage() } } @@ -743,7 +777,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } } - private changeLiveStackingMode(mode: LiveStackingMode) { + private async changeLiveStackingMode(mode: LiveStackingMode) { this.liveStackingMode = mode if (this.liveStackingMode !== 'NONE') { @@ -753,67 +787,71 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.liveStackingMenuItem.visible = this.liveStackingMode !== 'NONE' this.liveStackingMenuItem.label = mode - this.loadImage(true) + await this.loadImage(true) } - private roiResizableMove(event: any) { + private roiResizableMove(event: ResizeEvent) { const target = event.target - const { scale } = this.panZoom!.getTransform() + if (this.panZoom) { + const { scale } = this.panZoom.getTransform() - let x = parseFloat(target.getAttribute('data-x')) || 0 - let y = parseFloat(target.getAttribute('data-y')) || 0 + let x = parseFloat(target.getAttribute('data-x') ?? '0') || 0 + let y = parseFloat(target.getAttribute('data-y') ?? '0') || 0 - target.style.width = event.rect.width / scale + 'px' - target.style.height = event.rect.height / scale + 'px' + target.style.width = `${event.rect.width / scale}px` + target.style.height = `${event.rect.height / scale}px` - x += event.deltaRect.left / scale - y += event.deltaRect.top / scale + x += event.deltaRect!.left / scale + y += event.deltaRect!.top / scale - target.style.transform = 'translate(' + x + 'px,' + y + 'px)' + target.style.transform = `translate(${x}px, ${y}px)` - target.setAttribute('data-x', x) - target.setAttribute('data-y', y) + target.setAttribute('data-x', `${x}`) + target.setAttribute('data-y', `${y}`) - this.ngZone.run(() => { - this.imageROI.x = Math.round(x) - this.imageROI.y = Math.round(y) - this.imageROI.width = Math.round(event.rect.width / scale) - this.imageROI.height = Math.round(event.rect.height / scale) - }) + this.ngZone.run(() => { + this.imageROI.x = Math.round(x) + this.imageROI.y = Math.round(y) + this.imageROI.width = Math.round(event.rect.width / scale) + this.imageROI.height = Math.round(event.rect.height / scale) + }) + } } - private roiDraggableMove(event: any) { + private roiDraggableMove(event: DragEvent) { const target = event.target - const { scale } = this.panZoom!.getTransform() + if (this.panZoom) { + const { scale } = this.panZoom.getTransform() - const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx / scale - const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy / scale + const x = (parseFloat(target.getAttribute('data-x') ?? '0') || 0) + event.dx / scale + const y = (parseFloat(target.getAttribute('data-y') ?? '0') || 0) + event.dy / scale - target.style.transform = 'translate(' + x + 'px, ' + y + 'px)' + target.style.transform = `translate(${x}px, ${y}px)` - target.setAttribute('data-x', x) - target.setAttribute('data-y', y) + target.setAttribute('data-x', `${x}`) + target.setAttribute('data-y', `${y}`) - this.ngZone.run(() => { - this.imageROI.x = Math.round(x) - this.imageROI.y = Math.round(y) - }) + this.ngZone.run(() => { + this.imageROI.x = Math.round(x) + this.imageROI.y = Math.round(y) + }) + } } roiForCamera() { - this.executeCamera((camera) => { + return this.executeCamera((camera) => { const x = camera.x + this.imageROI.x const y = camera.y + this.imageROI.y const width = camera.binX * this.imageROI.width const height = camera.binY * this.imageROI.height - this.electron.send('ROI.SELECTED', { camera, x, y, width, height }) + return this.electron.send('ROI.SELECTED', { camera, x, y, width, height }) }, false) } - private loadImageFromOpenImage(data: OpenImage) { + private async loadImageFromOpenImage(data: OpenImage) { console.info('loading image from data: %s', data) Object.assign(this.imageData, data) @@ -828,14 +866,15 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.disableAutoStretch() if (this.transformation.stretch.auto) { - this.resetStretch(false) + await this.resetStretch(false) } } else if (data.source === 'FLAT_WIZARD') { this.disableCalibration(false) } this.clearOverlay() - this.loadImage(true) + + return this.loadImage(true) } private clearOverlay() { @@ -853,67 +892,75 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } private async computeHistogram() { - const data = await this.api.imageHistogram(this.imagePath!, this.statisticsBitLength.bitLength) - this.histogram.update(data) + const path = this.imagePath + + if (path) { + const data = await this.api.imageHistogram(path, this.statisticsBitLength.bitLength) + this.histogram?.update(data) + } } statisticsBitLengthChanged() { - this.computeHistogram() + return this.computeHistogram() } async detectStars() { - const options = this.preference.starDetectionRequest(this.starDetection.type).get() - options.minSNR = this.starDetection.minSNR - options.maxStars = this.starDetection.maxStars - - try { - this.starDetection.running = true - this.starDetection.stars = await this.api.detectStars(this.imagePath!, options) - } finally { - this.starDetection.running = false - } + const path = this.imagePath - let hfd = 0 - let stdDev = 0 - let snr = 0 - let fluxMin = 0 - let fluxMax = 0 + if (path) { + const options = this.preference.starDetectionRequest(this.starDetection.type).get() + options.minSNR = this.starDetection.minSNR + options.maxStars = this.starDetection.maxStars + + try { + this.starDetection.running = true + this.starDetection.stars = await this.api.detectStars(path, options) + } finally { + this.starDetection.running = false + } - const starCount = this.starDetection.stars.length + let hfd = 0 + let stdDev = 0 + let snr = 0 + let fluxMin = 0 + let fluxMax = 0 - if (starCount) { - fluxMax = this.starDetection.stars[0].flux + const starCount = this.starDetection.stars.length - for (const star of this.starDetection.stars) { - hfd += star.hfd - snr += star.snr - fluxMax = Math.min(fluxMax, star.flux) - fluxMin = Math.max(fluxMin, star.flux) - } + if (starCount) { + fluxMax = this.starDetection.stars[0].flux - hfd = hfd / starCount - snr = snr / starCount + for (const star of this.starDetection.stars) { + hfd += star.hfd + snr += star.snr + fluxMax = Math.min(fluxMax, star.flux) + fluxMin = Math.max(fluxMin, star.flux) + } - let squared = 0 + hfd = hfd / starCount + snr = snr / starCount - for (const star of this.starDetection.stars) { - squared += Math.pow(star.hfd - hfd, 2) - } + let squared = 0 - stdDev = Math.sqrt(squared / starCount) - } + for (const star of this.starDetection.stars) { + squared += Math.pow(star.hfd - hfd, 2) + } - this.starDetection.computed.hfd = hfd - this.starDetection.computed.stdDev = stdDev - this.starDetection.computed.snr = snr - this.starDetection.computed.fluxMax = fluxMin - this.starDetection.computed.fluxMin = fluxMax + stdDev = Math.sqrt(squared / starCount) + } + + this.starDetection.computed.hfd = hfd + this.starDetection.computed.stdDev = stdDev + this.starDetection.computed.snr = snr + this.starDetection.computed.fluxMax = fluxMin + this.starDetection.computed.fluxMin = fluxMax - this.savePreference() + this.savePreference() - this.starDetection.visible = this.starDetection.stars.length > 0 - this.detectStarsMenuItem.checkable = this.starDetection.visible - this.detectStarsMenuItem.checked = this.starDetection.visible + this.starDetection.visible = this.starDetection.stars.length > 0 + this.detectStarsMenuItem.checkable = this.starDetection.visible + this.detectStarsMenuItem.checked = this.starDetection.visible + } } selectDetectedStar(star: DetectedStar) { @@ -959,6 +1006,8 @@ export class ImageComponent implements AfterViewInit, OnDestroy { if (this.calibrationViaCamera && this.liveStackingMode !== 'NONE') transformation.calibrationGroup = this.imageData.capture?.calibrationGroup const { info, blob } = await this.api.openImage(path, transformation, this.imageData.camera) + if (!blob || !info) return + this.imageInfo = info this.scnrMenuItem.disabled = info.mono @@ -985,11 +1034,11 @@ export class ImageComponent implements AfterViewInit, OnDestroy { if (!info.camera?.id) { this.calibrationViaCamera = false this.markCalibrationGroupItem(this.transformation.calibrationGroup) - } else { - this.calibrationMenuItem.items![2].disabled = false + } else if (this.calibrationMenuItem.items) { + this.calibrationMenuItem.items[2].disabled = false } - this.retrieveCoordinateInterpolation() + return this.retrieveCoordinateInterpolation() } private retrieveInfoFromImageHeaders(headers: FITSHeaderItem[]) { @@ -1032,20 +1081,28 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } async saveImageAs() { - await this.api.saveImageAs(this.imagePath!, this.saveAs, this.imageData.camera) - this.saveAs.showDialog = false + const path = this.imagePath + + if (path) { + await this.api.saveImageAs(path, this.saveAs, this.imageData.camera) + this.saveAs.showDialog = false + } } async annotateImage() { - try { - this.annotation.running = true - this.annotation.data = await this.api.annotationsOfImage(this.imagePath!, this.annotation.useStarsAndDSOs, this.annotation.useMinorPlanets, this.annotation.minorPlanetsMagLimit, this.annotation.includeMinorPlanetsWithoutMagnitude, this.annotation.useSimbad) - this.annotation.visible = this.annotation.data.length > 0 - this.annotationMenuItem.checkable = this.annotation.visible - this.annotationMenuItem.checked = this.annotation.visible - this.annotation.showDialog = false - } finally { - this.annotation.running = false + const path = this.imagePath + + if (path) { + try { + this.annotation.running = true + this.annotation.data = await this.api.annotationsOfImage(path, this.annotation.useStarsAndDSOs, this.annotation.useMinorPlanets, this.annotation.minorPlanetsMagLimit, this.annotation.includeMinorPlanetsWithoutMagnitude, this.annotation.useSimbad) + this.annotation.visible = this.annotation.data.length > 0 + this.annotationMenuItem.checkable = this.annotation.visible + this.annotationMenuItem.checked = this.annotation.visible + this.annotation.showDialog = false + } finally { + this.annotation.running = false + } } } @@ -1069,27 +1126,27 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.stretch.auto = true this.autoStretchMenuItem.selected = true - this.loadImage() + return this.loadImage() } - resetStretch(load: boolean = true) { + async resetStretch(load: boolean = true) { this.stretchShadow.set(0) this.stretchHighlight.set(65536) this.stretchMidtone.set(32768) if (load) { - this.stretchImage() + await this.stretchImage() } } - toggleStretch() { + async toggleStretch() { this.stretch.auto = !this.stretch.auto this.autoStretchMenuItem.selected = this.stretch.auto if (!this.stretch.auto) { - this.resetStretch() + await this.resetStretch() } else { - this.loadImage() + await this.loadImage() } } @@ -1101,11 +1158,11 @@ export class ImageComponent implements AfterViewInit, OnDestroy { invertImage() { this.transformation.invert = !this.transformation.invert this.invertMenuItem.selected = this.transformation.invert - this.loadImage() + return this.loadImage() } scnrImage() { - this.loadImage() + return this.loadImage() } toggleCrosshair() { @@ -1153,36 +1210,44 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } private async retrieveCoordinateInterpolation() { - const coordinate = await this.api.coordinateInterpolation(this.imagePath!) - - if (coordinate) { - const { ma, md, x0, y0, x1, y1, delta } = coordinate - const x = Math.max(0, Math.min(this.mouseCoordinate?.x ?? 0, this.imageInfo!.width)) - const y = Math.max(0, Math.min(this.mouseCoordinate?.y ?? 0, this.imageInfo!.height)) - this.mouseCoordinateInterpolation = new CoordinateInterpolator(ma, md, x0, y0, x1, y1, delta) - this.imageMouseMovedWithCoordinates(x, y) - } else { - this.mouseCoordinateInterpolation = undefined - this.mouseCoordinate = undefined + const path = this.imagePath + + if (path) { + const coordinate = await this.api.coordinateInterpolation(this.imagePath) + + if (coordinate && this.imageInfo) { + const { ma, md, x0, y0, x1, y1, delta } = coordinate + const x = Math.max(0, Math.min(this.mouseCoordinate?.x ?? 0, this.imageInfo.width)) + const y = Math.max(0, Math.min(this.mouseCoordinate?.y ?? 0, this.imageInfo.height)) + this.mouseCoordinateInterpolation = new CoordinateInterpolator(ma, md, x0, y0, x1, y1, delta) + this.imageMouseMovedWithCoordinates(x, y) + } else { + this.mouseCoordinateInterpolation = undefined + this.mouseCoordinate = undefined + } } } async solveImage() { - this.solver.running = true + const path = this.imagePath + + if (path) { + this.solver.running = true - try { - const solver = this.preference.plateSolverRequest(this.solver.type).get() - const solved = await this.api.solveImage(solver, this.imagePath!, this.solver.blind, this.solver.centerRA, this.solver.centerDEC, this.solver.radius) + try { + const solver = this.preference.plateSolverRequest(this.solver.type).get() + const solved = await this.api.solveImage(solver, path, this.solver.blind, this.solver.centerRA, this.solver.centerDEC, this.solver.radius) - this.savePreference() - this.updateImageSolved(solved) - } catch { - this.updateImageSolved(this.imageInfo?.solved) - } finally { - this.solver.running = false - - if (this.solver.solved.solved) { - this.retrieveCoordinateInterpolation() + this.savePreference() + this.updateImageSolved(solved) + } catch { + this.updateImageSolved(this.imageInfo?.solved) + } finally { + this.solver.running = false + + if (this.solver.solved.solved) { + await this.retrieveCoordinateInterpolation() + } } } } @@ -1199,35 +1264,39 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } mountSync(coordinate: EquatorialCoordinateJ2000) { - this.executeMount((mount) => { - this.api.mountSync(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) + return this.executeMount((mount) => { + return this.api.mountSync(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) }) } - async mountGoTo(coordinate: EquatorialCoordinateJ2000) { - this.executeMount((mount) => { - this.api.mountGoTo(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) + mountGoTo(coordinate: EquatorialCoordinateJ2000) { + return this.executeMount((mount) => { + return this.api.mountGoTo(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) }) } - async mountSlew(coordinate: EquatorialCoordinateJ2000) { - this.executeMount((mount) => { - this.api.mountSlew(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) + mountSlew(coordinate: EquatorialCoordinateJ2000) { + return this.executeMount((mount) => { + return this.api.mountSlew(mount, coordinate.rightAscensionJ2000, coordinate.declinationJ2000, true) }) } - frame(coordinate: EquatorialCoordinateJ2000) { - this.browserWindow.openFraming({ - rightAscension: coordinate.rightAscensionJ2000, - declination: coordinate.declinationJ2000, - fov: this.solver.solved!.width / 60, - rotation: this.solver.solved!.orientation, - }) + async frame(coordinate: EquatorialCoordinateJ2000) { + if (this.solver.solved.solved) { + await this.browserWindow.openFraming({ + rightAscension: coordinate.rightAscensionJ2000, + declination: coordinate.declinationJ2000, + fov: this.solver.solved.width / 60, + rotation: this.solver.solved.orientation, + }) + } } imageLoaded() { - if (!this.panZoom) { - this.panZoom = createPanZoom(this.image.nativeElement.parentElement!, { + const imageWrapperElement = this.image.nativeElement.parentElement + + if (!this.panZoom && imageWrapperElement) { + this.panZoom = createPanZoom(imageWrapperElement, { minZoom: 0.1, maxZoom: 500.0, autocenter: true, @@ -1393,22 +1462,22 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.preference.imagePreference.set(preference) } - private async executeCamera(action: (camera: Camera) => void, showConfirmation: boolean = true) { + private async executeCamera(action: (camera: Camera) => void | Promise, showConfirmation: boolean = true) { if (showConfirmation && (await this.prime.confirm('Are you sure that you want to proceed?'))) { - return + return false } const cameras = await this.api.cameras() if (cameras.length === 1) { - action(cameras[0]) + await action(cameras[0]) return true } else { this.deviceMenu.header = 'CAMERA' const camera = await this.deviceMenu.show(cameras) if (camera && camera !== 'NONE' && camera.connected) { - action(camera) + await action(camera) return true } } @@ -1416,22 +1485,22 @@ export class ImageComponent implements AfterViewInit, OnDestroy { return false } - private async executeMount(action: (mount: Mount) => void, showConfirmation: boolean = true) { + private async executeMount(action: (mount: Mount) => void | Promise, showConfirmation: boolean = true) { if (showConfirmation && (await this.prime.confirm('Are you sure that you want to proceed?'))) { - return + return false } const mounts = await this.api.mounts() if (mounts.length === 1) { - action(mounts[0]) + await action(mounts[0]) return true } else { this.deviceMenu.header = 'MOUNT' const mount = await this.deviceMenu.show(mounts) if (mount && mount !== 'NONE' && mount.connected) { - action(mount) + await action(mount) return true } } diff --git a/desktop/src/app/indi/indi.component.ts b/desktop/src/app/indi/indi.component.ts index 6d4811621..732a22c8c 100644 --- a/desktop/src/app/indi/indi.component.ts +++ b/desktop/src/app/indi/indi.component.ts @@ -15,7 +15,7 @@ import { AppComponent } from '../app.component' }) export class INDIComponent implements AfterViewInit, OnDestroy { devices: Device[] = [] - properties: INDIProperty[] = [] + properties: INDIProperty[] = [] groups: MenuItem[] = [] device?: Device @@ -38,15 +38,17 @@ export class INDIComponent implements AfterViewInit, OnDestroy { electron.on('DEVICE.PROPERTY_CHANGED', (event) => { if (this.device?.id === event.device.id) { ngZone.run(() => { - this.addOrUpdateProperty(event.property!) - this.updateGroups() + if (event.property) { + this.addOrUpdateProperty(event.property) + this.updateGroups() + } }) } }) electron.on('DEVICE.PROPERTY_DELETED', (event) => { if (this.device?.id === event.device.id) { - const index = this.properties.findIndex((e) => e.name === event.property!.name) + const index = this.properties.findIndex((e) => e.name === event.property?.name) if (index >= 0) { ngZone.run(() => { @@ -58,10 +60,12 @@ export class INDIComponent implements AfterViewInit, OnDestroy { }) electron.on('DEVICE.MESSAGE_RECEIVED', (event) => { - if (this.device && event.device?.id === this.device.id) { + if (this.device && event.device.id === this.device.id) { ngZone.run(() => { - this.messages.splice(0, 0, event.message!) - this.messageListbox.cd.markForCheck() + if (event.message) { + this.messages.splice(0, 0, event.message) + this.messageListbox.cd.markForCheck() + } }) } }) @@ -69,26 +73,25 @@ export class INDIComponent implements AfterViewInit, OnDestroy { async ngAfterViewInit() { this.route.queryParams.subscribe((e) => { - const device = JSON.parse(decodeURIComponent(e.data)) + const device = JSON.parse(decodeURIComponent(e['data'] as string)) as Device - if ('id' in device && device.id) { + if (device.id) { this.device = device } }) this.devices = [...(await this.api.cameras()), ...(await this.api.mounts()), ...(await this.api.focusers()), ...(await this.api.wheels())].sort(deviceComparator) - this.device = this.devices[0] - - if (this.device) { - this.deviceChanged(this.device) + if (this.devices.length) { + this.device = this.devices[0] + await this.deviceChanged(this.device) } } @HostListener('window:unload') ngOnDestroy() { if (this.device) { - this.api.indiUnlisten(this.device) + void this.api.indiUnlisten(this.device) } } @@ -99,7 +102,7 @@ export class INDIComponent implements AfterViewInit, OnDestroy { this.device = device - this.updateProperties() + await this.updateProperties() await this.api.indiListen(device) this.messages = await this.api.indiLog(device) } @@ -109,8 +112,10 @@ export class INDIComponent implements AfterViewInit, OnDestroy { this.group = group } - send(property: INDISendProperty) { - this.api.indiSendProperty(this.device!, property) + async send(property: INDISendProperty) { + if (this.device) { + await this.api.indiSendProperty(this.device, property) + } } private updateGroups() { @@ -130,7 +135,7 @@ export class INDIComponent implements AfterViewInit, OnDestroy { } } for (const group of this.groups) { - if (!groups.has(group.label!)) { + if (group.label && !groups.has(group.label)) { groupsChanged = true break } @@ -142,14 +147,15 @@ export class INDIComponent implements AfterViewInit, OnDestroy { if (this.groups.length === 0 || groupsChanged) { this.groups = Array.from(groups) .sort(textComparator) - .map( - (e) => - { - icon: 'mdi mdi-sitemap', - label: e, - command: () => this.changeGroup(e), + .map((e) => { + return { + icon: 'mdi mdi-sitemap', + label: e, + command: () => { + this.changeGroup(e) }, - ) + } + }) } if (!this.group || !this.groups.find((e) => e.label === this.group)) { @@ -175,7 +181,7 @@ export class INDIComponent implements AfterViewInit, OnDestroy { } } - private addOrUpdateProperty(property: INDIProperty) { + private addOrUpdateProperty(property: INDIProperty) { const index = this.properties.findIndex((e) => e.name === property.name) if (index >= 0) { diff --git a/desktop/src/app/indi/property/indi-property.component.ts b/desktop/src/app/indi/property/indi-property.component.ts index 92463168a..52d9b6747 100644 --- a/desktop/src/app/indi/property/indi-property.component.ts +++ b/desktop/src/app/indi/property/indi-property.component.ts @@ -8,7 +8,7 @@ import { INDIProperty, INDIPropertyItem, INDISendProperty, INDISendPropertyItem }) export class INDIPropertyComponent implements AfterContentInit, OnDestroy { @Input({ required: true }) - property!: INDIProperty + property!: INDIProperty @Input() disabled = false @@ -19,7 +19,7 @@ export class INDIPropertyComponent implements AfterContentInit, OnDestroy { ngAfterContentInit() { for (const item of this.property.items) { if (!item.valueToSend) { - item.valueToSend = item.value + item.valueToSend = `${item.value}` } } } diff --git a/desktop/src/app/mount/mount.component.html b/desktop/src/app/mount/mount.component.html index d93ac7dad..6a4cb88d5 100644 --- a/desktop/src/app/mount/mount.component.html +++ b/desktop/src/app/mount/mount.component.html @@ -30,7 +30,7 @@ tooltipPosition="bottom" [text]="true" />
-
+
diff --git a/desktop/src/app/mount/mount.component.ts b/desktop/src/app/mount/mount.component.ts index 56b06c234..699a5441b 100644 --- a/desktop/src/app/mount/mount.component.ts +++ b/desktop/src/app/mount/mount.component.ts @@ -2,30 +2,20 @@ import { AfterContentInit, Component, HostListener, NgZone, OnDestroy } from '@a import { ActivatedRoute } from '@angular/router' import hotkeys from 'hotkeys-js' import { Subject, Subscription, interval, throttleTime } from 'rxjs' -import { MenuItem } from '../../shared/components/menu-item/menu-item.component' +import { SlideMenuItem } from '../../shared/components/menu-item/menu-item.component' import { SEPARATOR_MENU_ITEM } from '../../shared/constants' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' -import { LocalStorageService } from '../../shared/services/local-storage.service' import { Pingable, Pinger } from '../../shared/services/pinger.service' +import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' import { Angle, ComputedLocation, Constellation, EMPTY_COMPUTED_LOCATION } from '../../shared/types/atlas.types' -import { EMPTY_MOUNT, Mount, MountRemoteControlDialog, MountRemoteControlType, MoveDirectionType, PierSide, SlewRate, TargetCoordinateType, TrackMode } from '../../shared/types/mount.types' +import { EMPTY_MOUNT, Mount, MountPreference, MountRemoteControlDialog, MountRemoteControlType, MoveDirectionType, PierSide, SlewRate, TargetCoordinateType, TrackMode } from '../../shared/types/mount.types' import { AppComponent } from '../app.component' import { SkyAtlasData, SkyAtlasTab } from '../atlas/atlas.component' import { FramingData } from '../framing/framing.component' -export function mountPreferenceKey(mount: Mount) { - return `mount.${mount.name}` -} - -export interface MountPreference { - targetCoordinateType?: TargetCoordinateType - targetRightAscension?: Angle - targetDeclination?: Angle -} - @Component({ selector: 'app-mount', templateUrl: './mount.component.html', @@ -67,61 +57,67 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { private computeCoordinateSubscriptions: Subscription[] = [] private readonly moveToDirection = [false, false] - readonly ephemerisModel: MenuItem[] = [ + readonly ephemerisModel: SlideMenuItem[] = [ { icon: 'mdi mdi-image', label: 'Frame', + slideMenu: [], command: () => { const data: FramingData = { rightAscension: this.rightAscensionJ2000, declination: this.declinationJ2000 } - this.browserWindow.openFraming(data) + return this.browserWindow.openFraming(data) }, }, SEPARATOR_MENU_ITEM, { icon: 'mdi mdi-magnify', label: 'Find sky objects around the coordinates', + slideMenu: [], command: () => { const data: SkyAtlasData = { tab: SkyAtlasTab.SKY_OBJECT, filter: { rightAscension: this.rightAscensionJ2000, declination: this.declinationJ2000 }, } - this.browserWindow.openSkyAtlas(data, { bringToFront: true }) + return this.browserWindow.openSkyAtlas(data, { bringToFront: true }) }, }, ] - readonly targetCoordinateModel: MenuItem[] = [ + readonly targetCoordinateModel: SlideMenuItem[] = [ { icon: 'mdi mdi-telescope', label: 'Go To', + slideMenu: [], command: () => { this.targetCoordinateCommand = this.targetCoordinateModel[0] - this.goTo() + return this.goTo() }, }, { icon: 'mdi mdi-telescope', label: 'Slew', + slideMenu: [], command: () => { this.targetCoordinateCommand = this.targetCoordinateModel[1] - this.slewTo() + return this.slewTo() }, }, { icon: 'mdi mdi-sync', label: 'Sync', + slideMenu: [], command: () => { this.targetCoordinateCommand = this.targetCoordinateModel[2] - this.sync() + return this.sync() }, }, { icon: 'mdi mdi-image', label: 'Frame', + slideMenu: [], command: () => { const data: FramingData = { rightAscension: this.targetRightAscension, declination: this.targetDeclination } - this.browserWindow.openFraming(data) + return this.browserWindow.openFraming(data) }, }, SEPARATOR_MENU_ITEM, @@ -132,6 +128,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Current location', + slideMenu: [], command: () => { this.targetRightAscension = this.rightAscension this.targetDeclination = this.declination @@ -141,6 +138,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Current location (J2000)', + slideMenu: [], command: () => { this.targetRightAscension = this.rightAscensionJ2000 this.targetDeclination = this.declinationJ2000 @@ -150,6 +148,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Zenith', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'ZENITH') this.updateTargetCoordinate(coordinates) @@ -158,6 +157,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'North celestial pole', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'NORTH_POLE') this.updateTargetCoordinate(coordinates) @@ -166,6 +166,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'South celestial pole', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'SOUTH_POLE') this.updateTargetCoordinate(coordinates) @@ -174,6 +175,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Galactic center', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'GALACTIC_CENTER') this.updateTargetCoordinate(coordinates) @@ -186,6 +188,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Meridian x Equator', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'MERIDIAN_EQUATOR') this.updateTargetCoordinate(coordinates) @@ -194,6 +197,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Meridian x Ecliptic', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'MERIDIAN_ECLIPTIC') this.updateTargetCoordinate(coordinates) @@ -202,6 +206,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { { icon: 'mdi mdi-crosshairs-gps', label: 'Equator x Ecliptic', + slideMenu: [], command: async () => { const coordinates = await this.api.mountCelestialLocation(this.mount, 'EQUATOR_ECLIPTIC') this.updateTargetCoordinate(coordinates) @@ -228,7 +233,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { private api: ApiService, private browserWindow: BrowserWindowService, electron: ElectronService, - private storage: LocalStorageService, + private preference: PreferenceService, private route: ActivatedRoute, private prime: PrimeService, private pinger: Pinger, @@ -236,22 +241,22 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { ) { app.title = 'Mount' - electron.on('MOUNT.UPDATED', (event) => { - if (event.device.id === this.mount?.id) { - ngZone.run(() => { + electron.on('MOUNT.UPDATED', async (event) => { + if (event.device.id === this.mount.id) { + await ngZone.run(async () => { const wasConnected = this.mount.connected Object.assign(this.mount, event.device) this.update() if (this.mount.connected && !wasConnected) { - this.computeCoordinates() + await this.computeCoordinates() } }) } }) electron.on('MOUNT.DETACHED', (event) => { - if (event.device.id === this.mount?.id) { + if (event.device.id === this.mount.id) { ngZone.run(() => { Object.assign(this.mount, EMPTY_MOUNT) }) @@ -269,11 +274,11 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { hotkeys('space', (event) => { event.preventDefault() - this.abort() + void this.abort() }) hotkeys('enter', (event) => { event.preventDefault() - this.targetCoordinateCommandClicked() + void this.targetCoordinateCommandClicked() }) hotkeys('w,up', { keyup: true }, (event) => { event.preventDefault() @@ -309,9 +314,9 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { }) } - async ngAfterContentInit() { + ngAfterContentInit() { this.route.queryParams.subscribe(async (e) => { - const mount = JSON.parse(decodeURIComponent(e.data)) as Mount + const mount = JSON.parse(decodeURIComponent(e['data'] as string)) as Mount await this.mountChanged(mount) this.pinger.register(this, 30000) }) @@ -321,13 +326,15 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { ngOnDestroy() { this.pinger.unregister(this) - this.computeCoordinateSubscriptions.forEach((e) => e.unsubscribe()) + this.computeCoordinateSubscriptions.forEach((e) => { + e.unsubscribe() + }) - this.abort() + void this.abort() } ping() { - this.api.mountListen(this.mount) + return this.api.mountListen(this.mount) } async mountChanged(mount?: Mount) { @@ -339,16 +346,14 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { this.update() } - if (this.app) { - this.app.subTitle = mount?.name ?? '' - } + this.app.subTitle = mount?.name ?? '' } connect() { if (this.mount.connected) { - this.api.mountDisconnect(this.mount) + return this.api.mountDisconnect(this.mount) } else { - this.api.mountConnect(this.mount) + return this.api.mountConnect(this.mount) } } @@ -386,13 +391,13 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { this.savePreference() } - targetCoordinateCommandClicked() { + async targetCoordinateCommandClicked() { if (this.targetCoordinateCommand === this.targetCoordinateModel[0]) { - this.goTo() + await this.goTo() } else if (this.targetCoordinateCommand === this.targetCoordinateModel[1]) { - this.slewTo() + await this.slewTo() } else if (this.targetCoordinateCommand === this.targetCoordinateModel[2]) { - this.sync() + await this.sync() } } @@ -403,16 +408,16 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { if (this.moveToDirection[0] !== pressed) { switch (direction[0]) { case 'N': - this.api.mountMove(this.mount, 'NORTH', pressed) + void this.api.mountMove(this.mount, 'NORTH', pressed) break case 'S': - this.api.mountMove(this.mount, 'SOUTH', pressed) + void this.api.mountMove(this.mount, 'SOUTH', pressed) break case 'W': - this.api.mountMove(this.mount, 'WEST', pressed) + void this.api.mountMove(this.mount, 'WEST', pressed) break case 'E': - this.api.mountMove(this.mount, 'EAST', pressed) + void this.api.mountMove(this.mount, 'EAST', pressed) break } @@ -422,10 +427,10 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { if (this.moveToDirection[1] !== pressed) { switch (direction[1]) { case 'W': - this.api.mountMove(this.mount, 'WEST', pressed) + void this.api.mountMove(this.mount, 'WEST', pressed) break case 'E': - this.api.mountMove(this.mount, 'EAST', pressed) + void this.api.mountMove(this.mount, 'EAST', pressed) break default: return @@ -437,43 +442,33 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { } abort() { - this.api.mountAbort(this.mount) + return this.api.mountAbort(this.mount) } trackingToggled() { - if (this.mount.connected) { - this.api.mountTracking(this.mount, this.tracking) - } + return this.api.mountTracking(this.mount, this.tracking) } trackModeChanged() { - if (this.mount.connected) { - this.api.mountTrackMode(this.mount, this.trackMode) - } + return this.api.mountTrackMode(this.mount, this.trackMode) } - slewRateChanged() { - if (this.mount.connected && this.slewRate) { - this.api.mountSlewRate(this.mount, this.slewRate) + async slewRateChanged() { + if (this.slewRate) { + await this.api.mountSlewRate(this.mount, this.slewRate) } } park() { - if (this.mount.connected) { - this.api.mountPark(this.mount) - } + return this.api.mountPark(this.mount) } unpark() { - if (this.mount.connected) { - this.api.mountUnpark(this.mount) - } + return this.api.mountUnpark(this.mount) } home() { - if (this.mount.connected) { - this.api.mountHome(this.mount) - } + return this.api.mountHome(this.mount) } private update() { @@ -531,10 +526,10 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { private loadPreference() { if (this.mount.id) { - const preference = this.storage.get(mountPreferenceKey(this.mount), {}) - this.targetCoordinateType = preference.targetCoordinateType ?? 'JNOW' - this.targetRightAscension = preference.targetRightAscension ?? '00h00m00s' - this.targetDeclination = preference.targetDeclination ?? `00°00'00"` + const mountPreference: Partial = this.preference.mountPreference(this.mount).get() + this.targetCoordinateType = mountPreference.targetCoordinateType ?? 'JNOW' + this.targetRightAscension = mountPreference.targetRightAscension ?? '00h00m00s' + this.targetDeclination = mountPreference.targetDeclination ?? `00°00'00"` this.computeTargetCoordinatePublisher.next() } } @@ -547,7 +542,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { targetDeclination: this.targetDeclination, } - this.storage.set(mountPreferenceKey(this.mount), preference) + this.preference.mountPreference(this.mount).set(preference) } } } diff --git a/desktop/src/app/rotator/rotator.component.ts b/desktop/src/app/rotator/rotator.component.ts index 44cf9070d..f541bce28 100644 --- a/desktop/src/app/rotator/rotator.component.ts +++ b/desktop/src/app/rotator/rotator.component.ts @@ -48,9 +48,9 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { }) } - async ngAfterViewInit() { + ngAfterViewInit() { this.route.queryParams.subscribe(async (e) => { - const rotator = JSON.parse(decodeURIComponent(e.data)) as Rotator + const rotator = JSON.parse(decodeURIComponent(e['data'] as string)) as Rotator await this.rotatorChanged(rotator) this.pinger.register(this, 30000) }) @@ -59,11 +59,11 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { @HostListener('window:unload') ngOnDestroy() { this.pinger.unregister(this) - this.abort() + void this.abort() } ping() { - this.api.rotatorListen(this.rotator) + return this.api.rotatorListen(this.rotator) } async rotatorChanged(rotator?: Rotator) { @@ -75,21 +75,19 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { this.update() } - if (this.app) { - this.app.subTitle = rotator?.name ?? '' - } + this.app.subTitle = rotator?.name ?? '' } connect() { if (this.rotator.connected) { - this.api.rotatorDisconnect(this.rotator) + return this.api.rotatorDisconnect(this.rotator) } else { - this.api.rotatorConnect(this.rotator) + return this.api.rotatorConnect(this.rotator) } } reverse(enabled: boolean) { - this.api.rotatorReverse(this.rotator, enabled) + return this.api.rotatorReverse(this.rotator, enabled) } async move() { @@ -108,11 +106,11 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { } abort() { - this.api.rotatorAbort(this.rotator) + return this.api.rotatorAbort(this.rotator) } home() { - this.api.rotatorHome(this.rotator) + return this.api.rotatorHome(this.rotator) } private update() { diff --git a/desktop/src/app/sequencer/sequencer.component.ts b/desktop/src/app/sequencer/sequencer.component.ts index 91fd2971f..151b40887 100644 --- a/desktop/src/app/sequencer/sequencer.component.ts +++ b/desktop/src/app/sequencer/sequencer.component.ts @@ -2,7 +2,7 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop' import { AfterContentInit, Component, HostListener, NgZone, OnDestroy, QueryList, ViewChildren } from '@angular/core' import { CameraExposureComponent } from '../../shared/components/camera-exposure/camera-exposure.component' import { DialogMenuComponent } from '../../shared/components/dialog-menu/dialog-menu.component' -import { MenuItem } from '../../shared/components/menu-item/menu-item.component' +import { SlideMenuItem } from '../../shared/components/menu-item/menu-item.component' import { ApiService } from '../../shared/services/api.service' import { BrowserWindowService } from '../../shared/services/browser-window.service' import { ElectronService } from '../../shared/services/electron.service' @@ -49,10 +49,11 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable private entryToApplyCount: [number, number] = [0, 0] readonly availableEntryPropertiesToApply = new Map() showEntryPropertiesToApplyDialog = false - readonly entryMenuModel: MenuItem[] = [ + readonly entryMenuModel: SlideMenuItem[] = [ { icon: 'mdi mdi-content-copy', label: 'Apply to all', + slideMenu: [], command: () => { this.entryToApplyCount = [-1000, 1000] this.showEntryPropertiesToApplyDialog = true @@ -61,6 +62,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable { icon: 'mdi mdi-content-copy', label: 'Apply to all above', + slideMenu: [], command: () => { this.entryToApplyCount = [-1000, 0] this.showEntryPropertiesToApplyDialog = true @@ -69,6 +71,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable { icon: 'mdi mdi-content-copy', label: 'Apply to above', + slideMenu: [], command: () => { this.entryToApplyCount = [-1, 0] this.showEntryPropertiesToApplyDialog = true @@ -77,6 +80,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable { icon: 'mdi mdi-content-copy', label: 'Apply to below', + slideMenu: [], command: () => { this.entryToApplyCount = [1, 0] this.showEntryPropertiesToApplyDialog = true @@ -85,6 +89,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable { icon: 'mdi mdi-content-copy', label: 'Apply to all below', + slideMenu: [], command: () => { this.entryToApplyCount = [1000, 0] this.showEntryPropertiesToApplyDialog = true @@ -135,7 +140,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable app.topMenu.push({ icon: 'mdi mdi-plus', label: 'Create new', - command: async () => { + command: () => { this.savedPath = undefined this.savedPathWasModified = false this.storage.delete(SEQUENCER_SAVED_PATH_KEY) @@ -260,7 +265,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable this.focusers = (await this.api.focusers()).sort(deviceComparator) this.rotators = (await this.api.rotators()).sort(deviceComparator) - this.loadSavedJsonFileFromPathOrAddDefault() + await this.loadSavedJsonFileFromPathOrAddDefault() // this.route.queryParams.subscribe(e => { }) } @@ -270,12 +275,12 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable this.pinger.unregister(this) } - ping() { - if (this.camera) this.api.cameraListen(this.camera) - if (this.mount) this.api.mountListen(this.mount) - if (this.focuser) this.api.focuserListen(this.focuser) - if (this.wheel) this.api.wheelListen(this.wheel) - if (this.rotator) this.api.rotatorListen(this.rotator) + async ping() { + if (this.camera) await this.api.cameraListen(this.camera) + if (this.mount) await this.api.mountListen(this.mount) + if (this.focuser) await this.api.focuserListen(this.focuser) + if (this.wheel) await this.api.wheelListen(this.wheel) + if (this.rotator) await this.api.rotatorListen(this.rotator) } private enableOrDisableTopbarMenu(enable: boolean) { @@ -283,7 +288,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } add() { - const camera = this.camera ?? this.cameras[0] + const camera: Camera | undefined = this.camera ?? this.cameras[0] // const wheel = this.wheel ?? this.wheels[0] // const focuser = this.focuser ?? this.focusers[0] // const rotator = this.rotator ?? this.rotators[0] @@ -315,7 +320,6 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable enabled: false, type: 'SIRIL', executablePath: '', - rotate: 0, use32Bits: false, slot: 1, }, @@ -329,9 +333,11 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } private afterSavedJsonFile(file: JsonFile) { - this.savedPath = file.path! - this.storage.set(SEQUENCER_SAVED_PATH_KEY, this.savedPath) - this.savedPathWasModified = false + if (file.path) { + this.savedPath = file.path + this.storage.set(SEQUENCER_SAVED_PATH_KEY, this.savedPath) + this.savedPathWasModified = false + } } private loadSavedJsonFile(file: JsonFile) { @@ -351,7 +357,8 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable const file = await this.electron.readJson(savedPath) if (file !== false) { - return this.loadSavedJsonFile(file) + this.loadSavedJsonFile(file) + return } this.prime.message(`Failed to load the saved Sequence at: ${savedPath}`, 'error') @@ -397,35 +404,35 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } async showCameraDialog(entry: CameraStartCapture) { - if (await CameraComponent.showAsDialog(this.browserWindow, 'SEQUENCER', this.camera!, entry)) { + if (this.camera && (await CameraComponent.showAsDialog(this.browserWindow, 'SEQUENCER', this.camera, entry))) { this.savePlan() } } async showWheelDialog(entry: CameraStartCapture) { - if (await FilterWheelComponent.showAsDialog(this.browserWindow, 'SEQUENCER', this.wheel!, entry)) { + if (this.wheel && (await FilterWheelComponent.showAsDialog(this.browserWindow, 'SEQUENCER', this.wheel, entry))) { this.savePlan() } } cameraChanged() { - this.ping() + return this.ping() } mountChanged() { - this.ping() + return this.ping() } focuserChanged() { - this.ping() + return this.ping() } wheelChanged() { - this.ping() + return this.ping() } rotatorChanged() { - this.ping() + return this.ping() } savePlan() { @@ -472,7 +479,8 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } applyCameraStartCaptureToEntries() { - const source = this.entryToApply! + const source = this.entryToApply + if (!source) return const index = this.plan.entries.indexOf(source) for (let count of this.entryToApplyCount) { @@ -515,8 +523,10 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } deleteEntry(entry: CameraStartCapture, index: number) { - this.plan.entries.splice(index, 1) - this.savePlan() + if (entry === this.plan.entries[index]) { + this.plan.entries.splice(index, 1) + this.savePlan() + } } duplicateEntry(entry: CameraStartCapture, index: number) { @@ -525,18 +535,21 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } async start() { - for (let i = 0; i < this.cameraExposures.length; i++) { - this.cameraExposures.get(i)?.reset() - } - - this.savePlan() + if (this.camera) { + for (let i = 0; i < this.cameraExposures.length; i++) { + this.cameraExposures.get(i)?.reset() + } - await this.browserWindow.openCameraImage(this.camera!, 'SEQUENCER') + this.savePlan() - this.api.sequencerStart(this.camera!, this.plan) + await this.browserWindow.openCameraImage(this.camera, 'SEQUENCER') + await this.api.sequencerStart(this.camera, this.plan) + } } - stop() { - this.api.sequencerStop(this.camera!) + async stop() { + if (this.camera) { + await this.api.sequencerStop(this.camera) + } } } diff --git a/desktop/src/app/settings/settings.component.ts b/desktop/src/app/settings/settings.component.ts index 222d47538..8ca39a051 100644 --- a/desktop/src/app/settings/settings.component.ts +++ b/desktop/src/app/settings/settings.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, HostListener, OnDestroy } from '@angular/core' +import { Component } from '@angular/core' import { LocationDialog } from '../../shared/dialogs/location/location.dialog' import { DropdownOptionsPipe } from '../../shared/pipes/dropdown-options.pipe' import { ElectronService } from '../../shared/services/electron.service' @@ -14,7 +14,7 @@ import { AppComponent } from '../app.component' templateUrl: './settings.component.html', styleUrls: ['./settings.component.scss'], }) -export class SettingsComponent implements AfterViewInit, OnDestroy { +export class SettingsComponent { tab = 0 readonly tabs: { id: number; name: string }[] = [ { @@ -70,17 +70,12 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { } } - async ngAfterViewInit() {} - - @HostListener('window:unload') - ngOnDestroy() {} - addLocation() { - this.showLocation(structuredClone(EMPTY_LOCATION)) + return this.showLocation(structuredClone(EMPTY_LOCATION)) } editLocation() { - this.showLocation(this.location) + return this.showLocation(this.location) } private async showLocation(location: Location) { @@ -104,7 +99,7 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { this.preference.locations.set(this.locations) this.preference.selectedLocation.set(this.location) - this.electron.send('LOCATION.CHANGED', this.location) + await this.electron.send('LOCATION.CHANGED', this.location) } } @@ -114,19 +109,19 @@ export class SettingsComponent implements AfterViewInit, OnDestroy { if (index >= 0) { this.locations.splice(index, 1) - this.location = this.locations[0] + this.location = this.locations[0]! this.preference.locations.set(this.locations) this.preference.selectedLocation.set(this.location) - this.electron.send('LOCATION.CHANGED', this.location) + await this.electron.send('LOCATION.CHANGED', this.location) } } } locationChanged() { this.preference.selectedLocation.set(this.location) - this.electron.send('LOCATION.CHANGED', this.location) + return this.electron.send('LOCATION.CHANGED', this.location) } save() { diff --git a/desktop/src/main.ts b/desktop/src/main.ts index ca8f1e8b2..a46da2c73 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -12,4 +12,6 @@ platformBrowserDynamic() .bootstrapModule(AppModule, { preserveWhitespaces: false, }) - .catch((e) => console.error(e)) + .catch((e: unknown) => { + console.error(e) + }) diff --git a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts index b93b28022..1c751ef79 100644 --- a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts +++ b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts @@ -5,7 +5,7 @@ import { isGuideHead } from '../../types/camera.types' import { Device } from '../../types/device.types' import { deviceComparator } from '../../utils/comparators' import { DialogMenuComponent } from '../dialog-menu/dialog-menu.component' -import { MenuItem } from '../menu-item/menu-item.component' +import { MenuItem, SlideMenuItem } from '../menu-item/menu-item.component' export interface DeviceConnectionCommandEvent { device: Device @@ -19,7 +19,7 @@ export interface DeviceConnectionCommandEvent { }) export class DeviceListMenuComponent { @Input() - readonly model: MenuItem[] = [] + readonly model: SlideMenuItem[] = [] @Input() readonly modelAtFirst: boolean = true @@ -45,7 +45,7 @@ export class DeviceListMenuComponent { constructor(private prime: PrimeService) {} show(devices: T[], selected?: NoInfer) { - const model: MenuItem[] = [] + const model: SlideMenuItem[] = [] return new Promise((resolve) => { if (devices.length <= 0) { @@ -54,6 +54,18 @@ export class DeviceListMenuComponent { return } + const populateWithModel = () => { + for (const item of this.model) { + model.push({ + ...item, + command: (event) => { + item.command?.(event) + resolve(undefined) + }, + }) + } + } + const subscription = this.menu.visibleChange.subscribe((visible) => { if (!visible) { subscription.unsubscribe() @@ -62,7 +74,7 @@ export class DeviceListMenuComponent { }) if (this.model.length > 0 && this.modelAtFirst) { - model.push(...this.model) + populateWithModel() model.push(SEPARATOR_MENU_ITEM) } @@ -71,6 +83,7 @@ export class DeviceListMenuComponent { icon: 'mdi mdi-close', label: 'None', selected: !selected, + slideMenu: [], command: () => { resolve('NONE') }, @@ -82,6 +95,7 @@ export class DeviceListMenuComponent { label: device.name, selected: selected === device, disabled: this.disableIfDeviceIsNotConnected && !device.connected, + slideMenu: [], toolbarMenu: [ { icon: 'mdi ' + (device.connected ? 'mdi-close' : 'mdi-connection'), @@ -89,8 +103,10 @@ export class DeviceListMenuComponent { label: device.connected ? 'Disconnect' : 'Connect', visible: !isGuideHead(device), command: (event) => { - if (device.connected) this.deviceDisconnect.emit({ device, item: event.item! }) - else this.deviceConnect.emit({ device, item: event.item! }) + if (event.item) { + if (device.connected) this.deviceDisconnect.emit({ device, item: event.item }) + else this.deviceConnect.emit({ device, item: event.item }) + } }, }, ], @@ -102,7 +118,7 @@ export class DeviceListMenuComponent { if (this.model.length > 0 && !this.modelAtFirst) { model.push(SEPARATOR_MENU_ITEM) - model.push(...this.model) + populateWithModel() } this.menu.model = model diff --git a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts index c85ad3af8..e42185878 100644 --- a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts +++ b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core' -import { MenuItem, MenuItemCommandEvent } from '../menu-item/menu-item.component' +import { MenuItemCommandEvent, SlideMenuItem } from '../menu-item/menu-item.component' @Component({ selector: 'neb-dialog-menu', @@ -14,7 +14,7 @@ export class DialogMenuComponent { readonly visibleChange = new EventEmitter() @Input() - model: MenuItem[] = [] + model: SlideMenuItem[] = [] @Input() header?: string @@ -42,7 +42,7 @@ export class DialogMenuComponent { this.navigationHeader.push(this.header) if (this.updateHeaderWithMenuLabel) { - this.header = event.item?.label + this.header = event.item.label } } } diff --git a/desktop/src/shared/components/histogram/histogram.component.ts b/desktop/src/shared/components/histogram/histogram.component.ts index 3a7f917af..1b78ff066 100644 --- a/desktop/src/shared/components/histogram/histogram.component.ts +++ b/desktop/src/shared/components/histogram/histogram.component.ts @@ -9,17 +9,17 @@ export class HistogramComponent implements AfterViewInit { @ViewChild('canvas') private readonly canvas!: ElementRef - private ctx!: CanvasRenderingContext2D + private ctx?: CanvasRenderingContext2D | null ngAfterViewInit() { - this.ctx = this.canvas.nativeElement.getContext('2d')! + this.ctx = this.canvas.nativeElement.getContext('2d') } update(data: number[], dontClear: boolean = false) { const canvas = this.canvas.nativeElement if (!dontClear || !data.length) { - this.ctx.clearRect(0, 0, canvas.width, canvas.height) + this.ctx?.clearRect(0, 0, canvas.width, canvas.height) } if (!data.length) { @@ -32,26 +32,28 @@ export class HistogramComponent implements AfterViewInit { } private drawColorGraph(max: number, data: number[], color: string | CanvasGradient | CanvasPattern) { - const canvas = this.canvas.nativeElement - - const graphHeight = canvas.height - const graphWidth = canvas.width - const graphX = 0 - const graphY = canvas.height - - this.ctx.fillStyle = color - this.ctx.beginPath() - this.ctx.moveTo(graphX, graphHeight) - - for (let i = 0; i < data.length; i++) { - const value = data[i] - const drawHeight = Math.round((value / max) * graphHeight) - const drawX = graphX + (graphWidth / (data.length - 1)) * i - this.ctx.lineTo(drawX, graphY - drawHeight) + if (this.ctx) { + const canvas = this.canvas.nativeElement + + const graphHeight = canvas.height + const graphWidth = canvas.width + const graphX = 0 + const graphY = canvas.height + + this.ctx.fillStyle = color + this.ctx.beginPath() + this.ctx.moveTo(graphX, graphHeight) + + for (let i = 0; i < data.length; i++) { + const value = data[i] + const drawHeight = Math.round((value / max) * graphHeight) + const drawX = graphX + (graphWidth / (data.length - 1)) * i + this.ctx.lineTo(drawX, graphY - drawHeight) + } + + this.ctx.lineTo(graphX + graphWidth, graphY) + this.ctx.closePath() + this.ctx.fill() } - - this.ctx.lineTo(graphX + graphWidth, graphY) - this.ctx.closePath() - this.ctx.fill() } } diff --git a/desktop/src/shared/components/map/map.component.ts b/desktop/src/shared/components/map/map.component.ts index 6344e1b61..c518dd4c7 100644 --- a/desktop/src/shared/components/map/map.component.ts +++ b/desktop/src/shared/components/map/map.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core' +import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core' import * as L from 'leaflet' @Component({ @@ -58,20 +58,18 @@ export class MapComponent implements AfterViewInit, OnChanges { tiles.addTo(this.map) } - ngOnChanges(changes: SimpleChanges) { + ngOnChanges() { const coordinate: L.LatLngLiteral = { lat: this.latitude, lng: this.longitude } - this.map?.setView(coordinate) + this.map.setView(coordinate) this.updateMarker(coordinate) } refresh() { - this.map?.invalidateSize() + this.map.invalidateSize() } private updateMarker(coordinate: L.LatLngExpression) { - if (this.map) { - this.marker?.remove() - this.marker = new L.Marker(coordinate, { icon: this.markerIcon }).addTo(this.map) - } + this.marker?.remove() + this.marker = new L.Marker(coordinate, { icon: this.markerIcon }).addTo(this.map) } } diff --git a/desktop/src/shared/components/menu-item/menu-item.component.ts b/desktop/src/shared/components/menu-item/menu-item.component.ts index 71d73e96a..85f0ff880 100644 --- a/desktop/src/shared/components/menu-item/menu-item.component.ts +++ b/desktop/src/shared/components/menu-item/menu-item.component.ts @@ -19,7 +19,7 @@ export interface MenuItem { visible?: boolean disabled?: boolean severity?: Severity - data?: any + data?: unknown tooltip?: string tooltipPosition?: TooltipPosition @@ -46,6 +46,10 @@ export interface MenuItem { toggle?: (event: InputSwitchChangeEvent) => void } +export interface SlideMenuItem extends MenuItem { + slideMenu: SlideMenuItem[] +} + @Component({ selector: 'neb-menu-item', templateUrl: './menu-item.component.html', diff --git a/desktop/src/shared/components/moon/moon.component.ts b/desktop/src/shared/components/moon/moon.component.ts index e5671c951..2a0837d93 100644 --- a/desktop/src/shared/components/moon/moon.component.ts +++ b/desktop/src/shared/components/moon/moon.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core' +import { AfterViewInit, Component, ElementRef, Input, OnChanges, ViewChild } from '@angular/core' @Component({ selector: 'neb-moon', @@ -25,16 +25,13 @@ export class MoonComponent implements AfterViewInit, OnChanges { this.draw() } - ngOnChanges(changes: SimpleChanges) { + ngOnChanges() { this.draw() } // Adapted from https://codepen.io/ardathksheyna/pen/adMyXx. private draw() { - const canvas = this.moon?.nativeElement - - if (!canvas) return - + const canvas = this.moon.nativeElement const ctx = canvas.getContext('2d')! ctx.clearRect(0, 0, canvas.width, canvas.height) diff --git a/desktop/src/shared/components/path-chooser/path-chooser.component.ts b/desktop/src/shared/components/path-chooser/path-chooser.component.ts index f09515181..66372d72d 100644 --- a/desktop/src/shared/components/path-chooser/path-chooser.component.ts +++ b/desktop/src/shared/components/path-chooser/path-chooser.component.ts @@ -35,8 +35,8 @@ export class PathChooserComponent implements OnChanges { constructor(private electron: ElectronService) {} ngOnChanges(changes: SimpleChanges) { - if (changes.path) { - this.path = changes.path.currentValue + if (changes['path']?.currentValue) { + this.path = changes['path'].currentValue as string } } diff --git a/desktop/src/shared/components/slide-menu/slide-menu.component.ts b/desktop/src/shared/components/slide-menu/slide-menu.component.ts index 0d19987b5..35b305f0b 100644 --- a/desktop/src/shared/components/slide-menu/slide-menu.component.ts +++ b/desktop/src/shared/components/slide-menu/slide-menu.component.ts @@ -1,5 +1,5 @@ import { Component, ElementRef, EventEmitter, Input, OnInit, Output, TemplateRef } from '@angular/core' -import { MenuItem, MenuItemCommandEvent } from '../menu-item/menu-item.component' +import { MenuItemCommandEvent, SlideMenuItem } from '../menu-item/menu-item.component' @Component({ selector: 'neb-slide-menu', @@ -8,20 +8,20 @@ import { MenuItem, MenuItemCommandEvent } from '../menu-item/menu-item.component }) export class SlideMenuComponent implements OnInit { @Input({ required: true }) - readonly model!: MenuItem[] + readonly model!: SlideMenuItem[] @Input() - readonly appendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined | any + readonly appendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined @Output() readonly onNext = new EventEmitter() @Output() - readonly onBack = new EventEmitter() + readonly onBack = new EventEmitter() - currentMenu!: MenuItem[] + currentMenu!: SlideMenuItem[] - private navigation: MenuItem[][] = [] + private navigation: SlideMenuItem[][] = [] ngOnInit() { this.processMenu(this.model, 0) @@ -31,17 +31,17 @@ export class SlideMenuComponent implements OnInit { back(event: MouseEvent) { if (this.navigation.length) { this.currentMenu = this.navigation.splice(this.navigation.length - 1, 1)[0] - this.onBack.emit(undefined) + this.onBack.emit({ originalEvent: event }) } } - private processMenu(menu: MenuItem[], level: number, parentItem?: MenuItem) { + private processMenu(menu: SlideMenuItem[], level: number, parentItem?: SlideMenuItem) { for (const item of menu) { const command = item.command - if (item.slideMenu?.length) { + if (item.slideMenu.length) { item.command = (event: MenuItemCommandEvent) => { - this.currentMenu = item.slideMenu! + this.currentMenu = item.slideMenu this.navigation.push(menu) event.parentItem = parentItem event.level = level diff --git a/desktop/src/shared/constants.ts b/desktop/src/shared/constants.ts index f3f1ac377..337c42205 100644 --- a/desktop/src/shared/constants.ts +++ b/desktop/src/shared/constants.ts @@ -1,4 +1,4 @@ -import { MenuItem } from './components/menu-item/menu-item.component' +import { MenuItem, SlideMenuItem } from './components/menu-item/menu-item.component' export const EVERY_MINUTE_CRON_TIME = '0 */1 * * * *' @@ -17,6 +17,7 @@ export const ONE_DECIMAL_PLACE_FORMATTER = new Intl.NumberFormat('en-US', { maximumFractionDigits: 1, }) -export const SEPARATOR_MENU_ITEM: MenuItem = { +export const SEPARATOR_MENU_ITEM: MenuItem & SlideMenuItem = { separator: true, + slideMenu: [], } diff --git a/desktop/src/shared/dialogs/location/location.dialog.ts b/desktop/src/shared/dialogs/location/location.dialog.ts index 9b93ab817..e98dd7fa0 100644 --- a/desktop/src/shared/dialogs/location/location.dialog.ts +++ b/desktop/src/shared/dialogs/location/location.dialog.ts @@ -1,7 +1,7 @@ import { AfterViewInit, Component, ViewChild } from '@angular/core' import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog' import { MapComponent } from '../../components/map/map.component' -import { Location } from '../../types/atlas.types' +import { EMPTY_LOCATION, Location } from '../../types/atlas.types' @Component({ templateUrl: './location.dialog.html', @@ -17,7 +17,7 @@ export class LocationDialog implements AfterViewInit { private dialogRef: DynamicDialogRef, config: DynamicDialogConfig, ) { - this.location = config.data! + this.location = config.data ?? structuredClone(EMPTY_LOCATION) } ngAfterViewInit() { diff --git a/desktop/src/shared/interceptors/location.interceptor.ts b/desktop/src/shared/interceptors/location.interceptor.ts index 8d5960f11..085a54680 100644 --- a/desktop/src/shared/interceptors/location.interceptor.ts +++ b/desktop/src/shared/interceptors/location.interceptor.ts @@ -7,7 +7,7 @@ import { PreferenceService } from '../services/preference.service' export class LocationInterceptor implements HttpInterceptor { constructor(private preference: PreferenceService) {} - intercept(req: HttpRequest, next: HttpHandler): Observable> { + intercept(req: HttpRequest, next: HttpHandler): Observable> { if (req.urlWithParams.includes('hasLocation')) { const selectedLocation = this.preference.selectedLocation.get() diff --git a/desktop/src/shared/pipes/enum-dropdown.pipe.ts b/desktop/src/shared/pipes/enum-dropdown.pipe.ts index 5a50aed84..ec79a0ddd 100644 --- a/desktop/src/shared/pipes/enum-dropdown.pipe.ts +++ b/desktop/src/shared/pipes/enum-dropdown.pipe.ts @@ -2,8 +2,8 @@ import { Pipe, PipeTransform } from '@angular/core' import { EnumPipe, EnumPipeKey } from './enum.pipe' export interface EnumDropdownItem { - label: EnumPipeKey - value: string + label: string + value: EnumPipeKey } @Pipe({ name: 'enumDropdown' }) diff --git a/desktop/src/shared/pipes/enum.pipe.ts b/desktop/src/shared/pipes/enum.pipe.ts index 43e059356..ca1b25e1a 100644 --- a/desktop/src/shared/pipes/enum.pipe.ts +++ b/desktop/src/shared/pipes/enum.pipe.ts @@ -5,7 +5,7 @@ import { AutoFocusFittingMode, AutoFocusState, BacklashCompensationMode } from ' import { CameraCaptureState, ExposureMode, FrameType, LiveStackerType } from '../types/camera.types' import { FlatWizardState } from '../types/flat-wizard.types' import { GuideDirection, GuideState, GuiderPlotMode, GuiderYAxisUnit } from '../types/guider.types' -import { SCNRProtectionMethod } from '../types/image.types' +import { Bitpix, SCNRProtectionMethod } from '../types/image.types' import { MountRemoteControlType } from '../types/mount.types' import { SequenceCaptureMode } from '../types/sequencer.types' import { PlateSolverType, StarDetectorType } from '../types/settings.types' @@ -34,8 +34,8 @@ export type EnumPipeKey = | GuiderYAxisUnit | MountRemoteControlType | SequenceCaptureMode + | Bitpix | 'ALL' - | string @Pipe({ name: 'enum' }) export class EnumPipe implements PipeTransform { @@ -406,9 +406,16 @@ export class EnumPipe implements PipeTransform { STELLARIUM: 'Stellarium', FULLY: 'Fully', INTERLEAVED: 'Interleaved', + BYTE: 'Byte', + SHORT: 'Short', + INTEGER: 'Integer', + LONG: 'Long', + FLOAT: 'Float', + DOUBLE: 'Double', } - transform(value: EnumPipeKey) { - return this.enums[value] ?? value + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + transform(value: EnumPipeKey | string) { + return this.enums[value as EnumPipeKey] ?? value } } diff --git a/desktop/src/shared/pipes/env.pipe.ts b/desktop/src/shared/pipes/env.pipe.ts index 28d86ad2a..bfec45498 100644 --- a/desktop/src/shared/pipes/env.pipe.ts +++ b/desktop/src/shared/pipes/env.pipe.ts @@ -4,6 +4,6 @@ import { APP_CONFIG } from '../../environments/environment' @Pipe({ name: 'env' }) export class EnvPipe implements PipeTransform { transform(value: string) { - return (APP_CONFIG)[value] + return (APP_CONFIG as unknown as Record)[value] } } diff --git a/desktop/src/shared/pipes/exposureTime.pipe.ts b/desktop/src/shared/pipes/exposureTime.pipe.ts index acf7fd448..210175fae 100644 --- a/desktop/src/shared/pipes/exposureTime.pipe.ts +++ b/desktop/src/shared/pipes/exposureTime.pipe.ts @@ -33,7 +33,7 @@ type UnitFormatter = (value: number) => string const hourFormatter = formatter(TWO_DIGITS_FORMATTER, 'h') const minuteFormatter = formatter(TWO_DIGITS_FORMATTER, 'm') const secondFormatter = formatter(TWO_DIGITS_FORMATTER, 's') -const millisecondFormatter = formatter(THREE_DIGITS_FORMATTER, 'ms') +// const millisecondFormatter = formatter(THREE_DIGITS_FORMATTER, 'ms') function format(value: number, factors: [number, number], formatters: [UnitFormatter, UnitFormatter]) { const a = value / factors[0] diff --git a/desktop/src/shared/pipes/win.pipe.ts b/desktop/src/shared/pipes/win.pipe.ts index 04045dabc..54ba6c1c2 100644 --- a/desktop/src/shared/pipes/win.pipe.ts +++ b/desktop/src/shared/pipes/win.pipe.ts @@ -3,6 +3,6 @@ import { Pipe, PipeTransform } from '@angular/core' @Pipe({ name: 'win' }) export class WinPipe implements PipeTransform { transform(value: string) { - return (window)[value] + return (window as unknown as Record)[value] } } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index e69bfe341..16fdbef71 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -35,7 +35,7 @@ export class ApiService { } disconnect(id: string) { - return this.http.delete(`connection/${id}`) + return this.http.delete(`connection/${id}`) } connectionStatuses() { @@ -57,11 +57,11 @@ export class ApiService { } cameraConnect(camera: Camera) { - return this.http.put(`cameras/${camera.id}/connect`) + return this.http.put(`cameras/${camera.id}/connect`) } cameraDisconnect(camera: Camera) { - return this.http.put(`cameras/${camera.id}/disconnect`) + return this.http.put(`cameras/${camera.id}/disconnect`) } cameraIsCapturing(camera: Camera) { @@ -71,37 +71,37 @@ export class ApiService { cameraSnoop(camera: Camera, equipment: Equipment) { const { mount, wheel, focuser, rotator } = equipment const query = this.http.query({ mount: mount?.id, wheel: wheel?.id, focuser: focuser?.id, rotator: rotator?.id }) - return this.http.put(`cameras/${camera.id}/snoop?${query}`) + return this.http.put(`cameras/${camera.id}/snoop?${query}`) } cameraCooler(camera: Camera, enabled: boolean) { - return this.http.put(`cameras/${camera.id}/cooler?enabled=${enabled}`) + return this.http.put(`cameras/${camera.id}/cooler?enabled=${enabled}`) } cameraSetpointTemperature(camera: Camera, temperature: number) { - return this.http.put(`cameras/${camera.id}/temperature/setpoint?temperature=${temperature}`) + return this.http.put(`cameras/${camera.id}/temperature/setpoint?temperature=${temperature}`) } cameraStartCapture(camera: Camera, data: CameraStartCapture, equipment: Equipment) { const { mount, wheel, focuser, rotator } = equipment const query = this.http.query({ mount: mount?.id, wheel: wheel?.id, focuser: focuser?.id, rotator: rotator?.id }) - return this.http.put(`cameras/${camera.id}/capture/start?${query}`, data) + return this.http.put(`cameras/${camera.id}/capture/start?${query}`, data) } cameraPauseCapture(camera: Camera) { - return this.http.put(`cameras/${camera.id}/capture/pause`) + return this.http.put(`cameras/${camera.id}/capture/pause`) } cameraUnpauseCapture(camera: Camera) { - return this.http.put(`cameras/${camera.id}/capture/unpause`) + return this.http.put(`cameras/${camera.id}/capture/unpause`) } cameraAbortCapture(camera: Camera) { - return this.http.put(`cameras/${camera.id}/capture/abort`) + return this.http.put(`cameras/${camera.id}/capture/abort`) } cameraListen(camera: Camera) { - return this.http.put(`cameras/${camera.id}/listen`) + return this.http.put(`cameras/${camera.id}/listen`) } // MOUNT @@ -115,58 +115,58 @@ export class ApiService { } mountConnect(mount: Mount) { - return this.http.put(`mounts/${mount.id}/connect`) + return this.http.put(`mounts/${mount.id}/connect`) } mountDisconnect(mount: Mount) { - return this.http.put(`mounts/${mount.id}/disconnect`) + return this.http.put(`mounts/${mount.id}/disconnect`) } mountTracking(mount: Mount, enabled: boolean) { - return this.http.put(`mounts/${mount.id}/tracking?enabled=${enabled}`) + return this.http.put(`mounts/${mount.id}/tracking?enabled=${enabled}`) } mountSync(mount: Mount, rightAscension: Angle, declination: Angle, j2000: boolean) { const query = this.http.query({ rightAscension, declination, j2000 }) - return this.http.put(`mounts/${mount.id}/sync?${query}`) + return this.http.put(`mounts/${mount.id}/sync?${query}`) } mountSlew(mount: Mount, rightAscension: Angle, declination: Angle, j2000: boolean) { const query = this.http.query({ rightAscension, declination, j2000 }) - return this.http.put(`mounts/${mount.id}/slew?${query}`) + return this.http.put(`mounts/${mount.id}/slew?${query}`) } mountGoTo(mount: Mount, rightAscension: Angle, declination: Angle, j2000: boolean) { const query = this.http.query({ rightAscension, declination, j2000 }) - return this.http.put(`mounts/${mount.id}/goto?${query}`) + return this.http.put(`mounts/${mount.id}/goto?${query}`) } mountPark(mount: Mount) { - return this.http.put(`mounts/${mount.id}/park`) + return this.http.put(`mounts/${mount.id}/park`) } mountUnpark(mount: Mount) { - return this.http.put(`mounts/${mount.id}/unpark`) + return this.http.put(`mounts/${mount.id}/unpark`) } mountHome(mount: Mount) { - return this.http.put(`mounts/${mount.id}/home`) + return this.http.put(`mounts/${mount.id}/home`) } mountAbort(mount: Mount) { - return this.http.put(`mounts/${mount.id}/abort`) + return this.http.put(`mounts/${mount.id}/abort`) } mountTrackMode(mount: Mount, mode: TrackMode) { - return this.http.put(`mounts/${mount.id}/track-mode?mode=${mode}`) + return this.http.put(`mounts/${mount.id}/track-mode?mode=${mode}`) } mountSlewRate(mount: Mount, rate: SlewRate) { - return this.http.put(`mounts/${mount.id}/slew-rate?rate=${rate.name}`) + return this.http.put(`mounts/${mount.id}/slew-rate?rate=${rate.name}`) } mountMove(mount: Mount, direction: GuideDirection, enabled: boolean) { - return this.http.put(`mounts/${mount.id}/move?direction=${direction}&enabled=${enabled}`) + return this.http.put(`mounts/${mount.id}/move?direction=${direction}&enabled=${enabled}`) } mountComputeLocation(mount: Mount, j2000: boolean, rightAscension: Angle, declination: Angle, equatorial: boolean = true, horizontal: boolean = true, meridianAt: boolean = false) { @@ -180,12 +180,12 @@ export class ApiService { pointMountHere(mount: Mount, path: string, x: number, y: number) { const query = this.http.query({ path, x, y }) - return this.http.put(`mounts/${mount.id}/point-here?${query}`) + return this.http.put(`mounts/${mount.id}/point-here?${query}`) } mountRemoteControlStart(mount: Mount, type: MountRemoteControlType, host: string, port: number) { const query = this.http.query({ type, host, port }) - return this.http.put(`mounts/${mount.id}/remote-control/start?${query}`) + return this.http.put(`mounts/${mount.id}/remote-control/start?${query}`) } mountRemoteControlList(mount: Mount) { @@ -194,11 +194,11 @@ export class ApiService { mountRemoteControlStop(mount: Mount, type: MountRemoteControlType) { const query = this.http.query({ type }) - return this.http.put(`mounts/${mount.id}/remote-control/stop?${query}`) + return this.http.put(`mounts/${mount.id}/remote-control/stop?${query}`) } mountListen(mount: Mount) { - return this.http.put(`mounts/${mount.id}/listen`) + return this.http.put(`mounts/${mount.id}/listen`) } // FOCUSER @@ -212,35 +212,35 @@ export class ApiService { } focuserConnect(focuser: Focuser) { - return this.http.put(`focusers/${focuser.id}/connect`) + return this.http.put(`focusers/${focuser.id}/connect`) } focuserDisconnect(focuser: Focuser) { - return this.http.put(`focusers/${focuser.id}/disconnect`) + return this.http.put(`focusers/${focuser.id}/disconnect`) } focuserMoveIn(focuser: Focuser, steps: number) { - return this.http.put(`focusers/${focuser.id}/move-in?steps=${steps}`) + return this.http.put(`focusers/${focuser.id}/move-in?steps=${steps}`) } focuserMoveOut(focuser: Focuser, steps: number) { - return this.http.put(`focusers/${focuser.id}/move-out?steps=${steps}`) + return this.http.put(`focusers/${focuser.id}/move-out?steps=${steps}`) } focuserMoveTo(focuser: Focuser, steps: number) { - return this.http.put(`focusers/${focuser.id}/move-to?steps=${steps}`) + return this.http.put(`focusers/${focuser.id}/move-to?steps=${steps}`) } focuserAbort(focuser: Focuser) { - return this.http.put(`focusers/${focuser.id}/abort`) + return this.http.put(`focusers/${focuser.id}/abort`) } focuserSync(focuser: Focuser, steps: number) { - return this.http.put(`focusers/${focuser.id}/sync?steps=${steps}`) + return this.http.put(`focusers/${focuser.id}/sync?steps=${steps}`) } focuserListen(focuser: Focuser) { - return this.http.put(`focusers/${focuser.id}/listen`) + return this.http.put(`focusers/${focuser.id}/listen`) } // FILTER WHEEL @@ -254,23 +254,23 @@ export class ApiService { } wheelConnect(wheel: FilterWheel) { - return this.http.put(`wheels/${wheel.id}/connect`) + return this.http.put(`wheels/${wheel.id}/connect`) } wheelDisconnect(wheel: FilterWheel) { - return this.http.put(`wheels/${wheel.id}/disconnect`) + return this.http.put(`wheels/${wheel.id}/disconnect`) } wheelMoveTo(wheel: FilterWheel, position: number) { - return this.http.put(`wheels/${wheel.id}/move-to?position=${position}`) + return this.http.put(`wheels/${wheel.id}/move-to?position=${position}`) } wheelSync(wheel: FilterWheel, names: string[]) { - return this.http.put(`wheels/${wheel.id}/sync?names=${names.join(',')}`) + return this.http.put(`wheels/${wheel.id}/sync?names=${names.join(',')}`) } wheelListen(wheel: FilterWheel) { - return this.http.put(`wheels/${wheel.id}/listen`) + return this.http.put(`wheels/${wheel.id}/listen`) } // ROTATOR @@ -284,35 +284,35 @@ export class ApiService { } rotatorConnect(rotator: Rotator) { - return this.http.put(`rotators/${rotator.id}/connect`) + return this.http.put(`rotators/${rotator.id}/connect`) } rotatorDisconnect(rotator: Rotator) { - return this.http.put(`rotators/${rotator.id}/disconnect`) + return this.http.put(`rotators/${rotator.id}/disconnect`) } rotatorReverse(rotator: Rotator, enabled: boolean) { - return this.http.put(`rotators/${rotator.id}/reverse?enabled=${enabled}`) + return this.http.put(`rotators/${rotator.id}/reverse?enabled=${enabled}`) } rotatorMove(rotator: Rotator, angle: number) { - return this.http.put(`rotators/${rotator.id}/move?angle=${angle}`) + return this.http.put(`rotators/${rotator.id}/move?angle=${angle}`) } rotatorAbort(rotator: Rotator) { - return this.http.put(`rotators/${rotator.id}/abort`) + return this.http.put(`rotators/${rotator.id}/abort`) } rotatorHome(rotator: Rotator) { - return this.http.put(`rotators/${rotator.id}/home`) + return this.http.put(`rotators/${rotator.id}/home`) } rotatorSync(rotator: Rotator, angle: number) { - return this.http.put(`rotators/${rotator.id}/sync?angle=${angle}`) + return this.http.put(`rotators/${rotator.id}/sync?angle=${angle}`) } rotatorListen(rotator: Rotator) { - return this.http.put(`rotators/${rotator.id}/listen`) + return this.http.put(`rotators/${rotator.id}/listen`) } // GUIDE OUTPUT @@ -326,31 +326,31 @@ export class ApiService { } guideOutputConnect(guideOutput: GuideOutput) { - return this.http.put(`guide-outputs/${guideOutput.id}/connect`) + return this.http.put(`guide-outputs/${guideOutput.id}/connect`) } guideOutputDisconnect(guideOutput: GuideOutput) { - return this.http.put(`guide-outputs/${guideOutput.id}/disconnect`) + return this.http.put(`guide-outputs/${guideOutput.id}/disconnect`) } guideOutputPulse(guideOutput: GuideOutput, direction: GuideDirection, duration: number) { const query = this.http.query({ direction, duration }) - return this.http.put(`guide-outputs/${guideOutput.id}/pulse?${query}`) + return this.http.put(`guide-outputs/${guideOutput.id}/pulse?${query}`) } guideOutputListen(guideOutput: GuideOutput) { - return this.http.put(`guide-outputs/${guideOutput.id}/listen`) + return this.http.put(`guide-outputs/${guideOutput.id}/listen`) } // GUIDING guidingConnect(host: string = 'localhost', port: number = 4400) { const query = this.http.query({ host, port }) - return this.http.put(`guiding/connect?${query}`) + return this.http.put(`guiding/connect?${query}`) } guidingDisconnect() { - return this.http.delete(`guiding/disconnect`) + return this.http.delete(`guiding/disconnect`) } guidingStatus() { @@ -367,26 +367,26 @@ export class ApiService { } guidingClearHistory() { - return this.http.put(`guiding/history/clear`) + return this.http.put(`guiding/history/clear`) } guidingLoop(autoSelectGuideStar: boolean = true) { const query = this.http.query({ autoSelectGuideStar }) - return this.http.put(`guiding/loop?${query}`) + return this.http.put(`guiding/loop?${query}`) } guidingStart(forceCalibration: boolean = false) { const query = this.http.query({ forceCalibration }) - return this.http.put(`guiding/start?${query}`) + return this.http.put(`guiding/start?${query}`) } guidingDither(amount: number, raOnly: boolean = false) { const query = this.http.query({ amount, raOnly }) - return this.http.put(`guiding/dither?${query}`) + return this.http.put(`guiding/dither?${query}`) } setGuidingSettle(settle: SettleInfo) { - return this.http.put(`guiding/settle`, settle) + return this.http.put(`guiding/settle`, settle) } getGuidingSettle() { @@ -394,21 +394,27 @@ export class ApiService { } guidingStop() { - return this.http.put(`guiding/stop`) + return this.http.put(`guiding/stop`) } // IMAGE - async openImage(path: string, transformation: ImageTransformation, camera?: Camera) { + async openImage(path: string, transformation: ImageTransformation, camera?: Camera): Promise<{ blob: Blob | null; info?: ImageInfo }> { const query = this.http.query({ path, camera: camera?.id }) const response = await this.http.postBlob(`image?${query}`, transformation) - const info = JSON.parse(response.headers.get('X-Image-Info')!) as ImageInfo - return { info, blob: response.body! } + const header = response.headers.get('X-Image-Info') + + if (header) { + const info = JSON.parse(header) as ImageInfo + return { info, blob: response.body } + } else { + return { blob: response.body } + } } closeImage(path: string) { const query = this.http.query({ path }) - return this.http.delete(`image?${query}`) + return this.http.delete(`image?${query}`) } // INDI @@ -418,27 +424,27 @@ export class ApiService { } indiDeviceConnect(device: Device) { - return this.http.put(`indi/${device.id}/connect`) + return this.http.put(`indi/${device.id}/connect`) } indiDeviceDisconnect(device: Device) { - return this.http.put(`indi/${device.id}/disconnect`) + return this.http.put(`indi/${device.id}/disconnect`) } indiProperties(device: Device) { - return this.http.get[]>(`indi/${device.id}/properties`) + return this.http.get(`indi/${device.id}/properties`) } indiSendProperty(device: Device, property: INDISendProperty) { - return this.http.put(`indi/${device.id}/send`, property) + return this.http.put(`indi/${device.id}/send`, property) } indiListen(device: Device) { - return this.http.put(`indi/${device.id}/listen`) + return this.http.put(`indi/${device.id}/listen`) } indiUnlisten(device: Device) { - return this.http.put(`indi/${device.id}/unlisten`) + return this.http.put(`indi/${device.id}/unlisten`) } indiLog(device: Device) { @@ -545,7 +551,7 @@ export class ApiService { saveImageAs(path: string, save: ImageSaveDialog, camera?: Camera) { const query = this.http.query({ path, camera: camera?.id }) - return this.http.put(`image/save-as?${query}`, save) + return this.http.put(`image/save-as?${query}`, save) } coordinateInterpolation(path: string) { @@ -592,7 +598,7 @@ export class ApiService { } deleteCalibrationFrame(frame: CalibrationFrame) { - return this.http.delete(`calibration-frames/${frame.id}`) + return this.http.delete(`calibration-frames/${frame.id}`) } // FRAMING @@ -609,29 +615,29 @@ export class ApiService { // DARV darvStart(camera: Camera, guideOutput: GuideOutput, data: DARVStart) { - return this.http.put(`polar-alignment/darv/${camera.id}/${guideOutput.id}/start`, data) + return this.http.put(`polar-alignment/darv/${camera.id}/${guideOutput.id}/start`, data) } darvStop(camera: Camera) { - return this.http.put(`polar-alignment/darv/${camera.id}/stop`) + return this.http.put(`polar-alignment/darv/${camera.id}/stop`) } // TPPA tppaStart(camera: Camera, mount: Mount, data: TPPAStart) { - return this.http.put(`polar-alignment/tppa/${camera.id}/${mount.id}/start`, data) + return this.http.put(`polar-alignment/tppa/${camera.id}/${mount.id}/start`, data) } tppaStop(camera: Camera) { - return this.http.put(`polar-alignment/tppa/${camera.id}/stop`) + return this.http.put(`polar-alignment/tppa/${camera.id}/stop`) } tppaPause(camera: Camera) { - return this.http.put(`polar-alignment/tppa/${camera.id}/pause`) + return this.http.put(`polar-alignment/tppa/${camera.id}/pause`) } tppaUnpause(camera: Camera) { - return this.http.put(`polar-alignment/tppa/${camera.id}/unpause`) + return this.http.put(`polar-alignment/tppa/${camera.id}/unpause`) } // SEQUENCER @@ -639,21 +645,21 @@ export class ApiService { sequencerStart(camera: Camera, plan: SequencePlan) { const body: SequencePlan = { ...plan, mount: undefined, camera: undefined, wheel: undefined, focuser: undefined } const query = this.http.query({ mount: plan.mount?.id, focuser: plan.focuser?.id, wheel: plan.wheel?.id }) - return this.http.put(`sequencer/${camera.id}/start?${query}`, body) + return this.http.put(`sequencer/${camera.id}/start?${query}`, body) } sequencerStop(camera: Camera) { - return this.http.put(`sequencer/${camera.id}/stop`) + return this.http.put(`sequencer/${camera.id}/stop`) } // FLAT WIZARD flatWizardStart(camera: Camera, request: FlatWizardRequest) { - return this.http.put(`flat-wizard/${camera.id}/start`, request) + return this.http.put(`flat-wizard/${camera.id}/start`, request) } flatWizardStop(camera: Camera) { - return this.http.put(`flat-wizard/${camera.id}/stop`) + return this.http.put(`flat-wizard/${camera.id}/stop`) } // SOLVER @@ -666,29 +672,29 @@ export class ApiService { // AUTO FOCUS autoFocusStart(camera: Camera, focuser: Focuser, request: AutoFocusRequest) { - return this.http.put(`auto-focus/${camera.id}/${focuser.id}/start`, request) + return this.http.put(`auto-focus/${camera.id}/${focuser.id}/start`, request) } autoFocusStop(camera: Camera) { - return this.http.put(`auto-focus/${camera.id}/stop`) + return this.http.put(`auto-focus/${camera.id}/stop`) } // PREFERENCE clearPreferences() { - return this.http.put('preferences/clear') + return this.http.put('preferences/clear') } deletePreference(key: string) { - return this.http.delete(`preferences/${key}`) + return this.http.delete(`preferences/${key}`) } getPreference(key: string) { return this.http.get(`preferences/${key}`) } - setPreference(key: string, data: any) { - return this.http.put(`preferences/${key}`, { data }) + setPreference(key: string, data: unknown) { + return this.http.put(`preferences/${key}`, { data }) } hasPreference(key: string) { diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 2ea362e3b..162908ca5 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -27,7 +27,7 @@ export class BrowserWindowService { openMount(data: Mount, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'telescope', width: 400, height: 477 }) - this.openWindow({ preference, data, id: `mount.${data.name}`, path: 'mount' }) + return this.openWindow({ preference, data, id: `mount.${data.name}`, path: 'mount' }) } openCamera(data: Camera, preference: WindowPreference = {}) { @@ -47,17 +47,17 @@ export class BrowserWindowService { openFocuser(data: Focuser, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'focus', width: 252, height: 252 }) - this.openWindow({ preference, data, id: `focuser.${data.name}`, path: 'focuser' }) + return this.openWindow({ preference, data, id: `focuser.${data.name}`, path: 'focuser' }) } openWheel(data: FilterWheel, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'filter-wheel', width: 280, height: 195 }) - this.openWindow({ preference, data, id: `wheel.${data.name}`, path: 'wheel' }) + return this.openWindow({ preference, data, id: `wheel.${data.name}`, path: 'wheel' }) } openRotator(data: Rotator, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'rotate', width: 280, height: 210 }) - this.openWindow({ preference, data, id: `rotator.${data.name}`, path: 'rotator' }) + return this.openWindow({ preference, data, id: `rotator.${data.name}`, path: 'rotator' }) } openWheelDialog(data: WheelDialogInput, preference: WindowPreference = {}) { @@ -72,7 +72,7 @@ export class BrowserWindowService { openGuider(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'guider', width: 440, height: 455 }) - this.openWindow({ preference, id: 'guider', path: 'guider' }) + return this.openWindow({ preference, id: 'guider', path: 'guider' }) } async openCameraImage(camera: Camera, source: ImageSource = 'CAMERA', capture?: CameraStartCapture) { @@ -94,56 +94,56 @@ export class BrowserWindowService { openINDI(data: Device | undefined, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'indi', width: 760, height: 420, resizable: true }) - this.openWindow({ preference, data, id: 'indi', path: 'indi' }) + return this.openWindow({ preference, data, id: 'indi', path: 'indi' }) } openSkyAtlas(data: SkyAtlasData | undefined, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'atlas', width: 450, height: 530, autoResizable: false }) - this.openWindow({ preference, data, id: 'atlas', path: 'atlas' }) + return this.openWindow({ preference, data, id: 'atlas', path: 'atlas' }) } openFraming(data: FramingData | undefined, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'framing', width: 280, height: 303 }) - this.openWindow({ preference, data, id: 'framing', path: 'framing' }) + return this.openWindow({ preference, data, id: 'framing', path: 'framing' }) } openAlignment(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'star', width: 425, height: 365 }) - this.openWindow({ preference, id: 'alignment', path: 'alignment' }) + return this.openWindow({ preference, id: 'alignment', path: 'alignment' }) } openSequencer(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'workflow', width: 630, height: 570, resizable: true }) - this.openWindow({ preference, id: 'sequencer', path: 'sequencer' }) + return this.openWindow({ preference, id: 'sequencer', path: 'sequencer' }) } openAutoFocus(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'auto-focus', width: 425, height: 420 }) - this.openWindow({ preference, id: 'auto-focus', path: 'auto-focus' }) + return this.openWindow({ preference, id: 'auto-focus', path: 'auto-focus' }) } openFlatWizard(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'star', width: 385, height: 370 }) - this.openWindow({ preference, id: 'flat-wizard', path: 'flat-wizard' }) + return this.openWindow({ preference, id: 'flat-wizard', path: 'flat-wizard' }) } openSettings(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'settings', width: 350, height: 450, autoResizable: false }) - this.openWindow({ preference, id: 'settings', path: 'settings' }) + return this.openWindow({ preference, id: 'settings', path: 'settings' }) } openCalculator(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'calculator', width: 345, height: 340 }) - this.openWindow({ preference, id: 'calculator', path: 'calculator' }) + return this.openWindow({ preference, id: 'calculator', path: 'calculator' }) } openCalibration(preference: WindowPreference = {}) { Object.assign(preference, { icon: 'stack', width: 420, height: 400, minHeight: 400 }) - this.openWindow({ preference, id: 'calibration', path: 'calibration' }) + return this.openWindow({ preference, id: 'calibration', path: 'calibration' }) } openAbout() { const preference: WindowPreference = { icon: 'about', width: 430, height: 307, bringToFront: true } - this.openWindow({ preference, id: 'about', path: 'about' }) + return this.openWindow({ preference, id: 'about', path: 'about' }) } } diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index f07b77148..a032b93e2 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -54,7 +54,7 @@ type EventMappedType = { 'GUIDER.MESSAGE_RECEIVED': GuiderMessageEvent 'DARV.ELAPSED': DARVEvent 'TPPA.ELAPSED': TPPAEvent - 'DATA.CHANGED': any + 'DATA.CHANGED': never 'LOCATION.CHANGED': Location 'SEQUENCER.ELAPSED': SequencerEvent 'FLAT_WIZARD.ELAPSED': FlatWizardEvent @@ -86,12 +86,12 @@ export class ElectronService { constructor() { if (this.isElectron) { - this.ipcRenderer = (window as any).require('electron').ipcRenderer - this.webFrame = (window as any).require('electron').webFrame + this.ipcRenderer = window.require('electron').ipcRenderer + this.webFrame = window.require('electron').webFrame - this.fs = (window as any).require('fs') + this.fs = window.require('fs') - this.childProcess = (window as any).require('child_process') + this.childProcess = window.require('child_process') this.childProcess.exec('node -v') // Notes : @@ -109,6 +109,7 @@ export class ElectronService { } get isElectron() { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition return !!(window && window.process && window.process.type) } @@ -118,7 +119,10 @@ export class ElectronService { on(channel: K, listener: (arg: EventMappedType[K]) => void) { console.info('listening to channel: %s', channel) - this.ipcRenderer.on(channel, (_, arg) => listener(arg)) + + this.ipcRenderer.on(channel, (_, arg) => { + listener(arg) + }) } openFile(data?: OpenFile): Promise { @@ -187,35 +191,37 @@ export class ElectronService { } resizeWindow(size: number) { - this.send('WINDOW.RESIZE', Math.floor(size)) + return this.send('WINDOW.RESIZE', Math.floor(size)) } - autoResizeWindow(timeout: number = 500): any { + async autoResizeWindow(timeout: number = 500): Promise { if (timeout <= 0) { - const size = document.getElementsByTagName('app-root')[0]?.getBoundingClientRect()?.height + const size = document.getElementsByTagName('app-root')[0].getBoundingClientRect().height - if (size > 0) { - this.resizeWindow(size) + if (size) { + await this.resizeWindow(size) } } else { - return setTimeout(() => this.autoResizeWindow(0), timeout) + return setTimeout(() => this.autoResizeWindow(0), timeout) as unknown as number } + + return undefined } pinWindow() { - this.send('WINDOW.PIN') + return this.send('WINDOW.PIN') } unpinWindow() { - this.send('WINDOW.UNPIN') + return this.send('WINDOW.UNPIN') } minimizeWindow() { - this.send('WINDOW.MINIMIZE') + return this.send('WINDOW.MINIMIZE') } maximizeWindow() { - this.send('WINDOW.MAXIMIZE') + return this.send('WINDOW.MAXIMIZE') } fullscreenWindow(enabled?: boolean): Promise { @@ -227,6 +233,6 @@ export class ElectronService { } calibrationChanged() { - this.send('CALIBRATION.CHANGED') + return this.send('CALIBRATION.CHANGED') } } diff --git a/desktop/src/shared/services/http.service.ts b/desktop/src/shared/services/http.service.ts index fa608e54f..17922050e 100644 --- a/desktop/src/shared/services/http.service.ts +++ b/desktop/src/shared/services/http.service.ts @@ -20,33 +20,33 @@ export class HttpService { return firstValueFrom(this.http.get(`${this.baseUrl}/${path}`, { observe: 'response', responseType: 'blob' })) } - post(path: string, body?: any) { + post(path: string, body?: unknown) { return firstValueFrom(this.http.post(`${this.baseUrl}/${path}`, body)) } - postBodyAsQueryParams(path: string, body: Record) { + postBodyAsQueryParams(path: string, body: Record) { const query = this.query(body) return firstValueFrom(this.http.post(`${this.baseUrl}/${path}?${query}`, null)) } - postBlob(path: string, body?: any) { + postBlob(path: string, body?: unknown) { return firstValueFrom(this.http.post(`${this.baseUrl}/${path}`, body, { observe: 'response', responseType: 'blob' })) } - patch(path: string, body?: any) { + patch(path: string, body?: unknown) { return firstValueFrom(this.http.patch(`${this.baseUrl}/${path}`, body)) } - put(path: string, body?: any) { + put(path: string, body?: unknown) { return firstValueFrom(this.http.put(`${this.baseUrl}/${path}`, body)) } - putBodyAsQueryParams(path: string, body: Record) { + putBodyAsQueryParams(path: string, body: Record) { const query = this.query(body) return firstValueFrom(this.http.put(`${this.baseUrl}/${path}?${query}`, null)) } - putBlob(path: string, body?: any) { + putBlob(path: string, body?: unknown) { return firstValueFrom(this.http.put(`${this.baseUrl}/${path}`, body, { observe: 'response', responseType: 'blob' })) } diff --git a/desktop/src/shared/services/local-storage.service.ts b/desktop/src/shared/services/local-storage.service.ts index d11eb2293..e4ac63d92 100644 --- a/desktop/src/shared/services/local-storage.service.ts +++ b/desktop/src/shared/services/local-storage.service.ts @@ -4,17 +4,17 @@ import { StorageService } from './storage.service' @Injectable({ providedIn: 'root' }) export class LocalStorageService implements StorageService { clear() { - return localStorage.clear() + localStorage.clear() } delete(key: string) { - return localStorage.removeItem(key) + localStorage.removeItem(key) } get(key: string, defaultValue: T | (() => T)): T { const value = localStorage.getItem(key) - if (value === undefined || value === null) { + if (value === null) { return defaultValue instanceof Function ? defaultValue() : defaultValue } @@ -31,8 +31,8 @@ export class LocalStorageService implements StorageService { return false } - set(key: string, value: any) { - if (value === null || value === undefined) return this.delete(key) - else return localStorage.setItem(key, JSON.stringify(value)) + set(key: string, value: unknown) { + if (value === null || value === undefined) this.delete(key) + else localStorage.setItem(key, JSON.stringify(value)) } } diff --git a/desktop/src/shared/services/pinger.service.ts b/desktop/src/shared/services/pinger.service.ts index c5870df1c..dd4123a81 100644 --- a/desktop/src/shared/services/pinger.service.ts +++ b/desktop/src/shared/services/pinger.service.ts @@ -6,7 +6,7 @@ export interface Pingable { @Injectable({ providedIn: 'root' }) export class Pinger { - private readonly pingables = new Map() + private readonly pingables = new Map() isRegistered(pingable: Pingable) { return this.pingables.has(pingable) @@ -16,13 +16,17 @@ export class Pinger { this.unregister(pingable) if (interval > 0) { - if (initialDelay <= 0) pingable.ping() - else if (initialDelay < interval - 1000) setTimeout(() => pingable.ping(), initialDelay) + if (initialDelay > 0 && initialDelay < interval - 1000) { + setTimeout(() => { + pingable.ping() + }, initialDelay) + } - this.pingables.set( - pingable, - setInterval(() => pingable.ping(), interval), - ) + const ping = setInterval(() => { + pingable.ping() + }, interval) as unknown as number + + this.pingables.set(pingable, ping) } } diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index fb50de626..fe880ad00 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -9,6 +9,7 @@ import { Device } from '../types/device.types' import { Focuser, FocuserPreference } from '../types/focuser.types' import { ConnectionDetails, Equipment, HomePreference } from '../types/home.types' import { EMPTY_IMAGE_PREFERENCE, FOV, ImagePreference } from '../types/image.types' +import { EMPTY_MOUNT_PREFERENCE, Mount, MountPreference } from '../types/mount.types' import { Rotator, RotatorPreference } from '../types/rotator.types' import { EMPTY_PLATE_SOLVER_REQUEST, EMPTY_STAR_DETECTION_REQUEST, PlateSolverRequest, PlateSolverType, StarDetectionRequest, StarDetectorType } from '../types/settings.types' import { FilterWheel, WheelPreference } from '../types/wheel.types' @@ -66,6 +67,10 @@ export class PreferenceService { return new PreferenceData(this.storage, `camera.${camera.name}.autoFocus`, () => this.cameraPreference(camera).get()) } + mountPreference(mount: Mount) { + return new PreferenceData(this.storage, `mount.${mount.name}`, () => structuredClone(EMPTY_MOUNT_PREFERENCE)) + } + plateSolverRequest(type: PlateSolverType) { return new PreferenceData(this.storage, `plateSolver.${type}`, () => { ...EMPTY_PLATE_SOLVER_REQUEST, type }) } diff --git a/desktop/src/shared/services/prime.service.ts b/desktop/src/shared/services/prime.service.ts index 94136c938..ad4822eed 100644 --- a/desktop/src/shared/services/prime.service.ts +++ b/desktop/src/shared/services/prime.service.ts @@ -10,7 +10,7 @@ export class PrimeService { private messager: MessageService, ) {} - open(componentType: Type, config: DynamicDialogConfig) { + open(componentType: Type, config: DynamicDialogConfig) { const ref = this.dialog.open(componentType, { ...config, draggable: config.draggable ?? true, @@ -27,9 +27,9 @@ export class PrimeService { }) return new Promise((resolve) => { - const subscription = ref.onClose.subscribe((data) => { + const subscription = ref.onClose.subscribe((data?: R) => { subscription.unsubscribe() - resolve(data ?? undefined) + resolve(data) }) }) } diff --git a/desktop/src/shared/services/remote-storage.service.ts b/desktop/src/shared/services/remote-storage.service.ts index 3133ae591..ff7853dd8 100644 --- a/desktop/src/shared/services/remote-storage.service.ts +++ b/desktop/src/shared/services/remote-storage.service.ts @@ -15,14 +15,14 @@ export class RemoteStorageService implements StorageService { } async get(key: string, defaultValue: T) { - return (await this.api.getPreference(key)) ?? defaultValue + return (await this.api.getPreference(key)) ?? defaultValue } has(key: string) { return this.api.hasPreference(key) } - set(key: string, value: any) { + set(key: string, value: unknown) { if (value === null || value === undefined) return this.delete(key) else return this.api.setPreference(key, value) } diff --git a/desktop/src/shared/services/storage.service.ts b/desktop/src/shared/services/storage.service.ts index 75c864b4b..32bfce52c 100644 --- a/desktop/src/shared/services/storage.service.ts +++ b/desktop/src/shared/services/storage.service.ts @@ -7,5 +7,5 @@ export interface StorageService { has(key: string): Promise | boolean - set(key: string, value: any): void + set(key: string, value: unknown): void } diff --git a/desktop/src/shared/types/app.types.ts b/desktop/src/shared/types/app.types.ts index 33828fcda..46f88162e 100644 --- a/desktop/src/shared/types/app.types.ts +++ b/desktop/src/shared/types/app.types.ts @@ -50,12 +50,12 @@ export interface OpenWindow { id: string path: string preference: WindowPreference - data?: any + data?: unknown } export interface CloseWindow { id?: string - data?: any + data?: unknown } export interface OpenDirectory { @@ -66,12 +66,12 @@ export interface OpenFile extends OpenDirectory { filters?: Electron.FileFilter[] } -export interface JsonFile { +export interface JsonFile { path?: string json: T } -export type SaveJson = OpenFile & JsonFile +export interface SaveJson extends OpenFile, JsonFile {} export interface StoredWindowData { [key: `window.${string}`]: { diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index e762595df..047467024 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -1,4 +1,3 @@ -import { NotificationEvent } from './app.types' import { PierSide } from './mount.types' export type Angle = string | number @@ -312,6 +311,11 @@ export interface Twilight { export type MinorPlanetKind = 'ASTEROID' | 'COMET' +export interface MinorPlanetSearchItem { + name: string + pdes: string +} + export interface MinorPlanet { found: boolean name: string @@ -321,7 +325,7 @@ export interface MinorPlanet { neo: boolean orbitType: string parameters: OrbitalPhysicalParameter[] - searchItems: { name: string; pdes: string }[] + searchItems: MinorPlanetSearchItem[] } export interface OrbitalPhysicalParameter { diff --git a/desktop/src/shared/types/autofocus.type.ts b/desktop/src/shared/types/autofocus.type.ts index 74e938236..f2bb585ec 100644 --- a/desktop/src/shared/types/autofocus.type.ts +++ b/desktop/src/shared/types/autofocus.type.ts @@ -70,7 +70,7 @@ export interface TrendLineCurve extends Curve { intersection: Point } -export interface CurveChart { +export interface AutoFocusChart { predictedFocusPoint?: Point minX: number maxX: number @@ -87,6 +87,6 @@ export interface AutoFocusEvent { determinedFocusPoint?: Point starCount: number starHFD: number - chart?: CurveChart + chart?: AutoFocusChart capture?: CameraCaptureEvent } diff --git a/desktop/src/shared/types/camera.types.ts b/desktop/src/shared/types/camera.types.ts index 331d82a82..f656eff2b 100644 --- a/desktop/src/shared/types/camera.types.ts +++ b/desktop/src/shared/types/camera.types.ts @@ -195,7 +195,6 @@ export const EMPTY_CAMERA_START_CAPTURE: CameraStartCapture = { enabled: false, type: 'SIRIL', executablePath: '', - rotate: 0, use32Bits: false, slot: 1, }, @@ -293,7 +292,6 @@ export interface LiveStackingRequest { dark?: string flat?: string bias?: string - rotate: number use32Bits: boolean slot: number } @@ -302,7 +300,6 @@ export const EMPTY_LIVE_STACKING_REQUEST: LiveStackingRequest = { enabled: false, type: 'SIRIL', executablePath: '', - rotate: 0, use32Bits: false, slot: 1, } diff --git a/desktop/src/shared/types/device.types.ts b/desktop/src/shared/types/device.types.ts index bdc0662ea..0805b69cd 100644 --- a/desktop/src/shared/types/device.types.ts +++ b/desktop/src/shared/types/device.types.ts @@ -22,11 +22,11 @@ export interface CompanionDevice extends Device { } export interface INDIMessageEvent extends DeviceMessageEvent { - property?: INDIProperty + property?: INDIProperty message?: string } -export interface INDIProperty { +export interface INDIProperty { name: string label: string type: INDIPropertyType @@ -52,7 +52,7 @@ export interface INDISendProperty { export interface INDISendPropertyItem { name: string - value: any + value: unknown } export interface INDIDeviceMessage { diff --git a/desktop/src/shared/types/mount.types.ts b/desktop/src/shared/types/mount.types.ts index b416459ae..92276bc9e 100644 --- a/desktop/src/shared/types/mount.types.ts +++ b/desktop/src/shared/types/mount.types.ts @@ -97,6 +97,18 @@ export interface MountRemoteControlDialog { data: MountRemoteControl[] } +export interface MountPreference { + targetCoordinateType: TargetCoordinateType + targetRightAscension: Angle + targetDeclination: Angle +} + +export const EMPTY_MOUNT_PREFERENCE: MountPreference = { + targetCoordinateType: 'JNOW', + targetRightAscension: '', + targetDeclination: '', +} + export function isMount(device?: Device): device is Mount { return !!device && 'tracking' in device } diff --git a/desktop/src/shared/types/settings.types.ts b/desktop/src/shared/types/settings.types.ts index cfcc256ae..278504800 100644 --- a/desktop/src/shared/types/settings.types.ts +++ b/desktop/src/shared/types/settings.types.ts @@ -24,8 +24,8 @@ export interface StarDetectionRequest { type: StarDetectorType executablePath: string timeout: number - minSNR: number - maxStars: number + minSNR?: number + maxStars?: number slot: number } diff --git a/desktop/src/shared/utils/angle.ts b/desktop/src/shared/utils/angle.ts index 697ac2fb1..405d59d9b 100644 --- a/desktop/src/shared/utils/angle.ts +++ b/desktop/src/shared/utils/angle.ts @@ -9,10 +9,9 @@ export function degreesToRadians(deg: number) { } export function formatAngle(angle: number, range: AngleRange, sign: boolean, precision: number = 0, units: boolean = true) { - const d = decimalToSexagesimal(angle) - let dd = d[1] - let mm = d[2] - let ss = d[3] + const parts = decimalToSexagesimal(angle) + let [, dd, mm, ss] = parts + const [s] = parts ss = roundTo(ss, precision) @@ -51,17 +50,17 @@ export function formatAngle(angle: number, range: AngleRange, sign: boolean, pre } } - let result = ((sign && (d[0] < 0 ? '-' : '+')) || '') + zeroPadded(dd, dw) + du + zeroPadded(mm, 2) + mu + zeroPadded(ss, 2) + let result = (sign ? s : '') + zeroPadded(dd, dw) + du + zeroPadded(mm, 2) + mu + zeroPadded(ss, 2) if (precision > 0) result += '.' + zeroPadded(ff, precision) if (units) result += su return result } -function decimalToSexagesimal(d: number) { +function decimalToSexagesimal(d: number): [string, number, number, number] { const t1 = Math.abs(d) const t2 = (t1 - Math.trunc(t1)) * 60 - return [d < 0 ? -1 : +1, Math.trunc(t1), Math.trunc(t2), (t2 - Math.trunc(t2)) * 60] + return [d < 0 ? '-' : '+', Math.trunc(t1), Math.trunc(t2), (t2 - Math.trunc(t2)) * 60] } function roundTo(x: number, n: number) { diff --git a/desktop/src/shared/utils/bicubic-interpolation.ts b/desktop/src/shared/utils/bicubic-interpolation.ts index afa2d7129..3374d0213 100644 --- a/desktop/src/shared/utils/bicubic-interpolation.ts +++ b/desktop/src/shared/utils/bicubic-interpolation.ts @@ -1,3 +1,5 @@ +export type Coefficients = [number, number, number, number] + export class BicubicInterpolationBase { constructor( protected M: number[], @@ -34,21 +36,21 @@ export class BicubicInterpolationBase { } getRow(fp: number, j0: number, j2: number, j3: number) { - const p = new Array(4) + const p: Coefficients = [0, 0, 0, 0] if (j0 < 0) ++fp - p[0] = this.M[fp] + p[0] = this.M[fp]! if (j0 >= 0) ++fp - p[1] = this.M[fp] + p[1] = this.M[fp]! if (j2 < this.cols) { - p[2] = this.M[++fp] + p[2] = this.M[++fp]! if (j3 < this.cols) ++fp - p[3] = this.M[fp] + p[3] = this.M[fp]! } else { - p[2] = this.M[fp] - p[3] = this.M[fp - 1] + p[2] = this.M[fp]! + p[3] = this.M[fp - 1]! } return p @@ -66,11 +68,11 @@ export class BicubicSplineInterpolation extends BicubicInterpolationBase { interpolate(x: number, y: number) { const { i1, j1, p0, p1, p2, p3 } = this.initXY(x, y) const C = this.coefficients(x - j1) - const c = [this.spline(p0, C), this.spline(p1, C), this.spline(p2, C), this.spline(p3, C)] + const c: Coefficients = [this.spline(p0, C), this.spline(p1, C), this.spline(p2, C), this.spline(p3, C)] return this.spline(c, this.coefficients(y - i1)) } - private coefficients(dx: number) { + private coefficients(dx: number): Coefficients { const dx2 = dx * dx const dx3 = dx2 * dx const dx1_2 = dx / 2 @@ -81,7 +83,7 @@ export class BicubicSplineInterpolation extends BicubicInterpolationBase { return [dx2 - dx3_2 - dx1_2, dx315 - dx22 - dx2_2 + 1, dx22 - dx315 + dx1_2, dx3_2 - dx2_2] } - private spline(p: number[], C: number[]) { + private spline(p: Coefficients, C: Coefficients) { const f12 = p[1] * C[1] + p[2] * C[2] const f03 = p[0] * C[0] + p[3] * C[3] return -f03 < f12 * this.clamp ? f12 + f03 : f12 / (C[1] + C[2]) diff --git a/desktop/src/shared/utils/comparators.ts b/desktop/src/shared/utils/comparators.ts index 98d8c6791..7da6f230f 100644 --- a/desktop/src/shared/utils/comparators.ts +++ b/desktop/src/shared/utils/comparators.ts @@ -1,6 +1,6 @@ import { Device } from '../types/device.types' -export type Comparator = (a: T, b: T) => number +export type Comparator = (a: T, b: T) => number export const textComparator: Comparator = (a: string, b: string) => a.localeCompare(b) export const numberComparator: Comparator = (a: number, b: number) => a - b diff --git a/desktop/src/shared/utils/ephemeris.ts b/desktop/src/shared/utils/ephemeris.ts index 4afc60f17..911dbc1d7 100644 --- a/desktop/src/shared/utils/ephemeris.ts +++ b/desktop/src/shared/utils/ephemeris.ts @@ -54,7 +54,9 @@ export function centuriesSinceJ2000(jd: JulianDate) { return (jd.jdi - 2451545 + jd.jdf) / 36525 } -export const DELTA_AT = [ +export type DeltaT = [number, number, number, number] | [number, number] + +export const DELTA_AT: DeltaT[] = [ [2436934.5, 1.417818, 37300, 0.001296], [2437300.5, 1.422818, 37300, 0.001296], [2437512.5, 1.372818, 37300, 0.001296], @@ -108,7 +110,7 @@ export function deltaAT(jd: JulianDate) { if (t >= D[0]) { if (t >= 2441317.5) return D[1] - return D[1] + (t - 2400000.5 - D[2]) * D[3] + return D[1] + (t - 2400000.5 - D[2]!) * D[3]! } } diff --git a/desktop/src/tsconfig.app.json b/desktop/src/tsconfig.app.json index e80efd4e2..0e30ee280 100644 --- a/desktop/src/tsconfig.app.json +++ b/desktop/src/tsconfig.app.json @@ -1,20 +1,11 @@ { - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "", - "types": [ - "node" - ] - }, - "files": [ - "main.ts", - "polyfills.ts" - ], - "include": [ - "**/*.d.ts" - ], - "exclude": [ - "**/*.spec.ts" - ] -} \ No newline at end of file + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "", + "types": ["node"] + }, + "files": ["main.ts", "polyfills.ts"], + "include": ["**/*.d.ts"], + "exclude": ["**/*.spec.ts"] +} diff --git a/desktop/src/typings.d.ts b/desktop/src/typings.d.ts index 125202051..bb3f2b902 100644 --- a/desktop/src/typings.d.ts +++ b/desktop/src/typings.d.ts @@ -5,12 +5,12 @@ interface NodeModule { } interface Window { - process: any - require: any + process: unknown + require: (string) => never apiHost: string apiPort: number id: string - data?: any + data?: unknown preference: { modal?: boolean autoResizable?: boolean diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 48ed5e730..69c0debbb 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -1,45 +1,40 @@ { - "compileOnSave": false, - "compilerOptions": { - "strict": true, - "outDir": "./dist/out-tsc", - "module": "ES2022", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, - "noUncheckedIndexedAccess": false, - "allowJs": true, - "skipLibCheck": true, - "incremental": true, - "target": "ES2022", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2022", - "es2018", - "es2017", - "es2016", - "es2015", - "dom" - ], - "useDefineForClassFields": false - }, - "exclude": [ - "node_modules" - ], - "angularCompilerOptions": { - "strictTemplates": true, - "fullTemplateTypeCheck": true, - "annotateForClosureCompiler": true, - "strictInjectionParameters": true, - "skipTemplateCodegen": false, - "preserveWhitespaces": true, - "skipMetadataEmit": false, - "disableTypeScriptVersionCheck": true - } -} \ No newline at end of file + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "outDir": "./dist/out-tsc", + "module": "ES2022", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "noUncheckedIndexedAccess": false, + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noImplicitThis": true, + "noPropertyAccessFromIndexSignature": true, + "noFallthroughCasesInSwitch": true, + "allowJs": true, + "skipLibCheck": true, + "incremental": true, + "target": "ES2022", + "typeRoots": ["node_modules/@types"], + "lib": ["es2022", "es2018", "es2017", "es2016", "es2015", "dom"], + "useDefineForClassFields": false + }, + "exclude": ["node_modules"], + "angularCompilerOptions": { + "strictTemplates": true, + "fullTemplateTypeCheck": true, + "annotateForClosureCompiler": true, + "strictInjectionParameters": true, + "skipTemplateCodegen": false, + "preserveWhitespaces": true, + "skipMetadataEmit": false, + "disableTypeScriptVersionCheck": true + } +} diff --git a/desktop/tsconfig.serve.json b/desktop/tsconfig.serve.json index 65dcce9b1..1c64234ca 100644 --- a/desktop/tsconfig.serve.json +++ b/desktop/tsconfig.serve.json @@ -1,40 +1,19 @@ { - "compilerOptions": { - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "resolveJsonModule": true, - "module": "CommonJS", - "target": "ES2022", - "noFallthroughCasesInSwitch": true, - "incremental": true, - "types": [ - "node" - ], - "lib": [ - "es2022", - "es2018", - "es2017", - "es2016", - "es2015", - "dom" - ] - }, - "files": [ - "app/main.ts", - "app/preload.ts", - "app/argument.parser.ts", - "app/local.storage.ts", - "app/window.manager.ts" - ], - "include": [ - "src/shared/types/*.ts", - "src/typings.d.ts" - ], - "exclude": [ - "node_modules", - "**/*.spec.ts" - ] -} \ No newline at end of file + "compilerOptions": { + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "module": "CommonJS", + "target": "ES2022", + "noFallthroughCasesInSwitch": true, + "incremental": true, + "types": ["node"], + "lib": ["es2022", "es2018", "es2017", "es2016", "es2015", "dom"] + }, + "files": ["app/main.ts", "app/preload.ts", "app/argument.parser.ts", "app/local.storage.ts", "app/window.manager.ts"], + "include": ["src/shared/types/*.ts", "src/typings.d.ts"], + "exclude": ["node_modules", "**/*.spec.ts"] +} From 091a7ad3e3925ae5a3be7a2fc3dfee04376f257f Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sun, 23 Jun 2024 23:49:39 -0300 Subject: [PATCH 03/29] [desktop]: ESLint --- desktop/app/local.storage.ts | 2 +- desktop/app/main.ts | 5 ++-- desktop/app/window.manager.ts | 22 ++++++++------- desktop/eslint.config.mjs | 18 ++++++++++++ .../src/app/alignment/alignment.component.ts | 8 +++--- desktop/src/app/app.component.ts | 4 +-- desktop/src/app/atlas/atlas.component.ts | 28 +++++++++---------- .../src/app/autofocus/autofocus.component.ts | 8 +++--- .../app/calculator/calculator.component.ts | 2 +- .../app/calibration/calibration.component.ts | 8 +++--- desktop/src/app/camera/camera.component.ts | 18 ++++++------ .../app/filterwheel/filterwheel.component.ts | 16 +++++------ .../app/flat-wizard/flat-wizard.component.ts | 14 +++++----- desktop/src/app/focuser/focuser.component.ts | 12 ++++---- desktop/src/app/framing/framing.component.ts | 12 ++++---- desktop/src/app/guider/guider.component.ts | 4 +-- desktop/src/app/home/home.component.ts | 18 ++++++------ desktop/src/app/image/image.component.ts | 26 ++++++++--------- desktop/src/app/indi/indi.component.ts | 4 +-- desktop/src/app/mount/mount.component.ts | 18 ++++++------ desktop/src/app/rotator/rotator.component.ts | 12 ++++---- .../src/app/sequencer/sequencer.component.ts | 14 +++++----- .../src/app/settings/settings.component.ts | 8 +++--- .../device-chooser.component.ts | 2 +- .../device-list-menu.component.ts | 2 +- .../dialog-menu/dialog-menu.component.ts | 2 +- .../path-chooser/path-chooser.component.ts | 8 +++--- .../slide-menu/slide-menu.component.ts | 2 +- desktop/src/shared/constants.ts | 2 +- .../dialogs/location/location.dialog.ts | 2 +- .../directives/input-number-scrollable.ts | 2 +- .../directives/stop-propagation.directive.ts | 2 +- .../interceptors/location.interceptor.ts | 2 +- .../src/shared/pipes/enum-dropdown.pipe.ts | 2 +- desktop/src/shared/pipes/skyObject.pipe.ts | 2 ++ desktop/src/shared/services/api.service.ts | 2 +- .../shared/services/browser-window.service.ts | 2 +- .../src/shared/services/electron.service.ts | 2 +- desktop/src/shared/services/http.service.ts | 2 +- .../src/shared/services/preference.service.ts | 22 +++++++-------- desktop/src/shared/services/prime.service.ts | 6 ++-- .../shared/services/remote-storage.service.ts | 2 +- desktop/src/shared/types/alignment.types.ts | 8 +++--- desktop/src/shared/types/api.types.ts | 2 +- desktop/src/shared/types/app.types.ts | 18 ++++++------ desktop/src/shared/types/atlas.types.ts | 2 +- desktop/src/shared/types/autofocus.type.ts | 9 +++--- desktop/src/shared/types/auxiliary.types.ts | 2 +- desktop/src/shared/types/calibration.types.ts | 2 +- desktop/src/shared/types/camera.types.ts | 9 +++--- desktop/src/shared/types/device.types.ts | 2 +- desktop/src/shared/types/flat-wizard.types.ts | 2 +- desktop/src/shared/types/focuser.types.ts | 4 +-- desktop/src/shared/types/gps.types.ts | 2 +- desktop/src/shared/types/guider.types.ts | 4 ++- desktop/src/shared/types/home.types.ts | 12 ++++---- desktop/src/shared/types/image.types.ts | 10 +++---- desktop/src/shared/types/mount.types.ts | 8 +++--- desktop/src/shared/types/rotator.types.ts | 2 +- desktop/src/shared/types/sequencer.types.ts | 10 +++---- desktop/src/shared/types/wheel.types.ts | 4 +-- desktop/src/shared/utils/comparators.ts | 2 +- .../shared/utils/coordinate-interpolation.ts | 26 +++++++++-------- 63 files changed, 262 insertions(+), 227 deletions(-) diff --git a/desktop/app/local.storage.ts b/desktop/app/local.storage.ts index f9bf784c7..a412e007f 100644 --- a/desktop/app/local.storage.ts +++ b/desktop/app/local.storage.ts @@ -4,7 +4,7 @@ import { dirname } from 'path' export class LocalStorage> { private readonly data = Object.create(null) as T - constructor(private path: string) { + constructor(private readonly path: string) { try { console.info(`loading config file at ${path}`) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index ec15fa2dd..14989af5f 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -1,9 +1,10 @@ import { Menu, app, ipcMain } from 'electron' import * as fs from 'fs' -import { ChildProcessWithoutNullStreams, spawn } from 'node:child_process' +import type { ChildProcessWithoutNullStreams } from 'node:child_process' +import { spawn } from 'node:child_process' import { join, resolve } from 'path' import { WebSocket } from 'ws' -import { InternalEventType, JsonFile, StoredWindowData } from '../src/shared/types/app.types' +import type { InternalEventType, JsonFile, StoredWindowData } from '../src/shared/types/app.types' import { ArgumentParser } from './argument.parser' import { LocalStorage } from './local.storage' import { WindowManager } from './window.manager' diff --git a/desktop/app/window.manager.ts b/desktop/app/window.manager.ts index 6b4421106..647811d52 100644 --- a/desktop/app/window.manager.ts +++ b/desktop/app/window.manager.ts @@ -1,11 +1,11 @@ import { Client } from '@stomp/stompjs' import { BrowserWindow, Notification, dialog, screen, shell } from 'electron' -import { ChildProcessWithoutNullStreams } from 'node:child_process' +import type { ChildProcessWithoutNullStreams } from 'node:child_process' import { join } from 'path' -import { MessageEvent } from '../src/shared/types/api.types' -import { CloseWindow, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, StoredWindowData } from '../src/shared/types/app.types' -import { ParsedArgument } from './argument.parser' -import { LocalStorage } from './local.storage' +import type { MessageEvent } from '../src/shared/types/api.types' +import type { CloseWindow, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, StoredWindowData } from '../src/shared/types/app.types' +import type { ParsedArgument } from './argument.parser' +import type { LocalStorage } from './local.storage' export class ApplicationWindow { constructor( @@ -251,6 +251,8 @@ export class WindowManager { browserWindow.center() return browserWindow + } else { + return undefined } } @@ -377,24 +379,24 @@ export class WindowManager { handleWindowMinimize(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) window?.browserWindow.minimize() - return window && window.browserWindow.isMinimized() + return !!window && window.browserWindow.isMinimized() } handleWindowMaximize(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) - return window && window.toggleMaximize() + return !!window && window.toggleMaximize() } handleWindowPin(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) window?.browserWindow.setAlwaysOnTop(true) - return window && window.browserWindow.isAlwaysOnTop() + return !!window && window.browserWindow.isAlwaysOnTop() } handleWindowUnpin(event: Electron.IpcMainInvokeEvent) { const window = this.findWindow(event.sender.id) window?.browserWindow.setAlwaysOnTop(false) - return window && window.browserWindow.isAlwaysOnTop() + return !!window && window.browserWindow.isAlwaysOnTop() } handleWindowFullscreen(event: Electron.IpcMainInvokeEvent, enabled?: boolean) { @@ -406,7 +408,7 @@ export class WindowManager { else window.toggleFullscreen() } - return window && window.browserWindow.isFullScreen() + return !!window && window.browserWindow.isFullScreen() } showNotification(event: NotificationEvent) { diff --git a/desktop/eslint.config.mjs b/desktop/eslint.config.mjs index ce99012da..20892f188 100644 --- a/desktop/eslint.config.mjs +++ b/desktop/eslint.config.mjs @@ -12,6 +12,12 @@ export default tseslint.config( ...config, } }), + ...tseslint.configs.stylisticTypeCheckedOnly.map((config) => { + return { + files: ['**/*.ts'], + ...config, + } + }), { languageOptions: { parserOptions: { @@ -35,6 +41,18 @@ export default tseslint.config( '@typescript-eslint/no-unsafe-return': 'off', '@typescript-eslint/no-extraneous-class': 'off', '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/consistent-return': 'error', + '@typescript-eslint/consistent-indexed-object-style': 'error', + '@typescript-eslint/prefer-readonly': 'error', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/prefer-nullish-coalescing': [ + 'error', + { + ignorePrimitives: true, + }, + ], }, }, ) diff --git a/desktop/src/app/alignment/alignment.component.ts b/desktop/src/app/alignment/alignment.component.ts index ac45c5c0b..badaf2e2d 100644 --- a/desktop/src/app/alignment/alignment.component.ts +++ b/desktop/src/app/alignment/alignment.component.ts @@ -75,10 +75,10 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { constructor( app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, - private preference: PreferenceService, - private pinger: Pinger, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly preference: PreferenceService, + private readonly pinger: Pinger, electron: ElectronService, ngZone: NgZone, ) { diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index af6e56b1f..da0f8b865 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -27,8 +27,8 @@ export class AppComponent implements AfterViewInit { } constructor( - private windowTitle: Title, - private electron: ElectronService, + private readonly windowTitle: Title, + private readonly electron: ElectronService, ) { console.info('APP_CONFIG', APP_CONFIG) diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index b02090ed4..e9309b457 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -423,14 +423,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private location: Location constructor( - private app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, - private route: ActivatedRoute, + private readonly app: AppComponent, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly route: ActivatedRoute, electron: ElectronService, - private preference: PreferenceService, - private skyObjectPipe: SkyObjectPipe, - private prime: PrimeService, + private readonly preference: PreferenceService, + private readonly skyObjectPipe: SkyObjectPipe, + private readonly prime: PrimeService, ngZone: NgZone, ) { app.title = 'Sky Atlas' @@ -508,16 +508,16 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } private async loadTabFromData(data?: SkyAtlasData) { - if (data && data.tab) { + if (data?.tab) { this.tab = data.tab if (this.tab === SkyAtlasTab.SKY_OBJECT) { - this.skyObjectFilter.rightAscension = data.filter?.rightAscension || this.skyObjectFilter.rightAscension - this.skyObjectFilter.declination = data.filter?.declination || this.skyObjectFilter.declination - this.skyObjectFilter.radius = data.filter?.radius || this.skyObjectFilter.radius || 4.0 - this.skyObjectFilter.constellation = data.filter?.constellation || this.skyObjectFilter.constellation - this.skyObjectFilter.magnitude = data.filter?.magnitude || this.skyObjectFilter.magnitude - this.skyObjectFilter.type = data.filter?.type || this.skyObjectFilter.type + this.skyObjectFilter.rightAscension = data.filter?.rightAscension ?? this.skyObjectFilter.rightAscension + this.skyObjectFilter.declination = data.filter?.declination ?? this.skyObjectFilter.declination + this.skyObjectFilter.radius = (data.filter?.radius ?? this.skyObjectFilter.radius) || 4.0 + this.skyObjectFilter.constellation = data.filter?.constellation ?? this.skyObjectFilter.constellation + this.skyObjectFilter.magnitude = data.filter?.magnitude ?? this.skyObjectFilter.magnitude + this.skyObjectFilter.type = data.filter?.type ?? this.skyObjectFilter.type await this.tabChanged() await this.filterSkyObject() diff --git a/desktop/src/app/autofocus/autofocus.component.ts b/desktop/src/app/autofocus/autofocus.component.ts index 063abf6d2..07c9e52f8 100644 --- a/desktop/src/app/autofocus/autofocus.component.ts +++ b/desktop/src/app/autofocus/autofocus.component.ts @@ -235,10 +235,10 @@ export class AutoFocusComponent implements AfterViewInit, OnDestroy, Pingable { constructor( app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, - private preference: PreferenceService, - private pinger: Pinger, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly preference: PreferenceService, + private readonly pinger: Pinger, electron: ElectronService, ngZone: NgZone, ) { diff --git a/desktop/src/app/calculator/calculator.component.ts b/desktop/src/app/calculator/calculator.component.ts index 6f43b6c6e..8e1c27a74 100644 --- a/desktop/src/app/calculator/calculator.component.ts +++ b/desktop/src/app/calculator/calculator.component.ts @@ -219,7 +219,7 @@ export class CalculatorComponent { constructor( app: AppComponent, - private electron: ElectronService, + private readonly electron: ElectronService, ) { app.title = 'Calculator' } diff --git a/desktop/src/app/calibration/calibration.component.ts b/desktop/src/app/calibration/calibration.component.ts index 58468e8df..89a8eae79 100644 --- a/desktop/src/app/calibration/calibration.component.ts +++ b/desktop/src/app/calibration/calibration.component.ts @@ -34,10 +34,10 @@ export class CalibrationComponent implements AfterViewInit { constructor( app: AppComponent, - private api: ApiService, - private electron: ElectronService, - private browserWindow: BrowserWindowService, - private preference: PreferenceService, + private readonly api: ApiService, + private readonly electron: ElectronService, + private readonly browserWindow: BrowserWindowService, + private readonly preference: PreferenceService, ) { app.title = 'Calibration' } diff --git a/desktop/src/app/camera/camera.component.ts b/desktop/src/app/camera/camera.component.ts index d4c78cdd2..cf82034f2 100644 --- a/desktop/src/app/camera/camera.component.ts +++ b/desktop/src/app/camera/camera.component.ts @@ -178,13 +178,13 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } constructor( - private app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, - private electron: ElectronService, - private preference: PreferenceService, - private route: ActivatedRoute, - private pinger: Pinger, + private readonly app: AppComponent, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly electron: ElectronService, + private readonly preference: PreferenceService, + private readonly route: ActivatedRoute, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Camera' @@ -330,7 +330,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } async cameraChanged(camera?: Camera) { - if (camera && camera.id) { + if (camera?.id) { camera = await this.api.camera(camera.id) Object.assign(this.camera, camera) @@ -606,6 +606,8 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { return 60000 case ExposureTimeUnit.MICROSECOND: return 60000000 + default: + return 0 } } diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index e2c9394e1..6991a4dd2 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -56,15 +56,15 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } private readonly filterChangedPublisher = new Subject() - private subscription?: Subscription + private readonly subscription?: Subscription constructor( - private app: AppComponent, - private api: ApiService, - private electron: ElectronService, - private preference: PreferenceService, - private route: ActivatedRoute, - private pinger: Pinger, + private readonly app: AppComponent, + private readonly api: ApiService, + private readonly electron: ElectronService, + private readonly preference: PreferenceService, + private readonly route: ActivatedRoute, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Filter Wheel' @@ -207,7 +207,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } async wheelChanged(wheel?: FilterWheel) { - if (wheel && wheel.id) { + if (wheel?.id) { wheel = await this.api.wheel(wheel.id) await this.ping() diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.ts b/desktop/src/app/flat-wizard/flat-wizard.component.ts index 4135c6721..d8e829292 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.ts +++ b/desktop/src/app/flat-wizard/flat-wizard.component.ts @@ -54,12 +54,12 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { constructor( app: AppComponent, - private api: ApiService, - private electron: ElectronService, - private browserWindow: BrowserWindowService, - private prime: PrimeService, - private preference: PreferenceService, - private pinger: Pinger, + private readonly api: ApiService, + private readonly electron: ElectronService, + private readonly browserWindow: BrowserWindowService, + private readonly prime: PrimeService, + private readonly preference: PreferenceService, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Flat Wizard' @@ -179,7 +179,7 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { } private updateEntryFromCamera(camera?: Camera) { - if (camera && camera.connected) { + if (camera?.connected) { updateCameraStartCaptureFromCamera(this.request.capture, camera) } } diff --git a/desktop/src/app/focuser/focuser.component.ts b/desktop/src/app/focuser/focuser.component.ts index d3075681f..912e59405 100644 --- a/desktop/src/app/focuser/focuser.component.ts +++ b/desktop/src/app/focuser/focuser.component.ts @@ -21,12 +21,12 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { stepsAbsolute = 0 constructor( - private app: AppComponent, - private api: ApiService, + private readonly app: AppComponent, + private readonly api: ApiService, electron: ElectronService, - private preference: PreferenceService, - private route: ActivatedRoute, - private pinger: Pinger, + private readonly preference: PreferenceService, + private readonly route: ActivatedRoute, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Focuser' @@ -117,7 +117,7 @@ export class FocuserComponent implements AfterViewInit, OnDestroy, Pingable { } async focuserChanged(focuser?: Focuser) { - if (focuser && focuser.id) { + if (focuser?.id) { focuser = await this.api.focuser(focuser.id) Object.assign(this.focuser, focuser) diff --git a/desktop/src/app/framing/framing.component.ts b/desktop/src/app/framing/framing.component.ts index 409eb81c4..7d95e9018 100644 --- a/desktop/src/app/framing/framing.component.ts +++ b/desktop/src/app/framing/framing.component.ts @@ -52,12 +52,12 @@ export class FramingComponent implements AfterViewInit, OnDestroy { constructor( app: AppComponent, - private route: ActivatedRoute, - private api: ApiService, - private browserWindow: BrowserWindowService, - private electron: ElectronService, - private storage: LocalStorageService, - private prime: PrimeService, + private readonly route: ActivatedRoute, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly electron: ElectronService, + private readonly storage: LocalStorageService, + private readonly prime: PrimeService, ngZone: NgZone, ) { app.title = 'Framing' diff --git a/desktop/src/app/guider/guider.component.ts b/desktop/src/app/guider/guider.component.ts index dea7bf050..d0e651600 100644 --- a/desktop/src/app/guider/guider.component.ts +++ b/desktop/src/app/guider/guider.component.ts @@ -222,8 +222,8 @@ export class GuiderComponent implements AfterViewInit, OnDestroy, Pingable { constructor( title: Title, - private api: ApiService, - private pinger: Pinger, + private readonly api: ApiService, + private readonly pinger: Pinger, electron: ElectronService, ngZone: NgZone, ) { diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index a2c4ca8c5..0ea665dbb 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -26,7 +26,7 @@ type MappedDevice = { } function scrollPageOf(element: Element) { - return parseInt(element.getAttribute('scroll-page') || '0') + return parseInt(element.getAttribute('scroll-page') ?? '0') } @Component({ @@ -156,12 +156,12 @@ export class HomeComponent implements AfterContentInit { constructor( app: AppComponent, - private electron: ElectronService, - private browserWindow: BrowserWindowService, - private api: ApiService, - private prime: PrimeService, - private preference: PreferenceService, - private ngZone: NgZone, + private readonly electron: ElectronService, + private readonly browserWindow: BrowserWindowService, + private readonly api: ApiService, + private readonly prime: PrimeService, + private readonly preference: PreferenceService, + private readonly ngZone: NgZone, ) { app.title = 'Nebulosa' @@ -352,7 +352,7 @@ export class HomeComponent implements AfterContentInit { } protected findDeviceById(id: string) { - return this.cameras.find((e) => e.id === id) || this.mounts.find((e) => e.id === id) || this.wheels.find((e) => e.id === id) || this.focusers.find((e) => e.id === id) || this.rotators.find((e) => e.id === id) + return this.cameras.find((e) => e.id === id) ?? this.mounts.find((e) => e.id === id) ?? this.wheels.find((e) => e.id === id) ?? this.focusers.find((e) => e.id === id) ?? this.rotators.find((e) => e.id === id) } protected deviceConnected(event: DeviceConnectionCommandEvent) { @@ -472,7 +472,7 @@ export class HomeComponent implements AfterContentInit { } private async updateConnection() { - if (this.connection && this.connection.id) { + if (this.connection?.id) { try { const status = await this.api.connectionStatus(this.connection.id) diff --git a/desktop/src/app/image/image.component.ts b/desktop/src/app/image/image.component.ts index fb08686d8..dec6a0dbb 100644 --- a/desktop/src/app/image/image.component.ts +++ b/desktop/src/app/image/image.component.ts @@ -229,7 +229,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { : extension === '.png' ? 'PNG' : extension === '.jpg' ? 'JPG' : 'FITS' - this.saveAs.bitpix = this.imageInfo?.bitpix || 'BYTE' + this.saveAs.bitpix = this.imageInfo?.bitpix ?? 'BYTE' this.saveAs.path = path this.saveAs.showDialog = true @@ -525,14 +525,14 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } constructor( - private app: AppComponent, - private route: ActivatedRoute, - private api: ApiService, - private electron: ElectronService, - private browserWindow: BrowserWindowService, - private preference: PreferenceService, - private prime: PrimeService, - private ngZone: NgZone, + private readonly app: AppComponent, + private readonly route: ActivatedRoute, + private readonly api: ApiService, + private readonly electron: ElectronService, + private readonly browserWindow: BrowserWindowService, + private readonly preference: PreferenceService, + private readonly prime: PrimeService, + private readonly ngZone: NgZone, ) { app.title = 'Image' @@ -712,7 +712,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { const label = name ?? 'None' const icon = name ? 'mdi mdi-wrench' : 'mdi mdi-close' - return { + return { label, icon, selected: !this.calibrationViaCamera && this.transformation.calibrationGroup === name, @@ -723,7 +723,7 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.markCalibrationGroupItem(name) void this.loadImage() }, - } + } as MenuItem } const menu: MenuItem[] = [] @@ -1052,8 +1052,8 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } } - this.solver.focalLength ||= imagePreference.solver?.focalLength || 0 - this.solver.pixelSize ||= imagePreference.solver?.pixelSize || 0 + this.solver.focalLength ||= imagePreference.solver?.focalLength ?? 0 + this.solver.pixelSize ||= imagePreference.solver?.pixelSize ?? 0 } imageClicked(event: MouseEvent, contextMenu: boolean) { diff --git a/desktop/src/app/indi/indi.component.ts b/desktop/src/app/indi/indi.component.ts index 732a22c8c..776bd110d 100644 --- a/desktop/src/app/indi/indi.component.ts +++ b/desktop/src/app/indi/indi.component.ts @@ -28,8 +28,8 @@ export class INDIComponent implements AfterViewInit, OnDestroy { constructor( app: AppComponent, - private route: ActivatedRoute, - private api: ApiService, + private readonly route: ActivatedRoute, + private readonly api: ApiService, electron: ElectronService, ngZone: NgZone, ) { diff --git a/desktop/src/app/mount/mount.component.ts b/desktop/src/app/mount/mount.component.ts index 699a5441b..53bb0467d 100644 --- a/desktop/src/app/mount/mount.component.ts +++ b/desktop/src/app/mount/mount.component.ts @@ -54,7 +54,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { private readonly computeCoordinatePublisher = new Subject() private readonly computeTargetCoordinatePublisher = new Subject() - private computeCoordinateSubscriptions: Subscription[] = [] + private readonly computeCoordinateSubscriptions: Subscription[] = [] private readonly moveToDirection = [false, false] readonly ephemerisModel: SlideMenuItem[] = [ @@ -229,14 +229,14 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { } constructor( - private app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, + private readonly app: AppComponent, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, electron: ElectronService, - private preference: PreferenceService, - private route: ActivatedRoute, - private prime: PrimeService, - private pinger: Pinger, + private readonly preference: PreferenceService, + private readonly route: ActivatedRoute, + private readonly prime: PrimeService, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Mount' @@ -338,7 +338,7 @@ export class MountComponent implements AfterContentInit, OnDestroy, Pingable { } async mountChanged(mount?: Mount) { - if (mount && mount.id) { + if (mount?.id) { mount = await this.api.mount(mount.id) Object.assign(this.mount, mount) diff --git a/desktop/src/app/rotator/rotator.component.ts b/desktop/src/app/rotator/rotator.component.ts index f541bce28..c1e4644a1 100644 --- a/desktop/src/app/rotator/rotator.component.ts +++ b/desktop/src/app/rotator/rotator.component.ts @@ -20,12 +20,12 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { angle = 0 constructor( - private app: AppComponent, - private api: ApiService, + private readonly app: AppComponent, + private readonly api: ApiService, electron: ElectronService, - private preference: PreferenceService, - private route: ActivatedRoute, - private pinger: Pinger, + private readonly preference: PreferenceService, + private readonly route: ActivatedRoute, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Rotator' @@ -67,7 +67,7 @@ export class RotatorComponent implements AfterViewInit, OnDestroy, Pingable { } async rotatorChanged(rotator?: Rotator) { - if (rotator && rotator.id) { + if (rotator?.id) { rotator = await this.api.rotator(rotator.id) Object.assign(this.rotator, rotator) diff --git a/desktop/src/app/sequencer/sequencer.component.ts b/desktop/src/app/sequencer/sequencer.component.ts index 151b40887..8182e0452 100644 --- a/desktop/src/app/sequencer/sequencer.component.ts +++ b/desktop/src/app/sequencer/sequencer.component.ts @@ -126,13 +126,13 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } constructor( - private app: AppComponent, - private api: ApiService, - private browserWindow: BrowserWindowService, - private electron: ElectronService, - private storage: LocalStorageService, - private prime: PrimeService, - private pinger: Pinger, + private readonly app: AppComponent, + private readonly api: ApiService, + private readonly browserWindow: BrowserWindowService, + private readonly electron: ElectronService, + private readonly storage: LocalStorageService, + private readonly prime: PrimeService, + private readonly pinger: Pinger, ngZone: NgZone, ) { app.title = 'Sequencer' diff --git a/desktop/src/app/settings/settings.component.ts b/desktop/src/app/settings/settings.component.ts index 8ca39a051..f815edd99 100644 --- a/desktop/src/app/settings/settings.component.ts +++ b/desktop/src/app/settings/settings.component.ts @@ -49,10 +49,10 @@ export class SettingsComponent { constructor( app: AppComponent, - private preference: PreferenceService, - private electron: ElectronService, - private prime: PrimeService, - private dropdownOptions: DropdownOptionsPipe, + private readonly preference: PreferenceService, + private readonly electron: ElectronService, + private readonly prime: PrimeService, + private readonly dropdownOptions: DropdownOptionsPipe, ) { app.title = 'Settings' diff --git a/desktop/src/shared/components/device-chooser/device-chooser.component.ts b/desktop/src/shared/components/device-chooser/device-chooser.component.ts index 082721524..ec5c2c2b6 100644 --- a/desktop/src/shared/components/device-chooser/device-chooser.component.ts +++ b/desktop/src/shared/components/device-chooser/device-chooser.component.ts @@ -40,7 +40,7 @@ export class DeviceChooserComponent { @ViewChild('deviceMenu') private readonly deviceMenu!: DeviceListMenuComponent - constructor(private api: ApiService) {} + constructor(private readonly api: ApiService) {} async show() { const device = await this.deviceMenu.show(this.devices, this.device) diff --git a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts index 1c751ef79..12438fd5a 100644 --- a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts +++ b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts @@ -42,7 +42,7 @@ export class DeviceListMenuComponent { @ViewChild('menu') private readonly menu!: DialogMenuComponent - constructor(private prime: PrimeService) {} + constructor(private readonly prime: PrimeService) {} show(devices: T[], selected?: NoInfer) { const model: SlideMenuItem[] = [] diff --git a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts index e42185878..cc2410b74 100644 --- a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts +++ b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts @@ -22,7 +22,7 @@ export class DialogMenuComponent { @Input() updateHeaderWithMenuLabel: boolean = true - private navigationHeader: (string | undefined)[] = [] + private readonly navigationHeader: (string | undefined)[] = [] show() { this.visible = true diff --git a/desktop/src/shared/components/path-chooser/path-chooser.component.ts b/desktop/src/shared/components/path-chooser/path-chooser.component.ts index 66372d72d..ada4ae3d6 100644 --- a/desktop/src/shared/components/path-chooser/path-chooser.component.ts +++ b/desktop/src/shared/components/path-chooser/path-chooser.component.ts @@ -32,7 +32,7 @@ export class PathChooserComponent implements OnChanges { @Output() readonly pathChange = new EventEmitter() - constructor(private electron: ElectronService) {} + constructor(private readonly electron: ElectronService) {} ngOnChanges(changes: SimpleChanges) { if (changes['path']?.currentValue) { @@ -42,10 +42,10 @@ export class PathChooserComponent implements OnChanges { async choosePath() { const storageKey = `pathChooser.${this.key}.defaultPath` - const defaultPath = localStorage.getItem(storageKey) - const dirName = defaultPath && !this.directory ? dirname(defaultPath) : defaultPath + const storedPath = localStorage.getItem(storageKey) + const defaultPath = storedPath && !this.directory ? dirname(storedPath) : this.path - const path = await (this.directory ? this.electron.openDirectory({ defaultPath: dirName || this.path }) : this.electron.openFile({ defaultPath: dirName || this.path })) + const path = await (this.directory ? this.electron.openDirectory({ defaultPath }) : this.electron.openFile({ defaultPath })) if (path) { this.path = path diff --git a/desktop/src/shared/components/slide-menu/slide-menu.component.ts b/desktop/src/shared/components/slide-menu/slide-menu.component.ts index 35b305f0b..801a5663f 100644 --- a/desktop/src/shared/components/slide-menu/slide-menu.component.ts +++ b/desktop/src/shared/components/slide-menu/slide-menu.component.ts @@ -21,7 +21,7 @@ export class SlideMenuComponent implements OnInit { currentMenu!: SlideMenuItem[] - private navigation: SlideMenuItem[][] = [] + private readonly navigation: SlideMenuItem[][] = [] ngOnInit() { this.processMenu(this.model, 0) diff --git a/desktop/src/shared/constants.ts b/desktop/src/shared/constants.ts index 337c42205..744d74377 100644 --- a/desktop/src/shared/constants.ts +++ b/desktop/src/shared/constants.ts @@ -1,4 +1,4 @@ -import { MenuItem, SlideMenuItem } from './components/menu-item/menu-item.component' +import type { MenuItem, SlideMenuItem } from './components/menu-item/menu-item.component' export const EVERY_MINUTE_CRON_TIME = '0 */1 * * * *' diff --git a/desktop/src/shared/dialogs/location/location.dialog.ts b/desktop/src/shared/dialogs/location/location.dialog.ts index e98dd7fa0..05666f1a1 100644 --- a/desktop/src/shared/dialogs/location/location.dialog.ts +++ b/desktop/src/shared/dialogs/location/location.dialog.ts @@ -14,7 +14,7 @@ export class LocationDialog implements AfterViewInit { readonly location: Location constructor( - private dialogRef: DynamicDialogRef, + private readonly dialogRef: DynamicDialogRef, config: DynamicDialogConfig, ) { this.location = config.data ?? structuredClone(EMPTY_LOCATION) diff --git a/desktop/src/shared/directives/input-number-scrollable.ts b/desktop/src/shared/directives/input-number-scrollable.ts index dbdb4013d..a7797ddd4 100644 --- a/desktop/src/shared/directives/input-number-scrollable.ts +++ b/desktop/src/shared/directives/input-number-scrollable.ts @@ -3,7 +3,7 @@ import { InputNumber } from 'primeng/inputnumber' @Directive({ selector: '[scrollableNumber]' }) export class ScrollableNumberDirective { - constructor(@Host() private inputNumber: InputNumber) {} + constructor(@Host() private readonly inputNumber: InputNumber) {} @HostListener('wheel', ['$event']) handleEvent(event: WheelEvent) { diff --git a/desktop/src/shared/directives/stop-propagation.directive.ts b/desktop/src/shared/directives/stop-propagation.directive.ts index 36cecf4f5..29726b68b 100644 --- a/desktop/src/shared/directives/stop-propagation.directive.ts +++ b/desktop/src/shared/directives/stop-propagation.directive.ts @@ -52,7 +52,7 @@ export class StopPropagationDirective { @HostListener('touchmove', ['$event']) @HostListener('touchstart', ['$event']) handleEvent(event: Event) { - if (!this.enabled) return + if (!this.enabled) return false if (this.immediate) event.stopImmediatePropagation() else event.stopPropagation() return !this.preventDefault diff --git a/desktop/src/shared/interceptors/location.interceptor.ts b/desktop/src/shared/interceptors/location.interceptor.ts index 085a54680..764a1a875 100644 --- a/desktop/src/shared/interceptors/location.interceptor.ts +++ b/desktop/src/shared/interceptors/location.interceptor.ts @@ -5,7 +5,7 @@ import { PreferenceService } from '../services/preference.service' @Injectable({ providedIn: 'root' }) export class LocationInterceptor implements HttpInterceptor { - constructor(private preference: PreferenceService) {} + constructor(private readonly preference: PreferenceService) {} intercept(req: HttpRequest, next: HttpHandler): Observable> { if (req.urlWithParams.includes('hasLocation')) { diff --git a/desktop/src/shared/pipes/enum-dropdown.pipe.ts b/desktop/src/shared/pipes/enum-dropdown.pipe.ts index ec79a0ddd..f544b2972 100644 --- a/desktop/src/shared/pipes/enum-dropdown.pipe.ts +++ b/desktop/src/shared/pipes/enum-dropdown.pipe.ts @@ -8,7 +8,7 @@ export interface EnumDropdownItem { @Pipe({ name: 'enumDropdown' }) export class EnumDropdownPipe implements PipeTransform { - constructor(private enumPipe: EnumPipe) {} + constructor(private readonly enumPipe: EnumPipe) {} transform(value: EnumPipeKey[]): EnumDropdownItem[] { return value.map((value) => { diff --git a/desktop/src/shared/pipes/skyObject.pipe.ts b/desktop/src/shared/pipes/skyObject.pipe.ts index a5cf6f150..0c0f24f79 100644 --- a/desktop/src/shared/pipes/skyObject.pipe.ts +++ b/desktop/src/shared/pipes/skyObject.pipe.ts @@ -13,6 +13,8 @@ export class SkyObjectPipe implements PipeTransform { return value?.name.replaceAll('|', ' · ') case 'firstName': return value?.name.split(/\[([^\]]+)\]/g).filter(Boolean)[0] + default: + return `${value}` } } } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 16fdbef71..14d17efcd 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -21,7 +21,7 @@ import { HttpService } from './http.service' @Injectable({ providedIn: 'root' }) export class ApiService { - constructor(private http: HttpService) {} + constructor(private readonly http: HttpService) {} get baseUrl() { return this.http.baseUrl diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 162908ca5..c8c2bd00b 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -13,7 +13,7 @@ import { ElectronService } from './electron.service' @Injectable({ providedIn: 'root' }) export class BrowserWindowService { - constructor(private electron: ElectronService) {} + constructor(private readonly electron: ElectronService) {} openWindow(open: OpenWindow): Promise { open.preference.modal = false diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index a032b93e2..90723f276 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -110,7 +110,7 @@ export class ElectronService { get isElectron() { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return !!(window && window.process && window.process.type) + return !!(window && window.process?.type) } send(channel: K, data?: EventMappedType[K]) { diff --git a/desktop/src/shared/services/http.service.ts b/desktop/src/shared/services/http.service.ts index 17922050e..e40b9a314 100644 --- a/desktop/src/shared/services/http.service.ts +++ b/desktop/src/shared/services/http.service.ts @@ -6,7 +6,7 @@ export type QueryParamType = string | number | boolean | undefined | null | Quer @Injectable({ providedIn: 'root' }) export class HttpService { - constructor(private http: HttpClient) {} + constructor(private readonly http: HttpClient) {} get baseUrl() { return `http://${window.apiHost}:${window.apiPort}` diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index fe880ad00..6995215eb 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -17,9 +17,9 @@ import { LocalStorageService } from './local-storage.service' export class PreferenceData { constructor( - private storage: LocalStorageService, - private key: string, - private defaultValue: T | (() => T), + private readonly storage: LocalStorageService, + private readonly key: string, + private readonly defaultValue: T | (() => T), ) {} has() { @@ -41,7 +41,7 @@ export class PreferenceData { @Injectable({ providedIn: 'root' }) export class PreferenceService { - constructor(private storage: LocalStorageService) {} + constructor(private readonly storage: LocalStorageService) {} wheelPreference(wheel: FilterWheel) { return new PreferenceData(this.storage, `wheel.${wheel.name}`, {}) @@ -72,19 +72,19 @@ export class PreferenceService { } plateSolverRequest(type: PlateSolverType) { - return new PreferenceData(this.storage, `plateSolver.${type}`, () => { ...EMPTY_PLATE_SOLVER_REQUEST, type }) + return new PreferenceData(this.storage, `plateSolver.${type}`, () => ({ ...EMPTY_PLATE_SOLVER_REQUEST, type }) as PlateSolverRequest) } starDetectionRequest(type: StarDetectorType) { - return new PreferenceData(this.storage, `starDetection.${type}`, () => { ...EMPTY_STAR_DETECTION_REQUEST, type }) + return new PreferenceData(this.storage, `starDetection.${type}`, () => ({ ...EMPTY_STAR_DETECTION_REQUEST, type }) as StarDetectionRequest) } liveStackingRequest(type: LiveStackerType) { - return new PreferenceData(this.storage, `liveStacking.${type}`, () => { ...EMPTY_LIVE_STACKING_REQUEST, type }) + return new PreferenceData(this.storage, `liveStacking.${type}`, () => ({ ...EMPTY_LIVE_STACKING_REQUEST, type }) as LiveStackingRequest) } equipmentForDevice(device: Device) { - return new PreferenceData(this.storage, `equipment.${device.name}`, () => {}) + return new PreferenceData(this.storage, `equipment.${device.name}`, () => ({}) as Equipment) } focusOffset(wheel: FilterWheel, focuser: Focuser, position: number) { @@ -102,11 +102,11 @@ export class PreferenceService { readonly connections = new PreferenceData(this.storage, 'home.connections', () => []) readonly locations = new PreferenceData(this.storage, 'locations', () => [structuredClone(EMPTY_LOCATION)]) readonly selectedLocation = new PreferenceData(this.storage, 'locations.selected', () => structuredClone(EMPTY_LOCATION)) - readonly homePreference = new PreferenceData(this.storage, 'home', () => {}) + readonly homePreference = new PreferenceData(this.storage, 'home', () => ({}) as HomePreference) readonly imagePreference = new PreferenceData(this.storage, 'image', () => structuredClone(EMPTY_IMAGE_PREFERENCE)) - readonly skyAtlasPreference = new PreferenceData(this.storage, 'atlas', () => {}) + readonly skyAtlasPreference = new PreferenceData(this.storage, 'atlas', () => ({}) as SkyAtlasPreference) readonly alignmentPreference = new PreferenceData(this.storage, 'alignment', () => structuredClone(EMPTY_ALIGNMENT_PREFERENCE)) readonly imageFOVs = new PreferenceData(this.storage, 'image.fovs', () => []) - readonly calibrationPreference = new PreferenceData(this.storage, 'calibration', () => {}) + readonly calibrationPreference = new PreferenceData(this.storage, 'calibration', () => ({}) as CalibrationPreference) readonly autoFocusPreference = new PreferenceData(this.storage, 'autoFocus', () => structuredClone(EMPTY_AUTO_FOCUS_PREFERENCE)) } diff --git a/desktop/src/shared/services/prime.service.ts b/desktop/src/shared/services/prime.service.ts index ad4822eed..862521483 100644 --- a/desktop/src/shared/services/prime.service.ts +++ b/desktop/src/shared/services/prime.service.ts @@ -5,9 +5,9 @@ import { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog' @Injectable({ providedIn: 'root' }) export class PrimeService { constructor( - private dialog: DialogService, - private confirmation: ConfirmationService, - private messager: MessageService, + private readonly dialog: DialogService, + private readonly confirmation: ConfirmationService, + private readonly messager: MessageService, ) {} open(componentType: Type, config: DynamicDialogConfig) { diff --git a/desktop/src/shared/services/remote-storage.service.ts b/desktop/src/shared/services/remote-storage.service.ts index ff7853dd8..943bf72c7 100644 --- a/desktop/src/shared/services/remote-storage.service.ts +++ b/desktop/src/shared/services/remote-storage.service.ts @@ -4,7 +4,7 @@ import { StorageService } from './storage.service' @Injectable({ providedIn: 'root' }) export class RemoteStorageService implements StorageService { - constructor(private api: ApiService) {} + constructor(private readonly api: ApiService) {} clear() { return this.api.clearPreferences() diff --git a/desktop/src/shared/types/alignment.types.ts b/desktop/src/shared/types/alignment.types.ts index 44c31f6eb..40e91d669 100644 --- a/desktop/src/shared/types/alignment.types.ts +++ b/desktop/src/shared/types/alignment.types.ts @@ -1,7 +1,7 @@ -import { Angle } from './atlas.types' -import { Camera, CameraCaptureEvent, CameraStartCapture } from './camera.types' -import { GuideDirection } from './guider.types' -import { PlateSolverRequest, PlateSolverType } from './settings.types' +import type { Angle } from './atlas.types' +import type { Camera, CameraCaptureEvent, CameraStartCapture } from './camera.types' +import type { GuideDirection } from './guider.types' +import type { PlateSolverRequest, PlateSolverType } from './settings.types' export type Hemisphere = 'NORTHERN' | 'SOUTHERN' diff --git a/desktop/src/shared/types/api.types.ts b/desktop/src/shared/types/api.types.ts index ca46c990e..a1edbff8e 100644 --- a/desktop/src/shared/types/api.types.ts +++ b/desktop/src/shared/types/api.types.ts @@ -1,4 +1,4 @@ -import { Device } from './device.types' +import type { Device } from './device.types' export interface MessageEvent { eventName: string diff --git a/desktop/src/shared/types/app.types.ts b/desktop/src/shared/types/app.types.ts index 46f88162e..15c09bbe7 100644 --- a/desktop/src/shared/types/app.types.ts +++ b/desktop/src/shared/types/app.types.ts @@ -1,4 +1,4 @@ -import { MessageEvent } from './api.types' +import type { MessageEvent } from './api.types' export type Severity = 'success' | 'info' | 'warning' | 'danger' @@ -73,11 +73,13 @@ export interface JsonFile { export interface SaveJson extends OpenFile, JsonFile {} -export interface StoredWindowData { - [key: `window.${string}`]: { - x: number - y: number - width: number - height: number - } +export type StoredWindowDataKey = `window.${string}` + +export type StoredWindowDataValue = { + x: number + y: number + width: number + height: number } + +export type StoredWindowData = Record diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index 047467024..bd77e8ca6 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -1,4 +1,4 @@ -import { PierSide } from './mount.types' +import type { PierSide } from './mount.types' export type Angle = string | number diff --git a/desktop/src/shared/types/autofocus.type.ts b/desktop/src/shared/types/autofocus.type.ts index f2bb585ec..ee0156c74 100644 --- a/desktop/src/shared/types/autofocus.type.ts +++ b/desktop/src/shared/types/autofocus.type.ts @@ -1,6 +1,7 @@ -import { Point } from 'electron' -import { CameraCaptureEvent, CameraStartCapture } from './camera.types' -import { EMPTY_STAR_DETECTION_REQUEST, StarDetectionRequest } from './settings.types' +import type { Point } from 'electron' +import type { CameraCaptureEvent, CameraStartCapture } from './camera.types' +import type { StarDetectionRequest } from './settings.types' +import { EMPTY_STAR_DETECTION_REQUEST } from './settings.types' export type AutoFocusState = 'IDLE' | 'MOVING' | 'EXPOSURING' | 'EXPOSURED' | 'ANALYSING' | 'ANALYSED' | 'CURVE_FITTED' | 'FAILED' | 'FINISHED' @@ -25,7 +26,7 @@ export interface AutoFocusRequest { starDetector: StarDetectionRequest } -export interface AutoFocusPreference extends Omit {} +export type AutoFocusPreference = Omit export const EMPTY_AUTO_FOCUS_PREFERENCE: AutoFocusPreference = { fittingMode: 'HYPERBOLIC', diff --git a/desktop/src/shared/types/auxiliary.types.ts b/desktop/src/shared/types/auxiliary.types.ts index b161e5403..c8ba4f887 100644 --- a/desktop/src/shared/types/auxiliary.types.ts +++ b/desktop/src/shared/types/auxiliary.types.ts @@ -1,4 +1,4 @@ -import { Device } from './device.types' +import type { Device } from './device.types' export interface Thermometer extends Device { hasThermometer: boolean diff --git a/desktop/src/shared/types/calibration.types.ts b/desktop/src/shared/types/calibration.types.ts index 4dfe4875b..51b3c445f 100644 --- a/desktop/src/shared/types/calibration.types.ts +++ b/desktop/src/shared/types/calibration.types.ts @@ -1,4 +1,4 @@ -import { FrameType } from './camera.types' +import type { FrameType } from './camera.types' export interface CalibrationFrame { id: number diff --git a/desktop/src/shared/types/camera.types.ts b/desktop/src/shared/types/camera.types.ts index f656eff2b..8df82172f 100644 --- a/desktop/src/shared/types/camera.types.ts +++ b/desktop/src/shared/types/camera.types.ts @@ -1,7 +1,8 @@ -import { MessageEvent } from './api.types' -import { Thermometer } from './auxiliary.types' -import { CompanionDevice, Device, PropertyState, isCompanionDevice } from './device.types' -import { GuideOutput } from './guider.types' +import type { MessageEvent } from './api.types' +import type { Thermometer } from './auxiliary.types' +import type { CompanionDevice, Device, PropertyState } from './device.types' +import { isCompanionDevice } from './device.types' +import type { GuideOutput } from './guider.types' export type CameraDialogMode = 'CAPTURE' | 'SEQUENCER' | 'FLAT_WIZARD' | 'TPPA' | 'DARV' | 'AUTO_FOCUS' diff --git a/desktop/src/shared/types/device.types.ts b/desktop/src/shared/types/device.types.ts index 0805b69cd..63729dac7 100644 --- a/desktop/src/shared/types/device.types.ts +++ b/desktop/src/shared/types/device.types.ts @@ -1,4 +1,4 @@ -import { DeviceMessageEvent } from './api.types' +import type { DeviceMessageEvent } from './api.types' export type PropertyState = 'IDLE' | 'OK' | 'BUSY' | 'ALERT' diff --git a/desktop/src/shared/types/flat-wizard.types.ts b/desktop/src/shared/types/flat-wizard.types.ts index 89a953818..d2f9aa9e8 100644 --- a/desktop/src/shared/types/flat-wizard.types.ts +++ b/desktop/src/shared/types/flat-wizard.types.ts @@ -1,4 +1,4 @@ -import { CameraCaptureEvent, CameraStartCapture } from './camera.types' +import type { CameraCaptureEvent, CameraStartCapture } from './camera.types' export interface FlatWizardRequest { capture: CameraStartCapture diff --git a/desktop/src/shared/types/focuser.types.ts b/desktop/src/shared/types/focuser.types.ts index 6ff9f4503..b2263cc71 100644 --- a/desktop/src/shared/types/focuser.types.ts +++ b/desktop/src/shared/types/focuser.types.ts @@ -1,5 +1,5 @@ -import { Thermometer } from './auxiliary.types' -import { Device } from './device.types' +import type { Thermometer } from './auxiliary.types' +import type { Device } from './device.types' export interface Focuser extends Device, Thermometer { moving: boolean diff --git a/desktop/src/shared/types/gps.types.ts b/desktop/src/shared/types/gps.types.ts index c2304bc44..f17b8498f 100644 --- a/desktop/src/shared/types/gps.types.ts +++ b/desktop/src/shared/types/gps.types.ts @@ -1,4 +1,4 @@ -import { Device } from './device.types' +import type { Device } from './device.types' export interface GPS extends Device { hasGPS: boolean diff --git a/desktop/src/shared/types/guider.types.ts b/desktop/src/shared/types/guider.types.ts index ca83e5d5e..4ba757fcf 100644 --- a/desktop/src/shared/types/guider.types.ts +++ b/desktop/src/shared/types/guider.types.ts @@ -1,4 +1,4 @@ -import { Device } from './device.types' +import type { Device } from './device.types' export type GuideDirection = | 'NORTH' // DEC+ @@ -87,6 +87,8 @@ export function reverseGuideDirection(direction: GuideDirection): GuideDirection return 'EAST' case 'EAST': return 'WEST' + default: + return direction } } diff --git a/desktop/src/shared/types/home.types.ts b/desktop/src/shared/types/home.types.ts index 481739e8f..3af6d20fb 100644 --- a/desktop/src/shared/types/home.types.ts +++ b/desktop/src/shared/types/home.types.ts @@ -1,9 +1,9 @@ -import { Camera } from './camera.types' -import { DeviceType } from './device.types' -import { Focuser } from './focuser.types' -import { Mount } from './mount.types' -import { Rotator } from './rotator.types' -import { FilterWheel } from './wheel.types' +import type { Camera } from './camera.types' +import type { DeviceType } from './device.types' +import type { Focuser } from './focuser.types' +import type { Mount } from './mount.types' +import type { Rotator } from './rotator.types' +import type { FilterWheel } from './wheel.types' export type HomeWindowType = DeviceType | 'GUIDER' | 'SKY_ATLAS' | 'ALIGNMENT' | 'SEQUENCER' | 'IMAGE' | 'FRAMING' | 'INDI' | 'SETTINGS' | 'CALCULATOR' | 'ABOUT' | 'FLAT_WIZARD' | 'AUTO_FOCUS' diff --git a/desktop/src/shared/types/image.types.ts b/desktop/src/shared/types/image.types.ts index b54ceb543..a9527a743 100644 --- a/desktop/src/shared/types/image.types.ts +++ b/desktop/src/shared/types/image.types.ts @@ -1,7 +1,7 @@ -import { Point, Size } from 'electron' -import { Angle, AstronomicalObject, DeepSkyObject, EquatorialCoordinateJ2000, Star } from './atlas.types' -import { Camera, CameraStartCapture } from './camera.types' -import { PlateSolverRequest, StarDetectionRequest } from './settings.types' +import type { Point, Size } from 'electron' +import type { Angle, AstronomicalObject, DeepSkyObject, EquatorialCoordinateJ2000, Star } from './atlas.types' +import type { Camera, CameraStartCapture } from './camera.types' +import type { PlateSolverRequest, StarDetectionRequest } from './settings.types' export type ImageChannel = 'RED' | 'GREEN' | 'BLUE' | 'GRAY' @@ -121,7 +121,7 @@ export interface ImageStatistics { maximum: number } -export interface StarDetectionImagePreference extends Pick {} +export type StarDetectionImagePreference = Pick export interface PlateSolverImagePreference extends Pick { radius: number diff --git a/desktop/src/shared/types/mount.types.ts b/desktop/src/shared/types/mount.types.ts index 92276bc9e..3f9c409f6 100644 --- a/desktop/src/shared/types/mount.types.ts +++ b/desktop/src/shared/types/mount.types.ts @@ -1,7 +1,7 @@ -import { Angle, EquatorialCoordinate } from './atlas.types' -import { Device } from './device.types' -import { GPS } from './gps.types' -import { GuideOutput } from './guider.types' +import type { Angle, EquatorialCoordinate } from './atlas.types' +import type { Device } from './device.types' +import type { GPS } from './gps.types' +import type { GuideOutput } from './guider.types' export type PierSide = 'EAST' | 'WEST' | 'NEITHER' diff --git a/desktop/src/shared/types/rotator.types.ts b/desktop/src/shared/types/rotator.types.ts index 3fd877f63..2a73995e9 100644 --- a/desktop/src/shared/types/rotator.types.ts +++ b/desktop/src/shared/types/rotator.types.ts @@ -1,4 +1,4 @@ -import { Device } from './device.types' +import type { Device } from './device.types' export interface Rotator extends Device { moving: boolean diff --git a/desktop/src/shared/types/sequencer.types.ts b/desktop/src/shared/types/sequencer.types.ts index 4210ce016..7672dcce3 100644 --- a/desktop/src/shared/types/sequencer.types.ts +++ b/desktop/src/shared/types/sequencer.types.ts @@ -1,8 +1,8 @@ -import { AutoSubFolderMode, Camera, CameraCaptureEvent, CameraStartCapture, Dither } from './camera.types' -import { Focuser } from './focuser.types' -import { Mount } from './mount.types' -import { Rotator } from './rotator.types' -import { FilterWheel } from './wheel.types' +import type { AutoSubFolderMode, Camera, CameraCaptureEvent, CameraStartCapture, Dither } from './camera.types' +import type { Focuser } from './focuser.types' +import type { Mount } from './mount.types' +import type { Rotator } from './rotator.types' +import type { FilterWheel } from './wheel.types' export type SequenceCaptureMode = 'FULLY' | 'INTERLEAVED' diff --git a/desktop/src/shared/types/wheel.types.ts b/desktop/src/shared/types/wheel.types.ts index c9e5ebbbf..a50834423 100644 --- a/desktop/src/shared/types/wheel.types.ts +++ b/desktop/src/shared/types/wheel.types.ts @@ -1,5 +1,5 @@ -import { CameraStartCapture } from './camera.types' -import { Device } from './device.types' +import type { CameraStartCapture } from './camera.types' +import type { Device } from './device.types' export type WheelDialogMode = 'CAPTURE' | 'SEQUENCER' | 'FLAT_WIZARD' diff --git a/desktop/src/shared/utils/comparators.ts b/desktop/src/shared/utils/comparators.ts index 7da6f230f..06a3af46e 100644 --- a/desktop/src/shared/utils/comparators.ts +++ b/desktop/src/shared/utils/comparators.ts @@ -1,4 +1,4 @@ -import { Device } from '../types/device.types' +import type { Device } from '../types/device.types' export type Comparator = (a: T, b: T) => number diff --git a/desktop/src/shared/utils/coordinate-interpolation.ts b/desktop/src/shared/utils/coordinate-interpolation.ts index 874db884a..250b4dec4 100644 --- a/desktop/src/shared/utils/coordinate-interpolation.ts +++ b/desktop/src/shared/utils/coordinate-interpolation.ts @@ -1,7 +1,8 @@ -import { Angle, EquatorialCoordinateJ2000 } from '../types/atlas.types' +import type { Angle, EquatorialCoordinateJ2000 } from '../types/atlas.types' import { degreesToRadians, formatAngle } from './angle' import { BicubicSplineInterpolation } from './bicubic-interpolation' -import { SphericalRepresentation, TimeRepresentation, longitudeDegreesConstrained, obliquity, rectangularEquatorialToEcliptic, rectangularEquatorialToGalactic, rectangularToSphericalDegreesConstrained, sphericalToRectangular } from './ephemeris' +import type { SphericalRepresentation, TimeRepresentation } from './ephemeris' +import { longitudeDegreesConstrained, obliquity, rectangularEquatorialToEcliptic, rectangularEquatorialToGalactic, rectangularToSphericalDegreesConstrained, sphericalToRectangular } from './ephemeris' export interface InterpolatedCoordinate extends EquatorialCoordinateJ2000 { alpha: T @@ -17,19 +18,19 @@ export interface InterpolatedCoordinate extends EquatorialCoord export class CoordinateInterpolator { private readonly Ia: BicubicSplineInterpolation private readonly Id: BicubicSplineInterpolation - private se = 0.0 - private ce = 0.0 + private readonly se: number + private readonly ce: number constructor( Ma: number[], Md: number[], - private x0: number, - private y0: number, - private x1: number, - private y1: number, - private delta: number, - private date?: TimeRepresentation, - private precision: number = 1, + private readonly x0: number, + private readonly y0: number, + private readonly x1: number, + private readonly y1: number, + private readonly delta: number, + private readonly date?: TimeRepresentation, + private readonly precision: number = 1, ) { x0 = Math.min(x0, x1) x1 = Math.max(x0, x1) @@ -40,6 +41,9 @@ export class CoordinateInterpolator { const eps = obliquity(this.date) this.se = Math.sin(eps) this.ce = Math.cos(eps) + } else { + this.se = 0.0 + this.ce = 0.0 } const width = this.x1 - this.x0 From 19a73ee2be12a224514307f9950b5709c81e104c Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 24 Jun 2024 00:16:00 -0300 Subject: [PATCH 04/29] [desktop]: ESLint --- desktop/eslint.config.mjs | 1 + desktop/src/app/calculator/calculator.component.html | 2 +- desktop/src/app/home/home.component.ts | 2 +- desktop/src/shared/pipes/dropdown-options.pipe.ts | 2 +- desktop/src/shared/services/browser-window.service.ts | 2 +- desktop/src/shared/services/electron.service.ts | 2 +- desktop/src/shared/types/app.types.ts | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/desktop/eslint.config.mjs b/desktop/eslint.config.mjs index 20892f188..6176d33fc 100644 --- a/desktop/eslint.config.mjs +++ b/desktop/eslint.config.mjs @@ -47,6 +47,7 @@ export default tseslint.config( '@typescript-eslint/consistent-indexed-object-style': 'error', '@typescript-eslint/prefer-readonly': 'error', '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', '@typescript-eslint/prefer-nullish-coalescing': [ 'error', { diff --git a/desktop/src/app/calculator/calculator.component.html b/desktop/src/app/calculator/calculator.component.html index 232185b98..12e22ca7e 100644 --- a/desktop/src/app/calculator/calculator.component.html +++ b/desktop/src/app/calculator/calculator.component.html @@ -3,7 +3,7 @@ diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index 0ea665dbb..b1a51509f 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -17,7 +17,7 @@ import { Rotator } from '../../shared/types/rotator.types' import { FilterWheel } from '../../shared/types/wheel.types' import { AppComponent } from '../app.component' -type MappedDevice = { +interface MappedDevice { CAMERA: Camera MOUNT: Mount FOCUSER: Focuser diff --git a/desktop/src/shared/pipes/dropdown-options.pipe.ts b/desktop/src/shared/pipes/dropdown-options.pipe.ts index 05a520d64..a0fed50c1 100644 --- a/desktop/src/shared/pipes/dropdown-options.pipe.ts +++ b/desktop/src/shared/pipes/dropdown-options.pipe.ts @@ -8,7 +8,7 @@ import { MountRemoteControlType } from '../types/mount.types' import { SequenceCaptureMode } from '../types/sequencer.types' import { PlateSolverType, StarDetectorType } from '../types/settings.types' -export type DropdownOptions = { +export interface DropdownOptions { STAR_DETECTOR: StarDetectorType[] PLATE_SOLVER: PlateSolverType[] LIVE_STACKER: LiveStackerType[] diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index c8c2bd00b..0962acb51 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -133,7 +133,7 @@ export class BrowserWindowService { } openCalculator(preference: WindowPreference = {}) { - Object.assign(preference, { icon: 'calculator', width: 345, height: 340 }) + Object.assign(preference, { icon: 'calculator', width: 300, height: 335 }) return this.openWindow({ preference, id: 'calculator', path: 'calculator' }) } diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index 90723f276..9598d77da 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -24,7 +24,7 @@ import { Rotator } from '../types/rotator.types' import { SequencerEvent } from '../types/sequencer.types' import { FilterWheel, WheelRenamed } from '../types/wheel.types' -type EventMappedType = { +interface EventMappedType { 'DEVICE.PROPERTY_CHANGED': INDIMessageEvent 'DEVICE.PROPERTY_DELETED': INDIMessageEvent 'DEVICE.MESSAGE_RECEIVED': INDIMessageEvent diff --git a/desktop/src/shared/types/app.types.ts b/desktop/src/shared/types/app.types.ts index 15c09bbe7..5f6759255 100644 --- a/desktop/src/shared/types/app.types.ts +++ b/desktop/src/shared/types/app.types.ts @@ -75,7 +75,7 @@ export interface SaveJson extends OpenFile, JsonFile {} export type StoredWindowDataKey = `window.${string}` -export type StoredWindowDataValue = { +export interface StoredWindowDataValue { x: number y: number width: number From 3c52cfe34e78886c054dc19f8c68b59b5e0564ed Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 24 Jun 2024 16:03:24 -0300 Subject: [PATCH 05/29] [desktop]: Implement Camera Capture Info component --- desktop/app/local.storage.ts | 3 +- desktop/src/app/app.module.ts | 2 + .../app/calculator/calculator.component.ts | 2 +- desktop/src/app/camera/camera.component.ts | 3 +- .../app/filterwheel/filterwheel.component.ts | 7 +-- desktop/src/app/home/home.component.ts | 3 +- .../app/sequencer/sequencer.component.html | 20 +------ .../src/app/sequencer/sequencer.component.ts | 7 +-- .../camera-info/camera-info.component.html | 54 +++++++++++++++++++ .../camera-info/camera-info.component.scss | 28 ++++++++++ .../camera-info/camera-info.component.ts | 32 +++++++++++ .../device-chooser.component.ts | 5 +- .../device-list-menu.component.ts | 3 +- .../dialog-menu/dialog-menu.component.ts | 3 +- .../slide-menu/slide-menu.component.ts | 3 +- desktop/src/shared/pipes/enum.pipe.ts | 3 +- desktop/src/shared/pipes/skyObject.pipe.ts | 3 +- desktop/src/shared/services/api.service.ts | 3 +- .../shared/services/browser-window.service.ts | 9 ++-- .../src/shared/services/electron.service.ts | 9 ++-- desktop/src/shared/services/http.service.ts | 3 +- .../src/shared/services/preference.service.ts | 3 +- desktop/src/shared/services/prime.service.ts | 3 +- .../shared/services/remote-storage.service.ts | 3 +- desktop/src/shared/types/calculator.types.ts | 4 +- desktop/src/shared/utils/types.ts | 3 ++ 26 files changed, 172 insertions(+), 49 deletions(-) create mode 100644 desktop/src/shared/components/camera-info/camera-info.component.html create mode 100644 desktop/src/shared/components/camera-info/camera-info.component.scss create mode 100644 desktop/src/shared/components/camera-info/camera-info.component.ts create mode 100644 desktop/src/shared/utils/types.ts diff --git a/desktop/app/local.storage.ts b/desktop/app/local.storage.ts index a412e007f..a57ec7d76 100644 --- a/desktop/app/local.storage.ts +++ b/desktop/app/local.storage.ts @@ -1,5 +1,6 @@ import * as fs from 'fs' import { dirname } from 'path' +import type { Undefinable } from '../src/shared/utils/types' export class LocalStorage> { private readonly data = Object.create(null) as T @@ -22,7 +23,7 @@ export class LocalStorage> { } } - get(key: K): T[K] | undefined { + get(key: K): Undefinable { return this.data[key] } diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index f025f2ca7..abeed391f 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -43,6 +43,7 @@ import { ToastModule } from 'primeng/toast' import { TooltipModule } from 'primeng/tooltip' import { TreeModule } from 'primeng/tree' import { CameraExposureComponent } from '../shared/components/camera-exposure/camera-exposure.component' +import { CameraInfoComponent } from '../shared/components/camera-info/camera-info.component' import { DeviceChooserComponent } from '../shared/components/device-chooser/device-chooser.component' import { DeviceListMenuComponent } from '../shared/components/device-list-menu/device-list-menu.component' import { DialogMenuComponent } from '../shared/components/dialog-menu/dialog-menu.component' @@ -101,6 +102,7 @@ import { SettingsComponent } from './settings/settings.component' CalculatorComponent, CalibrationComponent, CameraComponent, + CameraInfoComponent, CameraExposureComponent, DeviceChooserComponent, DeviceListMenuComponent, diff --git a/desktop/src/app/calculator/calculator.component.ts b/desktop/src/app/calculator/calculator.component.ts index 8e1c27a74..d9480c8cd 100644 --- a/desktop/src/app/calculator/calculator.component.ts +++ b/desktop/src/app/calculator/calculator.component.ts @@ -215,7 +215,7 @@ export class CalculatorComponent { formula = this.formulae[0] - private autoResizeTimeout: number | undefined + private autoResizeTimeout?: number constructor( app: AppComponent, diff --git a/desktop/src/app/camera/camera.component.ts b/desktop/src/app/camera/camera.component.ts index cf82034f2..d9f734238 100644 --- a/desktop/src/app/camera/camera.component.ts +++ b/desktop/src/app/camera/camera.component.ts @@ -15,6 +15,7 @@ import { Equipment } from '../../shared/types/home.types' import { Mount } from '../../shared/types/mount.types' import { Rotator } from '../../shared/types/rotator.types' import { FilterWheel } from '../../shared/types/wheel.types' +import { Undefinable } from '../../shared/utils/types' import { AppComponent } from '../app.component' @Component({ @@ -553,7 +554,7 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { this.request.liveStacking.executablePath = liveStackingRequest.executablePath this.request.liveStacking.slot = liveStackingRequest.slot || 1 - let shutterPosition: number | undefined + let shutterPosition: Undefinable if (this.equipment.wheel) { const wheelPreference = this.preference.wheelPreference(this.equipment.wheel).get() diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index 6991a4dd2..9a746023b 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -11,6 +11,7 @@ import { PreferenceService } from '../../shared/services/preference.service' import { CameraStartCapture, EMPTY_CAMERA_START_CAPTURE } from '../../shared/types/camera.types' import { Focuser } from '../../shared/types/focuser.types' import { EMPTY_WHEEL, FilterSlot, FilterWheel, WheelDialogInput, WheelDialogMode, WheelPreference } from '../../shared/types/wheel.types' +import { Undefinable } from '../../shared/utils/types' import { AppComponent } from '../app.component' @Component({ @@ -51,7 +52,7 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab return this.mode !== 'CAPTURE' } - get currentFilter(): FilterSlot | undefined { + get currentFilter(): Undefinable { return this.filters[this.position - 1] } @@ -202,8 +203,8 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } async ping() { - await this.api.wheelListen(this.wheel) - if (this.focuser) await this.api.focuserListen(this.focuser) + if (this.wheel.id) await this.api.wheelListen(this.wheel) + if (this.focuser?.id) await this.api.focuserListen(this.focuser) } async wheelChanged(wheel?: FilterWheel) { diff --git a/desktop/src/app/home/home.component.ts b/desktop/src/app/home/home.component.ts index b1a51509f..2b655bac2 100644 --- a/desktop/src/app/home/home.component.ts +++ b/desktop/src/app/home/home.component.ts @@ -15,6 +15,7 @@ import { CONNECTION_TYPES, ConnectionDetails, EMPTY_CONNECTION_DETAILS, HomeWind import { Mount } from '../../shared/types/mount.types' import { Rotator } from '../../shared/types/rotator.types' import { FilterWheel } from '../../shared/types/wheel.types' +import { Undefinable } from '../../shared/utils/types' import { AppComponent } from '../app.component' interface MappedDevice { @@ -45,7 +46,7 @@ export class HomeComponent implements AfterContentInit { showConnectionDialog = false connections: ConnectionDetails[] = [] connection?: ConnectionDetails - newConnection?: [ConnectionDetails, ConnectionDetails | undefined] + newConnection?: [ConnectionDetails, Undefinable] cameras: Camera[] = [] mounts: Mount[] = [] diff --git a/desktop/src/app/sequencer/sequencer.component.html b/desktop/src/app/sequencer/sequencer.component.html index c68eabfd8..f68882700 100644 --- a/desktop/src/app/sequencer/sequencer.component.html +++ b/desktop/src/app/sequencer/sequencer.component.html @@ -381,24 +381,8 @@
-
-
- - - - - - - - - -
+
+
diff --git a/desktop/src/app/sequencer/sequencer.component.ts b/desktop/src/app/sequencer/sequencer.component.ts index 8182e0452..bc7cb6b2e 100644 --- a/desktop/src/app/sequencer/sequencer.component.ts +++ b/desktop/src/app/sequencer/sequencer.component.ts @@ -17,6 +17,7 @@ import { Rotator } from '../../shared/types/rotator.types' import { EMPTY_SEQUENCE_PLAN, SEQUENCE_ENTRY_PROPERTIES, SequenceCaptureMode, SequenceEntryProperty, SequencePlan, SequencerEvent } from '../../shared/types/sequencer.types' import { FilterWheel } from '../../shared/types/wheel.types' import { deviceComparator } from '../../shared/utils/comparators' +import { Undefinable } from '../../shared/utils/types' import { AppComponent } from '../app.component' import { CameraComponent } from '../camera/camera.component' import { FilterWheelComponent } from '../filterwheel/filterwheel.component' @@ -113,7 +114,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable return this.app.subTitle } - set savedPath(value: string | undefined) { + set savedPath(value: Undefinable) { this.app.subTitle = value } @@ -288,7 +289,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } add() { - const camera: Camera | undefined = this.camera ?? this.cameras[0] + const camera = this.camera ?? (this.cameras[0] as Undefinable) // const wheel = this.wheel ?? this.wheels[0] // const focuser = this.focuser ?? this.focusers[0] // const rotator = this.rotator ?? this.rotators[0] @@ -351,7 +352,7 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } private async loadSavedJsonFileFromPathOrAddDefault() { - const savedPath = this.storage.get(SEQUENCER_SAVED_PATH_KEY, undefined) + const savedPath = this.storage.get>(SEQUENCER_SAVED_PATH_KEY, undefined) if (savedPath) { const file = await this.electron.readJson(savedPath) diff --git a/desktop/src/shared/components/camera-info/camera-info.component.html b/desktop/src/shared/components/camera-info/camera-info.component.html new file mode 100644 index 000000000..208896f6e --- /dev/null +++ b/desktop/src/shared/components/camera-info/camera-info.component.html @@ -0,0 +1,54 @@ +
+
+ {{ info.frameType }} + +
+
+ {{ info.exposureAmount || '∞' }} of {{ info.exposureTime | exposureTime }} + +
+
+ {{ info.exposureDelay * 1000000 | exposureTime }} + +
+
+ {{ info.x }} {{ info.y }} {{ info.width }} {{ info.height }} + +
+
+ {{ info.binX }}x{{ info.binY }} + +
+
+ {{ info.gain }} + +
+
+ {{ info.offset }} + +
+
+ {{ info.frameFormat }} + +
+
+ {{ filter }} + +
+
diff --git a/desktop/src/shared/components/camera-info/camera-info.component.scss b/desktop/src/shared/components/camera-info/camera-info.component.scss new file mode 100644 index 000000000..a608020ad --- /dev/null +++ b/desktop/src/shared/components/camera-info/camera-info.component.scss @@ -0,0 +1,28 @@ +.tag { + position: relative; + display: flex; + align-items: end; + border-radius: 4px; + + span { + display: block; + text-align: center; + margin-top: 9px; + font-size: 0.875rem !important; + } + + label { + border-radius: 2px; + font-size: 9px !important; + font-weight: bold; + top: -0.5rem !important; + background-color: #151515d0; + padding: 2px 4px; + position: absolute; + pointer-events: none; + left: 50%; + transform: translate(-50%, 0%); + display: block; + width: max-content; + } +} diff --git a/desktop/src/shared/components/camera-info/camera-info.component.ts b/desktop/src/shared/components/camera-info/camera-info.component.ts new file mode 100644 index 000000000..ac63dd4ab --- /dev/null +++ b/desktop/src/shared/components/camera-info/camera-info.component.ts @@ -0,0 +1,32 @@ +import { Component, Input } from '@angular/core' +import { PreferenceService } from '../../services/preference.service' +import { CameraStartCapture } from '../../types/camera.types' +import { FilterWheel } from '../../types/wheel.types' + +@Component({ + selector: 'neb-camera-info', + templateUrl: './camera-info.component.html', + styleUrls: ['./camera-info.component.scss'], +}) +export class CameraInfoComponent { + @Input({ required: true }) + readonly info!: CameraStartCapture + + @Input() + readonly wheel?: FilterWheel + + get hasFilter() { + return !!this.wheel && !!this.info.filterPosition && this.wheel.connected + } + + get filter() { + if (this.wheel && this.info.filterPosition) { + const preference = this.preference.wheelPreference(this.wheel).get() + return preference.names?.[this.info.filterPosition - 1] ?? `#${this.info.filterPosition}` + } else { + return undefined + } + } + + constructor(private readonly preference: PreferenceService) {} +} diff --git a/desktop/src/shared/components/device-chooser/device-chooser.component.ts b/desktop/src/shared/components/device-chooser/device-chooser.component.ts index ec5c2c2b6..3af1562c6 100644 --- a/desktop/src/shared/components/device-chooser/device-chooser.component.ts +++ b/desktop/src/shared/components/device-chooser/device-chooser.component.ts @@ -1,6 +1,7 @@ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core' import { ApiService } from '../../services/api.service' import { Device } from '../../types/device.types' +import { Undefinable } from '../../utils/types' import { DeviceConnectionCommandEvent, DeviceListMenuComponent } from '../device-list-menu/device-list-menu.component' import { MenuItem } from '../menu-item/menu-item.component' @@ -70,7 +71,7 @@ export class DeviceChooserComponent { item.disabled = true - return new Promise((resolve) => { + return new Promise>((resolve) => { setTimeout(async () => { Object.assign(device, await api.indiDevice(device)) @@ -93,7 +94,7 @@ export class DeviceChooserComponent { item.disabled = true - return new Promise((resolve) => { + return new Promise>((resolve) => { setTimeout(async () => { Object.assign(device, await api.indiDevice(device)) diff --git a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts index 12438fd5a..5af2dc2b5 100644 --- a/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts +++ b/desktop/src/shared/components/device-list-menu/device-list-menu.component.ts @@ -4,6 +4,7 @@ import { PrimeService } from '../../services/prime.service' import { isGuideHead } from '../../types/camera.types' import { Device } from '../../types/device.types' import { deviceComparator } from '../../utils/comparators' +import { Undefinable } from '../../utils/types' import { DialogMenuComponent } from '../dialog-menu/dialog-menu.component' import { MenuItem, SlideMenuItem } from '../menu-item/menu-item.component' @@ -47,7 +48,7 @@ export class DeviceListMenuComponent { show(devices: T[], selected?: NoInfer) { const model: SlideMenuItem[] = [] - return new Promise((resolve) => { + return new Promise>((resolve) => { if (devices.length <= 0) { resolve(undefined) this.prime.message('Please connect your equipment first!', 'warn') diff --git a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts index cc2410b74..30e951077 100644 --- a/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts +++ b/desktop/src/shared/components/dialog-menu/dialog-menu.component.ts @@ -1,4 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core' +import { Undefinable } from '../../utils/types' import { MenuItemCommandEvent, SlideMenuItem } from '../menu-item/menu-item.component' @Component({ @@ -22,7 +23,7 @@ export class DialogMenuComponent { @Input() updateHeaderWithMenuLabel: boolean = true - private readonly navigationHeader: (string | undefined)[] = [] + private readonly navigationHeader: Undefinable[] = [] show() { this.visible = true diff --git a/desktop/src/shared/components/slide-menu/slide-menu.component.ts b/desktop/src/shared/components/slide-menu/slide-menu.component.ts index 801a5663f..0b1df0c79 100644 --- a/desktop/src/shared/components/slide-menu/slide-menu.component.ts +++ b/desktop/src/shared/components/slide-menu/slide-menu.component.ts @@ -1,4 +1,5 @@ import { Component, ElementRef, EventEmitter, Input, OnInit, Output, TemplateRef } from '@angular/core' +import { Nullable } from '../../utils/types' import { MenuItemCommandEvent, SlideMenuItem } from '../menu-item/menu-item.component' @Component({ @@ -11,7 +12,7 @@ export class SlideMenuComponent implements OnInit { readonly model!: SlideMenuItem[] @Input() - readonly appendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined + readonly appendTo: Nullable | string> @Output() readonly onNext = new EventEmitter() diff --git a/desktop/src/shared/pipes/enum.pipe.ts b/desktop/src/shared/pipes/enum.pipe.ts index ca1b25e1a..4a09f52ec 100644 --- a/desktop/src/shared/pipes/enum.pipe.ts +++ b/desktop/src/shared/pipes/enum.pipe.ts @@ -9,6 +9,7 @@ import { Bitpix, SCNRProtectionMethod } from '../types/image.types' import { MountRemoteControlType } from '../types/mount.types' import { SequenceCaptureMode } from '../types/sequencer.types' import { PlateSolverType, StarDetectorType } from '../types/settings.types' +import { Undefinable } from '../utils/types' export type EnumPipeKey = | SCNRProtectionMethod @@ -39,7 +40,7 @@ export type EnumPipeKey = @Pipe({ name: 'enum' }) export class EnumPipe implements PipeTransform { - readonly enums: Record = { + readonly enums: Record> = { ABSOLUTE: 'Absolute', ACTIVE_GALAXY_NUCLEUS: 'Active Galaxy Nucleus', ACTIVE: 'Active', diff --git a/desktop/src/shared/pipes/skyObject.pipe.ts b/desktop/src/shared/pipes/skyObject.pipe.ts index 0c0f24f79..a73df5489 100644 --- a/desktop/src/shared/pipes/skyObject.pipe.ts +++ b/desktop/src/shared/pipes/skyObject.pipe.ts @@ -1,5 +1,6 @@ import { Pipe, PipeTransform } from '@angular/core' import { AstronomicalObject } from '../types/atlas.types' +import { Undefinable } from '../utils/types' const SKY_OBJECT_PARTS = ['name', 'firstName'] as const @@ -7,7 +8,7 @@ export type SkyObjectPart = (typeof SKY_OBJECT_PARTS)[number] @Pipe({ name: 'skyObject' }) export class SkyObjectPipe implements PipeTransform { - transform(value: AstronomicalObject | undefined, what: SkyObjectPart) { + transform(value: Undefinable, what: SkyObjectPart) { switch (what) { case 'name': return value?.name.replaceAll('|', ' · ') diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 14d17efcd..9f274e431 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -17,6 +17,7 @@ import { Rotator } from '../types/rotator.types' import { SequencePlan } from '../types/sequencer.types' import { PlateSolverRequest, StarDetectionRequest } from '../types/settings.types' import { FilterWheel } from '../types/wheel.types' +import { Undefinable } from '../utils/types' import { HttpService } from './http.service' @Injectable({ providedIn: 'root' }) @@ -43,7 +44,7 @@ export class ApiService { } connectionStatus(id: string) { - return this.http.get(`connection/${id}`) + return this.http.get>(`connection/${id}`) } // CAMERA diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 0962acb51..8f98fac44 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -9,6 +9,7 @@ import { ImageSource, OpenImage } from '../types/image.types' import { Mount } from '../types/mount.types' import { Rotator } from '../types/rotator.types' import { FilterWheel, WheelDialogInput } from '../types/wheel.types' +import { Undefinable } from '../utils/types' import { ElectronService } from './electron.service' @Injectable({ providedIn: 'root' }) @@ -20,7 +21,7 @@ export class BrowserWindowService { return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open }) } - openModal(open: OpenWindow): Promise { + openModal(open: OpenWindow): Promise> { open.preference.modal = true return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open }) } @@ -92,17 +93,17 @@ export class BrowserWindowService { return id } - openINDI(data: Device | undefined, preference: WindowPreference = {}) { + openINDI(data?: Device, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'indi', width: 760, height: 420, resizable: true }) return this.openWindow({ preference, data, id: 'indi', path: 'indi' }) } - openSkyAtlas(data: SkyAtlasData | undefined, preference: WindowPreference = {}) { + openSkyAtlas(data?: SkyAtlasData, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'atlas', width: 450, height: 530, autoResizable: false }) return this.openWindow({ preference, data, id: 'atlas', path: 'atlas' }) } - openFraming(data: FramingData | undefined, preference: WindowPreference = {}) { + openFraming(data?: FramingData, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'framing', width: 280, height: 303 }) return this.openWindow({ preference, data, id: 'framing', path: 'framing' }) } diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index 9598d77da..ae7a611ef 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -23,6 +23,7 @@ import { Mount } from '../types/mount.types' import { Rotator } from '../types/rotator.types' import { SequencerEvent } from '../types/sequencer.types' import { FilterWheel, WheelRenamed } from '../types/wheel.types' +import { Undefinable } from '../utils/types' interface EventMappedType { 'DEVICE.PROPERTY_CHANGED': INDIMessageEvent @@ -125,15 +126,15 @@ export class ElectronService { }) } - openFile(data?: OpenFile): Promise { + openFile(data?: OpenFile): Promise> { return this.send('FILE.OPEN', data) } - saveFile(data?: OpenFile): Promise { + saveFile(data?: OpenFile): Promise> { return this.send('FILE.SAVE', data) } - openImage(data?: OpenFile): Promise { + openImage(data?: OpenFile): Promise> { return this.openFile({ ...data, filters: [ @@ -194,7 +195,7 @@ export class ElectronService { return this.send('WINDOW.RESIZE', Math.floor(size)) } - async autoResizeWindow(timeout: number = 500): Promise { + async autoResizeWindow(timeout: number = 500): Promise> { if (timeout <= 0) { const size = document.getElementsByTagName('app-root')[0].getBoundingClientRect().height diff --git a/desktop/src/shared/services/http.service.ts b/desktop/src/shared/services/http.service.ts index e40b9a314..d6310aaa7 100644 --- a/desktop/src/shared/services/http.service.ts +++ b/desktop/src/shared/services/http.service.ts @@ -1,8 +1,9 @@ import { HttpClient } from '@angular/common/http' import { Injectable } from '@angular/core' import { firstValueFrom } from 'rxjs' +import { Nullable } from '../utils/types' -export type QueryParamType = string | number | boolean | undefined | null | QueryParamType[] +export type QueryParamType = Nullable | QueryParamType[] @Injectable({ providedIn: 'root' }) export class HttpService { diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index 6995215eb..25e9a67fd 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -13,6 +13,7 @@ import { EMPTY_MOUNT_PREFERENCE, Mount, MountPreference } from '../types/mount.t import { Rotator, RotatorPreference } from '../types/rotator.types' import { EMPTY_PLATE_SOLVER_REQUEST, EMPTY_STAR_DETECTION_REQUEST, PlateSolverRequest, PlateSolverType, StarDetectionRequest, StarDetectorType } from '../types/settings.types' import { FilterWheel, WheelPreference } from '../types/wheel.types' +import { Undefinable } from '../utils/types' import { LocalStorageService } from './local-storage.service' export class PreferenceData { @@ -30,7 +31,7 @@ export class PreferenceData { return this.storage.get(this.key, defaultValue ?? this.defaultValue) } - set(value: T | undefined) { + set(value: Undefinable) { this.storage.set(this.key, value) } diff --git a/desktop/src/shared/services/prime.service.ts b/desktop/src/shared/services/prime.service.ts index 862521483..5d8fa6005 100644 --- a/desktop/src/shared/services/prime.service.ts +++ b/desktop/src/shared/services/prime.service.ts @@ -1,6 +1,7 @@ import { Injectable, Type } from '@angular/core' import { ConfirmEventType, ConfirmationService, MessageService } from 'primeng/api' import { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog' +import { Undefinable } from '../utils/types' @Injectable({ providedIn: 'root' }) export class PrimeService { @@ -26,7 +27,7 @@ export class PrimeService { }, }) - return new Promise((resolve) => { + return new Promise>((resolve) => { const subscription = ref.onClose.subscribe((data?: R) => { subscription.unsubscribe() resolve(data) diff --git a/desktop/src/shared/services/remote-storage.service.ts b/desktop/src/shared/services/remote-storage.service.ts index 943bf72c7..ade4eba8f 100644 --- a/desktop/src/shared/services/remote-storage.service.ts +++ b/desktop/src/shared/services/remote-storage.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core' +import { Undefinable } from '../utils/types' import { ApiService } from './api.service' import { StorageService } from './storage.service' @@ -15,7 +16,7 @@ export class RemoteStorageService implements StorageService { } async get(key: string, defaultValue: T) { - return (await this.api.getPreference(key)) ?? defaultValue + return (await this.api.getPreference>(key)) ?? defaultValue } has(key: string) { diff --git a/desktop/src/shared/types/calculator.types.ts b/desktop/src/shared/types/calculator.types.ts index 5227d17f8..876c302ab 100644 --- a/desktop/src/shared/types/calculator.types.ts +++ b/desktop/src/shared/types/calculator.types.ts @@ -1,3 +1,5 @@ +import { Undefinable } from '../utils/types' + export interface CalculatorOperand { label: string prefix?: string @@ -15,5 +17,5 @@ export interface CalculatorFormula { operands: CalculatorOperand[] result: CalculatorOperand tip?: string - calculate: (...operands: (number | undefined)[]) => number | undefined + calculate: (...operands: Undefinable[]) => Undefinable } diff --git a/desktop/src/shared/utils/types.ts b/desktop/src/shared/utils/types.ts new file mode 100644 index 000000000..bfdda82fd --- /dev/null +++ b/desktop/src/shared/utils/types.ts @@ -0,0 +1,3 @@ +export type Undefinable = T | undefined + +export type Nullable = Undefinable | null From a7571f8d4a3e2abe18674a33a75c4cd0cbe19dde Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 24 Jun 2024 16:32:37 -0300 Subject: [PATCH 06/29] [desktop]: Display Camera Capture Info on Flat Wizard, Auto Focus and Alignment --- desktop/src/app/alignment/alignment.component.html | 3 +++ desktop/src/app/alignment/alignment.component.ts | 13 ++++++++----- desktop/src/app/autofocus/autofocus.component.html | 3 +++ desktop/src/app/camera/camera.component.ts | 6 ++++-- .../src/app/flat-wizard/flat-wizard.component.html | 3 +++ .../src/app/flat-wizard/flat-wizard.component.ts | 3 +++ desktop/src/app/focuser/focuser.component.ts | 6 ++++-- desktop/src/app/guider/guider.component.ts | 2 +- desktop/src/app/mount/mount.component.ts | 6 ++++-- desktop/src/app/rotator/rotator.component.ts | 6 ++++-- desktop/src/app/sequencer/sequencer.component.ts | 10 +++++----- .../camera-info/camera-info.component.html | 2 +- .../components/camera-info/camera-info.component.ts | 3 +++ .../src/shared/services/browser-window.service.ts | 6 +++--- 14 files changed, 49 insertions(+), 23 deletions(-) diff --git a/desktop/src/app/alignment/alignment.component.html b/desktop/src/app/alignment/alignment.component.html index c9a90dbe1..dececea3b 100644 --- a/desktop/src/app/alignment/alignment.component.html +++ b/desktop/src/app/alignment/alignment.component.html @@ -28,6 +28,9 @@ (deviceChange)="guideOutputChanged()" /> }
+
+ +
diff --git a/desktop/src/app/alignment/alignment.component.ts b/desktop/src/app/alignment/alignment.component.ts index badaf2e2d..6a7b4fdb7 100644 --- a/desktop/src/app/alignment/alignment.component.ts +++ b/desktop/src/app/alignment/alignment.component.ts @@ -73,6 +73,10 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { private autoResizeTimeout?: number + get cameraCaptureRequest() { + return this.tab === 1 ? this.darvRequest.capture : this.tppaRequest.capture + } + constructor( app: AppComponent, private readonly api: ApiService, @@ -253,6 +257,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { const camera = await this.api.camera(this.camera.id) Object.assign(this.camera, camera) + this.loadPreference() } } @@ -262,6 +267,7 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { const mount = await this.api.mount(this.mount.id) Object.assign(this.mount, mount) + this.loadPreference() this.tppaRequest.stepSpeed = mount.slewRate?.name } } @@ -371,11 +377,8 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { } savePreference() { - if (this.tab === 0) { - this.preference.cameraStartCaptureForTPPA(this.camera).set(this.tppaRequest.capture) - } else if (this.tab === 1) { - this.preference.cameraStartCaptureForDARV(this.camera).set(this.darvRequest.capture) - } + this.preference.cameraStartCaptureForTPPA(this.camera).set(this.tppaRequest.capture) + this.preference.cameraStartCaptureForDARV(this.camera).set(this.darvRequest.capture) const preference: AlignmentPreference = { tppaStartFromCurrentPosition: this.tppaRequest.startFromCurrentPosition, diff --git a/desktop/src/app/autofocus/autofocus.component.html b/desktop/src/app/autofocus/autofocus.component.html index 1d2e8c736..5b6dc816c 100644 --- a/desktop/src/app/autofocus/autofocus.component.html +++ b/desktop/src/app/autofocus/autofocus.component.html @@ -18,6 +18,9 @@ [(device)]="focuser" (deviceChange)="focuserChanged()" />
+
+ +
diff --git a/desktop/src/app/camera/camera.component.ts b/desktop/src/app/camera/camera.component.ts index d9f734238..917255f8e 100644 --- a/desktop/src/app/camera/camera.component.ts +++ b/desktop/src/app/camera/camera.component.ts @@ -302,8 +302,10 @@ export class CameraComponent implements AfterContentInit, OnDestroy, Pingable { } } - ping() { - return this.api.cameraListen(this.camera) + async ping() { + if (this.camera.id) { + await this.api.cameraListen(this.camera) + } } private async loadCameraStartCaptureForDialogMode(data?: CameraDialogInput) { diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.html b/desktop/src/app/flat-wizard/flat-wizard.component.html index 9bb5de216..39c60d57e 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.html +++ b/desktop/src/app/flat-wizard/flat-wizard.component.html @@ -19,6 +19,9 @@ [(device)]="wheel" (deviceChange)="wheelChanged()" />
+
+ +
Type
{{ info.exposureAmount || '∞' }} of {{ info.exposureTime | exposureTime }} diff --git a/desktop/src/shared/components/camera-info/camera-info.component.ts b/desktop/src/shared/components/camera-info/camera-info.component.ts index ac63dd4ab..77b5fea8b 100644 --- a/desktop/src/shared/components/camera-info/camera-info.component.ts +++ b/desktop/src/shared/components/camera-info/camera-info.component.ts @@ -15,6 +15,9 @@ export class CameraInfoComponent { @Input() readonly wheel?: FilterWheel + @Input() + readonly hasExposure: boolean = true + get hasFilter() { return !!this.wheel && !!this.info.filterPosition && this.wheel.connected } diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 8f98fac44..aa4896ef2 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -109,7 +109,7 @@ export class BrowserWindowService { } openAlignment(preference: WindowPreference = {}) { - Object.assign(preference, { icon: 'star', width: 425, height: 365 }) + Object.assign(preference, { icon: 'star', width: 425, height: 396 }) return this.openWindow({ preference, id: 'alignment', path: 'alignment' }) } @@ -119,12 +119,12 @@ export class BrowserWindowService { } openAutoFocus(preference: WindowPreference = {}) { - Object.assign(preference, { icon: 'auto-focus', width: 425, height: 420 }) + Object.assign(preference, { icon: 'auto-focus', width: 425, height: 453 }) return this.openWindow({ preference, id: 'auto-focus', path: 'auto-focus' }) } openFlatWizard(preference: WindowPreference = {}) { - Object.assign(preference, { icon: 'star', width: 385, height: 370 }) + Object.assign(preference, { icon: 'star', width: 385, height: 402 }) return this.openWindow({ preference, id: 'flat-wizard', path: 'flat-wizard' }) } From 9d2eca71c53edc6049dba7017aad441d1e15bfcc Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 24 Jun 2024 17:57:17 -0300 Subject: [PATCH 07/29] [api]: Fix possible ConcurrentModificationException --- .../indi/device/AbstractINDIDeviceProvider.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/AbstractINDIDeviceProvider.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/AbstractINDIDeviceProvider.kt index 1fa681d4f..19be70a4d 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/AbstractINDIDeviceProvider.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/AbstractINDIDeviceProvider.kt @@ -198,12 +198,12 @@ abstract class AbstractINDIDeviceProvider : INDIDeviceProvider { } override fun close() { - cameras().onEach(Device::close).toList().onEach(::unregisterCamera) - mounts().onEach(Device::close).toList().onEach(::unregisterMount) - wheels().onEach(Device::close).toList().onEach(::unregisterFilterWheel) - focusers().onEach(Device::close).toList().onEach(::unregisterFocuser) - rotators().onEach(Device::close).toList().onEach(::unregisterRotator) - gps().onEach(Device::close).toList().onEach(::unregisterGPS) + cameras().toList().onEach(Device::close).onEach(::unregisterCamera) + mounts().toList().onEach(Device::close).onEach(::unregisterMount) + wheels().toList().onEach(Device::close).onEach(::unregisterFilterWheel) + focusers().toList().onEach(Device::close).onEach(::unregisterFocuser) + rotators().toList().onEach(Device::close).onEach(::unregisterRotator) + gps().toList().onEach(Device::close).onEach(::unregisterGPS) cameras.clear() mounts.clear() From b1eb8fe97a3ef5d3cf11b0fabd050ea2dbcec2cd Mon Sep 17 00:00:00 2001 From: tiagohm Date: Mon, 24 Jun 2024 21:07:51 -0300 Subject: [PATCH 08/29] [desktop]: Minor fixes; New screenshots --- desktop/home.png | Bin 36806 -> 36800 bytes desktop/sequencer.png | Bin 67173 -> 67683 bytes .../app/alignment/alignment.component.html | 4 +++- desktop/src/app/atlas/atlas.component.html | 8 ++++---- .../app/autofocus/autofocus.component.html | 4 +++- .../flat-wizard/flat-wizard.component.html | 5 ++++- desktop/src/app/image/image.component.ts | 9 ++++----- .../camera-info/camera-info.component.html | 8 +++++--- .../camera-info/camera-info.component.ts | 3 +++ .../shared/services/browser-window.service.ts | 2 +- desktop/src/shared/types/image.types.ts | 1 + 11 files changed, 28 insertions(+), 16 deletions(-) diff --git a/desktop/home.png b/desktop/home.png index 6a5bb89c432a75cae84e2b6ae1ac4d06dfe023ec..2c9c75fac9e3f069a7a7422f9bfee40089091233 100644 GIT binary patch literal 36800 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 WZkQyceEr4-EK?J+YcGvllm7!!tUtj3 diff --git a/desktop/sequencer.png b/desktop/sequencer.png index 679d27ebca1afdb4b93546cda5671e59476fe75f..26fef2e5dd0e1696d475e353d36a0e28b272b0c0 100644 GIT binary patch literal 67683 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 Kc#^2r{r?5+8^H+x literal 67173 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

-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

- +
@@ -179,7 +179,7 @@ [disabled]="refreshing" (onClick)="closeApproachesForMinorPlanets()" icon="mdi mdi-magnify" - severity="success" + severity="info" size="small" [text]="true" />
@@ -597,8 +597,8 @@
+ class="col-9 flex align-items-center justify-content-between absolute gap-2 overflow-hidden" + style="height: 32px; left: 95px; top: 2px; padding-right: 45px;">
- +
- +
diff --git a/desktop/src/app/image/image.component.ts b/desktop/src/app/image/image.component.ts index dec6a0dbb..4ab3031b9 100644 --- a/desktop/src/app/image/image.component.ts +++ b/desktop/src/app/image/image.component.ts @@ -852,8 +852,6 @@ export class ImageComponent implements AfterViewInit, OnDestroy { } private async loadImageFromOpenImage(data: OpenImage) { - console.info('loading image from data: %s', data) - Object.assign(this.imageData, data) // Not clicked on menu item. @@ -872,9 +870,10 @@ export class ImageComponent implements AfterViewInit, OnDestroy { this.disableCalibration(false) } - this.clearOverlay() - - return this.loadImage(true) + if (data.path) { + this.clearOverlay() + await this.loadImage(true) + } } private clearOverlay() { diff --git a/desktop/src/shared/components/camera-info/camera-info.component.html b/desktop/src/shared/components/camera-info/camera-info.component.html index 5f556b512..c972ed305 100644 --- a/desktop/src/shared/components/camera-info/camera-info.component.html +++ b/desktop/src/shared/components/camera-info/camera-info.component.html @@ -1,18 +1,20 @@
-
+
{{ info.frameType }}
- {{ info.exposureAmount || '∞' }} of {{ info.exposureTime | exposureTime }} + {{ info.exposureAmount || '∞' }} / {{ info.exposureTime | exposureTime }}
- {{ info.exposureDelay * 1000000 | exposureTime }} + {{ info.exposureDelay * 1000000 | exposureTime }}
Date: Wed, 26 Jun 2024 17:17:39 -0300 Subject: [PATCH 09/29] [desktop]: Fix update camera capture request when camera is changed --- desktop/src/app/sequencer/sequencer.component.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/desktop/src/app/sequencer/sequencer.component.ts b/desktop/src/app/sequencer/sequencer.component.ts index 5d0f6dd27..48ee6940f 100644 --- a/desktop/src/app/sequencer/sequencer.component.ts +++ b/desktop/src/app/sequencer/sequencer.component.ts @@ -10,7 +10,7 @@ import { LocalStorageService } from '../../shared/services/local-storage.service import { Pingable, Pinger } from '../../shared/services/pinger.service' import { PrimeService } from '../../shared/services/prime.service' import { JsonFile } from '../../shared/types/app.types' -import { Camera, CameraCaptureEvent, CameraStartCapture } from '../../shared/types/camera.types' +import { Camera, CameraCaptureEvent, CameraStartCapture, updateCameraStartCaptureFromCamera } from '../../shared/types/camera.types' import { Focuser } from '../../shared/types/focuser.types' import { Mount } from '../../shared/types/mount.types' import { Rotator } from '../../shared/types/rotator.types' @@ -416,8 +416,18 @@ export class SequencerComponent implements AfterContentInit, OnDestroy, Pingable } } - cameraChanged() { - return this.ping() + async cameraChanged() { + await this.ping() + + this.updateEntriesFromCamera(this.camera) + } + + private updateEntriesFromCamera(camera?: Camera) { + if (camera?.connected) { + for (const entry of this.plan.entries) { + updateCameraStartCaptureFromCamera(entry, camera) + } + } } mountChanged() { From 42f1e8984d1a279b63b6c59783e5e105f46f25b1 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 26 Jun 2024 18:16:17 -0300 Subject: [PATCH 10/29] [desktop]: ESLint --- .../path-chooser/path-chooser.component.ts | 15 +++++++++------ desktop/src/shared/types/calculator.types.ts | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/desktop/src/shared/components/path-chooser/path-chooser.component.ts b/desktop/src/shared/components/path-chooser/path-chooser.component.ts index ada4ae3d6..090302db1 100644 --- a/desktop/src/shared/components/path-chooser/path-chooser.component.ts +++ b/desktop/src/shared/components/path-chooser/path-chooser.component.ts @@ -1,6 +1,7 @@ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core' +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChange, SimpleChanges } from '@angular/core' import { dirname } from 'path' import { ElectronService } from '../../services/electron.service' +import { Undefinable } from '../../utils/types' @Component({ selector: 'neb-path-chooser', @@ -35,14 +36,16 @@ export class PathChooserComponent implements OnChanges { constructor(private readonly electron: ElectronService) {} ngOnChanges(changes: SimpleChanges) { - if (changes['path']?.currentValue) { - this.path = changes['path'].currentValue as string + const pathChanged = changes['path'] as Undefinable + + if (pathChanged?.currentValue) { + this.path = pathChanged.currentValue as string } } async choosePath() { - const storageKey = `pathChooser.${this.key}.defaultPath` - const storedPath = localStorage.getItem(storageKey) + const key = `pathChooser.${this.key}.defaultPath` + const storedPath = localStorage.getItem(key) const defaultPath = storedPath && !this.directory ? dirname(storedPath) : this.path const path = await (this.directory ? this.electron.openDirectory({ defaultPath }) : this.electron.openFile({ defaultPath })) @@ -50,7 +53,7 @@ export class PathChooserComponent implements OnChanges { if (path) { this.path = path this.pathChange.emit(path) - localStorage.setItem(storageKey, path) + localStorage.setItem(key, path) } } } diff --git a/desktop/src/shared/types/calculator.types.ts b/desktop/src/shared/types/calculator.types.ts index 876c302ab..a93dafd14 100644 --- a/desktop/src/shared/types/calculator.types.ts +++ b/desktop/src/shared/types/calculator.types.ts @@ -1,4 +1,4 @@ -import { Undefinable } from '../utils/types' +import type { Undefinable } from '../utils/types' export interface CalculatorOperand { label: string From 18b61485909d69c934571bea1c5ecb8d5e5096e1 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 26 Jun 2024 20:07:37 -0300 Subject: [PATCH 11/29] [desktop]: Improve window auto resize --- .../src/app/alignment/alignment.component.ts | 9 ++----- desktop/src/app/app.component.ts | 27 ++++++++++++++----- .../app/calculator/calculator.component.ts | 13 ++------- .../app/filterwheel/filterwheel.component.ts | 10 ++----- .../app/flat-wizard/flat-wizard.component.ts | 6 ++--- desktop/src/app/framing/framing.component.ts | 2 -- 6 files changed, 29 insertions(+), 38 deletions(-) diff --git a/desktop/src/app/alignment/alignment.component.ts b/desktop/src/app/alignment/alignment.component.ts index 6a7b4fdb7..cff2687f0 100644 --- a/desktop/src/app/alignment/alignment.component.ts +++ b/desktop/src/app/alignment/alignment.component.ts @@ -71,8 +71,6 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { @ViewChild('cameraExposure') private readonly cameraExposure!: CameraExposureComponent - private autoResizeTimeout?: number - get cameraCaptureRequest() { return this.tab === 1 ? this.darvRequest.capture : this.tppaRequest.capture } @@ -175,9 +173,9 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { }) }) - electron.on('TPPA.ELAPSED', async (event) => { + electron.on('TPPA.ELAPSED', (event) => { if (event.camera.id === this.camera.id) { - await ngZone.run(async () => { + ngZone.run(() => { this.status = event.state this.running = event.state !== 'FINISHED' this.pausingOrPaused = event.state === 'PAUSING' || event.state === 'PAUSED' @@ -191,11 +189,8 @@ export class AlignmentComponent implements AfterViewInit, OnDestroy, Pingable { this.tppaAzimuthErrorDirection = event.azimuthErrorDirection this.tppaAltitudeErrorDirection = event.altitudeErrorDirection this.tppaTotalError = event.totalError - clearTimeout(this.autoResizeTimeout) - this.autoResizeTimeout = await electron.autoResizeWindow() } else if (event.state === 'FINISHED') { this.cameraExposure.reset() - await electron.autoResizeWindow() } else if (event.state === 'SOLVED' || event.state === 'SLEWED') { this.tppaFailed = false this.tppaRightAscension = event.rightAscension diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index da0f8b865..c5b5d3adb 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component } from '@angular/core' +import { Component, ElementRef, OnDestroy } from '@angular/core' import { Title } from '@angular/platform-browser' import { APP_CONFIG } from '../environments/environment' import { MenuItem } from '../shared/components/menu-item/menu-item.component' @@ -9,7 +9,7 @@ import { ElectronService } from '../shared/services/electron.service' templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], }) -export class AppComponent implements AfterViewInit { +export class AppComponent implements OnDestroy { pinned = false readonly maximizable = !!window.preference.resizable readonly modal = window.preference.modal ?? false @@ -18,6 +18,8 @@ export class AppComponent implements AfterViewInit { topMenu: MenuItem[] = [] showTopBar = true + private readonly resizeObserver?: ResizeObserver + get title() { return this.windowTitle.getTitle() } @@ -29,6 +31,7 @@ export class AppComponent implements AfterViewInit { constructor( private readonly windowTitle: Title, private readonly electron: ElectronService, + hostElementRef: ElementRef, ) { console.info('APP_CONFIG', APP_CONFIG) @@ -37,14 +40,26 @@ export class AppComponent implements AfterViewInit { } else { console.info('Run in browser', window.preference) } - } - async ngAfterViewInit() { - if (window.preference.autoResizable !== false) { - await this.electron.autoResizeWindow() + if (!window.preference.resizable && window.preference.autoResizable !== false) { + this.resizeObserver = new ResizeObserver((entries) => { + const height = entries[0].target.clientHeight + + if (height) { + void this.electron.resizeWindow(height) + } + }) + + this.resizeObserver.observe(hostElementRef.nativeElement) + } else { + this.resizeObserver = undefined } } + ngOnDestroy() { + this.resizeObserver?.disconnect() + } + pin() { this.pinned = !this.pinned if (this.pinned) return this.electron.pinWindow() diff --git a/desktop/src/app/calculator/calculator.component.ts b/desktop/src/app/calculator/calculator.component.ts index d9480c8cd..437c43a71 100644 --- a/desktop/src/app/calculator/calculator.component.ts +++ b/desktop/src/app/calculator/calculator.component.ts @@ -1,5 +1,4 @@ import { Component, Type } from '@angular/core' -import { ElectronService } from '../../shared/services/electron.service' import { CalculatorFormula } from '../../shared/types/calculator.types' import { AppComponent } from '../app.component' import { FormulaComponent } from './formula/formula.component' @@ -215,17 +214,9 @@ export class CalculatorComponent { formula = this.formulae[0] - private autoResizeTimeout?: number - - constructor( - app: AppComponent, - private readonly electron: ElectronService, - ) { + constructor(app: AppComponent) { app.title = 'Calculator' } - async formulaChanged() { - clearTimeout(this.autoResizeTimeout) - this.autoResizeTimeout = await this.electron.autoResizeWindow() - } + formulaChanged() {} } diff --git a/desktop/src/app/filterwheel/filterwheel.component.ts b/desktop/src/app/filterwheel/filterwheel.component.ts index 9a746023b..8be5608c5 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.ts +++ b/desktop/src/app/filterwheel/filterwheel.component.ts @@ -70,16 +70,11 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab ) { app.title = 'Filter Wheel' - electron.on('WHEEL.UPDATED', async (event) => { + electron.on('WHEEL.UPDATED', (event) => { if (event.device.id === this.wheel.id) { - await ngZone.run(async () => { - const wasConnected = this.wheel.connected + ngZone.run(() => { Object.assign(this.wheel, event.device) this.update() - - if (wasConnected !== event.device.connected) { - await electron.autoResizeWindow(1000) - } }) } }) @@ -217,7 +212,6 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab this.loadPreference() this.update() - await this.electron.autoResizeWindow() } this.app.subTitle = wheel?.name ?? '' diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.ts b/desktop/src/app/flat-wizard/flat-wizard.component.ts index 29e54dc46..e5febd994 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.ts +++ b/desktop/src/app/flat-wizard/flat-wizard.component.ts @@ -55,7 +55,7 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { constructor( app: AppComponent, private readonly api: ApiService, - private readonly electron: ElectronService, + electron: ElectronService, private readonly browserWindow: BrowserWindowService, private readonly prime: PrimeService, private readonly preference: PreferenceService, @@ -65,19 +65,17 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { app.title = 'Flat Wizard' electron.on('FLAT_WIZARD.ELAPSED', (event) => { - return ngZone.run(async () => { + ngZone.run(() => { if (event.state === 'EXPOSURING' && event.capture && event.capture.camera.id === this.camera.id) { this.running = true this.cameraExposure.handleCameraCaptureEvent(event.capture, true) } else if (event.state === 'CAPTURED') { this.running = false this.savedPath = event.savedPath - await this.electron.autoResizeWindow() this.prime.message(`Flat frame captured`) } else if (event.state === 'FAILED') { this.running = false this.savedPath = undefined - await this.electron.autoResizeWindow() this.prime.message(`Failed to find an optimal exposure time from given parameters`, 'error') } }) diff --git a/desktop/src/app/framing/framing.component.ts b/desktop/src/app/framing/framing.component.ts index 7d95e9018..43aceda90 100644 --- a/desktop/src/app/framing/framing.component.ts +++ b/desktop/src/app/framing/framing.component.ts @@ -73,8 +73,6 @@ export class FramingComponent implements AfterViewInit, OnDestroy { this.hipsSurveys = await this.api.hipsSurveys() this.hipsSurvey = this.hipsSurveys.find((e) => e.id === this.hipsSurvey?.id) ?? this.hipsSurveys[0] - await this.electron.autoResizeWindow() - this.route.queryParams.subscribe((e) => { const data = JSON.parse(decodeURIComponent(e['data'] as string)) as FramingData return this.frameFromData(data) From 2ee88620c9af65e3342a6962798754b4f2cac35d Mon Sep 17 00:00:00 2001 From: tiagohm Date: Wed, 26 Jun 2024 22:10:09 -0300 Subject: [PATCH 12/29] [api][desktop]: Fix Filter Wheel names sync --- .../nebulosa/api/cameras/CameraEventHub.kt | 22 +--- .../api/connection/ConnectionEventHub.kt | 19 +-- .../nebulosa/api/devices/DeviceEventHub.kt | 16 ++- .../nebulosa/api/focusers/FocuserEventHub.kt | 20 +--- .../api/guiding/GuideOutputEventHub.kt | 20 +--- .../nebulosa/api/mounts/MountEventHub.kt | 20 +--- .../api/preferences/PreferenceController.kt | 85 -------------- .../api/preferences/PreferenceService.kt | 2 +- .../nebulosa/api/rotators/RotatorEventHub.kt | 20 +--- .../nebulosa/api/wheels/WheelEventHub.kt | 20 +--- .../nebulosa/api/wheels/WheelSerializer.kt | 3 + .../nebulosa/api/wheels/WheelService.kt | 2 +- .../test/kotlin/PreferenceRepositoryTest.kt | 111 ++++++++++++++++++ .../filterwheel/filterwheel.component.html | 7 +- .../app/filterwheel/filterwheel.component.ts | 42 ++----- .../app/flat-wizard/flat-wizard.component.ts | 33 +----- .../camera-info/camera-info.component.ts | 6 +- .../src/shared/services/preference.service.ts | 4 +- desktop/src/shared/types/wheel.types.ts | 26 +++- 19 files changed, 214 insertions(+), 264 deletions(-) delete mode 100644 api/src/main/kotlin/nebulosa/api/preferences/PreferenceController.kt create mode 100644 api/src/test/kotlin/PreferenceRepositoryTest.kt diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt index 8eb839a6e..df08c34ac 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt @@ -16,30 +16,18 @@ import org.springframework.stereotype.Component @Subscriber class CameraEventHub( private val messageService: MessageService, -) : DeviceEventHub(), CameraEventAware { +) : DeviceEventHub("CAMERA"), CameraEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleCameraEvent(event: CameraEvent) { when (event) { is PropertyChangedEvent -> onNext(event) - is CameraAttached -> sendMessage(CAMERA_ATTACHED, event.device) - is CameraDetached -> sendMessage(CAMERA_DETACHED, event.device) + is CameraAttached -> onAttached(event.device) + is CameraDetached -> onDetached(event.device) } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, camera: Camera) { - messageService.sendMessage(CameraMessageEvent(eventName, camera)) - } - - override fun sendUpdate(device: Camera) { - sendMessage(CAMERA_UPDATED, device) - } - - companion object { - - const val CAMERA_UPDATED = "CAMERA.UPDATED" - const val CAMERA_ATTACHED = "CAMERA.ATTACHED" - const val CAMERA_DETACHED = "CAMERA.DETACHED" + override fun sendMessage(eventName: String, device: Camera) { + messageService.sendMessage(CameraMessageEvent(eventName, device)) } } diff --git a/api/src/main/kotlin/nebulosa/api/connection/ConnectionEventHub.kt b/api/src/main/kotlin/nebulosa/api/connection/ConnectionEventHub.kt index 7d2ad055b..7b4dcc4ff 100644 --- a/api/src/main/kotlin/nebulosa/api/connection/ConnectionEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/connection/ConnectionEventHub.kt @@ -27,18 +27,19 @@ class ConnectionEventHub( private val rotatorEventHub: RotatorEventHub, ) : DeviceEventHandler.EventReceived { - @Suppress("CascadeIf") override fun onEventReceived(event: DeviceEvent<*>) { - if (event is DeviceConnectionEvent) { - val device = event.device ?: return + val device = event.device ?: return - if (device is Camera) cameraEventHub.sendUpdate(device) - else if (device is Mount) mountEventHub.sendUpdate(device) - else if (device is Focuser) focuserEventHub.sendUpdate(device) - else if (device is FilterWheel) wheelEventHub.sendUpdate(device) - else if (device is Rotator) rotatorEventHub.sendUpdate(device) + if (event is DeviceConnectionEvent) { + when (device) { + is Camera -> cameraEventHub.onConnectionChanged(device) + is Mount -> mountEventHub.onConnectionChanged(device) + is Focuser -> focuserEventHub.onConnectionChanged(device) + is FilterWheel -> wheelEventHub.onConnectionChanged(device) + is Rotator -> rotatorEventHub.onConnectionChanged(device) + } - if (device is GuideOutput) guideOutputEventHub.sendUpdate(device) + if (device is GuideOutput) guideOutputEventHub.onConnectionChanged(device) } } } diff --git a/api/src/main/kotlin/nebulosa/api/devices/DeviceEventHub.kt b/api/src/main/kotlin/nebulosa/api/devices/DeviceEventHub.kt index 34c12f05e..d1ab09008 100644 --- a/api/src/main/kotlin/nebulosa/api/devices/DeviceEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/devices/DeviceEventHub.kt @@ -8,11 +8,15 @@ import java.io.Closeable import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit -abstract class DeviceEventHub> : Closeable { +abstract class DeviceEventHub>(eventName: String) : Closeable { private val throttler = PublishSubject.create() private val listenable = ConcurrentHashMap(2) + private val updateEventName = "$eventName.UPDATED" + private val attachedEventName = "$eventName.ATTACHED" + private val detachedEventName = "$eventName.DETACHED" + init { throttler .throttleLast(1000, TimeUnit.MILLISECONDS) @@ -30,7 +34,15 @@ abstract class DeviceEventHub> : Closeable { } } - abstract fun sendUpdate(device: D) + abstract fun sendMessage(eventName: String, device: D) + + open fun sendUpdate(device: D) = sendMessage(updateEventName, device) + + open fun onAttached(device: D) = sendMessage(attachedEventName, device) + + open fun onDetached(device: D) = sendMessage(detachedEventName, device) + + open fun onConnectionChanged(device: D) = sendUpdate(device) protected fun onNext(event: E) = throttler.onNext(event) diff --git a/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt b/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt index 7519aee3c..e606da7fc 100644 --- a/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt @@ -16,30 +16,18 @@ import org.springframework.stereotype.Component @Subscriber class FocuserEventHub( private val messageService: MessageService, -) : DeviceEventHub(), FocuserEventAware { +) : DeviceEventHub("FOCUSER"), FocuserEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleFocuserEvent(event: FocuserEvent) { when (event) { is PropertyChangedEvent -> onNext(event) - is FocuserAttached -> sendMessage(FOCUSER_ATTACHED, event.device) - is FocuserDetached -> sendMessage(FOCUSER_DETACHED, event.device) + is FocuserAttached -> onAttached(event.device) + is FocuserDetached -> onDetached(event.device) } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, device: Focuser) { + override fun sendMessage(eventName: String, device: Focuser) { messageService.sendMessage(FocuserMessageEvent(eventName, device)) } - - override fun sendUpdate(device: Focuser) { - sendMessage(FOCUSER_UPDATED, device) - } - - companion object { - - const val FOCUSER_UPDATED = "FOCUSER.UPDATED" - const val FOCUSER_ATTACHED = "FOCUSER.ATTACHED" - const val FOCUSER_DETACHED = "FOCUSER.DETACHED" - } } diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt index 0621e1a1e..cbdd8795e 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component @Subscriber class GuideOutputEventHub( private val messageService: MessageService, -) : DeviceEventHub>(), GuideOutputEventAware { +) : DeviceEventHub>("GUIDE_OUTPUT"), GuideOutputEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleGuideOutputEvent(event: DeviceEvent) { @@ -28,25 +28,13 @@ class GuideOutputEventHub( } } else { when (event) { - is GuideOutputAttached -> sendMessage(GUIDE_OUTPUT_ATTACHED, event.device) - is GuideOutputDetached -> sendMessage(GUIDE_OUTPUT_DETACHED, event.device) + is GuideOutputAttached -> onAttached(event.device) + is GuideOutputDetached -> onDetached(event.device) } } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, device: GuideOutput) { + override fun sendMessage(eventName: String, device: GuideOutput) { messageService.sendMessage(GuideOutputMessageEvent(eventName, device)) } - - override fun sendUpdate(device: GuideOutput) { - sendMessage(GUIDE_OUTPUT_UPDATED, device) - } - - companion object { - - const val GUIDE_OUTPUT_UPDATED = "GUIDE_OUTPUT.UPDATED" - const val GUIDE_OUTPUT_ATTACHED = "GUIDE_OUTPUT.ATTACHED" - const val GUIDE_OUTPUT_DETACHED = "GUIDE_OUTPUT.DETACHED" - } } diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt index f9a7b72b5..98d111d84 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt @@ -16,30 +16,18 @@ import org.springframework.stereotype.Component @Subscriber class MountEventHub( private val messageService: MessageService, -) : DeviceEventHub(), MountEventAware { +) : DeviceEventHub("MOUNT"), MountEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleMountEvent(event: MountEvent) { when (event) { is PropertyChangedEvent -> onNext(event) - is MountAttached -> sendMessage(MOUNT_ATTACHED, event.device) - is MountDetached -> sendMessage(MOUNT_DETACHED, event.device) + is MountAttached -> onAttached(event.device) + is MountDetached -> onDetached(event.device) } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, device: Mount) { + override fun sendMessage(eventName: String, device: Mount) { messageService.sendMessage(MountMessageEvent(eventName, device)) } - - override fun sendUpdate(device: Mount) { - sendMessage(MOUNT_UPDATED, device) - } - - companion object { - - const val MOUNT_UPDATED = "MOUNT.UPDATED" - const val MOUNT_ATTACHED = "MOUNT.ATTACHED" - const val MOUNT_DETACHED = "MOUNT.DETACHED" - } } diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceController.kt b/api/src/main/kotlin/nebulosa/api/preferences/PreferenceController.kt deleted file mode 100644 index ebaed477d..000000000 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceController.kt +++ /dev/null @@ -1,85 +0,0 @@ -package nebulosa.api.preferences - -import org.springframework.web.bind.annotation.* - -@RestController -@RequestMapping("preferences") -class PreferenceController( - private val preferenceService: PreferenceService, -) { - - @GetMapping("{key}/boolean") - fun getBoolean(@PathVariable key: String): Boolean? { - return preferenceService.getBoolean(key) - } - - @GetMapping("{key}/int") - fun getInt(@PathVariable key: String): Int? { - return preferenceService.getInt(key) - } - - @GetMapping("{key}/long") - fun getLong(@PathVariable key: String): Long? { - return preferenceService.getLong(key) - } - - @GetMapping("{key}/double") - fun getDouble(@PathVariable key: String): Double? { - return preferenceService.getDouble(key) - } - - @GetMapping("{key}/text") - fun getText(@PathVariable key: String): String? { - return preferenceService.getText(key) - } - - @GetMapping("{key}") - fun getJSON(@PathVariable key: String): Any? { - return preferenceService.getJSON(key) - } - - @PutMapping("{key}/boolean") - fun putBoolean(@PathVariable key: String, @RequestParam value: Boolean) { - preferenceService.putBoolean(key, value) - } - - @PutMapping("{key}/int") - fun putInt(@PathVariable key: String, @RequestParam value: Int) { - preferenceService.putInt(key, value) - } - - @PutMapping("{key}/long") - fun putLong(@PathVariable key: String, @RequestParam value: Long) { - preferenceService.putLong(key, value) - } - - @PutMapping("{key}/double") - fun putDouble(@PathVariable key: String, @RequestParam value: Double) { - preferenceService.putDouble(key, value) - } - - @PutMapping("{key}/text") - fun putText(@PathVariable key: String, @RequestParam value: String) { - preferenceService.putText(key, value) - } - - @PutMapping("{key}") - fun putJSON(@PathVariable key: String, @RequestBody body: PreferenceRequestBody?) { - preferenceService.putJSON(key, body?.data) - } - - @DeleteMapping("{key}") - fun delete(@PathVariable key: String) { - return preferenceService.delete(key) - } - - @PutMapping("{key}/exists") - fun exists(@PathVariable key: String): Boolean { - return key in preferenceService - } - - @PutMapping("clear") - fun clear() { - return preferenceService.clear() - } -} diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt b/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt index 580c0fe6f..9a82f6fe1 100644 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt +++ b/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt @@ -7,7 +7,7 @@ import org.springframework.stereotype.Service class PreferenceService( private val preferenceRepository: PreferenceRepository, private val objectMapper: ObjectMapper, -) { +) : Collection by preferenceRepository { operator fun get(key: String) = preferenceRepository.findByKey(key) diff --git a/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt b/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt index 841d42939..6b610e530 100644 --- a/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt @@ -16,30 +16,18 @@ import org.springframework.stereotype.Component @Subscriber class RotatorEventHub( private val messageService: MessageService, -) : DeviceEventHub(), RotatorEventAware { +) : DeviceEventHub("ROTATOR"), RotatorEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleRotatorEvent(event: RotatorEvent) { when (event) { is PropertyChangedEvent -> onNext(event) - is RotatorAttached -> sendMessage(ROTATOR_ATTACHED, event.device) - is RotatorDetached -> sendMessage(ROTATOR_DETACHED, event.device) + is RotatorAttached -> onAttached(event.device) + is RotatorDetached -> onDetached(event.device) } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, device: Rotator) { + override fun sendMessage(eventName: String, device: Rotator) { messageService.sendMessage(RotatorMessageEvent(eventName, device)) } - - override fun sendUpdate(device: Rotator) { - sendMessage(ROTATOR_UPDATED, device) - } - - companion object { - - const val ROTATOR_UPDATED = "ROTATOR.UPDATED" - const val ROTATOR_ATTACHED = "ROTATOR.ATTACHED" - const val ROTATOR_DETACHED = "ROTATOR.DETACHED" - } } diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt index a6db67264..35416909d 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt @@ -16,30 +16,18 @@ import org.springframework.stereotype.Component @Subscriber class WheelEventHub( private val messageService: MessageService, -) : DeviceEventHub(), WheelEventAware { +) : DeviceEventHub("WHEEL"), WheelEventAware { @Subscribe(threadMode = ThreadMode.ASYNC) override fun handleFilterWheelEvent(event: FilterWheelEvent) { when (event) { is PropertyChangedEvent -> onNext(event) - is FilterWheelAttached -> sendMessage(WHEEL_ATTACHED, event.device) - is FilterWheelDetached -> sendMessage(WHEEL_DETACHED, event.device) + is FilterWheelAttached -> onAttached(event.device) + is FilterWheelDetached -> onDetached(event.device) } } - @Suppress("NOTHING_TO_INLINE") - private inline fun sendMessage(eventName: String, device: FilterWheel) { + override fun sendMessage(eventName: String, device: FilterWheel) { messageService.sendMessage(WheelMessageEvent(eventName, device)) } - - override fun sendUpdate(device: FilterWheel) { - sendMessage(WHEEL_UPDATED, device) - } - - companion object { - - const val WHEEL_UPDATED = "WHEEL.UPDATED" - const val WHEEL_ATTACHED = "WHEEL.ATTACHED" - const val WHEEL_DETACHED = "WHEEL.DETACHED" - } } diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelSerializer.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelSerializer.kt index 31510ba08..698abf566 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelSerializer.kt @@ -18,6 +18,9 @@ class WheelSerializer : StdSerializer(FilterWheel::class.java) { gen.writeNumberField("count", value.count) gen.writeNumberField("position", value.position) gen.writeBooleanField("moving", value.moving) + gen.writeArrayFieldStart("names") + value.names.forEach(gen::writeString) + gen.writeEndArray() gen.writeEndObject() } } diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelService.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelService.kt index fcc199be7..bae534f6b 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelService.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelService.kt @@ -18,7 +18,7 @@ class WheelService(private val wheelEventHub: WheelEventHub) { wheel.moveTo(steps) } - fun sync(wheel: FilterWheel, names: List) { + fun sync(wheel: FilterWheel, names: Iterable) { wheel.names(names) } diff --git a/api/src/test/kotlin/PreferenceRepositoryTest.kt b/api/src/test/kotlin/PreferenceRepositoryTest.kt new file mode 100644 index 000000000..69ceb5883 --- /dev/null +++ b/api/src/test/kotlin/PreferenceRepositoryTest.kt @@ -0,0 +1,111 @@ +import com.fasterxml.jackson.module.kotlin.jsonMapper +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.booleans.shouldBeFalse +import io.kotest.matchers.booleans.shouldBeTrue +import io.kotest.matchers.doubles.shouldBeExactly +import io.kotest.matchers.ints.shouldBeExactly +import io.kotest.matchers.longs.shouldBeExactly +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import io.objectbox.kotlin.boxFor +import nebulosa.api.atlas.Location +import nebulosa.api.database.MyObjectBox +import nebulosa.api.preferences.PreferenceEntity +import nebulosa.api.preferences.PreferenceRepository +import nebulosa.api.preferences.PreferenceService +import nebulosa.indi.device.camera.FrameType +import java.util.* + +class PreferenceRepositoryTest : StringSpec() { + + init { + val boxStore = MyObjectBox.builder() + .inMemory(UUID.randomUUID().toString()) + .build() + + afterSpec { + boxStore.close() + } + + val box = boxStore.boxFor() + val repository = PreferenceRepository(box) + val service = PreferenceService(repository, jsonMapper { }) + + "boolean" { + service.contains("b").shouldBeFalse() + service.putBoolean("b", true) + service.contains("b").shouldBeTrue() + service.getBoolean("b").shouldNotBeNull().shouldBeTrue() + service.putBoolean("b", false) + service.getBoolean("b").shouldNotBeNull().shouldBeFalse() + service.delete("b") + service.contains("b").shouldBeFalse() + service.getBoolean("b").shouldBeNull() + } + "int" { + service.contains("i").shouldBeFalse() + service.putInt("i", 22) + service.contains("i").shouldBeTrue() + service.getInt("i").shouldNotBeNull() shouldBeExactly 22 + service.delete("i") + service.contains("i").shouldBeFalse() + service.getInt("i").shouldBeNull() + } + "long" { + service.contains("l").shouldBeFalse() + service.putLong("l", 22L) + service.contains("l").shouldBeTrue() + service.getLong("l").shouldNotBeNull() shouldBeExactly 22L + service.delete("l") + service.contains("l").shouldBeFalse() + service.getLong("l").shouldBeNull() + } + "double" { + service.contains("d").shouldBeFalse() + service.putDouble("d", 22.0) + service.contains("d").shouldBeTrue() + service.getDouble("d").shouldNotBeNull() shouldBeExactly 22.0 + service.delete("d") + service.contains("d").shouldBeFalse() + service.getDouble("d").shouldBeNull() + } + "text" { + service.contains("s").shouldBeFalse() + service.putText("s", "Texto") + service.contains("s").shouldBeTrue() + service.getText("s").shouldNotBeNull() shouldBe "Texto" + service.delete("s") + service.contains("s").shouldBeFalse() + service.getText("s").shouldBeNull() + } + "enum" { + service.contains("e").shouldBeFalse() + service.putEnum("e", FrameType.DARK) + service.contains("e").shouldBeTrue() + service.getEnum("e").shouldNotBeNull() shouldBe FrameType.DARK + service.delete("e") + service.contains("e").shouldBeFalse() + service.getEnum("e").shouldBeNull() + } + "json" { + service.contains("j").shouldBeFalse() + service.putJSON("j", Location(longitude = 123.456)) + service.contains("j").shouldBeTrue() + service.getJSON("j").shouldNotBeNull() shouldBe Location(longitude = 123.456) + service.delete("j") + service.contains("j").shouldBeFalse() + service.getJSON("j").shouldBeNull() + } + "clear" { + service.putLong("l", 22L) + service.putDouble("d", 22.0) + service.putText("s", "Texto") + service.putEnum("e", FrameType.DARK) + service.putJSON("j", Location(longitude = 123.456)) + service.size shouldBeExactly 5 + service.clear() + service.isEmpty().shouldBeTrue() + } + } +} diff --git a/desktop/src/app/filterwheel/filterwheel.component.html b/desktop/src/app/filterwheel/filterwheel.component.html index 914f1e68d..0dcbeceab 100644 --- a/desktop/src/app/filterwheel/filterwheel.component.html +++ b/desktop/src/app/filterwheel/filterwheel.component.html @@ -35,6 +35,9 @@ class="col-12 pt-0 text-sm text-gray-400 flex align-items-center my-1 gap-1"> {{ moving ? 'moving' : 'idle' }} + - { this.savePreference() + + const names = this.filters.map(e => e.name) + await this.api.wheelSync(this.wheel, names) await this.electron.send('WHEEL.RENAMED', { wheel: this.wheel, filter }) }) @@ -317,18 +320,18 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab } focusOffsetForFilter(filter: FilterSlot) { - return this.focuser ? this.preference.focusOffset(this.wheel, this.focuser, filter.position).get() : 0 + return this.focuser ? this.preference.focusOffsets(this.wheel, this.focuser).get()[filter.position - 1] ?? 0 : 0 } private updateFocusOffset() { - if (this.filter) { - this.focusOffset = this.focuser ? this.preference.focusOffset(this.wheel, this.focuser, this.filter.position).get() : 0 - } + this.focusOffset = this.filter ? this.focusOffsetForFilter(this.filter) : 0 } focusOffsetChanged() { if (this.filter && this.focuser) { - this.preference.focusOffset(this.wheel, this.focuser, this.filter.position).set(this.focusOffset) + const offsets = this.preference.focusOffsets(this.wheel, this.focuser).get() + offsets[this.filter.position - 1] = this.focusOffset + this.preference.focusOffsets(this.wheel, this.focuser).set(offsets) } } @@ -346,30 +349,10 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab if (this.moving) return - let filters: FilterSlot[] = [] - let filtersChanged = true - - if (this.wheel.count <= 0) { - this.filters = [] - return - } else if (this.wheel.count !== this.filters.length) { - filters = new Array(this.wheel.count) - } else { - filters = this.filters - filtersChanged = false - } - - if (filtersChanged) { - const preference = this.preference.wheelPreference(this.wheel).get() - - for (let position = 1; position <= filters.length; position++) { - const name = preference.names?.[position - 1] ?? `Filter #${position}` - const offset = preference.offsets?.[position - 1] ?? 0 - const dark = position === preference.shutterPosition - const filter = { position, name, dark, offset } - filters[position - 1] = filter - } + const preference = this.preference.wheelPreference(this.wheel).get() + const filters = makeFilterSlots(this.wheel, this.filters, preference.shutterPosition) + if (filters !== this.filters) { this.filters = filters this.filter = filters[(this.filter?.position ?? this.position) - 1] ?? filters[0] } @@ -391,7 +374,6 @@ export class FilterWheelComponent implements AfterContentInit, OnDestroy, Pingab const preference: WheelPreference = { shutterPosition: dark?.position ?? 0, - names: this.filters.map((e) => e.name), } this.preference.wheelPreference(this.wheel).set(preference) diff --git a/desktop/src/app/flat-wizard/flat-wizard.component.ts b/desktop/src/app/flat-wizard/flat-wizard.component.ts index e5febd994..52ab9c3bd 100644 --- a/desktop/src/app/flat-wizard/flat-wizard.component.ts +++ b/desktop/src/app/flat-wizard/flat-wizard.component.ts @@ -8,7 +8,7 @@ import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' import { Camera, EMPTY_CAMERA, EMPTY_CAMERA_START_CAPTURE, updateCameraStartCaptureFromCamera } from '../../shared/types/camera.types' import { FlatWizardRequest } from '../../shared/types/flat-wizard.types' -import { EMPTY_WHEEL, FilterSlot, FilterWheel } from '../../shared/types/wheel.types' +import { EMPTY_WHEEL, FilterSlot, FilterWheel, makeFilterSlots } from '../../shared/types/wheel.types' import { deviceComparator } from '../../shared/utils/comparators' import { AppComponent } from '../app.component' import { CameraComponent } from '../camera/camera.component' @@ -34,8 +34,6 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { filters: FilterSlot[] = [] selectedFilters: FilterSlot[] = [] - private readonly selectedFiltersMap = new Map() - readonly request: FlatWizardRequest = { capture: structuredClone(EMPTY_CAMERA_START_CAPTURE), exposureMin: 1, @@ -189,33 +187,12 @@ export class FlatWizardComponent implements AfterViewInit, OnDestroy, Pingable { if (this.wheel.id) { await this.ping() - let filters: FilterSlot[] = [] - let filtersChanged = true - - if (this.wheel.count <= 0) { - this.filters = [] - return - } else if (this.wheel.count !== this.filters.length) { - filters = new Array(this.wheel.count) - } else { - filters = this.filters - filtersChanged = false - } - - if (filtersChanged) { - const preference = this.preference.wheelPreference(this.wheel).get() - - for (let position = 1; position <= filters.length; position++) { - const name = preference.names?.[position - 1] ?? `Filter #${position}` - const offset = preference.offsets?.[position - 1] ?? 0 - const dark = position === preference.shutterPosition - const filter = { position, name, dark, offset } - filters[position - 1] = filter - } + const preference = this.preference.wheelPreference(this.wheel).get() + const filters = makeFilterSlots(this.wheel, this.filters, preference.shutterPosition) + if (filters !== this.filters) { this.filters = filters - this.selectedFilters = this.selectedFiltersMap.get(this.wheel.name) ?? [] - this.selectedFiltersMap.set(this.wheel.name, this.selectedFilters) + this.selectedFilters = [] } } } diff --git a/desktop/src/shared/components/camera-info/camera-info.component.ts b/desktop/src/shared/components/camera-info/camera-info.component.ts index 91ff92c4f..dd180f422 100644 --- a/desktop/src/shared/components/camera-info/camera-info.component.ts +++ b/desktop/src/shared/components/camera-info/camera-info.component.ts @@ -1,5 +1,4 @@ import { Component, Input } from '@angular/core' -import { PreferenceService } from '../../services/preference.service' import { CameraStartCapture } from '../../types/camera.types' import { FilterWheel } from '../../types/wheel.types' @@ -27,12 +26,9 @@ export class CameraInfoComponent { get filter() { if (this.wheel && this.info.filterPosition) { - const preference = this.preference.wheelPreference(this.wheel).get() - return preference.names?.[this.info.filterPosition - 1] ?? `#${this.info.filterPosition}` + return this.wheel.names[this.info.filterPosition - 1] || `#${this.info.filterPosition}` } else { return undefined } } - - constructor(private readonly preference: PreferenceService) {} } diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index 25e9a67fd..cf9188933 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -88,8 +88,8 @@ export class PreferenceService { return new PreferenceData(this.storage, `equipment.${device.name}`, () => ({}) as Equipment) } - focusOffset(wheel: FilterWheel, focuser: Focuser, position: number) { - return new PreferenceData(this.storage, `focusOffset.${wheel.name}.${position}.${focuser.name}`, () => 0) + focusOffsets(wheel: FilterWheel, focuser: Focuser) { + return new PreferenceData(this.storage, `focusOffsets.${wheel.name}.${focuser.name}`, () => new Array(wheel.count).fill(0)) } focuserPreference(focuser: Focuser) { diff --git a/desktop/src/shared/types/wheel.types.ts b/desktop/src/shared/types/wheel.types.ts index a50834423..bb2c7168f 100644 --- a/desktop/src/shared/types/wheel.types.ts +++ b/desktop/src/shared/types/wheel.types.ts @@ -29,8 +29,6 @@ export interface WheelDialogInput { export interface WheelPreference { shutterPosition?: number - names?: string[] - offsets?: number[] } export interface FilterSlot { @@ -44,6 +42,30 @@ export interface WheelRenamed { filter: FilterSlot } +export function makeFilterSlots(wheel: FilterWheel, filters: FilterSlot[], shutterPosition: number = 0) { + if (wheel.count <= 0) { + filters = [] + } else if (wheel.count !== filters.length) { + filters = new Array(wheel.count) + } + + if (filters.length) { + for (let position = 0; position < filters.length; position++) { + const name = wheel.names[position] || `Filter #${position}` + const dark = position + 1 === shutterPosition + + if (!filters[position]) { + filters[position] = { position: position + 1, name, dark } + } else { + filters[position].dark = dark + filters[position].name = name + } + } + } + + return filters +} + export function isFilterWheel(device?: Device): device is FilterWheel { return !!device && 'count' in device } From 42dd60ec7edd58759bb404436ddaf60da4af511c Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 27 Jun 2024 16:45:19 -0300 Subject: [PATCH 13/29] [api]: Improve Filter Wheel names add --- .../nebulosa/indi/client/device/wheels/INDIFilterWheel.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt index ce0c347cd..3aba0c03b 100644 --- a/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt +++ b/nebulosa-indi-client/src/main/kotlin/nebulosa/indi/client/device/wheels/INDIFilterWheel.kt @@ -55,12 +55,8 @@ internal open class INDIFilterWheel( "FILTER_NAME" -> { names.clear() - repeat(16) { - val key = "FILTER_SLOT_NAME_${it + 1}" - - if (key in message) { - names.add(message[key]!!.value) - } + for (i in 1..16) { + message["FILTER_SLOT_NAME_$i"]?.value?.also(names::add) ?: break } sender.fireOnEventReceived(FilterWheelNamesChanged(this)) From 9a99648e10d522f8ee03f0d06691b8e099825e32 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 27 Jun 2024 16:50:53 -0300 Subject: [PATCH 14/29] [api]: Rename packages --- .../kotlin/nebulosa/api/alignment/polar/darv/DARVEvent.kt | 2 +- .../nebulosa/api/alignment/polar/darv/DARVExecutor.kt | 4 ++-- .../kotlin/nebulosa/api/alignment/polar/darv/DARVTask.kt | 2 +- .../kotlin/nebulosa/api/alignment/polar/tppa/TPPAEvent.kt | 2 +- .../nebulosa/api/alignment/polar/tppa/TPPAExecutor.kt | 4 ++-- .../kotlin/nebulosa/api/alignment/polar/tppa/TPPATask.kt | 2 +- api/src/main/kotlin/nebulosa/api/atlas/IERSUpdateTask.kt | 2 +- .../main/kotlin/nebulosa/api/atlas/LibWCSDownloadTask.kt | 2 +- .../nebulosa/api/atlas/SatelliteUpdateNotificationEvent.kt | 2 +- .../main/kotlin/nebulosa/api/atlas/SatelliteUpdateTask.kt | 4 ++-- .../nebulosa/api/atlas/SkyAtlasUpdateNotificationEvent.kt | 2 +- .../main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt | 4 ++-- .../main/kotlin/nebulosa/api/autofocus/AutoFocusEvent.kt | 2 +- .../main/kotlin/nebulosa/api/autofocus/AutoFocusExecutor.kt | 4 ++-- api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusTask.kt | 2 +- .../nebulosa/api/beans/configurations/BeanConfiguration.kt | 2 +- .../main/kotlin/nebulosa/api/cameras/CameraCaptureEvent.kt | 2 +- .../kotlin/nebulosa/api/cameras/CameraCaptureExecutor.kt | 2 +- api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt | 2 +- .../nebulosa/api/connection/ConnectionClosedWithClient.kt | 2 +- .../kotlin/nebulosa/api/connection/ConnectionService.kt | 2 +- .../main/kotlin/nebulosa/api/devices/DeviceMessageEvent.kt | 2 +- .../main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt | 2 +- .../main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt | 2 +- .../main/kotlin/nebulosa/api/guiding/GuiderMessageEvent.kt | 2 +- api/src/main/kotlin/nebulosa/api/guiding/GuidingService.kt | 4 ++-- api/src/main/kotlin/nebulosa/api/indi/INDIEventHandler.kt | 2 +- .../nebulosa/api/{messages => message}/MessageEvent.kt | 2 +- .../nebulosa/api/{messages => message}/MessageService.kt | 2 +- api/src/main/kotlin/nebulosa/api/message/QueueableEvent.kt | 3 +++ api/src/main/kotlin/nebulosa/api/messages/QueueableEvent.kt | 3 --- api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt | 2 +- .../{notifications => notification}/NotificationEvent.kt | 6 +++--- .../api/{notifications => notification}/Severity.kt | 2 +- .../api/{preferences => preference}/PreferenceEntity.kt | 2 +- .../api/{preferences => preference}/PreferenceRepository.kt | 3 ++- .../{preferences => preference}/PreferenceRequestBody.kt | 2 +- .../api/{preferences => preference}/PreferenceService.kt | 2 +- .../main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt | 2 +- .../main/kotlin/nebulosa/api/sequencer/SequencerEvent.kt | 2 +- .../main/kotlin/nebulosa/api/sequencer/SequencerExecutor.kt | 4 ++-- api/src/main/kotlin/nebulosa/api/sequencer/SequencerTask.kt | 2 +- api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt | 2 +- .../main/kotlin/nebulosa/api/wizard/flat/FlatWizardEvent.kt | 2 +- .../kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt | 4 ++-- .../main/kotlin/nebulosa/api/wizard/flat/FlatWizardTask.kt | 2 +- api/src/test/kotlin/PreferenceRepositoryTest.kt | 6 +++--- 47 files changed, 61 insertions(+), 60 deletions(-) rename api/src/main/kotlin/nebulosa/api/{messages => message}/MessageEvent.kt (64%) rename api/src/main/kotlin/nebulosa/api/{messages => message}/MessageService.kt (98%) create mode 100644 api/src/main/kotlin/nebulosa/api/message/QueueableEvent.kt delete mode 100644 api/src/main/kotlin/nebulosa/api/messages/QueueableEvent.kt rename api/src/main/kotlin/nebulosa/api/{notifications => notification}/NotificationEvent.kt (88%) rename api/src/main/kotlin/nebulosa/api/{notifications => notification}/Severity.kt (85%) rename api/src/main/kotlin/nebulosa/api/{preferences => preference}/PreferenceEntity.kt (92%) rename api/src/main/kotlin/nebulosa/api/{preferences => preference}/PreferenceRepository.kt (91%) rename api/src/main/kotlin/nebulosa/api/{preferences => preference}/PreferenceRequestBody.kt (60%) rename api/src/main/kotlin/nebulosa/api/{preferences => preference}/PreferenceService.kt (98%) diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVEvent.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVEvent.kt index a4c985058..b4cad781b 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVEvent.kt @@ -1,7 +1,7 @@ package nebulosa.api.alignment.polar.darv import nebulosa.api.cameras.CameraCaptureEvent -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.guiding.GuideDirection import nebulosa.indi.device.camera.Camera diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVExecutor.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVExecutor.kt index deedf9e0f..14eed3235 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVExecutor.kt @@ -3,8 +3,8 @@ package nebulosa.api.alignment.polar.darv import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.cameras.CameraEventAware -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.MessageService import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraEvent import nebulosa.indi.device.guide.GuideOutput diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVTask.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVTask.kt index 73842019a..646f8a0c3 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVTask.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/darv/DARVTask.kt @@ -5,7 +5,7 @@ import nebulosa.api.cameras.* import nebulosa.api.guiding.GuidePulseEvent import nebulosa.api.guiding.GuidePulseRequest import nebulosa.api.guiding.GuidePulseTask -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.api.tasks.AbstractTask import nebulosa.api.tasks.SplitTask import nebulosa.api.tasks.Task diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAEvent.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAEvent.kt index c584fb2cf..67b3d7f51 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAEvent.kt @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize import nebulosa.api.beans.converters.angle.DeclinationSerializer import nebulosa.api.beans.converters.angle.RightAscensionSerializer import nebulosa.api.cameras.CameraCaptureEvent -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.indi.device.camera.Camera import nebulosa.math.Angle diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAExecutor.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAExecutor.kt index 2bc5913e2..1b7d947f6 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPAExecutor.kt @@ -3,8 +3,8 @@ package nebulosa.api.alignment.polar.tppa import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.cameras.CameraEventAware -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.MessageService import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraEvent import nebulosa.indi.device.mount.Mount diff --git a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPATask.kt b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPATask.kt index 3c20fccc5..bd0180fe0 100644 --- a/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPATask.kt +++ b/api/src/main/kotlin/nebulosa/api/alignment/polar/tppa/TPPATask.kt @@ -4,7 +4,7 @@ import io.reactivex.rxjava3.functions.Consumer import nebulosa.alignment.polar.point.three.ThreePointPolarAlignment import nebulosa.alignment.polar.point.three.ThreePointPolarAlignmentResult import nebulosa.api.cameras.* -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.api.mounts.MountMoveRequest import nebulosa.api.mounts.MountMoveTask import nebulosa.api.tasks.AbstractTask diff --git a/api/src/main/kotlin/nebulosa/api/atlas/IERSUpdateTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/IERSUpdateTask.kt index c135b1d24..197784fc1 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/IERSUpdateTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/IERSUpdateTask.kt @@ -1,6 +1,6 @@ package nebulosa.api.atlas -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.preference.PreferenceService import nebulosa.io.transferAndClose import nebulosa.log.loggerFor import nebulosa.time.IERS diff --git a/api/src/main/kotlin/nebulosa/api/atlas/LibWCSDownloadTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/LibWCSDownloadTask.kt index 4f445ae15..2beac0599 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/LibWCSDownloadTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/LibWCSDownloadTask.kt @@ -1,7 +1,7 @@ package nebulosa.api.atlas import com.sun.jna.Platform -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.preference.PreferenceService import nebulosa.io.transferAndCloseOutput import nebulosa.log.loggerFor import nebulosa.wcs.LibWCS diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateNotificationEvent.kt b/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateNotificationEvent.kt index 1e7be88e1..5bbca4a7e 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateNotificationEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateNotificationEvent.kt @@ -1,6 +1,6 @@ package nebulosa.api.atlas -import nebulosa.api.notifications.NotificationEvent +import nebulosa.api.notification.NotificationEvent sealed interface SatelliteUpdateNotificationEvent : NotificationEvent.System { diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateTask.kt index 0941d9505..b1ca26384 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SatelliteUpdateTask.kt @@ -1,7 +1,7 @@ package nebulosa.api.atlas -import nebulosa.api.messages.MessageService -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.message.MessageService +import nebulosa.api.preference.PreferenceService import nebulosa.log.loggerFor import okhttp3.OkHttpClient import okhttp3.Request diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateNotificationEvent.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateNotificationEvent.kt index a1149cd8e..0d0a3ae26 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateNotificationEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateNotificationEvent.kt @@ -1,6 +1,6 @@ package nebulosa.api.atlas -import nebulosa.api.notifications.NotificationEvent +import nebulosa.api.notification.NotificationEvent sealed interface SkyAtlasUpdateNotificationEvent : NotificationEvent.System { diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt index d49acbf10..e4a2ed6a8 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasUpdateTask.kt @@ -1,7 +1,7 @@ package nebulosa.api.atlas -import nebulosa.api.messages.MessageService -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.message.MessageService +import nebulosa.api.preference.PreferenceService import nebulosa.log.loggerFor import okhttp3.OkHttpClient import okhttp3.Request diff --git a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusEvent.kt b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusEvent.kt index 334f44d59..09c4bffc3 100644 --- a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusEvent.kt @@ -1,7 +1,7 @@ package nebulosa.api.autofocus import nebulosa.api.cameras.CameraCaptureEvent -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.curve.fitting.CurvePoint import nebulosa.curve.fitting.HyperbolicFitting import nebulosa.curve.fitting.QuadraticFitting diff --git a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusExecutor.kt b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusExecutor.kt index 7225cbc12..688d89246 100644 --- a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusExecutor.kt @@ -4,8 +4,8 @@ import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.cameras.CameraEventAware import nebulosa.api.focusers.FocuserEventAware -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.MessageService import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraEvent import nebulosa.indi.device.focuser.Focuser diff --git a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusTask.kt b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusTask.kt index 07a839adc..7eb0251a4 100644 --- a/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusTask.kt +++ b/api/src/main/kotlin/nebulosa/api/autofocus/AutoFocusTask.kt @@ -5,7 +5,7 @@ import nebulosa.api.cameras.* import nebulosa.api.focusers.BacklashCompensationFocuserMoveTask import nebulosa.api.focusers.BacklashCompensationMode import nebulosa.api.focusers.FocuserEventAware -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.api.tasks.AbstractTask import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.curve.fitting.CurvePoint diff --git a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt index 65918224a..06571b436 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/configurations/BeanConfiguration.kt @@ -11,7 +11,7 @@ import nebulosa.api.atlas.SatelliteEntity import nebulosa.api.atlas.SimbadEntity import nebulosa.api.calibration.CalibrationFrameEntity import nebulosa.api.database.MyObjectBox -import nebulosa.api.preferences.PreferenceEntity +import nebulosa.api.preference.PreferenceEntity import nebulosa.common.concurrency.DaemonThreadFactory import nebulosa.common.json.PathDeserializer import nebulosa.common.json.PathSerializer diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEvent.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEvent.kt index 7bcd3f6e2..4d158ed95 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureEvent.kt @@ -1,7 +1,7 @@ package nebulosa.api.cameras import com.fasterxml.jackson.annotation.JsonIgnore -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.indi.device.camera.Camera import java.nio.file.Path import java.time.Duration diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureExecutor.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureExecutor.kt index 6fbb1e983..3f7d0dcfd 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraCaptureExecutor.kt @@ -3,7 +3,7 @@ package nebulosa.api.cameras import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.calibration.CalibrationFrameService -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.api.wheels.WheelEventAware import nebulosa.guiding.Guider import nebulosa.indi.device.camera.Camera diff --git a/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt b/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt index df08c34ac..9a5abcf1d 100644 --- a/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/cameras/CameraEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.cameras import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraAttached diff --git a/api/src/main/kotlin/nebulosa/api/connection/ConnectionClosedWithClient.kt b/api/src/main/kotlin/nebulosa/api/connection/ConnectionClosedWithClient.kt index ed98c0613..1407ca176 100644 --- a/api/src/main/kotlin/nebulosa/api/connection/ConnectionClosedWithClient.kt +++ b/api/src/main/kotlin/nebulosa/api/connection/ConnectionClosedWithClient.kt @@ -1,6 +1,6 @@ package nebulosa.api.connection -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent data class ConnectionClosedWithClient(@JvmField val id: String) : MessageEvent { diff --git a/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt b/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt index 9f8810ef3..01b6cf5b4 100644 --- a/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt +++ b/api/src/main/kotlin/nebulosa/api/connection/ConnectionService.kt @@ -1,7 +1,7 @@ package nebulosa.api.connection import nebulosa.alpaca.indi.client.AlpacaClient -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.client.INDIClient import nebulosa.indi.client.connection.INDISocketConnection import nebulosa.indi.device.Device diff --git a/api/src/main/kotlin/nebulosa/api/devices/DeviceMessageEvent.kt b/api/src/main/kotlin/nebulosa/api/devices/DeviceMessageEvent.kt index d20bae1de..aba5cdae0 100644 --- a/api/src/main/kotlin/nebulosa/api/devices/DeviceMessageEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/devices/DeviceMessageEvent.kt @@ -1,6 +1,6 @@ package nebulosa.api.devices -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.indi.device.Device interface DeviceMessageEvent : MessageEvent { diff --git a/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt b/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt index e606da7fc..d497ae1d6 100644 --- a/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/focusers/FocuserEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.focusers import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.focuser.Focuser import nebulosa.indi.device.focuser.FocuserAttached diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt index cbdd8795e..510e3e1ca 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuideOutputEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.guiding import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.DeviceEvent import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.guide.GuideOutput diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuiderMessageEvent.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuiderMessageEvent.kt index b7612a5d4..33ed3a7bc 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuiderMessageEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuiderMessageEvent.kt @@ -1,5 +1,5 @@ package nebulosa.api.guiding -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent data class GuiderMessageEvent(override val eventName: String, val data: Any? = null) : MessageEvent diff --git a/api/src/main/kotlin/nebulosa/api/guiding/GuidingService.kt b/api/src/main/kotlin/nebulosa/api/guiding/GuidingService.kt index 89b6c5dbd..4b5c38ba7 100644 --- a/api/src/main/kotlin/nebulosa/api/guiding/GuidingService.kt +++ b/api/src/main/kotlin/nebulosa/api/guiding/GuidingService.kt @@ -1,8 +1,8 @@ package nebulosa.api.guiding import jakarta.annotation.PreDestroy -import nebulosa.api.messages.MessageService -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.message.MessageService +import nebulosa.api.preference.PreferenceService import nebulosa.guiding.GuideStar import nebulosa.guiding.GuideState import nebulosa.guiding.Guider diff --git a/api/src/main/kotlin/nebulosa/api/indi/INDIEventHandler.kt b/api/src/main/kotlin/nebulosa/api/indi/INDIEventHandler.kt index fdc12cd3f..70d95ce32 100644 --- a/api/src/main/kotlin/nebulosa/api/indi/INDIEventHandler.kt +++ b/api/src/main/kotlin/nebulosa/api/indi/INDIEventHandler.kt @@ -1,7 +1,7 @@ package nebulosa.api.indi import nebulosa.api.beans.annotations.Subscriber -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode diff --git a/api/src/main/kotlin/nebulosa/api/messages/MessageEvent.kt b/api/src/main/kotlin/nebulosa/api/message/MessageEvent.kt similarity index 64% rename from api/src/main/kotlin/nebulosa/api/messages/MessageEvent.kt rename to api/src/main/kotlin/nebulosa/api/message/MessageEvent.kt index 1d6aac26d..f56eb7269 100644 --- a/api/src/main/kotlin/nebulosa/api/messages/MessageEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/message/MessageEvent.kt @@ -1,4 +1,4 @@ -package nebulosa.api.messages +package nebulosa.api.message interface MessageEvent { diff --git a/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt b/api/src/main/kotlin/nebulosa/api/message/MessageService.kt similarity index 98% rename from api/src/main/kotlin/nebulosa/api/messages/MessageService.kt rename to api/src/main/kotlin/nebulosa/api/message/MessageService.kt index 4f52f6b7f..2d3761a2e 100644 --- a/api/src/main/kotlin/nebulosa/api/messages/MessageService.kt +++ b/api/src/main/kotlin/nebulosa/api/message/MessageService.kt @@ -1,4 +1,4 @@ -package nebulosa.api.messages +package nebulosa.api.message import nebulosa.log.debug import nebulosa.log.loggerFor diff --git a/api/src/main/kotlin/nebulosa/api/message/QueueableEvent.kt b/api/src/main/kotlin/nebulosa/api/message/QueueableEvent.kt new file mode 100644 index 000000000..80e9c9e6f --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/message/QueueableEvent.kt @@ -0,0 +1,3 @@ +package nebulosa.api.message + +interface QueueableEvent diff --git a/api/src/main/kotlin/nebulosa/api/messages/QueueableEvent.kt b/api/src/main/kotlin/nebulosa/api/messages/QueueableEvent.kt deleted file mode 100644 index c1a9bfb8a..000000000 --- a/api/src/main/kotlin/nebulosa/api/messages/QueueableEvent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package nebulosa.api.messages - -interface QueueableEvent diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt index 98d111d84..0f1c51612 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.mounts import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.mount.Mount import nebulosa.indi.device.mount.MountAttached diff --git a/api/src/main/kotlin/nebulosa/api/notifications/NotificationEvent.kt b/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt similarity index 88% rename from api/src/main/kotlin/nebulosa/api/notifications/NotificationEvent.kt rename to api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt index 0ddf6711b..71ab6bf6d 100644 --- a/api/src/main/kotlin/nebulosa/api/notifications/NotificationEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt @@ -1,7 +1,7 @@ -package nebulosa.api.notifications +package nebulosa.api.notification -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.QueueableEvent +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.QueueableEvent interface NotificationEvent : MessageEvent { diff --git a/api/src/main/kotlin/nebulosa/api/notifications/Severity.kt b/api/src/main/kotlin/nebulosa/api/notification/Severity.kt similarity index 85% rename from api/src/main/kotlin/nebulosa/api/notifications/Severity.kt rename to api/src/main/kotlin/nebulosa/api/notification/Severity.kt index e5a96bd04..c458e4a23 100644 --- a/api/src/main/kotlin/nebulosa/api/notifications/Severity.kt +++ b/api/src/main/kotlin/nebulosa/api/notification/Severity.kt @@ -1,4 +1,4 @@ -package nebulosa.api.notifications +package nebulosa.api.notification import com.fasterxml.jackson.annotation.JsonValue diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceEntity.kt b/api/src/main/kotlin/nebulosa/api/preference/PreferenceEntity.kt similarity index 92% rename from api/src/main/kotlin/nebulosa/api/preferences/PreferenceEntity.kt rename to api/src/main/kotlin/nebulosa/api/preference/PreferenceEntity.kt index 2087fcbcc..b00b5d7f2 100644 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceEntity.kt +++ b/api/src/main/kotlin/nebulosa/api/preference/PreferenceEntity.kt @@ -1,4 +1,4 @@ -package nebulosa.api.preferences +package nebulosa.api.preference import io.objectbox.annotation.ConflictStrategy import io.objectbox.annotation.Entity diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceRepository.kt b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt similarity index 91% rename from api/src/main/kotlin/nebulosa/api/preferences/PreferenceRepository.kt rename to api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt index ce5ea8fba..e3a966350 100644 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceRepository.kt +++ b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt @@ -1,7 +1,8 @@ -package nebulosa.api.preferences +package nebulosa.api.preference import io.objectbox.Box import io.objectbox.kotlin.equal +import nebulosa.api.preferences.PreferenceEntity_ import nebulosa.api.repositories.BoxRepository import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceRequestBody.kt b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRequestBody.kt similarity index 60% rename from api/src/main/kotlin/nebulosa/api/preferences/PreferenceRequestBody.kt rename to api/src/main/kotlin/nebulosa/api/preference/PreferenceRequestBody.kt index a7e5f052d..00e0448f2 100644 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceRequestBody.kt +++ b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRequestBody.kt @@ -1,3 +1,3 @@ -package nebulosa.api.preferences +package nebulosa.api.preference data class PreferenceRequestBody(val data: Any?) diff --git a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt b/api/src/main/kotlin/nebulosa/api/preference/PreferenceService.kt similarity index 98% rename from api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt rename to api/src/main/kotlin/nebulosa/api/preference/PreferenceService.kt index 9a82f6fe1..d018d0cf4 100644 --- a/api/src/main/kotlin/nebulosa/api/preferences/PreferenceService.kt +++ b/api/src/main/kotlin/nebulosa/api/preference/PreferenceService.kt @@ -1,4 +1,4 @@ -package nebulosa.api.preferences +package nebulosa.api.preference import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.stereotype.Service diff --git a/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt b/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt index 6b610e530..02526c449 100644 --- a/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/rotators/RotatorEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.rotators import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.rotator.Rotator import nebulosa.indi.device.rotator.RotatorAttached diff --git a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerEvent.kt b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerEvent.kt index 2d8b2b627..050ed94f2 100644 --- a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerEvent.kt @@ -1,7 +1,7 @@ package nebulosa.api.sequencer import nebulosa.api.cameras.CameraCaptureEvent -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import java.time.Duration data class SequencerEvent( diff --git a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerExecutor.kt b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerExecutor.kt index 4f3bd05eb..7b0a4ecb9 100644 --- a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerExecutor.kt @@ -5,8 +5,8 @@ import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.calibration.CalibrationFrameService import nebulosa.api.cameras.CameraEventAware import nebulosa.api.focusers.FocuserEventAware -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.MessageService import nebulosa.api.wheels.WheelEventAware import nebulosa.guiding.Guider import nebulosa.indi.device.camera.Camera diff --git a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerTask.kt b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerTask.kt index a46053581..a37e1ec70 100644 --- a/api/src/main/kotlin/nebulosa/api/sequencer/SequencerTask.kt +++ b/api/src/main/kotlin/nebulosa/api/sequencer/SequencerTask.kt @@ -3,7 +3,7 @@ package nebulosa.api.sequencer import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.calibration.CalibrationFrameProvider import nebulosa.api.cameras.* -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.api.tasks.AbstractTask import nebulosa.api.tasks.Task import nebulosa.api.tasks.delay.DelayEvent diff --git a/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt b/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt index 35416909d..2da947581 100644 --- a/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt +++ b/api/src/main/kotlin/nebulosa/api/wheels/WheelEventHub.kt @@ -2,7 +2,7 @@ package nebulosa.api.wheels import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.devices.DeviceEventHub -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageService import nebulosa.indi.device.PropertyChangedEvent import nebulosa.indi.device.filterwheel.FilterWheel import nebulosa.indi.device.filterwheel.FilterWheelAttached diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardEvent.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardEvent.kt index b29856645..a8d13c5a2 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardEvent.kt @@ -1,7 +1,7 @@ package nebulosa.api.wizard.flat import nebulosa.api.cameras.CameraCaptureEvent -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import java.nio.file.Path import java.time.Duration diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt index b3367f165..cce2facbc 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardExecutor.kt @@ -3,8 +3,8 @@ package nebulosa.api.wizard.flat import io.reactivex.rxjava3.functions.Consumer import nebulosa.api.beans.annotations.Subscriber import nebulosa.api.cameras.CameraEventAware -import nebulosa.api.messages.MessageEvent -import nebulosa.api.messages.MessageService +import nebulosa.api.message.MessageEvent +import nebulosa.api.message.MessageService import nebulosa.indi.device.camera.Camera import nebulosa.indi.device.camera.CameraEvent import org.greenrobot.eventbus.Subscribe diff --git a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardTask.kt b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardTask.kt index 4dc26907e..49859b098 100644 --- a/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardTask.kt +++ b/api/src/main/kotlin/nebulosa/api/wizard/flat/FlatWizardTask.kt @@ -1,7 +1,7 @@ package nebulosa.api.wizard.flat import nebulosa.api.cameras.* -import nebulosa.api.messages.MessageEvent +import nebulosa.api.message.MessageEvent import nebulosa.api.tasks.AbstractTask import nebulosa.common.concurrency.cancel.CancellationToken import nebulosa.fits.fits diff --git a/api/src/test/kotlin/PreferenceRepositoryTest.kt b/api/src/test/kotlin/PreferenceRepositoryTest.kt index 69ceb5883..81bb5d59f 100644 --- a/api/src/test/kotlin/PreferenceRepositoryTest.kt +++ b/api/src/test/kotlin/PreferenceRepositoryTest.kt @@ -11,9 +11,9 @@ import io.kotest.matchers.shouldBe import io.objectbox.kotlin.boxFor import nebulosa.api.atlas.Location import nebulosa.api.database.MyObjectBox -import nebulosa.api.preferences.PreferenceEntity -import nebulosa.api.preferences.PreferenceRepository -import nebulosa.api.preferences.PreferenceService +import nebulosa.api.preference.PreferenceEntity +import nebulosa.api.preference.PreferenceRepository +import nebulosa.api.preference.PreferenceService import nebulosa.indi.device.camera.FrameType import java.util.* From 5dfac08915af12c9320937708140da90ee2b3fa4 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 27 Jun 2024 21:28:39 -0300 Subject: [PATCH 15/29] [api][desktop]: Implement Confirmation mechanism for some endpoints --- .../kotlin/nebulosa/api/atlas/BodyPosition.kt | 7 +-- .../kotlin/nebulosa/api/atlas/Location.kt | 22 +++++---- .../nebulosa/api/atlas/SkyAtlasService.kt | 49 ++++++++++--------- .../converters/distance/MetersDeserializer.kt | 13 +++++ .../confirmation/ConfirmationController.kt | 13 +++++ .../api/confirmation/ConfirmationEvent.kt | 13 +++++ .../api/confirmation/ConfirmationLatch.kt | 40 +++++++++++++++ .../api/confirmation/ConfirmationService.kt | 34 +++++++++++++ .../nebulosa/api/mounts/MountController.kt | 6 ++- .../nebulosa/api/mounts/MountService.kt | 41 +++++++++++++--- .../api/mounts/MountWillPointToSunEvent.kt | 9 ++++ .../api/notification/NotificationEvent.kt | 2 +- .../api/preference/PreferenceRepository.kt | 1 - desktop/app/window.manager.ts | 14 +++++- desktop/package-lock.json | 9 ++++ desktop/package.json | 1 + desktop/src/app/app.component.ts | 13 ++++- desktop/src/app/app.module.ts | 14 ++++++ desktop/src/app/atlas/atlas.component.html | 12 +---- .../shared/components/moon/moon.component.ts | 5 +- .../dialogs/confirm/confirm.dialog.html | 17 +++++++ .../dialogs/confirm/confirm.dialog.scss | 0 .../shared/dialogs/confirm/confirm.dialog.ts | 36 ++++++++++++++ .../interceptors/confirmation.interceptor.ts | 38 ++++++++++++++ .../idempotency-key.interceptor.ts | 19 +++++++ .../interceptors/location.interceptor.ts | 6 ++- desktop/src/shared/services/api.service.ts | 11 ++++- .../shared/services/confirmation.service.ts | 34 +++++++++++++ .../src/shared/services/electron.service.ts | 4 +- desktop/src/shared/services/prime.service.ts | 21 ++------ desktop/src/shared/types/app.types.ts | 5 ++ desktop/src/shared/types/atlas.types.ts | 2 - .../nova/position/GeographicCoordinate.kt | 13 +++++ .../nova/position/GeographicPosition.kt | 8 +-- 34 files changed, 440 insertions(+), 92 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersDeserializer.kt create mode 100644 api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationController.kt create mode 100644 api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationEvent.kt create mode 100644 api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationLatch.kt create mode 100644 api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationService.kt create mode 100644 api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToSunEvent.kt create mode 100644 desktop/src/shared/dialogs/confirm/confirm.dialog.html create mode 100644 desktop/src/shared/dialogs/confirm/confirm.dialog.scss create mode 100644 desktop/src/shared/dialogs/confirm/confirm.dialog.ts create mode 100644 desktop/src/shared/interceptors/confirmation.interceptor.ts create mode 100644 desktop/src/shared/interceptors/idempotency-key.interceptor.ts create mode 100644 desktop/src/shared/services/confirmation.service.ts create mode 100644 nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicCoordinate.kt diff --git a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt index 0bd8e7b5c..c4562aee8 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt @@ -8,13 +8,10 @@ import nebulosa.constants.AU_KM import nebulosa.constants.SPEED_OF_LIGHT import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity -import nebulosa.indi.device.mount.PierSide import nebulosa.math.Angle import nebulosa.math.deg import nebulosa.nova.astrometry.Constellation -import nebulosa.nova.position.GeographicPosition import nebulosa.skycatalog.SkyObject -import nebulosa.time.CurrentTime data class BodyPosition( @field:JsonSerialize(using = RightAscensionSerializer::class) val rightAscensionJ2000: Angle, @@ -30,13 +27,12 @@ data class BodyPosition( val illuminated: Double, val elongation: Double, val leading: Boolean, // true = rises and sets BEFORE Sun. - val pierSide: PierSide, ) { companion object { @JvmStatic - fun of(element: HorizonsElement, position: GeographicPosition? = null): BodyPosition { + fun of(element: HorizonsElement): BodyPosition { val lightTime = element.asDouble(HorizonsQuantity.ONE_WAY_LIGHT_TIME) var distance = lightTime * (SPEED_OF_LIGHT * 0.06) // km var distanceUnit = "km" @@ -63,7 +59,6 @@ data class BodyPosition( element.asDouble(HorizonsQuantity.ILLUMINATED_FRACTION), element.asDouble(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE), element.asString(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE, index = 1) == "/L", - if (position == null) PierSide.NEITHER else PierSide.expectedPierSide(rightAscension, declination, position.lstAt(CurrentTime)) ) } } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt index ba9cefe29..fe8d2dc7d 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt @@ -1,18 +1,20 @@ package nebulosa.api.atlas -import nebulosa.math.deg -import nebulosa.math.m -import nebulosa.nova.position.GeographicPosition +import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import nebulosa.api.beans.converters.angle.DegreesDeserializer +import nebulosa.api.beans.converters.distance.MetersDeserializer +import nebulosa.math.Angle +import nebulosa.math.Distance +import nebulosa.nova.position.GeographicCoordinate import nebulosa.nova.position.Geoid data class Location( - val latitude: Double = 0.0, // deg. - val longitude: Double = 0.0, // deg. - val elevation: Double = 0.0, // m. + @field:JsonDeserialize(using = DegreesDeserializer::class) override val latitude: Angle = 0.0, + @field:JsonDeserialize(using = DegreesDeserializer::class) override val longitude: Angle = 0.0, + @field:JsonDeserialize(using = MetersDeserializer::class) override val elevation: Distance = 0.0, val offsetInMinutes: Int = 0, -) { +) : GeographicCoordinate { - fun geographicPosition(): GeographicPosition { - return Geoid.IERS2010.lonLat(longitude.deg, latitude.deg, elevation.m) - } + @delegate:JsonIgnore @get:JsonIgnore val geographicPosition by lazy { Geoid.IERS2010.lonLat(longitude, latitude, elevation) } } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index 79339d00f..9633b687b 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -5,13 +5,13 @@ import nebulosa.api.atlas.ephemeris.BodyEphemerisProvider import nebulosa.api.atlas.ephemeris.HorizonsEphemerisProvider import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity -import nebulosa.log.loggerFor import nebulosa.math.Angle import nebulosa.math.toLightYears import nebulosa.math.toMas import nebulosa.nova.almanac.findDiscrete import nebulosa.nova.astrometry.Body import nebulosa.nova.astrometry.Constellation +import nebulosa.nova.position.GeographicCoordinate import nebulosa.nova.position.GeographicPosition import nebulosa.sbd.SmallBodyDatabaseService import nebulosa.skycatalog.SkyObject @@ -55,19 +55,19 @@ class SkyAtlasService( output.outputStream.write(sunImage) } - fun positionOfSun(location: Location, dateTime: LocalDateTime): BodyPosition { + fun positionOfSun(location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition { return positionOfBody(SUN, location, dateTime)!! } - fun positionOfMoon(location: Location, dateTime: LocalDateTime): BodyPosition { + fun positionOfMoon(location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition { return positionOfBody(MOON, location, dateTime)!! } - fun positionOfPlanet(location: Location, code: String, dateTime: LocalDateTime): BodyPosition { + fun positionOfPlanet(location: GeographicCoordinate, code: String, dateTime: LocalDateTime): BodyPosition { return positionOfBody(code, location, dateTime)!! } - fun positionOfSkyObject(location: Location, id: Long, dateTime: LocalDateTime): BodyPosition { + fun positionOfSkyObject(location: GeographicCoordinate, id: Long, dateTime: LocalDateTime): BodyPosition { val target = cachedSimbadEntities[id] ?: simbadEntityRepository.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cannot found sky object: [$id]") cachedSimbadEntities[id] = target @@ -76,20 +76,20 @@ class SkyAtlasService( .copy(magnitude = target.magnitude, constellation = target.constellation, distance = distance.toLightYears, distanceUnit = "ly") } - fun positionOfSatellite(location: Location, satellite: SatelliteEntity, dateTime: LocalDateTime): BodyPosition { + fun positionOfSatellite(location: GeographicCoordinate, satellite: SatelliteEntity, dateTime: LocalDateTime): BodyPosition { return positionOfBody("TLE@${satellite.tle}", location, dateTime)!! } - private fun positionOfBody(target: Any, location: Location, dateTime: LocalDateTime): BodyPosition? { - val position = positions.getOrPut(location, location::geographicPosition) + private fun positionOfBody(target: Any, location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition? { return bodyEphemeris(target, location, dateTime) .withLocationAndDateTime(location, dateTime) - ?.let { BodyPosition.of(it, position) } + ?.let(BodyPosition::of) } - private fun bodyEphemeris(target: Any, location: Location, dateTime: LocalDateTime): List { - val position = positions.getOrPut(location, location::geographicPosition) - val offsetInSeconds = location.offsetInMinutes * 60 + private fun bodyEphemeris(target: Any, location: GeographicCoordinate, dateTime: LocalDateTime): List { + val position = if (location is Location) positions.getOrPut(location, location::geographicPosition) + else location.geographicPosition() ?: return emptyList() + val offsetInSeconds = if (location is Location) location.offsetInMinutes * 60 else 0 val zoneId = ZoneOffset.ofTotalSeconds(offsetInSeconds) return if (target is Body) bodyEphemerisProvider.compute(target, position, dateTime, zoneId) else horizonsEphemerisProvider.compute(target, position, dateTime, zoneId) @@ -99,7 +99,7 @@ class SkyAtlasService( return satelliteRepository.search(text.ifBlank { null }, groups) } - fun twilight(location: Location, date: LocalDate): Twilight { + fun twilight(location: GeographicCoordinate, date: LocalDate): Twilight { val civilDusk = doubleArrayOf(0.0, 0.0) val nauticalDusk = doubleArrayOf(0.0, 0.0) val astronomicalDusk = doubleArrayOf(0.0, 0.0) @@ -132,22 +132,22 @@ class SkyAtlasService( ) } - fun altitudePointsOfSun(location: Location, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSun(location: GeographicCoordinate, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(SUN, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfMoon(location: Location, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfMoon(location: GeographicCoordinate, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(MOON, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfPlanet(location: Location, code: String, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfPlanet(location: GeographicCoordinate, code: String, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris(code, location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfSkyObject(location: Location, id: Long, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSkyObject(location: GeographicCoordinate, id: Long, date: LocalDate, stepSize: Int): List { val target = cachedSimbadEntities[id] ?: simbadEntityRepository.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cannot found sky object: [$id]") cachedSimbadEntities[id] = target @@ -155,7 +155,7 @@ class SkyAtlasService( return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfSatellite(location: Location, satellite: SatelliteEntity, date: LocalDate, stepSize: Int): List { + fun altitudePointsOfSatellite(location: GeographicCoordinate, satellite: SatelliteEntity, date: LocalDate, stepSize: Int): List { val ephemeris = bodyEphemeris("TLE@${satellite.tle}", location, LocalDateTime.of(date, LocalTime.now())) return altitudePointsOfBody(ephemeris, stepSize) } @@ -213,8 +213,12 @@ class SkyAtlasService( private const val SUN = "10" private const val MOON = "301" - @JvmStatic private val LOG = loggerFor() - @JvmStatic private val INVALID_DSO_CHARS = Regex("[^\\w\\-\\s\\[\\].+%]+") + @JvmStatic + private fun GeographicCoordinate.geographicPosition() = when (this) { + is GeographicPosition -> this + is Location -> geographicPosition + else -> null + } @JvmStatic private fun Double.clampMagnitude(): Double { @@ -224,8 +228,9 @@ class SkyAtlasService( } @JvmStatic - private fun List.withLocationAndDateTime(location: Location, dateTime: LocalDateTime): HorizonsElement? { - return let { HorizonsElement.of(it, dateTime.minusMinutes(location.offsetInMinutes.toLong())) } + private fun List.withLocationAndDateTime(location: GeographicCoordinate, dateTime: LocalDateTime): HorizonsElement? { + val offsetInMinutes = if (location is Location) location.offsetInMinutes.toLong() else 0L + return let { HorizonsElement.of(it, dateTime.minusMinutes(offsetInMinutes)) } } @JvmStatic diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersDeserializer.kt new file mode 100644 index 000000000..0885cd81d --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersDeserializer.kt @@ -0,0 +1,13 @@ +package nebulosa.api.beans.converters.distance + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.deser.std.NumberDeserializers +import nebulosa.math.m + +class MetersDeserializer : NumberDeserializers.DoubleDeserializer(Double::class.java, 0.0) { + + override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Double { + return super.deserialize(p, ctxt).m + } +} diff --git a/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationController.kt b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationController.kt new file mode 100644 index 000000000..8a27118a2 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationController.kt @@ -0,0 +1,13 @@ +package nebulosa.api.confirmation + +import org.springframework.web.bind.annotation.* + +@RestController +@RequestMapping("confirmation") +class ConfirmationController(private val confirmationService: ConfirmationService) { + + @PutMapping("{idempotencyKey}") + fun confirm(@PathVariable idempotencyKey: String, @RequestParam accepted: Boolean) { + confirmationService.confirm(idempotencyKey, accepted) + } +} diff --git a/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationEvent.kt b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationEvent.kt new file mode 100644 index 000000000..1b663dabd --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationEvent.kt @@ -0,0 +1,13 @@ +package nebulosa.api.confirmation + +import nebulosa.api.message.MessageEvent + +interface ConfirmationEvent : MessageEvent { + + val message: String + + val idempotencyKey: String + + override val eventName + get() = "CONFIRMATION" +} diff --git a/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationLatch.kt b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationLatch.kt new file mode 100644 index 000000000..00339c3a1 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationLatch.kt @@ -0,0 +1,40 @@ +package nebulosa.api.confirmation + +import java.io.Closeable +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicBoolean + +class ConfirmationLatch : Closeable { + + private val confirmed = AtomicBoolean(false) + private val accepted = AtomicBoolean(false) + private val latch = CountDownLatch(1) + + val isConfirmed + get() = confirmed.get() + + val isAccepted + get() = accepted.get() + + fun confirm(response: Boolean) { + if (confirmed.compareAndSet(false, true)) { + accepted.set(response) + latch.countDown() + } + } + + fun waitForConfirmation(): Boolean { + return latch.await().let { accepted.get() } + } + + fun waitForConfirmation(timeout: Long, unit: TimeUnit): Boolean { + return latch.await(timeout, unit) && accepted.get() + } + + override fun close() { + if (latch.count > 0) { + latch.countDown() + } + } +} diff --git a/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationService.kt b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationService.kt new file mode 100644 index 000000000..14d395e60 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/confirmation/ConfirmationService.kt @@ -0,0 +1,34 @@ +package nebulosa.api.confirmation + +import nebulosa.api.message.MessageService +import nebulosa.log.loggerFor +import org.springframework.stereotype.Service + +@Service +class ConfirmationService(private val messageService: MessageService) { + + private val confirmations = HashMap() + + @Synchronized + fun confirm(idempotencyKey: String, accepted: Boolean) { + LOG.info("confirmed. idempotencyKey={}, accepted={}", idempotencyKey, accepted) + confirmations[idempotencyKey]?.confirm(accepted) + confirmations.remove(idempotencyKey) + } + + @Synchronized + fun ask(idempotencyKey: String, event: ConfirmationEvent): ConfirmationLatch { + confirmations[idempotencyKey]?.close() + + return ConfirmationLatch().also { + confirmations[idempotencyKey] = it + LOG.info("asking for confirmation. idempotencyKey={}, event={}", idempotencyKey, event::class.simpleName) + messageService.sendMessage(event) + } + } + + companion object { + + @JvmStatic private val LOG = loggerFor() + } +} diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt index 948dcdb0b..c554b5e6f 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt @@ -70,8 +70,9 @@ class MountController( @RequestParam @Valid @NotBlank rightAscension: String, @RequestParam @Valid @NotBlank declination: String, @RequestParam(required = false, defaultValue = "false") j2000: Boolean, + @RequestHeader("X-Idempotency-Key") idempotencyKey: String?, ) { - mountService.slewTo(mount, rightAscension.hours, declination.deg, j2000) + mountService.slewTo(mount, rightAscension.hours, declination.deg, j2000, idempotencyKey) } @PutMapping("{mount}/goto") @@ -80,8 +81,9 @@ class MountController( @RequestParam @Valid @NotBlank rightAscension: String, @RequestParam @Valid @NotBlank declination: String, @RequestParam(required = false, defaultValue = "false") j2000: Boolean, + @RequestHeader("X-Idempotency-Key") idempotencyKey: String?, ) { - mountService.goTo(mount, rightAscension.hours, declination.deg, j2000) + mountService.goTo(mount, rightAscension.hours, declination.deg, j2000, idempotencyKey) } @PutMapping("{mount}/home") diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt index e60a61a74..441d45302 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt @@ -1,6 +1,8 @@ package nebulosa.api.mounts +import nebulosa.api.atlas.SkyAtlasService import nebulosa.api.beans.annotations.Subscriber +import nebulosa.api.confirmation.ConfirmationService import nebulosa.api.image.ImageBucket import nebulosa.constants.PI import nebulosa.constants.TAU @@ -26,12 +28,15 @@ import java.nio.file.Path import java.time.LocalDateTime import java.time.OffsetDateTime import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit @Service @Subscriber class MountService( private val imageBucket: ImageBucket, private val mountEventHub: MountEventHub, + private val skyAtlasService: SkyAtlasService, + private val confirmationService: ConfirmationService, ) { private val sites = ConcurrentHashMap(2) @@ -60,14 +65,38 @@ class MountService( else mount.sync(ra, dec) } - fun slewTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean) { - if (j2000) mount.slewToJ2000(ra, dec) - else mount.slewTo(ra, dec) + fun slewTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean, idempotencyKey: String? = null) { + if (idempotencyKey.isNullOrBlank() || verifyMountWillPointToSun(idempotencyKey, mount, ra, dec, j2000)) { + if (j2000) mount.slewToJ2000(ra, dec) + else mount.slewTo(ra, dec) + } + } + + fun goTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean, idempotencyKey: String? = null) { + if (idempotencyKey.isNullOrBlank() || verifyMountWillPointToSun(idempotencyKey, mount, ra, dec, j2000)) { + if (j2000) mount.goToJ2000(ra, dec) + else mount.goTo(ra, dec) + } } - fun goTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean) { - if (j2000) mount.goToJ2000(ra, dec) - else mount.goTo(ra, dec) + /** + * Verifies if the [mount] will be point to Sun. + * + * @return true if mount can slew to [ra] and [dec] coordinates. + */ + private fun verifyMountWillPointToSun(idempotencyKey: String, mount: Mount, ra: Angle, dec: Angle, j2000: Boolean): Boolean { + val location = sites[mount] ?: return true + + val sunPosition = skyAtlasService.positionOfSun(location, LocalDateTime.now()) + .let { ICRF.equatorial(it.rightAscensionJ2000, it.declinationJ2000) } + val mountPosition = if (j2000) ICRF.equatorial(ra, dec) else ICRF.equatorial(ra, dec, epoch = CurrentTime) + + return if (sunPosition.separationFrom(mountPosition).toDegrees <= 1.0) { + val event = MountWillPointToSunEvent(idempotencyKey) + confirmationService.ask(idempotencyKey, event).waitForConfirmation(30, TimeUnit.SECONDS) + } else { + true + } } fun home(mount: Mount) { diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToSunEvent.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToSunEvent.kt new file mode 100644 index 000000000..1945ba964 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToSunEvent.kt @@ -0,0 +1,9 @@ +package nebulosa.api.mounts + +import nebulosa.api.confirmation.ConfirmationEvent + +data class MountWillPointToSunEvent(override val idempotencyKey: String) : ConfirmationEvent { + + override val message = + "Pointing a telescope directly at the Sun can cause severe eye injury or blindness and can damage the telescope. Do you want to proceed?" +} diff --git a/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt b/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt index 71ab6bf6d..b2c329f50 100644 --- a/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt +++ b/api/src/main/kotlin/nebulosa/api/notification/NotificationEvent.kt @@ -18,7 +18,7 @@ interface NotificationEvent : MessageEvent { get() = null override val eventName - get() = "NOTIFICATION.SENT" + get() = "NOTIFICATION" interface Info : NotificationEvent { diff --git a/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt index e3a966350..52b8f7733 100644 --- a/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt +++ b/api/src/main/kotlin/nebulosa/api/preference/PreferenceRepository.kt @@ -2,7 +2,6 @@ package nebulosa.api.preference import io.objectbox.Box import io.objectbox.kotlin.equal -import nebulosa.api.preferences.PreferenceEntity_ import nebulosa.api.repositories.BoxRepository import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component diff --git a/desktop/app/window.manager.ts b/desktop/app/window.manager.ts index 647811d52..2129a4bbe 100644 --- a/desktop/app/window.manager.ts +++ b/desktop/app/window.manager.ts @@ -3,7 +3,7 @@ import { BrowserWindow, Notification, dialog, screen, shell } from 'electron' import type { ChildProcessWithoutNullStreams } from 'node:child_process' import { join } from 'path' import type { MessageEvent } from '../src/shared/types/api.types' -import type { CloseWindow, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, StoredWindowData } from '../src/shared/types/app.types' +import type { CloseWindow, ConfirmationEvent, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, StoredWindowData } from '../src/shared/types/app.types' import type { ParsedArgument } from './argument.parser' import type { LocalStorage } from './local.storage' @@ -61,7 +61,11 @@ export class ApplicationWindow { } export function isNotificationEvent(event: MessageEvent): event is NotificationEvent { - return event.eventName === 'NOTIFICATION.SENT' + return event.eventName === 'NOTIFICATION' +} + +export function isConfirmationEvent(event: MessageEvent): event is ConfirmationEvent { + return event.eventName === 'CONFIRMATION' } export class WindowManager { @@ -206,6 +210,8 @@ export class WindowManager { if (isNotificationEvent(event)) { this.showNotification(event) + } else if (isConfirmationEvent(event)) { + this.showConfirmation(event) } else if (event.eventName) { this.dispatchEvent(event) } else { @@ -419,6 +425,10 @@ export class WindowManager { } } + showConfirmation(event: ConfirmationEvent) { + this.dispatchEvent(event) + } + dispatchEvent(event: MessageEvent) { for (const [, window] of this.windows) { if (window.isParent) { diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 83754afa1..ca5fb0db8 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -27,6 +27,7 @@ "interactjs": "1.10.27", "leaflet": "1.9.4", "moment": "2.30.1", + "nuid": "2.0.1-2", "panzoom": "9.4.3", "primeflex": "3.3.1", "primeicons": "7.0.0", @@ -13816,6 +13817,14 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nuid": { + "version": "2.0.1-2", + "resolved": "https://registry.npmjs.org/nuid/-/nuid-2.0.1-2.tgz", + "integrity": "sha512-zL7Z5+CivaZyUdBn76Ih8rffXABBSe3hzazHBk7qXsF4/o5DPDsblXjs5KQRlgjkeLa6XSCd5/GJaShArI2WMQ==", + "engines": { + "node": ">= 18.x" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", diff --git a/desktop/package.json b/desktop/package.json index 7ca844d76..e8250ad87 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -51,6 +51,7 @@ "interactjs": "1.10.27", "leaflet": "1.9.4", "moment": "2.30.1", + "nuid": "2.0.1-2", "panzoom": "9.4.3", "primeflex": "3.3.1", "primeicons": "7.0.0", diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index c5b5d3adb..eebb4d38a 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -1,7 +1,8 @@ -import { Component, ElementRef, OnDestroy } from '@angular/core' +import { Component, ElementRef, NgZone, OnDestroy } from '@angular/core' import { Title } from '@angular/platform-browser' import { APP_CONFIG } from '../environments/environment' import { MenuItem } from '../shared/components/menu-item/menu-item.component' +import { ConfirmationService } from '../shared/services/confirmation.service' import { ElectronService } from '../shared/services/electron.service' @Component({ @@ -31,6 +32,8 @@ export class AppComponent implements OnDestroy { constructor( private readonly windowTitle: Title, private readonly electron: ElectronService, + confirmation: ConfirmationService, + ngZone: NgZone, hostElementRef: ElementRef, ) { console.info('APP_CONFIG', APP_CONFIG) @@ -54,6 +57,14 @@ export class AppComponent implements OnDestroy { } else { this.resizeObserver = undefined } + + electron.on('CONFIRMATION', (event) => { + if (confirmation.has(event.idempotencyKey)) { + void ngZone.run(() => { + return confirmation.processConfirmationEvent(event) + }) + } + }) } ngOnDestroy() { diff --git a/desktop/src/app/app.module.ts b/desktop/src/app/app.module.ts index abeed391f..b16bd44e5 100644 --- a/desktop/src/app/app.module.ts +++ b/desktop/src/app/app.module.ts @@ -54,10 +54,13 @@ import { MenuItemComponent } from '../shared/components/menu-item/menu-item.comp import { MoonComponent } from '../shared/components/moon/moon.component' import { PathChooserComponent } from '../shared/components/path-chooser/path-chooser.component' import { SlideMenuComponent } from '../shared/components/slide-menu/slide-menu.component' +import { ConfirmDialog } from '../shared/dialogs/confirm/confirm.dialog' import { LocationDialog } from '../shared/dialogs/location/location.dialog' import { ScrollableNumberDirective } from '../shared/directives/input-number-scrollable' import { NoDropdownDirective } from '../shared/directives/no-dropdown.directive' import { StopPropagationDirective } from '../shared/directives/stop-propagation.directive' +import { ConfirmationInterceptor } from '../shared/interceptors/confirmation.interceptor' +import { IdempotencyKeyInterceptor } from '../shared/interceptors/idempotency-key.interceptor' import { LocationInterceptor } from '../shared/interceptors/location.interceptor' import { AnglePipe } from '../shared/pipes/angle.pipe' import { DropdownOptionsPipe } from '../shared/pipes/dropdown-options.pipe' @@ -104,6 +107,7 @@ import { SettingsComponent } from './settings/settings.component' CameraComponent, CameraInfoComponent, CameraExposureComponent, + ConfirmDialog, DeviceChooserComponent, DeviceListMenuComponent, DialogMenuComponent, @@ -206,6 +210,16 @@ import { SettingsComponent } from './settings/settings.component' useClass: LocationInterceptor, multi: true, }, + { + provide: HTTP_INTERCEPTORS, + useClass: IdempotencyKeyInterceptor, + multi: true, + }, + { + provide: HTTP_INTERCEPTORS, + useClass: ConfirmationInterceptor, + multi: true, + }, ], bootstrap: [AppComponent], }) diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 97a6f2a13..8061fb6ee 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -537,16 +537,6 @@
-
- - - - -
@@ -598,7 +588,7 @@
+ style="height: 32px; left: 95px; top: 2px; padding-right: 45px"> + private readonly moon?: ElementRef @Input() height = 256 @@ -31,7 +31,8 @@ export class MoonComponent implements AfterViewInit, OnChanges { // Adapted from https://codepen.io/ardathksheyna/pen/adMyXx. private draw() { - const canvas = this.moon.nativeElement + const canvas = this.moon?.nativeElement + if (!canvas) return const ctx = canvas.getContext('2d')! ctx.clearRect(0, 0, canvas.width, canvas.height) diff --git a/desktop/src/shared/dialogs/confirm/confirm.dialog.html b/desktop/src/shared/dialogs/confirm/confirm.dialog.html new file mode 100644 index 000000000..655011566 --- /dev/null +++ b/desktop/src/shared/dialogs/confirm/confirm.dialog.html @@ -0,0 +1,17 @@ +{{ message }} + diff --git a/desktop/src/shared/dialogs/confirm/confirm.dialog.scss b/desktop/src/shared/dialogs/confirm/confirm.dialog.scss new file mode 100644 index 000000000..e69de29bb diff --git a/desktop/src/shared/dialogs/confirm/confirm.dialog.ts b/desktop/src/shared/dialogs/confirm/confirm.dialog.ts new file mode 100644 index 000000000..4131d2560 --- /dev/null +++ b/desktop/src/shared/dialogs/confirm/confirm.dialog.ts @@ -0,0 +1,36 @@ +import { Component } from '@angular/core' +import { ConfirmEventType, Confirmation } from 'primeng/api' +import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog' +import { PrimeService } from '../../services/prime.service' + +@Component({ + templateUrl: './confirm.dialog.html', + styleUrls: ['./confirm.dialog.scss'], +}) +export class ConfirmDialog { + readonly header: string + readonly message: string + + constructor( + private readonly dialogRef: DynamicDialogRef, + private readonly config: DynamicDialogConfig, + ) { + this.header = config.data?.header ?? config.header ?? 'Confirmation' + this.message = config.data?.message ?? 'Are you sure that you want to proceed?' + } + + reject() { + this.config.data?.reject?.(ConfirmEventType.REJECT) + this.dialogRef.close(ConfirmEventType.REJECT) + } + + accept() { + this.config.data?.accept?.() + this.dialogRef.close(ConfirmEventType.ACCEPT) + } + + static async open(prime: PrimeService, message: string) { + const data: Confirmation = { message } + return (await prime.open(ConfirmDialog, { header: 'Confirmation', data })) ?? ConfirmEventType.CANCEL + } +} diff --git a/desktop/src/shared/interceptors/confirmation.interceptor.ts b/desktop/src/shared/interceptors/confirmation.interceptor.ts new file mode 100644 index 000000000..3a29b4d5e --- /dev/null +++ b/desktop/src/shared/interceptors/confirmation.interceptor.ts @@ -0,0 +1,38 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { Observable, finalize } from 'rxjs' +import { ConfirmationService } from '../services/confirmation.service' +import { IdempotencyKeyInterceptor } from './idempotency-key.interceptor' + +@Injectable({ providedIn: 'root' }) +export class ConfirmationInterceptor implements HttpInterceptor { + constructor(private readonly confirmation: ConfirmationService) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const hasConfirmation = req.urlWithParams.includes('hasConfirmation') + + if (hasConfirmation) { + const idempotencyKey = req.headers.get(IdempotencyKeyInterceptor.HEADER_KEY) + + if (idempotencyKey) { + console.info('registered confirmation:', req.method, req.urlWithParams, idempotencyKey) + this.confirmation.register(idempotencyKey) + } + + const res = next.handle(req) + + if (idempotencyKey) { + return res.pipe( + finalize(() => { + console.info('unregistered confirmation:', req.method, req.urlWithParams, idempotencyKey) + this.confirmation.unregister(idempotencyKey) + }), + ) + } + + return res + } else { + return next.handle(req) + } + } +} diff --git a/desktop/src/shared/interceptors/idempotency-key.interceptor.ts b/desktop/src/shared/interceptors/idempotency-key.interceptor.ts new file mode 100644 index 000000000..a89ffe54a --- /dev/null +++ b/desktop/src/shared/interceptors/idempotency-key.interceptor.ts @@ -0,0 +1,19 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { nuid } from 'nuid' +import { Observable } from 'rxjs' + +@Injectable({ providedIn: 'root' }) +export class IdempotencyKeyInterceptor implements HttpInterceptor { + static readonly HEADER_KEY = 'X-Idempotency-Key' + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const idempotencyKey = nuid.next() + + req = req.clone({ + headers: req.headers.set(IdempotencyKeyInterceptor.HEADER_KEY, idempotencyKey), + }) + + return next.handle(req) + } +} diff --git a/desktop/src/shared/interceptors/location.interceptor.ts b/desktop/src/shared/interceptors/location.interceptor.ts index 764a1a875..3efc4f402 100644 --- a/desktop/src/shared/interceptors/location.interceptor.ts +++ b/desktop/src/shared/interceptors/location.interceptor.ts @@ -5,14 +5,16 @@ import { PreferenceService } from '../services/preference.service' @Injectable({ providedIn: 'root' }) export class LocationInterceptor implements HttpInterceptor { + static readonly HEADER_KEY = 'X-Location' + constructor(private readonly preference: PreferenceService) {} intercept(req: HttpRequest, next: HttpHandler): Observable> { if (req.urlWithParams.includes('hasLocation')) { - const selectedLocation = this.preference.selectedLocation.get() + const location = this.preference.selectedLocation.get() req = req.clone({ - headers: req.headers.set('X-Location', JSON.stringify(selectedLocation)), + headers: req.headers.set(LocationInterceptor.HEADER_KEY, JSON.stringify(location)), }) } diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index 9f274e431..d19a890df 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -133,12 +133,12 @@ export class ApiService { } mountSlew(mount: Mount, rightAscension: Angle, declination: Angle, j2000: boolean) { - const query = this.http.query({ rightAscension, declination, j2000 }) + const query = this.http.query({ rightAscension, declination, j2000, hasConfirmation: true }) return this.http.put(`mounts/${mount.id}/slew?${query}`) } mountGoTo(mount: Mount, rightAscension: Angle, declination: Angle, j2000: boolean) { - const query = this.http.query({ rightAscension, declination, j2000 }) + const query = this.http.query({ rightAscension, declination, j2000, hasConfirmation: true }) return this.http.put(`mounts/${mount.id}/goto?${query}`) } @@ -701,4 +701,11 @@ export class ApiService { hasPreference(key: string) { return this.http.get(`preferences/${key}/exists`) } + + // CONFIRMATION + + confirm(idempotencyKey: string, accepted: boolean) { + const query = this.http.query({ accepted }) + return this.http.put(`confirmation/${idempotencyKey}?${query}`) + } } diff --git a/desktop/src/shared/services/confirmation.service.ts b/desktop/src/shared/services/confirmation.service.ts new file mode 100644 index 000000000..3f996eb4c --- /dev/null +++ b/desktop/src/shared/services/confirmation.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core' +import { ConfirmEventType } from 'primeng/api' +import { ConfirmationEvent } from '../types/app.types' +import { ApiService } from './api.service' +import { PrimeService } from './prime.service' + +@Injectable({ providedIn: 'root' }) +export class ConfirmationService { + private readonly keys = new Map() + + constructor( + private readonly prime: PrimeService, + private readonly api: ApiService, + ) {} + + register(key: string) { + this.keys.set(key, '') + } + + unregister(key: string) { + this.keys.delete(key) + } + + has(key: string) { + return this.keys.has(key) + } + + async processConfirmationEvent(event: ConfirmationEvent) { + console.info('processing confirmation event', event) + const response = await this.prime.confirm(event.message) + await this.api.confirm(event.idempotencyKey, response === ConfirmEventType.ACCEPT) + this.unregister(event.idempotencyKey) + } +} diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index ae7a611ef..5591485a1 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -9,7 +9,7 @@ import { ipcRenderer, webFrame } from 'electron' import * as fs from 'fs' import { DARVEvent, TPPAEvent } from '../types/alignment.types' import { DeviceMessageEvent } from '../types/api.types' -import { CloseWindow, JsonFile, OpenDirectory, OpenFile, SaveJson } from '../types/app.types' +import { CloseWindow, ConfirmationEvent, JsonFile, NotificationEvent, OpenDirectory, OpenFile, SaveJson } from '../types/app.types' import { Location } from '../types/atlas.types' import { AutoFocusEvent } from '../types/autofocus.type' import { Camera, CameraCaptureEvent } from '../types/camera.types' @@ -26,6 +26,8 @@ import { FilterWheel, WheelRenamed } from '../types/wheel.types' import { Undefinable } from '../utils/types' interface EventMappedType { + NOTIFICATION: NotificationEvent + CONFIRMATION: ConfirmationEvent 'DEVICE.PROPERTY_CHANGED': INDIMessageEvent 'DEVICE.PROPERTY_DELETED': INDIMessageEvent 'DEVICE.MESSAGE_RECEIVED': INDIMessageEvent diff --git a/desktop/src/shared/services/prime.service.ts b/desktop/src/shared/services/prime.service.ts index 5d8fa6005..8ff451086 100644 --- a/desktop/src/shared/services/prime.service.ts +++ b/desktop/src/shared/services/prime.service.ts @@ -1,19 +1,20 @@ import { Injectable, Type } from '@angular/core' -import { ConfirmEventType, ConfirmationService, MessageService } from 'primeng/api' +import { MessageService } from 'primeng/api' import { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog' +import { ConfirmDialog } from '../dialogs/confirm/confirm.dialog' import { Undefinable } from '../utils/types' @Injectable({ providedIn: 'root' }) export class PrimeService { constructor( private readonly dialog: DialogService, - private readonly confirmation: ConfirmationService, private readonly messager: MessageService, ) {} open(componentType: Type, config: DynamicDialogConfig) { const ref = this.dialog.open(componentType, { ...config, + duplicate: true, draggable: config.draggable ?? true, resizable: false, width: config.width || '80vw', @@ -36,21 +37,7 @@ export class PrimeService { } confirm(message: string) { - return new Promise((resolve) => { - this.confirmation.confirm({ - message, - header: 'Confirmation', - icon: 'mdi mdi-lg mdi-help-circle', - acceptButtonStyleClass: 'p-button-success p-button-text', - rejectButtonStyleClass: 'p-button-danger p-button-text', - accept: () => { - resolve(ConfirmEventType.ACCEPT) - }, - reject: (type: ConfirmEventType) => { - resolve(type) - }, - }) - }) + return ConfirmDialog.open(this, message) } message(text: string, severity: 'info' | 'warn' | 'error' | 'success' = 'success') { diff --git a/desktop/src/shared/types/app.types.ts b/desktop/src/shared/types/app.types.ts index 5f6759255..3ab578ef8 100644 --- a/desktop/src/shared/types/app.types.ts +++ b/desktop/src/shared/types/app.types.ts @@ -11,6 +11,11 @@ export interface NotificationEvent extends MessageEvent { body: string } +export interface ConfirmationEvent extends MessageEvent { + message: string + idempotencyKey: string +} + export const INTERNAL_EVENT_TYPES = [ 'DIRECTORY.OPEN', 'FILE.OPEN', diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index bd77e8ca6..8b9b5a1c9 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -279,7 +279,6 @@ export interface BodyPosition extends EquatorialCoordinate, EquatorialCoordinate illuminated: number elongation: number leading: boolean - pierSide: PierSide } export const EMPTY_BODY_POSITION: BodyPosition = { @@ -296,7 +295,6 @@ export const EMPTY_BODY_POSITION: BodyPosition = { illuminated: 0, elongation: 0, leading: false, - pierSide: 'NEITHER', } export interface Twilight { diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicCoordinate.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicCoordinate.kt new file mode 100644 index 000000000..391e6d982 --- /dev/null +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicCoordinate.kt @@ -0,0 +1,13 @@ +package nebulosa.nova.position + +import nebulosa.math.Angle +import nebulosa.math.Distance + +interface GeographicCoordinate { + + val longitude: Angle + + val latitude: Angle + + val elevation: Distance +} diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicPosition.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicPosition.kt index d6d3060be..86acbe1a7 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicPosition.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/GeographicPosition.kt @@ -15,12 +15,12 @@ import kotlin.math.atan2 import kotlin.math.tan class GeographicPosition( - val longitude: Angle, - val latitude: Angle, - val elevation: Distance, + override val longitude: Angle, + override val latitude: Angle, + override val elevation: Distance, itrs: Vector3D, val model: Geoid, -) : ITRSPosition(itrs), Frame { +) : ITRSPosition(itrs), GeographicCoordinate, Frame { private val rLat by lazy { Matrix3D.rotY(-latitude).flipX() } private val rLatLon by lazy { rLat * Matrix3D.rotZ(longitude) } From df33dfb7ee4e80263e34c92204a9322292befb37 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Thu, 27 Jun 2024 22:27:39 -0300 Subject: [PATCH 16/29] [api]: Show confirmation if mount will point below horizon --- .../nebulosa/api/mounts/MountService.kt | 34 +++++++++++++++---- .../MountWillPointToBelowHorizonEvent.kt | 9 +++++ 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToBelowHorizonEvent.kt diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt index 441d45302..4ddf28fb0 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt @@ -66,30 +66,36 @@ class MountService( } fun slewTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean, idempotencyKey: String? = null) { - if (idempotencyKey.isNullOrBlank() || verifyMountWillPointToSun(idempotencyKey, mount, ra, dec, j2000)) { + if (idempotencyKey.isNullOrBlank() || verifyMountCanSlew(idempotencyKey, mount, ra, dec, j2000)) { if (j2000) mount.slewToJ2000(ra, dec) else mount.slewTo(ra, dec) } } fun goTo(mount: Mount, ra: Angle, dec: Angle, j2000: Boolean, idempotencyKey: String? = null) { - if (idempotencyKey.isNullOrBlank() || verifyMountWillPointToSun(idempotencyKey, mount, ra, dec, j2000)) { + if (idempotencyKey.isNullOrBlank() || verifyMountCanSlew(idempotencyKey, mount, ra, dec, j2000)) { if (j2000) mount.goToJ2000(ra, dec) else mount.goTo(ra, dec) } } + private fun verifyMountCanSlew(idempotencyKey: String, mount: Mount, ra: Angle, dec: Angle, j2000: Boolean): Boolean { + val location = sites[mount] ?: return true + val mountPosition = if (j2000) ICRF.equatorial(ra, dec, center = location) + else ICRF.equatorial(ra, dec, epoch = CurrentTime, center = location) + return verifyMountWillPointToSun(idempotencyKey, mount, mountPosition) && + verifiyMountWillPointBelowHorizon(idempotencyKey, mountPosition) + } + /** - * Verifies if the [mount] will be point to Sun. + * Verifies if the Mount will be point to the Sun. * - * @return true if mount can slew to [ra] and [dec] coordinates. + * @return true if mount can slew to [mountPosition] coordinates. */ - private fun verifyMountWillPointToSun(idempotencyKey: String, mount: Mount, ra: Angle, dec: Angle, j2000: Boolean): Boolean { + private fun verifyMountWillPointToSun(idempotencyKey: String, mount: Mount, mountPosition: ICRF): Boolean { val location = sites[mount] ?: return true - val sunPosition = skyAtlasService.positionOfSun(location, LocalDateTime.now()) .let { ICRF.equatorial(it.rightAscensionJ2000, it.declinationJ2000) } - val mountPosition = if (j2000) ICRF.equatorial(ra, dec) else ICRF.equatorial(ra, dec, epoch = CurrentTime) return if (sunPosition.separationFrom(mountPosition).toDegrees <= 1.0) { val event = MountWillPointToSunEvent(idempotencyKey) @@ -99,6 +105,20 @@ class MountService( } } + /** + * Verifies if the Mount will be point below horizon. + * + * @return true if mount can slew to [mountPosition] coordinates. + */ + private fun verifiyMountWillPointBelowHorizon(idempotencyKey: String, mountPosition: ICRF): Boolean { + return if (mountPosition.horizontal().latitude < 0.0) { + val event = MountWillPointToBelowHorizonEvent(idempotencyKey) + confirmationService.ask(idempotencyKey, event).waitForConfirmation(30, TimeUnit.SECONDS) + } else { + true + } + } + fun home(mount: Mount) { mount.home() } diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToBelowHorizonEvent.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToBelowHorizonEvent.kt new file mode 100644 index 000000000..0bc63b40b --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountWillPointToBelowHorizonEvent.kt @@ -0,0 +1,9 @@ +package nebulosa.api.mounts + +import nebulosa.api.confirmation.ConfirmationEvent + +data class MountWillPointToBelowHorizonEvent(override val idempotencyKey: String) : ConfirmationEvent { + + override val message = + "Pointing a telescope below the horizon can damage the equipment and compromise the stability of your setup. Do you want to proceed?" +} From 766aa50c5085f4719dfef8e78487869d57b86eb7 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 28 Jun 2024 18:18:26 -0300 Subject: [PATCH 17/29] [api][desktop]: Improve Sky Atlas --- .../kotlin/nebulosa/api/atlas/BodyPosition.kt | 6 +- .../kotlin/nebulosa/api/atlas/Location.kt | 7 +- .../nebulosa/api/atlas/SkyAtlasController.kt | 29 +- .../nebulosa/api/atlas/SkyAtlasService.kt | 90 ++++-- .../atlas/ephemeris/BodyEphemerisProvider.kt | 89 ++++-- .../ephemeris/CachedEphemerisProvider.kt | 67 +++-- .../api/atlas/ephemeris/EphemerisProvider.kt | 7 +- .../ephemeris/HorizonsEphemerisProvider.kt | 6 +- .../nebulosa/api/mounts/MountService.kt | 6 +- desktop/src/app/atlas/atlas.component.html | 106 ++++--- desktop/src/app/atlas/atlas.component.ts | 267 +++++++++--------- .../calibration/calibration.component.html | 10 +- desktop/src/app/image/image.component.html | 6 +- desktop/src/app/mount/mount.component.ts | 5 +- .../device-chooser.component.html | 2 +- desktop/src/shared/services/api.service.ts | 28 +- .../shared/services/browser-window.service.ts | 4 +- .../src/shared/services/preference.service.ts | 5 +- desktop/src/shared/types/atlas.types.ts | 62 ++++ .../main/kotlin/nebulosa/constants/Date.kt | 5 + .../nebulosa/horizons/HorizonsElement.kt | 11 +- .../nebulosa/horizons/HorizonsQuantity.kt | 89 ++++++ .../nebulosa/horizons/HorizonsService.kt | 14 +- .../kotlin/nebulosa/indi/device/gps/GPS.kt | 15 +- .../src/main/kotlin/nebulosa/math/Vector3D.kt | 5 +- .../nebulosa/nova/position/Barycentric.kt | 18 +- .../kotlin/nebulosa/nova/position/Geoid.kt | 7 + .../kotlin/nebulosa/nova/position/ICRF.kt | 3 +- .../nebulosa/time/TimeStampedWithOffset.kt | 11 + .../nebulosa/time/TimeZonedInSeconds.kt | 6 + 30 files changed, 636 insertions(+), 350 deletions(-) create mode 100644 nebulosa-time/src/main/kotlin/nebulosa/time/TimeStampedWithOffset.kt create mode 100644 nebulosa-time/src/main/kotlin/nebulosa/time/TimeZonedInSeconds.kt diff --git a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt index c4562aee8..e4d09fa3b 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt @@ -51,14 +51,14 @@ data class BodyPosition( element.asDouble(HorizonsQuantity.ASTROMETRIC_RA).deg, element.asDouble(HorizonsQuantity.ASTROMETRIC_DEC).deg, rightAscension, declination, - element.asDouble(HorizonsQuantity.APPARENT_AZ).deg, - element.asDouble(HorizonsQuantity.APPARENT_ALT).deg, + element.asDoubleOrNull(HorizonsQuantity.APPARENT_AZ)?.deg ?: element.asDouble(HorizonsQuantity.APPARENT_REFRACTED_AZ).deg, + element.asDoubleOrNull(HorizonsQuantity.APPARENT_ALT)?.deg ?: element.asDouble(HorizonsQuantity.APPARENT_REFRACTED_ALT).deg, element.asDouble(HorizonsQuantity.VISUAL_MAGNITUDE, SkyObject.UNKNOWN_MAGNITUDE), element.asEnum(HorizonsQuantity.CONSTELLATION, Constellation.AND), distance, distanceUnit, element.asDouble(HorizonsQuantity.ILLUMINATED_FRACTION), element.asDouble(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE), - element.asString(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE, index = 1) == "/L", + element.asStringOrNull(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE, index = 1) == "/L", ) } } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt index fe8d2dc7d..79a720095 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt @@ -1,20 +1,19 @@ package nebulosa.api.atlas -import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.databind.annotation.JsonDeserialize import nebulosa.api.beans.converters.angle.DegreesDeserializer import nebulosa.api.beans.converters.distance.MetersDeserializer import nebulosa.math.Angle import nebulosa.math.Distance import nebulosa.nova.position.GeographicCoordinate -import nebulosa.nova.position.Geoid +import nebulosa.time.TimeZonedInSeconds data class Location( @field:JsonDeserialize(using = DegreesDeserializer::class) override val latitude: Angle = 0.0, @field:JsonDeserialize(using = DegreesDeserializer::class) override val longitude: Angle = 0.0, @field:JsonDeserialize(using = MetersDeserializer::class) override val elevation: Distance = 0.0, val offsetInMinutes: Int = 0, -) : GeographicCoordinate { +) : GeographicCoordinate, TimeZonedInSeconds { - @delegate:JsonIgnore @get:JsonIgnore val geographicPosition by lazy { Geoid.IERS2010.lonLat(longitude, latitude, elevation) } + override val offsetInSeconds = offsetInMinutes * 60 } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt index eac7cb08e..fe171f595 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasController.kt @@ -32,42 +32,48 @@ class SkyAtlasController( fun positionOfSun( @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, - ) = skyAtlasService.positionOfSun(location, dateTime) + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.positionOfSun(location, dateTime, fast) @GetMapping("sun/altitude-points") fun altitudePointsOfSun( @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, - ) = skyAtlasService.altitudePointsOfSun(location, dateTime, stepSize) + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.altitudePointsOfSun(location, dateTime, stepSize, fast) @GetMapping("moon/position") fun positionOfMoon( @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, - ) = skyAtlasService.positionOfMoon(location, dateTime) + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.positionOfMoon(location, dateTime, fast) @GetMapping("moon/altitude-points") fun altitudePointsOfMoon( @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, - @RequestParam(required = false, defaultValue = "1") stepSize: Int, - ) = skyAtlasService.altitudePointsOfMoon(location, dateTime, stepSize) + @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.altitudePointsOfMoon(location, dateTime, stepSize, fast) @GetMapping("planets/{code}/position") fun positionOfPlanet( @PathVariable code: String, @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDateTime, - ) = skyAtlasService.positionOfPlanet(location, code, dateTime) + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.positionOfPlanet(location, code, dateTime, fast) @GetMapping("planets/{code}/altitude-points") fun altitudePointsOfPlanet( @PathVariable code: String, @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, - @RequestParam(required = false, defaultValue = "1") stepSize: Int, - ) = skyAtlasService.altitudePointsOfPlanet(location, code, dateTime, stepSize) + @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.altitudePointsOfPlanet(location, code, dateTime, stepSize, fast) @GetMapping("minor-planets") fun searchMinorPlanet(@RequestParam @Valid @NotBlank text: String) = skyAtlasService.searchMinorPlanet(text) @@ -91,7 +97,7 @@ class SkyAtlasController( @PathVariable id: Long, @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, - @RequestParam(required = false, defaultValue = "1") stepSize: Int, + @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, ) = skyAtlasService.altitudePointsOfSkyObject(location, id, dateTime, stepSize) @GetMapping("sky-objects") @@ -124,7 +130,7 @@ class SkyAtlasController( satellite: SatelliteEntity, @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, - @RequestParam(required = false, defaultValue = "1") stepSize: Int, + @RequestParam(required = false, defaultValue = "1") @Valid @Min(1) stepSize: Int, ) = skyAtlasService.altitudePointsOfSatellite(location, satellite, dateTime, stepSize) @GetMapping("satellites") @@ -137,5 +143,6 @@ class SkyAtlasController( fun twilight( @LocationParam location: Location, @DateAndTimeParam dateTime: LocalDate, - ) = skyAtlasService.twilight(location, dateTime) + @RequestParam(required = false, defaultValue = "false") fast: Boolean, + ) = skyAtlasService.twilight(location, dateTime, fast) } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index 9633b687b..dbf797b52 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -5,17 +5,22 @@ import nebulosa.api.atlas.ephemeris.BodyEphemerisProvider import nebulosa.api.atlas.ephemeris.HorizonsEphemerisProvider import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity +import nebulosa.indi.device.mount.Mount import nebulosa.math.Angle import nebulosa.math.toLightYears import nebulosa.math.toMas import nebulosa.nova.almanac.findDiscrete import nebulosa.nova.astrometry.Body import nebulosa.nova.astrometry.Constellation +import nebulosa.nova.astrometry.ELPMPP02 +import nebulosa.nova.astrometry.VSOP87E import nebulosa.nova.position.GeographicCoordinate import nebulosa.nova.position.GeographicPosition +import nebulosa.nova.position.Geoid import nebulosa.sbd.SmallBodyDatabaseService import nebulosa.skycatalog.SkyObject import nebulosa.skycatalog.SkyObjectType +import nebulosa.time.TimeZonedInSeconds import okhttp3.OkHttpClient import okhttp3.Request import org.springframework.http.HttpStatus @@ -28,7 +33,6 @@ import java.io.ByteArrayOutputStream import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime -import java.time.ZoneOffset import java.util.concurrent.TimeUnit import javax.imageio.ImageIO import kotlin.math.hypot @@ -44,8 +48,9 @@ class SkyAtlasService( private val httpClient: OkHttpClient, ) { - private val positions = HashMap() + private val positions = HashMap() private val cachedSimbadEntities = HashMap() + private val targetLocks = HashMap() @Volatile private var sunImage = ByteArray(0) val objectTypes: Collection by lazy { simbadEntityRepository.findAll().map { it.type }.toSortedSet() } @@ -55,16 +60,17 @@ class SkyAtlasService( output.outputStream.write(sunImage) } - fun positionOfSun(location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition { - return positionOfBody(SUN, location, dateTime)!! + fun positionOfSun(location: GeographicCoordinate, dateTime: LocalDateTime, fast: Boolean = false): BodyPosition { + return positionOfBody(if (fast) VSOP87E.SUN else SUN, location, dateTime)!! } - fun positionOfMoon(location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition { - return positionOfBody(MOON, location, dateTime)!! + fun positionOfMoon(location: GeographicCoordinate, dateTime: LocalDateTime, fast: Boolean = false): BodyPosition { + return positionOfBody(if (fast) FAST_MOON else MOON, location, dateTime)!! } - fun positionOfPlanet(location: GeographicCoordinate, code: String, dateTime: LocalDateTime): BodyPosition { - return positionOfBody(code, location, dateTime)!! + fun positionOfPlanet(location: GeographicCoordinate, code: String, dateTime: LocalDateTime, fast: Boolean = false): BodyPosition { + val target: Any = VSOP87E.entries.takeIf { fast }?.find { "${it.target}" == code } ?: code + return positionOfBody(target, location, dateTime)!! } fun positionOfSkyObject(location: GeographicCoordinate, id: Long, dateTime: LocalDateTime): BodyPosition { @@ -81,25 +87,34 @@ class SkyAtlasService( } private fun positionOfBody(target: Any, location: GeographicCoordinate, dateTime: LocalDateTime): BodyPosition? { - return bodyEphemeris(target, location, dateTime) + return bodyEphemeris(target, location, dateTime, false) .withLocationAndDateTime(location, dateTime) ?.let(BodyPosition::of) } - private fun bodyEphemeris(target: Any, location: GeographicCoordinate, dateTime: LocalDateTime): List { - val position = if (location is Location) positions.getOrPut(location, location::geographicPosition) - else location.geographicPosition() ?: return emptyList() - val offsetInSeconds = if (location is Location) location.offsetInMinutes * 60 else 0 - val zoneId = ZoneOffset.ofTotalSeconds(offsetInSeconds) - return if (target is Body) bodyEphemerisProvider.compute(target, position, dateTime, zoneId) - else horizonsEphemerisProvider.compute(target, position, dateTime, zoneId) + private fun bodyEphemeris( + target: Any, location: GeographicCoordinate, + dateTime: LocalDateTime, fully: Boolean, + ): List { + val position = synchronized(positions) { + if (location is Location || location is Mount) positions.getOrPut(location) { location.geographicPosition()!! } + else location.geographicPosition() + } ?: return emptyList() + + val lock = synchronized(targetLocks) { targetLocks.getOrPut(target) { Any() } } + + return synchronized(lock) { + val offsetInSeconds = location.offsetInSeconds().toLong() + if (target is Body) bodyEphemerisProvider.compute(target, position, dateTime, offsetInSeconds, fully) + else horizonsEphemerisProvider.compute(target, position, dateTime, offsetInSeconds, fully) + } } fun searchSatellites(text: String, groups: List): List { return satelliteRepository.search(text.ifBlank { null }, groups) } - fun twilight(location: GeographicCoordinate, date: LocalDate): Twilight { + fun twilight(location: GeographicCoordinate, date: LocalDate, fast: Boolean = false): Twilight { val civilDusk = doubleArrayOf(0.0, 0.0) val nauticalDusk = doubleArrayOf(0.0, 0.0) val astronomicalDusk = doubleArrayOf(0.0, 0.0) @@ -108,7 +123,7 @@ class SkyAtlasService( val nauticalDawn = doubleArrayOf(0.0, 0.0) val civilDawn = doubleArrayOf(0.0, 0.0) - val ephemeris = bodyEphemeris(SUN, location, LocalDateTime.of(date, LocalTime.now())) + val ephemeris = bodyEphemeris(if (fast) VSOP87E.SUN else SUN, location, LocalDateTime.of(date, LocalTime.now()), true) val (a) = findDiscrete(0.0, (ephemeris.size - 1).toDouble(), TwilightDiscreteFunction(ephemeris), 1.0) civilDusk[0] = a[0] / 60.0 @@ -132,18 +147,22 @@ class SkyAtlasService( ) } - fun altitudePointsOfSun(location: GeographicCoordinate, date: LocalDate, stepSize: Int): List { - val ephemeris = bodyEphemeris(SUN, location, LocalDateTime.of(date, LocalTime.now())) + fun altitudePointsOfSun(location: GeographicCoordinate, date: LocalDate, stepSize: Int, fast: Boolean = false): List { + val ephemeris = bodyEphemeris(if (fast) VSOP87E.SUN else SUN, location, LocalDateTime.of(date, LocalTime.now()), true) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfMoon(location: GeographicCoordinate, date: LocalDate, stepSize: Int): List { - val ephemeris = bodyEphemeris(MOON, location, LocalDateTime.of(date, LocalTime.now())) + fun altitudePointsOfMoon(location: GeographicCoordinate, date: LocalDate, stepSize: Int, fast: Boolean = false): List { + val ephemeris = bodyEphemeris(if (fast) FAST_MOON else MOON, location, LocalDateTime.of(date, LocalTime.now()), true) return altitudePointsOfBody(ephemeris, stepSize) } - fun altitudePointsOfPlanet(location: GeographicCoordinate, code: String, date: LocalDate, stepSize: Int): List { - val ephemeris = bodyEphemeris(code, location, LocalDateTime.of(date, LocalTime.now())) + fun altitudePointsOfPlanet( + location: GeographicCoordinate, code: String, date: LocalDate, + stepSize: Int, fast: Boolean = false + ): List { + val target: Any = VSOP87E.entries.takeIf { fast }?.find { "${it.target}" == code } ?: code + val ephemeris = bodyEphemeris(target, location, LocalDateTime.of(date, LocalTime.now()), true) return altitudePointsOfBody(ephemeris, stepSize) } @@ -151,12 +170,12 @@ class SkyAtlasService( val target = cachedSimbadEntities[id] ?: simbadEntityRepository.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cannot found sky object: [$id]") cachedSimbadEntities[id] = target - val ephemeris = bodyEphemeris(target, location, LocalDateTime.of(date, LocalTime.now())) + val ephemeris = bodyEphemeris(target, location, LocalDateTime.of(date, LocalTime.now()), true) return altitudePointsOfBody(ephemeris, stepSize) } fun altitudePointsOfSatellite(location: GeographicCoordinate, satellite: SatelliteEntity, date: LocalDate, stepSize: Int): List { - val ephemeris = bodyEphemeris("TLE@${satellite.tle}", location, LocalDateTime.of(date, LocalTime.now())) + val ephemeris = bodyEphemeris("TLE@${satellite.tle}", location, LocalDateTime.of(date, LocalTime.now()), true) return altitudePointsOfBody(ephemeris, stepSize) } @@ -213,13 +232,28 @@ class SkyAtlasService( private const val SUN = "10" private const val MOON = "301" + @JvmStatic private val FAST_MOON = VSOP87E.EARTH + ELPMPP02 + @JvmStatic private fun GeographicCoordinate.geographicPosition() = when (this) { is GeographicPosition -> this - is Location -> geographicPosition + is Location -> Geoid.IERS2010.lonLat(this) else -> null } + @JvmStatic + private fun GeographicCoordinate.offsetInSeconds() = when (this) { + is TimeZonedInSeconds -> offsetInSeconds + else -> 0 + } + + @JvmStatic + private fun GeographicCoordinate.offsetInMinutes() = when (this) { + is Location -> offsetInMinutes + is TimeZonedInSeconds -> offsetInSeconds / 60 + else -> 0 + } + @JvmStatic private fun Double.clampMagnitude(): Double { return if (this in SkyObject.MAGNITUDE_RANGE) this @@ -229,7 +263,7 @@ class SkyAtlasService( @JvmStatic private fun List.withLocationAndDateTime(location: GeographicCoordinate, dateTime: LocalDateTime): HorizonsElement? { - val offsetInMinutes = if (location is Location) location.offsetInMinutes.toLong() else 0L + val offsetInMinutes = location.offsetInMinutes().toLong() return let { HorizonsElement.of(it, dateTime.minusMinutes(offsetInMinutes)) } } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt index e2c9cb715..3510dbb7e 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt @@ -2,9 +2,12 @@ package nebulosa.api.atlas.ephemeris import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity +import nebulosa.log.debug +import nebulosa.log.loggerFor import nebulosa.math.normalized import nebulosa.math.toDegrees import nebulosa.nova.astrometry.Body +import nebulosa.nova.astrometry.Constellation import nebulosa.nova.astrometry.VSOP87E import nebulosa.nova.position.Barycentric import nebulosa.nova.position.GeographicPosition @@ -13,44 +16,82 @@ import nebulosa.time.UTC import org.springframework.stereotype.Service import java.time.LocalDateTime import java.time.temporal.ChronoUnit +import java.util.* +import java.util.concurrent.CompletableFuture +import kotlin.system.measureTimeMillis @Service class BodyEphemerisProvider : CachedEphemerisProvider() { private val timeBucket = HashMap() + private val cachedBodies = HashMap() override fun compute( - target: Body, - position: GeographicPosition, - startTime: LocalDateTime, - endTime: LocalDateTime, + target: Body, position: GeographicPosition, + startTime: LocalDateTime, endTime: LocalDateTime, ): List { - val site = VSOP87E.EARTH + position + val site = cachedBodies.getOrPut(position) { VSOP87E.EARTH + position } - var time = startTime val intervalInMinutes = ChronoUnit.MINUTES.between(startTime, endTime).toInt() + 1 - val res = ArrayList(intervalInMinutes) + val elementMap = LinkedHashMap(intervalInMinutes) + val elementQueue = LinkedList() - while (time <= endTime) { - val utc = timeBucket.getOrPut(time) { UTC(TimeYMDHMS(time)) } + repeat(intervalInMinutes) { + val time = startTime.plusMinutes(it.toLong()) + val element = HorizonsElement(time) + elementMap[time] = element + elementQueue.add(element) + } - val astrometric = site.at(utc).observe(target) - val (az, alt) = astrometric.horizontal() - val (ra, dec) = astrometric.equatorialAtDate() - val (raJ2000, decJ2000) = astrometric.equatorial() + val numberOfTasks = Runtime.getRuntime().availableProcessors() + val tasks = ArrayList>(numberOfTasks) - val element = HorizonsElement(time) - element[HorizonsQuantity.ASTROMETRIC_RA] = "${raJ2000.normalized.toDegrees}" - element[HorizonsQuantity.ASTROMETRIC_DEC] = "${decJ2000.toDegrees}" - element[HorizonsQuantity.APPARENT_RA] = "${ra.normalized.toDegrees}" - element[HorizonsQuantity.APPARENT_DEC] = "${dec.toDegrees}" - element[HorizonsQuantity.APPARENT_AZ] = "${az.normalized.toDegrees}" - element[HorizonsQuantity.APPARENT_ALT] = "${alt.toDegrees}" - res.add(element) - - time = time.plusMinutes(1L) + repeat(numberOfTasks) { + CompletableFuture.runAsync { + while (true) { + val element = synchronized(elementQueue) { + elementQueue.removeFirstOrNull() + } ?: break + + val utcTime = synchronized(timeBucket) { + val time = element.dateTime + timeBucket.getOrPut(time) { UTC(TimeYMDHMS(time)) } + } + + val barycentric = site.at(utcTime) + val astrometric = barycentric.observe(target) + val (az, alt) = astrometric.horizontal() + val (ra, dec) = astrometric.equatorialAtDate() + val (raJ2000, decJ2000) = astrometric.equatorial() + + element[HorizonsQuantity.ASTROMETRIC_RA] = "${raJ2000.normalized.toDegrees}" + element[HorizonsQuantity.ASTROMETRIC_DEC] = "${decJ2000.toDegrees}" + element[HorizonsQuantity.APPARENT_RA] = "${ra.normalized.toDegrees}" + element[HorizonsQuantity.APPARENT_DEC] = "${dec.toDegrees}" + element[HorizonsQuantity.APPARENT_AZ] = "${az.normalized.toDegrees}" + element[HorizonsQuantity.APPARENT_ALT] = "${alt.toDegrees}" + val illuminatedFraction = if (target === VSOP87E.SUN) SUN_ILLUMINATED else astrometric.illuminated(VSOP87E.SUN) * 100.0 + element[HorizonsQuantity.ILLUMINATED_FRACTION] = "$illuminatedFraction" + element[HorizonsQuantity.CONSTELLATION] = Constellation.find(astrometric).name + element[HorizonsQuantity.ONE_WAY_LIGHT_TIME] = (astrometric.lightTime * 1440.0).toString() + val (elongation, east) = if (target === VSOP87E.SUN) SUN_ELONGATION else barycentric.elongation(target, VSOP87E.SUN) + element[HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE] = "${elongation.toDegrees},/${if (east) 'L' else 'T'}" + } + }.also(tasks::add) } - return res + val elapsedTime = measureTimeMillis { tasks.forEach { it.get() } } + + LOG.debug { "elapsed $elapsedTime ms for computing body ephemeris" } + + return elementMap.values.toList() + } + + companion object { + + @JvmStatic private val LOG = loggerFor() + + private const val SUN_ILLUMINATED = 100.0 + @JvmStatic private val SUN_ELONGATION = 0.0 to true } } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/CachedEphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/CachedEphemerisProvider.kt index 432b46a05..0a00c7162 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/CachedEphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/CachedEphemerisProvider.kt @@ -1,72 +1,69 @@ package nebulosa.api.atlas.ephemeris import nebulosa.horizons.HorizonsElement +import nebulosa.log.debug import nebulosa.log.loggerFor import nebulosa.nova.position.GeographicPosition import java.time.LocalDateTime import java.time.LocalTime -import java.time.ZoneOffset +import java.time.temporal.ChronoUnit abstract class CachedEphemerisProvider : EphemerisProvider { @JvmField protected val ephemeris = HashMap, MutableMap>() protected abstract fun compute( - target: T, - position: GeographicPosition, - startTime: LocalDateTime, - endTime: LocalDateTime, + target: T, position: GeographicPosition, + startTime: LocalDateTime, endTime: LocalDateTime, ): List final override fun compute( - target: T, - position: GeographicPosition, - dateTime: LocalDateTime, - timeOffset: ZoneOffset, + target: T, position: GeographicPosition, + dateTime: LocalDateTime, offsetInSeconds: Long, fully: Boolean, ): List { - val offsetInSeconds = timeOffset.totalSeconds.toLong() val date = dateTime.toLocalDate() - val startTime = if (dateTime.hour >= 12) LocalDateTime.of(date, NOON).minusSeconds(offsetInSeconds).withSecond(0).withNano(0) + val startTime = if (fully) if (dateTime.hour >= 12) LocalDateTime.of(date, NOON).minusSeconds(offsetInSeconds).withSecond(0).withNano(0) else LocalDateTime.of(date, NOON).minusDays(1L).minusSeconds(offsetInSeconds).withSecond(0).withNano(0) - val endTime = startTime.plusDays(1L) + else dateTime.minusSeconds(offsetInSeconds).withSecond(0).withNano(0) - LOG.info("computing ephemeris for {} from {} UTC to {} UTC. dateTime={}", target, startTime, endTime, dateTime) + val endTime = if (fully) startTime.plusDays(1L) else startTime.plusMinutes(1L) - val key = target to position - - return synchronized(this) { - if (key in ephemeris) { - val elements = ephemeris[key]!! - val res = ArrayList(1441) + LOG.debug { "computing ephemeris for $target from $startTime UTC to $endTime UTC" } - for (minute in 0L..1440L) { - val time = startTime.plusMinutes(minute) + val key = target to position - if (time !in elements) { - res.addAll(computeAndSave(key, time, endTime)) - break - } else { - res.add(elements[time]!!) - } + return if (key in ephemeris) { + var time = startTime + val elements = ephemeris[key]!! + val numberOfElements = if (fully) 1441 else 1 + val output = ArrayList(numberOfElements) + + while (time <= endTime) { + if (time !in elements) { + output.addAll(computeAndSave(key, time, endTime)) + break + } else { + output.add(elements[time]!!) } - res - } else { - computeAndSave(key, startTime, endTime) + time = time.plusMinutes(1) } + + output + } else { + computeAndSave(key, startTime, endTime) } } private fun computeAndSave( key: Pair, - startTime: LocalDateTime, - endTime: LocalDateTime, + startTime: LocalDateTime, endTime: LocalDateTime, ): List { - LOG.info("retrieving ephemeris. target={}, position={}, startTime={}, endTime={}", key.first, key.second, startTime, endTime) - + LOG.debug { "retrieving ephemeris. target=${key.first}, position=${key.second}, startTime=$startTime, endTime=$endTime" } val elements = compute(key.first, key.second, startTime, endTime) - val cachedElements = ephemeris.getOrPut(key) { HashMap(1441) } + LOG.debug { "retrieved ephemeris. size=${elements.size}, target=${key.first}, position=${key.second}, startTime=$startTime, endTime=$endTime" } + val cachedElements = ephemeris.getOrPut(key) { HashMap(ChronoUnit.MINUTES.between(startTime, endTime).toInt() + 1) } elements.forEach { cachedElements[it.dateTime] = it } return elements } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/EphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/EphemerisProvider.kt index 7ececd999..736434406 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/EphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/EphemerisProvider.kt @@ -3,14 +3,11 @@ package nebulosa.api.atlas.ephemeris import nebulosa.horizons.HorizonsElement import nebulosa.nova.position.GeographicPosition import java.time.LocalDateTime -import java.time.ZoneOffset sealed interface EphemerisProvider { fun compute( - target: T, - position: GeographicPosition, - dateTime: LocalDateTime, - timeOffset: ZoneOffset, + target: T, position: GeographicPosition, + dateTime: LocalDateTime, offsetInSeconds: Long, fully: Boolean, ): List } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/HorizonsEphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/HorizonsEphemerisProvider.kt index 828199166..404f53bab 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/HorizonsEphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/HorizonsEphemerisProvider.kt @@ -14,10 +14,8 @@ import java.time.LocalDateTime class HorizonsEphemerisProvider(private val horizonsService: HorizonsService) : CachedEphemerisProvider() { override fun compute( - target: Any, - position: GeographicPosition, - startTime: LocalDateTime, - endTime: LocalDateTime, + target: Any, position: GeographicPosition, + startTime: LocalDateTime, endTime: LocalDateTime, ): List { return when (target) { is SmallBody -> { diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt index 4ddf28fb0..952411652 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt @@ -44,8 +44,7 @@ class MountService( @Subscribe(threadMode = ThreadMode.ASYNC) fun onMountGeographicCoordinateChanged(event: MountGeographicCoordinateChanged) { - val site = Geoid.IERS2010.lonLat(event.device.longitude, event.device.latitude, event.device.elevation) - sites[event.device] = site + sites[event.device] = Geoid.IERS2010.lonLat(event.device) } fun connect(mount: Mount) { @@ -93,8 +92,7 @@ class MountService( * @return true if mount can slew to [mountPosition] coordinates. */ private fun verifyMountWillPointToSun(idempotencyKey: String, mount: Mount, mountPosition: ICRF): Boolean { - val location = sites[mount] ?: return true - val sunPosition = skyAtlasService.positionOfSun(location, LocalDateTime.now()) + val sunPosition = skyAtlasService.positionOfSun(mount, LocalDateTime.now(), true) .let { ICRF.equatorial(it.rightAscensionJ2000, it.declinationJ2000) } return if (sunPosition.separationFrom(mountPosition).toDegrees <= 1.0) { diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 8061fb6ee..7842239c7 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -523,7 +523,7 @@ pInputText readonly class="p-inputtext-sm border-0 w-full" - [value]="bodyPosition.illuminated" /> + [value]="bodyPosition.illuminated.toFixed(3)" />
@@ -533,7 +533,7 @@ pInputText readonly class="p-inputtext-sm border-0 w-full" - [value]="bodyPosition.elongation" /> + [value]="bodyPosition.elongation.toFixed(3)" />
@@ -541,7 +541,7 @@
+ +
+
+ +
+
+ + + +
+
- +
+ Enable + +
- - +
+ Hour + +
+
+ Minute + +
diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index e9309b457..0c485c9ba 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -16,69 +16,43 @@ import { BrowserWindowService } from '../../shared/services/browser-window.servi import { ElectronService } from '../../shared/services/electron.service' import { PreferenceService } from '../../shared/services/preference.service' import { PrimeService } from '../../shared/services/prime.service' -import { Angle, CONSTELLATIONS, CloseApproach, Constellation, DeepSkyObject, EMPTY_BODY_POSITION, Location, MinorPlanet, MinorPlanetSearchItem, SATELLITE_GROUPS, Satellite, SatelliteGroupType, SkyObjectType } from '../../shared/types/atlas.types' +import { + CONSTELLATIONS, + CloseApproach, + Constellation, + DeepSkyObject, + EMPTY_BODY_POSITION, + EMPTY_SEARCH_FILTER, + Location, + MinorPlanet, + MinorPlanetSearchItem, + PlanetTableItem, + SATELLITE_GROUPS, + Satellite, + SatelliteGroupType, + SettingsDialog, + SkyAtlasInput, + SkyAtlasTab, +} from '../../shared/types/atlas.types' import { Mount } from '../../shared/types/mount.types' import { AppComponent } from '../app.component' Chart.register(zoomPlugin) -export const ATLAS_KEY = 'atlas' - -export interface PlanetItem { - name: string - type: string - code: string -} - -export interface SearchFilter { - text: string - rightAscension: Angle - declination: Angle - radius: number - constellation: Constellation | 'ALL' - magnitude: [number, number] - type: SkyObjectType | 'ALL' - types: (SkyObjectType | 'ALL')[] -} - -export const EMPTY_SEARCH_FILTER: SearchFilter = { - text: '', - rightAscension: '00h00m00s', - declination: `+000°00'00"`, - radius: 0, - constellation: 'ALL', - magnitude: [-30, 30], - type: 'ALL', - types: ['ALL'], -} - -export interface SkyAtlasPreference { - satellites?: { group: SatelliteGroupType; enabled: boolean }[] -} - -export enum SkyAtlasTab { - SUN, - MOON, - PLANET, - MINOR_PLANET, - SKY_OBJECT, - SATELLITE, -} - -export interface SkyAtlasData { - tab: SkyAtlasTab - filter?: Partial> -} - @Component({ selector: 'app-atlas', templateUrl: './atlas.component.html', styleUrls: ['./atlas.component.scss'], }) export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, OnDestroy { - refreshing = false + refreshingPosition = false + refreshingChart = false tab = SkyAtlasTab.SUN + get refreshing() { + return this.refreshingPosition || this.refreshingChart + } + readonly bodyPosition = structuredClone(EMPTY_BODY_POSITION) moonIlluminated = 1 moonWaning = false @@ -88,8 +62,8 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, dateTimeHour = this.dateTime.getHours() dateTimeMinute = this.dateTime.getMinutes() - planet?: PlanetItem - readonly planets: PlanetItem[] = [ + planet?: PlanetTableItem + readonly planets: PlanetTableItem[] = [ { name: 'Mercury', type: 'Planet', code: '199' }, { name: 'Venus', type: 'Planet', code: '299' }, { name: 'Mars', type: 'Planet', code: '499' }, @@ -422,6 +396,11 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private location: Location + readonly settings: SettingsDialog = { + showDialog: false, + fast: false, + } + constructor( private readonly app: AppComponent, private readonly api: ApiService, @@ -435,6 +414,13 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, ) { app.title = 'Sky Atlas' + app.topMenu.push({ + icon: 'mdi mdi-cog', + tooltip: 'Settings', + command: () => { + this.settings.showDialog = true + }, + }) app.topMenu.push({ icon: 'mdi mdi-calendar', tooltip: 'Date & time', @@ -460,15 +446,9 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async ngOnInit() { - const preference = this.preference.skyAtlasPreference.get() - - for (const group of SATELLITE_GROUPS) { - const satellite = preference.satellites?.find((e) => e.group === group) - const enabled = satellite?.enabled ?? AtlasComponent.DEFAULT_SATELLITE_FILTERS.includes(group) - this.satelliteSearchGroup.set(group, enabled) - } - - this.skyObjectFilter.types = ['ALL', ...(await this.api.skyObjectTypes())] + this.loadPreference() + const types = await this.api.skyObjectTypes() + this.skyObjectFilter.types = ['ALL', ...types] } ngAfterContentInit() { @@ -489,7 +469,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, }) this.route.queryParams.subscribe(async (e) => { - const data = JSON.parse(decodeURIComponent(e['data'] as string)) as SkyAtlasData + const data = JSON.parse(decodeURIComponent(e['data'] as string)) as SkyAtlasInput await this.loadTabFromData(data) }) } @@ -507,7 +487,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.refreshTimer?.unsubscribe() } - private async loadTabFromData(data?: SkyAtlasData) { + private async loadTabFromData(data?: SkyAtlasInput) { if (data?.tab) { this.tab = data.tab @@ -534,7 +514,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async searchMinorPlanet() { - this.refreshing = true + this.refreshingPosition = true try { const minorPlanet = await this.api.searchMinorPlanet(this.minorPlanetSearchText) @@ -547,7 +527,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.showMinorPlanetChoiceDialog = true } } finally { - this.refreshing = false + this.refreshingPosition = false } } @@ -558,7 +538,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async closeApproachesForMinorPlanets() { - this.refreshing = true + this.refreshingPosition = true try { this.closeApproaches = await this.api.closeApproachesForMinorPlanets(this.closeApproachDays, this.closeApproachDistance, this.dateTime) @@ -567,7 +547,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.prime.message('No close approaches found for the given days and lunar distance', 'warn') } } finally { - this.refreshing = false + this.refreshingPosition = false } } @@ -603,12 +583,12 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, const constellation = this.skyObjectFilter.constellation === 'ALL' ? undefined : this.skyObjectFilter.constellation const type = this.skyObjectFilter.type === 'ALL' ? undefined : this.skyObjectFilter.type - this.refreshing = true + this.refreshingPosition = true try { this.skyObjectItems = await this.api.searchSkyObject(this.skyObjectSearchText, this.skyObjectFilter.rightAscension, this.skyObjectFilter.declination, this.skyObjectFilter.radius, constellation, this.skyObjectFilter.magnitude[0], this.skyObjectFilter.magnitude[1], type) } finally { - this.refreshing = false + this.refreshingPosition = false } } @@ -618,37 +598,24 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async searchSatellite() { - this.refreshing = true + this.refreshingPosition = true try { - const preference = this.preference.skyAtlasPreference.get() - - preference.satellites = SATELLITE_GROUPS.map((group) => { - return { group, enabled: this.satelliteSearchGroup.get(group) ?? false } - }) - - this.preference.skyAtlasPreference.set(preference) - + this.savePreference() const groups = SATELLITE_GROUPS.filter((e) => this.satelliteSearchGroup.get(e)) this.satelliteItems = await this.api.searchSatellites(this.satelliteSearchText, groups) } finally { - this.refreshing = false + this.refreshingPosition = false } } resetSatelliteFilter() { - const preference = this.preference.skyAtlasPreference.get() - - const satellites = [] - for (const group of SATELLITE_GROUPS) { const enabled = AtlasComponent.DEFAULT_SATELLITE_FILTERS.includes(group) - satellites.push({ group, enabled }) this.satelliteSearchGroup.set(group, enabled) } - preference.satellites = satellites - this.preference.skyAtlasPreference.set(preference) + this.savePreference() } async filterSatellite() { @@ -692,7 +659,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } async refreshTab(refreshTwilight: boolean = false, refreshChart: boolean = false) { - this.refreshing = true + this.refreshingPosition = true this.refreshTabCount++ if (!this.useManualDateTime) { @@ -712,14 +679,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.name = 'Sun' this.tags = [] this.imageOfSun.nativeElement.src = `${this.api.baseUrl}/sky-atlas/sun/image` - const bodyPosition = await this.api.positionOfSun(this.dateTime) + const bodyPosition = await this.api.positionOfSun(this.dateTime, this.settings.fast) Object.assign(this.bodyPosition, bodyPosition) } // Moon. else if (this.tab === SkyAtlasTab.MOON) { this.name = 'Moon' this.tags = [] - const bodyPosition = await this.api.positionOfMoon(this.dateTime) + const bodyPosition = await this.api.positionOfMoon(this.dateTime, this.settings.fast) Object.assign(this.bodyPosition, bodyPosition) this.moonIlluminated = this.bodyPosition.illuminated / 100.0 this.moonWaning = this.bodyPosition.leading @@ -730,7 +697,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.planet) { this.name = this.planet.name - const bodyPosition = await this.api.positionOfPlanet(this.planet.code, this.dateTime) + const bodyPosition = await this.api.positionOfPlanet(this.planet.code, this.dateTime, this.settings.fast) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -782,8 +749,12 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, } } + this.refreshingPosition = false + if (this.refreshTabCount === 1 || refreshTwilight) { - const twilight = await this.api.twilight(this.dateTime) + this.refreshingChart = true + + const twilight = await this.api.twilight(this.dateTime, this.settings.fast) this.altitudeData.datasets[0].data = [ [0.0, 90], [twilight.civilDusk[0], 90], @@ -827,64 +798,94 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, await this.refreshChart() } } finally { - this.refreshing = false + this.refreshingPosition = false + this.refreshingChart = false } } private async refreshChart() { - // Sun. - if (this.tab === SkyAtlasTab.SUN) { - const points = await this.api.altitudePointsOfSun(this.dateTime) - AtlasComponent.belowZeroPoints(points) - this.altitudeData.datasets[9].data = points - } - // Moon. - else if (this.tab === SkyAtlasTab.MOON) { - const points = await this.api.altitudePointsOfMoon(this.dateTime) - AtlasComponent.belowZeroPoints(points) - this.altitudeData.datasets[9].data = points - } - // Planet. - else if (this.tab === SkyAtlasTab.PLANET && this.planet) { - const points = await this.api.altitudePointsOfPlanet(this.planet.code, this.dateTime) - AtlasComponent.belowZeroPoints(points) - this.altitudeData.datasets[9].data = points - } - // Minor Planet. - else if (this.tab === SkyAtlasTab.MINOR_PLANET) { - if (this.minorPlanet) { - const code = `DES=${this.minorPlanet.spkId};` - const points = await this.api.altitudePointsOfPlanet(code, this.dateTime) + this.refreshingChart = true + + try { + // Sun. + if (this.tab === SkyAtlasTab.SUN) { + const points = await this.api.altitudePointsOfSun(this.dateTime, this.settings.fast) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points - } else { - this.altitudeData.datasets[9].data = [] } - } - // Sky Object. - else if (this.tab === SkyAtlasTab.SKY_OBJECT) { - if (this.skyObject) { - const points = await this.api.altitudePointsOfSkyObject(this.skyObject, this.dateTime) + // Moon. + else if (this.tab === SkyAtlasTab.MOON) { + const points = await this.api.altitudePointsOfMoon(this.dateTime, this.settings.fast) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points - } else { - this.altitudeData.datasets[9].data = [] } - } - // Satellite. - else if (this.tab === SkyAtlasTab.SATELLITE) { - if (this.satellite) { - const points = await this.api.altitudePointsOfSatellite(this.satellite, this.dateTime) + // Planet. + else if (this.tab === SkyAtlasTab.PLANET && this.planet) { + const points = await this.api.altitudePointsOfPlanet(this.planet.code, this.dateTime, this.settings.fast) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points + } + // Minor Planet. + else if (this.tab === SkyAtlasTab.MINOR_PLANET) { + if (this.minorPlanet) { + const code = `DES=${this.minorPlanet.spkId};` + const points = await this.api.altitudePointsOfPlanet(code, this.dateTime) + AtlasComponent.belowZeroPoints(points) + this.altitudeData.datasets[9].data = points + } else { + this.altitudeData.datasets[9].data = [] + } + } + // Sky Object. + else if (this.tab === SkyAtlasTab.SKY_OBJECT) { + if (this.skyObject) { + const points = await this.api.altitudePointsOfSkyObject(this.skyObject, this.dateTime) + AtlasComponent.belowZeroPoints(points) + this.altitudeData.datasets[9].data = points + } else { + this.altitudeData.datasets[9].data = [] + } + } + // Satellite. + else if (this.tab === SkyAtlasTab.SATELLITE) { + if (this.satellite) { + const points = await this.api.altitudePointsOfSatellite(this.satellite, this.dateTime) + AtlasComponent.belowZeroPoints(points) + this.altitudeData.datasets[9].data = points + } else { + this.altitudeData.datasets[9].data = [] + } } else { - this.altitudeData.datasets[9].data = [] + return } - } else { - return + + this.chart.refresh() + } finally { + this.refreshingChart = false } + } + + private loadPreference() { + const preference = this.preference.skyAtlasPreference.get() - this.chart.refresh() + this.settings.fast = preference.fast + + for (const group of SATELLITE_GROUPS) { + const satellite = preference.satellites.find((e) => e.group === group) + const enabled = satellite?.enabled ?? AtlasComponent.DEFAULT_SATELLITE_FILTERS.includes(group) + this.satelliteSearchGroup.set(group, enabled) + } + } + + savePreference() { + const preference = this.preference.skyAtlasPreference.get() + + preference.fast = this.settings.fast + preference.satellites = SATELLITE_GROUPS.map((group) => { + return { group, enabled: this.satelliteSearchGroup.get(group) ?? false } + }) + + this.preference.skyAtlasPreference.set(preference) } private static belowZeroPoints(points: [number, number][]) { diff --git a/desktop/src/app/calibration/calibration.component.html b/desktop/src/app/calibration/calibration.component.html index 1983369a4..bee121072 100644 --- a/desktop/src/app/calibration/calibration.component.html +++ b/desktop/src/app/calibration/calibration.component.html @@ -2,7 +2,7 @@
@@ -69,7 +69,7 @@
@if (node.data.type === 'NAME') { }
{ - const data: SkyAtlasData = { + const data: SkyAtlasInput = { tab: SkyAtlasTab.SKY_OBJECT, filter: { rightAscension: this.rightAscensionJ2000, declination: this.declinationJ2000 }, } diff --git a/desktop/src/shared/components/device-chooser/device-chooser.component.html b/desktop/src/shared/components/device-chooser/device-chooser.component.html index 3196aaa5e..f2276b9cf 100644 --- a/desktop/src/shared/components/device-chooser/device-chooser.component.html +++ b/desktop/src/shared/components/device-chooser/device-chooser.component.html @@ -1,7 +1,7 @@ + size="small">
diff --git a/desktop/src/shared/services/api.service.ts b/desktop/src/shared/services/api.service.ts index d19a890df..74e32b42f 100644 --- a/desktop/src/shared/services/api.service.ts +++ b/desktop/src/shared/services/api.service.ts @@ -454,39 +454,39 @@ export class ApiService { // SKY ATLAS - positionOfSun(dateTime: Date) { + positionOfSun(dateTime: Date, fast: boolean = false) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ date, time, hasLocation: true }) + const query = this.http.query({ date, time, fast, hasLocation: true }) return this.http.get(`sky-atlas/sun/position?${query}`) } - altitudePointsOfSun(dateTime: Date) { + altitudePointsOfSun(dateTime: Date, fast: boolean = false) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ date, hasLocation: true }) + const query = this.http.query({ date, fast, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/sun/altitude-points?${query}`) } - positionOfMoon(dateTime: Date) { + positionOfMoon(dateTime: Date, fast: boolean = false) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ date, time, hasLocation: true }) + const query = this.http.query({ date, time, fast, hasLocation: true }) return this.http.get(`sky-atlas/moon/position?${query}`) } - altitudePointsOfMoon(dateTime: Date) { + altitudePointsOfMoon(dateTime: Date, fast: boolean = false) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ date, hasLocation: true }) + const query = this.http.query({ date, fast, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/moon/altitude-points?${query}`) } - positionOfPlanet(code: string, dateTime: Date) { + positionOfPlanet(code: string, dateTime: Date, fast: boolean = false) { const [date, time] = moment(dateTime).format('YYYY-MM-DD HH:mm').split(' ') - const query = this.http.query({ date, time, hasLocation: true }) + const query = this.http.query({ date, time, fast, hasLocation: true }) return this.http.get(`sky-atlas/planets/${encodeURIComponent(code)}/position?${query}`) } - altitudePointsOfPlanet(code: string, dateTime: Date) { + altitudePointsOfPlanet(code: string, dateTime: Date, fast: boolean = false) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ date, hasLocation: true }) + const query = this.http.query({ date, fast, hasLocation: true }) return this.http.get<[number, number][]>(`sky-atlas/planets/${encodeURIComponent(code)}/altitude-points?${query}`) } @@ -528,9 +528,9 @@ export class ApiService { return this.http.get(`sky-atlas/satellites?${query}`) } - twilight(dateTime: Date) { + twilight(dateTime: Date, fast: boolean = false) { const date = moment(dateTime).format('YYYY-MM-DD') - const query = this.http.query({ date, hasLocation: true }) + const query = this.http.query({ date, fast, hasLocation: true }) return this.http.get(`sky-atlas/twilight?${query}`) } diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index 44b5dfae9..c0df267b7 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core' -import { SkyAtlasData } from '../../app/atlas/atlas.component' import { FramingData } from '../../app/framing/framing.component' import { OpenWindow, WindowPreference } from '../types/app.types' +import { SkyAtlasInput } from '../types/atlas.types' import { Camera, CameraDialogInput, CameraStartCapture } from '../types/camera.types' import { Device } from '../types/device.types' import { Focuser } from '../types/focuser.types' @@ -98,7 +98,7 @@ export class BrowserWindowService { return this.openWindow({ preference, data, id: 'indi', path: 'indi' }) } - openSkyAtlas(data?: SkyAtlasData, preference: WindowPreference = {}) { + openSkyAtlas(data?: SkyAtlasInput, preference: WindowPreference = {}) { Object.assign(preference, { icon: 'atlas', width: 450, height: 530, autoResizable: false }) return this.openWindow({ preference, data, id: 'atlas', path: 'atlas' }) } diff --git a/desktop/src/shared/services/preference.service.ts b/desktop/src/shared/services/preference.service.ts index cf9188933..320a7c3fb 100644 --- a/desktop/src/shared/services/preference.service.ts +++ b/desktop/src/shared/services/preference.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core' -import { SkyAtlasPreference } from '../../app/atlas/atlas.component' import { AlignmentPreference, EMPTY_ALIGNMENT_PREFERENCE } from '../types/alignment.types' -import { EMPTY_LOCATION, Location } from '../types/atlas.types' +import { EMPTY_LOCATION, EMPTY_SKY_ATLAS_PREFERENCE, Location, SkyAtlasPreference } from '../types/atlas.types' import { AutoFocusPreference, EMPTY_AUTO_FOCUS_PREFERENCE } from '../types/autofocus.type' import { CalibrationPreference } from '../types/calibration.types' import { Camera, CameraPreference, CameraStartCapture, EMPTY_CAMERA_PREFERENCE, EMPTY_LIVE_STACKING_REQUEST, LiveStackerType, LiveStackingRequest } from '../types/camera.types' @@ -105,7 +104,7 @@ export class PreferenceService { readonly selectedLocation = new PreferenceData(this.storage, 'locations.selected', () => structuredClone(EMPTY_LOCATION)) readonly homePreference = new PreferenceData(this.storage, 'home', () => ({}) as HomePreference) readonly imagePreference = new PreferenceData(this.storage, 'image', () => structuredClone(EMPTY_IMAGE_PREFERENCE)) - readonly skyAtlasPreference = new PreferenceData(this.storage, 'atlas', () => ({}) as SkyAtlasPreference) + readonly skyAtlasPreference = new PreferenceData(this.storage, 'atlas', () => structuredClone(EMPTY_SKY_ATLAS_PREFERENCE)) readonly alignmentPreference = new PreferenceData(this.storage, 'alignment', () => structuredClone(EMPTY_ALIGNMENT_PREFERENCE)) readonly imageFOVs = new PreferenceData(this.storage, 'image.fovs', () => []) readonly calibrationPreference = new PreferenceData(this.storage, 'calibration', () => ({}) as CalibrationPreference) diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index 8b9b5a1c9..b2ad64a61 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -2,6 +2,68 @@ import type { PierSide } from './mount.types' export type Angle = string | number +export interface PlanetTableItem { + name: string + type: string + code: string +} + +export interface SearchFilter { + text: string + rightAscension: Angle + declination: Angle + radius: number + constellation: Constellation | 'ALL' + magnitude: [number, number] + type: SkyObjectType | 'ALL' + types: (SkyObjectType | 'ALL')[] +} + +export const EMPTY_SEARCH_FILTER: SearchFilter = { + text: '', + rightAscension: '00h00m00s', + declination: `+000°00'00"`, + radius: 0, + constellation: 'ALL', + magnitude: [-30, 30], + type: 'ALL', + types: ['ALL'], +} + +export interface SatelliteGroupFilterItem { + group: SatelliteGroupType + enabled: boolean +} + +export interface SkyAtlasPreference { + satellites: SatelliteGroupFilterItem[] + fast: boolean +} + +export const EMPTY_SKY_ATLAS_PREFERENCE: SkyAtlasPreference = { + satellites: [], + fast: false, +} + +export enum SkyAtlasTab { + SUN, + MOON, + PLANET, + MINOR_PLANET, + SKY_OBJECT, + SATELLITE, +} + +export interface SkyAtlasInput { + tab: SkyAtlasTab + filter?: Partial> +} + +export interface SettingsDialog { + showDialog: boolean + fast: boolean +} + export const CONSTELLATIONS = [ 'AND', 'ANT', diff --git a/nebulosa-constants/src/main/kotlin/nebulosa/constants/Date.kt b/nebulosa-constants/src/main/kotlin/nebulosa/constants/Date.kt index 81374353c..576f5bb65 100644 --- a/nebulosa-constants/src/main/kotlin/nebulosa/constants/Date.kt +++ b/nebulosa-constants/src/main/kotlin/nebulosa/constants/Date.kt @@ -17,6 +17,11 @@ const val B1950 = 2433282.4235 */ const val DAYSEC = 86400.0 +/** + * Minutes per day. + */ +const val DAYMIN = 1440.0 + /** * Days per Julian year. */ diff --git a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsElement.kt b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsElement.kt index 77ed4cda0..adc91f7b8 100644 --- a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsElement.kt +++ b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsElement.kt @@ -5,13 +5,22 @@ import java.time.ZoneOffset data class HorizonsElement(val dateTime: LocalDateTime) : HashMap(7), Comparable { + fun asStringOrNull(quantity: HorizonsQuantity, index: Int = 0): String? { + return if (quantity.numberOfColumns > 1) this[quantity]?.split(',')?.get(index) + else this[quantity] + } + fun asString(quantity: HorizonsQuantity, defaultValue: String = "", index: Int = 0): String { return if (quantity.numberOfColumns > 1) this[quantity]?.split(',')?.get(index) ?: defaultValue else this[quantity] ?: defaultValue } + fun asDoubleOrNull(quantity: HorizonsQuantity, index: Int = 0): Double? { + return asStringOrNull(quantity, index = index)?.toDoubleOrNull() + } + fun asDouble(quantity: HorizonsQuantity, defaultValue: Double = 0.0, index: Int = 0): Double { - return asString(quantity, index = index).toDoubleOrNull() ?: defaultValue + return asDoubleOrNull(quantity, index) ?: defaultValue } inline fun > asEnum(quantity: HorizonsQuantity, defaultValue: T, index: Int = 0): T { diff --git a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsQuantity.kt b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsQuantity.kt index 681dd2109..dda43b631 100644 --- a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsQuantity.kt +++ b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsQuantity.kt @@ -5,21 +5,110 @@ enum class HorizonsQuantity( @JvmField internal val numberOfColumns: Int, @JvmField internal vararg val title: String, ) { + /** + * Adjusted for light-time aberration only. With respect to the reference + * plane and equinox of the chosen system (ICRF or FK4/B1950). If the + * FK4/B1950 frame output is selected, elliptic aberration terms are added. + * Astrometric RA/DEC is generally used when comparing or reducing data + * against a star catalog. + */ ASTROMETRIC_RA(1, 1, "R.A.", "(ICRF)"), ASTROMETRIC_DEC(1, 1, "DEC", "(ICRF)"), + + /** + * Apparent coordinates are with respect to the true-equator and Earth + * equinox of-date coordinate system (EOP-corrected IAU76/80 precession + * and nutation of the spin-pole) and adjusted to model light-time, the + * gravitational deflection of light, and stellar aberration, with an + * optional (approximate) correction for atmospheric yellow-light + * refraction. + */ APPARENT_RA(2, 1, "R.A.", "(a-app)"), APPARENT_DEC(2, 1, "DEC", "(a-app)"), + + /** + * Apparent azimuth and elevation of target. Adjusted for light-time, + * the gravitational deflection of light, stellar aberration, precession and + * nutation. There is an optional (approximate) adjustment for atmospheric + * refraction (Earth only). Azimuth is measured clockwise from north. + * + * Elevation angle is with respect to plane perpendicular to local zenith + * direction. + */ APPARENT_AZ(4, 1, "Azimuth", "(a-app)"), APPARENT_ALT(4, 1, "Elevation", "(a-app)"), + APPARENT_REFRACTED_AZ(4, 1, "Azimuth", "(r-app)"), + APPARENT_REFRACTED_ALT(4, 1, "Elevation", "(r-app)"), + + /** + * The angle measured westward in the body true-equator of-date plane + * from the meridian containing the body-fixed observer to the meridian + * containing the true Earth equinox (defined by intersection of the true + * equator of date with the ecliptic of date). + */ LOCAL_APPARENT_SIDEREAL_TIME(7, 1, "L_Ap_Sid_Time"), + + /** + * Approximate airless visual magnitude & surface brightness, where surface + * brightness is the average airless visual magnitude of a square-arcsecond + * of the illuminated portion of the apparent disk. + */ VISUAL_MAGNITUDE(9, 1, "APmag"), + + /** + * Surface brightness. S-brt= V + 2.5*log10(k*PI*a*b') + */ SURFACE_BRIGHTNESS(9, 1, "S-brt"), + + /** + * Percent of target objects' assumed circular disk illuminated by Sun + * (phase), as seen by observer. + */ ILLUMINATED_FRACTION(10, 1, "Illu%"), + + /** + * The equatorial angular width of the target body full disk, if it were + * fully illuminated and visible to the observer. If the target body diameter + * is unknown, "n.a." is output. + */ ANGULAR_DIAMETER(13, 1, "Ang-diam"), + + /** + * Target one-way down-leg light-time, as seen by observer. The elapsed + * time since light (observed at print-time) left or reflected off the + * target. Unit in minutes. + */ ONE_WAY_LIGHT_TIME(21, 1, "1-way_down_LT"), + + /** + * Sun-Observer-Target apparent SOLAR ELONGATION ANGLE seen from the + * observers' location at print-time. + * + * /T indicates target TRAILS Sun (evening sky: rises and sets AFTER Sun). + * /L indicates target LEADS Sun (morning sky: rises and sets BEFORE Sun). + */ SUN_OBSERVER_TARGET_ELONGATION_ANGLE(23, 2, "S-O-T"), + + /** + * The 3-letter abbreviation for the constellation name of targets' + * astrometric position, as defined by the IAU (1930) boundary delineation. + * See documentation for list of abbreviations. + */ CONSTELLATION(29, 1, "Cnst"), + + /** + * Local Apparent SOLAR Time at observing site. + */ LOCAL_APPARENT_SOLAR_TIME(34, 1, "L_Ap_SOL_Time"), + + /** + * Local apparent HOUR ANGLE of target at observing site. The angle between + * the observers' meridian plane, containing Earth's axis of-date and local + * zenith direction, and a great circle passing through Earth's axis-of-date + * and the targets' direction, measured westward from the zenith meridian to + * target meridian along the equator. Negative values are angular times UNTIL + * transit. Positive values are angular times SINCE transit. + */ APPARENT_HOUR_ANGLE(42, 1, "L_Ap_Hour_Ang"); internal fun matches(text: String) = title.all { text.contains(it, true) } diff --git a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsService.kt b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsService.kt index 037db228c..76ee522c0 100644 --- a/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsService.kt +++ b/nebulosa-horizons/src/main/kotlin/nebulosa/horizons/HorizonsService.kt @@ -12,7 +12,6 @@ import retrofit2.Converter import retrofit2.Retrofit import retrofit2.create import java.lang.reflect.Type -import java.time.Duration import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -29,13 +28,13 @@ class HorizonsService( command: String, longitude: Angle, latitude: Angle, elevation: Distance = 0.0, startTime: LocalDateTime, endTime: LocalDateTime = startTime.plusDays(1L), - stepSize: Duration = DEFAULT_STEP_SIZE, + stepSizeInMinutes: Int = 1, apparent: ApparentRefractionCorrection = ApparentRefractionCorrection.AIRLESS, extraPrecision: Boolean = false, vararg quantities: HorizonsQuantity = HorizonsQuantity.ENTRIES, ) = service.observer( wrap(command), wrap("${longitude.toDegrees},${latitude.toDegrees},${elevation.toKilometers}"), - wrap(startTime), wrap(endTime), wrap("${stepSize.toMinutes()}m"), + wrap(startTime), wrap(endTime), wrap("${stepSizeInMinutes}m"), wrap(quantities.map { it.code }.toSortedSet().joinToString(",")), wrap(apparent), wrap(if (extraPrecision) "YES" else "NO"), ) @@ -55,7 +54,7 @@ class HorizonsService( absoluteMagnitude: String? = null, longitude: Angle, latitude: Angle, elevation: Distance = 0.0, startTime: LocalDateTime, endTime: LocalDateTime = startTime.plusDays(1L), - stepSize: Duration = DEFAULT_STEP_SIZE, + stepSizeInMinutes: Int = 1, apparent: ApparentRefractionCorrection = ApparentRefractionCorrection.AIRLESS, extraPrecision: Boolean = false, vararg quantities: HorizonsQuantity = HorizonsQuantity.ENTRIES, @@ -65,7 +64,7 @@ class HorizonsService( wrap(argumentOfPerihelion), wrap(inclination), wrapNull(meanAnomaly), wrapNull(semiMajorAxis), wrapNull(meanMotion), wrapNull(absoluteMagnitude), wrap("${longitude.toDegrees},${latitude.toDegrees},${elevation.toKilometers}"), - wrap(startTime), wrap(endTime), wrap("${stepSize.toMinutes()}m"), + wrap(startTime), wrap(endTime), wrap("${stepSizeInMinutes}m"), wrap(quantities.map { it.code }.toSortedSet().joinToString(",")), wrap(apparent), wrap(if (extraPrecision) "YES" else "NO"), ) @@ -74,13 +73,13 @@ class HorizonsService( tle: String, longitude: Angle, latitude: Angle, elevation: Distance = 0.0, startTime: LocalDateTime, endTime: LocalDateTime = startTime.plusDays(1L), - stepSize: Duration = DEFAULT_STEP_SIZE, + stepSizeInMinutes: Int = 1, apparent: ApparentRefractionCorrection = ApparentRefractionCorrection.AIRLESS, extraPrecision: Boolean = false, vararg quantities: HorizonsQuantity = HorizonsQuantity.ENTRIES, ) = service.observerWithTLE( wrap(tle), wrap("${longitude.toDegrees},${latitude.toDegrees},${elevation.toKilometers}"), - wrap(startTime), wrap(endTime), wrap("${stepSize.toMinutes()}m"), + wrap(startTime), wrap(endTime), wrap("${stepSizeInMinutes}m"), wrap(quantities.map { it.code }.toSortedSet().joinToString(",")), wrap(apparent), wrap(if (extraPrecision) "YES" else "NO"), ) @@ -113,7 +112,6 @@ class HorizonsService( const val URL = "https://ssd.jpl.nasa.gov/api/" @JvmStatic private val DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") - @JvmStatic private val DEFAULT_STEP_SIZE = Duration.ofMinutes(1L) @Suppress("NOTHING_TO_INLINE") private inline fun wrapNull(o: Any?) = if (o == null) null else "'$o'" diff --git a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/gps/GPS.kt b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/gps/GPS.kt index 4d2deb814..73ef022bd 100644 --- a/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/gps/GPS.kt +++ b/nebulosa-indi-device/src/main/kotlin/nebulosa/indi/device/gps/GPS.kt @@ -1,24 +1,15 @@ package nebulosa.indi.device.gps import nebulosa.indi.device.Device -import nebulosa.math.Angle -import nebulosa.math.Distance +import nebulosa.nova.position.GeographicCoordinate +import nebulosa.time.TimeStampedWithOffset import java.time.LocalDateTime -import java.time.OffsetDateTime import java.time.format.DateTimeFormatter -interface GPS : Device { +interface GPS : GeographicCoordinate, TimeStampedWithOffset, Device { val hasGPS: Boolean - val longitude: Angle - - val latitude: Angle - - val elevation: Distance - - val dateTime: OffsetDateTime - companion object { @JvmStatic val UTC_TIME_FORMAT_1 = DateTimeFormatter.ofPattern("yyyy/MM/dd'T'HH:mm:ss")!! diff --git a/nebulosa-math/src/main/kotlin/nebulosa/math/Vector3D.kt b/nebulosa-math/src/main/kotlin/nebulosa/math/Vector3D.kt index 4b47df852..fb7865c96 100644 --- a/nebulosa-math/src/main/kotlin/nebulosa/math/Vector3D.kt +++ b/nebulosa-math/src/main/kotlin/nebulosa/math/Vector3D.kt @@ -70,8 +70,9 @@ open class Vector3D protected constructor(@PublishedApi @JvmField internal val v * Computes the angle between this vector and [vector]. */ fun angle(coordinate: Vector3D): Angle { - // val a = this * vector.length - // val b = vector * length + // https://people.eecs.berkeley.edu/~wkahan/Mindless.pdf + // val a = this * coordinate.length + // val b = coordinate * length // return (2.0 * atan2((a - b).length, (a + b).length)).rad val dot = dot(coordinate) diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Barycentric.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Barycentric.kt index a7f6a66ad..2415a5e65 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Barycentric.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Barycentric.kt @@ -1,9 +1,9 @@ package nebulosa.nova.position +import nebulosa.constants.PI import nebulosa.constants.TAU import nebulosa.math.Angle import nebulosa.math.Vector3D -import nebulosa.math.normalized import nebulosa.nova.astrometry.Body import nebulosa.nova.astrometry.Observable import nebulosa.nova.frame.Ecliptic @@ -56,13 +56,15 @@ class Barycentric internal constructor( * longitudes of [target] object and [center], viewed from this position, * constrained to the interval 0-1. * - * For Moon as [target] viewed from Earth, it represents the Moon phase, - * where 0 is New Moon and 0.5 is Full Moon. + * For Moon as [target], Sun as [center] and viewed from Earth, it represents the Moon phase, + * where 0 is New Moon and PI is Full Moon. ??? */ - fun elongation(target: Body, center: Body): Double { - val mLon = observe(target).latLon(Ecliptic).theta - val sLon = observe(center).latLon(Ecliptic).phi - val angle = (mLon - sLon).normalized - return angle / TAU + fun elongation(target: Body, center: Body): Pair { + val cobs = observe(center) + val tobs = observe(target) + val clon = cobs.latLon(Ecliptic).theta + val tlon = tobs.latLon(Ecliptic).theta + val isEast = (tlon - clon) % TAU < PI + return cobs.separationFrom(tobs) to isEast } } diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Geoid.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Geoid.kt index 81769b095..96abf578f 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Geoid.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/Geoid.kt @@ -47,6 +47,13 @@ data class Geoid( return GeographicPosition(longitude, latitude, elevation, itrs, this) } + /** + * Returns the geographic position of a given [coordinate]. + */ + fun lonLat(coordinate: GeographicCoordinate): GeographicPosition { + return lonLat(coordinate.longitude, coordinate.latitude, coordinate.elevation) + } + /** * Return Earth latitude and longitude beneath a celestial [position]. * diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/ICRF.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/ICRF.kt index b0f456ef9..093948fea 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/ICRF.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/position/ICRF.kt @@ -1,5 +1,6 @@ package nebulosa.nova.position +import nebulosa.constants.AU_M import nebulosa.constants.DAYSEC import nebulosa.constants.SPEED_OF_LIGHT import nebulosa.erfa.CartesianCoordinate @@ -66,7 +67,7 @@ open class ICRF protected constructor( * Length of this vector in days of light travel time. */ inline val lightTime - get() = position.length * (1000.0 / (SPEED_OF_LIGHT * DAYSEC)) + get() = position.length * (AU_M / SPEED_OF_LIGHT / DAYSEC) /** * Computes the equatorial (RA, declination, distance) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TimeStampedWithOffset.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeStampedWithOffset.kt new file mode 100644 index 000000000..5e9a3e67f --- /dev/null +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeStampedWithOffset.kt @@ -0,0 +1,11 @@ +package nebulosa.time + +import java.time.OffsetDateTime + +interface TimeStampedWithOffset : TimeZonedInSeconds { + + val dateTime: OffsetDateTime + + override val offsetInSeconds + get() = dateTime.offset.totalSeconds +} diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TimeZonedInSeconds.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeZonedInSeconds.kt new file mode 100644 index 000000000..7cad68279 --- /dev/null +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeZonedInSeconds.kt @@ -0,0 +1,6 @@ +package nebulosa.time + +interface TimeZonedInSeconds { + + val offsetInSeconds: Int +} From 1b56f780a61521e2b2145181c9bc3ac55ce7be6e Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 28 Jun 2024 18:19:16 -0300 Subject: [PATCH 18/29] [api]: Use data object --- .../kotlin/nebulosa/common/concurrency/DaemonThreadFactory.kt | 2 +- .../src/main/kotlin/nebulosa/curve/fitting/RSquared.kt | 2 +- .../kotlin/nebulosa/curve/fitting/ZeroUnivariateFunction.kt | 2 +- .../src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt | 2 +- .../src/main/kotlin/nebulosa/nova/astrometry/ELPMPP02.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/B1950.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Ecliptic.kt | 2 +- .../src/main/kotlin/nebulosa/nova/frame/EclipticB1950.kt | 2 +- .../src/main/kotlin/nebulosa/nova/frame/EclipticJ2000.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK4.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK5.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Galactic.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ICRS.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ITRS.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/J2000.kt | 2 +- nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Marsiau.kt | 2 +- .../src/main/kotlin/nebulosa/nova/frame/Supergalactic.kt | 2 +- .../kotlin/nebulosa/nova/frame/TrueEquatorAndEquinoxOfDate.kt | 2 +- .../src/main/kotlin/nebulosa/retrofit/ByteArrayConverter.kt | 2 +- .../kotlin/nebulosa/retrofit/RawAsByteArrayConverterFactory.kt | 2 +- .../kotlin/nebulosa/retrofit/RawAsStringConverterFactory.kt | 2 +- .../src/main/kotlin/nebulosa/retrofit/StringConverter.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/CurrentTime.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/DeltaT.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/IcrsToJ2000.kt | 2 +- .../kotlin/nebulosa/time/ParabolaOfStephensonMorrison2004.kt | 2 +- .../nebulosa/time/ParabolaOfStephensonMorrisonHohenkerk2016.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/S15.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/TAIMinusUTC.kt | 2 +- nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTT.kt | 2 +- .../nebulosa/time/TDBMinusTTByFairheadAndBretagnon1990.kt | 2 +- .../kotlin/nebulosa/watney/platesolver/quad/SkySegmentSphere.kt | 2 +- .../nebulosa/watney/stardetector/DefaultStarDetectionFilter.kt | 2 +- .../main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt | 2 +- .../src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/nebulosa-common/src/main/kotlin/nebulosa/common/concurrency/DaemonThreadFactory.kt b/nebulosa-common/src/main/kotlin/nebulosa/common/concurrency/DaemonThreadFactory.kt index 7f13cf001..d7350485d 100644 --- a/nebulosa-common/src/main/kotlin/nebulosa/common/concurrency/DaemonThreadFactory.kt +++ b/nebulosa-common/src/main/kotlin/nebulosa/common/concurrency/DaemonThreadFactory.kt @@ -2,7 +2,7 @@ package nebulosa.common.concurrency import java.util.concurrent.ThreadFactory -object DaemonThreadFactory : ThreadFactory { +data object DaemonThreadFactory : ThreadFactory { override fun newThread(task: Runnable): Thread { val thread = Thread(task) diff --git a/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/RSquared.kt b/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/RSquared.kt index e1c946694..1e7202b60 100644 --- a/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/RSquared.kt +++ b/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/RSquared.kt @@ -4,7 +4,7 @@ import nebulosa.math.squared import org.apache.commons.math3.analysis.UnivariateFunction import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics -object RSquared { +data object RSquared { @JvmStatic fun calculate(points: Collection, function: UnivariateFunction): Double { diff --git a/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/ZeroUnivariateFunction.kt b/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/ZeroUnivariateFunction.kt index 7b3ab106f..80da90071 100644 --- a/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/ZeroUnivariateFunction.kt +++ b/nebulosa-curve-fitting/src/main/kotlin/nebulosa/curve/fitting/ZeroUnivariateFunction.kt @@ -2,7 +2,7 @@ package nebulosa.curve.fitting import org.apache.commons.math3.analysis.UnivariateFunction -object ZeroUnivariateFunction : UnivariateFunction { +data object ZeroUnivariateFunction : UnivariateFunction { override fun value(x: Double) = 0.0 } diff --git a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt index 4ec34e436..b74ff1705 100644 --- a/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt +++ b/nebulosa-fits/src/main/kotlin/nebulosa/fits/FitsHeaderCardFormatter.kt @@ -4,7 +4,7 @@ import nebulosa.image.format.HeaderCard import java.util.* import kotlin.math.min -object FitsHeaderCardFormatter { +data object FitsHeaderCardFormatter { fun format(card: HeaderCard): String { return with(StringBuilder(FitsHeaderCard.FITS_HEADER_CARD_SIZE)) { diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/ELPMPP02.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/ELPMPP02.kt index 6487f5867..c22b706d5 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/ELPMPP02.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/astrometry/ELPMPP02.kt @@ -18,7 +18,7 @@ import kotlin.math.sqrt * @see Fortran * @see C++ */ -object ELPMPP02 : Body { +data object ELPMPP02 : Body { private val main = Array(3) { readMainProblemFile(it + 1) } private val pert = Array(3) { readPertubationFile(it + 1) } diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/B1950.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/B1950.kt index 8c5e11a8c..38e60af5a 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/B1950.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/B1950.kt @@ -4,7 +4,7 @@ package nebulosa.nova.frame * Reference frame of the Earth’s mean equator and equinox at B1950. */ @Suppress("FloatingPointLiteralPrecision") -object B1950 : InertialFrame( +data object B1950 : InertialFrame( 0.99992570795236291, 0.011178938126427691, 0.0048590038414544293, -0.011178938137770135, 0.9999375133499887, -2.715792625851078E-05, -0.0048590038153592712, -2.7162594714247048E-05, 0.9999881946023742, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Ecliptic.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Ecliptic.kt index 9c890965c..164483726 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Ecliptic.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Ecliptic.kt @@ -3,7 +3,7 @@ package nebulosa.nova.frame import nebulosa.math.Matrix3D import nebulosa.time.InstantOfTime -object Ecliptic : Frame { +data object Ecliptic : Frame { override fun rotationAt(time: InstantOfTime) = Matrix3D.rotX(-time.trueObliquity) * time.m } diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticB1950.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticB1950.kt index bbafc63ab..4a265ec63 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticB1950.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticB1950.kt @@ -4,7 +4,7 @@ package nebulosa.nova.frame * Ecliptic coordinates based upon the [B1950] frame. */ @Suppress("FloatingPointLiteralPrecision") -object EclipticB1950 : InertialFrame( +data object EclipticB1950 : InertialFrame( 0.99992570795236291, 0.011178938126427691, 0.0048590038414544293, -0.012189277138214926, 0.91736881787898283, 0.39785157220522011, -9.9405009203520217E-06, -0.3978812427417045, 0.91743692784599817, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticJ2000.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticJ2000.kt index 428ec2860..818a29993 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticJ2000.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/EclipticJ2000.kt @@ -7,7 +7,7 @@ package nebulosa.nova.frame * M = {1.0, 0.0, 0.0, 0.0, cos(ecliptic), sin(ecliptic), 0.0, -sin(ecliptic), cos(ecliptic)} */ @Suppress("FloatingPointLiteralPrecision") -object EclipticJ2000 : InertialFrame( +data object EclipticJ2000 : InertialFrame( 1.0, 0.0, 0.0, 0.0, 0.917482137086962521575615807374, 0.397776982901650696710316869067, 0.0, -0.397776982901650696710316869067, 0.917482137086962521575615807374, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK4.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK4.kt index 3cc459319..b34703bcc 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK4.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK4.kt @@ -7,7 +7,7 @@ package nebulosa.nova.frame * Fricke. */ @Suppress("FloatingPointLiteralPrecision") -object FK4 : InertialFrame( +data object FK4 : InertialFrame( 0.9999256809514446605, 0.0111813717563032290, 0.0048589607363144413, -0.0111813722062681620, 0.9999374861373183740, -0.0000270733285476070, -0.0048589597008613673, -0.0000272585320447865, 0.9999881948141177111, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK5.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK5.kt index 4b13539a5..bd82d3ec2 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK5.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/FK5.kt @@ -7,7 +7,7 @@ package nebulosa.nova.frame * the long-term Earth motion (precession). */ @Suppress("FloatingPointLiteralPrecision") -object FK5 : InertialFrame( +data object FK5 : InertialFrame( 0.9999999999999928638, -0.0000001110223329741, -0.0000000441180449810, 0.0000001110223372305, 0.9999999999999891831, 0.0000000964779225408, 0.0000000441180342698, -0.0000000964779274389, 0.9999999999999943728, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Galactic.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Galactic.kt index f05c48b33..73225fdb7 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Galactic.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Galactic.kt @@ -4,7 +4,7 @@ package nebulosa.nova.frame * Galactic System reference frame. */ @Suppress("FloatingPointLiteralPrecision") -object Galactic : InertialFrame( +data object Galactic : InertialFrame( -0.0548756577126196781, -0.8734370519557791298, -0.4838350736164183803, 0.4941094371971076412, -0.4448297212220537635, 0.7469821839845094133, -0.8676661375571625615, -0.1980763372750705946, 0.4559838136911523476, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ICRS.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ICRS.kt index 121a85d8c..8c287bfa2 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ICRS.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ICRS.kt @@ -10,4 +10,4 @@ import nebulosa.math.Matrix3D * precision of J2000 itself). The ICRS also supersedes older * equinox-based systems like B1900 and B1950. */ -object ICRS : InertialFrame(Matrix3D(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)) +data object ICRS : InertialFrame(Matrix3D(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)) diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ITRS.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ITRS.kt index 885cd6ad8..720a460ca 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ITRS.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/ITRS.kt @@ -16,7 +16,7 @@ import nebulosa.time.InstantOfTime * respect to the stars, and the polar wobble of the crust with respect * to the Earth’s pole of rotation. */ -object ITRS : Frame { +data object ITRS : Frame { @JvmStatic private val EARTH_ANGULAR_VELOCITY_MATRIX = Matrix3D( 0.0, DAYSEC * ANGULAR_VELOCITY, 0.0, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/J2000.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/J2000.kt index 93d2b4608..b26f1b731 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/J2000.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/J2000.kt @@ -5,4 +5,4 @@ import nebulosa.math.Matrix3D /** * Earth mean equator, dynamical equinox of J2000. */ -object J2000 : InertialFrame(Matrix3D(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)) +data object J2000 : InertialFrame(Matrix3D(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)) diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Marsiau.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Marsiau.kt index 1d7f496cc..6c8bc9d76 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Marsiau.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Marsiau.kt @@ -10,7 +10,7 @@ package nebulosa.nova.frame * mean north with Mars mean north. */ @Suppress("FloatingPointLiteralPrecision") -object Marsiau : InertialFrame( +data object Marsiau : InertialFrame( 0.67325774746002498, 0.73940787491414595, -3.6947768825436786E-17, -0.58963083782625325, 0.53688031082163401, 0.60340285625473833, 0.44616082366044196, -0.40624564781301037, 0.79743651350036859, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Supergalactic.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Supergalactic.kt index e5724cf5e..8622992d8 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Supergalactic.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/Supergalactic.kt @@ -4,7 +4,7 @@ package nebulosa.nova.frame * Supergalactic System reference frame. */ @Suppress("FloatingPointLiteralPrecision") -object Supergalactic : InertialFrame( +data object Supergalactic : InertialFrame( 0.3750155557060191496, 0.3413588718572082374, 0.8618801851666388868, -0.8983204377254853439, -0.0957271002509969235, 0.4287851600069993011, 0.2288749093788964371, -0.9350456902643365859, 0.2707504994914917474, diff --git a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/TrueEquatorAndEquinoxOfDate.kt b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/TrueEquatorAndEquinoxOfDate.kt index 02f981013..185ac9167 100644 --- a/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/TrueEquatorAndEquinoxOfDate.kt +++ b/nebulosa-nova/src/main/kotlin/nebulosa/nova/frame/TrueEquatorAndEquinoxOfDate.kt @@ -16,7 +16,7 @@ import nebulosa.time.InstantOfTime * J2000 systems to produce right ascension and declination for a given * date relative to the Earth’s axis and equator of rotation. */ -object TrueEquatorAndEquinoxOfDate : Frame { +data object TrueEquatorAndEquinoxOfDate : Frame { override fun rotationAt(time: InstantOfTime) = time.m } diff --git a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/ByteArrayConverter.kt b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/ByteArrayConverter.kt index 751697c94..f64120783 100644 --- a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/ByteArrayConverter.kt +++ b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/ByteArrayConverter.kt @@ -3,7 +3,7 @@ package nebulosa.retrofit import okhttp3.ResponseBody import retrofit2.Converter -object ByteArrayConverter : Converter { +data object ByteArrayConverter : Converter { override fun convert(value: ResponseBody) = value.bytes() } diff --git a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsByteArrayConverterFactory.kt b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsByteArrayConverterFactory.kt index 51c5dfa4a..1d16c2090 100644 --- a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsByteArrayConverterFactory.kt +++ b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsByteArrayConverterFactory.kt @@ -4,7 +4,7 @@ import retrofit2.Converter import retrofit2.Retrofit import java.lang.reflect.Type -object RawAsByteArrayConverterFactory : Converter.Factory() { +data object RawAsByteArrayConverterFactory : Converter.Factory() { override fun responseBodyConverter( type: Type, diff --git a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsStringConverterFactory.kt b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsStringConverterFactory.kt index da63a8757..4bf9b89a6 100644 --- a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsStringConverterFactory.kt +++ b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/RawAsStringConverterFactory.kt @@ -4,7 +4,7 @@ import retrofit2.Converter import retrofit2.Retrofit import java.lang.reflect.Type -object RawAsStringConverterFactory : Converter.Factory() { +data object RawAsStringConverterFactory : Converter.Factory() { override fun responseBodyConverter( type: Type, diff --git a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/StringConverter.kt b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/StringConverter.kt index af79689cd..0854402ac 100644 --- a/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/StringConverter.kt +++ b/nebulosa-retrofit/src/main/kotlin/nebulosa/retrofit/StringConverter.kt @@ -3,7 +3,7 @@ package nebulosa.retrofit import okhttp3.ResponseBody import retrofit2.Converter -object StringConverter : Converter { +data object StringConverter : Converter { override fun convert(value: ResponseBody) = value.string() } diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/CurrentTime.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/CurrentTime.kt index 42e9ee11a..68514ddcd 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/CurrentTime.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/CurrentTime.kt @@ -2,7 +2,7 @@ package nebulosa.time import nebulosa.common.time.Stopwatch -object CurrentTime : InstantOfTime() { +data object CurrentTime : InstantOfTime() { @JvmField @Volatile var ELAPSED_INTERVAL = 5L diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/DeltaT.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/DeltaT.kt index 42c42c9fd..c8aa4b6ef 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/DeltaT.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/DeltaT.kt @@ -6,7 +6,7 @@ import nebulosa.io.readDoubleArrayLe import nebulosa.math.interpolation import kotlin.math.min -object DeltaT : TimeDelta { +data object DeltaT : TimeDelta { private val DAILY_TT = bufferedResource("DAILY_TT.dat") { readDoubleArrayLe(readLongLe().toInt()) } private val DAILY_DELTA_T = bufferedResource("DAILY_DELTA_T.dat") { readDoubleArrayLe(readLongLe().toInt()) } diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/IcrsToJ2000.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/IcrsToJ2000.kt index e95672660..14292c42f 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/IcrsToJ2000.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/IcrsToJ2000.kt @@ -20,4 +20,4 @@ private const val A00 = 1.0 - 0.5 * (A10 * A10 + A20 * A20) private const val A11 = 1.0 - 0.5 * (A10 * A10 + A21 * A21) private const val A22 = 1.0 - 0.5 * (A21 * A21 + A20 * A20) -object IcrsToJ2000 : Matrix3D(A00, A01, A02, A10, A11, A12, A20, A21, A22) +data object IcrsToJ2000 : Matrix3D(A00, A01, A02, A10, A11, A12, A20, A21, A22) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrison2004.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrison2004.kt index 6fced4c0b..d87237791 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrison2004.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrison2004.kt @@ -1,3 +1,3 @@ package nebulosa.time -object ParabolaOfStephensonMorrison2004 : Spline by SingleSpline(doubleArrayOf(1820.0, 1920.0, 0.0, 32.0, 0.0, -20.0)) +data object ParabolaOfStephensonMorrison2004 : Spline by SingleSpline(doubleArrayOf(1820.0, 1920.0, 0.0, 32.0, 0.0, -20.0)) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrisonHohenkerk2016.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrisonHohenkerk2016.kt index 08f4b3e0d..55335a518 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrisonHohenkerk2016.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/ParabolaOfStephensonMorrisonHohenkerk2016.kt @@ -1,3 +1,3 @@ package nebulosa.time -object ParabolaOfStephensonMorrisonHohenkerk2016 : Spline by SingleSpline(doubleArrayOf(1825.0, 1925.0, 0.0, 32.5, 0.0, -320.0)) +data object ParabolaOfStephensonMorrisonHohenkerk2016 : Spline by SingleSpline(doubleArrayOf(1825.0, 1925.0, 0.0, 32.5, 0.0, -320.0)) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/S15.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/S15.kt index d19ee8ef2..8d1a174f5 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/S15.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/S15.kt @@ -9,4 +9,4 @@ import nebulosa.io.readDoubleArrayLe * @see PDF Documentation * @see Download */ -object S15 : Spline by MultiSpline(bufferedResource("S15.dat") { (0..5).map { readDoubleArrayLe(58) } }) +data object S15 : Spline by MultiSpline(bufferedResource("S15.dat") { (0..5).map { readDoubleArrayLe(58) } }) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TAIMinusUTC.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TAIMinusUTC.kt index 1c841dcb6..da7d151ef 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/TAIMinusUTC.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TAIMinusUTC.kt @@ -3,7 +3,7 @@ package nebulosa.time import nebulosa.erfa.eraDat import nebulosa.erfa.eraJd2Cal -object TAIMinusUTC : TimeDelta { +data object TAIMinusUTC : TimeDelta { override fun delta(time: InstantOfTime): Double { return eraDat(eraJd2Cal(time.whole, time.fraction)) diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTT.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTT.kt index b3d82c764..ed0ba0c30 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTT.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTT.kt @@ -4,7 +4,7 @@ import nebulosa.constants.DAYSEC import nebulosa.constants.TTMINUSTAI import nebulosa.erfa.eraDtDb -object TDBMinusTT : TimeDelta { +data object TDBMinusTT : TimeDelta { /** * Computes TDB - TT in seconds at [time]. diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTTByFairheadAndBretagnon1990.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTTByFairheadAndBretagnon1990.kt index 76f586e57..dbf1d5bef 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTTByFairheadAndBretagnon1990.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TDBMinusTTByFairheadAndBretagnon1990.kt @@ -6,7 +6,7 @@ import kotlin.math.sin /** * TDB - TT by Fairhead & Bretagnon, 1990. */ -object TDBMinusTTByFairheadAndBretagnon1990 : TimeDelta { +data object TDBMinusTTByFairheadAndBretagnon1990 : TimeDelta { /** * Computes TDB - TT in seconds at [time]. diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/platesolver/quad/SkySegmentSphere.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/platesolver/quad/SkySegmentSphere.kt index 10e42d6d5..9d3e37322 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/platesolver/quad/SkySegmentSphere.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/platesolver/quad/SkySegmentSphere.kt @@ -5,7 +5,7 @@ import nebulosa.math.Angle import nebulosa.math.deg import kotlin.math.abs -object SkySegmentSphere : Collection { +data object SkySegmentSphere : Collection { data class Cell(val bounds: CoordinateBounds, val bandIndex: Int, val cellIndex: Int) { diff --git a/nebulosa-watney/src/main/kotlin/nebulosa/watney/stardetector/DefaultStarDetectionFilter.kt b/nebulosa-watney/src/main/kotlin/nebulosa/watney/stardetector/DefaultStarDetectionFilter.kt index cc1e70ae2..c9ab79f1b 100644 --- a/nebulosa-watney/src/main/kotlin/nebulosa/watney/stardetector/DefaultStarDetectionFilter.kt +++ b/nebulosa-watney/src/main/kotlin/nebulosa/watney/stardetector/DefaultStarDetectionFilter.kt @@ -5,7 +5,7 @@ import nebulosa.constants.TAU import nebulosa.image.Image import kotlin.math.max -object DefaultStarDetectionFilter : StarDetectionFilter { +data object DefaultStarDetectionFilter : StarDetectionFilter { override fun filter(bins: MutableList, image: Image) { val binIter = bins.iterator() diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt index b63fac4c9..4592e2d62 100644 --- a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/AstronomicalImageProperties.kt @@ -3,7 +3,7 @@ package nebulosa.xisf import nebulosa.fits.FitsHeaderKey import nebulosa.fits.FitsKeyword -object AstronomicalImageProperties : Map by mapOf( +data object AstronomicalImageProperties : Map by mapOf( "Observer:EmailAddress" to null, "Observer:Name" to null, "Observer:PostalAddress" to null, diff --git a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt index d0bc53e7b..086e85c4c 100644 --- a/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt +++ b/nebulosa-xisf/src/main/kotlin/nebulosa/xisf/CompressionByteShuffler.kt @@ -6,7 +6,7 @@ package nebulosa.xisf * compression ratios by increasing data locality, i.e. by redistributing the * sequence such that similar byte values tend to be placed close together. */ -object CompressionByteShuffler { +data object CompressionByteShuffler { fun shuffle(input: ByteArray, output: ByteArray, itemSize: Int) { val size = input.size From 21cead311c79a627ab1b86e4a4b6c948c9c222a7 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Fri, 28 Jun 2024 21:39:18 -0300 Subject: [PATCH 19/29] [api][desktop]: Fixes --- .../atlas/ephemeris/BodyEphemerisProvider.kt | 7 +-- desktop/app/window.manager.ts | 7 +-- desktop/src/app/atlas/atlas.component.html | 53 +++++++++++++++---- desktop/src/styles.scss | 9 +++- .../src/test/kotlin/HorizonsServiceTest.kt | 10 ++-- 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt index 3510dbb7e..fdd38e17d 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt @@ -13,6 +13,7 @@ import nebulosa.nova.position.Barycentric import nebulosa.nova.position.GeographicPosition import nebulosa.time.TimeYMDHMS import nebulosa.time.UTC +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor import org.springframework.stereotype.Service import java.time.LocalDateTime import java.time.temporal.ChronoUnit @@ -21,7 +22,7 @@ import java.util.concurrent.CompletableFuture import kotlin.system.measureTimeMillis @Service -class BodyEphemerisProvider : CachedEphemerisProvider() { +class BodyEphemerisProvider(private val threadPoolTaskExecutor: ThreadPoolTaskExecutor) : CachedEphemerisProvider() { private val timeBucket = HashMap() private val cachedBodies = HashMap() @@ -47,7 +48,7 @@ class BodyEphemerisProvider : CachedEphemerisProvider() { val tasks = ArrayList>(numberOfTasks) repeat(numberOfTasks) { - CompletableFuture.runAsync { + CompletableFuture.runAsync({ while (true) { val element = synchronized(elementQueue) { elementQueue.removeFirstOrNull() @@ -77,7 +78,7 @@ class BodyEphemerisProvider : CachedEphemerisProvider() { val (elongation, east) = if (target === VSOP87E.SUN) SUN_ELONGATION else barycentric.elongation(target, VSOP87E.SUN) element[HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE] = "${elongation.toDegrees},/${if (east) 'L' else 'T'}" } - }.also(tasks::add) + }, threadPoolTaskExecutor).also(tasks::add) } val elapsedTime = measureTimeMillis { tasks.forEach { it.get() } } diff --git a/desktop/app/window.manager.ts b/desktop/app/window.manager.ts index 2129a4bbe..f4ca91d9a 100644 --- a/desktop/app/window.manager.ts +++ b/desktop/app/window.manager.ts @@ -108,8 +108,9 @@ export class WindowManager { const screenSize = screen.getPrimaryDisplay().workAreaSize const storedData = this.storage.get(`window.${open.id}`) - const width = preference.resizable ? Math.max(minWidth, Math.min(storedData?.width ?? computedWidth, screenSize.width)) : computedWidth - const height = preference.resizable ? Math.max(minHeight, Math.min(storedData?.height ?? computedHeight, screenSize.height)) : computedHeight + const resizable = preference.resizable + const width = resizable ? Math.max(minWidth, Math.min(storedData?.width ?? computedWidth, screenSize.width)) : computedWidth + const height = resizable ? Math.max(minHeight, Math.min(storedData?.height ?? computedHeight, screenSize.height)) : computedHeight const x = Math.max(0, Math.min(storedData?.x ?? 0, screenSize.width - width)) const y = Math.max(0, Math.min(storedData?.y ?? 0, screenSize.height - height)) @@ -124,7 +125,7 @@ export class WindowManager { minHeight, x, y, - resizable: this.args.serve || preference.resizable, + resizable: this.args.serve || resizable, autoHideMenuBar: true, icon: preference.icon ? join(__dirname, this.args.serve ? `../src/assets/icons/${preference.icon}.png` : `assets/icons/${preference.icon}.png`) : this.appIcon, webPreferences: { diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 7842239c7..242540871 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -16,13 +16,13 @@
SDO/HMI @@ -103,7 +103,7 @@ -
+
-
+
-
-
+
+
@@ -539,6 +559,18 @@
+
+ + Ephemeris provided by + + JPL Horizons + + +
- + {{ name ?? '' }} + [value]="tag.title" + styleClass="white-space-nowrap" />
@@ -786,7 +821,7 @@
diff --git a/desktop/src/styles.scss b/desktop/src/styles.scss index c63410d7c..dc9a8fb43 100644 --- a/desktop/src/styles.scss +++ b/desktop/src/styles.scss @@ -15,8 +15,13 @@ body { font-family: 'Roboto'; } +a:any-link { + color: var(--blue-400); +} + .p-checkbox-box { aspect-ratio: 1; + min-width: fit-content; } .invisible { @@ -40,7 +45,7 @@ p-table { display: inline-flex; justify-content: center; align-items: center; - aspect-ratio: auto 1/1; + aspect-ratio: 1; } .mdi.mdi-sm:before { @@ -180,7 +185,7 @@ p-calendar.border-0 .p-calendar-w-btn { } i.mdi { - aspect-ratio: 1/1; + aspect-ratio: 1; display: inline-flex; } diff --git a/nebulosa-horizons/src/test/kotlin/HorizonsServiceTest.kt b/nebulosa-horizons/src/test/kotlin/HorizonsServiceTest.kt index 5c0b476e2..836dae134 100644 --- a/nebulosa-horizons/src/test/kotlin/HorizonsServiceTest.kt +++ b/nebulosa-horizons/src/test/kotlin/HorizonsServiceTest.kt @@ -19,7 +19,6 @@ import nebulosa.nasa.spk.Spk import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import okio.ByteString.Companion.decodeBase64 -import java.time.Duration import java.time.LocalDateTime import java.util.concurrent.TimeUnit @@ -44,9 +43,7 @@ class HorizonsServiceTest : StringSpec() { 138.73119026648095.deg, 35.36276754848444.deg, 3776.m, startDate, startDate.plusDays(1L), extraPrecision = true, - ).execute() - .body() - .shouldNotBeNull() + ).execute().body().shouldNotBeNull() .also { it.shouldNotBeEmpty() } "spk" { @@ -106,9 +103,8 @@ class HorizonsServiceTest : StringSpec() { startTime = LocalDateTime.of(2023, 3, 11, 0, 0, 0), endTime = LocalDateTime.of(2023, 4, 11, 0, 0, 0), extraPrecision = true, - stepSize = Duration.ofDays(1L), - ).execute() - .body().shouldNotBeNull() + stepSizeInMinutes = 1, + ).execute().body().shouldNotBeNull() ephemeris.shouldNotBeEmpty() From 6faffbd7dfe6e6cf917f53d6847dbb3c7a77014f Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 10:51:26 -0300 Subject: [PATCH 20/29] [api]: Minor improvements --- .../atlas/ephemeris/BodyEphemerisProvider.kt | 4 +-- .../nebulosa/api/mounts/ComputedLocation.kt | 2 +- .../nebulosa/api/mounts/MountController.kt | 12 +++---- .../main/kotlin/nebulosa/time/TimeYMDHMS.kt | 32 +++++++++++++++++-- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt index fdd38e17d..615730ffe 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/ephemeris/BodyEphemerisProvider.kt @@ -48,7 +48,7 @@ class BodyEphemerisProvider(private val threadPoolTaskExecutor: ThreadPoolTaskEx val tasks = ArrayList>(numberOfTasks) repeat(numberOfTasks) { - CompletableFuture.runAsync({ + threadPoolTaskExecutor.submitCompletable { while (true) { val element = synchronized(elementQueue) { elementQueue.removeFirstOrNull() @@ -78,7 +78,7 @@ class BodyEphemerisProvider(private val threadPoolTaskExecutor: ThreadPoolTaskEx val (elongation, east) = if (target === VSOP87E.SUN) SUN_ELONGATION else barycentric.elongation(target, VSOP87E.SUN) element[HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE] = "${elongation.toDegrees},/${if (east) 'L' else 'T'}" } - }, threadPoolTaskExecutor).also(tasks::add) + }.also(tasks::add) } val elapsedTime = measureTimeMillis { tasks.forEach { it.get() } } diff --git a/api/src/main/kotlin/nebulosa/api/mounts/ComputedLocation.kt b/api/src/main/kotlin/nebulosa/api/mounts/ComputedLocation.kt index 00aee40f0..f825170f9 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/ComputedLocation.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/ComputedLocation.kt @@ -18,7 +18,7 @@ data class ComputedLocation( @field:JsonSerialize(using = DeclinationSerializer::class) var declinationJ2000: Angle = 0.0, @field:JsonSerialize(using = AzimuthSerializer::class) var azimuth: Angle = 0.0, @field:JsonSerialize(using = DeclinationSerializer::class) var altitude: Angle = 0.0, - var constellation: Constellation? = null, + var constellation: Constellation = Constellation.AND, @field:JsonSerialize(using = LSTSerializer::class) var lst: Angle = 0.0, @field:JsonFormat(pattern = "HH:mm") var meridianAt: LocalDateTime = LocalDateTime.MIN, @field:JsonSerialize(using = LSTSerializer::class) var timeLeftToMeridianFlip: Angle = 0.0, diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt index c554b5e6f..da3b115e4 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountController.kt @@ -4,11 +4,13 @@ import jakarta.validation.Valid import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.Positive import jakarta.validation.constraints.PositiveOrZero +import nebulosa.api.beans.converters.angle.AngleParam import nebulosa.api.beans.converters.time.DateAndTimeParam import nebulosa.api.connection.ConnectionService import nebulosa.guiding.GuideDirection import nebulosa.indi.device.mount.Mount import nebulosa.indi.device.mount.TrackMode +import nebulosa.math.Angle import nebulosa.math.deg import nebulosa.math.hours import nebulosa.math.m @@ -166,17 +168,13 @@ class MountController( @GetMapping("{mount}/location") fun location( mount: Mount, - @RequestParam rightAscension: String, @RequestParam declination: String, + @AngleParam(isHours = true) rightAscension: Angle, + @AngleParam declination: Angle, @RequestParam(required = false, defaultValue = "false") j2000: Boolean, @RequestParam(required = false, defaultValue = "true") equatorial: Boolean, @RequestParam(required = false, defaultValue = "true") horizontal: Boolean, @RequestParam(required = false, defaultValue = "true") meridianAt: Boolean, - ): ComputedLocation { - return mountService.computeLocation( - mount, rightAscension.hours, declination.deg, - j2000, equatorial, horizontal, meridianAt, - ) - } + ) = mountService.computeLocation(mount, rightAscension, declination, j2000, equatorial, horizontal, meridianAt) @PutMapping("{mount}/point-here") fun pointMountHere( diff --git a/nebulosa-time/src/main/kotlin/nebulosa/time/TimeYMDHMS.kt b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeYMDHMS.kt index afea53afe..3ce19bb2c 100644 --- a/nebulosa-time/src/main/kotlin/nebulosa/time/TimeYMDHMS.kt +++ b/nebulosa-time/src/main/kotlin/nebulosa/time/TimeYMDHMS.kt @@ -19,11 +19,37 @@ class TimeYMDHMS( constructor(date: LocalDateTime) : this(date.year, date.monthValue, date.dayOfMonth, date.hour, date.minute, date.second + date.nano / 1E+9) - override fun toString(): String { - return "TimeYMDHMS(whole=$whole, fraction=$fraction, year=$year, month=$month, day=$day," + - " hour=$hour, minute=$minute, second=$second, cutoff=$cutoff)" + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is TimeYMDHMS) return false + if (!super.equals(other)) return false + + if (year != other.year) return false + if (month != other.month) return false + if (day != other.day) return false + if (hour != other.hour) return false + if (minute != other.minute) return false + if (second != other.second) return false + if (cutoff != other.cutoff) return false + + return true } + override fun hashCode(): Int { + var result = super.hashCode() + result = 31 * result + year + result = 31 * result + month + result = 31 * result + day + result = 31 * result + hour + result = 31 * result + minute + result = 31 * result + second.hashCode() + result = 31 * result + cutoff.hashCode() + return result + } + + override fun toString() = "TimeYMDHMS(whole=$whole, fraction=$fraction, year=$year, month=$month, day=$day," + + " hour=$hour, minute=$minute, second=$second, cutoff=$cutoff)" + companion object { /** From 904e2fc5bd4cbd90671501d230e9da84f2964acf Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 11:06:42 -0300 Subject: [PATCH 21/29] [desktop]: Remove fast option for Sky Atlas --- desktop/src/app/atlas/atlas.component.html | 5 ----- desktop/src/app/atlas/atlas.component.ts | 21 +++++++++------------ desktop/src/shared/types/atlas.types.ts | 1 - 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/desktop/src/app/atlas/atlas.component.html b/desktop/src/app/atlas/atlas.component.html index 242540871..2ebe2aed3 100644 --- a/desktop/src/app/atlas/atlas.component.html +++ b/desktop/src/app/atlas/atlas.component.html @@ -818,11 +818,6 @@ [style]="{ width: '70vw' }">
-
diff --git a/desktop/src/app/atlas/atlas.component.ts b/desktop/src/app/atlas/atlas.component.ts index 0c485c9ba..d7a4eff19 100644 --- a/desktop/src/app/atlas/atlas.component.ts +++ b/desktop/src/app/atlas/atlas.component.ts @@ -398,7 +398,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, readonly settings: SettingsDialog = { showDialog: false, - fast: false, } constructor( @@ -417,13 +416,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, app.topMenu.push({ icon: 'mdi mdi-cog', tooltip: 'Settings', + visible: false, command: () => { this.settings.showDialog = true }, }) app.topMenu.push({ icon: 'mdi mdi-calendar', - tooltip: 'Date & time', + tooltip: 'Date & Time', command: (e) => { this.calendarPanel.toggle(e.originalEvent) }, @@ -679,14 +679,14 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, this.name = 'Sun' this.tags = [] this.imageOfSun.nativeElement.src = `${this.api.baseUrl}/sky-atlas/sun/image` - const bodyPosition = await this.api.positionOfSun(this.dateTime, this.settings.fast) + const bodyPosition = await this.api.positionOfSun(this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } // Moon. else if (this.tab === SkyAtlasTab.MOON) { this.name = 'Moon' this.tags = [] - const bodyPosition = await this.api.positionOfMoon(this.dateTime, this.settings.fast) + const bodyPosition = await this.api.positionOfMoon(this.dateTime) Object.assign(this.bodyPosition, bodyPosition) this.moonIlluminated = this.bodyPosition.illuminated / 100.0 this.moonWaning = this.bodyPosition.leading @@ -697,7 +697,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.planet) { this.name = this.planet.name - const bodyPosition = await this.api.positionOfPlanet(this.planet.code, this.dateTime, this.settings.fast) + const bodyPosition = await this.api.positionOfPlanet(this.planet.code, this.dateTime) Object.assign(this.bodyPosition, bodyPosition) } else { this.name = undefined @@ -754,7 +754,7 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, if (this.refreshTabCount === 1 || refreshTwilight) { this.refreshingChart = true - const twilight = await this.api.twilight(this.dateTime, this.settings.fast) + const twilight = await this.api.twilight(this.dateTime) this.altitudeData.datasets[0].data = [ [0.0, 90], [twilight.civilDusk[0], 90], @@ -809,19 +809,19 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, try { // Sun. if (this.tab === SkyAtlasTab.SUN) { - const points = await this.api.altitudePointsOfSun(this.dateTime, this.settings.fast) + const points = await this.api.altitudePointsOfSun(this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } // Moon. else if (this.tab === SkyAtlasTab.MOON) { - const points = await this.api.altitudePointsOfMoon(this.dateTime, this.settings.fast) + const points = await this.api.altitudePointsOfMoon(this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } // Planet. else if (this.tab === SkyAtlasTab.PLANET && this.planet) { - const points = await this.api.altitudePointsOfPlanet(this.planet.code, this.dateTime, this.settings.fast) + const points = await this.api.altitudePointsOfPlanet(this.planet.code, this.dateTime) AtlasComponent.belowZeroPoints(points) this.altitudeData.datasets[9].data = points } @@ -868,8 +868,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, private loadPreference() { const preference = this.preference.skyAtlasPreference.get() - this.settings.fast = preference.fast - for (const group of SATELLITE_GROUPS) { const satellite = preference.satellites.find((e) => e.group === group) const enabled = satellite?.enabled ?? AtlasComponent.DEFAULT_SATELLITE_FILTERS.includes(group) @@ -880,7 +878,6 @@ export class AtlasComponent implements OnInit, AfterContentInit, AfterViewInit, savePreference() { const preference = this.preference.skyAtlasPreference.get() - preference.fast = this.settings.fast preference.satellites = SATELLITE_GROUPS.map((group) => { return { group, enabled: this.satelliteSearchGroup.get(group) ?? false } }) diff --git a/desktop/src/shared/types/atlas.types.ts b/desktop/src/shared/types/atlas.types.ts index b2ad64a61..8ef9bca6b 100644 --- a/desktop/src/shared/types/atlas.types.ts +++ b/desktop/src/shared/types/atlas.types.ts @@ -61,7 +61,6 @@ export interface SkyAtlasInput { export interface SettingsDialog { showDialog: boolean - fast: boolean } export const CONSTELLATIONS = [ From a0c9c40a480fef9df5cc9e68a37394998a731f7f Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 11:58:18 -0300 Subject: [PATCH 22/29] [desktop]: Improve find window --- desktop/app/main.ts | 22 ++--- desktop/app/window.manager.ts | 91 ++++++++++--------- desktop/src/app/app.component.ts | 2 +- desktop/src/app/framing/framing.component.ts | 12 ++- .../shared/services/browser-window.service.ts | 4 +- .../src/shared/services/electron.service.ts | 42 +++++---- desktop/src/shared/types/app.types.ts | 19 +++- 7 files changed, 106 insertions(+), 86 deletions(-) diff --git a/desktop/app/main.ts b/desktop/app/main.ts index 14989af5f..2df6e432c 100644 --- a/desktop/app/main.ts +++ b/desktop/app/main.ts @@ -134,17 +134,17 @@ try { return false }) - ipcMain.handle('WINDOW.OPEN', (e, data) => windowManager.handleWindowOpen(e, data)) - ipcMain.handle('FILE.OPEN', (e, data) => windowManager.handleFileOpen(e, data)) - ipcMain.handle('FILE.SAVE', (e, data) => windowManager.handleFileSave(e, data)) - ipcMain.handle('DIRECTORY.OPEN', (e, data) => windowManager.handleDirectoryOpen(e, data)) - ipcMain.handle('WINDOW.PIN', (e) => windowManager.handleWindowPin(e)) - ipcMain.handle('WINDOW.UNPIN', (e) => windowManager.handleWindowUnpin(e)) - ipcMain.handle('WINDOW.MINIMIZE', (e) => windowManager.handleWindowMinimize(e)) - ipcMain.handle('WINDOW.MAXIMIZE', (e) => windowManager.handleWindowMaximize(e)) - ipcMain.handle('WINDOW.RESIZE', (e, data) => windowManager.handleWindowResize(e, data)) - ipcMain.handle('WINDOW.FULLSCREEN', (e, data) => windowManager.handleWindowFullscreen(e, data)) - ipcMain.handle('WINDOW.CLOSE', (e, data) => windowManager.handleWindowClose(e, data)) + ipcMain.handle('WINDOW.OPEN', (e, command) => windowManager.handleWindowOpen(e, command)) + ipcMain.handle('FILE.OPEN', (e, command) => windowManager.handleFileOpen(e, command)) + ipcMain.handle('FILE.SAVE', (e, command) => windowManager.handleFileSave(e, command)) + ipcMain.handle('DIRECTORY.OPEN', (e, command) => windowManager.handleDirectoryOpen(e, command)) + ipcMain.handle('WINDOW.PIN', (e, command) => windowManager.handleWindowPin(e, command)) + ipcMain.handle('WINDOW.UNPIN', (e, command) => windowManager.handleWindowUnpin(e, command)) + ipcMain.handle('WINDOW.MINIMIZE', (e, command) => windowManager.handleWindowMinimize(e, command)) + ipcMain.handle('WINDOW.MAXIMIZE', (e, command) => windowManager.handleWindowMaximize(e, command)) + ipcMain.handle('WINDOW.RESIZE', (e, command) => windowManager.handleWindowResize(e, command)) + ipcMain.handle('WINDOW.FULLSCREEN', (e, command) => windowManager.handleWindowFullscreen(e, command)) + ipcMain.handle('WINDOW.CLOSE', (e, command) => windowManager.handleWindowClose(e, command)) const events: InternalEventType[] = ['WHEEL.RENAMED', 'LOCATION.CHANGED', 'CALIBRATION.CHANGED', 'ROI.SELECTED'] diff --git a/desktop/app/window.manager.ts b/desktop/app/window.manager.ts index f4ca91d9a..9d25ba4ca 100644 --- a/desktop/app/window.manager.ts +++ b/desktop/app/window.manager.ts @@ -3,7 +3,8 @@ import { BrowserWindow, Notification, dialog, screen, shell } from 'electron' import type { ChildProcessWithoutNullStreams } from 'node:child_process' import { join } from 'path' import type { MessageEvent } from '../src/shared/types/api.types' -import type { CloseWindow, ConfirmationEvent, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, StoredWindowData } from '../src/shared/types/app.types' +import type { CloseWindow, ConfirmationEvent, FullscreenWindow, NotificationEvent, OpenDirectory, OpenFile, OpenWindow, ResizeWindow, StoredWindowData, WindowCommand } from '../src/shared/types/app.types' +import type { Nullable } from '../src/shared/utils/types' import type { ParsedArgument } from './argument.parser' import type { LocalStorage } from './local.storage' @@ -29,11 +30,11 @@ export class ApplicationWindow { return !this.webSocket || this.data.id === 'home' } - get windowId() { + get electronId() { return this.browserWindow.id } - get appId() { + get windowId() { return this.data.id } @@ -271,24 +272,26 @@ export class WindowManager { homeWindow?.close() } - findWindow(id: number) { - for (const [, window] of this.windows) { - if (window.windowId === id) { - return window + findWindow(id: Nullable) { + if (id) { + for (const [, window] of this.windows) { + if (window.electronId === id || window.windowId === id) { + return window + } } } return undefined } - async handleFileOpen(event: Electron.IpcMainInvokeEvent, data: OpenFile) { - const window = this.findWindow(event.sender.id) + async handleFileOpen(event: Electron.IpcMainInvokeEvent, command: OpenFile) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window) { const ret = await dialog.showOpenDialog(window.browserWindow, { - filters: data.filters, + filters: command.filters, properties: ['openFile'], - defaultPath: data.defaultPath || undefined, + defaultPath: command.defaultPath || undefined, }) return !ret.canceled && ret.filePaths[0] @@ -297,14 +300,14 @@ export class WindowManager { } } - async handleFileSave(event: Electron.IpcMainInvokeEvent, data: OpenFile) { - const window = this.findWindow(event.sender.id) + async handleFileSave(event: Electron.IpcMainInvokeEvent, command: OpenFile) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window) { const ret = await dialog.showSaveDialog(window.browserWindow, { - filters: data.filters, + filters: command.filters, properties: ['createDirectory', 'showOverwriteConfirmation'], - defaultPath: data.defaultPath || undefined, + defaultPath: command.defaultPath || undefined, }) return !ret.canceled && ret.filePath @@ -313,13 +316,13 @@ export class WindowManager { } } - async handleDirectoryOpen(event: Electron.IpcMainInvokeEvent, data: OpenDirectory) { - const window = this.findWindow(event.sender.id) + async handleDirectoryOpen(event: Electron.IpcMainInvokeEvent, command: OpenDirectory) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window) { const ret = await dialog.showOpenDialog(window.browserWindow, { properties: ['openDirectory'], - defaultPath: data.defaultPath || undefined, + defaultPath: command.defaultPath || undefined, }) return !ret.canceled && ret.filePaths[0] @@ -328,20 +331,20 @@ export class WindowManager { } } - async handleWindowOpen(event: Electron.IpcMainInvokeEvent, data: OpenWindow) { - if (data.preference.modal) { - const parentWindow = this.findWindow(event.sender.id) - const appWindow = await this.createWindow(data, parentWindow?.browserWindow) + async handleWindowOpen(event: Electron.IpcMainInvokeEvent, command: OpenWindow) { + if (command.preference.modal) { + const parentWindow = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) + const appWindow = await this.createWindow(command, parentWindow?.browserWindow) return new Promise((resolve) => { appWindow.resolver = resolve }) } else { - const appWindow = await this.createWindow(data) + const appWindow = await this.createWindow(command) - if (data.preference.bringToFront) { + if (command.preference.bringToFront) { appWindow.browserWindow.show() - } else if (data.preference.requestFocus) { + } else if (command.preference.requestFocus) { appWindow.browserWindow.focus() } @@ -349,11 +352,11 @@ export class WindowManager { } } - handleWindowClose(event: Electron.IpcMainInvokeEvent, data: CloseWindow) { - const window = this.findWindow(event.sender.id) + handleWindowClose(event: Electron.IpcMainInvokeEvent, command: CloseWindow) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window) { - window.resolver?.(data.data) + window.resolver?.(command.data) window.resolver = undefined window.close() return true @@ -362,15 +365,13 @@ export class WindowManager { } } - handleWindowResize(event: Electron.IpcMainInvokeEvent, newHeight: number) { - const window = this.findWindow(event.sender.id) + handleWindowResize(event: Electron.IpcMainInvokeEvent, command: ResizeWindow) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window && !window.data.preference.resizable && window.data.preference.autoResizable !== false) { - const data = window.data - const [width] = window.browserWindow.getSize() const maxHeight = screen.getPrimaryDisplay().workAreaSize.height - const height = Math.max(data.preference.minHeight ?? 0, Math.min(newHeight, maxHeight)) + const height = Math.max(window.data.preference.minHeight ?? 0, Math.min(command.height, maxHeight)) // https://github.com/electron/electron/issues/16711#issuecomment-1311824063 window.browserWindow.setResizable(true) @@ -383,35 +384,35 @@ export class WindowManager { } } - handleWindowMinimize(event: Electron.IpcMainInvokeEvent) { - const window = this.findWindow(event.sender.id) + handleWindowMinimize(event: Electron.IpcMainInvokeEvent, command: WindowCommand) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) window?.browserWindow.minimize() return !!window && window.browserWindow.isMinimized() } - handleWindowMaximize(event: Electron.IpcMainInvokeEvent) { - const window = this.findWindow(event.sender.id) + handleWindowMaximize(event: Electron.IpcMainInvokeEvent, command: WindowCommand) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) return !!window && window.toggleMaximize() } - handleWindowPin(event: Electron.IpcMainInvokeEvent) { - const window = this.findWindow(event.sender.id) + handleWindowPin(event: Electron.IpcMainInvokeEvent, command: WindowCommand) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) window?.browserWindow.setAlwaysOnTop(true) return !!window && window.browserWindow.isAlwaysOnTop() } - handleWindowUnpin(event: Electron.IpcMainInvokeEvent) { - const window = this.findWindow(event.sender.id) + handleWindowUnpin(event: Electron.IpcMainInvokeEvent, command: WindowCommand) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) window?.browserWindow.setAlwaysOnTop(false) return !!window && window.browserWindow.isAlwaysOnTop() } - handleWindowFullscreen(event: Electron.IpcMainInvokeEvent, enabled?: boolean) { - const window = this.findWindow(event.sender.id) + handleWindowFullscreen(event: Electron.IpcMainInvokeEvent, command: FullscreenWindow) { + const window = this.findWindow(command.windowId) ?? this.findWindow(event.sender.id) if (window) { - if (enabled) window.browserWindow.setFullScreen(true) - else if (enabled === false) window.browserWindow.setFullScreen(false) + if (command.enabled) window.browserWindow.setFullScreen(true) + else if (command.enabled === false) window.browserWindow.setFullScreen(false) else window.toggleFullscreen() } diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index eebb4d38a..e7c03714c 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -86,6 +86,6 @@ export class AppComponent implements OnDestroy { } close(data?: unknown) { - return this.electron.closeWindow({ id: window.id, data }) + return this.electron.closeWindow(data) } } diff --git a/desktop/src/app/framing/framing.component.ts b/desktop/src/app/framing/framing.component.ts index 43aceda90..016dcb5db 100644 --- a/desktop/src/app/framing/framing.component.ts +++ b/desktop/src/app/framing/framing.component.ts @@ -70,8 +70,14 @@ export class FramingComponent implements AfterViewInit, OnDestroy { } async ngAfterViewInit() { - this.hipsSurveys = await this.api.hipsSurveys() - this.hipsSurvey = this.hipsSurveys.find((e) => e.id === this.hipsSurvey?.id) ?? this.hipsSurveys[0] + this.loading = true + + try { + this.hipsSurveys = await this.api.hipsSurveys() + this.hipsSurvey = this.hipsSurveys.find((e) => e.id === this.hipsSurvey?.id) ?? this.hipsSurveys[0] + } finally { + this.loading = false + } this.route.queryParams.subscribe((e) => { const data = JSON.parse(decodeURIComponent(e['data'] as string)) as FramingData @@ -82,7 +88,7 @@ export class FramingComponent implements AfterViewInit, OnDestroy { @HostListener('window:unload') ngOnDestroy() { void this.closeFrameImage() - void this.electron.closeWindow({ id: this.frameId }) + void this.electron.closeWindow(undefined, this.frameId) } private async frameFromData(data: FramingData) { diff --git a/desktop/src/shared/services/browser-window.service.ts b/desktop/src/shared/services/browser-window.service.ts index c0df267b7..c96e3e34b 100644 --- a/desktop/src/shared/services/browser-window.service.ts +++ b/desktop/src/shared/services/browser-window.service.ts @@ -18,12 +18,12 @@ export class BrowserWindowService { openWindow(open: OpenWindow): Promise { open.preference.modal = false - return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open }) + return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open, windowId: window.id }) } openModal(open: OpenWindow): Promise> { open.preference.modal = true - return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open }) + return this.electron.ipcRenderer.invoke('WINDOW.OPEN', { ...open, windowId: window.id }) } openMount(data: Mount, preference: WindowPreference = {}) { diff --git a/desktop/src/shared/services/electron.service.ts b/desktop/src/shared/services/electron.service.ts index 5591485a1..8804deec1 100644 --- a/desktop/src/shared/services/electron.service.ts +++ b/desktop/src/shared/services/electron.service.ts @@ -9,7 +9,7 @@ import { ipcRenderer, webFrame } from 'electron' import * as fs from 'fs' import { DARVEvent, TPPAEvent } from '../types/alignment.types' import { DeviceMessageEvent } from '../types/api.types' -import { CloseWindow, ConfirmationEvent, JsonFile, NotificationEvent, OpenDirectory, OpenFile, SaveJson } from '../types/app.types' +import { CloseWindow, ConfirmationEvent, FullscreenWindow, JsonFile, NotificationEvent, OpenDirectory, OpenFile, ResizeWindow, SaveJson, WindowCommand } from '../types/app.types' import { Location } from '../types/atlas.types' import { AutoFocusEvent } from '../types/autofocus.type' import { Camera, CameraCaptureEvent } from '../types/camera.types' @@ -68,12 +68,12 @@ interface EventMappedType { 'DIRECTORY.OPEN': OpenDirectory 'JSON.WRITE': JsonFile 'JSON.READ': string - 'WINDOW.RESIZE': number - 'WINDOW.PIN': unknown - 'WINDOW.UNPIN': unknown - 'WINDOW.MINIMIZE': unknown - 'WINDOW.MAXIMIZE': unknown - 'WINDOW.FULLSCREEN': boolean + 'WINDOW.RESIZE': ResizeWindow + 'WINDOW.PIN': WindowCommand + 'WINDOW.UNPIN': WindowCommand + 'WINDOW.MINIMIZE': WindowCommand + 'WINDOW.MAXIMIZE': WindowCommand + 'WINDOW.FULLSCREEN': FullscreenWindow 'WINDOW.CLOSE': CloseWindow 'WHEEL.RENAMED': WheelRenamed 'ROI.SELECTED': ROISelected @@ -129,16 +129,17 @@ export class ElectronService { } openFile(data?: OpenFile): Promise> { - return this.send('FILE.OPEN', data) + return this.send('FILE.OPEN', { ...data, windowId: data?.windowId ?? window.id }) } saveFile(data?: OpenFile): Promise> { - return this.send('FILE.SAVE', data) + return this.send('FILE.SAVE', { ...data, windowId: data?.windowId ?? window.id }) } openImage(data?: OpenFile): Promise> { return this.openFile({ ...data, + windowId: data?.windowId ?? window.id, filters: [ { name: 'All', extensions: ['fits', 'fit', 'xisf'] }, { name: 'FITS', extensions: ['fits', 'fit'] }, @@ -150,6 +151,7 @@ export class ElectronService { saveImage(data?: OpenFile) { return this.saveFile({ ...data, + windowId: data?.windowId ?? window.id, filters: [ { name: 'All', extensions: ['fits', 'fit', 'xisf', 'png', 'jpg', 'jpeg'] }, { name: 'FITS', extensions: ['fits', 'fit'] }, @@ -160,11 +162,11 @@ export class ElectronService { } openDirectory(data?: OpenDirectory): Promise { - return this.send('DIRECTORY.OPEN', data) + return this.send('DIRECTORY.OPEN', { ...data, windowId: data?.windowId ?? window.id }) } async saveJson(data: SaveJson): Promise | false> { - data.path = data.path || (await this.saveFile({ ...data, filters: [{ name: 'JSON files', extensions: ['json'] }] })) + data.path = data.path || (await this.saveFile({ ...data, windowId: data.windowId ?? window.id, filters: [{ name: 'JSON files', extensions: ['json'] }] })) if (data.path) { if (await this.writeJson(data)) { @@ -176,7 +178,7 @@ export class ElectronService { } async openJson(data?: OpenFile): Promise | false> { - const path = await this.openFile({ ...data, filters: [{ name: 'JSON files', extensions: ['json'] }] }) + const path = await this.openFile({ ...data, windowId: data?.windowId ?? window.id, filters: [{ name: 'JSON files', extensions: ['json'] }] }) if (path) { return await this.readJson(path) @@ -194,7 +196,7 @@ export class ElectronService { } resizeWindow(size: number) { - return this.send('WINDOW.RESIZE', Math.floor(size)) + return this.send('WINDOW.RESIZE', { height: Math.floor(size), windowId: window.id }) } async autoResizeWindow(timeout: number = 500): Promise> { @@ -212,27 +214,27 @@ export class ElectronService { } pinWindow() { - return this.send('WINDOW.PIN') + return this.send('WINDOW.PIN', { windowId: window.id }) } unpinWindow() { - return this.send('WINDOW.UNPIN') + return this.send('WINDOW.UNPIN', { windowId: window.id }) } minimizeWindow() { - return this.send('WINDOW.MINIMIZE') + return this.send('WINDOW.MINIMIZE', { windowId: window.id }) } maximizeWindow() { - return this.send('WINDOW.MAXIMIZE') + return this.send('WINDOW.MAXIMIZE', { windowId: window.id }) } fullscreenWindow(enabled?: boolean): Promise { - return this.send('WINDOW.FULLSCREEN', enabled) + return this.send('WINDOW.FULLSCREEN', { enabled, windowId: window.id }) } - closeWindow(data: CloseWindow): Promise { - return this.send('WINDOW.CLOSE', data) + closeWindow(data?: unknown, id?: string): Promise { + return this.send('WINDOW.CLOSE', { data, windowId: id ?? window.id }) } calibrationChanged() { diff --git a/desktop/src/shared/types/app.types.ts b/desktop/src/shared/types/app.types.ts index 3ab578ef8..a819efe98 100644 --- a/desktop/src/shared/types/app.types.ts +++ b/desktop/src/shared/types/app.types.ts @@ -51,19 +51,30 @@ export interface WindowPreference { minHeight?: number } -export interface OpenWindow { +export interface WindowCommand { + windowId?: string +} + +export interface OpenWindow extends WindowCommand { id: string path: string preference: WindowPreference data?: unknown } -export interface CloseWindow { - id?: string +export interface CloseWindow extends WindowCommand { data?: unknown } -export interface OpenDirectory { +export interface FullscreenWindow extends WindowCommand { + enabled?: boolean +} + +export interface ResizeWindow extends WindowCommand { + height: number +} + +export interface OpenDirectory extends WindowCommand { defaultPath?: string } From 1649feb73a1171dd2bfc954014a75c8b37f7ed6c Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 12:07:27 -0300 Subject: [PATCH 23/29] [ci]: Add Makefile bootRun command --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 513a5d634..e38c9b7fd 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: api desktop build install +.PHONY: api desktop bootRun build install ifeq ($(OS),Windows_NT) api: @@ -6,6 +6,9 @@ api: desktop: cd desktop && npm run electron:build + +bootRun: + gradlew.bat api:bootRun --args='--server.port=7000' else api: ./gradlew api:bootJar @@ -13,6 +16,9 @@ api: desktop: cd desktop && npm run electron:build:deb +bootRun: + ./gradlew api:bootRun --args='--server.port=7000' + install: sudo dpkg -i desktop/release/nebulosa_0.1.0_amd64.deb endif From 16a3231d06c775400493ffbb78bbee9019c7eae7 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 14:23:33 -0300 Subject: [PATCH 24/29] [desktop]: Change background color --- desktop/src/app/app.component.html | 2 +- desktop/src/app/app.component.ts | 1 - desktop/src/styles.scss | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/desktop/src/app/app.component.html b/desktop/src/app/app.component.html index 1db7d07d2..9d53ac56f 100644 --- a/desktop/src/app/app.component.html +++ b/desktop/src/app/app.component.html @@ -2,7 +2,7 @@ *ngIf="showTopBar" id="titlebar" class="flex flex-row align-items-center justify-content-end gap-2 sticky pr-1" - [style]="{ height: '42px', zIndex: '1000', backgroundColor }"> + [style]="{ height: '42px', zIndex: '1000', backgroundColor: '#212121' }">
{{ title }}
{{ subTitle }}
diff --git a/desktop/src/app/app.component.ts b/desktop/src/app/app.component.ts index e7c03714c..e60773700 100644 --- a/desktop/src/app/app.component.ts +++ b/desktop/src/app/app.component.ts @@ -15,7 +15,6 @@ export class AppComponent implements OnDestroy { readonly maximizable = !!window.preference.resizable readonly modal = window.preference.modal ?? false subTitle? = '' - backgroundColor = '#212121' topMenu: MenuItem[] = [] showTopBar = true diff --git a/desktop/src/styles.scss b/desktop/src/styles.scss index dc9a8fb43..a0e4c408f 100644 --- a/desktop/src/styles.scss +++ b/desktop/src/styles.scss @@ -8,6 +8,7 @@ body { font-size: 11.5px; border: 1px solid #212121; scroll-behavior: smooth; + background-color: #1a1a1a; } body { From d07be6f760b3f7a4e6c32a4b3bab59abca979d29 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 15:42:42 -0300 Subject: [PATCH 25/29] [desktop]: Improve theme colors --- desktop/alignment.png | Bin 33908 -> 28839 bytes desktop/angular.json | 2 +- desktop/auto-focus.png | Bin 33231 -> 34801 bytes desktop/calculator.png | Bin 14284 -> 14683 bytes desktop/camera.png | Bin 41516 -> 36265 bytes desktop/filter-wheel.png | Bin 16871 -> 16233 bytes desktop/flat-wizard.png | Bin 21942 -> 28219 bytes desktop/focuser.png | Bin 12662 -> 13187 bytes desktop/framing.png | Bin 19120 -> 19140 bytes desktop/guider.png | Bin 46248 -> 28202 bytes desktop/home.png | Bin 36800 -> 36800 bytes desktop/indi.png | Bin 32368 -> 23741 bytes desktop/mount.png | Bin 39088 -> 38178 bytes desktop/package-lock.json | 11 ++-- desktop/package.json | 2 +- desktop/rotator.png | Bin 10476 -> 10113 bytes desktop/sequencer.png | Bin 67683 -> 37634 bytes desktop/settings.png | Bin 12562 -> 12074 bytes desktop/sky-atlas.png | Bin 65719 -> 63601 bytes desktop/src/app/app.component.html | 2 +- desktop/src/app/camera/camera.component.html | 2 +- .../filterwheel/filterwheel.component.html | 2 +- .../src/app/focuser/focuser.component.html | 4 +- desktop/src/app/guider/guider.component.html | 6 +- desktop/src/app/mount/mount.component.html | 2 +- .../src/app/rotator/rotator.component.html | 2 +- .../app/sequencer/sequencer.component.html | 36 +++++------ .../camera-exposure.component.html | 10 +-- .../camera-info/camera-info.component.html | 4 +- desktop/src/styles.scss | 57 +++++++++++++++++- 30 files changed, 97 insertions(+), 45 deletions(-) diff --git a/desktop/alignment.png b/desktop/alignment.png index d6007af004b9f72bd716d2045dca7141bfdccb2f..c64d59699c3108e9ed23c534825d884bbcb7d64b 100644 GIT binary patch literal 28839 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 rc~|A(<~@kM%mj;)yMZn*_kFdaZzT?As0ROyq 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 IT)z9i0Ck|H%>V!Z literal 33231 zcmb@u1yCJPv?WRsf(8f@2p&R^;O_43?k>UICAho0y99R$!8N$MdvJ$2yf=S-P1Ub? zGxaA`gxp)VZ+D+Qd+)W@UOT}uQo;yuSa1*!5D20o0&)-#Z;HWB9t;$CC$xIOAN+!} z;}cbY0e{?K41&OGOnX5UdwDA(dna96LkMF_D+@zPJAGS2LrXgoEBn)T9bDi;#IGOX zw>8wYH?^|-qF`!a2w}Ib_l1V`%MS<3FLX3?3}0v&*cceu=xK_$0;C}zzCefy@G3Z` z9W6U)C|swTQWTIeICW_1e0uu1@{Ly(6T^iY9|_NO?9P4kE^Vyoru}r+j%(NMQbSXd5r)9; zBb!J^J^UBHk9-OOK5-xUVA6?r#lZWcF<*$lo5rG1D10#4HQz*F3H<)5qU3@1_9$TG z_+SX^6Cl689xwi1A2zr^N!?2C%}7=VPYC7xf>k=IhWQf+WsO)nsvsXHC(7(ckqWlntBx;;ji5WgIV9O?cK zV|;wv@Wrt$q;R7ho=PBIo-E#cr4FQeK?Z)*;zdWiR(6N2fpCXC3IdD3~LV4aUPo3KACLzi2HU&G3se*zJIQ}+8tVrMDZj@`4{V^!nlh}Hp_&zq5bB~8~4j`;WD+lkg%{1TAp`? zunJE9o*zz8QBb-95U^{14lXXH;(I+tQ>xeh8)05m81URmQSivKHompS538`;c*s|s zyBjs=CdE&n=1|m4=$5p*&ALM0x$CJqZ(=Q*zP;Ekls^le?|xZn37V~`q`R8*|K=ZI zyd7`Lq+=PJj_VDlm;g66i$QOdMEjeZONaYiGUF32`mR>q3(^UN1`XoPF9-L37U&*E zqg&}s7_4`)feh(5-LJ7{r;^NTcu%(oB`XqNLq?Hp0F@55IR=}(-J8R z!Sgl77u$*2IWkjPFSV7G)a7b*&H5=D8+z?8&ktB+vft~}M#3=ZRqD+#v6;-*Vx_rs zpC9kQ=1Pv_D*5-$ZS0%Kv@jmw=eg0KMudl^q^O?g{$vSU4j*Ck%&$#86bD-@8`X;5 zA$g$~vRCfV`0}5GJvBN9DOFX_9gI5*BmX`jiz{gj+)G;;KPuz)y!4jJXO68YNE-*K z4OCOl*o4Tl+#neI*gdg_wdtD_5&S0&uhO8{Q_=qsuS%M@*jeB`(a?sT0!~Q=S6C|7 zPr^QBI*&`H2#xZX6qG9&9v+D0W(WO|6h?_O7Fq0~4+scm`5f<{5e=3aZJZ?JRa8_q zdEvxbM2$yMdQuq8RH_X`6+ckXec04 zihp+NQy4gUc4nI_ls3M<9H5wsM-e~a zLoJ)ymX?;`iH8M_#|z^Xn(P}J8++5Gvlg>OcyYCP2iUp7pPA<{E6jI&{noFd<@~fQDz}4QVy4^8%ha7)SA_2d=f=T720;z49T!B z>!aE7LFW?5bb{=UOG`^>b!M}4x?PY76skU%nfTl5kRXt*!>Yq{8hNpHU*P28F~Uow+1#BE zuWb5vF_SAjtm(YxMxgm7J9717b4zjm1VfjWM~Ec%dpoKc0$dNb^~FEwmz0$?TL$kq zJOVek2a$GtHqGyEDce~b&7$Nsjtl`Dw-Y{|y)GTS%*d9}hTi9V>Ddxg&7qKF##M%bUyf9$Xfm)YJMFXBZPo}nR8{|pUh^SQW3{3qxP#O-0?y!>0A9%Z8n5j}@gdim))!oxWYc@kMQ=utt zZB0W&L{z6KkZx_}ox<)!1zsI3)P+i=v(eh^NL-&RiyIm3ygL;ho1Rvbf4}{SFDP(y zqbGE}$&O@ZW~TM&dhs>Z>5WIH9INcRN)$^QZMWerc1Fl+mO4AV^TiWml9KwDn(XkM zxhIxM{60EWnNAXmiHWJSxiXG%Jx~~rWt1O(oo*h8B}r`2C|9EQxW6P@jC?IyMLY%u z-@bqU4q-lD{k~2uT#RUz%`C?L=08d$9i-;}?K1k`tM73xTge7&2q?h-{uj$ zR_eh2E0y}cF7R?IoWVt=6&a&p8H_>ooa(wJ1~Q91#ddItKSuGxzUa(LQ3du+JKCHi zr@f>o&aP4;v2!XbD4@XlMlF1aw(ccX8I2?ouk9r*!hn^+|CUYb! z3x{VginM2y1Z79R$u&kOIo4Z3WqqkDq-xhbcn2%TR$wuvRHx||D5hCD)~vJ=7(Uf; z5^W~OCgdroT;4KWSR+pkb(1MpimpjRLsL?3TQp7fl?q3{FC)HNGqi{%J?&+I=&I7~ zn@F(h(0uWy%HhWfHQz}|C@7&?i^)(W%I1GP=ewt$i~K&m#GG)+S|OZp*9pCyD*x~y z?DLY>kMI-upk@i5xS|HNx;?qdYjOe2Z_6H63Nzz6GgMq61`^1`l$@B4*COuftIq6O z{#8G^U8UT@44$haRNiWE_ZJd6AzO@Rm@f8iSis42R?T8mlQqIbGOy|->{qs)^P(N7 zUvHi*s9%OY#u)y5pARoFVskPb2zzSZGhb^j+Z8#K+|mlMdaAuWfXJxyo^d6l$uWV0D;FR4sTD$`En{>cvflR29ft`~iG!<# zd&Ohn*G65YsPy1gdL2E)U~9W4Yj7s_yp+VAVi}eijk~LMGva~F$+NK+XE3#K85EDU zHhy41eONL*%$Ts+6i+yeCNXabml)f?LW8f!-r7(sDn-y@bs~b*N#1yZuJdP~dlgaw z%q%XCgo|R_{qcVZt(eh%X%t;8i73^CtRB@xNA;f^FP%&AwPy0E%Q?aZLLrY9XF=?5&G~v5Iaeuv0EB)d_1Wuw$=TND=iN5 zboqkZm#cbrB6O6Fy>T=iWTmAYNmdy}qKz-seP-h6>_m8K;d~bHphC~={iyM2a}|$w zjvGUT{zh5N-bCr-x%`;&&EA88Q%Zx?V7oSA&3Ssbd-DV3hY#CkC0wyJ+DQ3F+@e8) z2ro`gV(+5txV~$X#KyqjjSBif3g(>rMTrz2$6=4+kL()}rzZ=mstdgE>dQIVh7!&V zQkc^*OYs<*k^E(`h*Bx!Ef@Tgzz-s6VX{OTJFRN-9$y!-Coi`E8HzSLt=Yg=nOgtr z3zzsM4#pB1qZZLsM079#uDiOKHi?$#`o{ie;t_2A+26Q(v^l6&h-%&Iow1j4j>J^w zY?J7m{x|v=_IQ6I!nP<-^yN+(Bg<+vG}IUi7NZbr54U;YPmT8W58vpRn2Q`zjlB7* zd=MKO4ec#{*n4|RZMw@^)%AT~V!yJUC87}}W7~?>%Ps`%ukh^D1I_@v%hZ7_) z-$pdLG?79UVYnD;=W;gQ)XHK&PQW}QuOXo2_(oMXTR=N7K+>EB0>y_vxW-bnW0%7u z39YBS31Xc?> zL>7b0+T3tN_nd-UMgBV-FG7{ipE3UpGRvFHK8)U=A*4K#8owYKpUe^AEW0F}{Bi$f zLz*u5Wm^r4n){yM^@n_QzGy^VC5xDZF!JvoS#Y?Hg_-J|*heHHQ_*SNgCrV9iq$b~ z=!#h74=gtZqwefdR@6B|Qx%Pjt%t;xt2K!t1g{>fhe%>NM>4Jt>BVB&0zRp zz)Sw1lYV+GJ|?o|D=qX^N6&oJ82`9*8->?Z4*h}oiJvzkgqRX%TzToK!C1_lt&-!K z7UCG+LNXE=*GfEBd10@3>Uwa}%)mIM-d1ll;Lqdzw58M$>zLVUVuX2ZeT~6^4+#WK z1Ksq_oy%_~Ppw}F9v&XVqqzRj#p@o&>Kq(-M2f=2HFhwnZRzR1nct%A*e8!?#929_ zv=T*0lavv$loTzsCWKRdVNZ`sZL{A+IzJv#XGK#M=zkVD52>uNcF*B-6UB3SKTO>^4!*_~Xry>bmPXc12-Yui;n)OK@29qQP zs}I!f*9_yk`c2N)a1c;JVoU4{J#GB*IGV?`chHiqanUvR@^W%MU#)6<$Jw{3z1feL8FG_NxVp_ck@l8 zpIwtbHV_0&7UQ1Pg>C#@e`_8X-tF}ZL58P);tCQ(+;km7WwT0fVkP$BGxZ1G-%tN& zB#f<+%Xed~8NwzPexg!}zv%zqzmPgUOGX>4Lh_w=Yv<&Y3P3U5>J5^1x1oomdisMD zD&F$A^us!Cb@^!Sfs^+)_qxeySohW(-66W?dZfQULb2&=GQ%?=o8z7~q2Zv&=uRvw z`Mqj+OJfry>-V~eW=b|<|KYy~|bkjG{(Kz0| zHyn3NX>b~MOm3?>a6uD$e-GzzUJZW>!glBVaC@NzSI58aGb5{FoiUm!^J+AP&ny~h z%v72Ud*3}%Ua+ybUvSOT#fiNb(EE%WSsLeJ&=LoqC51`9lVvY{w7P$|5zx*aDSDzok(=+8lT>3_spq0@@t%D||M$Bf(b|NJ zaPve_@DxL~W=j^=A)YKfE)4sHI?QnQX5YRIISYb>O-ORs$5 z9Fx7?=&)5?rQ6MC-(=JMAbK}-3^tcU$5U1HdHTbq{CGGSq>WQ={nniZ@2?KD@R?5m zhl#NeDt9NuROz9w5R4g`Dlae34=M98TI?* z$3sNeXGigyjA)eP*}LCMM?3HO2SllBsMrhbX@06{^0*4=)g|^k&`N7*&>?ejau&EV zD6u!{ES37&T$%es7ZXrZXZp3bbB&GSN}i6>y^k$g1R{*4{#*=lW_UOGeu80fHV)hm ziAAY>bC>lGTKKmcxUKP%m^ugJpM{%PuiFLt(hTRFUL0SJ5VQh)J?K-KoNag9X^clt zp}#OwhYD&-Z9OqF=~`OKkMH0m`G;fTr7v5X?ecY>i92)ez&JinAk8KQShF zWhHn3RRcyfCE(^)LPJAdwf=mI4n|>3yf*@;7Pjajs@YwS3C?7|@>7nNn9P?$CSu=e zn8^swTWJSE-8&|D)~J2#FD2g`@532Z^EFStwDgeeTyon1>pZkv|8yj0|~?TVIa zg+eFOSXq{g&*{h%X^n6F<$nL&#nV5#RJ;v8{W&2sutV**_Oj9s*AeBViYB7QXPS97 zU3B=t<%BjzO3Ub9={Nq8EO_yGB^Ms6YBhOk+2aUZEj|q-%EpW$n^Kosp(@8 zioZW3FBA$5eZxxwOV#f<{3QVTiKjCed)Ym_nJ&kPVzD5>GrGWhdFajxiq_Q#nM>1( zyGOOf7uJ+LfjOi8XVDifO-!NELBu<%2x1ct%X}J6=gyg?t8%-dX_Wvw=lk;H%>(e_2mZS6LCW=#28tm4`v?HS8Q+y5iFIvn+_fSAMMdyGU zO?r!8X8iEez17I^tKBq`0LF@ncAC_d3;c@nOvTcXm>DXalQ1%K8TlyXQ_=<3mKFCK zo|Rxt_m**}js#=YBf6ia??PZa@035RWXiCOWp=$K7o>|OvHiDaDU}#W;{En3M)_C0 zTS%;O%~1k>T&SvnB2G@zIAm#abEa@&$?nx{d~_=Z{n1p*t@jni@jqB5Yj3Rc?T#+e zaYCuTRL+Id)|j(gnsHPeZOJS~J8QI$yYdGwPT7R*p^XK=vNxUR_|Do%PgXiK1*#FT zxgllM+(1CIs@<%44T%{`{+*mO?zI!Ak-?(-F*h`=>mk(Xj82rHh5ca`jXTLj`bJujT{QdPPf@q7@!i1P)f9Fi`n{07M+WYOF z5Dex9zQM`Js-~=l&6qETk?{{r)?`rm*>7K7u!G~v-={v`Km$xfiV!F9>`Y;{^E4=L z_2Ex-Hft!c$DhS%OFS|Q+U6&q`R3oNl7+AbYLu_zlFk~k#)3D#4l<2AlUqt=#r+Jy? zHnzg~+cs(~Q%Y;aod6k!vlx3%46f(tjX~c8Tgu#GE5vc1dT# zxqtSRz;YzpMD=KE^KtH9SDWM)#LgDr*J#xcTHZN9l5mgh$r=wBeB?~aRcZL^jXXrM zSpcWMj13)p;rNaa1B#j=y{WBWZjrHPe&8JfRvCpkt<21GEob=h(f*Y)iJFr`rM-7E zif4FO9tGQN{hQADT-wEU#0>yz)Ew=J&IK5XXD93A(YFmTbUcR~@Bpf@rN0=2EM84G z)~&4jj(}6P$5{d&tSpxVN-tGeR&BwpOuaNZX6nSA1Cy+s&f{?5PejRi@+_jnh>7BF&K?qy26xEYD(izjz*RWXC5mTP*6g)|ZbqQ%SD z$Xe&#ysygDiqUYH1SV@K_sbCr|6{(uC~nXf63)c3DV#8g@Igq@tl>+EZQ2?J0%rQk ziK}n+z8`oi19Li5dz#nY@&xNEV@T9oeCG@93o{L?V(Cvar~5DL=WKL$PthMvOk~;S_-!_s z75LrEFG7aUP;t|hJ9AcZz}t~FYcg2LN~DA}8B?fWn-lv9jv z5^(OG7$Ek8lZ$K>osJId%#He{u`eKcg}NvErxDdjuu=5HDpR%C-28`jH)-f-zi~G} zIOrmmxHAH6wOg>4{&=#`#%#B1y;FXUsXn_eC_>`Jonw;A11nJ}d}z6FVr{ge$&UV_ zw&qu8GryYLRn#IRH^`C3XXrAeVWtlgq!M5GX#uY_3&1C+G~Z3SnY7` zOUt`hSbqxtMa+7!5R-u}&VgR}r(E!2&8D@I!gCc`PT8^GW57!(8uM@g(KnS)JNLJ>fi>eHFixcA>%uw12-SfG~OxH>jscq<>I1k{5 z_Y4oB>B|$oQW&TJvEB}Pp9)|0U-xYzD)Xv7LcXBFm$dS=yP6{WP(+sQV8p?OCihIk z=-lV#r)^-`9GDGEXpv^$h5Du~`KLnk4s}usHj>&Y05N;fK zgA}j3cQgkf(8=h<%^dx;B027}RK&K#EM;A~JFD$?@bX-EPU_6-UIVov&AbJIC{B4? zt)V^KMf-G(me57)vZabwKRS@uNt~d?Ld1c%=egKS*paz2POEu>mF0I54YW%t-;;MP zxo#GTIj({lEJBM+Z9fb9VGO9EUd=>slAEuW zRT&$GpVYK}r~WMJUDC2Oyr0B3ogO$I;$~NPAJ&5Y8)GPQ*M08i4=Va?~wxXp? zTVNzMAua+|rC#21L@}B#KE>OR-K^#Fjlh3bgztHD_4Vm7c=BVAg`2++vWC`p1?pND z2basgLleUcx37HFoF6~+hA_|AurgHChuTSlZ*FaV^mIwW#7>l=pu7=%)#6!gGykKr zP4a)(*)CPvJ(*-?5H_8N%4szan{xS7AWw?+0hbNU*w{EHCugq4SlR(y9O&@4vXqqH z^NT6N@t!`<(k@zK-V;{n*KhvarzvKwUZg6;%K35SSk170D53`7-sM(+Nv zI*89|j6EeiG<03eX0yy@Ghv{!Caa+#AuEe4naV`;?HlB~cke)7JTN*MnTd%B^8I^c zOw57)Xu|mhD|}N^)7M*vhK4>rKZp77K_Fi)TY(Id%bf*uZ2STPQE_m>9JI7hBcKd-w=D%g9 z)%ERdf4Sm3@kA=nGphOl)c&tu_oj+bsi>$}SXf>^VRQRW_ww?xWb4)+cpTDyd}fio z9(rDASFWY}zLw#`>+a409!*|;zOIpxl98sK-q-f__RE9m(4rzzK7M{$CMIHb_SDNu zdk9-wTN+y0Y}Fd0q?DA2Y<}p=tE=G1$i9Jr;QoFQ&@uu)e7WNsowV>^^$`{E^3G#N z^~@IwHm-t=Pt00g5WddO&zEVopffWw11kcH+cgCSwN@F863?Exzpqh5KybD_aX8Z1|EP|(_3m40Jmqe9a4 z!F1{EZJZ-L8w<-CSa5gu*7~8pgM(tt51=~)t>_X(M%BNzu#(u{;)(M&%Ss0>1;w@! zZ|h(s@x-}fstpDn{?GV$G-z{8<_aT4;B#x~E_glPLG$zT7f7b|X7T!pNJ{@DN2X;O;UiWSq0Q;JV5WyWfs_io~?oN}Zs>DK6=cJ@5}!#OhL zgo<;TAp#>y^q<`>W5vV0_L97D9=-&wZAq;>Xco1Ef2$8R)P)BZT~Kz_aF=^CWkE0D zgMuAtZjP142Nx^&1!eARyBQZV#Nk5xCe~;O=@uqimX(@#p8vj5X#tSV)J7@&Z-LMc zN;s!dfyO)nUs8>ktcL3#)5J#!k4HWy`;Zi$4Z%YBxX*^fte~N*|7caXb<3EDey{F| zrT)lOeW5Jx^Yfz-vA>Hdcr8{bnwe8b((%WyXy{;=r1-Hj?B)Y2B>PgyJxyXMl6ID<;NaB>ArtU z=Vv(cwlR-KK8yA8v0=kyn9nCx4EASveSYs5t}s<}7f|1X?$KNd_EK_qlaZu1+C7j< zkoy&3A4o)nh${Y?;SS6sF}fJaGf!b6)!p1OUpYz~8(z8V&LguNvLloFtxqZLE8U^= zLrR;nW4)2N3!+2G&{x3_thAZ1_~oa2m3j3n8kvtMI0N-#*EAb-&(8K%p6d6v{g6xU z8h@4dHrI@VErqm_S&?hxZE5Q0dRu>D1`tEB)Y*PJvlWxXo3OxYIFXvlrgTPdM$FHK zRSiz8vN-N|gC*`Lt}%t8{o}@)>Eti( ztvSUrVGoC4rAZM)?)+WTB9+&6WuN1OT>M=>F9%U3^kPk%Tb@?7#N~9(7YL-DXr0e6 z%_5Grwr{`Jx*g5@_YPyO*&5@I*1j-%2T15+V^p2}!!i#Gf9Je?a1`gS3WOGBdyRy) zjJK6n-ze}^4rIo9GWvuDdTnQF@6hRtF3>G|HIT_|XUinuWo8!>m898M1VFy~*IgKR zcA46}t^boz(VjryQ;|GxNwgvCJGB?=C|dPGH_A>y!P&d$QPZzWn8tVvjL~Z<+~R)t1+&OPxZCL3B71rkJwT0 z7t^0pv6rh?{Ct+Y)Ro>hkx5X7m)<~}=$%e{uf=9aS85;od)k8!^ZaaRJFzh&S<1ka ztD>p)+|^1EHex|jW7^%{#BTaGk1=qzU3}`dB%`W3LHD~7eqJ$t*9<(u1@wtpUf3QY zn&Hxq{P_W8Z#gZk9(YI+^&A5e5uN8yb-g3)WRtH7E6L7&X!zx%sWqx=Xhle=Us59!rT$VhMyv z?h2lSksOnSYeOrg2R{k6+Ku_|klmRa1_c^>$Nj_?eDUjX4|Cy^TFdUv5x2bh_o`<;MZ&?+Dz|ufcJ{lkFEE~5IYIS#kh~H!f0=+m=aOf8WNfVC z^s%`h=N@`*JQteN?YetvDo(#IqDsFHkpXMOCc}(?T;7YNiv*$-ovBIsHiy4S_laV#l*!ycEVG)^4Qxm zxLqHu&uV)SadEXT460)&+H+iAUjytHhk(r#m5|VTF~&VMU8-zjZQVIC5^mLgw-d2A zJvliE#Q+SRy^;81(S*V*PA53I!jVRu-fteS7p-nIEkR@P)y{;({n!a^irhn^dCzm` z{e*jnw z;H^fZ^-q6z3_UZmA%M5WXJ?K3qX+~91peJ_M(XS8{{HO?4GRai;g6x!`Ss1%*?#;I64|VTp!n3E@OEIqmlsES7uaVqH^lAB6)R9O&!wrHq1Qm4}cf5?RH0R0p!EZ z^D7FqZ;oAaCs!)_!oUzmtKX|*U?5Pb)iwwGwY`8Kb@7 z*ru!PoK_uAOaLP3(UZv%sEXHSp++L{iN)ylAbBxe9vLWriOrpL=k=>?1Aq$C*) zjWUb(+HJ1!QBhHFWBe{3K70U+2%VjsZNER^ukCsF-kZ^EhGXi@U{{xq%f$|@)e1+m z)2Wux@(^{$aI4G3XJ*SKi@WOTY8qzd%3?h@+2bE&L=M!sNr0*d11ql#S^Uvb6DmDD z{lvtCh=@pMclT?IgoK35wK!3OT}aH#oM^FFKb|KV%Wm1A`zJu7$<`mZT61!9O~-TI z)6&u!7#qhXBnYXgrCh@|aMV4md;OJFi)V#KM@RogLQ-Qg{Kp=j<#7pjOAtU@4-aqj`082?`1d49@`<0`Z}> z?r8SF`Iu#pr}rdJNLlQL+k=LT{Cgr_JQ-Nxppo#t(b6JgV`Jms;+oD^6BQR11AC_q z*sU={;*G9XWWclby(S!Nj^U9JS{j_w6#?bttu1G!_fB zbi22mClrJFN9D*=t=oUxe4{e(&60p@w(9wC{8OlE<`bP<)$?D#ai<}s z?{zB=H9s_yl923XOboFWx!%|!<~^6Lw0S}aEbAE>zTdm;1d7JT|Fq5juf6y7MknpW zk|`#qBTb%9Y~0Vcggrey&Mq#rdfhO95YKgZaR(ye=J5JL-99|%8yN{{Y2m%*K6-jo z!1>smP9#oO+U^cYD-D7UJX{Zo3u)--^|uG(8>X*7(2Iathlht3hQ$cdCa<|U1^3fs z?C{%v-V_uRNi@1|fqVcSj>+MD0oXI~$@N1sGYNvB=+Vi^16u>JRaI34+}xSKJ$@E( zlL9N7_#d8DzWwmT>1`=_gyl<+Jj{$KtU$JLb#(<{L*sF854^Hnt6neRAanLb;v4_X z;!Wf7NCCoyu8D~VNCQDZK{{Lg(VwxfHVzI3K}sfPv~$&TsO(cpwu4yP*x-A4ei|4Y z+?Xns2hXonLbJhgIVC6vCd2F5MX5~XcLt~1YfS;r09^S4YaH95)+n#xf!F2UxSzj& zmFJVIgrwxzm-~zmkvymX%RJ=;`TM+uG`ZS%?Mq zot>Qp^vMKDb%?#c+598;o%}q~(vhIBo#{DNg z-TL}Es7eq~ad86RTgW9A%hj0yl}C*8bi`sXfrx|p6X>#`Df_ZF%vjvn$&=x-gNaU| z;?0-+g@XeJKpr?axLQ;27kJd~vK$U)+;7(do!#7kw4))O@7ZX7x{?lL5s+mEDLPbV zflvAIYF2w;8-$t8Z=d%DMn)*8sPcdEJ#N!j?SvjYPr<_YBT=_DJ%fY~@d$83V@peo z&hNMP*T+L(xqsxf@=Zae!^*uPh2w>~)`yc8Fj}E_+aH#SGzE`@wEJ|kx_dNV^8ttD z7jfvl3>_n5zT3^owiK3|nI_U_8lD#So0H|&!{+AZ*4Ec$V|zS`u8!toySn%+N)I|X zI5>hLBWLTATyIV!!81E;y+8yt@B=1Y9&sqSK;1<0mu;|Dn(TH-zkgo`Cj!?Oo0_U_ zbUu-~ECwQZoQm7&WJwc$oZzGaAhe|9touKp8WgEC{c+x&?>ZfVEd`vL*Uar`7_Jy~cwH9632T zKnX*`_8D<;eyOS05GN-m4kySAd`rQjAJSfd0{B*jfPesv7RPX)Rc5`mUtH(`*5m`5 z5S%7DGjj}pE9dKZW0#|$Z!@Fz*lgt5W5foq$WWGRdDwJr?%KAbql_ru%rP)6+@+yfj zYT6T&gmaYSM#Km^OmVp=2p`8he8IOoFG75sKa&2h=Z}C5C?qu0Opp1h_i3sy&9}s% z^6LAQc3mFVVI&r;-1Ob&sQW$71Nl+j>E_w{xcf>qxy&o!aL8g%F@e~*H9Pi>jEahw zn)&Mb5Yt(%u7ScK9M+f*wIBe|HrY!bI{q{SVM&P0!Z?w^Gc03jXdq`FFT(HP2!)3$c=tv`|**Ry}mRwvt z4i0P`%hp1_j}EViD~q4!iT#15O3lc?Q%Z3BaKikFp1u@%B?G9pdlKR$jg3iA2v{^=P5}{* z126{uzq4NdKBq*>-iO`|C)0D>@8vc&HQ8M5$pZQk1}4dfiHXy=y)weFnR8@FRT`}c zqNAe$96G<-&73S(Z-ARj2VFQPCntc&=IYEaw6wHpO~!qI`tNzW4sB~^_evg)=Bfbw ziHVBp1l7aZ!NCv|kiGr=GcaCp-ivJ&mr4ahTmXdtE|>TdfN%%KZbYP{j6eX+EiT3; zC5eE^ArO#A8q$i{!VS@BY&D6YpRLcK+3WMm|h1wf*J1pzj& z6|oO0t!lLaEC3#1*vt_i1)qV@uZ_Ju5kMMc$>PCajz55YfVOo5;)%)a$?=K_J6@jI zfn?u$){FhApk-iqI1G&Kpn&-|u=-E>-Ps`wwR<5W-ALJ+9EQs2 z@`Uc--W^9)I=h|lKm=TRNwpx@(UU8cyCtsir`|r6euo%-S(Qi0@+%^=FChAahc^mP z_x?iNp~YdG7!keE@Y-Qz2Qd-Rc1C>*SO);|05kFn2&ndY@tpd>2qslHE{5qB9Kc-6 z0tbmy+S*_|IoKJ?w3;CJL3>A|**hat-}1lV@{=diGEAt6&N zbIe2>2c!@PWw@BM2Iw89&-F_ju6w!`hGS?i@5}BCsYu3-e!mRdRMl5kR&S#4O;M%q zpR@pP4yyajvXlGWcH--VB}hrf&8a^JK~HdEQCw7%fRRxVI|~BfO+YaJOiiJIn*_jm za72CHUd9vt3l~=g0163!F{JXw>4SEQmRscp`Rae)h->klWcz6MD=p@jNu8$Y{ ziscJU#&ZPo4|AGH(ZrhVak`6ZcnuTG7>Lr?8X_|y!sjdjoAfc;%ifX-mLlJ?lV7(?2|neP?DdY z9_|2UtE)UEk$IXu+w2Pt3p1E0Q+-W!d4+}grlu~d`($!J4*}U2SYBbR+OE*SJ#2u+ zACD=9mXZ>BW&1rD=*WS9Qxp}2J)Es91b|~WlN(=JTAImX!G85h<`b3*`^HN*bXH;C zxNSh{%iYabV~eBCZ5C!y%2Lw_ljT#KUA7nPUGiP)^Tdx~iSpa~zO2DfL8 zKS8|o$wwXDQ?<@z6oXz?--vrYx}33~W~K?hrY9Emx~}CAWWpt1nqxbrH3c85?T;I7y#KW0Hh%>_3h{9r{Gitl;f#iYOrzuC<5^F zE?h|d#MREuE-gKse0a6iR6Z>&?NtSW06GOR&_w~mRT6)do2Mew_D|s9;R(UAc3t7J zJAPwesO`D}7{0r^J4>!urdUBhSa_AT2=MKq)E`75h6V--jTHc?Z*6Z!r=@A=ro7a5 z0*wi9rPAv2SDyg_8>2OV?LlBH+~#DdiM>EvOzah2e8$Ao1sWWHB{HOFj0$1^wK578 zW(+Tap;pkZ24@1FP)q_nYeaEzagb-o~s3a|#aRV>g}tb7DW!0s5SVu508EeOO$`(FE zQ-bD^9P>fmrA{kjkfPGG?*8u|P(&^OsWcP50s3y)uq$ByKx&z9b7S`R_y1&BXgHLR zl$vUHF!lYoTAkaV?z>eC`}N)ZmU$3>lsblniicK>sd*IJlkwGiVytWH6ymx_ZVFG> zxrui#$IDL6xYOw`XE#%e3gs(H2BK75Dz@)FB&~@4jN)qmWhAp9C+Bbbw&lajDW(-xo`Xs8HE}G75EucuvFmVn@B91v2v;2SY|mW7SKmS|b)mJN4X7zS2!bt<{d6o1 z1~%e|NuFR{_j?b8D6d!U`&I2o#OC4Uh*1Y!+<}-|jjTYz^UmnMmJ3v|rh}nzeVgm| zhZWE~F?qKyl^(9gSvTTWuX3HHrl!5Uz4b;nkc{CPpYIQCZ~{w8$kf!;A1JL<(W}#L z#VrS$Q6KgAnXM|M*6;BvJ6r0}$C~f`464e0cSIBU{Ew^QQvJ$2^3~P>&(_Yba||&H zZ_f)oPG8)et)ymfJctyrLk1z^ACiZJ{iI{E1nluiszkj-OOD7J1vNM)EIcYMl4NG3 z;k9@0oO$jJ#yR@1J~Vo!x2cG3U?|D zffey|cL>#(fvljbi9fYN#$#tWl_E`>3i>FwPtShO&*IzcUv_>;d3@Fm$Q&Ap{8vQM z%Q$jewmLpqU4mEt{?kd5KJraEj!cPyIEaPCNY`! zQCbQe(#m!-wj3#I^(xVh@Xl*&Lk$_`uWC-g~^f{Lf*Fv5ASvV5HI9WL2(WKx~&JVY;Yzc0gdS>Ao1)WO^rhh!dN~wp$y%bE z3i(S|5QDWX#O4yFfF&v9;?85o^x62a>}a$>vtnT8q3jI%2K0qq+**Yq6=qJVkd#C?_;#d0tvsHh(gtEJEx2W;&)}Jan~?631$Yl`;;hlFvXz_ zU_H$7vXMrB{$%OtwMuZZY8jO)=01tBTZwVMFa`yk`{&rX%Oj_mX;Rj?odivY6uAd zB?Y902I&|=7^Gq7uA!TI#_xOI`+4s_aPMyp;LJ1UIcM*+_g-r~d{GbZbRMiiA$C2t z)xS!`nJuje*UKVuS~$xD>N3=8h6)UiPS}A+en$6KfQr9Nwf%ax?O6=kz4} z+G)z7e7=kFcw1(2Uo_`svt})x|;HEZYs^ zYO}pvuOMYB`RpfixxPFkc%m&^?_$1aYbJt8BI3`VfWcL={YF|(p9Z~^9l%RBWjSjy z@Ub&y*7p1Lx!&#gm#H@f8CkYZ3zg`$_bSh5H9z9Q>r)2pWg8NS5?1Z&n~`SNgGAU5gvMAnpFA*>7{MQ~ArLD`Obq!EnWo zieqc3BtEOY{%dL~DIuG_tgEYQL;lFv7=D-}Frrul$S<&|y0S8%vs0RsjI0duSS}9a zkX`NXm z()*{U+@3B-*)=^qxq55v>Vbf%X8x~p<}aqn4jldW((Q(m@mpe9%a?U-^(nq+i^GBt zU6$2anZ^A!7@Y5P+TGh;RdHQs9$mF0cy=!3ECDD@0;y6FUSu3F27(@c>| zC=|jNe9S48VE2&oaP3mv9nl8iL^3{DxpRD{k!!sFNf5uu_R8y33oLl+UV{m@N3+Clp0^)H7cRsctqy zOdn+O&<*R-R!)EE5Hm>ZfLDnuiK)S{2$XHV@q&;kz;J=-S6ww__OA;)z4ZV@$^3YQD;mf3^ zo0Q7!HBiN|B5d$A3}E-C&V=O$-wd@eb*cC(=_ivuN+(=jlIezrN7^1KpH=vFxiPaa zi*Gc>^ulcFyz6wD{Y1c=>U&X91SqVY!?{2yOb-}|*Qcj#p%;UcelWrU(RrM{&bO&8 zXQ7`i_nNJT%stvR_jYx0M2-(hkC-0Pq8=%%`a&__jvoDGr~XDvt*MDYu$*Ve%ouvX z3-dP{vy1AJ3VpjdD*1eWP(su6yjB~ z7}79EHTEL`&)&_(H-2xY0xP5M4TkKovUEe70kf+7dB;U6Kjv16-VG>pMho~XH!<(n zXz|5(KnSqUgJPl;%iX(c5hCN=I~@#hIV;)c}S9O-W<;!Lg( z-oc?vj)TN^DCsarfcuebV+mhtihX$LLFEPujrKR}J87y7pt7@_$7mLAv48D1n_w%t zy!rfPhdU#K*Vi<~{{$Hq9l|LtDqfKUGE9oXe!e)G24*tJS)usxaIEjYqy|@i*G2@;(-L|-FK8O4_J_PblQqt@C85`8cw&$U?cW6Ma zFcS#wt7fB?|6F{I7>9{0K;RT9LZ*}!QjqWws{C_qh1 zkBa)ed$y2a-H29(I;H3~QU7C#V4)mQCsS;UXQwcBa{pu9J;V><)$ds&!E)C-I|Zl2 zt@rSx??V2Ol7wUxh; zJiiEXH+tb>Mil^2+;dq@r0!&=M6+NYQ7dJ}hVp{v-zDeSKkM3b4;Pn`v7`3~bmAAs znJ5$0yN-Og3Q?j{fyTe#hJm|h*SpufH{RBJJNJ{F@4ojI+Pm4GBltlCu#-qU$g9#x zv@o8)H9#!pU;C<8<08TB9^^XUOpxJ%wR51d1#^MFydB%|M8JY%S-<;Y4LbQokwhXK z6?sDRHd;cFPjBrRf~Gqz3+U##r{CCsW9!j;P)pEH6mGND$ET6 zAuiXtwkxk7kpXIqc}4aXoPkc}hu>_iI#0$?1vo5PIwAe=X7vhE&ss+I!?wP6TE?zb9t!$#Dnk`!~7$YUJykr_~CI+9eP*P~w8# zQYIk2;7-97<9oF9J&`tShhn34wc!kq9$Mw<=P07Y`t$%)5K5;^@J-nnpO*nuB054UU>#!-F zJre_RUnYhSh5Joh5rv&%$S;Idgnaw7>TX&3(Va^a5GwG}Q% zSZTYPEBQ-%>7Qe|vTqMKKA`$lUbm`6<8olRF1EH`?Q|A71?0ckwdOYg-sOrG(Swte zqg`<|LL2i+6DyP7sgdNluLLp;UY$Zy^6lMYk5Oazy5FYD{eK(iFvJ&yYbYo@2Cb~M zx@ZU-OrVFy`S+w7)G;KJbLFU?uAQV3&+z?`T#`LU`CZ~rwX4$CT{nK}t~#5}39W$> z(M`pk8FzQNzcwu2zE)z<95l%}CsH(N_;8a*$Nfa}I8ta((gB>H6SI^x@|53=s_cUp z@t)eU%b{usWOv2=zG3@XOC0w4)HVCDwUD!4V-(5NHGk+f&kNT(#;IX}o2d;W5W9EJ zMO-*kUuQi99lM`zn?4PftC^G$gQnwXK=$`SX26&m86C|oWL{ogUaK1b?coJDaftVM zp%TKSL$)ofH;X3-)i4>PlNPCy5>`u{c)Y>pXB+&m0NXvpSKr<$$Skz*=4*EDZ)SR# zlnzHrc7@_1ltRx|l_7;YG;9ufb$6$SOI3jIo0Cdk8_^RS&*(mXuWX+wviSh6LmLL= zaOpuJA`?jZN2mPw5vs#H!T&m7Xza&U&!7p$G=OGf-++1mv#szznP_O51BTlb zG@dRD5GqvPzLkX#<}@{B08d3jkNMzJE|@JKYhlw}1Eh84DkPJ)SmGqBiQ2NF-Fvrd zaGe?9QN!|d?u*gF>^ls`K1H@NJKAsG@!*){pc|hB70EMb_PFZv@%>Tga1_Q7L5pe2 ze`!hGnsxXcQIfX`kN6dSr#tF7rvKP2irga6BoE(>8mGB-;H&li{rk^i=6s;X1|}#K zb~AOxNNrtRc{MdWz=@1$W_X~iSiD#4{Mj%ra2mJcLWAPGNXdgD%-fc|nnaLY_d(|4 zpf?mx)SU)(N;t~c$~0%GHYue2reSAxYRPT1r!aen9IcZtt{aSK7g6Pr@htGefLjSU z|IpvRQotv!p$4?&z`yUm0xe{4vu`b}t~w7%5dnPj@l^n5AUbX(dt5rxoLzeaRSw#` zoi``e7*5!*Qfy$D!NHPe;-pRQI2RoN&pjz^Ag?A(qR zI%B9n=bhGm*V{ztNeJGav--QxH5*HmH{J`O*=24=6|9wJ{66vMPp(kpjWyp;yr7|9 z*>P5h-noFj>p#qCno%0|KNj^VY0o)mbW2RhZT0G3VrgoRnsxejfJq=S8LS6Dp}aNp zevIO}B;`_?WF~(u!<+D3zx?Z|v5z+`u}Tj%|MLw}kEP_X(j17KmAU4pEQ~EZhTN(b zZ(Mh`?~D;MpGb<_Bll=G-T#tts`otT8sM;9XBRCg9xsiryPK+paUmH7W*o66eRMFI zyS2QZPEfidv@`JuTFGpZv3PhiP7=7CRJ>KAT zFb{!^R}!@piFwGk7^-E60U56_D(zSLOM~Q&Wd0e0i4@Ge8St zer#(=)+9zQZnv5K{n&r&mN{UqJQ`5Qo#!QGN*{~tso&MX6I)eLVt=0XV%72I4VDmS&yAS*E zql2>zci=wKAxF zum#P3 zo~<(n^!p+c*R>dxxPPtH>;3fY3ri-uUapkf?UV%Knblcx4i9K|eZ=SD-rI=Q`Vuz3 zFBdlLZHz+#pWFC+=Ub?P_*!)E%nQru1n~G$N%?YcKev)*_Nb_k7VxE#53%fXLe1Y{ zXjD?L=257L>RK*dlRV->gR7=`75#WY=U`E-$TE&6KR91+WX70M>`EujlZlAVS{F4$ zccjZ@Np=a-J`=>FitwtPR$b$mAIxBC9(!`fjTvTxYq2yVGrDDl-swy#QlPJUQ;Mx@ z;xunV8=f%t!7VowL@kb0x-2bMyi@aC5nlM4GpBKh7nt_l4DOziWu#&93iFN7fx=|@ z&=1bdq>H?Nf3MOxhMkGWiEw{;lDIwUtg)#VVw8f}BBa0pHP0sB>bzNdo}laAr^cp8 zl`Z?oGH5(pF*|8>p3XX7bNiHP+jnjzlpmw>ES456a8Adgb9?%)$T*vI5YG{l>ms`Za^w zHcZa34>^Yt9hu-_lB-Nc9DR;5g-F^{GUq++9H5cp*jZ0t>v~mFSxsCl{9(onUed$8GY(E;A?j z_QGTIuhROJGQ#mj@gBIZiY3fybtM%}%krQuRde-L82VfZdPNad)LNJ3zC1cT%^tdf>U6Awy@lqVVSCS?KD<3l}<3TaSsS z$`*lk4%LEn6@}cM^=TU-(VbD^QLm*e;%%IM%p!y)W}oVA2@*Pq_K&T zmoUp{5Nekhp_=lMfEy*M9-{T0REbb;!v9mC8`5A59z!xWri!I zcimNO66wq7VdR2Kl3GJ?_(}PsUAauT$SR3%w#m*SDUv3uL`WK!F>`QYy!)Q+`h_4$wOo0JRLdLg=m0|FU2E{ z$aF>0zxVF#{2F)?tz5po$Cuf|-g%}YL6sirs4S=!6Q=bydRIk;k>MwGWE{8vt5j(~ z&Sh^r#EX>;dd8yl3ykC4cBUun1*BAeZM)}Ml|eRt3LHHDae@e3i)6rFE3#+ytyO)Pz(!nY6gDKU0|VdWixVH84N5 z@(!9C0Lj|6?Yj9ztjtyuSQMUMOpI>hVIE<#h=(^zPhR2uQ}rj zEJtZYMAG??KKKDZLWw4`0+zu!tG24DI1lNM!a~ddKwbvC=QhBbBR7)n`xi6MbXxfa z+aW4l%7`~7?x-vys^yHAII!itZ`CIcMhkkmNCVAlJKxl{{wb(@7M)Ls9Hu3wSPm+^ z%71#PK>||1ix1h2e?Ok|Tvtfe_mMhR`ra4F^ z`retp%E&>-3>Tk_Ytwo}xdN|2y}>L#qGnnxg}tcZM@oajcD77hXM#C;)51;E+oE3(^BmgsK_9O4a8Ea?>~Gn0n|t0kQTsGS>M<&K{n04 zxB)ZOWHEoya)>jaO#%J#UwaV~mrQTx-y@cs%v_%h)1q`zBZtWs-D5J}{oNFY!3n8U zqU%1?PZK28Vn*q7H<+aQSQErpP$@2nNVP*PKQZKxKhCoMAUQSaHc4(b$v^{t1@ab& zzCfKl4M@kW@6rf@yPt4}vBKxB`X3nSBkpz4Hp~()_&0Lub~$kGN!GTF)OL<^m(ypU zNG=`7ar`PR?tj)d2oMl^Ry*}dU?g}q%v9C@aq^8pksTfFixYdJ%yfgvn^6x-S?w2^ zLYOjj5t0?!3*Pqbzob*rWIkar%*598jMhwQJmTkyk>jL1j=VYvwa)+*$P<>qP_G&? z068*NRTSTuh$oYx-}47N4JUTRtU|^wMa}y@%%be&y7=qrf#v3@`M^?lH4!*m`wn4! zX3^I_$n=zHZ|LYStEx%QbVz4nh;okAfp<*H;^cU^`swJz+xvc7HthW0w%>PM96Elt za~!2htJN29Frf*nMMp2ZB>J}QMX5om_vO)Lnf=oieu?Bx@6XR}H(?9Efp&_)DJiF{ z_d2~-9i7WCmOXGXShu@n>N}6>#oRrEBHeIAKx*RnskY1SGfQNWcamI2!EW?Jw=IvHsm{MFMiG=g@9igDw}#H)Ug$j7KtEfQ44iD{tL zXSdS#YnRZ9?}WoTFyg)PP3MkETVN3aeD|G=F*|FyU&a4Y=UrmMFD{H<($?j$uIs8~ z4WXUvos)zX@Y#Yc+nOloG`5?k{D7GJaHdsLlrGbRl}Af7*-BWPDJrf?D=_wd%41Vp zKtdTz2^l}qeWVc|kuKO2-{Dj(tXIWxe_q{yuyv0paFo+9Z=$0$db*g>z}9pUY5xal zzUmdb@&m8u;9Z_KC=xzy&wYR2eT173@>E{w>EPqi%|n|1%>{_}kCLlQYzc#?%jn1B z4d~)=r2wK_QQ$Y>@`|ib6TcN=Oyj8)nOWjZ-n)xwE zQJODbQ+KowU&uFHI%qOGi!d0Jzpk00$uI2YZ}{_I4Rdbply_<6VKg)71Advxd9RtC zUytDri>Fq!1iP-4DNzSg?DKgy*W5bY*HV_dnV6Sl`JpUMF6CE(>`T@Sj=@ywabc$# z19Hx5vCl}Yy+WZyxgB+^;@`hSsUf1Kd0cZa@3(9NXdc8_Cy;wE@fkxWB(xFqrA&PI z3!PJP7OLp4H+VfHN#8m&9cOT~5KrG6&dvCKqHf43l~tO`sX^|lxCGSzr!`5LThsA( z2eu$F>zpOB>nlnVOH?_Ah4t#E4w9>?9ZLpHbKmZNC@)tetX{emYyJiVt745@s7<>raF>Z@xh6H z&F#s_Sx=u=)K9l6qtg6h&>04XbxOF6bYfTfKp#?tZbf8WRy z&?NY~3OKx7fQqtHyIOA6gXgw2KD3KeLTvGQsURwE6Ft?`j56{Na(&aS(LAgD3O{{S zg9axpu(jS5XO+?OQB}}sqF65?oHMK0-CY+i^S0<8;`z?}f!w!T-jB`wvKu--elK=$ zbw&A|Wxn{9K>34n{^CbPMFldcNpe*nu^XYFN&sk(d6y^3yxLJa@cw>!Vyxkr86jf} zkn{mA6291~xPlht=TnnLscCB7e+4{2(5C!=B^%97D}7SShe0O_r-yd(hO`F5dZ%uC zj6Xa`73B5w!#%FxYW%D&)jc;4{ALm9^ANtjl zS?uA(nMHR5n~?tQ<~+XgV8Sz|0F|@XmqqcBxp}Bx?l1kj8&XY&DFv6L$F^wy$J&Di z4JaR$R+ks&{!C8x0zPDzB+XC#+PIPuHt+)D72p{jtPaXR&7&zrdV%8NyjVdof-Y@~ z7S@TWp3|r1A;o(ZLa6LQr?!M;cQmksSCn49qII30a+$=As=e3pq6kpj#4ffrJ$$yk|k{hpfA4I|0-4(_#!^F8-#?)U{Uc+ zlG=9@jxpR1g}kvFXG5My)iBU^myxII3AtWR;?LcA;kcMO{Y&W_Oa`3Qp*>5zL%#Up zeKUOM;p>u_oa@{oEHp7XoHSU>)AX{#`+SF+&o*h0g)sP<11IS6QYIR=9}c% z^Y8?3w&{nhR?}8%5MGUNij*X?c!f)YuxK9h*LXfdWGg=Kx!KQ2#Ued6+7QuYveSp& z;>pUn+XW$@?~GoRwQ`@)<2{G&E^nLktHKV=kCaWt%F}Q5xvlCOvXUG4{;t9W$hLWs(duKTApHGy{Zc{v>K=`!I=QozjSTevjty2iy+PcmnTF*HQYQkx z-I#qo^Cj9N1}+7fNP30ac<#Z%4P@z-nt|-=i|i|w=Py$rH1HAJyNvg=bwYZ1ITM#* z^3}EnzmRkH8LIh}__U`;t4T;7n{ZhRGu)KaJG(s*Cw>H`C;xW|FFyELxjKzW%`(JV zF%eXj2ds(J1o0Rms&2A~lc{-))7R~7nlS0|=O{guAR`Z{GNJ)tFb@HAcZeP=GRe>@ z>_63YenG)JAVB08DigeLukZgOz|PT*hkS=f#{^Q2x$GRh;DxHby_d< zY48WuIPElj`g8|9rQjfL=fDC9>jeZtj&S-1;JQ&0pF=Zce0?BaBm=RNtY&;PN+dc#~DTm>LG=0E#|P=AI?_#?W1B&JrG%QFlhi2+#B9n+VUZ zk)hpOM}R4i=bkeKqqvzU|0(X?E(?A9ATXZDB>~9u@F;F4pOYKPEbM$%4lbT|B+u9* z6)rp${q%Z0rOtCrxr_AzgMl5MdBo&DnlnvyCxGtOZ8yj)R4 z``HTw&qexetJIfkPvNl;%T$X7m5QRGo4$L1kgtC3Wh9=yf&7|3b~mnXnF%7N(vo1- zG&VheeRdNbx1EvZdtRqB{iO@GEoX4!|Nc2;-A48^}E{&YYQw9Qr3)!Tq* z4Rvv~R;O%b^@5j|_ZH|4#X_NOlgr?bg4WwW(F%G*+S0I72D@q0wwV)d+j+ORYrL= zR#sO2GKUj_5saLi9D1JtU!_ki)L`6~1IAqeK%K_S%)AHw4hAdtJg~?fiWSM#gPH?i z^@54%H;)pS2DSm0gj;(a!av`Z-2v=P=Rpx7|G_tx5ha^Y3Mo` z`Ir#$t)_-p2Wn+wV+KAZIX5hu378}#G&Bf9;3h!fN-HR#Brm^E$Wpp-l1iswGg%o{ zS0@Pi_JA&*keFCz(Vu$icI+XH{!f5&4}mWL(I@(`B8!u3fYEDWwLI)s+7nKG(F6hsq^5?`$&mv`t)}8oYZeLH(lXeyHIY*dEiGVH0i<_0K&cSrFGpEetnb{< zd+N(LbHUUCG@(G@*Hv>J0;Z=g*x9=_kA|nG`+)d|1Iu)LFayZi!DgV0!GM>K15Pi{ zecX~pYCW*No2NJUrVGzttl;O*$Quzb64L{-u;>>_U(;}<?@yrZf$J}nCF7K zxq$Hrq4VqA?bKY(b3VjF%V$uB!MO!Ae8T2 zTWsww=HX=kzwro{Uw$=F58?K^whwFnL?>qm|-SB6HRQp^Oe($C{W~?F0)5P8!g<<>%*rE3PU=dWTqVf=Eh0M09ZZc(BV-7r^zM01}-CXeR-h*oWw8 zUTUsm$209eqodN!&Iey?rBoB1SC74&0y`iL2qDqO4tT|Z=hl#e^(PS<$NsAY)U;!} ztAH=ph4b6gmgVCsYEfq;OG`#Llr^WJAr0&(tSK$Dk{Jk+K-hlH${Gd!xWa8)mrjmU zQ;($Z3D($3h!8XlR4)9{ZNRYroI+#Z^H5n;WlY>z6YUNfp?RWmnS`OTc?%711fwAp!NFw$M%N`fV_Uq%}75| z6+N`e!T*`Gublpxm8EM1Mi=Wl>pLeI^ONVYmS!Z1AhKL41R4_q-gbKh)?clVDMN4r zL^E+p$KYUS45swpUgd0hHCS8b!<@>&#e&n*-`~IZfdyEU@bK{=W@jmp)xJ~CHG>&x zX^QIV__ru1D8^w?fcEH$zB6fdA`%p)z}Tapqy(%jV5tKU?LFXXuqZl9KS|=q@WV>? zl1vha-2in+Df#<%I^9&g@iJ!&kRa~`w)i1)>+0(lFw+Se>62wB6v8JoPYDBWf@YjnIdnS^MkzP;^yWA zv`INuq(Ew)S6KLAJknR{r;3}~%cG;CSG#=hcrkwvkHDA9>vt>%9}mp&7G|RVT!acI zHz8T%fD()Zc$Q{>rcB1|3sS1mULq0;_5S{WMpxp;%9}Rw)mOpKO z{P+F0O-nVU_&=Bbn_S~Xh^ zp@lm&Z*vXXI)QAs0-Oxzab2}v?_PWFdL!XdLMZucV{|NyW`k0t3kaJwV~p_rJUAHCF#dv&u+&=^Y4AwCSeSzpD07z(SkNvVW&)??FfZ<^VKMZ~iq8Klw|7Xtr45&;Sg4 zAn*hz6b!k;vq203xwiwfmurD;vi5W#Vxr1g`_etSsyNN&=cd(%580KK1UgXAe5U2& zBhrB~LbS6%$|>BP0xm3!Fk5v^O(`cQE^xZqIPyzN83{le>m}ObL`cZ{_fLX9-d{F^ ziUeFSo{aT7mA{3A(8-~8!eOwN;JC~9cHX{gIlwQlDBEtr8BH$m$y`U01{YW$027~q z&s=O^(~)pn>;Vn`JU=$f)^y74-}(-N+7Bf9XU$q1cp=7USDy-yW5Aj+0n~cpb~~BV z^g&_a@r8w`h8_qhG-6_z|GE={9+UFGP0Fu1lW|PA2RtEA4txVpO}8~!*1$xE(E%Ua zapg4r7Vx_skZHPmdri!AGIo_F0u|ArUUN1R zaL7VfaAF05RV~>>r9<}&yh
|gUJ~Byq0X=Io#CUVRsWb9tPId@s%r27?lxw+X)m>_N4LhUR89~uxcyQa02UydHNo0RzlJ_kB3DQ9PH zsJW7CiKGDSz<1C=sa?yC08vIZt{vECt*x!0+a-E>3cx!BkWK(o4XBC0+=7NQYIt&z zRO~8Uz?q>O0=}5EsVOapt6-t2;aq4`S^~3c4_*P*VUV}KZs|Z%zzzfNkVE=%79ASU z2o_+j(2`9LVak6y(}Gi@6W~t}XFU%3`7nHDLC>VOxAzS}@W_Y;Ivcub@tAf-;#!8z z(){J~nO#Hy+b9`J%hj4{1tX|Bjt_vR8yg#^B%NRz{?p_iZy5vg43MJ0YNObQJo1V@ z@V8YRq53L^|NebOH4ZKmG~ZCxuHb)W!H6PDi}l?m%mJ5$Mh*`hVHz7n47Wniwn=n& z>+TOYGGGfRkDB92>qRL$0G`Q3ya!d51bbWq_T>OqX4RDXBP%OOyz+41bzgP!1h#i z7dsYsylWab%fPFz?W=tgiI~ID%-#8eGxXF5@S|v(>|Y^xpzKDRam$^p z+|AV;{lwS*;`6MocJ1Eq&+sP1qbICw96(`cf5{uu)pj&?l#$gPPTqWDxs9*}c?uY? zqNUWfUjZ-yVKI1-A4F?yeaHLt;Hj4mC?7Oj0BNtTu5KZxwsTSoe8ckcI4~e2??MX_ zz_)*j8O#qXf?s6lVX5t=M3@SZ3ru<=2OVr1cbjUOQnZvQzj393DJ~jo59(Ok*hCsB zkQ5eURX27bw9tU!=g;;<6u_CCV439T@JL|AfItWq;swBmnZZXSDtcgJX8rt$r2_?x zw=nzoc~Nh$pCbraUu$ZTcg+L$B-0NpZB-w$M!82gEr9(IK-mD4%6<62JnvA0yfRr7 zn57SA$?Ri!2+F~^;YSwtK{YsU21W$nbqVPEP(S=Mr~Ci)%O4Da0blr?37e}ettXh?xg6#bBl4%!OUK%*+1T#L<#YR;J#cOUV_6ue{`U^4uCVZQ(@7x z5Ak28a$82<{R4d1)*!6}sTKL3FRo8JfCg3hSp?~{`zFppusqbf!Em<{qMYYM9x6*m zgPG_ct)QfIUlLH}H&^OQ(_!~9U!A<4_Bp9SW%4Qsv0xGe(8;}@Je;X+osc3Zs2C9- z8UQm7Irn`_4FdX)a=Eh;$DYCK3g}HU?^_D%4P>9E*=A}dH-XU#DCYGQ2ws3Y z(o*%mUrsa9KWq)^g{Q!k_+|r3yh9C2O6G6*doEn?M-wx%V<{25FqZTZ{4@?#l9%33 z9z*rDk$Iv9zlMcmYZx|t#<_;q54j{p`Oiwqb=Y9aJIPdLoJ%Ne`5!z@n(?{@G_k~2 z)USX;R8>_K>H^Be&0PkG0Log`Qk6J5KxSRr*>T(UeM9uqhwpLkfY7#6hck4qcQXd@ z$HN0t?U5z(&{OWYPW`e>!+EQ5Dv|F+q8Hz|uiaz6L`A7u62B-NQ&3eM`gZe-fFSaN!N*s(x*P!x#*b5i znuADgAmU}u(}wJL<2moro|3>}lC|?N#_!@0Ot>Oqs`=c`$-*Lfqp?mUC!Yt${&$;9 zlN)|ne$U;TQ>Lgc-P0rA7+l$-z{S0!T`>t61)`$as)Uo9#Uu39j$WP9)5)2f{f+Qk z(Pp0?$G$l$%RCrtK0o~KGny6t`+c|s5<&!`?&*~uXf!R{@AiO zqPx2rM6cF)4uChA!hyAnD5!?u<$Gs7Xj79n>gwFN>{y>17;r7sTJtsS#agTFt{x2v zH{im_b&}N23e}t}Em2ip{k!AEre1m3ksc%sE?1l&#Rq;Wih3dY6O7*UUi0BNBgFLk z$FBE04X>uOqIXL%zSXmKvl`V!!|mz=V*ED=xgJ|6>V8aR0{G@VkG#7(pJA!{ZygCx zy?}^{w!{Xx{iC)8`7+X2htQyS=GIbQ zuNg|}Ku$hA*{-5s?&RW8Xxm$;6ofD$^ZsoB^03;z<>g@*jK!Lh7>t1uqmxGotm&Q? zlEmZB$$3giV-DvKZV-1QlUi%CIg$C^HM@a~n(kaBe8;mmRisqAVtFYetNMGMwQ&~t6ge^J<1MWxr@e1$qlVErnTeNvgeHs_8!6AE>s$V0t- zTzo{~aYcDc!{EmcSd=V>JU=o02!+M&=3kd89KVp<56rRef{vw6D7P;C!~iAZ&!1PI zQKF=z1TdIKQfA5K`&4P_r__WI0L6k^0qQReP5P$~pGHYz{H)#$DBV0y@XIKBZ)-g# zgX0s;n0fZ1%JuK%y8Vrmw+wCb6@o9)+uus=M*XH@x-x!_*y|H7T&kZyH0Tp6 zQ1qUjdq&sYjX3oObs9$6Mn**GR;k1xxKzul{Meuug8GPm%huKw-7ZK=BX54-y5S0$ zf`OX}h_hwp ze*S9riVMzC`lHr-j<-v+{HI#7QLB5iKZffQj9iX%huk&qj0FC8JZU<6yO*BM75EgU z^8C@xodh&|g-9K zC|frD2jxW%H{#renUL25q@i~ImspEG1?nBht5P!^Zr!?dBPS`Yfzg)SbfLvx&jea! zC$|F!@EH`1DEbYyylTTMe-eOm{4F1`IPYAR-!hO?=rK2obTZo&;->tUzhvVGZtUyU zFCxp{_EjP1AGOLJiQIn$24EnY*C->w!zt=jKy%lDRrNc_CHKbA-~0c?OSOyZyj|5s m04YAr5iThHyNKc&9QGPV!}*16Nw5^RNm~&6!-i3E>+zRjP9=~ai z+TYdH?=LYZ2^u^4ux|?m27hkE6ME!-J^Ho~Gfko2?O;k@T0eO#Oa@9nLvejfN`jZy zq%czN;i(H@w0`=JpK69Rji9t(Ga}U{8UAs+`L}8`P_9zKmvUnNdPE~$8Us!*vv)Nv zlMAitizZots|A-i?7{C3qZ9G2=?72lv1*j9arua}?y3a}u9=+uHqmUO!%d&6JaQ75u*c{h#<=Kop471ZzCRMLKJ7L+jI zn{1okbakxPB6`ufv!Taae^9q$FyYRpXI(e^lD9atK(wM|s8mqzeG6WV4Ij>%6~X9T zwROE*68q7^!=$+4SETLDhCvr=SeLW1UrUU9>L++24lV5N6$Q^rof=sTChvT(%_DM7 zwEmFQH-l!j!!em=$X$Oxbgj9kaGwItHZ1c^`nxB`z2#2H9xF2LCYMcf!&$VYk}8co zdt%3@CXAV{%?fby{#lc?l61t|IB&|NbIELpw!)#;_KxMgx!2R?Y#5*1T&htM-6ngk zq(@ll??^gp>YRP6!0UvAbr#!TbkZfdKe}kzTLH+wM;l#8+E!eu?TjsdQXU zn<7LXu9x?meWuR*s?K$0ZIVpdmcv^Ab>&FOZk#v4hlxw%%*E%&mK!S$LsGXl+V;c~ z))P5Zwu_M&`YiJE+C#06eoHEIDDH~WHyJNm6Q0(g%`zG6Si~}?lD)<{Hm#SP6mW7X zsyw1h+VK!<^D`tPq@tE?HkW-UPp;KGy$q3bJsZ0iq_UfnYgNDB+ z8P3&A$2fvElP)`ZF*9N!JVl<;kao(gL2bQi|R}oJIZBrbacruU!YB3^TW1mfV?NQJ+L$4-m@B%g+eD|9eH5 zPgQ1}xMH2R=&p-0QbsaotWb4_nxA2ptI+((&bzj~0n=OhQe34we=}Y%N?h4vK5o-_ zc0<~FYMC#Me`5{B-sNt%U8E8b6itk)b?GfE_XKmYuP088G3n{oY*1sL@q|syFm95v zW=5MlXEKr9ARZ_qVzLN+`M7{9(JKDXP<(0lKITW$pW=Em$>hCEXwMeR17}_R?5ssj z?dN`s{~phopUrxc$%K`7%EF-4V|aDv*ma1~^=ew}c8==U>QS6-QMkW_%Tny{t?+Tz zX&!!>1p>?BC#DE_Yg=2vEJaDh!Zax{%xXiaF7kK8bF2uttOP%slMr0OO**DUDo#?D z%&p&)`(8W=IdM!w6}25RdWtLCLY%9j7e8Eh-*S;eOE&ks+acrjJ2bgtb+T?mNP$C3 z*B)iVU(Ni*7Tt=qiUc%e7VB zN1NiMn>M#kqS1>03@j{~&Q$zzPMd9IJvpw@;Lt4Fx4%{~r`Q|41>Otm2&Ae-be4F; zo98<(=txnO{_e+(mZVd>n?@C4el)i46a>~35=UVd5fRtU9Xt&=Lt4>^03 zg#LRI>0b}8%N-UsHdH&Yg=4Wa?rK-D{imjFV4MZZxR#lUqeNe8ZtID zZ6C?gqNqCOt*WY0ke7e1t$m+bG~{>F`&)i~e##bPLV;&FBaPR%oR)7-mRsj+T099& zNFe3r=5A?iC9Zxf#ApAVzi=~4B}WyDjECUOSFtd>+qV&of|onEe0+Qz-QC8`{@B{p zPC?219s?OtL?Iy|V|5;!KYskcRaU#YyjU44qP}tChSgMMcw{8OjMtG4lTNj81f2}m z>s5k=i$hXGeSLkY#c*(CB^L?1Max#hmF#G~&SQFdDn>@^H*oQT6}EcP($ebXR>Y4V zKaO&J<(I8XNJ!{;{3qaix9jQo$x_Nut*xP9(?VxN(1#C3?H|d8X9V7b8N|iK{aIV< z^0_+GBVz~ zCwsku{VPt|RSxfM8!n=onuH9EjN*7+(<3-IIB=C+N=&-V2GTJpJhxF07G)%FN=w=D zb?a_EcX#KBj*e!tnTqY}lP}d|jCrb;Sy;GTZ!9V*dhOHa&q8(X2jtsk7z%smmuFi9 zgoG?MQ(WHXJ7QGS)cs~`((!CTaG6C;D~gIrO4tMC7Pz@zzI?$mQkRKmd%Tl-KT7hw z=-1Tj?Ch3ZxMD+V>u$KvURd1=U0rhMO+H_$U-OWi9c`J;)_a{AFD@=-zyE(K4w-ZRc0n-o_0PBSl4r^Z=WR1}Yt z^g}=ZI+PkZI=acPSl{>WZ)oO4zkPcxp3Pj*Vl0x5j?UjS#fuOhA0O_^%6N(Cw>8~L zJ6{g#3H?{Egx{fI_n8Hk)MaO57#YorjT=)E7;Medt>5M8zV!60y^MTDMfLWZQr73> zWL=Gb=Yb?^eW@?gv$7ojG~Iv~V@=;z&d<;1c|^|VtzO|l5r%JMWJJPYB`z(EB`Yf% zLe3xmwBdZ9uNzOONRkviA45q==?mI^p+#{|5-+P^3x*R987Zd?o0FrT>zo9x6ovvL z{nr5F?H4YTe%X)yCF0MHZ2X>Up8fuISQZJpO5ORQEQUh#&!2&kYX;L7M#k{Eb*t=B zUIAN9X$;Em!C2L|{%;Axf6_evKWK=!{$u$p*(7A=(evDSpPHa(1YK6(>f8~BoKHMQ zH4pYsLBzsIfB2hHz~8PIM<^#83V~lSdfq`%Q7Unh$ET;ohONN?-+NnI-xn4ZI*fYk zv=Z4nIpx|_LDfj72CPjhbZHLp<#=BL!*JnJ{tET7G`r&E4YwzxS zd)WNurtY`bDu>J~lNC=lH#c3~+*FoXbFI8i_y5G1CO>ve3ifUgUV*F0)2{m5(IL*` zye=L_&fmAE#d@pe*NBY|Oj11a>hD-O1;n_limp#e+TIPR=g;efGY;W7$ zymjkI-ml_p>|`iI9F9b8#Kgo1zKi`qWV^h6 z{d%FxmTtB4hPxaw4h~MPMv4DBblhUoUUK)tb<9RN!3*IO0k8cvooXjcDXA{J$%(PC zLf0L`YuBy;m{`!eIwe9Ra9B5ukH?98Anb>huS|b;tNx4$9p}D2G<;fjY=n)CO|EVo z2`ejWx$W%7vNCo=oyU>M+2KZ_fLHuurA$Pm7GYyNyCrP2{=w?-{@N&Rlw|AKRzoi| zT5h}F2i8*y=V)IK|#0&lpxR?slFu%P^>w{>zd zf#2h>&~{d!{$!C93f_FSo*xATg+aGA_RE(Cm&fzCt0Q^02vX|Fx$NG&48TD)=BB15 z^5xj6Z>3&jTy_tXGNlcEH~OA$H{;Tl$FUgSe4>^=)S%no&EFh=+deW94aWwbfI#^9 za|BF0)W*TVh$LQ@)zK7YBQy%H{X6ngx3nv4$izP0Pc`m}K7B24x=f9RbH5{9BEt3L zZ;TYbtjm^^dCEZmg?C4hQ9A}uly|rSh+sLlrJkg&aB4B+?nbHUKHiI+ve^p0`{Z~f zD}@X8;%V)+P}S>ECw7iP7?8p+z(qtvPK|eVc77#r;y$`GWYjDToT>BJ`x8Jhx3uIU zN1WohiwOhRX=^4aM%O*)>hh@J9x16>_N8i`=AHZZrJ>Ogvzgttt=&N@vlup9=m@8w zq1hhMvbA66xFZ^J?*%MyXLmPEufZG6`yli%FYf;Se(Bg}zR(WQaLIFVr_$1>l6@}S zpf9(^mc6EKI_c|N+uJQ!=AEICX)NIwy ze+?5zGwn^b8Y}cY*;`r*n{ElhUm488h50b*bJ8`xy82Vgwyw3%pm}?Dcdjjz^i)Zl zh={2E^3)Q}uB4R}1Kw5r9~VU?^W)MOIkP z)W$6(d*E1FTIS~EnGa@S!?^i9A0|jgN$Cq+n#Flt-J~Z`;sYV$Pkywe-jpn<7$#cT zjm4g%9NXsIzg=B?vK3K>8Wk49Hz_D6ke?4*Xg*#{3)Ky4CRbBa1AyN11_kvVv*C3z z9;ZhKu~UFi+OieCA|J7>J0J`t<;?Fp%FP_OSB;VZ@J1+WFzWOYP?PJ?v`d_T7f)MT z+fcsFS@LV-TP1QkA}U>XsGw)O$Qf46zQlhh+XuDAVKWt|n$!C0R|w4F@c4L5!#eMa z(?5Uy{MekXK`AUQZW%6l!1|v;(IQfk`nuQ(cRr$#PLo$ z1u>`1eK;ozi;Jr-=PG8s=V9z1tR~At!vrty-MV$_J{eh1NJwrU^U81z(Z`P;t;UOQ zAYixvqCtp@i}%Ig-?{T5iRZPQvvXTVM<7%t>h1gY&l}qpoMWTP3TAz-yuKOFRNB8o zMaOxj--rOvQRA{j_wZqWfY&MV0mSEsh!eOE%YekHtodHAD#vZT9B*GK9}rlZu5oeP zTa>9kp1Xx}pR4gnL9LL92_3*g0j&y~jKacC0DR!|iF$hr6x8lY#+SsHpgigTn-#hegT}0!`l2%L}$q?fvS&iqm~Q*H17q z%35|0Hzs4M1ziq5Q4CGb3ukOtx^Y;IHAX&GLL%$o?<&uCT;?~60rfrEpME4~-rm{T zn$g0O;WYvPrU_aQIluchtl*jF@wP{O*UHLD<2y2dJP{6S`70Ldj}4rh*c22LPH}be zRQDz<3k+;+ai7CrsdU~Tp^pj%ggd?W7Y%yRK$r{?$wI3$GB9}I;K0%y&yE`0uD&U7 zfUt9NqG4nVh5hDvy($cqcJP{jfI#2C0HqPYavYaE)yT-mJ!0aW)trJE#~aLof)oHy z*y4+?1eDWrYi?Y>{><`MJKC}D%yc)3Q>M15BrdgS0_3Je>f|Ou^W#(@k_0dak za@njW2sk-8Ka%mHHA27H&kBR_hIOColh@f{_~*}WOG;RwB+c03Z{nuUo+M>=*wb&6 z93CE;tPEt_7xYeie~ajIe7s~=G$S{VAprpa=q`Z3k%MP@f1lwfcB;O$8K$0W5|91v zLMKau>A~7)LEj~bWax$gigXfBl-u4SvV+1g55T1u2~#;aIYG`DliuWRsJzb3&Z?!S zUF+i|C+j7>V+}rn09cP^Ji^x3t)dyV+Bj!Do5zZbFtM@gvN*35dY(8$Kh^6A!heW? zjZMqO7CBL7iGTNQE1-d&#l~H(d)=HGFr0dNde$e(ZiR|AUtXM5d0)5(6%PyyAZN*P z|5sRj;m}2%xQ5GQts5&~$m6p!BP**AXwER*(xHd|0L8&&8+LpjBzq>TPF zy+NpQ`8`y9?iQrAr&FD2lIN*@fX@OVcB&f;T^d-xQll>_@~pHH>Dev*B1V*3jW@w5 zs&d<-Q_I)>CO?Us_dp~SzA1ac*gS%<`7tH>Py-rn0^HiUt*x-AsJp(tzEDHAfm#Du z^*GuT$x|(HKd_KZqlKr6y2Wd`YZz`j~v_yH|wb zZxakyJ_k=+J*YS~VPc?a`j)>b- z&jvR<(((p{jDx^|PL(E$Lbs!U7Fz$ltS%?MDReanG7WA{4E}~Bp2K{;;o})hZu-fY zW<7&f=|6JzERVdd*2=CPJQZ9^{#y_>8(dU$;#HnalGRjU_xqUT!cqzU$$g8efs6~` z#5K3bnv0;m(CpBVl|BnDplqZ$)v@uB{KJXaJb3CV4Ag5RF-$~)=zI(gE>YK`WwWSx zA4Yx68ttq7Hj0W4zl&siS2yKlV!nRMkyl!pftf|ok(%Fk>Rfu2cZ%0GRnl1aEV@~e zfmKn>3h&d;#f7n8cbv^vOH&W#gdQ}UUL_Fu7c@;2%f?OK2)OhsYD>h)^GBukKhl%u z$0j_Y^;K!@5jpufxRR|`aYIe9$9|(tWOa-aO@Df8urfUPxlxvBWvnZn*4pX*3d_6G z*9k~ zysZx}I#YbCUuF%as**a=pQ|OCv(MH08ox@<3|MN|)bQr!PHe>Qs)~0qb4VABNVDRDXd$@;Lz1B7@nuE9F!f-f^z(yTvFrf0VAO(y#&sqY^-c2PYg zPxGE$9QyWGvci-OwUs|8pNvi=+gd`6`q86~whZrto5SdRWz96AIOq4tc!Gm>-R#FC zt4mW{XLrjcsBn_Bzg<1#*~B2$7#&*|j3DL2H=k@m51sJi4``r*bAdpA*D$|dHEZW! zC1bSoG4aDpbL#J{M+`rWx;8bm8}5kV_Qo)?mQilEILs9!ej7u#mvXitQByKPDJ;*G z8W_fKCOgM63MJ;})1#w)@_zQHo3`OWg164B=vU^}Uqd8Y$*c-FGLn&Z9ak_s-d?`b zw3eP+6i7GLHt5=nOE*@m(x;_q7#uhsk5X}yR-wMB*O_f8>KTl^r)9^r;DHy>bTE0~wTV5IK+x-I zWMa{p8u6s4=(`kk7LITW`J)Q2GAo^Xf==8p@HftuqBQlWvl>iWA3yqKd{*z~WW)P$ z%{*r8^|B-EBvz#h)vY91DZ6F4(^2xxnRHX_%r6fD$aPG9|Jjrg{ou2`A!o!*S`=ZD z&wu>H{i*W^_Pr@fLIg<}rl=^1lP05Aa)NJ^8zTu$^yrs} z91I=}KBJG48FO(X)Zdo+LiR&w&^#_Ea1QgwCV3)05lFVYf37$<=l0!R?fhN6@K=ru zjfmul&*CrK;f^m4(ynGHOFDj9PfU{uILEkj+udt&xzF=B zC?9erjUCTdvb%34ALKCvw<{Gp*nA3qjr}I&(lw`rhqL7K!Ikx4;Jb!Qy6974M|wqy zH$`nB$-VVLQ0*O0JE)ks6VKk?eWPjpD{^A9W0#Wco zrqF8F>=q9Ls3NqHyg2Ov8(p-CjWu@UAc!*(e^iDPOUqC)r%S^2$ZWH z0AOt&YWWJIj5xqiFvjmn`T{o^+$+SQ)bEyE4FY|h?ja$)_jXg@#e z#b0_2gGFUeeUfK;`UfqS`yB3(cc(0gci^554mM0*jg6~we|F%HhkLzlMY1d?sI}&f z>m)7Q3b!ph@D@6p!&YcQIw>a}(klVo5mldVORFBvvWj1oA5lX&+_tB@ZJATeHR5&? z_vnYPHdjYKtEJiEM8y6tn*8+h*5g#EEv=NeZ`g<(wH`Yvr>_FyO<$c;hY9iS5;@Io z*m(4vl8+4L^K;$bMGbhX<^YpJD&~VJsm;bF_VZg6^@##Uq(19c*Nu!Eo2Xp+Yt3yf zCfTn$y;@4QXZ}O8Wc0x_Vnm@RuGV&KY$8VRYNDsJB*AQQDxkJj8euafO|vWXAjT#% zXgV3^7wj*r@>^sK_=XY*g$XvANy1 zS+tay5@zc$-6KjSQ+nr|6akB8qvwi&3S}I77G5pS z;ZeYZ4GdfHdcxNIpvnHJ*Eb~jyz4c#jF#yhMgNMY_LIN=k4o9`r3U3o}^7nAT;Fa5G9Y1%JpC682&9* z`d^U;KHbb~pl$)RJ0&);VEM<%85WGt4r~wFFZ`LR_)R`%IKzK<=$jG{cz5=S?@oWq z)G%lx8tDVV6;=W|Mn(utO-=9Lzn`s?)$=mSr{;*m=hAa(YKp$pTO@MWhB8u87PCu1 z^?9icRA?oagQFu-odDqq=)_%+&(_!1E1g#GKx9q@TntJt2`?|NkdV+=xizU$mTYTF z%XLRbM?5?{L@dxSkljr{%=s11{=sItx*v2K=k>84Ad5&yNKkTd#eyqTTUQ6j8Yu8P z5D5h3Yu?M#pRk@|fR)4LamWCIOlx!VOAwPYq>vmLVD2EuHh_l3B_$2Vi;Z2~-RI`! zu02;(B?P98w0;oh$Ma#JAk0)S0S5sj9~2mYnDB0QXdU$xiHUZO2SNJNru(V`^B&wdCd_h4$cX1L+ zOnVixWXVE8LqW)YsF_CyyaHGNr|nE`JlWkewD3myml|0r-X>9js0K6sz6X3A0J1$8#8<2$dn9x_{)&%?ReomMnA{!8>KJk~RM zdwE*B`o5z1Uje3txJ?(gA&>k_*(9Vic6oUjHN~Q!q++5!9qq~g`F9B^O{q<|X?2Xy zW6r?f_5`DiEc2C-*}m><`-Q|mI3Qz$H(S8{jT$1^Nq2OxvRhKes`WIqFgpq zD)qdz-juE_T4nOy4G0dU#lt9wXV=m*IJ=Zv2%CS2e2hd`hp(mJvSfM4gds@6z-n?S zKvm0Z+2rv@utrrFcAH)}qcOcI9Bptb-w-6;J2%XquI#Y&5D>~?WO3Rf5VFzEo_7snCc#a?L4-lGwfiqi;Jp*l7R$u=C0(dRb zqXQa^Kw34RCb+>yn@yH80>K82+8%i3OAbBd5{}K@*^*yVzoK983p{&n87bqgj%(2P z24#PB7znh|oXZ=K1FUB2$-q#BLOB6Jb$Pmm)5OFigp~6m(Bz%P1Y45AzjG3WUT4mr z4t5>Q`t*W)3EB`BDjL=o5KQlLJNRX1KLVXD`)b3oK({V1G}IXC?fQ)yckuC>LDvO> zst=Nbu$UM=9$u3lCO%fJDV{p6F?foerz=@-f~#5_pdM_dDisVh3=OHE`cWQGQldCI z?pau7xjJBz@kEwcjnzVBmuX58goM z*xRU>y>^?7tQ#)N47Ac1CY|pyNmcLm3+eko=HJ=dYX%z>X`FeVyIy#J@xX?>H1Gq^ ztWsSS3GQBa9WXz6a_h~|kn%+_^ezSlhM!Z5JqKl)j9_LTSt(7^z*~W?3ZMBrYp@8^ ze-cg`EP|t25OX_0L6!7+o^m_Q6Hh&A`CwG9y{qfiBX3<*=qePeA^W~?<8$DoCB%zNNP0DGbvohP2 zx<)d7SvP2GDJ`DK-E@1Ca(j3|`IwMn!!s;*y`iAGmDaz|W~~&jOZWsVv1~(~l(>*G zW3mxjkEDdSPJs0KYcu2fTZcH&gk@OMd?Mj{6qMg%0jhoya2&tGl~SgqN7?Xz2vCCg z+(2iaj1qEse)kOz2U1cp=3<3ugI&|t@$Fq|Lb^E2MP>XbNs+Cdf|!Q1M^PaL(=SZA z?yyUEzlcsvke?UVpZ;@*^-E~zdQhi>;|}cjX4Z6TD>qDKKBafg!3KuMs&bq z)XY<*Q@)EvsWcoTvkB@3%-*b;+d}sLhp$KMRDg(*JQ%}nnys&VpeFqOv$%fL%M8U- z)toJjnJUL6JlvhIpdh3};E~Ofn3NR9VNJ5P*gYudbJnw4Qc{96*m+$x87gusX52sI zX;t9i<0~z?R~+SJXNwC-L7-8Udo$5x+Xg%@Pf(>0;A5-0PgiugI5-%dAMf}D1kAd$ zeFn1?=^%qPrB!ZKWqMjv44PC_tmpH-v~!@*3MmbNw)_kA-sv(j)TLHew<`?s0OIW(Qqrzkx4k!WD~-?t zKq?c<8IIPtgeK>@k`W^=BLlG)`-4>#5NrKKzrM&&T(Qlr(Sqg!^Nt!M<*_k!2sL~Q z;JcZ|12n;bm316OQV|@ouW4#GAT0o8INBg9A(0BO2m%i`#KgqjzI#^%>UAgyI~6~F z5&(`8qjnrvY%_?W$TkC(jB&Kj#soW341^}e?YjM-SMZ7tY2AZS5AHsqwZW$poD%r- z25VRkykcy8ygyw6A4Ge}Jh5b>E3=;-nP=}lr7T9u)PHkvi`2RY{(yf$!BgvrQc4Df z5I76@dJR1t;nYZ@5&72OB!S3JClfEMsE7yIhQHAsb1j(e2dg4$BYDVE3#vO6GxHq; z;I*da=9Sq7L9o zXXP7vFLUzFQylp>2}sppLCCWQfCZFl)j57Zp=oJp**Z1lzM2nPW~rXue`Wex2)KNL z>EvYubMMo|iO>({ZFq;RGoD?@9uO3)rCe`5)M#a@3w)cz{`r48?#ep{#L%yh>z5WvbFXJtKqJ?sp@7jugfYrwE!Vc-!NkqC@uq zOP7w;T?6X>72I5viFtbmhdHV17(4e43UhOFmq!aIfDq)D^XO=6 z-($B>j>6f#MR|ERwqJaRWcC+W1xGm;TrpM==izcRrAru!iW3-5J^n z!7n@M^|^d$W0McMbql}jds~CSo}-SRvcpe5NMRXFkC@X&2kr6`!eNvdIf(02*BUXn zC?Bngi<1^!M=9S-lDV?k(l=M=>g!e_XidhunMz<$#{Ba1m$BGy&k-B1_vdf5J>7dV zgQOn5dup+Di6yAyB{kZ9Y>0N`FE3<+h4MhGKus-r8MV!G;Gp zH?_V>v-rP8Pm+BYmVcLB)NohhC1+||cw_Yk)tsn4JhT`9%>b|cZA3$Y%hrs#hK7pSH25*# z7pk=~;)SugW!AXTAj1a0m+oqELfQ!oU^V*>E%V~ZD@?$cR}3&IE%=cC5{UhiBm^SN z_ZfI0cs&}auYr2OT>3so7}OpYVh|)orG_c;`V%w6|L4S!5utfxQ0TwKn|J4zc(ax1 zVF1d1Q}(x!ECW^rMx7H+5*z{H_u{x~gb)$a%=0#Ex|#gTi|{8Mf38+Y$Y#nk@Wi(E zcCjlSSOp|WHdEIC92&ud^n3q)rE3c)A2L3+%p%2V*7pERCwUtWn6r=Q>A&xvzR$M8 zQ?G~|?&|31_zgG=?F)oTs^j-E-V2hgCAQ| zQbG;J8lzUZzKu;!EVGf>SRo~Fxm>-5WJvc!!;XF(wm1PCdkpVPubdJWM+~8cOelXy zM;1X)4cYIZ$N{rbv$IFteWLn%ef<}h{(Tl@kUxT(B?eX|itFDfwMx4`*C1tByVt`D zzGD5=r3ZN5IScnN706y;fD{UWWhE8OkP4*3)z!5xPm2?2Mb2Jb z2GrH@L*S#azdsz@WPCzG|CkuH_iJktWlw+;nC#58#wH{Tep7mg02}alvu4ZA!66M2 zL0BYgfy>Kgs`=VMkYhst+PIEnA32L%3`N)92oql@rhhCnX^U<`ow5GXw8CBPH3yZM~x~6+Sh9%v@ltB=G$jWrh%55Pn13eGw}3THCYJIJzOUSw)lsqIosk3 zho4sWTD+xf^#*+IK^7LtPJmC|2A#mn>=8^rWEQ}v4GRX}F`zH=nObg$u~I#Lj0wa{ zv8$xK+ynxBh(um6EPXEHVDvM?vtb;x0sQcs-9TzF;K`a#RTf>+F9EVb>JbnZd&t7F zn|dh67dttd0l@*xJo>{H0jd-G%BzmfPE6>w5T7ilJ0w9S4XLP_`nuf>SDbjN_|t=@ z1m3x(d8kX88XLb43&RD*cVEC$-CY^&kjpd6qWWQZ0Id;68vW4z*?y!XUFvP2M@TCE z@4xTUkx}fx#mx;832t$5@mTe1%b+7jXSG521_Ul-xEGEVz?KY>{? zgE=~oE-^Ma84(fDj4OC9Key>dDSVP1pn?Wa%^!y>ST(0^Yik>@ZyRVzah$f~5OZO( zow<*A`t&I>@B1*tvkBe_WqBau*8hw&g+YRMCFT2rWQNHKTT_VgcwSu`B?|f^!(OpM zXar79JH({|gM$s{+d@H2!hNG#=Z=J;NcSADHgpkWC4%S!9~t!VBOMJ5uxz?}uD#y_ zuB#FwGbg8O1wp~V)mvxKSRO*oxJ)w?YFk4?^l(BfzTQp{iR9Uh8qufc;bm!P5O$Br68@UT*s@_ogQ!y=)5)44Ozg#ii#{q zHA9jmwcl*}=x7N@?^h@xHmk8u&<^p5i8}%4jMun4otc^Ox2b;iiPy*0wMH#DKK{F2 zbVS6v_wPmGCa0?ERdZ-LIggU9$;I&0!@htQ|9q#H8SQtyEyAVT};&1Nw07H++4~r&3o`6b%v&K-T`Ou1W&Z zhD11<`M~u@-ka`{lEIV-Ony|I_eNe;UQ{k%lX4*M!H@+zB)XQSsvMv1+-t40p9h+< z1Z#i}4ylkPP)B$6_i3Iy`M_>Da?katpFBBc?oA9#OiCJ>>j=oPfF|2-QP$GZGUei) zpPo(wfus+3T@DTo5J=Z3D^&|@kK)r^L>bQ0ih+{9Lqek23G*4%tyX&2b&lfqQ6Z3u zSLYHKsNu-G?Z5kOovR_L)M6NZluW&n%2p6|E_xh~ZeZ}IE#+YkL)5jy^q5^W1wQ%{ zCY6+jrveOd-_$US-3&e8TX}!O|Ko4v{g=4nzx!Rki(GE#F8)>lw}m35+>zf2JoY*9 XG*vno{Y?sAd_+iy$O`8R>A(FS=hv;{ literal 14284 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�sy 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 literal 41516 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 literal 16871 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�D}`jwg=n(s1!!U$8UEKz3Uq&6a#Bam+|-a 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 F{{Ydk4Rrtj literal 12662 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 W!sfCQ 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 JrJwcv|1Vjj{?Pyc diff --git a/desktop/framing.png b/desktop/framing.png index a76aca2ffec17b431301f562db267834518f5005..e38136a322b92f1bd0d6364bf7002a2c2ffcb977 100644 GIT binary patch literal 19140 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 literal 19120 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 diff --git a/desktop/guider.png b/desktop/guider.png index e37d31d52c4998022bb40f08a6d4c5ab33366c4f..7769dc5348b092aaabe065f451ceb1e7cca439a9 100644 GIT binary patch literal 28202 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 diff --git a/desktop/home.png b/desktop/home.png index 2c9c75fac9e3f069a7a7422f9bfee40089091233..931ae2a3cfd41a3d49710d6cdff526489fb85505 100644 GIT binary patch literal 36800 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 literal 36800 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 B4zBcPa1cH1Hfgoj~ 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 literal 32368 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 diff --git a/desktop/mount.png b/desktop/mount.png index cdf147af1acef18bba5494c5742b911264596982..cb1c89d91137f4b0926bb5326205d74772670db2 100644 GIT binary patch literal 38178 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.1.0" } }, - "node_modules/@fontsource/roboto": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.13.tgz", - "integrity": "sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==" - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -14774,6 +14769,10 @@ "zone.js": "~0.14.0" } }, + "node_modules/primeng-sass-theme": { + "version": "17.18.0", + "resolved": "git+ssh://git@github.com/primefaces/primeng-sass-theme.git#3309f0ec9a597109490e26d05cf35d3c4e188f60" + }, "node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", diff --git a/desktop/package.json b/desktop/package.json index e8250ad87..fbf6ba2ec 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -43,7 +43,6 @@ "@angular/platform-browser": "18.0.3", "@angular/platform-browser-dynamic": "18.0.3", "@angular/router": "18.0.3", - "@fontsource/roboto": "5.0.13", "@mdi/font": "7.4.47", "chart.js": "4.4.3", "chartjs-plugin-zoom": "2.0.1", @@ -56,6 +55,7 @@ "primeflex": "3.3.1", "primeicons": "7.0.0", "primeng": "17.18.1", + "primeng-sass-theme": "github:primefaces/primeng-sass-theme#17.18.0", "rxjs": "7.8.1", "tslib": "2.6.3", "zone.js": "0.14.7" diff --git a/desktop/rotator.png b/desktop/rotator.png index 14573a6605b77574c3c9a87a9624c3193275788c..e3bccc4c5f8c6de49f595a4b06cedda928ca7f95 100644 GIT binary patch literal 10113 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 Ysf{6|MB)R!9tR^KA}d@jr04g)06hxlq5uE@ literal 10476 zcmb7~WmHvR*RDaOK|rKS1VN;`K~lQAk?w8~lx~r31p$c-5_@ktC8WDMrMv4qyywUH z^N#U-hcOgbto^LD<}>HKuX*nsp{)1;3!MZV0RaI^Mp{A@0RfQ+{5*n+4E~RgT-*lV zp1F$2sH1`}KUA}D@H?@aq_&%yqlKHNiHkXcrGulrIg_iYi@CXjtCgeM!P918a1!m~ zN#ZW%CT`Y_4zJX$?adKf%`IQCv%a!7u?FARIbX4{@w0L8bFn6gDA*$)yh4zX5LNfe z+?)5-S2urnIGXHZ?fV^sUV}*!A?uK)9=fiYuIHI9g0&;nuYawp3*Uh2JB-S!^)~D= z+qVjF^zLTpTI

o9D;FBcHr}z0^hnBC&QhL55{kZu8osS&Azm81WMgPc==!&rVP z)DaOh$#?wsq>GFh(y0gT!c%OSX;l_47KRnO&{X2MrUK~`j{Bb!H1lU6&8ngj@g{j1 zZH4TUbnVQXTdt+XpE~+N@@zh3;+*LOVW&nMooUsJt;9h+u4;uA=TCdYdpJS%Gu|v?wKdJ$6SC{on!8%$ zq4giEZDsfFN-bP^1!BaCv1NgI&;VzS=0>me3-7K84*MfTH*82jR7rf0E#Yq$SBmU6 z^Zzb9i01i8b#hFewWQ*T%fjO4o;H77@F!bM!IauuLnAsm8KC)b>+GDYW4j<1tKqH-KH3jcz>P0S7Y>}q; z_>vwgT1Mf?ZOKjq+ml+f%$mbV;k@-`DwX*#uGVNjf97S+%%%Qj_x!Hgw;{F+#cL#; zedXL7RVgfFdY#|OIm-B71wo>cWoo9pM$EgVuc1YC3Y)%;ywtuZv-v-fDOtTObEj*) z(d3#GTTgz-$nUMnEVLShGmj11p6W|IC+(UWHu;C1ceQRzK@>wYY=VkWs7318;D*5e zg#XOcZ}B`JtLE0ZOvIISAl&ibNInMDa_%&~dU6fd{}o9>9&>{*eYC}nr#I#&Pc9B$ zZG8N2`Z4! z?d?dC&#B0^8oci_;7z!97%t6W%Sy6r^;*J!QS?$952<&CnOA(=l6_9no?5+@b2^fr z5cb^2s9Cm)$=CgP#JjEPD zbIPAX0kXVx1_{IhriJsmfmlrmT4QulA2pRW`k8OMJg03^IYYxIP1;MD|B)Y~%6usK zw3@~{bTSi$zrQxtH5*P}nx%WE;eg3N7cC0+;85EyZY z!teyRXNwi41Y>sB(+>KVR&zre`_#uqdJznoO;+}Y#)cG&Pbs5_U9hV*7Bgga+2d0( z>^30w);u2U&8-b=Wr5xppZ=7}yOUxL3e4awA%CZ~yS8cLLi2)7R=6J%C6o2ljOgOv zx0`pu7~qoY*Jiu;?C=MsZ&#dpi>dvm)}uNZ3qf@Iqnh5S7p9Jfou&&KIpU-7n+ra% zvFYgq#c%Aautz2o&9D2m7#03WNEik5H8VCJIn`#jpb|8W1QnOd>N6eKVY1Pc-O92A zj+J+@ZUiyJ{VohOC}jEBifVj#c^J9;1SXvJhHZ~neckT+_-@aDKZnORm>x28XUa5k&2mVuZYnvbevluiEtZH4AYwIAF zB%wlq%LB23vkb9Zmi6ilWeO3&iY59yD%tU=-E7hHS6{~u90LF1GKSmyJ23tEn?09< zp=3sbsJ(~Hpk%=l&*6a}8ipTa$@1|p3MHP(Eiviy+F?rxCDjxq%j;_RRi6E`r+ot2 zRRST2^R`p*yK$m7DDfv2Co@_|!R{BEaWO_O{Mpi3MDCvEbY;`5iA1FeyT0pH^*z2Y zba;>0C7fljk72hlRhPf(?)%OAfW>5D^ap3LGCkgOn25!F-}>Bl zbfl|*+ppp7`#Tttb1!Q%=P@Bc%wVL&QT!|8Z9)o>f*9>o=U>Ly*FuZKP#f*XoBvOm z3@!|)X^$bHbKYOp7vlONzKZ!{_HVRw?kJg4^#u8NO+>79PjPM}t9Nhgqt%A|b}Sjf z$O}~`haD76jw>YmsBvA@siPx14=b!wFJ}_Gn=bZp{l&PVZp_qfmToG#S~8gwpccmT#mb6*(DmC*`8NN7a5_o8bEvn4~| zDb?PS)L!KEop!HEB}Bc4#zb=wntLww#V5wJT;!OZhFc{^*vDOo$%eJ8F`o~oM~Q}r zSPPH4A~-XJ=4~}qO3klRG>a%Y0=0P)Qxlj0{;(P0PI5QvRgpKTDxpsHN_@9E}0XPWvF z((~|4#-HJcjZqsK8U|Jy2jifB3&a(BEA>PQ^#>6e5moR<8gMXD#Z5{8svDzND4thz zB6}bpL1>`Af!82%%zPmLAtM`QNacv<2G? za+tI|yFTCZov-_)UQAk+hqE$4Kk=n@!d}JNn!dKS7GIb5$B!SU2aA+RvK`nWx9??T z(S>|Y-$OJ{rcC2-NlAP0lmtJAg`uE4C;R^U_t%z|_n62}i;9YBYHHLkZ-0n~d7bq0 z$jHbnkL1hw-Cu3;sDGgP196q6D+e!f-5glYPcd8>`XO#+X2xpPjnnjS@5}AD(Dz+5 z=iL`2f+>MxBxUA>7DJVp(}rljTLOY^@uk55h2-a0X-Moaki zZ3=3eLd~oejyy=!o4mHUiAPNQ_ws19)@|zr2)z|2$;!$KSoVFs>hjKx-ZBRjkc^t~5S1(az1= z))=Sbc#J7$o6Wp2F82NCCe-|JF93qdYCluGyi?w6(GrOGYuu*k?p)8s#f8^>`{jI{ zd!FNB)8i(GQGQAV@j_f$SrL<$$Gp2fqo$(z(KCplqQ#X+mj(-&bXd2yAtWT+V#Qyf z)n+7!jEp2Rz^bp>nH_tb+ zwf4%@L;mzPET{QRI@H!;nxH+aPd+@Iv!UTx;2%F~8ok%mS^VSp8$AtB+ClPl~@K!`;?2{!ti zwJk2@;L#}_j>xer9~>wtE8~EgDs$V@(b2&q<&GBizh-q>dY_w{>u~)LRU$Fff(y52`C1sw8lxb(q=aE_21?Dvl{5j- z!+Y_f?e^;A>R(>m<;~)QqK5}JDUZY2Sdp6F%^v*n<^~jQ+ZQB^sXF(Pz46aaQJx=; zDv2EBJluwXoA{cR_P4?NWU9&%yFCmWr7ZX_2(JEel&-$MJm?1;7JW;@A1FJfr_;d0 zs25vmY7(4m4#JUIzrB&W1bJ)AiGuYWJY0Nye8bg7#xrE(m4kyp--E^vCMHyrpDs<3 zCJhNDK(3n)Wb(o9+X=9wM)Da$%M2u^$VD4?)?_9=2nN+Fb{)Ex{AFfzlg_d^v)>M* z@ChHt5*YoZLj72*;FawypPz!{?)+HsH7l#X)^*crqEshjFiRvLTQQ5D&3c3;Gb@WN zqd#c?l(a3k{miqL;k*xM*w`qqSXkm38X9D~4rZWH|NdFkx$ksVTaR9zjw$7W>c#gtuu#s)SD)6&w?&)?tK)02*g2_lwNQh#1q8B&8Q zlTt}^HBEQRYVrb!7H@t*Ps}6Uv<=Co7Rhy~1#zQ4qbpA2K0IMG$*xM9F){gmoGD+m z$nK`cZF>wYARr)_#mI2|kBUZCp`C76F{i^^swPA?9_$6oepVZ5gAaPJbWC~PZo_(S zNl$k?^)$?$v^Rxi^K@%;65^^c$^0kAX`G)Upk*;!L21>+nXUYSRQrcg0gP{rU<;H; zE+`)$5nsQ4eQ#y;mLvw*(a{kI2R%JK=v>vhObFT8*)VIO8K|x0&6gArS}Ll~HwVp> zfzQeLzow__+9Oy&bzi@JZKuWs`j)b)s!RK1d`?bWc{vMME2vf3x*5m|kVnv+)Kdx6 z^HqPS78N&oP&tH_Or)LR<{gghc)QHM1N$rk_Bo0FlWl_deJ$g=cPsG4Ppk1CD3)yk z7Hph^gaoVY1S9Cc+HeO0=(-W8N+8m#<~=XRY`DNlc2mEXL(5k|Dz8mj=5$zbswyih zTR(tn_kz9e?(MBo*g?Yq>I&kiQ{x1Z6a@60ukKpWB;NhsB;l0ZHnC8MUWZm**YN>W z`(@W;MulPFxV@uCTA3)V{fm{2_07%2W4>w@)723PbBvd4iQc@w;GS{PyEyihf zc2{qj5?G-Nc}YMpal=W_X2?h&*Jw13yL-v}ZQKTu!Z3zL<&f=mjQ+oLh2D~|+CWGZ z%bI?1>b{A>6&q9WFw%IRKe0r7%WG(lyt+I7B2YCdq75Ug*6kKATF3dESrt{~!!#5r z&t+uvHs15F@qiNMgs5zt>CEBQK6LQ3L080ZZ!-*&SS*27;hlZJQ3oNS*LG3i;n^9~ zGARTHz0$Vja{hsx`98}&0G9mHWZ=e@iY-Yt=DaS#iQYA&Q~aSLwAR z>K1FOP21#;sh&j}Xiylz%BxT7@QxnQLp<#HyfS$R4z$++F5M}2#3c+H``DK1S}=3B zIhaHD_AP2n<+Js1xHKqVx7{gRh-Q>w`Q`#BkXl&`s+Z<)0{KtJh9rw8BEO(zFnb#a zgYIBUPgnN5xV4NkbW>JQu|Oe%8z56;LxW(Sg=_wuv$M0{&2AOK?Wx)x(>7D^FFp-W zAoTAY9QK)V`by4LFBcw;x#B8b8oc)I@?w-sai|rfl9*pxUq_nqCX?SUa_r{4{RF*Z z*k~|Q4aj`G{959v$s~b1F&$5UpdQwr4!F=eIxSiB(YMk<()ZIjZ=uOk5HhfW`otHN zM;OP-cny~pLsiNC9~{j8It@(u8~i*5h0dR~4@(^x`47gI3nXOY6)ASblJohVGXheW^S_vXOkP4mFT|>8 zd4OAw{0#IHTsRb)GIrcXGH+Nt-Pd!e<+Iz~Oj2ehnefBy33^nyJNQlH;TA9O&mW2X z#tTE3-Lx1`Swd$0?|@t%=^5%XFUHCFe9P(ISP>q$HI=$N(%xvZfI;oLq+`#Nc~YSW)G?=D{GvVpIB581J=ruin#=o z^tY#{&8oDf>03??B?2xkF4&&qlM{wrPY;i>Y7$Z6gufEt%w2zLvG9^9E@PWx?K-tW z#Y`aVgTgnMfndVXwCYGqNlKC|(S%6L$P|rT=}z!ZS6kzOSSDSo1Cj@1sF6K6J`PoV zm9)9PZ@AZVElV*viACvuitFv|{Y(8FI7z$O3YQ=%UvuZT-<1okVrhfNZU66CCRGJW zxka!eG_Bg6e{JEaT~)N7Zo32PRPeCzpE=EB4T&GJ_VOriq&T9?JU`MbATrw zPB!{W1RbLYn51Q8i?2Gk5ROxu_EXtRk;@y7(fRoJ<~$euW6K7ZD)cZ43gSE$10L?s z0|1=!fRroyZ4a=fCF#{vjWe}WUc5{KZG1w)BU0a79H1CamKp5MKudaD&JPv`0oe2T zT{?w8A$Pa8hsVb&AYHkdV4)I)qblm^YyWIe%c7^>F*A1>v$6uD;UvL&9OICKK7;K8 zfSD@b$$ZfKAWTI?g-Oo;GOD8ufGipo);a*YH$eCw`5!zL04SYWmp8-1!_mYXpO#}FM zXh`|VlP8B47n|c+M(YuD+26r6Pq)XTu1+>xm)npu%MI<}w$9zA+v$-}QKm;L9Xxke zLcZtfGcfOy4ZWgoIFT7(!wl-&s2CYB1HpKm9dPfBps%klEhpDLJDUM60GKGau#m1l zoy&B8t~N0_c_uq~V|^X*@Go7?V>-C;ljr!K6N`$9K0`s_2)Oq<^%1%`-)kQoO?VtA zL1Q(B+ZK%?QcH-tUmlut#*#+?fZy8MYPeYN1vAcUHi+P6&STVdsw@CzDSId zSHA?z5K+6in)pWFixKb-T}cgSr@V>^E+9sT zQ&|)tOC{JO^>_GsFuP?iM67LWR2sKFk(HIzZt~;XnJl*iqo0|%`SQxjNBGX~*`8Re zqhSYscgTlJv9aLN-M120Aoa&1KBv7)D(*3I*MTg&wub6T#gIsXAr7FIDF`I&IX%_( zYk=12T(+T7d7>rb-?Fm}O{RiIdQhYl+J18HXyQRhST7a>M8IN?YMd?PJ5ulI2wI+M zh6awi1X!zhPrk3Gr&0*fnI=o|12|w8ggrkuXEjqz5BgMOoEI}j!tn!y*;rOijsZ!| z04-g&QL=6|R)E)e`ZIXSIV)@J>c6dq^n5}F zh7fR!zzyaNk6jMBuUn!*=e{_*x>m)!U;_2l-w)xABFvSVo1Z^AJA<6dZSU^NgMMJg zvN1C{E~_D z4#3=}ae*5}#T|tE@bK`JfWWLnKwSBAf+SfBo zl?If`>iEoH^m{C3uImPnnWml5KR`QrtlVGY+x)ofU_sz80rH4Xpi>(8A&xSTEu@#x zf#Iw+GBUzS62oad@^eOJbuXXM4B(jBsuR5w~|9zq*3u@fo}9tgOKAX0 z|ujaST?+T;yuuVd(} zoPRtxBG26@)nouSOcWyph#;`MyxiXWbNV$EzjO5D-w`KYkYA>Po-P z4Gp4cTW?UQ%?R=_S_+6bZq;;j$HyX$VZ#kl^6pseC&S%aW23%uBqs)|WTP+irC>7eFT-t9q#iArDMq4BrMO zi-T~)yn(}QumgK5B$Nflhn20Zh`2axkN_}zO1)|;Q7ft~3j?v5k&cF^Pk=jiCj?cdO6psP;1Q*5(`o2@}8uIIZt z$xM2k2A=bhz|#YC`U)WR(vmUgHBrsYBG|&0uNX8-m-^B;fLp$(l0p?+gB;e5tH{ zziobg9`|vn=aNr0d=fBA#%(^Dnz9jL0%in+XL%#<;O(5Y2B13C=DquX%V<=H~Rz_vd@T=mB1|J5`Z4Q~A?fO@uMs zv{~bQR3x)2rv>Hk2TwfLW6Sz1Ep-d{76}-Gd>RcYurMU2IE;H<;u~1(b@IJnM}M19 z*2--C9i)j3^ab+@3>YY)DTXAUEcXXWo zBzeekb3Rh8;l|3C8x8k)vp+^fz(oFcTj@c@x~L&)1GK8#1zs0BY|7GfvF3$5KK~6= z2H~{W4%L-^He8Q?HM~6e=P=>Vol!we$ohRyyP&Bi5`$3bWH`M@8v?DGP+Ky%!1J2C zgQ`yKi9L}T!?;4?Yq%8YwahGfHeoKe4upVvfU9V%kI>s_iLP_a)7SVV#By{Acyv-+i;?fNP<59)bBcg+(2P} zYdV|0x9fPkl6=iZrG6b@#-wdDVEguimsrO)d zseJeKw-rF~q;^2bjJ3+QtG%+F%SBvh@qTdy5xSnF+O?|FG& zc?tXaMu`Jcl+PH9d};jd?;e{2n5Agmyg^h}S2xppKHA?O)6g(u--+hTf$qX_bdK@M zqZ#gqAemBCk(l}t5|*IZzC&8b>esVqH@m-oq*deh5CMEvveQ)lSFZw>+rv)Uu|*J^ zR{o$-_#KKOJWlQrcywecOjHiiw?8Nkt!KVzUYu6i+fw+!_bxO`LQHS&m5zK8Q<)lg z%$e?_&ew{Hf@FYqc;lup+b0rGdZqV?MXkaM{L`(o=#QHV_w79y*O^5%2qn`W2&U^&78r|Ur>WsHCnmi%>`lO1}gX71>0@w(&bS-q(WX4xZ`67XKvXI%;u z>OcL(y{pD`_x5Cs_xJBe=$PImkLDtu>XMoE_Y3Bq!N>zc-t7Td|{tXrnsty;{Z5&S^I_j9+nyW~l(;Z)Uw>%z??lFJFZ{j6f=L#N&Yg@H+iDkvHn@`n(P4;NMU zP?MJ%=JbXed+#4BI0(5R5S}7(&>#|8x{Gn^yoU06@|J}>s8vmT1gXEkdI_j?62ey6?`xkED-un|saaOnOPf}+Z@9-^MH%q zKVKwZrKe@{%iQdZ+%Ho-i1n)W8z%NQMz&^em_9MFykTVJVEW9##LAxLXa#}1frxzL zlXFNoSafudn|!=Ez5Y1MJd1~k`Tflw6O&d5pB?p!pCf;LadbzEp%GJ+lT%YPRm#ST z`I?jdzPKHk{)E^{FaDIgLVTr5K}0^UyBys+@Bl?5cr_~^zjf|JO3HMdLmqfiVp^)G z5G5whC&7#T9fjrjtvf2el5}#4UWL-(Rl2^A8FMHs{!g%lumPoG&KH-CSBXn?vNeSSicURtB=xcX<>!N^#q zIpUXQX^U15I&mS#_pE$!hHP}TZp*2(IoHtWsGY}~ezh@r%A+``U+{>z3Dv8t8(G!1q;_U0?J?+Oa=?s$+ zw2j?xDeT9-(8qI-#cbNf($Joyn`Fsd|8Lxx5uK>TJMof5R;CRR%a5G@!3l7Dmv{87 zPP*~Ep)Jltw~K5Ysg8G)NXx!vb0diV_=g8L=N z!MFBj^Y;G6!4j=EJz3!uC5{5UJ-#dTOnJNWK)86ZOUzC}-V(J(8y3|)?R?Wmi!*m$ zJ*dJ*v!3_#SJ%X}_#LKP?ALo#$q|5?VrEQ8mDJu$@ zUYED8lJW$*{`*aG&AeXP?pYlby{L0A=Z4ndBBi$Tk)NcGz4rFiR1>;Htu^I-lE(1U zAW{ooa%ZoU##UJK;hTP%h{)lBZ8qd~%k1CfqsM0#;m2XN``yH@91-Q&6*u14CtC-c zjts@kXeH>4ouonOyhRFCa*7UT)@adigq#K`cpki!%#uS;MfKUZEK7bpr&Z4&33H$K zKQl<3V-!t=cWp*K`NHx-`q(d9d9^N&m2Ouss~S#ejupAu8ks2}CW*lX-0?RL;57C7re0z88g{YqkYDV4c*FMSp&`H^a#;UBt3ycITh7U=)Qx@B(<5Syi-{ls1`MBPnoIxyp=s>>n zBK-bLQR8NZUzB%+x%)xXcWdOf$rV47gCQ(qSktTitUScpQdPeWq z0_(7E-WfR`(8j-XPs`j3Z?Nq~Ny97BolUzP(5Orj?8iHw;x=YywElcVLraXy-E}AU z8%Hs>4Ik_1>+ihab~3I(=O>Szk;spPvrCd6V@8D3Dd-5BvkVTG+nnczH2V5s?1!aa zyj>vQrCVAkNi3JAVkg7mR~wVoFGhyY)>tk&nY}EKlV+pA7Nh&hK1!6da(k@TlD0z< z7v{d<9hMZWT=}u2vdZJtQ%5?re-1}Wl7Pm@ed^GPboygxPP+5xJO`g30~wANS`&}f zmtP!`ap7^FePNs5ZzkMXV5KKNavPI+N|-nFarOz`a6dGb zym!80-cpARQI?G9szYb+w+bn%L-?;;d24g)B<~$vejFL?c(-5e0Ij3Cb=v1HP-XXE zwuLCUT;9MoOkZ61GzE_NxN!f5t(zs>v zi64tF&TY1|R1l^7Ry~1p_)gM%8vlXX1)p7?XYb(nJB|54%ILI4#^q3^`b4Ot)xvhh z)E8zh2X^uyJ6E;8LX%YN7*E{FLRiFh%t?_dx6l*yyhOZGi#?VzG~NL%(_`D(yaK9~ z%^5$>E)%QDX?_PYftj&Qaa%a#q9=C928NjiXL!N&Rrqu?_X0c#M zu_}p64PSa%j-*eQ9=^2+a(oa>gEHoWA8y4Bll$(+w~H+lG|2gus}4CS1vS31-Dt8U zHW=r}>Rq!TLu(f8qFGrygLCFm7ENZjVfo3rnKS_-h-h(juKl7&E##hX#?h-gU*aJ+ zzk_8*O*e2Bgm>&(joiZi}DMVU1(P>_3Z&xZ%VGW41Pfj`d-yaXT-=p>Xh_Q>k7R_=Ri3#os)xs`yxMz>@tObF}9Cw zG3?{h6NAQ#8H^B@?I49)ZK&0Iha-dSPM(iaqh`?ClOvvm)fM|&{N~Bt$$?sJ6iumT zK#?vv)H|DIP6JOmy1^@3 zBe5qRtw8rNdDyxtCHHkn@DAG2JB|lNGZ!1~Rf8c}6@;m;f)g6b!}){%CNUnbeH>>U zxu33kkQWrAJ68wYS8qw+bX}hy?jb;699sa~%@j)(2Hm*E6L7gN>%P+g0_Yjq>KBMVVQd%p|BJ%Gesw%E>QWcz(3%yly z+%;*YxJoqowMPZE(sN}*i(;)o(xaM*N#|SqmLwzy4ipNVZri1Y$EJPzR2L8u9SxdF zyd!O8b3es5G8s<{_G7m%ll6BE>74ke%&SW4~Akjb6g`LT?sny!b;=Ocdrx8vipQ`$^DXIZ4lbZrh&`-NQum4volAykz3Z1R#&`z zTduw7IlCZZUAEayBI+z396O+PnSHCrpDKO{XdtXVV^aHa@&5gze8SuOHF$nvdN@v8 zsHgZ13AsX+anE~hhQ?|CAF>uNOcy_J(GSw4mn9E;H$W~+INtVdNzI`_E6bjS<^654 zhRXA`YqR-elrSCDwJ~aJ&-mj>eL_>{I$0B{J$J{PkNgRAe~T2dg>k=XOsQlaDz4Dw z#X}OH*c~OiT$)+=(_6GEVQKuX&MY+QnSnM+ZbE6Z?v%sAY9b4G-0wP7Z<*{5DgCS5 zhH?oZZ0`riq%K<*DMhY}mBRmzz>?A+)D2)gX-eYoFPF%?ck-?nttEh!>sub$?v41RiFtZ zE-_qY@7#F8rD^0M6t*xbpV+$s@7{HaNBxOy@@oO=}RXHOq`Jx}wDU$d#<$IP~EM&6E69m@uo8pqCYX=4MZ=Vw-ET1Gd7 zs)-M|xpeCbx5w;`SF(Zl^-%iXeyROEeVkrZA2LDlWn2p(#lA4P8`{02YKL{S&)ytNtF0Wf=sAr~^M7<;XjI-7G!6i0!_Svp| z2>SVY^D8tp(U~0$yZa#UNS%w0y4BTWAIus~g&=)>eHNCMTOn z_VnxBA>HHS<;h}3Ze777{j=o;vlYLv=Bv%ktIW2C5>4hR{AOkp-;2kLNWH@b>Bup) z8`b=ZT+E{4`mJGys$|lA;C|Nv-$5=~4D)974xy3wu1O&Y!6vWI&4&5>0IgxiYjBX= zVNDGMp8K7i(gS|=Yq3f?Ncy7z7O4{vp^AM)C-njQ10l{&WwZDvq}NU)S5;<;Ifd-u z6&_^kysJs`Ra&W4`a&H~?Q?xFoJ0m(s<5{Q_scLPcD>yRT-O8!vQ6txQLg;*N7UXm z26tkWfP(4K|0H$?muKzrWV&7CuL-1W7)0W^YHMv+#gn})>yz4%J=t# zQIu9xY%J7TPfSgLE5^0dhq=yCK7amAR;2-a&J0sYgi;ID*9ba%(#?`jSUYXEG&$TB$$03&t^`_wqOCv z(EPxpTv*k9p)mE+Ks=EnvNHgWO(iNavNPViX?B+jL|>JYgXG~BEfJ+f2I~BQPR)_{s6^457m&!Y7v>?1#5|WUv$vKH zR#URy0&6`Qh1C&SGz~T9tDCiQw()U?9+;JCc~6(J`)`}|=KZ*Dc?^c#y94)+jP0N5 zya}7;&J79*iDS5Ls}DFXr2NI0V_9#j#R;vc?nBIX4zzYHnGJ??LAJ86u&nIte3zC+ z2TN(P+>}Vbte+y2TT)%!Jv0;y9}jWV`>m->c34P7t6=;6kUUBB;A3I+4F@O#gXT4yylGxK$<$e015;1~! zUf<2>y2$tMD=V!YTn{Jh4bZ#&EImg@$Hcz!qN3onHEsWZ0Pt*#aHv>RlDcyhzrG0z zmut4Zz(#@_=6⋘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 literal 67683 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 Kc#^2r{r?5+8^H+x diff --git a/desktop/settings.png b/desktop/settings.png index 80e5fde642478de703531dbe1462121adc910781..1bcc6fdd2d1a60afeb67ad562cbaa20785d51000 100644 GIT binary patch literal 12074 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 literal 12562 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 diff --git a/desktop/sky-atlas.png b/desktop/sky-atlas.png index 82c34f10159bb8993877a7e802b1694d091a3bfa..7996e1bf541058df7f0ccdc4b93657f594fec471 100644 GIT binary patch literal 63601 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�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

lB@zx?0fVx zji4X-@W9r1Fs4SD4eY~WHAYtfl&;lNdFj{^KmUvpL-kSoTS^pO6OGm=7q-YWB^)Od zV1&=s9k@C3r|UX&{JaW14Cic}shGJb5WOstno4X}Sc6d9dxaC;_c*O+eKL%Z6)b$- zp~~ic$Vn;x+SyjJ!l^dk9ii%`^d4v9})4l2K^MBSw%GEcy_2hN6j3+!qyRw;#yH2{_`+PS}AzFRuaGCtiPlSSGD!mmJE6Msb2_4?XN4g zuVSJK{KF$YFsSSf)(DTWiHzRcbKAT;P?1QKbmhc_@x038?)7{s-6&lVwvAcQdM@`m zD#^fOe(9!}a3gF~TJ_n-dzK#zuzDC+#+VlYWiG6z=2Dm%=~3M*%>F6%sNSUSz4C}` z3`1y_*i+elns>SK*D};*b!V?$Xy^v}K#|?C-+TFVd#SU}}z=f21=l{g0=&bWW={7Qbven%% z;SXnZ027qF7A;2Ag=%Xv$#y$#)7=9p{?8QhCxvjLr=I%^swmp^(x1+(Oyexn{-I@^ z19eA-b((auJ7F8gv)}xqF2zsGt$MdZd%yi*6S8yt^!0BZ?4>VH;KMH&%}Cp{wL?DF zJ8_h_>)uG`CZE$-SM%q9H*<4f9rg=pMyFvI}0o7vuvWF-dMWH zLL|ak*-8w}wX+=7A&B&-waLWqr11O^ScSB33VE^I5>(dY>telXF^li{w9b-Zc?OAn zF6Oj85Bs1d-*gW}M)L_Y&l{8~?NJp+0@_ngyRWF2M0S*@Z%hR&!srHYp%0l>6ZR87 zH#K|jdCK;}IBRFTD6Vg7>y-a6d^HX&>Dj1QI_1$^eIuZ1@W3!LyKwbqtNno=r<#)h znKy-8k~_jE_ohscp8OhmiE!MXhq3gpjtR6&XM9mF*0dY4eX<E|GXNqBa+>q14*!L^C<&^x-z9ePRsVhB?kcis7;eGHp*|WT> znZXHru$qNr|6Qiyj&(w4wMT!tKx^^xEfav8esS-hO1UrnPnK?LdM?s@#x&)9tW_bMS3_{y zIL!M}T>?UNLn8)Exeg~L@W82NYHF8B7`V-nVQ*B^dK&qcGns*39LttRJ?R>m%^Lma zTAGLJ-A#m#Y>L4URjcMR0j-33ilwvid$boIRZiI{t&L{j%BLdAK8X{p-lQh-#iOAb zGgn)UzIxzH{UghDBu86u0 zhNfAQLCq^Z1;)T@iSB_t2%-`BF&3ChDb#p{yh70m^swA@=BGSigttV_!OR-7%foZ z7AH8H6`d0=&fY{>Z=wIF1TI4CmNL~7ScztnAtRal6J(#3fKj1r=4w7;3Bxr!!K(t3 z00j~vtMB7F1SBT>^(Aqm;b&0_-4?63dK$e}D=YM*x^PwT=a_4P3}uru%_u$;`xmRm zcMP^+7%W@Zd+igjTanDfYr5uV2R1WUKYf}SRv)T)dMwZG{?pJj5BQ#txD8#~Z6!t; z@e{Az!aAcYv&M7Ex7o-k1TSQ7#N5$VNlh`)#xAayo`G-Joh;2h59)8l zxX0GE(ZHS%(QCmOV*bH&i@UA8{q-F=(5~UPDOngfcR9SAQjkVZ;@vv;B~xz)>`G&R zOX*rh`tkLncPI$N75#IaB1O5l$n}q=I|z~TL@IeX&bcW zvR=07iCo$Ve8dz?59*-Jxv)Cddp&qvoAj@TMa!+V8L@={I=7&!G<@q-HW6l&O--W@ zfy;a%#JM1Mg%Rkm^>x90+-GyW!f5ecI&DsgxVlP_1)13TO!;Io%MftGtw(1suRR-S zgHpZfH6;J!edj)+gtvUn{cl0BFrz;|r3GuesVr(aVoU=<4;W#y>PRH0%zATNkzSh} z)WOWuU1jll@jynhQjwf(CacaA4(AnvZyliN+2&JztK4mv5hqn}_p|$z1xJA5uNSTZ zH@uaCtj~hM;{aSY0RwWk^nygJvrMH8!;;p$tj6A@!C-eb8$$Z?KRj@)+@>kXQ*#E& zk+q`lv%|6D{qC`ab7pBVEg{~;E7E9kKMvUb@Ohl_NMEukj(d-u*2QZS{Dm+q!gW8Ex)w?L*(|*Zq zTVm_;BA{dCz3U`o+0rP4WOM)0ToM8;lI+S&(x6kp{6VF_fSP~xBa?D1*_7V1uZ7?k zAzvr!iOgf0gzRhFg49PP^KVQ#Br0v_En? zauB+z-ku|!RFC;nm0W5SK3dB!iy;W%3g9(=SF_Yh=MBx8vP}MT$y=|8Vlqgs{&IG3 zO)=;tt?5{Qm!gz^o;Y$=rh2B>$XEVxd_09bE`{9}n-Vl!0dfdk^#*PQe{MFjiaOqr z&ol(h6uwq@Q4Q@>KepG5surBGN>MIZH{pxK{4@K`Dg}{bt$=WvH?vnI>@dUa+ z;-KPDEn8)k?W7`BjbT`k2N{8@KC-x*x2%f1Y&|5Fv-rW@Fl=H$xSuJHBq{Z_d18Xh zH5V5n#gpOh2OJI&kx7a``7ul8LBmDc%eUQnd6@-2L<4?)gL72qymBX4ck;k0jMm-C zZcuWX_RxG=PV(#9Ye@+C(hQZLM@4l=^aHZuoohaHI8(ma*u;ZTlZAEO%0fs!Ut?{x z>1ouP&qJZAENfw_-TNZn%O~r>mjEKdB40yWjZ4eyKacjBmu9--s{5CU*)C?2BI9<` z{2LtB?cr|Nb^!^nWb^u>5>4|l9TTW$7l=|}RJ=u5*#!Py$Hd^Q|3E0D>C2}?wQeXS z3ct$7);(z&Xe@+gSqWu6z^(jEvyvSg7bbul%hwdnBp(%zjwL0|DC1NQSLIMC-Yxv` z8lLcuZmC+xu+p=XtWnhzsmA!u;x`XZMe%Q+L7F;OSyT!^tMHeD?7k?Gb>c?``LQ7^ zQ5w^DQw7`Cm}k}QQfNlFrm~LH!iA)CVPiT7S)}B3hsRag`(w^oI+lWvnQKc)8PVye zC{}N5l_FE_WKGk%CBZK=%J@>6sVHxi@x>sHMRU9skB;xXYctY*=0C6_YgSZ~PTnf& zTT#`7 z(1&&2lW@2#pl0Rx@j&N7bG#f1o00kUMjbC2AM^+$hwE$ikrzHB7`_$_zz#vP{X<+D zC;Au9I<`|ifZ9lcaFg}40GnO6Yl+qr8at>(!_|(RLw)o8)tO^_9KFQfLSUo+ z5O4BSAJfYRji52!4%|OwD*E&iwHz{#U4&Y{8mnzO#ZD8=gP_TOP+5(fHNmfmo;-#On1ixenBtx>7p1 z5hLcvjsdW2uDg1fNcDv6lXSL-AHJEAko;LsFjfF%!J2Xm%{CSanfP1cMV8&HHa&%D z+ATPhoI@pVBAXk5*r8TIf^4wVjJJXQc+%PP0ixOnv{V#Jj=Zo-ZUD{0D`e+{7r>x$^tch@_{T70Js7%nI3_k1WRcPZrpml3apVzteBb$5%~l*-Tn()}E# z%YrxO+<{5`!zlb~L~d1UGgR5adIn$K`rIJ+DlSArQ5b|0SP%l008$?JRca+Ze!5G? z*|>29vupzdNBaN_bLlaYaI|az5hX-c)n5=!FQN+9?n7kS2~W}e2c#fgH=v=0|I$Pu+_W8p znMWk-r^1xNK7WBw^78pCKGRB#q%)*yc?#pd5!-GCL)ZWl)+ zm6D(PQdiEIvGCod3i_7!wzJ;^Vn(PkkXtnseZ6&kB`Hoe|#>__9J zh$R%x4`zEUZ&~>IVB zgyn-?_`JTRZ&x+@8L&$m%*HI7cs@lGN)rMSdL92Pashy{;@@h?cdH@aU}6u2y8)smVn`&b{`l0XO2P^ z3LFX%gc2e!drm(>LRu;pYyJ1rroy=aM~ttp>4vTw5>J&xlQEi-jWHTwv)bZNf<4qT2+OCAoFf;%JQeW)BDVkucTZZKJUK;_WRMA6*Ca$Lx~MjwpsX&qoix4o{Dn zAb(xaUn0{)S%;#nPzOvS=T@GO_ZtO1V=%_&Oev~FtFDwghVnnfVL~tCTRWtr(aYzM zDf?(R`x^A1)6qA|I0=!_t5txh6_7|&h6xo+I}DoW9qu*9rMyNcbQs)TUpOjkp=WH^;- zRfdOPD3i-?#L?reK@26LMd6DObXF-DdA(>Qv)aIq(!JVYx46g$fU~imtnR0s3zOTS=%74c8HoKW#V4uqZKvY? zRMLlc#+;BahX#^~p&z+PN;VYkycEjGAJ$d$1MLHHkINR}yQz4(?O$scnuh-}!^75v z_fLKvb;=*DDuta#JKzgD4Fgegh%?hm4Y_B}3Lw z@&(Bh76WWyv-HLrXBdL2p~~w36h{d{jVf_u=^<291r1|~LBRf_Z>=h8O^HoE5ml#7=SY*9$V?puS#MmO&E&rr+I5I_fkO5Ad%)&*u{lil0RjT)+jT8`ZeCvz zA6D)uMkBw%@f;-8L?4=Yxq0id&l=wgv1Z&-Fv%#c@QlLxWfEmefH=l1rg_XqEe26@ zHFuro(9J!KV3!iU5T{Y%Z0>rgwAQu{;Z8u zY}nHeTXUVKCE@ioi=7vWI6Ntyb!A`3P5F@D;v(<;9MDD&;?a_3A9H)GYC3^5^TU|k?(6W0KHao{_K>3_^H(MKMhcNsc zX@rEjl@CFfERM)Vi<*(IlDzzvj@E{b2t|ZVaw)#zsa$HxB;aIZ$%6$75v|H^3ypoG&>H^d$bdip>&VYp`&|B8r6^fi zrEQZrB-YmHF8jEbJ)@(Txr*~s^I#-c5w^C?k(4QPpH@9mVm#@Ok?k~br7*a-#&)-h zf)P*EH~}KFbNR(=tq+GbHy4v~4fdNMu~aerrn99a-QC?gm$y_yY0vO-L>W#O*xW&; zH_)|`<*4xW^VQ{US0YlzZ|;_T5;sW@`_xRX|j~;YUfyDw`ESdk2U48Vh_85fOMKuxtMejC`N=FM2I`8m(Xb zhTvc#Z;Wp*c8U3%!-j@rUcGwd`fxcLHQ4RSCo-6?kSy^U72n;FOqs!Jz@XKs-mB~f zL8*?=3PHX#v!9=ztGm1Xn!k9tw6t`C_XDqh2lPDyL&;AEr1=KgriyQoneguDTw)XH1SqY;Ag0Yt$9`i;*GSMe1 z3?yM9$b?2BNcgTd$e#KJnOcW(r4tglY)IYQ+%EP_%yw_qg2}kuFKA#Am~@S|N74=! zYC@-`lm%~hD8?(_nmV(GVC|)a!E+EeCdx=4?GBqL8<*)cf0B_Yj&{B|GZGaQJvlis z&DMGlon?%Y$+%~A$WRN(54QQwBzbICVeYPux8qcGo+tW2t=#tzQs?lmFN*I7k|T*Z zQ>Hu0wc^?NuRo^Y$@^51+EfRO7axx&uc#rvf5=uD{br*YJbO4>e!gAAIcaQY z_$wtv+R@PwXLE>(NxfgI#Xe+myEUh}xS+6#!Ze2f4bgZgQN+^nLjt4rx6}1*Vj=HT zQUUixyOsKSZcdx!p?C&OUtRMASP_RTgp-8hjiN4CDc-ZwH*3cUlVI2cCAM#I3cIaR2XIJ`yGM`>EK*;EGwlA}&o zZ?mG8)L^b$|2e1+cUO~*E;bk>yj@Lh=fCmd_&D4&ygmUMNPZK}8F_MYYIT9?1LM<5 zPHVN-B|cqyce-PIc9!BDu`Gru(A6D^Ki}k5)wwd7#upqJiMi1ezA==jIow^zrQ!p_c|Nl8gC{O3b# zsr+uy<>lqZEMqd{1q|U-ff`mk`$A7IDJ{Yi35<=zQ2=TD&~!R(5iF5Kc>!_7^BkS2<@#Og z&9IGHqccNLP*AaEUBuTS6@AW>`DPEU7-~5xI=T>$;~Y-T2teWN&y=JP3cq!+Nrf9Q zyg(%r9X&xhx!nEHo=G8aPG{n?EN89bo|6hk-b!Aze8;F&k5%&*8Z)U{sx@!OA?lkh zkX=~tVN*g%G-mS|PBq>D#BS5Z>hKU3`!A4$Ey4;Z$NIm*?OK?aZLuEk zocbx$Dgac`GXVRm_!nURHzWtC(bK)MSVDOQ=tFW*KnY+>-~T?I-T#W*^^0yXf8Qny z+BrFiXUVfevr=$##($_3bsMsBIH?fD&6qPuRwKUQtZmj1OJa993W`MG;|!B1!5-MO zUtC&xGrfu$1nc5*CBdg7TcAugW$qMy^J`F3j`G%eZjdlNJ>BJjSf#0{i8!y$@y)XA zlX;=h#A1W0Al1PfGf|Di&feZ0^MjnvEzZ%=5ka_w_0r#NP#k?jL-4CnlBD{ePMaQ} zkl47muk&(LF{e{Xa?dFd9UTob2zOaCt79;n%%QBT%68&#u%Vnx#`()3JBCS5$-P?Oi0)J*ES`hwKsfJKH1M_para-}6LHWt@-I9c4#@OSkRK+gFVFTNNm*>@nB zo)7i_)%1S6*{17#iH^Pr@XYvdp+<4x_ve_C%gfD;NFn2cxr(l?E_n@&fteD`2IoT! z4#@BPd>lNyo>*EXdAhiRrN#s{labZK!(kjbev#e?5+0W$Vm_B6!=uFp%jG8ZzrDoT zF4EOmY#t)Rf}B2&p2~Eui&RSfoX#;+$RzWPSQ=ka2DGOSnLD!MBx<01z5EjN3pLa6!qiPOGN|I8Ga%$K9) z;E2N%y!LJJx_gC(Ct+y#e(A5%#*)j5c&;Lg?IEw}=RhS=NQ9Ap z_z)H;c>5y&36m9s%Pjg&oFti7ED4`8H@}>#D>wKNJrLf-db@xMgI?ZhbhWN?fOrRs z4Kcl>9%!nnsuGc;vg+!D$E{C-aENG`psWw(tMUf~R1)^BM;2*UB0Ps6kd)O`y@fiP z$ktY$=17JDGLAS4QBm0AmODn&Ab&zOW983fMUm56p0L}CRql@B;s`)%#3m$A#Pq`; zqoH*T4u--ZVT^${znR|w0>>dEJHAK+IP~p!xfvH1SC2JmY}XMU9{yKUl!%TFDVOyk zIXQWoz6J;(3jvx|t9Kf`YAF^L7K|`R&~VW?73P#-@Ovj_>q>(>_t^D%%W6qS^2cJnjl8XWQsb$!7MK)69BVvNQlCG{hbc?zqj;N|A#?l|%W z*V@_HwXdvXfMIL_AA%qB_VxxRWczUIR9RKk-{1e1oZPoawQQonVVj8Tz64uR5byQt zZouB3rKIe44E*!N%4TEI(uRRV5;iq0cyH}=$s*EecG1o{;(Acgo5*eV4xE|iSwA(* z#qMPAU;>lF(IQVz7-2wuJ~c?S2|=JdJns(czC^m6Z^^>s$)-qvj3_KDyf}oY?lE&F z$pCCnrkf_2jFqB)g z!D<1C^`?S7nQO%J0Az%+iptq)0Or}l)e4st6~c76ph@w=&VNnv7uJjsd+hWJ$uI&D zz*Bm5ir~Bea{Lf>aPy~Qyzu}(>p&mL^SrIXb;AxYKS|oyuC9;HhYJX5#P!wH%I2I1 zp|UoM^>2CVq;jJNRI=pB69&ikFTXCEauA_|l34>Q-PPNRLrSVM%n9v<88ffhar|pu zivY51xZ^uI$?z-|+4<>dmc#al-Y3 z%zDfOwsv-JSy-Y93TR+qVF}nxu_`JmzK$rUsnPJ9{=lYi-HcP+nJUE5{_FTwNQev{ zA3xoFkM`{BY_8Qu$h;;QAi&qEaGf%0F0O>Tqei(szLCK}3O2Twu`zjG#~tB2=piNF zLWqmf#IJEr^veoCuUk;J?E`W2>J9dkvt_zvTL%7ni}YkwoL7;g0?GTcWzsLnrlxxr zc*9w~)h=^%Brn&dWlipKJ8Yq`u&}(Rq>PG->n_o(gQ@qtVeJgY?1exy|Gu4=oJ2uG zdoLi62GH!Jk0LTto@VZ^6Fn#v{`-^8`uciilM&+oC}W^L#Q-+ntUNvFf~x0nJ|F$nT6CLsvhbhDL$VRe2vtIOuJrwnSA&-p+&fASPCC9}oM2k-Ng6)n_0OYwiUdaHtRXWmZ6}o6e78(}z9@Ngi ze}L|B@QThNKs#O_>PvN@PCGj{=&6a9gU>}}16`ryi zIrJB+S8;nlpJnx5>g~{oh`i@`lQItb{hg7AXyB+i{LZ~jY!lV?Di;6H2?RUCb7unD zYXKfzJw0-OGD`VhmSWCpUV}mucXYe}H(Y2j=F4RW0!}$kPn83`pl7mExV${ux>b$Q zTk}8$%rygsP!;w6w8(y|*8h*rcX7Ip70{!>LbVx4a(jS&oR)LG0Eaj^mZ`USVv z2xt|VRBnaj)K=>yUZ8kfq4Opvn3xF?`Hbq7zX#yG>A|r+=8T_=OOkQ?Hcb`)K$4&C z9^&f@190``dLxpSmi8?xYxGYX>US~y+^#3&k`crrpza;EWI8%JXc!rdLB;?s!XhCV z&J+m%WJ3*pB@EV>C{`^y5OgP^w zDzpFBhwXiT+Dq5UGhp)c_yEW#OSjegep~3NfqK)m&h8%>Ytm3wWb^G_QL#?*-+_;o zCJ=Www^PvIZ|v>@210$qW!+`UK0_xLVYzkSUD-YUFrIvRb(OGwt&uOEIBXnzRm$cu z)zh0A_s|gpUQy&;(|JDKqr;jMcDm7v1I`_K2;uR%We3`2`}T6*lsy^GsI`$Uu*!J& z8_;2ZI8GKFMgh47DHeV#R6g5Eu>n+QVmz8Ye6~4Aa&)}EKUkoUa}8N}{I11l(jQHk zD(ID*#^)lH1G}`i=(-k!Z%*m2mqb=)w;?f-E}+TaHD75o9cBd#0d0VbEsN~Xze!Ud~J+^7d*=C<{ z#8G}(>!Zf)Qg3hX+Jk;L?i5iHvpy`qMhZs82*BXuMXF4UI!!w#%TC6T3)gcXH;Ch# zIXYr;&M%KwS|vREHoGa`zYnZib}tH%Gpkv^<63(H){hL8!AgslB6rQffhDbZ9}ti* zef|A~XXK$FA>RPj0}&v2y$T0pH>lgV4vV@D5APDj=8v@||8>IMyczN#qpTbwz=}&i?fSvp^bEr&yjQkjH0jN_Ld`7L+(_XR! zXbPJN2GDic<>kLxpB|2VH*>}EC%?Y@X=pJBq$`X{iAGRD0zS}!#g!%C9{@5pyME$K zpB;V308uxs(V#73AgP)^7!v~OBkgvs-fp8FU>^+~-8WD^U+ONeuC@Wc!lVj#!~+HQ z3jn~(Kriw9(D;L4Xw_Zk=xAhqhBuLmi_65sgj%b&SBXX5aN4h5SO8IA)CS&z1qbv0 zKa0UjRMcNdw;`q(<~#bEp2p)AO>y|iiHW|!!J_jIfq7e{m)Hx4!CwoNpCu*0dE1R1 z^g<{e9X+Sf|J(~eLZY2Zt6Vf)`K=o@f|#cRWC_iO53!;i2nYy(r?c3YQ1~QMI2`RaVX%H~l0h zmk;WsZ`0oWV#g2o4lvYTQuV+hD%v{wZl`-h00*fO7-@wwCfzgfE`Pkht1veJgiq>w zikRFq0pAO7957v)B67$1?Y77`ZstH=q+V-Ds8JFRj2P}EPQc7M&F(Ma@3eBpKlRqf zMDlcuKY+(J?hF9zKARL^2t^=vOifL_LW}10-v~8u3U2k0)||4K82Nw}G=IA>rddl{ zd)$;=CYk-`tger?26TU}!T_{&s{L}(tLeppEPyL9h`Hq{y-jRwnZ>@Nt?549Cd3+- z6dIYBNc;J>PZ)B7#`W=T2>Q^vyv(f1^Qa6-q!Er#1@Z9N9NnNZ{fr07PF<@plMopICAOg z?*2To)fYeVoX0Tr_M52s`e6IJTaPs&{iRA&K9Om64GV$R12wJiM7(;^8Pt>3EoOV1AoR(@y_0;F#|uy<>HB zY)ZDhX!J_fDCz0$4gw=afXVB)?@|INnk()gnh9!T42$FMmP*$HI>()?GC%~M(zP^Gp$jMqK@cx8L&h(pi0havc%DldI<#pP7_Ot-$h=PtM zBSX&IobK`QF&Ya*2`gNp6S$LMQn?+#@9mGFKA%?AJ&p9a4*-e60#+=7RAAwqXcbSV zGt3z1(cdBrsuWEFNKsHx`3~}`*3Q8pX228}O1_l5azM8fkw8H22&^~T%e}9_TId@X z$OfPhy)o4t52T~x(PEOSuGechIXU1m0AZ*oq$hi0X~lgW`S&_8$BLeg&h_cx>IDIh z{qJhgj`FFXr zxTxvgw`R3g5UNYEnJ$A!0SPH7shalZ3lWYxV}5{3c{k0*v&FA(Z-J&jMn|XQ<9h=- zChw=al^l5*`J!pijQqU6f3_!p9tVQ>e75y54x~Yqe&@5&zX6(ofY*@*pvOPZnjNgP z>i#LLMzjX4P*5$JHEw!xdfGlc{dI4$JX@v64M+@<7Bn^0wc66Rb1hyT zW+iQZ7wiF$JVOyU{Iie(I-qyH%7oHmi8iAIMeHkXY6{pR^vm*c1vi;2XR49OEY#V5-|sU7mbj&r#|vu@f_FWd70TVbOyOYY=+(eO zr+spNnbmKY-PEMjgs@}~CPA^exrvcL_6G$VC94Grt6!BT3eGM2t)OwPNQHzfl~PgI z+MEV9)Z7g@rRGCmvj)|-^04R2RR1qm!T<06?&J>r)ZnH);1LBH+;FcQiEdN&>}m5i z?Eh*x#ug7L50vA!tjqpR;Qb%1oq0HyZ@cbEX;4W@C{!{OGRv%JG9+c5Glx(_W+^3^ zLZ&igCYgsa%NRm3rXqwg&qKsMpZ8sRt-bcU_CD4htK;Z6e*NU@`99BmU)Onk&h!2@ z@wNAsnzmN3)!~AR?7+292{&g@ck^6VZJig#hVOddm!8|ADqiaFbIMS;T4>1My#?v* zR#;(xs~?7~-d@*%SQu%IZQb0M-jwTyyl=7bSo>=6l}juC38=hiv`b5ri1<>E(Y zqM^k9m0BO51o>Ic9AOp~j=<(jXuD}K=>kM|qp#FyQPNC4*D7Hoo7If4phTksFog?$ zPeyIxu2|3QquN4TB6Fbl^%OVyQ^j17FEYRXCyH0lZ`I`dwa_XtIe8AFHIK)}x=T!V zVO4ZvCF+IqvEP6W2~q7`Y>(W=1M^gSl{GP8AtWX?S-88ek55peC>NJMN)9nC zf`oui`7uew0GQvI9lYSaGO)eRacB=gwfXq?9LLg9W)>D|Zty56Dc#q~Fa@jgdi?kw zTsl<5ctO-Cnt{rdi(pdkDK&{K*10Ce0VG`(v|N|lh7pT-wI#z?$G zaV6*v7@1j1ltI@UO+u(+jKY-@;B0=R*$9L1z5Fb_EHg~Q&%?sxoF;*4K-eqm>%B3n zW@8?4*437;{bIlP@03$kUS5VZ1N;5#}hCH;dR}!zM8LzL*qWL>a_gzs`R4foDUf}RydCdE$tFD-t zF?f*O-$p@0yetYZ0ebK%H$J^Ohdz^IKduH?Luf-EAD_FEy`iYxk*Mjf6-_=xy<@ZQ zBBpo&dZIJ~JfhZ;%%EG&wR&uXJbk)rX}VwEssd!Md~HgMd=GsM@q|H_fwUbQ1E|>) zp9Ke3#mRWTyZd`T3A|0C<*Dzx>G%>a&?bnq5vJbIkWXM>mYT1W!$gEi*CB4btw%vH zWxV$W;TwU5hGru0hiyNAF2ifA;pzdi<=76(ef#$9NkBlkuX<;35jszq^P+S@+rIt# zt3o-{NeJpgLg05EdVe5meyH?+x&=g46Mc+(hRf)5<>Kd`4_Nx!ndM#!wYxIc#GRB6 zu1+q}T z*tTZv$yZ1~c`o*5UJ7K~%_trrXxa7b*|SP;|D=Aa+jH%J+;yO%a<1_sAS z;3C&U-eFoE7#w^M9vZUsOk*$m99f$?!) zxgC;k>rA+CyS@QZK6B>GZP}EO z^##)dtlI=|nIpotUp3~qxw^u0@}n2r1%%yTjO$Tpk^!=7Yis-XLXaX`z<_@DV~ek= ztE5NMNe7cZ)#;+%uq{c|2?z3oC1RPS!8~G{x?dCT+(%0KfGf( zd3m6cjcU|X5yzPu(V6K*?axTb>~kXR*D(0H%kb``~|j&SMmT(HiAuZD$&637@C2PXHGW7>tc;_~zJdwDMg9Pxo# z!;=ZVuUT8u-L2j`g|`4{{W(pU4WlpoB)z;{oPD$pZO6*Yti;Z`U>r_Q=h(S(=g;Bc zJ1~1l(EDqDwIy6j@8m=euUH@E-kUzHcFTi5Qh`Vv+!?A91PO*~PvDem zX)1))!{of+EJ1kml9H0hE{HL1DlTE;bAzk=^w=2nfW1Kizm>tp#)gJV>pWJsQksf= zadPrc>pwjM)!y(<=?S7uDY3ARxRX!~AaxjitH1_{QV0OKcew&P0?q+})KH2Igr&b0HHWNB0c+~*-(epxiMa2;m9r4Ze zc@Xtn46CA{O=a=N9@-kCfbf%{cXXQ9k9_uP3%j!rHo6#m^0da6b z_aU?e@cz9?SFVEuOD_HsVV`K7a5eSNj;+m1C|qQe;*~@>1>(ZFF3(q7|43av{5d*0 zzp*xb#$IUa1JiT!v2)x+gzCL6Leu}XwrtjA;2fHsZjBPLyKQI3EFz-0tDhQ;5T%|s zQh~6LcWv7i#!e3OC+dM|t>MFmqoSfO&OId0u^Uwc#HWQ$LdSZ3{3wx`KmsSmX@t(z z%`Gi8^+(86$z$Byfq)LV&WjdUAGAWZXyfAIN|*awNHA+Cy|~N?OJ`>02L|SZ=afY{ zEy#&rTO_=D7qK|rtqdsvV~L0)(fcQNUfFPX%q(^hpMo;3zp2$**WMmtQ@;8b)1v%2 z7gAh{Mwzp{pqLin0MPqCMrYY^p9qzpvY6|A4Q7#dgxL-dEC`0i%F0TPNe4?KX^s*a z0+9g>3S7 z&KRuy(O3_~ix)5A^*ZmUKe`R@GV%3oAlzJnyTCTXbCLNM{+#5NtPm-!sTsK-0alND z#c%yh7`FiW%^0Ntv{0>gB+i@hIBXiMDWaKU(^bP`g)k%e7%dhKA$F?myLy%$mm9V) z+qG-gROkA#^rbp11fe!r{^a@_lt5YV%>oB2#SsVi|`H!9e>=;$nwT-2> z6~lN3FeQlhqHR;AIvla&u=UsHBnm1jDphG~CxE6~U-$q75(Uci0>S05X^mHbl#Tf| z0Q~LNSMI>$ju0^4k8GDBTL*~A3-C)|iHuXEW!fPO+xH&%g)^|ax{=7`VFEmU>{wi{ zJ37SkEe0h;MYEVKo`r_mU)tQ)!4#>$y6rE-==HM?Fw=)Te_rFw?PwI2*1UohhCMO zntEAFqN=zbTZO1`H=LAuB~Or^I&~^>2#EURlkCn}^$e|Agbt!c>{ez5jz~D?%W3@| z!1xt@GD%`mlI)#LEe`O7)cpgsK@3(q_wG%8^TrPlA7HauHe<=*d4sV+jCdr#fa;f) zwha_+Ah5aRicJO>#V=nTMq9@Sj;Weh@S$qkTnLnlhoE<1tM*HV=v7tJKP27mvOidY zZ1jqC|C6Rw%#7O;o1M)AObjOX^u!a4cSsW2L0y4IfFXkEy&s_X0Md1sWhv{&p(zW0 zCHS;gB48EV6rfKFBPAT4NPaUC`5U8X5joh?F>Xtm<}b1TZx7b&{9S_Pj81zYLruQv zd6e*-2Y9V{On>mR9Os+QkXj6vmY0`1Iyyd!iP2*Liid1*p3sZO6dGcyyH&3fgw)F3Gl%%F! z@9VAKTOerrADs3OiBTN}`y3;qN7px{`r0M)S%0ZDXA)c-fjhVQw2FuGwt@RCc4M=Op{U`4($fqpVoEu9b#e>@;* zzGUN{VLb5(g>w~Fl$wbLhI}yD6)YF7&iss9-`)i!CY}(NkkHJ(Nrk1P`l1nN#uxT| z#oG7jC%(QRVYzpJBL5YiY9z(xCh?hmq$M;xhP6$|rTb&x$ zq#~yFPZHg^-Wut#W6ay$stY}X9^oQf8EQpP7xNn*5ZoVQV^7u6hmm6`yChS}3L0aj<8D;mCq;^}YG7K8chBzKi9pl#W$QHchxA?F6Ti`w8nB8J zN0iJQw#rWqp~D0V)9)rnWllU=*~OxFi%$6VQ8bWneRn#9IIyTOznEep!?%y?9&c!E zMcC;euBoxHab|8V9;22HMwR&Z<3O!9`^*0_Y|FqShi#6%M$+`c4LOty=^e|HU)cn` z9~e~tsj^8(FoZOm*U>ow)^6+g27O4KBF}*hdo&se1WI&xtO8PbiYJ02=@k`He31%s zNr1vCX{%+6UD^m)0KHG#p0zmlwZ>@|G!tMG~*n2!+;-<;3PjRX*#BoQO^3B^xnr>bg*K#a`zSGEEMkzw+`I(+o zUWGxYe{*9QVi%7%|M(dV#zu_wXOpfY!GzmXR=rmJv@-z1dT{W5*cCxd!$ey4&6_tD zPlk_p@mCZ>mjTsc(5IrIVbv{}EDrn+pnR(S?oXx%k9o0OCD$hS5&x^pHEAM5IxU_a z=o|Xm4B|TkZ$_p9?F=LSsWpsTc4HkU8C_@Ivlc(-YS7J~nnH3I87Dq$!QhaPBFx+v zXfV?kG@hy_3J(G0J9#VC=j1_{0;S`Qf=vS1Wa<=Ep%u`=z6BXs$9Bu;%y|qr1|9!8 zv9_*`2oBl7J-g^nPl#}a9vVX%A+s^9jViq> z@@|d#J#WmZB)f8NUS93i-f@MM8Vg{M>lY&!3~E)qF<+;-)PF@{=ka&j84@-rUQkx) zaZwuNg+0nvZ#us_jOrgJ6aM{b{^elO|3kHYRX3fvJ+ENpQ!6O zJ%Sv&A@p+kU98UO(W229W)_y(-%mf-79Dx`{!@>pwMx{NbPRr_GgTD80QU(}`|XFfvE+pLo+2j<8hCELK_bZMG(KM zh{O_u{J_8f;fX;eZh00GLZ}(odWwPV-)=dktYbTSALLNWhO-X#aJzf14WWiGZv6nA z(`v-P!Z<$#XwI}}m$lrFZ zDC8UJYr7Bnuo2N(MD~cEECvF2cD5i!;;X0g|8{R|9OfS%CXhsQe8KSqgAqaPzdF|EogB!a<1eD!Atr)I7fs#tr4 zhew~wv;^UE;<@kGx$~H$BqQ$G7BaF`Tx&yfvk43a;^2eS#%$mTR@To2mg?>st7heY z#yC*X^=h%j%2g+_R8G-Jxr-w~1oSXJ-zqg7cC4j@v^LJ5t~W(fnSTxsMbV2k=VDu zf}iM-;&Gh9k(Z;O-JP9nKJBZH>_Eo}Is(i0G`F)oV$CzzUX zJHF(bQ{(W)^7@~b)XSw*FeKk;#a8|&z#9TKMBwT;aBehuBp!dZUzHjLk3p1-9>LTG zKwH_B&B^ah8mgUtDrcuX$s8l7c5XjQ`o5CXj%0srT*rZwj_Wd6VaZ|LpBv?cbV@At zo)P44?vT5}Wmn9i)1XN$=&hu5{=mK?bjC{Lqytg?OzXnx#`~U~6Q3S+a*h!;o3`)j z%W|o3$tYXurJ_P60yj~b7(9^nf;&?M2MILF(8{VAru!q9{7p^rYcH?75I80xQlue) z)_wuB7}1uq0|(oR?Z=UQsjsVhj2OaRF)^_tM~-~DDR6>~&B)A5z1ro?22oT{UE0JQuz+WrL1bqUu&8c601gr{v$o2z; zoL!l^AXR&zajNUJgob1amSP# zS#WGiWu)-Mix+B+6)GJ=e!pJ-ZnH!^>UBnM+jHsCrCU~3@|@uj5tq@maHz%2?eFy= z?V8V@_mh#45jmuPQ0R6%Gf;RC)uSg*?sRckGaMH`q78cx8=v4|IIMzG5ZU;bZ-JPQ zh7hE$u4nL6kBpe?uZRU7+h1XV&$tHAhdG7%WMLGHV*@ZHFcZ_#(;FHXya(gK?O?`O zfsq~W1q^s)ZH?>(E`Q98+0xR|N&yN_!g=9S*Xn!6!?d(FryIf?cGEO8HF4PSCxWfU@t=UtkCYMMWu?nzCYz z8DRXVEv|$OhlWwxxB{D%fKFFl3T1o}qC0#zd@V4QRmJ|iy1l<1^p(ujtAU_jSfk1# zwkH06Tp|hzkPqg1>VdTh@B~`(94EeVtiB3i$3K4bXd4irhK9y-_W6Mx+?G&)4Y&|& zh#(UoKp5||baZhkDVNmL)L53z4vV+!C~d5J1F(!33mBT*@Mh+nkl^6k4i0s7b>!OG zU-`DTVkWs^gO4~(VhIZiJ8NL$e=)%T-c|2bwYyb0xw)S+UqT{ol6VosO242Rf{@tgNA>g_W5(p=aB9 z3kwS$qa^kXz-|MOXH|N(*%N62*D_VDslx6Z)TKxJv$eHF^W|zA^Y!&5@@urTw6_t5 zK^z19lNjxZqanXPvk(sPWT&b5Y5nq#U}}+kCcAK~g-`~@#>SuC-7)HOTh_JiFK z$s^(ToUC z14tOzq$)s_oRShw-ygq%{gr3ZL_@xt_AG!jp-qqn96&|^?rcJbDAptyJhI7tC@2^c zd$52|UoN@2ieq}mxvQY(&s8SmN|RND^e&96JdTZJLSs8SAe(s^M2JY>FfuYCbb6H`1tz|BYsBYs9~@`2XUxQv#F{ET6ZnWCU0r zHo4;6y8=Yg=G3Xz7q14J)XJu*@ZtLq8$C-z`u@6K_`s`Hp|V8FVZk!qLLHI>tNoPF z{p9$Cg#}o}(GE)fj=9is@aGlL`P4@Eu=SF#{sBw644Y$aVgC?5NGW_*WG=#f6{T65 z)HVRx!ve}-jksGbJ@q)pdPyuj|YPg=$Eg!D15eWF+P$L*8e z5v`V>{DzL6o=9KASRf>u?_&Sh@87&gq@#WlVXRZ3PcfK~ad2=zG}PmApljlAHkn9a zgvwn|Q1EkjK7#zi%`dqu2$-Q$*n)>#Z@Ss_h7R*j$3|vkBppbw2WE+r1-n=J&sV`! zHwLGxEldNXBxYhnBr!uFImiGyDJ&{F*T|8D`g$JA4ZZDrhT0Gk;b2w;l*gdUmsuE_ z9fQ#f{cuGgIPGCm@t0i5VmG#zRd2q*%#ZirA_UPH)MURle}a6m3CyMuNmn>52&9A} zKRYw+v3Z#NNbM11&~bTKyS0qtgdRp{W;ddT%*@Qh$ww@CM4Vv+9zsLO$>BvC+jawn zx#%K&QoU+|&u#R`pCco9sMiNeFs$Iy(UUQh5l$XPjUPipG617Eu****ZSbGixBLcG zTcN#CSWy&sAY3OVC+Q@d1pv{x^9ZMQa$4b~kUwZLjAjiBIt&hG_$j?|xL`gp+iia9U5 z(=DKCCci%?;mY^#+lK>YH#5XT*mfam=yOhj`p_ZohY!h6rywk6KJvHXhm)b6-M)SM z2J{u6)MF$C4;&87%*two>ePI9`xtIZ5-=els8C*QfxWfzZ+fC8aHzdWtewUwA|OStXq?4S_3Ba4p39@ziz4;ym!a5qVQ3=USomAYeV zE1jldXlkl9Lbe1C8tZ9No(#w4^|()Gj{9o4tkpbxyq7@^wXUV5rMGosef}zrM-hkU zu>~+3Zh5pbBUPK1jcq$Mb%-IqBF<`bh2we#a4?bARywiBt`*fWUcueZrN1yMyq;DIrf+5DQ}3Awgc~7_x&{2E;zc z2w8`*sxjL3x{6{3W!T9V*MASFd1qyDBN;WA5GZMgGX%Y9@r*IA$KRj8lkf&hy$)CI5`#8+)Iul*NeE9l9(-+4`M_o=y}REhl$*}h^K-Td~B7dN-2t`5f7!-NFpy?gg! z2)t0D1F?qlcm_zuA*)52jj0XCSUu&EjvqZra^}q2;$FWL#SFG8gj1jhTEWO?7Z;PT zbif8k&CJXujlV${_TJk%f}MNg2FU@|wD_$?*f9~jMmVFMQCO>{MyJ#>CWeS{4)q0d z6O4w$@yb`Xr`o(nneFf0>vnK~iaF@AM;UGqQpAI3V!f@fypfYyIBC?qqV z7UTB8m*3O@3V!|Uj6Z?rqr4!*0JR?Jk5uR3$%(Dww$j0CiZvjaPd z(C!x&7oG446<_dC4>>MQCZVK{mNytn*)-MYFc=dzfnDJZiZMxV_bV7i#8Dj5AHRO3 zy2Y8GC}UVQz*em-TrOMgt8Q%E^+?(?Bt$uKnK9NlsrCo*84(c?H_Xj_f`X{9Q@NL% zY5!4UmD^?yP*al~P<((DK5ol4bB2efvcF$n%*7vP#nZB?_p2(iE$@&gK5wHgfWa3B zRW)&tyC<8JJ&N)!x$v4vN{xz@MalWD&GC=If3>rv2%4^TxJ}lTa z+}z22`7q972vnkCK$_Ph_RxcAB%}MUIg6ctmk}SO;osx<4=G!}PHw*LR5aXc+k$sI z+9&->K-Noo$FaLF{!=q%^-aZzaI;N(&R8jNB zx&hKbyk#TH_PFaxr(C?l|Kp1|M1pnOq^iWl!OnhEOswRyO>CHBr~m6ZiW8>x7Xotr z4BvqO3KZ;41vM<%Gfw5B{+F3IUH^pMVhA9u^p3dp6I8p7d3`efZ(p+P@dN)8-xh0_ z9M<}y&GNjidV(5V+U}fu-mGzpj@K8P>Ei`dy6gqLQs4gkRqRw{ayW}p>&?2}tR(wiT=+*QIohY&AB?{-x zNuDcFr#gH{PrhJ(vGo1{<=5T6A_a2o;)0?nS{IktmL`rp=yp|T^pDt;VbfFTMXF3Q z(3^H<)k);YrajB0&Aj->mb&(8tr|RI56|7&6peUvj^Dihdvu;Rx43QDluVi9>STC! zwh*)UiD1E4YgT@V^l$d!uHRQ@O5V!3mXCzQiewLKguac-jp`NUakY@@+OXu{SGzJe z6F~h6o^Zd|&Lt{MN9Q+Wj^~ zYsI<{^`Ys3H4>@dL2gOgznRtj19aYItJW8#IB!kRuFg7V>hEHa9CYOBC?DLtJ9Ne0 z!}D0k+KoiMnsQa;jrrzjzethi^Y!r`D)f~`id!aM@Ef$Sm+$HM5K7TaE9J6vW0SV( zb)Zn_+Doc>Zr<8uWd$xjOJM)V*dL#J99=^YO_%q!j>2rgf2jZ)T z=vFsgUFvch9L)-Hm3S0NdU$54+w-^n)gN53ftE>qCT;EASu?qR4r(m9yEATT@hGg_ zGc|p&w0UsXHY8bW4<5KGQFLkL`EN0IA=WUVZ>`Oy?GxQk_K1DV=&_s7Sf?44aW|Uj z$U3E>NJdS;*S=r2i0aD6$cOln(6Zh1>}+AW@H?k1JSMf*M3)$9t8d?Z2Z_i0f4%u#XNU{9iv&(!Ci0OwEaT`j=o5X{%&~m zz4`as>EIX70y1P0_`1`Gk3`6c-Ce(Iaut(2Ntyn5W9gly-=eA1g?ojDGi?kr2QMmY zk?p>|L+{?RJ@fZo*(iw@`8nDgwQS`y{Jo*+c-OAF;32i8;%SmsU-w-d`TK{GC>Pmgxz{Tj)9guK zp9L2?#=4QN&cck=9_{(Qr)RE33jI*i30|7-@VaX|Jv_VGGkjz;VBh75DBgZTwtvq>JCn-`lLnu{EZ4Rt3A8qS)32yUg!`#E2|RblPg zn$w@}#^r0gBrYXt#wOnf^0vwN6ua)PkfbhXit=4~s5)-?sn!xk*yCFL!1}l^dHJ@p ziHmu_5Qls%-Oz98UK`)K^FU0oPkV+WlHb#o7fWnoq3mX?V9zr zbWbpIkGeltoyjxJCA z^4)L3COPE)M4#aNXqBJQ|MWv^MQbU`21zQ##=ZA5-CrbhDxBz&%1If%E)Pe`a`31{ zh6F{v)@40D$6n;Ltdvf%W6#%1($|liG~XFPul+gEhdOLTXx*sSnPg#c!TeLDSCqw{ zdt74ysJfR;o%!U*m=!qb&8a&c($l_duk3j6vBT?9Sm*DgiaQcx+yPS>EwN(i^HXCX z@9vH@Cxw*Itt{8(PfGfI7&@1fsom=q@%(U3D#fX=SB>pmqneynA7%Znj?k@LocOY` z{p6YUh+ZR_d&*5r>~qCBnBR>rupEF@YsJ!JRDJ)E1qqG}TT z^izBHP;HQ|tnB4ccRfkEw8$eAe|#hCW^ZX1rdP=_z4G*-a=UcTtbb&md(_)#GVQ?G zS`Vps10(rKKCC-_Z)ObvC;J?G=BpRmt)8%%%ia?%=XkD{g z(}fOya$9%f2;E9LH9FF6md{$V zY?Fgdr|1K%t-ZW;etyeg*K#S@zo>qzfKq%_@FrbTd9<`eFPD3-XrNc3@B?>!&5S?= z+QTp7vQnZp(>#SLEFO+QckM%kjtN>%0DvT!|M}o_{GAlc`&`q}aA? zS!82ePD`?zIyTN@R7yVi_VUsmp^wf5(rj6}>1Llj23`AfN?)#*9#P!fU=CN@*jqVV zv1DLqULE~2H>(&$WT(!CBv~?NRi)B}A7_}JUGogP>6AOwHxwO{_o1O>+l`r@lKHpu zhDOMiS5Gl7t*fe$-})JPZ;gMdec)SZa1BDCC1vG1dn&(fGNSt6-#?;iu<4(2GImnc z9KF`U@KobDchiLFUjfHB5ADdflJ)M_G~XB?9_e45B}}>y8McNU`@o) zn4e^G!{SJ!=I=*~YKO8N+Sy!%-HZy>TiT>Nk}_P*n3m3ywW+tXCVS&edaK&%!K34dr(39~bW~IL&&42D|y@_^wp{b!k^7**ysoH3< z#<{np=7Zn%W_j8Sj(rJ-2DB5DScy)erKhuVUJeY@dq;k9Pw3sT$@lRM={!QpZM9j< z+7*9nqPxr+{>c_%1j5QeoNQH2KN8e>dwuZwiRJr2;y)0Iodz^?GbZ< z3P+s$2`b4X@Rc(O)$iPA1yUR`hDV0;I{rU6whQnDrjm^Fdjb0Gr6|z)l> z57_%RrnaR-oj7;Qi#_)LGbH^FO&tHtk?gFL;C}&x8LT@1 diff --git a/desktop/src/app/app.component.html b/desktop/src/app/app.component.html index 9d53ac56f..404b64eb1 100644 --- a/desktop/src/app/app.component.html +++ b/desktop/src/app/app.component.html @@ -56,7 +56,7 @@ [text]="true" [rounded]="true" size="small" - icon="mdi mdi-window-close text-red-700" + icon="mdi mdi-window-close text-danger" (onClick)="close()" styleClass="select-none cursor-pointer mr-1"> diff --git a/desktop/src/app/camera/camera.component.html b/desktop/src/app/camera/camera.component.html index f1ad36178..8f218de17 100644 --- a/desktop/src/app/camera/camera.component.html +++ b/desktop/src/app/camera/camera.component.html @@ -96,7 +96,7 @@ - + {{ moving ? 'moving' : 'idle' }}

diff --git a/desktop/src/app/guider/guider.component.html b/desktop/src/app/guider/guider.component.html index 5f216fb0d..c602ba772 100644 --- a/desktop/src/app/guider/guider.component.html +++ b/desktop/src/app/guider/guider.component.html @@ -48,7 +48,7 @@
- + @@ -160,12 +160,12 @@ [options]="chartOptions" />
North East diff --git a/desktop/src/app/mount/mount.component.html b/desktop/src/app/mount/mount.component.html index 6a4cb88d5..e8acceb0a 100644 --- a/desktop/src/app/mount/mount.component.html +++ b/desktop/src/app/mount/mount.component.html @@ -42,7 +42,7 @@ [text]="true" />

-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 E06?s=EC2ui literal 65719 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%0A#^{$LyN^4Bi$|4)wvRtpf`9t~iVXH4x7!o$ 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

- + {{ parking ? 'parking' : parked ? 'parked' : slewing ? 'slewing' : tracking ? 'tracking' : 'idle' }} diff --git a/desktop/src/app/rotator/rotator.component.html b/desktop/src/app/rotator/rotator.component.html index ecfcd49a9..7e9cc5dfd 100644 --- a/desktop/src/app/rotator/rotator.component.html +++ b/desktop/src/app/rotator/rotator.component.html @@ -32,7 +32,7 @@
- + {{ moving ? 'moving' : 'idle' }}
diff --git a/desktop/src/app/sequencer/sequencer.component.html b/desktop/src/app/sequencer/sequencer.component.html index f68882700..815df01fb 100644 --- a/desktop/src/app/sequencer/sequencer.component.html +++ b/desktop/src/app/sequencer/sequencer.component.html @@ -1,10 +1,10 @@ -
+
-
+
@@ -79,7 +79,7 @@ (ngModelChange)="savePlan()" />
-
+
-
+
- + - + - + - +
-
+
-
+
{{ event.id }} @@ -288,7 +288,7 @@ {{ event.elapsedTime | exposureTime }} @@ -296,7 +296,7 @@ {{ event.remainingTime | exposureTime }} {{ event.progress * 100 | number: '1.1-1' }} @@ -304,7 +304,7 @@
-
+
- +
diff --git a/desktop/src/shared/components/camera-exposure/camera-exposure.component.html b/desktop/src/shared/components/camera-exposure/camera-exposure.component.html index d18dfc3d6..43e5f5026 100644 --- a/desktop/src/shared/components/camera-exposure/camera-exposure.component.html +++ b/desktop/src/shared/components/camera-exposure/camera-exposure.component.html @@ -1,29 +1,29 @@
- + {{ info || state || 'IDLE' | enum | lowercase }} - + {{ capture.count }} / {{ capture.amount }} @if (!capture.looping) { - + {{ capture.progress * 100 | number: '1.1-1' }} } @if (capture.looping) { - + {{ capture.elapsedTime | exposureTime }} } @else { {{ info.frameType }} - +
{{ info.exposureDelay * 1000000 | exposureTime }} - +
Date: Sat, 29 Jun 2024 20:47:48 -0300 Subject: [PATCH 26/29] [api]: Fix null pointer exception --- api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index dbf797b52..f1af37977 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -97,9 +97,9 @@ class SkyAtlasService( dateTime: LocalDateTime, fully: Boolean, ): List { val position = synchronized(positions) { - if (location is Location || location is Mount) positions.getOrPut(location) { location.geographicPosition()!! } + if (location is Location || location is Mount) positions.getOrPut(location) { location.geographicPosition() } else location.geographicPosition() - } ?: return emptyList() + } val lock = synchronized(targetLocks) { targetLocks.getOrPut(target) { Any() } } @@ -237,8 +237,7 @@ class SkyAtlasService( @JvmStatic private fun GeographicCoordinate.geographicPosition() = when (this) { is GeographicPosition -> this - is Location -> Geoid.IERS2010.lonLat(this) - else -> null + else -> Geoid.IERS2010.lonLat(this) } @JvmStatic From 266b5c33cd466aa4a151d6f0eb85c3f736f1e26b Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sat, 29 Jun 2024 20:49:40 -0300 Subject: [PATCH 27/29] [desktop]: Fix Confirmation dialog max width --- desktop/src/shared/dialogs/confirm/confirm.dialog.ts | 6 ++---- desktop/src/shared/services/prime.service.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/desktop/src/shared/dialogs/confirm/confirm.dialog.ts b/desktop/src/shared/dialogs/confirm/confirm.dialog.ts index 4131d2560..802fb7a07 100644 --- a/desktop/src/shared/dialogs/confirm/confirm.dialog.ts +++ b/desktop/src/shared/dialogs/confirm/confirm.dialog.ts @@ -13,24 +13,22 @@ export class ConfirmDialog { constructor( private readonly dialogRef: DynamicDialogRef, - private readonly config: DynamicDialogConfig, + config: DynamicDialogConfig, ) { this.header = config.data?.header ?? config.header ?? 'Confirmation' this.message = config.data?.message ?? 'Are you sure that you want to proceed?' } reject() { - this.config.data?.reject?.(ConfirmEventType.REJECT) this.dialogRef.close(ConfirmEventType.REJECT) } accept() { - this.config.data?.accept?.() this.dialogRef.close(ConfirmEventType.ACCEPT) } static async open(prime: PrimeService, message: string) { const data: Confirmation = { message } - return (await prime.open(ConfirmDialog, { header: 'Confirmation', data })) ?? ConfirmEventType.CANCEL + return (await prime.open(ConfirmDialog, { header: 'Confirmation', data, style: { maxWidth: '320px' } })) ?? ConfirmEventType.CANCEL } } diff --git a/desktop/src/shared/services/prime.service.ts b/desktop/src/shared/services/prime.service.ts index 8ff451086..3d450f9e7 100644 --- a/desktop/src/shared/services/prime.service.ts +++ b/desktop/src/shared/services/prime.service.ts @@ -19,8 +19,8 @@ export class PrimeService { resizable: false, width: config.width || '80vw', style: { - ...config.style, 'max-width': '480px', + ...config.style, }, contentStyle: { ...config.contentStyle, From 64c60cdb666c8e09bc89d1e23c22cb0dbba20b58 Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sun, 30 Jun 2024 10:55:47 -0300 Subject: [PATCH 28/29] [api]: Minor fixes; Add SkyAtlasService unit test --- .../kotlin/nebulosa/api/atlas/BodyPosition.kt | 5 +- .../api/atlas/SimbadEntityRepository.kt | 2 +- .../nebulosa/api/atlas/SkyAtlasService.kt | 8 +- .../converters/angle/AzimuthSerializer.kt | 2 +- .../angle/DeclinationDeserializer.kt | 2 +- .../converters/angle/DeclinationSerializer.kt | 2 +- .../converters/angle/DegreesDeserializer.kt | 2 +- .../converters/angle/DegreesSerializer.kt | 13 ++ ...lizer.kt => FormattedAngleDeserializer.kt} | 2 +- ...ializer.kt => FormattedAngleSerializer.kt} | 2 +- .../beans/converters/angle/LSTSerializer.kt | 2 +- .../angle/RightAscensionDeserializer.kt | 2 +- .../angle/RightAscensionSerializer.kt | 2 +- .../kotlin/nebulosa/api/image/ImageService.kt | 2 +- .../nebulosa/api/mounts/MountService.kt | 6 +- api/src/test/kotlin/APITest.kt | 13 +- .../kotlin/SatelliteEntityRepositoryTest.kt | 14 +- .../test/kotlin/SimbadEntityRepositoryTest.kt | 34 ++-- api/src/test/kotlin/SkyAtlasServiceTest.kt | 159 ++++++++++++++++++ 19 files changed, 223 insertions(+), 51 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesSerializer.kt rename api/src/main/kotlin/nebulosa/api/beans/converters/angle/{AngleDeserializer.kt => FormattedAngleDeserializer.kt} (93%) rename api/src/main/kotlin/nebulosa/api/beans/converters/angle/{AngleSerializer.kt => FormattedAngleSerializer.kt} (79%) create mode 100644 api/src/test/kotlin/SkyAtlasServiceTest.kt diff --git a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt index e4d09fa3b..64802dd6d 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/BodyPosition.kt @@ -3,6 +3,7 @@ package nebulosa.api.atlas import com.fasterxml.jackson.databind.annotation.JsonSerialize import nebulosa.api.beans.converters.angle.AzimuthSerializer import nebulosa.api.beans.converters.angle.DeclinationSerializer +import nebulosa.api.beans.converters.angle.DegreesSerializer import nebulosa.api.beans.converters.angle.RightAscensionSerializer import nebulosa.constants.AU_KM import nebulosa.constants.SPEED_OF_LIGHT @@ -25,7 +26,7 @@ data class BodyPosition( val distance: Double, val distanceUnit: String, val illuminated: Double, - val elongation: Double, + @field:JsonSerialize(using = DegreesSerializer::class) val elongation: Angle, val leading: Boolean, // true = rises and sets BEFORE Sun. ) { @@ -57,7 +58,7 @@ data class BodyPosition( element.asEnum(HorizonsQuantity.CONSTELLATION, Constellation.AND), distance, distanceUnit, element.asDouble(HorizonsQuantity.ILLUMINATED_FRACTION), - element.asDouble(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE), + element.asDouble(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE).deg, element.asStringOrNull(HorizonsQuantity.SUN_OBSERVER_TARGET_ELONGATION_ANGLE, index = 1) == "/L", ) } diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SimbadEntityRepository.kt b/api/src/main/kotlin/nebulosa/api/atlas/SimbadEntityRepository.kt index a91e14892..825aa5dc1 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SimbadEntityRepository.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SimbadEntityRepository.kt @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component @Component class SimbadEntityRepository(@Qualifier("simbadBox") override val box: Box) : BoxRepository() { - fun find( + fun search( name: String? = null, constellation: Constellation? = null, rightAscension: Angle = 0.0, declination: Angle = 0.0, radius: Angle = 0.0, magnitudeMin: Double = SkyObject.MAGNITUDE_MIN, magnitudeMax: Double = SkyObject.MAGNITUDE_MAX, diff --git a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt index f1af37977..23c12e405 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/SkyAtlasService.kt @@ -5,7 +5,6 @@ import nebulosa.api.atlas.ephemeris.BodyEphemerisProvider import nebulosa.api.atlas.ephemeris.HorizonsEphemerisProvider import nebulosa.horizons.HorizonsElement import nebulosa.horizons.HorizonsQuantity -import nebulosa.indi.device.mount.Mount import nebulosa.math.Angle import nebulosa.math.toLightYears import nebulosa.math.toMas @@ -97,7 +96,7 @@ class SkyAtlasService( dateTime: LocalDateTime, fully: Boolean, ): List { val position = synchronized(positions) { - if (location is Location || location is Mount) positions.getOrPut(location) { location.geographicPosition() } + if (location is Location) positions.getOrPut(location) { location.geographicPosition() } else location.geographicPosition() } @@ -206,7 +205,7 @@ class SkyAtlasService( constellation: Constellation? = null, magnitudeMin: Double = SkyObject.MAGNITUDE_MIN, magnitudeMax: Double = SkyObject.MAGNITUDE_MAX, type: SkyObjectType? = null, - ) = simbadEntityRepository.find(text, constellation, rightAscension, declination, radius, magnitudeMin, magnitudeMax, type) + ) = simbadEntityRepository.search(text, constellation, rightAscension, declination, radius, magnitudeMin, magnitudeMax, type) @Scheduled(fixedDelay = 15, timeUnit = TimeUnit.MINUTES) fun refreshImageOfSun() { @@ -249,8 +248,7 @@ class SkyAtlasService( @JvmStatic private fun GeographicCoordinate.offsetInMinutes() = when (this) { is Location -> offsetInMinutes - is TimeZonedInSeconds -> offsetInSeconds / 60 - else -> 0 + else -> offsetInSeconds() / 60 } @JvmStatic diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AzimuthSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AzimuthSerializer.kt index 948c88085..4793569e7 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AzimuthSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AzimuthSerializer.kt @@ -2,4 +2,4 @@ package nebulosa.api.beans.converters.angle import nebulosa.math.AngleFormatter -class AzimuthSerializer : AngleSerializer(AngleFormatter.DMS) +class AzimuthSerializer : FormattedAngleSerializer(AngleFormatter.DMS) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationDeserializer.kt index 0ed5dcbd1..be6243ded 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationDeserializer.kt @@ -1,3 +1,3 @@ package nebulosa.api.beans.converters.angle -class DeclinationDeserializer : AngleDeserializer(false) +class DeclinationDeserializer : FormattedAngleDeserializer(false) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationSerializer.kt index bb6664c89..cbd9f74aa 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DeclinationSerializer.kt @@ -2,4 +2,4 @@ package nebulosa.api.beans.converters.angle import nebulosa.math.AngleFormatter -class DeclinationSerializer : AngleSerializer(AngleFormatter.SIGNED_DMS) +class DeclinationSerializer : FormattedAngleSerializer(AngleFormatter.SIGNED_DMS) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesDeserializer.kt index b97011eec..8987dcfe1 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesDeserializer.kt @@ -1,3 +1,3 @@ package nebulosa.api.beans.converters.angle -class DegreesDeserializer : AngleDeserializer(false, defaultValue = 0.0) +class DegreesDeserializer : FormattedAngleDeserializer(false, defaultValue = 0.0) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesSerializer.kt new file mode 100644 index 000000000..138be30ff --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/DegreesSerializer.kt @@ -0,0 +1,13 @@ +package nebulosa.api.beans.converters.angle + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.ser.std.NumberSerializers +import nebulosa.math.toDegrees + +class DegreesSerializer : NumberSerializers.DoubleSerializer(Double::class.java) { + + override fun serialize(value: Any?, gen: JsonGenerator, provider: SerializerProvider) { + super.serialize((value as? Double)?.toDegrees, gen, provider) + } +} diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleDeserializer.kt similarity index 93% rename from api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleDeserializer.kt rename to api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleDeserializer.kt index 903907768..00ebee854 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleDeserializer.kt @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.deser.std.StdDeserializer import nebulosa.math.Angle -abstract class AngleDeserializer( +abstract class FormattedAngleDeserializer( private val isHours: Boolean = false, private val decimalIsHours: Boolean = isHours, private val defaultValue: Angle = Double.NaN, diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleSerializer.kt similarity index 79% rename from api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleSerializer.kt rename to api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleSerializer.kt index 938d685a9..48247c73a 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/AngleSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/FormattedAngleSerializer.kt @@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer import nebulosa.math.AngleFormatter import nebulosa.math.format -abstract class AngleSerializer(private val formatter: AngleFormatter) : StdSerializer(Double::class.java) { +abstract class FormattedAngleSerializer(private val formatter: AngleFormatter) : StdSerializer(Double::class.java) { override fun serialize(value: Double?, gen: JsonGenerator, provider: SerializerProvider) { if (value == null) gen.writeNull() diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/LSTSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/LSTSerializer.kt index 7e4340db5..0805380f7 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/LSTSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/LSTSerializer.kt @@ -2,4 +2,4 @@ package nebulosa.api.beans.converters.angle import nebulosa.math.AngleFormatter -class LSTSerializer : AngleSerializer(AngleFormatter.Builder().hours().noSign().noSeconds().build()) +class LSTSerializer : FormattedAngleSerializer(AngleFormatter.Builder().hours().noSign().noSeconds().build()) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionDeserializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionDeserializer.kt index 954eb2f4d..b93638a5a 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionDeserializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionDeserializer.kt @@ -1,3 +1,3 @@ package nebulosa.api.beans.converters.angle -class RightAscensionDeserializer : AngleDeserializer(true) +class RightAscensionDeserializer : FormattedAngleDeserializer(true) diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionSerializer.kt index 760bee164..a31bfcb59 100644 --- a/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionSerializer.kt +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/angle/RightAscensionSerializer.kt @@ -2,4 +2,4 @@ package nebulosa.api.beans.converters.angle import nebulosa.math.AngleFormatter -class RightAscensionSerializer : AngleSerializer(AngleFormatter.HMS) +class RightAscensionSerializer : FormattedAngleSerializer(AngleFormatter.HMS) diff --git a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt index eba2b43f3..13ddb3b69 100644 --- a/api/src/main/kotlin/nebulosa/api/image/ImageService.kt +++ b/api/src/main/kotlin/nebulosa/api/image/ImageService.kt @@ -240,7 +240,7 @@ class ImageService( val catalog = if (useSimbad) { simbadService.search(SimbadSearch.Builder().region(rightAscension, declination, radius).build()) } else { - simbadEntityRepository.find(null, null, rightAscension, declination, radius) + simbadEntityRepository.search(null, null, rightAscension, declination, radius) } var count = 0 diff --git a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt index 952411652..36d8b6069 100644 --- a/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt +++ b/api/src/main/kotlin/nebulosa/api/mounts/MountService.kt @@ -82,7 +82,7 @@ class MountService( val location = sites[mount] ?: return true val mountPosition = if (j2000) ICRF.equatorial(ra, dec, center = location) else ICRF.equatorial(ra, dec, epoch = CurrentTime, center = location) - return verifyMountWillPointToSun(idempotencyKey, mount, mountPosition) && + return verifyMountWillPointToSun(idempotencyKey, location, mountPosition) && verifiyMountWillPointBelowHorizon(idempotencyKey, mountPosition) } @@ -91,8 +91,8 @@ class MountService( * * @return true if mount can slew to [mountPosition] coordinates. */ - private fun verifyMountWillPointToSun(idempotencyKey: String, mount: Mount, mountPosition: ICRF): Boolean { - val sunPosition = skyAtlasService.positionOfSun(mount, LocalDateTime.now(), true) + private fun verifyMountWillPointToSun(idempotencyKey: String, location: GeographicPosition, mountPosition: ICRF): Boolean { + val sunPosition = skyAtlasService.positionOfSun(location, LocalDateTime.now(), true) .let { ICRF.equatorial(it.rightAscensionJ2000, it.declinationJ2000) } return if (sunPosition.separationFrom(mountPosition).toDegrees <= 1.0) { diff --git a/api/src/test/kotlin/APITest.kt b/api/src/test/kotlin/APITest.kt index b240c7f77..0166af1d2 100644 --- a/api/src/test/kotlin/APITest.kt +++ b/api/src/test/kotlin/APITest.kt @@ -11,13 +11,12 @@ import nebulosa.api.cameras.CameraStartCaptureRequest import nebulosa.api.connection.ConnectionType import nebulosa.api.stardetector.StarDetectionRequest import nebulosa.common.json.PathSerializer +import nebulosa.test.AbstractFitsAndXisfTest.Companion.HTTP_CLIENT import nebulosa.test.NonGitHubOnlyCondition import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import okhttp3.logging.HttpLoggingInterceptor import java.nio.file.Path import java.time.Duration @@ -181,10 +180,6 @@ class APITest : StringSpec() { starDetector = STAR_DETECTION_OPTIONS ) - @JvmStatic private val CLIENT = OkHttpClient.Builder() - .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) - .build() - @JvmStatic private val KOTLIN_MODULE = kotlinModule() .addSerializer(PathSerializer) .addSerializer(DurationSerializer()) @@ -199,13 +194,13 @@ class APITest : StringSpec() { @JvmStatic private fun get(path: String) { val request = Request.Builder().get().url("$BASE_URL/$path").build() - CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } + HTTP_CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } } @JvmStatic private fun put(path: String, body: RequestBody = EMPTY_BODY) { val request = Request.Builder().put(body).url("$BASE_URL/$path").build() - CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } + HTTP_CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } } @JvmStatic @@ -218,7 +213,7 @@ class APITest : StringSpec() { @JvmStatic private fun delete(path: String) { val request = Request.Builder().delete().url("$BASE_URL/$path").build() - CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } + HTTP_CLIENT.newCall(request).execute().use { it.isSuccessful.shouldBeTrue() } } } } diff --git a/api/src/test/kotlin/SatelliteEntityRepositoryTest.kt b/api/src/test/kotlin/SatelliteEntityRepositoryTest.kt index 759b8f6d7..3450687ef 100644 --- a/api/src/test/kotlin/SatelliteEntityRepositoryTest.kt +++ b/api/src/test/kotlin/SatelliteEntityRepositoryTest.kt @@ -22,8 +22,8 @@ class SatelliteEntityRepositoryTest : StringSpec() { val box = boxStore.boxFor() val repository = SatelliteRepository(box) - repository.save("ISS", SatelliteGroupType.ACTIVE, SatelliteGroupType.EDUCATION) - repository.save("StarLink", SatelliteGroupType.ACTIVE, SatelliteGroupType.STARLINK) + repository.save("ISS (ZARYA)", ISS_TLE, SatelliteGroupType.ACTIVE, SatelliteGroupType.EDUCATION) + repository.save("StarLink", "", SatelliteGroupType.ACTIVE, SatelliteGroupType.STARLINK) "find all" { repository.search().shouldHaveSize(2) @@ -45,9 +45,15 @@ class SatelliteEntityRepositoryTest : StringSpec() { companion object { + @JvmStatic internal val ISS_TLE = """ + ISS (ZARYA) + 1 25544U 98067A 24182.23525622 .00026310 00000+0 46754-3 0 9994 + 2 25544 51.6392 250.6622 0011086 22.0936 34.8107 15.49934787460571 + """.trimIndent() + @JvmStatic - internal fun SatelliteRepository.save(name: String, vararg groups: SatelliteGroupType) { - save(SatelliteEntity(0L, name, "", groups.map { it.name }.toMutableList())) + internal fun SatelliteRepository.save(name: String, tle: String = "", vararg groups: SatelliteGroupType) { + save(SatelliteEntity(0L, name, tle, groups.map { it.name }.toMutableList())) } } } diff --git a/api/src/test/kotlin/SimbadEntityRepositoryTest.kt b/api/src/test/kotlin/SimbadEntityRepositoryTest.kt index 04483ed4f..3ddd4487d 100644 --- a/api/src/test/kotlin/SimbadEntityRepositoryTest.kt +++ b/api/src/test/kotlin/SimbadEntityRepositoryTest.kt @@ -34,35 +34,35 @@ class SimbadEntityRepositoryTest : StringSpec() { repository.save("Car Nebula", SkyObjectType.NEBULA, Constellation.CAR, 5.0, "10 45 15".hours, "-59 43 35".deg) "find all" { - repository.find().shouldHaveSize(4).first().magnitude shouldBeExactly -1.45 + repository.search().shouldHaveSize(4).first().magnitude shouldBeExactly -1.45 } "find by name" { - repository.find(name = "dolphin").shouldHaveSize(1).first().name shouldBe "Dolphin Nebula" - repository.find(name = "andromeda").shouldBeEmpty() - repository.find(name = "nebula").shouldHaveSize(2).first().magnitude shouldBeExactly 5.0 + repository.search(name = "dolphin").shouldHaveSize(1).first().name shouldBe "Dolphin Nebula" + repository.search(name = "andromeda").shouldBeEmpty() + repository.search(name = "nebula").shouldHaveSize(2).first().magnitude shouldBeExactly 5.0 } "find by constellation" { - repository.find(constellation = Constellation.CMA).shouldHaveSize(2).first().magnitude shouldBeExactly -1.45 - repository.find(constellation = Constellation.AND).shouldBeEmpty() + repository.search(constellation = Constellation.CMA).shouldHaveSize(2).first().magnitude shouldBeExactly -1.45 + repository.search(constellation = Constellation.AND).shouldBeEmpty() } "find by region" { - repository.find(rightAscension = "06 45 59".hours, declination = "-20 45 29".deg, radius = 4.5.deg).shouldHaveSize(2) + repository.search(rightAscension = "06 45 59".hours, declination = "-20 45 29".deg, radius = 4.5.deg).shouldHaveSize(2) .first().magnitude shouldBeExactly -1.45 - repository.find(rightAscension = "06 45 59".hours, declination = "-20 45 29".deg, radius = 4.0.deg).shouldHaveSize(1) + repository.search(rightAscension = "06 45 59".hours, declination = "-20 45 29".deg, radius = 4.0.deg).shouldHaveSize(1) .first().name shouldBe "Dolphin Nebula" - repository.find(rightAscension = "00 42 43".hours, declination = "41 15 53".deg, radius = 10.deg).shouldBeEmpty() + repository.search(rightAscension = "00 42 43".hours, declination = "41 15 53".deg, radius = 10.deg).shouldBeEmpty() } "find by magnitude" { - repository.find(magnitudeMin = 5.0).shouldHaveSize(3) - repository.find(magnitudeMax = 4.9).shouldHaveSize(1).first().name shouldBe "Sirius" - repository.find(magnitudeMin = 6.6, magnitudeMax = 6.99).shouldHaveSize(1).first().name shouldBe "Dolphin Nebula" - repository.find(magnitudeMax = -2.0).shouldBeEmpty() - repository.find(magnitudeMin = 7.0).shouldBeEmpty() - repository.find(magnitudeMin = 5.1, magnitudeMax = 6.0).shouldBeEmpty() + repository.search(magnitudeMin = 5.0).shouldHaveSize(3) + repository.search(magnitudeMax = 4.9).shouldHaveSize(1).first().name shouldBe "Sirius" + repository.search(magnitudeMin = 6.6, magnitudeMax = 6.99).shouldHaveSize(1).first().name shouldBe "Dolphin Nebula" + repository.search(magnitudeMax = -2.0).shouldBeEmpty() + repository.search(magnitudeMin = 7.0).shouldBeEmpty() + repository.search(magnitudeMin = 5.1, magnitudeMax = 6.0).shouldBeEmpty() } "find by type" { - repository.find(type = SkyObjectType.NEBULA).shouldHaveSize(2).first().magnitude shouldBeExactly 5.0 - repository.find(type = SkyObjectType.GALAXY).shouldBeEmpty() + repository.search(type = SkyObjectType.NEBULA).shouldHaveSize(2).first().magnitude shouldBeExactly 5.0 + repository.search(type = SkyObjectType.GALAXY).shouldBeEmpty() } } diff --git a/api/src/test/kotlin/SkyAtlasServiceTest.kt b/api/src/test/kotlin/SkyAtlasServiceTest.kt new file mode 100644 index 000000000..6a25036af --- /dev/null +++ b/api/src/test/kotlin/SkyAtlasServiceTest.kt @@ -0,0 +1,159 @@ +import SatelliteEntityRepositoryTest.Companion.ISS_TLE +import SatelliteEntityRepositoryTest.Companion.save +import SimbadEntityRepositoryTest.Companion.save +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.collections.shouldHaveAtLeastSize +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.collections.shouldNotBeEmpty +import io.kotest.matchers.doubles.plusOrMinus +import io.kotest.matchers.doubles.shouldBeExactly +import io.kotest.matchers.shouldBe +import io.objectbox.kotlin.boxFor +import nebulosa.api.atlas.* +import nebulosa.api.atlas.ephemeris.BodyEphemerisProvider +import nebulosa.api.atlas.ephemeris.HorizonsEphemerisProvider +import nebulosa.api.database.MyObjectBox +import nebulosa.horizons.HorizonsService +import nebulosa.math.* +import nebulosa.nova.astrometry.Constellation +import nebulosa.sbd.SmallBodyDatabaseService +import nebulosa.skycatalog.SkyObjectType +import nebulosa.test.AbstractFitsAndXisfTest.Companion.HTTP_CLIENT +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor +import java.time.LocalDateTime +import java.util.* + +class SkyAtlasServiceTest : StringSpec() { + + init { + val boxStore = MyObjectBox.builder() + .inMemory(UUID.randomUUID().toString()) + .build() + + afterSpec { + boxStore.close() + } + + val threadPoolTaskExecutor = ThreadPoolTaskExecutor() + val horizonsService = HorizonsService(httpClient = HTTP_CLIENT) + val horizonsEphemerisProvider = HorizonsEphemerisProvider(horizonsService) + val bodyEphemerisProvider = BodyEphemerisProvider(threadPoolTaskExecutor) + val smallBodyDatabaseService = SmallBodyDatabaseService() + val satelliteBox = boxStore.boxFor() + val satelliteRepository = SatelliteRepository(satelliteBox) + val simbadBox = boxStore.boxFor() + val simbadEntityRepository = SimbadEntityRepository(simbadBox) + + simbadEntityRepository.save("Sirius", SkyObjectType.STAR, Constellation.CMA, -1.45, "06 45 06".hours, "-16 43 33".deg) + simbadEntityRepository.save("75 Tucanae", SkyObjectType.GLOBULAR_CLUSTER, Constellation.TUC, 6.58, "01 03 12".hours, "-70 50 39".deg) + + satelliteRepository.save("ISS (ZARYA)", ISS_TLE, SatelliteGroupType.ACTIVE, SatelliteGroupType.EDUCATION) + + threadPoolTaskExecutor.initialize() + + val service = SkyAtlasService( + horizonsEphemerisProvider, bodyEphemerisProvider, smallBodyDatabaseService, + satelliteRepository, simbadEntityRepository, HTTP_CLIENT + ) + + val location = Location("-19.846616".deg, "-43.96872".deg, 852.0.m, -180) + val dateTime = LocalDateTime.of(2024, 6, 30, 9, 50, 0) + + "object types" { + service.objectTypes.shouldHaveSize(2).shouldContainAll(SkyObjectType.STAR, SkyObjectType.GLOBULAR_CLUSTER) + } + "position of sun" { + val position = service.positionOfSun(location, dateTime, false) + position.rightAscensionJ2000.formatHMS() shouldBe "06h38m40.2s" + position.declinationJ2000.formatSignedDMS() shouldBe "+023°08'24.6\"" + position.rightAscension.formatHMS() shouldBe "06h40m07.7s" + position.declination.formatSignedDMS() shouldBe "+023°07'10.5\"" + position.azimuth.formatDMS() shouldBe "037°55'12.8\"" + position.altitude.formatSignedDMS() shouldBe "+036°39'01.4\"" + position.magnitude shouldBeExactly -26.706 + position.constellation shouldBe Constellation.GEM + position.distance shouldBe (1.017 plusOrMinus 1e-3) + position.distanceUnit shouldBe "AU" + position.illuminated shouldBeExactly 100.0 + position.elongation.toDegrees shouldBeExactly 0.0 + } + "position of moon" { + val position = service.positionOfMoon(location, dateTime, false) + position.rightAscensionJ2000.formatHMS() shouldBe "01h47m21.7s" + position.declinationJ2000.formatSignedDMS() shouldBe "+013°32'49.4\"" + position.rightAscension.formatHMS() shouldBe "01h48m39.8s" + position.declination.formatSignedDMS() shouldBe "+013°40'06.4\"" + position.azimuth.formatDMS() shouldBe "306°54'06.0\"" + position.altitude.formatSignedDMS() shouldBe "+037°58'29.7\"" + position.magnitude shouldBeExactly -9.302 + position.constellation shouldBe Constellation.ARI + position.distance shouldBe (367798.938 plusOrMinus 1e-3) + position.distanceUnit shouldBe "km" + position.illuminated shouldBe (32.301 plusOrMinus 1e-3) + position.elongation.toDegrees shouldBe (69.142 plusOrMinus 1e-3) + } + "position of jupiter" { + val position = service.positionOfPlanet(location, "599", dateTime, false) + position.rightAscensionJ2000.formatHMS() shouldBe "04h24m28.8s" + position.declinationJ2000.formatSignedDMS() shouldBe "+020°55'01.7\"" + position.rightAscension.formatHMS() shouldBe "04h25m54.0s" + position.declination.formatSignedDMS() shouldBe "+020°58'23.7\"" + position.azimuth.formatDMS() shouldBe "358°22'34.0\"" + position.altitude.formatSignedDMS() shouldBe "+049°09'53.9\"" + position.magnitude shouldBeExactly -2.025 + position.constellation shouldBe Constellation.TAU + position.distance shouldBe (5.870 plusOrMinus 1e-3) + position.distanceUnit shouldBe "AU" + position.illuminated shouldBe (99.726 plusOrMinus 1e-3) + position.elongation.toDegrees shouldBe (31.110 plusOrMinus 1e-3) + } + "position of apophis" { + val apophis = service.searchMinorPlanet("apophis").spkId + val position = service.positionOfPlanet(location, "DES=$apophis;", dateTime, false) + position.rightAscensionJ2000.formatHMS() shouldBe "06h33m49.8s" + position.declinationJ2000.formatSignedDMS() shouldBe "+021°37'20.6\"" + position.rightAscension.formatHMS() shouldBe "06h35m16.4s" + position.declination.formatSignedDMS() shouldBe "+021°36'16.5\"" + position.azimuth.formatDMS() shouldBe "038°00'41.8\"" + position.altitude.formatSignedDMS() shouldBe "+038°32'04.2\"" + position.magnitude shouldBeExactly 20.825 + position.constellation shouldBe Constellation.GEM + position.distance shouldBe (2.018 plusOrMinus 1e-3) + position.distanceUnit shouldBe "AU" + position.illuminated shouldBe (99.972 plusOrMinus 1e-3) + position.elongation.toDegrees shouldBe (1.885 plusOrMinus 1e-3) + } + "position of sirius" { + val sirius = service.searchSkyObject("Sirius").shouldNotBeEmpty().first().id + val position = service.positionOfSkyObject(location, sirius, dateTime) + position.rightAscensionJ2000.formatHMS() shouldBe "06h45m06.0s" + position.declinationJ2000.formatSignedDMS() shouldBe "-016°43'33.0\"" + position.rightAscension.formatHMS() shouldBe "06h46m11.5s" + position.declination.formatSignedDMS() shouldBe "-016°45'01.6\"" + position.azimuth.formatDMS() shouldBe "090°08'45.7\"" + position.altitude.formatSignedDMS() shouldBe "+057°41'06.5\"" + position.magnitude shouldBeExactly -1.45 + position.constellation shouldBe Constellation.CMA + } + "position of iss" { + val iss = service.searchSatellites("ISS", emptyList()).shouldNotBeEmpty().first() + val position = service.positionOfSatellite(location, iss, dateTime) + position.rightAscensionJ2000.formatHMS() shouldBe "14h47m37.8s" + position.declinationJ2000.formatSignedDMS() shouldBe "-017°22'47.2\"" + position.rightAscension.formatHMS() shouldBe "14h49m00.4s" + position.declination.formatSignedDMS() shouldBe "-017°29'00.1\"" + position.azimuth.formatDMS() shouldBe "144°36'58.8\"" + position.altitude.formatSignedDMS() shouldBe "-045°07'44.9\"" + position.constellation shouldBe Constellation.LIB + position.distance shouldBe (9633.950 plusOrMinus 1e-3) + position.distanceUnit shouldBe "km" + position.illuminated shouldBe (79.282 plusOrMinus 1e-3) + position.elongation.toDegrees shouldBe (125.849 plusOrMinus 1e-3) + } + "close approaches" { + val phas = service.closeApproachesForMinorPlanets(7, 10.0, dateTime.toLocalDate()) + phas.shouldHaveAtLeastSize(2).map { it.name }.shouldContainAll("(2017 MB3)", "(2024 LH)") + } + } +} From 2e064ff603449baf192c8f95fc30e36d22662dbc Mon Sep 17 00:00:00 2001 From: tiagohm Date: Sun, 30 Jun 2024 11:09:35 -0300 Subject: [PATCH 29/29] [api]: Fix unit tests --- api/src/main/kotlin/nebulosa/api/atlas/Location.kt | 9 ++++++--- .../beans/converters/distance/MetersSerializer.kt | 13 +++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersSerializer.kt diff --git a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt index 79a720095..7d92156e3 100644 --- a/api/src/main/kotlin/nebulosa/api/atlas/Location.kt +++ b/api/src/main/kotlin/nebulosa/api/atlas/Location.kt @@ -1,17 +1,20 @@ package nebulosa.api.atlas import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize import nebulosa.api.beans.converters.angle.DegreesDeserializer +import nebulosa.api.beans.converters.angle.DegreesSerializer import nebulosa.api.beans.converters.distance.MetersDeserializer +import nebulosa.api.beans.converters.distance.MetersSerializer import nebulosa.math.Angle import nebulosa.math.Distance import nebulosa.nova.position.GeographicCoordinate import nebulosa.time.TimeZonedInSeconds data class Location( - @field:JsonDeserialize(using = DegreesDeserializer::class) override val latitude: Angle = 0.0, - @field:JsonDeserialize(using = DegreesDeserializer::class) override val longitude: Angle = 0.0, - @field:JsonDeserialize(using = MetersDeserializer::class) override val elevation: Distance = 0.0, + @field:JsonSerialize(using = DegreesSerializer::class) @field:JsonDeserialize(using = DegreesDeserializer::class) override val latitude: Angle = 0.0, + @field:JsonSerialize(using = DegreesSerializer::class) @field:JsonDeserialize(using = DegreesDeserializer::class) override val longitude: Angle = 0.0, + @field:JsonSerialize(using = MetersSerializer::class) @field:JsonDeserialize(using = MetersDeserializer::class) override val elevation: Distance = 0.0, val offsetInMinutes: Int = 0, ) : GeographicCoordinate, TimeZonedInSeconds { diff --git a/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersSerializer.kt b/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersSerializer.kt new file mode 100644 index 000000000..e0fc29a30 --- /dev/null +++ b/api/src/main/kotlin/nebulosa/api/beans/converters/distance/MetersSerializer.kt @@ -0,0 +1,13 @@ +package nebulosa.api.beans.converters.distance + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.ser.std.NumberSerializers +import nebulosa.math.toMeters + +class MetersSerializer : NumberSerializers.DoubleSerializer(Double::class.java) { + + override fun serialize(value: Any?, gen: JsonGenerator, provider: SerializerProvider) { + super.serialize((value as? Double)?.toMeters, gen, provider) + } +}